appium-android-driver 5.4.3 → 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 +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emu-console.js","names":["EMU_CONSOLE_FEATURE","commands","mobileExecEmuConsoleCommand","opts","ensureFeatureEnabled","command","execTimeout","connTimeout","initTimeout","errors","InvalidArgumentError","adb","execEmuConsoleCommand"],"sources":["../../../lib/commands/emu-console.js"],"sourcesContent":["import { errors } from 'appium/driver';\n\nconst EMU_CONSOLE_FEATURE = 'emulator_console';\n\nconst commands = {};\n\n/**\n * @typedef {Object} ExecOptions\n * @property {!Array<string>|string} command - The actual command to execute. See\n * https://developer.android.com/studio/run/emulator-console for more details\n * on available commands\n * @property {number} execTimeout [60000] A timeout used to wait for a server\n * reply to the given command in milliseconds\n * @property {number} connTimeout [5000] Console connection timeout in milliseconds\n * @property {number} initTimeout [5000] Telnet console initialization timeout\n * in milliseconds (the time between the connection happens and the command prompt\n * is available)\n */\n\n/**\n * Executes a command through emulator telnet console interface and returns its output.\n * The `emulator_console` server feature must be enabled in order to use this method.\n *\n * @param {ExecOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was an error while connecting to the Telnet console\n * or if the given command returned non-OK response\n */\ncommands.mobileExecEmuConsoleCommand = async function mobileExecEmuConsoleCommand (opts = {}) {\n this.ensureFeatureEnabled(EMU_CONSOLE_FEATURE);\n\n const {\n command,\n execTimeout,\n connTimeout,\n initTimeout,\n } = opts;\n\n if (!command) {\n throw new errors.InvalidArgumentError(`The 'command' argument is mandatory`);\n }\n\n return await this.adb.execEmuConsoleCommand(command, {\n execTimeout,\n connTimeout,\n initTimeout,\n });\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"emu-console.js","names":["EMU_CONSOLE_FEATURE","commands","mobileExecEmuConsoleCommand","opts","ensureFeatureEnabled","command","execTimeout","connTimeout","initTimeout","errors","InvalidArgumentError","adb","execEmuConsoleCommand"],"sources":["../../../lib/commands/emu-console.js"],"sourcesContent":["import { errors } from 'appium/driver';\n\nconst EMU_CONSOLE_FEATURE = 'emulator_console';\n\nconst commands = {};\n\n/**\n * @typedef {Object} ExecOptions\n * @property {!Array<string>|string} command - The actual command to execute. See\n * https://developer.android.com/studio/run/emulator-console for more details\n * on available commands\n * @property {number} execTimeout [60000] A timeout used to wait for a server\n * reply to the given command in milliseconds\n * @property {number} connTimeout [5000] Console connection timeout in milliseconds\n * @property {number} initTimeout [5000] Telnet console initialization timeout\n * in milliseconds (the time between the connection happens and the command prompt\n * is available)\n */\n\n/**\n * Executes a command through emulator telnet console interface and returns its output.\n * The `emulator_console` server feature must be enabled in order to use this method.\n *\n * @param {ExecOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was an error while connecting to the Telnet console\n * or if the given command returned non-OK response\n */\ncommands.mobileExecEmuConsoleCommand = async function mobileExecEmuConsoleCommand (opts = {}) {\n this.ensureFeatureEnabled(EMU_CONSOLE_FEATURE);\n\n const {\n command,\n execTimeout,\n connTimeout,\n initTimeout,\n } = opts;\n\n if (!command) {\n throw new errors.InvalidArgumentError(`The 'command' argument is mandatory`);\n }\n\n return await this.adb.execEmuConsoleCommand(command, {\n execTimeout,\n connTimeout,\n initTimeout,\n });\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;AAAA;AAEA,MAAMA,mBAAmB,GAAG,kBAAkB;AAE9C,MAAMC,QAAQ,GAAG,CAAC,CAAC;;AAAC;;AAwBpBA,QAAQ,CAACC,2BAA2B,GAAG,eAAeA,2BAA2B,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5F,IAAI,CAACC,oBAAoB,CAACJ,mBAAmB,CAAC;EAE9C,MAAM;IACJK,OAAO;IACPC,WAAW;IACXC,WAAW;IACXC;EACF,CAAC,GAAGL,IAAI;EAER,IAAI,CAACE,OAAO,EAAE;IACZ,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,qCAAoC,CAAC;EAC9E;EAEA,OAAO,MAAM,IAAI,CAACC,GAAG,CAACC,qBAAqB,CAACP,OAAO,EAAE;IACnDC,WAAW;IACXC,WAAW;IACXC;EACF,CAAC,CAAC;AACJ,CAAC;AAAC,eAGaP,QAAQ;AAAA"}
|
|
@@ -1,38 +1,29 @@
|
|
|
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.default = void 0;
|
|
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
|
const extensions = {};
|
|
17
|
-
|
|
18
12
|
extensions.execute = async function execute(script, args) {
|
|
19
13
|
if (script.match(/^mobile:/)) {
|
|
20
14
|
this.log.info(`Executing native command '${script}'`);
|
|
21
15
|
script = script.replace(/^mobile:/, '').trim();
|
|
22
16
|
return await this.executeMobile(script, _lodash.default.isArray(args) ? args[0] : args);
|
|
23
17
|
}
|
|
24
|
-
|
|
25
18
|
if (!this.isWebContext()) {
|
|
26
19
|
throw new _driver.errors.NotImplementedError();
|
|
27
20
|
}
|
|
28
|
-
|
|
29
21
|
const endpoint = this.chromedriver.jwproxy.downstreamProtocol === _driver.PROTOCOLS.MJSONWP ? '/execute' : '/execute/sync';
|
|
30
22
|
return await this.chromedriver.jwproxy.command(endpoint, 'POST', {
|
|
31
23
|
script,
|
|
32
24
|
args
|
|
33
25
|
});
|
|
34
26
|
};
|
|
35
|
-
|
|
36
27
|
extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}) {
|
|
37
28
|
const mobileCommandsMapping = {
|
|
38
29
|
shell: 'mobileShell',
|
|
@@ -70,14 +61,11 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
70
61
|
isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',
|
|
71
62
|
stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording'
|
|
72
63
|
};
|
|
73
|
-
|
|
74
64
|
if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
|
|
75
65
|
throw new _driver.errors.UnknownCommandError(`Unknown mobile command "${mobileCommand}". ` + `Only ${_lodash.default.keys(mobileCommandsMapping)} commands are supported.`);
|
|
76
66
|
}
|
|
77
|
-
|
|
78
67
|
return await this[mobileCommandsMapping[mobileCommand]](opts);
|
|
79
68
|
};
|
|
80
|
-
|
|
81
69
|
var _default = extensions;
|
|
82
70
|
exports.default = _default;
|
|
83
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiZXhlY3V0ZSIsInNjcmlwdCIsImFyZ3MiLCJtYXRjaCIsImxvZyIsImluZm8iLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJfIiwiaXNBcnJheSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJlbmRwb2ludCIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiY29tbWFuZCIsIm1vYmlsZUNvbW1hbmQiLCJvcHRzIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic2Vuc29yU2V0IiwiZ2V0RGV2aWNlVGltZSIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwicHVzaEZpbGUiLCJwdWxsRmlsZSIsInB1bGxGb2xkZXIiLCJkZWxldGVGaWxlIiwiaXNBcHBJbnN0YWxsZWQiLCJxdWVyeUFwcFN0YXRlIiwiYWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJ0ZXJtaW5hdGVBcHAiLCJpbnN0YWxsQXBwIiwiY2xlYXJBcHAiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsInN0YXJ0QWN0aXZpdHkiLCJicm9hZGNhc3QiLCJnZXRDb250ZXh0cyIsInVubG9jayIsInJlZnJlc2hHcHNDYWNoZSIsInN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwiaXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwic3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImhhcyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycywgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZSAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmIChzY3JpcHQubWF0Y2goL15tb2JpbGU6LykpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBFeGVjdXRpbmcgbmF0aXZlIGNvbW1hbmQgJyR7c2NyaXB0fSdgKTtcbiAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgvXm1vYmlsZTovLCAnJykudHJpbSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVNb2JpbGUoc2NyaXB0LCBfLmlzQXJyYXkoYXJncykgPyBhcmdzWzBdIDogYXJncyk7XG4gIH1cbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbiAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmRvd25zdHJlYW1Qcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1BcbiAgICA/
|
|
71
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiZXhlY3V0ZSIsInNjcmlwdCIsImFyZ3MiLCJtYXRjaCIsImxvZyIsImluZm8iLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJfIiwiaXNBcnJheSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJlbmRwb2ludCIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiY29tbWFuZCIsIm1vYmlsZUNvbW1hbmQiLCJvcHRzIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic2Vuc29yU2V0IiwiZ2V0RGV2aWNlVGltZSIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwicHVzaEZpbGUiLCJwdWxsRmlsZSIsInB1bGxGb2xkZXIiLCJkZWxldGVGaWxlIiwiaXNBcHBJbnN0YWxsZWQiLCJxdWVyeUFwcFN0YXRlIiwiYWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJ0ZXJtaW5hdGVBcHAiLCJpbnN0YWxsQXBwIiwiY2xlYXJBcHAiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsInN0YXJ0QWN0aXZpdHkiLCJicm9hZGNhc3QiLCJnZXRDb250ZXh0cyIsInVubG9jayIsInJlZnJlc2hHcHNDYWNoZSIsInN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwiaXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nIiwic3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImhhcyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycywgUFJPVE9DT0xTIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZSAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmIChzY3JpcHQubWF0Y2goL15tb2JpbGU6LykpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBFeGVjdXRpbmcgbmF0aXZlIGNvbW1hbmQgJyR7c2NyaXB0fSdgKTtcbiAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgvXm1vYmlsZTovLCAnJykudHJpbSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVNb2JpbGUoc2NyaXB0LCBfLmlzQXJyYXkoYXJncykgPyBhcmdzWzBdIDogYXJncyk7XG4gIH1cbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbiAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmRvd25zdHJlYW1Qcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1BcbiAgICA/ICcvZXhlY3V0ZSdcbiAgICA6ICcvZXhlY3V0ZS9zeW5jJztcbiAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZChlbmRwb2ludCwgJ1BPU1QnLCB7XG4gICAgc2NyaXB0LFxuICAgIGFyZ3MsXG4gIH0pO1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU1vYmlsZSAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBzdGFydExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QnLFxuICAgIHN0b3BMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QnLFxuXG4gICAgY2hhbmdlUGVybWlzc2lvbnM6ICdtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucycsXG4gICAgZ2V0UGVybWlzc2lvbnM6ICdtb2JpbGVHZXRQZXJtaXNzaW9ucycsXG5cbiAgICBwZXJmb3JtRWRpdG9yQWN0aW9uOiAnbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbicsXG5cbiAgICBzZW5zb3JTZXQ6ICdzZW5zb3JTZXQnLFxuXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuXG4gICAgc3RhcnRTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZycsXG4gICAgc3RvcFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcnLFxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uczogJ21vYmlsZUdldE5vdGlmaWNhdGlvbnMnLFxuXG4gICAgbGlzdFNtczogJ21vYmlsZUxpc3RTbXMnLFxuXG4gICAgcHVzaEZpbGU6ICdtb2JpbGVQdXNoRmlsZScsXG4gICAgcHVsbEZpbGU6ICdtb2JpbGVQdWxsRmlsZScsXG4gICAgcHVsbEZvbGRlcjogJ21vYmlsZVB1bGxGb2xkZXInLFxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIGlzQXBwSW5zdGFsbGVkOiAnbW9iaWxlSXNBcHBJbnN0YWxsZWQnLFxuICAgIHF1ZXJ5QXBwU3RhdGU6ICdtb2JpbGVRdWVyeUFwcFN0YXRlJyxcbiAgICBhY3RpdmF0ZUFwcDogJ21vYmlsZUFjdGl2YXRlQXBwJyxcbiAgICByZW1vdmVBcHA6ICdtb2JpbGVSZW1vdmVBcHAnLFxuICAgIHRlcm1pbmF0ZUFwcDogJ21vYmlsZVRlcm1pbmF0ZUFwcCcsXG4gICAgaW5zdGFsbEFwcDogJ21vYmlsZUluc3RhbGxBcHAnLFxuICAgIGNsZWFyQXBwOiAnbW9iaWxlQ2xlYXJBcHAnLFxuXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgYnJvYWRjYXN0OiAnbW9iaWxlQnJvYWRjYXN0JyxcblxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgdW5sb2NrOiAnbW9iaWxlVW5sb2NrJyxcblxuICAgIHJlZnJlc2hHcHNDYWNoZTogJ21vYmlsZVJlZnJlc2hHcHNDYWNoZScsXG5cbiAgICBzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZzogJ21vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nJyxcbiAgICBpc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmc6ICdtb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcnLFxuICAgIHN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmc6ICdtb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nJyxcbiAgfTtcblxuICBpZiAoIV8uaGFzKG1vYmlsZUNvbW1hbmRzTWFwcGluZywgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgXCIke21vYmlsZUNvbW1hbmR9XCIuIGAgK1xuICAgICAgYE9ubHkgJHtfLmtleXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nKX0gY29tbWFuZHMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpc1ttb2JpbGVDb21tYW5kc01hcHBpbmdbbW9iaWxlQ29tbWFuZF1dKG9wdHMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsTUFBTUEsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQkEsVUFBVSxDQUFDQyxPQUFPLEdBQUcsZUFBZUEsT0FBTyxDQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRTtFQUN6RCxJQUFJRCxNQUFNLENBQUNFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtJQUM1QixJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLDZCQUE0QkosTUFBTyxHQUFFLENBQUM7SUFDckRBLE1BQU0sR0FBR0EsTUFBTSxDQUFDSyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDQyxJQUFJLEVBQUU7SUFDOUMsT0FBTyxNQUFNLElBQUksQ0FBQ0MsYUFBYSxDQUFDUCxNQUFNLEVBQUVRLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDUixJQUFJLENBQUMsR0FBR0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHQSxJQUFJLENBQUM7RUFDM0U7RUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDUyxZQUFZLEVBQUUsRUFBRTtJQUN4QixNQUFNLElBQUlDLGNBQU0sQ0FBQ0MsbUJBQW1CLEVBQUU7RUFDeEM7RUFDQSxNQUFNQyxRQUFRLEdBQUcsSUFBSSxDQUFDQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ0Msa0JBQWtCLEtBQUtDLGlCQUFTLENBQUNDLE9BQU8sR0FDL0UsVUFBVSxHQUNWLGVBQWU7RUFDbkIsT0FBTyxNQUFNLElBQUksQ0FBQ0osWUFBWSxDQUFDQyxPQUFPLENBQUNJLE9BQU8sQ0FBQ04sUUFBUSxFQUFFLE1BQU0sRUFBRTtJQUMvRGIsTUFBTTtJQUNOQztFQUNGLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFREgsVUFBVSxDQUFDUyxhQUFhLEdBQUcsZUFBZUEsYUFBYSxDQUFFYSxhQUFhLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNqRixNQUFNQyxxQkFBcUIsR0FBRztJQUM1QkMsS0FBSyxFQUFFLGFBQWE7SUFFcEJDLHFCQUFxQixFQUFFLDZCQUE2QjtJQUVwREMsa0JBQWtCLEVBQUUsMEJBQTBCO0lBQzlDQyxpQkFBaUIsRUFBRSx5QkFBeUI7SUFFNUNDLGlCQUFpQixFQUFFLHlCQUF5QjtJQUM1Q0MsY0FBYyxFQUFFLHNCQUFzQjtJQUV0Q0MsbUJBQW1CLEVBQUUsMkJBQTJCO0lBRWhEQyxTQUFTLEVBQUUsV0FBVztJQUV0QkMsYUFBYSxFQUFFLHFCQUFxQjtJQUVwQ0Msb0JBQW9CLEVBQUUsNEJBQTRCO0lBQ2xEQyxtQkFBbUIsRUFBRSwyQkFBMkI7SUFFaERDLGdCQUFnQixFQUFFLHdCQUF3QjtJQUUxQ0MsT0FBTyxFQUFFLGVBQWU7SUFFeEJDLFFBQVEsRUFBRSxnQkFBZ0I7SUFDMUJDLFFBQVEsRUFBRSxnQkFBZ0I7SUFDMUJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLFVBQVUsRUFBRSxrQkFBa0I7SUFFOUJDLGNBQWMsRUFBRSxzQkFBc0I7SUFDdENDLGFBQWEsRUFBRSxxQkFBcUI7SUFDcENDLFdBQVcsRUFBRSxtQkFBbUI7SUFDaENDLFNBQVMsRUFBRSxpQkFBaUI7SUFDNUJDLFlBQVksRUFBRSxvQkFBb0I7SUFDbENDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLFFBQVEsRUFBRSxnQkFBZ0I7SUFFMUJDLFlBQVksRUFBRSxvQkFBb0I7SUFDbENDLFdBQVcsRUFBRSxtQkFBbUI7SUFDaENDLGFBQWEsRUFBRSxxQkFBcUI7SUFDcENDLFNBQVMsRUFBRSxpQkFBaUI7SUFFNUJDLFdBQVcsRUFBRSxtQkFBbUI7SUFFaENDLE1BQU0sRUFBRSxjQUFjO0lBRXRCQyxlQUFlLEVBQUUsdUJBQXVCO0lBRXhDQyw2QkFBNkIsRUFBRSxxQ0FBcUM7SUFDcEVDLGlDQUFpQyxFQUFFLHlDQUF5QztJQUM1RUMsNEJBQTRCLEVBQUU7RUFDaEMsQ0FBQztFQUVELElBQUksQ0FBQ2hELGVBQUMsQ0FBQ2lELEdBQUcsQ0FBQ25DLHFCQUFxQixFQUFFRixhQUFhLENBQUMsRUFBRTtJQUNoRCxNQUFNLElBQUlULGNBQU0sQ0FBQytDLG1CQUFtQixDQUFFLDJCQUEwQnRDLGFBQWMsS0FBSSxHQUMvRSxRQUFPWixlQUFDLENBQUNtRCxJQUFJLENBQUNyQyxxQkFBcUIsQ0FBRSwwQkFBeUIsQ0FBQztFQUNwRTtFQUNBLE9BQU8sTUFBTSxJQUFJLENBQUNBLHFCQUFxQixDQUFDRixhQUFhLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUM7QUFDL0QsQ0FBQztBQUFDLGVBRWF2QixVQUFVO0FBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","names":["extensions","execute","script","args","match","log","info","replace","trim","executeMobile","_","isArray","isWebContext","errors","NotImplementedError","endpoint","chromedriver","jwproxy","downstreamProtocol","PROTOCOLS","MJSONWP","command","mobileCommand","opts","mobileCommandsMapping","shell","execEmuConsoleCommand","startLogsBroadcast","stopLogsBroadcast","changePermissions","getPermissions","performEditorAction","sensorSet","getDeviceTime","startScreenStreaming","stopScreenStreaming","getNotifications","listSms","pushFile","pullFile","pullFolder","deleteFile","isAppInstalled","queryAppState","activateApp","removeApp","terminateApp","installApp","clearApp","startService","stopService","startActivity","broadcast","getContexts","unlock","refreshGpsCache","startMediaProjectionRecording","isMediaProjectionRecordingRunning","stopMediaProjectionRecording","has","UnknownCommandError","keys"],"sources":["../../../lib/commands/execute.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors, PROTOCOLS } from 'appium/driver';\n\nconst extensions = {};\n\nextensions.execute = async function execute (script, args) {\n if (script.match(/^mobile:/)) {\n this.log.info(`Executing native command '${script}'`);\n script = script.replace(/^mobile:/, '').trim();\n return await this.executeMobile(script, _.isArray(args) ? args[0] : args);\n }\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n const endpoint = this.chromedriver.jwproxy.downstreamProtocol === PROTOCOLS.MJSONWP\n ? '/execute'\n : '/execute/sync';\n return await this.chromedriver.jwproxy.command(endpoint, 'POST', {\n script,\n args,\n });\n};\n\nextensions.executeMobile = async function executeMobile (mobileCommand, opts = {}) {\n const mobileCommandsMapping = {\n shell: 'mobileShell',\n\n execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n changePermissions: 'mobileChangePermissions',\n getPermissions: 'mobileGetPermissions',\n\n performEditorAction: 'mobilePerformEditorAction',\n\n sensorSet: 'sensorSet',\n\n getDeviceTime: 'mobileGetDeviceTime',\n\n startScreenStreaming: 'mobileStartScreenStreaming',\n stopScreenStreaming: 'mobileStopScreenStreaming',\n\n getNotifications: 'mobileGetNotifications',\n\n listSms: 'mobileListSms',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n\n isAppInstalled: 'mobileIsAppInstalled',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n removeApp: 'mobileRemoveApp',\n terminateApp: 'mobileTerminateApp',\n installApp: 'mobileInstallApp',\n clearApp: 'mobileClearApp',\n\n startService: 'mobileStartService',\n stopService: 'mobileStopService',\n startActivity: 'mobileStartActivity',\n broadcast: 'mobileBroadcast',\n\n getContexts: 'mobileGetContexts',\n\n unlock: 'mobileUnlock',\n\n refreshGpsCache: 'mobileRefreshGpsCache',\n\n startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',\n isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',\n stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',\n };\n\n if (!_.has(mobileCommandsMapping, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command \"${mobileCommand}\". ` +\n `Only ${_.keys(mobileCommandsMapping)} commands are supported.`);\n }\n return await this[mobileCommandsMapping[mobileCommand]](opts);\n};\n\nexport default extensions;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"execute.js","names":["extensions","execute","script","args","match","log","info","replace","trim","executeMobile","_","isArray","isWebContext","errors","NotImplementedError","endpoint","chromedriver","jwproxy","downstreamProtocol","PROTOCOLS","MJSONWP","command","mobileCommand","opts","mobileCommandsMapping","shell","execEmuConsoleCommand","startLogsBroadcast","stopLogsBroadcast","changePermissions","getPermissions","performEditorAction","sensorSet","getDeviceTime","startScreenStreaming","stopScreenStreaming","getNotifications","listSms","pushFile","pullFile","pullFolder","deleteFile","isAppInstalled","queryAppState","activateApp","removeApp","terminateApp","installApp","clearApp","startService","stopService","startActivity","broadcast","getContexts","unlock","refreshGpsCache","startMediaProjectionRecording","isMediaProjectionRecordingRunning","stopMediaProjectionRecording","has","UnknownCommandError","keys"],"sources":["../../../lib/commands/execute.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors, PROTOCOLS } from 'appium/driver';\n\nconst extensions = {};\n\nextensions.execute = async function execute (script, args) {\n if (script.match(/^mobile:/)) {\n this.log.info(`Executing native command '${script}'`);\n script = script.replace(/^mobile:/, '').trim();\n return await this.executeMobile(script, _.isArray(args) ? args[0] : args);\n }\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n const endpoint = this.chromedriver.jwproxy.downstreamProtocol === PROTOCOLS.MJSONWP\n ? '/execute'\n : '/execute/sync';\n return await this.chromedriver.jwproxy.command(endpoint, 'POST', {\n script,\n args,\n });\n};\n\nextensions.executeMobile = async function executeMobile (mobileCommand, opts = {}) {\n const mobileCommandsMapping = {\n shell: 'mobileShell',\n\n execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n changePermissions: 'mobileChangePermissions',\n getPermissions: 'mobileGetPermissions',\n\n performEditorAction: 'mobilePerformEditorAction',\n\n sensorSet: 'sensorSet',\n\n getDeviceTime: 'mobileGetDeviceTime',\n\n startScreenStreaming: 'mobileStartScreenStreaming',\n stopScreenStreaming: 'mobileStopScreenStreaming',\n\n getNotifications: 'mobileGetNotifications',\n\n listSms: 'mobileListSms',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n\n isAppInstalled: 'mobileIsAppInstalled',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n removeApp: 'mobileRemoveApp',\n terminateApp: 'mobileTerminateApp',\n installApp: 'mobileInstallApp',\n clearApp: 'mobileClearApp',\n\n startService: 'mobileStartService',\n stopService: 'mobileStopService',\n startActivity: 'mobileStartActivity',\n broadcast: 'mobileBroadcast',\n\n getContexts: 'mobileGetContexts',\n\n unlock: 'mobileUnlock',\n\n refreshGpsCache: 'mobileRefreshGpsCache',\n\n startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',\n isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',\n stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',\n };\n\n if (!_.has(mobileCommandsMapping, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command \"${mobileCommand}\". ` +\n `Only ${_.keys(mobileCommandsMapping)} commands are supported.`);\n }\n return await this[mobileCommandsMapping[mobileCommand]](opts);\n};\n\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA;AACA;AAEA,MAAMA,UAAU,GAAG,CAAC,CAAC;AAErBA,UAAU,CAACC,OAAO,GAAG,eAAeA,OAAO,CAAEC,MAAM,EAAEC,IAAI,EAAE;EACzD,IAAID,MAAM,CAACE,KAAK,CAAC,UAAU,CAAC,EAAE;IAC5B,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,6BAA4BJ,MAAO,GAAE,CAAC;IACrDA,MAAM,GAAGA,MAAM,CAACK,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAACC,IAAI,EAAE;IAC9C,OAAO,MAAM,IAAI,CAACC,aAAa,CAACP,MAAM,EAAEQ,eAAC,CAACC,OAAO,CAACR,IAAI,CAAC,GAAGA,IAAI,CAAC,CAAC,CAAC,GAAGA,IAAI,CAAC;EAC3E;EACA,IAAI,CAAC,IAAI,CAACS,YAAY,EAAE,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,EAAE;EACxC;EACA,MAAMC,QAAQ,GAAG,IAAI,CAACC,YAAY,CAACC,OAAO,CAACC,kBAAkB,KAAKC,iBAAS,CAACC,OAAO,GAC/E,UAAU,GACV,eAAe;EACnB,OAAO,MAAM,IAAI,CAACJ,YAAY,CAACC,OAAO,CAACI,OAAO,CAACN,QAAQ,EAAE,MAAM,EAAE;IAC/Db,MAAM;IACNC;EACF,CAAC,CAAC;AACJ,CAAC;AAEDH,UAAU,CAACS,aAAa,GAAG,eAAeA,aAAa,CAAEa,aAAa,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EACjF,MAAMC,qBAAqB,GAAG;IAC5BC,KAAK,EAAE,aAAa;IAEpBC,qBAAqB,EAAE,6BAA6B;IAEpDC,kBAAkB,EAAE,0BAA0B;IAC9CC,iBAAiB,EAAE,yBAAyB;IAE5CC,iBAAiB,EAAE,yBAAyB;IAC5CC,cAAc,EAAE,sBAAsB;IAEtCC,mBAAmB,EAAE,2BAA2B;IAEhDC,SAAS,EAAE,WAAW;IAEtBC,aAAa,EAAE,qBAAqB;IAEpCC,oBAAoB,EAAE,4BAA4B;IAClDC,mBAAmB,EAAE,2BAA2B;IAEhDC,gBAAgB,EAAE,wBAAwB;IAE1CC,OAAO,EAAE,eAAe;IAExBC,QAAQ,EAAE,gBAAgB;IAC1BC,QAAQ,EAAE,gBAAgB;IAC1BC,UAAU,EAAE,kBAAkB;IAC9BC,UAAU,EAAE,kBAAkB;IAE9BC,cAAc,EAAE,sBAAsB;IACtCC,aAAa,EAAE,qBAAqB;IACpCC,WAAW,EAAE,mBAAmB;IAChCC,SAAS,EAAE,iBAAiB;IAC5BC,YAAY,EAAE,oBAAoB;IAClCC,UAAU,EAAE,kBAAkB;IAC9BC,QAAQ,EAAE,gBAAgB;IAE1BC,YAAY,EAAE,oBAAoB;IAClCC,WAAW,EAAE,mBAAmB;IAChCC,aAAa,EAAE,qBAAqB;IACpCC,SAAS,EAAE,iBAAiB;IAE5BC,WAAW,EAAE,mBAAmB;IAEhCC,MAAM,EAAE,cAAc;IAEtBC,eAAe,EAAE,uBAAuB;IAExCC,6BAA6B,EAAE,qCAAqC;IACpEC,iCAAiC,EAAE,yCAAyC;IAC5EC,4BAA4B,EAAE;EAChC,CAAC;EAED,IAAI,CAAChD,eAAC,CAACiD,GAAG,CAACnC,qBAAqB,EAAEF,aAAa,CAAC,EAAE;IAChD,MAAM,IAAIT,cAAM,CAAC+C,mBAAmB,CAAE,2BAA0BtC,aAAc,KAAI,GAC/E,QAAOZ,eAAC,CAACmD,IAAI,CAACrC,qBAAqB,CAAE,0BAAyB,CAAC;EACpE;EACA,OAAO,MAAM,IAAI,CAACA,qBAAqB,CAACF,aAAa,CAAC,CAAC,CAACC,IAAI,CAAC;AAC/D,CAAC;AAAC,eAEavB,UAAU;AAAA"}
|
|
@@ -1,43 +1,32 @@
|
|
|
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.default = exports.commands = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _support = require("appium/support");
|
|
15
|
-
|
|
16
11
|
var _path = _interopRequireDefault(require("path"));
|
|
17
|
-
|
|
18
12
|
var _driver = require("appium/driver");
|
|
19
|
-
|
|
20
13
|
var _utils = require("../utils");
|
|
21
|
-
|
|
22
14
|
const CONTAINER_PATH_MARKER = '@';
|
|
23
15
|
const CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);
|
|
24
16
|
const ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';
|
|
25
17
|
const commands = {};
|
|
26
|
-
exports.commands = commands;
|
|
27
18
|
|
|
19
|
+
exports.commands = commands;
|
|
28
20
|
function parseContainerPath(remotePath) {
|
|
29
21
|
const match = CONTAINER_PATH_PATTERN.exec(remotePath);
|
|
30
|
-
|
|
31
22
|
if (!match) {
|
|
32
23
|
throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` + `'${remotePath}' is given instead`);
|
|
33
24
|
}
|
|
34
|
-
|
|
35
25
|
return [match[1], _path.default.posix.resolve(`/data/data/${match[1]}`, match[2])];
|
|
36
26
|
}
|
|
37
27
|
|
|
38
28
|
async function scanMedia(adb, remotePath, log = null) {
|
|
39
29
|
log === null || log === void 0 ? void 0 : log.debug(`Performing media scan of '${remotePath}'`);
|
|
40
|
-
|
|
41
30
|
try {
|
|
42
31
|
if ((await adb.getApiLevel()) >= 29) {
|
|
43
32
|
await adb.scanMedia(remotePath);
|
|
@@ -57,14 +46,11 @@ commands.pullFile = async function pullFile(remotePath) {
|
|
|
57
46
|
if (remotePath.endsWith('/')) {
|
|
58
47
|
throw new _driver.errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` + `'${remotePath}' is given instead`);
|
|
59
48
|
}
|
|
60
|
-
|
|
61
49
|
let tmpDestination = null;
|
|
62
|
-
|
|
63
50
|
if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {
|
|
64
51
|
const [packageId, pathInContainer] = parseContainerPath(remotePath);
|
|
65
52
|
this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);
|
|
66
53
|
tmpDestination = `/data/local/tmp/${_path.default.posix.basename(pathInContainer)}`;
|
|
67
|
-
|
|
68
54
|
try {
|
|
69
55
|
await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);
|
|
70
56
|
await this.adb.shell(['run-as', packageId, `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`]);
|
|
@@ -72,12 +58,10 @@ commands.pullFile = async function pullFile(remotePath) {
|
|
|
72
58
|
this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` + `Is the application installed and has 'debuggable' build option set to true? ` + `Original error: ${e.message}`);
|
|
73
59
|
}
|
|
74
60
|
}
|
|
75
|
-
|
|
76
61
|
const localFile = await _support.tempDir.path({
|
|
77
62
|
prefix: 'appium',
|
|
78
63
|
suffix: '.tmp'
|
|
79
64
|
});
|
|
80
|
-
|
|
81
65
|
try {
|
|
82
66
|
await this.adb.pull(tmpDestination || remotePath, localFile);
|
|
83
67
|
return (await _support.util.toInMemoryBase64(localFile)).toString();
|
|
@@ -85,7 +69,6 @@ commands.pullFile = async function pullFile(remotePath) {
|
|
|
85
69
|
if (await _support.fs.exists(localFile)) {
|
|
86
70
|
await _support.fs.unlink(localFile);
|
|
87
71
|
}
|
|
88
|
-
|
|
89
72
|
if (tmpDestination) {
|
|
90
73
|
await this.adb.shell(['rm', '-f', tmpDestination]);
|
|
91
74
|
}
|
|
@@ -103,27 +86,21 @@ commands.pushFile = async function pushFile(remotePath, base64Data) {
|
|
|
103
86
|
if (remotePath.endsWith('/')) {
|
|
104
87
|
throw new _driver.errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` + `'${remotePath}' is given instead`);
|
|
105
88
|
}
|
|
106
|
-
|
|
107
89
|
const localFile = await _support.tempDir.path({
|
|
108
90
|
prefix: 'appium',
|
|
109
91
|
suffix: '.tmp'
|
|
110
92
|
});
|
|
111
|
-
|
|
112
93
|
if (_lodash.default.isArray(base64Data)) {
|
|
113
94
|
base64Data = Buffer.from(base64Data).toString('utf8');
|
|
114
95
|
}
|
|
115
|
-
|
|
116
96
|
const content = Buffer.from(base64Data, 'base64');
|
|
117
97
|
let tmpDestination = null;
|
|
118
|
-
|
|
119
98
|
try {
|
|
120
99
|
await _support.fs.writeFile(localFile, content.toString('binary'), 'binary');
|
|
121
|
-
|
|
122
100
|
if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {
|
|
123
101
|
const [packageId, pathInContainer] = parseContainerPath(remotePath);
|
|
124
102
|
this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` + `Will put the data into '${pathInContainer}'`);
|
|
125
103
|
tmpDestination = `/data/local/tmp/${_path.default.posix.basename(pathInContainer)}`;
|
|
126
|
-
|
|
127
104
|
try {
|
|
128
105
|
await this.adb.shell(['run-as', packageId, `mkdir -p '${escapePath(_path.default.posix.dirname(pathInContainer))}'`]);
|
|
129
106
|
await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);
|
|
@@ -135,13 +112,13 @@ commands.pushFile = async function pushFile(remotePath, base64Data) {
|
|
|
135
112
|
}
|
|
136
113
|
} else {
|
|
137
114
|
await this.adb.push(localFile, remotePath);
|
|
115
|
+
|
|
138
116
|
await scanMedia(this.adb, remotePath, this.log);
|
|
139
117
|
}
|
|
140
118
|
} finally {
|
|
141
119
|
if (await _support.fs.exists(localFile)) {
|
|
142
120
|
await _support.fs.unlink(localFile);
|
|
143
121
|
}
|
|
144
|
-
|
|
145
122
|
if (tmpDestination) {
|
|
146
123
|
await this.adb.shell(['rm', '-f', tmpDestination]);
|
|
147
124
|
}
|
|
@@ -158,7 +135,6 @@ commands.mobilePushFile = async function mobilePushFile(opts = {}) {
|
|
|
158
135
|
|
|
159
136
|
commands.pullFolder = async function pullFolder(remotePath) {
|
|
160
137
|
const tmpRoot = await _support.tempDir.openDir();
|
|
161
|
-
|
|
162
138
|
try {
|
|
163
139
|
await this.adb.pull(remotePath, tmpRoot);
|
|
164
140
|
return (await _support.zip.toInMemoryZip(tmpRoot, {
|
|
@@ -181,30 +157,23 @@ async function deleteFileOrFolder(adb, remotePath) {
|
|
|
181
157
|
const passFlag = '__PASS__';
|
|
182
158
|
const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;
|
|
183
159
|
const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;
|
|
184
|
-
|
|
185
160
|
try {
|
|
186
161
|
return _lodash.default.includes(await adb.shell([fullCmd]), passFlag);
|
|
187
162
|
} catch (ign) {
|
|
188
163
|
return false;
|
|
189
164
|
}
|
|
190
165
|
};
|
|
191
|
-
|
|
192
166
|
const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);
|
|
193
|
-
|
|
194
167
|
const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);
|
|
195
|
-
|
|
196
168
|
const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);
|
|
197
|
-
|
|
198
169
|
let dstPath = remotePath;
|
|
199
170
|
let pkgId = null;
|
|
200
|
-
|
|
201
171
|
if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {
|
|
202
172
|
const [packageId, pathInContainer] = parseContainerPath(remotePath);
|
|
203
173
|
this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);
|
|
204
174
|
dstPath = pathInContainer;
|
|
205
175
|
pkgId = packageId;
|
|
206
176
|
}
|
|
207
|
-
|
|
208
177
|
if (pkgId) {
|
|
209
178
|
try {
|
|
210
179
|
await adb.shell(['run-as', pkgId, 'ls']);
|
|
@@ -212,30 +181,24 @@ async function deleteFileOrFolder(adb, remotePath) {
|
|
|
212
181
|
this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` + `Is the application installed and has 'debuggable' build option set to true? ` + `Original error: ${e.message}`);
|
|
213
182
|
}
|
|
214
183
|
}
|
|
215
|
-
|
|
216
184
|
if (!(await isPresent(dstPath, pkgId))) {
|
|
217
185
|
this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);
|
|
218
186
|
return false;
|
|
219
187
|
}
|
|
220
|
-
|
|
221
188
|
const expectsFile = !remotePath.endsWith('/');
|
|
222
|
-
|
|
223
189
|
if (expectsFile && !(await isFile(dstPath, pkgId))) {
|
|
224
190
|
this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);
|
|
225
191
|
} else if (!expectsFile && !(await isDir(dstPath, pkgId))) {
|
|
226
192
|
this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);
|
|
227
193
|
}
|
|
228
|
-
|
|
229
194
|
if (pkgId) {
|
|
230
195
|
await adb.shell(['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);
|
|
231
196
|
} else {
|
|
232
197
|
await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);
|
|
233
198
|
}
|
|
234
|
-
|
|
235
199
|
if (await isPresent(dstPath, pkgId)) {
|
|
236
200
|
this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` + `Is it writable?`);
|
|
237
201
|
}
|
|
238
|
-
|
|
239
202
|
return true;
|
|
240
203
|
}
|
|
241
204
|
|
|
@@ -243,18 +206,14 @@ commands.mobileDeleteFile = async function mobileDeleteFile(opts = {}) {
|
|
|
243
206
|
const {
|
|
244
207
|
remotePath
|
|
245
208
|
} = opts;
|
|
246
|
-
|
|
247
209
|
if (!remotePath) {
|
|
248
210
|
throw new _driver.errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);
|
|
249
211
|
}
|
|
250
|
-
|
|
251
212
|
if (remotePath.endsWith('/')) {
|
|
252
213
|
throw new _driver.errors.InvalidArgumentError(`It is expected that remote path points to a folder and not to a file. ` + `'${remotePath}' is given instead`);
|
|
253
214
|
}
|
|
254
|
-
|
|
255
215
|
return await deleteFileOrFolder(this.adb, remotePath);
|
|
256
216
|
};
|
|
257
|
-
|
|
258
217
|
var _default = commands;
|
|
259
218
|
exports.default = _default;
|
|
260
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UIiwiY29tbWFuZHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyByZXF1aXJlQXJncyB9IGZyb20gJy4uL3V0aWxzJztcblxuXG5jb25zdCBDT05UQUlORVJfUEFUSF9NQVJLRVIgPSAnQCc7XG4vLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL1BMZEIwRy8yXG5jb25zdCBDT05UQUlORVJfUEFUSF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfShbXi9dKykvKC4rKWApO1xuY29uc3QgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UID0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGZyb20gdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIHByZWZvcm1hdHRlZCByZW1vdGUgcGF0aCwgd2hpY2ggbG9va3MgbGlrZVxuICogYEBteS5hcHAuaWQvbXkvcGF0aGBcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHBhcnNlZCBwYWNrYWdlXG4gKiBpZGVudGlmaWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggaW5zaWRlIHRoZSBwYWNrYWdlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcGFja2FnZSBpZGVudGlmaWVyIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZWxhdGl2ZSBwYXRoIHdpdGggYSBzaW5nbGUgc2xhc2guIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIFttYXRjaFsxXSwgcGF0aC5wb3NpeC5yZXNvbHZlKGAvZGF0YS9kYXRhLyR7bWF0Y2hbMV19YCwgbWF0Y2hbMl0pXTtcbn1cblxuLyoqXG4gKiBTY2FucyB0aGUgZ2l2ZW4gZmlsZS9mb2xkZXIgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIGFuZCBhZGRzIG1hdGNoaW5nIGl0ZW1zIHRvIHRoZSBkZXZpY2UncyBtZWRpYSBsaWJyYXJ5LlxuICogRXhjZXB0aW9ucyBhcmUgaWdub3JlZCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZpbGUvZm9sZGVyIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2Nhbk1lZGlhIChhZGIsIHJlbW90ZVBhdGgsIGxvZyA9IG51bGwpIHtcbiAgbG9nPy5kZWJ1ZyhgUGVyZm9ybWluZyBtZWRpYSBzY2FuIG9mICcke3JlbW90ZVBhdGh9J2ApO1xuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjE4NFxuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOSkge1xuICAgICAgYXdhaXQgYWRiLnNjYW5NZWRpYShyZW1vdGVQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAgICctYScsIEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCxcbiAgICAgICAgJy1kJywgYGZpbGU6Ly8ke3JlbW90ZVBhdGh9YFxuICAgICAgXSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nPy53YXJuKGBJZ25vcmluZyBhbiB1bmV4cGVjdGVkIGVycm9yIHVwb24gbWVkaWEgc2Nhbm5pbmcgb2YgJyR7cmVtb3RlUGF0aH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc21hbGwgaGVscGVyLCB3aGljaCBlc2NhcGVzIHNpbmdsZSBxdW90ZXMgaW4gcGF0aHMsXG4gKiBzbyB0aGV5IGFyZSBzYWZlIHRvIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgb2Ygc2hlbGwgY29tbWFuZHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCBUaGUgaW5pdGlhbCByZW1vdGUgcGF0aFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVzY2FwZWQgcGF0aCB2YWx1ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVQYXRoIChwKSB7XG4gIHJldHVybiBwLnJlcGxhY2UoLycvZywgYFxcXFwnYCk7XG59XG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKiBJdCBpcyByZXF1aXJlZCwgdGhhdCBhIHBhY2thZ2UgaGFzIGRlYnVnZ2luZyBmbGFnIGVuYWJsZWRcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyBpdHMgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYXBwIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgcHVsbGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHVsbCBvcGVyYXRpb24gZmFpbGVkXG4gKi9cbmNvbW1hbmRzLnB1bGxGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZpbGUgKHJlbW90ZVBhdGgpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIFdpbGwgZ2V0IHRoZSBkYXRhIGZyb20gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICdydW4tYXMnLCBwYWNrYWdlSWQsXG4gICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9JyAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nYFxuICAgICAgXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbCh0bXBEZXN0aW5hdGlvbiB8fCByZW1vdGVQYXRoLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgICB9XG4gICAgaWYgKHRtcERlc3RpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3JtJywgJy1mJywgdG1wRGVzdGluYXRpb25dKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVsbEZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhbiBhcHAgYnVuZGxlLFxuICogZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvbXkvcGF0aGAuIEl0IGlzIG1hbmRhdG9yeSBmb3IgdGhlIGFwcCBidW5kbGUgdG8gaGF2ZVxuICogZGVidWdnaW5nIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBsYXR0ZXIgcmVtb3RlUGF0aCBmb3JtYXQuXG4gKi9cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGaWxlYFxuICovXG5jb21tYW5kcy5tb2JpbGVQdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRmlsZShyZW1vdGVQYXRoKTtcbn07XG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICogQWZ0ZXIgYSBmaWxlIGlzIHB1c2hlZCBpdCBnZXRzIGF1dG9tYXRpY2FsbHkgc2Nhbm5lZCBmb3IgcG9zc2libGVcbiAqIG1lZGlhIG9jY3VycmVuY2VzLiBJZiB0aGUgc2NhbiBzdWNjZWVkcyB0aGVuIHRoZSBmaWxlIGlzIGFkZGVkIHRvIHRoZVxuICogbWVkaWEgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZSBvclxuICogYSBmaWxlIGluc2lkZSBhIHBhY2thZ2UgYnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSBCYXNlNjQgZW5jb2RlZCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlXG4gKiByZW1vdGUgZmlsZS4gVGhlIHJlbW90ZSBmaWxlIHdpbGwgYmUgc2lsZW50bHkgb3ZlcnJpZGRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcHVzaGluZyB0aGUgZGF0YVxuICovXG5jb21tYW5kcy5wdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1c2hGaWxlIChyZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgaWYgKF8uaXNBcnJheShiYXNlNjREYXRhKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cyAoYWhlbSkgamF2YSwgc2VuZCBhIGJ5dGUgYXJyYXkgZW5jb2RpbmcgdXRmOCBjaGFyYWN0ZXJzXG4gICAgLy8gaW5zdGVhZCBvZiBhIHN0cmluZywgd2hpY2ggd291bGQgYmUgaW5maW5pdGVseSBiZXR0ZXIhXG4gICAgYmFzZTY0RGF0YSA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEpLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgY29uc3QgY29udGVudCA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKTtcbiAgbGV0IHRtcERlc3RpbmF0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxGaWxlLCBjb250ZW50LnRvU3RyaW5nKCdiaW5hcnknKSwgJ2JpbmFyeScpO1xuICAgIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgICAgYFdpbGwgcHV0IHRoZSBkYXRhIGludG8gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoXG4gICAgICAgICAgWydydW4tYXMnLCBwYWNrYWdlSWQsIGBta2RpciAtcCAnJHtlc2NhcGVQYXRoKHBhdGgucG9zaXguZGlybmFtZShwYXRoSW5Db250YWluZXIpKX0nYF1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGB0b3VjaCAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCB0bXBEZXN0aW5hdGlvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYFxuICAgICAgICBdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWRiIHB1c2ggY3JlYXRlcyBmb2xkZXJzIGFuZCBvdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlxuICAgICAgYXdhaXQgdGhpcy5hZGIucHVzaChsb2NhbEZpbGUsIHJlbW90ZVBhdGgpO1xuXG4gICAgICAvLyBpZiB3ZSBoYXZlIHB1c2hlZCBhIGZpbGUsIGl0IG1pZ2h0IGJlIGEgbWVkaWEgZmlsZSwgc28gZW5zdXJlIHRoYXRcbiAgICAgIC8vIGFwcHMga25vdyBhYm91dCBpdFxuICAgICAgYXdhaXQgc2Nhbk1lZGlhKHRoaXMuYWRiLCByZW1vdGVQYXRoLCB0aGlzLmxvZyk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1c2hGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBheWxvYWQgQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSBwdXNoZWQuXG4gKi9cblxuLyoqXG4gKiBQdXNoZXMgdGhlIGdpdmVuIGRhdGEgdG8gYSBmaWxlIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7UHVzaEZpbGVPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUHVzaEZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGgsIHBheWxvYWQgfSA9IHJlcXVpcmVBcmdzKFsncmVtb3RlUGF0aCcsICdwYXlsb2FkJ10sIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdXNoRmlsZShyZW1vdGVQYXRoLCBwYXlsb2FkKTtcbn07XG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byBhIGZvbGRlciBvbiB0aGVcbiAqIHJlbW90ZSBkZXZpY2Ugb3IgYSBmb2xkZXIgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgYW5kIHppcHBlZCBjb250ZW50IG9mIHRoZSBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGdldHRpbmcgdGhlIGZvbGRlciBjb250ZW50XG4gKi9cbmNvbW1hbmRzLnB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKHJlbW90ZVBhdGgsIHRtcFJvb3QpO1xuICAgIHJldHVybiAoYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAodG1wUm9vdCwge1xuICAgICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gICAgfSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGb2xkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyLlxuICovXG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGb2xkZXJPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2FtZSBhcyBgcHVsbEZvbGRlcmBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGb2xkZXIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGggfSA9IHJlcXVpcmVBcmdzKCdyZW1vdGVQYXRoJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGb2xkZXIocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgdGhlIGdpdmVuIGZvbGRlciBvciBmaWxlIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyXG4gKiBvciBmaWxlIChmb2xkZXIgbmFtZXMgbXVzdCBlbmQgd2l0aCBhIHNpbmdsZSBzbGFzaClcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgcmVtb3RlIHBhdGggaXMgaW52YWxpZCBvclxuICogdGhlIHBhY2thZ2UgY29udGVudCBjYW5ub3QgYmUgYWNjZXNzZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBpdGVtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHJlbW90ZSBwYXRoIGlzIHZhbGlkLCBidXQgdGhlIHJlbW90ZSBwYXRoIGRvZXMgbm90IGV4aXN0XG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybiBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGaWxlT3JGb2xkZXIgKGFkYiwgcmVtb3RlUGF0aCkge1xuICBjb25zdCBwZXJmb3JtUmVtb3RlRnNDaGVjayA9IGFzeW5jIChwLCBvcCwgcnVuQXMgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICAgIGNvbnN0IGNoZWNrQ21kID0gYFsgLSR7b3B9ICcke2VzY2FwZVBhdGgocCl9JyBdICYmIGVjaG8gJHtwYXNzRmxhZ31gO1xuICAgIGNvbnN0IGZ1bGxDbWQgPSBydW5BcyA/IGBydW4tYXMgJHtydW5Bc30gJHtjaGVja0NtZH1gIDogY2hlY2tDbWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBfLmluY2x1ZGVzKGF3YWl0IGFkYi5zaGVsbChbZnVsbENtZF0pLCBwYXNzRmxhZyk7XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc0ZpbGUgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZicsIHJ1bkFzKTtcbiAgY29uc3QgaXNEaXIgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZCcsIHJ1bkFzKTtcbiAgY29uc3QgaXNQcmVzZW50ID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2UnLCBydW5Bcyk7XG5cbiAgbGV0IGRzdFBhdGggPSByZW1vdGVQYXRoO1xuICBsZXQgcGtnSWQgPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nYCk7XG4gICAgZHN0UGF0aCA9IHBhdGhJbkNvbnRhaW5lcjtcbiAgICBwa2dJZCA9IHBhY2thZ2VJZDtcbiAgfVxuXG4gIGlmIChwa2dJZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydydW4tYXMnLCBwa2dJZCwgJ2xzJ10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwa2dJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgZG9lcyBub3QgZXhpc3QuIFBlcmhhcHMsIGFscmVhZHkgZGVsZXRlZD9gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleHBlY3RzRmlsZSA9ICFyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJyk7XG4gIGlmIChleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNGaWxlKGRzdFBhdGgsIHBrZ0lkKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBpdGVtIGF0ICcke2RzdFBhdGh9JyBpcyBub3QgYSBmaWxlYCk7XG4gIH0gZWxzZSBpZiAoIWV4cGVjdHNGaWxlICYmICFhd2FpdCBpc0Rpcihkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZm9sZGVyYCk7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoXG4gICAgICBbJ3J1bi1hcycsIHBrZ0lkLCBgcm0gLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9ICcke2VzY2FwZVBhdGgoZHN0UGF0aCl9J2BdKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWydybScsIGAtZiR7ZXhwZWN0c0ZpbGUgPyAnJyA6ICdyJ31gLCBkc3RQYXRoXSk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgc3RpbGwgZXhpc3RzIGFmdGVyIGJlaW5nIGRlbGV0ZWQuIGAgK1xuICAgICAgYElzIGl0IHdyaXRhYmxlP2ApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlbGV0ZUZpbGVPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgZmlsZSBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIChmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9wYXRoL2luL2J1bmRsZWApXG4gKi9cblxuLyoqXG4gKiBEZWxldGVzIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7RGVsZXRlRmlsZU9wdHN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHBhdGggdG8gYSByZW1vdGUgZmlsZSBpcyB2YWxpZCwgYnV0IHRoZSBmaWxlIGl0c2VsZiBkb2VzIG5vdCBleGlzdFxuICogdGhlbiBgZmFsc2VgIGlzIHJldHVybmVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcmd1bWVudCBpcyBpbnZhbGlkIG9yIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZVxuICogZGVsZXRpbmcgdGhlIGZpbGVcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVsZXRlRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURlbGV0ZUZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7cmVtb3RlUGF0aH0gPSBvcHRzO1xuICBpZiAoIXJlbW90ZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ3JlbW90ZVBhdGgnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZm9sZGVyIGFuZCBub3QgdG8gYSBmaWxlLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5hZGIsIHJlbW90ZVBhdGgpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLHFCQUFxQixHQUFHLEdBQTlCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsSUFBSUMsTUFBSixDQUFZLElBQUdGLHFCQUFzQixjQUFyQyxDQUEvQjtBQUNBLE1BQU1HLDJCQUEyQixHQUFHLCtDQUFwQztBQUdBLE1BQU1DLFFBQVEsR0FBRyxFQUFqQjs7O0FBV0EsU0FBU0Msa0JBQVQsQ0FBNkJDLFVBQTdCLEVBQXlDO0VBQ3ZDLE1BQU1DLEtB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
|
|
219
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UIiwiY29tbWFuZHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyByZXF1aXJlQXJncyB9IGZyb20gJy4uL3V0aWxzJztcblxuXG5jb25zdCBDT05UQUlORVJfUEFUSF9NQVJLRVIgPSAnQCc7XG4vLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL1BMZEIwRy8yXG5jb25zdCBDT05UQUlORVJfUEFUSF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfShbXi9dKykvKC4rKWApO1xuY29uc3QgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UID0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGZyb20gdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIHByZWZvcm1hdHRlZCByZW1vdGUgcGF0aCwgd2hpY2ggbG9va3MgbGlrZVxuICogYEBteS5hcHAuaWQvbXkvcGF0aGBcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHBhcnNlZCBwYWNrYWdlXG4gKiBpZGVudGlmaWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggaW5zaWRlIHRoZSBwYWNrYWdlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcGFja2FnZSBpZGVudGlmaWVyIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZWxhdGl2ZSBwYXRoIHdpdGggYSBzaW5nbGUgc2xhc2guIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIFttYXRjaFsxXSwgcGF0aC5wb3NpeC5yZXNvbHZlKGAvZGF0YS9kYXRhLyR7bWF0Y2hbMV19YCwgbWF0Y2hbMl0pXTtcbn1cblxuLyoqXG4gKiBTY2FucyB0aGUgZ2l2ZW4gZmlsZS9mb2xkZXIgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIGFuZCBhZGRzIG1hdGNoaW5nIGl0ZW1zIHRvIHRoZSBkZXZpY2UncyBtZWRpYSBsaWJyYXJ5LlxuICogRXhjZXB0aW9ucyBhcmUgaWdub3JlZCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZpbGUvZm9sZGVyIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2Nhbk1lZGlhIChhZGIsIHJlbW90ZVBhdGgsIGxvZyA9IG51bGwpIHtcbiAgbG9nPy5kZWJ1ZyhgUGVyZm9ybWluZyBtZWRpYSBzY2FuIG9mICcke3JlbW90ZVBhdGh9J2ApO1xuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjE4NFxuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOSkge1xuICAgICAgYXdhaXQgYWRiLnNjYW5NZWRpYShyZW1vdGVQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAgICctYScsIEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCxcbiAgICAgICAgJy1kJywgYGZpbGU6Ly8ke3JlbW90ZVBhdGh9YFxuICAgICAgXSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nPy53YXJuKGBJZ25vcmluZyBhbiB1bmV4cGVjdGVkIGVycm9yIHVwb24gbWVkaWEgc2Nhbm5pbmcgb2YgJyR7cmVtb3RlUGF0aH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc21hbGwgaGVscGVyLCB3aGljaCBlc2NhcGVzIHNpbmdsZSBxdW90ZXMgaW4gcGF0aHMsXG4gKiBzbyB0aGV5IGFyZSBzYWZlIHRvIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgb2Ygc2hlbGwgY29tbWFuZHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCBUaGUgaW5pdGlhbCByZW1vdGUgcGF0aFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVzY2FwZWQgcGF0aCB2YWx1ZVxuICovXG5mdW5jdGlvbiBlc2NhcGVQYXRoIChwKSB7XG4gIHJldHVybiBwLnJlcGxhY2UoLycvZywgYFxcXFwnYCk7XG59XG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKiBJdCBpcyByZXF1aXJlZCwgdGhhdCBhIHBhY2thZ2UgaGFzIGRlYnVnZ2luZyBmbGFnIGVuYWJsZWRcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyBpdHMgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYXBwIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgcHVsbGVkIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHVsbCBvcGVyYXRpb24gZmFpbGVkXG4gKi9cbmNvbW1hbmRzLnB1bGxGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZpbGUgKHJlbW90ZVBhdGgpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIFdpbGwgZ2V0IHRoZSBkYXRhIGZyb20gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICdydW4tYXMnLCBwYWNrYWdlSWQsXG4gICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9JyAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nYFxuICAgICAgXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbCh0bXBEZXN0aW5hdGlvbiB8fCByZW1vdGVQYXRoLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgICB9XG4gICAgaWYgKHRtcERlc3RpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3JtJywgJy1mJywgdG1wRGVzdGluYXRpb25dKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVsbEZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhbiBhcHAgYnVuZGxlLFxuICogZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvbXkvcGF0aGAuIEl0IGlzIG1hbmRhdG9yeSBmb3IgdGhlIGFwcCBidW5kbGUgdG8gaGF2ZVxuICogZGVidWdnaW5nIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBsYXR0ZXIgcmVtb3RlUGF0aCBmb3JtYXQuXG4gKi9cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGaWxlYFxuICovXG5jb21tYW5kcy5tb2JpbGVQdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRmlsZShyZW1vdGVQYXRoKTtcbn07XG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICogQWZ0ZXIgYSBmaWxlIGlzIHB1c2hlZCBpdCBnZXRzIGF1dG9tYXRpY2FsbHkgc2Nhbm5lZCBmb3IgcG9zc2libGVcbiAqIG1lZGlhIG9jY3VycmVuY2VzLiBJZiB0aGUgc2NhbiBzdWNjZWVkcyB0aGVuIHRoZSBmaWxlIGlzIGFkZGVkIHRvIHRoZVxuICogbWVkaWEgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZSBvclxuICogYSBmaWxlIGluc2lkZSBhIHBhY2thZ2UgYnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSBCYXNlNjQgZW5jb2RlZCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlXG4gKiByZW1vdGUgZmlsZS4gVGhlIHJlbW90ZSBmaWxlIHdpbGwgYmUgc2lsZW50bHkgb3ZlcnJpZGRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcHVzaGluZyB0aGUgZGF0YVxuICovXG5jb21tYW5kcy5wdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1c2hGaWxlIChyZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgaWYgKF8uaXNBcnJheShiYXNlNjREYXRhKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cyAoYWhlbSkgamF2YSwgc2VuZCBhIGJ5dGUgYXJyYXkgZW5jb2RpbmcgdXRmOCBjaGFyYWN0ZXJzXG4gICAgLy8gaW5zdGVhZCBvZiBhIHN0cmluZywgd2hpY2ggd291bGQgYmUgaW5maW5pdGVseSBiZXR0ZXIhXG4gICAgYmFzZTY0RGF0YSA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEpLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgY29uc3QgY29udGVudCA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKTtcbiAgbGV0IHRtcERlc3RpbmF0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9jYWxGaWxlLCBjb250ZW50LnRvU3RyaW5nKCdiaW5hcnknKSwgJ2JpbmFyeScpO1xuICAgIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgICAgYFdpbGwgcHV0IHRoZSBkYXRhIGludG8gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoXG4gICAgICAgICAgWydydW4tYXMnLCBwYWNrYWdlSWQsIGBta2RpciAtcCAnJHtlc2NhcGVQYXRoKHBhdGgucG9zaXguZGlybmFtZShwYXRoSW5Db250YWluZXIpKX0nYF1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGB0b3VjaCAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCB0bXBEZXN0aW5hdGlvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYFxuICAgICAgICBdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWRiIHB1c2ggY3JlYXRlcyBmb2xkZXJzIGFuZCBvdmVyd3JpdGVzIGV4aXN0aW5nIGZpbGVzLlxuICAgICAgYXdhaXQgdGhpcy5hZGIucHVzaChsb2NhbEZpbGUsIHJlbW90ZVBhdGgpO1xuXG4gICAgICAvLyBpZiB3ZSBoYXZlIHB1c2hlZCBhIGZpbGUsIGl0IG1pZ2h0IGJlIGEgbWVkaWEgZmlsZSwgc28gZW5zdXJlIHRoYXRcbiAgICAgIC8vIGFwcHMga25vdyBhYm91dCBpdFxuICAgICAgYXdhaXQgc2Nhbk1lZGlhKHRoaXMuYWRiLCByZW1vdGVQYXRoLCB0aGlzLmxvZyk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1c2hGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBheWxvYWQgQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSBwdXNoZWQuXG4gKi9cblxuLyoqXG4gKiBQdXNoZXMgdGhlIGdpdmVuIGRhdGEgdG8gYSBmaWxlIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7UHVzaEZpbGVPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUHVzaEZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGgsIHBheWxvYWQgfSA9IHJlcXVpcmVBcmdzKFsncmVtb3RlUGF0aCcsICdwYXlsb2FkJ10sIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdXNoRmlsZShyZW1vdGVQYXRoLCBwYXlsb2FkKTtcbn07XG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byBhIGZvbGRlciBvbiB0aGVcbiAqIHJlbW90ZSBkZXZpY2Ugb3IgYSBmb2xkZXIgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgYW5kIHppcHBlZCBjb250ZW50IG9mIHRoZSBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGdldHRpbmcgdGhlIGZvbGRlciBjb250ZW50XG4gKi9cbmNvbW1hbmRzLnB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKHJlbW90ZVBhdGgsIHRtcFJvb3QpO1xuICAgIHJldHVybiAoYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAodG1wUm9vdCwge1xuICAgICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gICAgfSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGb2xkZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyLlxuICovXG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGb2xkZXJPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2FtZSBhcyBgcHVsbEZvbGRlcmBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGb2xkZXIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHJlbW90ZVBhdGggfSA9IHJlcXVpcmVBcmdzKCdyZW1vdGVQYXRoJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnB1bGxGb2xkZXIocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgdGhlIGdpdmVuIGZvbGRlciBvciBmaWxlIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZm9sZGVyXG4gKiBvciBmaWxlIChmb2xkZXIgbmFtZXMgbXVzdCBlbmQgd2l0aCBhIHNpbmdsZSBzbGFzaClcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgcmVtb3RlIHBhdGggaXMgaW52YWxpZCBvclxuICogdGhlIHBhY2thZ2UgY29udGVudCBjYW5ub3QgYmUgYWNjZXNzZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBpdGVtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHJlbW90ZSBwYXRoIGlzIHZhbGlkLCBidXQgdGhlIHJlbW90ZSBwYXRoIGRvZXMgbm90IGV4aXN0XG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybiBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGaWxlT3JGb2xkZXIgKGFkYiwgcmVtb3RlUGF0aCkge1xuICBjb25zdCBwZXJmb3JtUmVtb3RlRnNDaGVjayA9IGFzeW5jIChwLCBvcCwgcnVuQXMgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFzc0ZsYWcgPSAnX19QQVNTX18nO1xuICAgIGNvbnN0IGNoZWNrQ21kID0gYFsgLSR7b3B9ICcke2VzY2FwZVBhdGgocCl9JyBdICYmIGVjaG8gJHtwYXNzRmxhZ31gO1xuICAgIGNvbnN0IGZ1bGxDbWQgPSBydW5BcyA/IGBydW4tYXMgJHtydW5Bc30gJHtjaGVja0NtZH1gIDogY2hlY2tDbWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBfLmluY2x1ZGVzKGF3YWl0IGFkYi5zaGVsbChbZnVsbENtZF0pLCBwYXNzRmxhZyk7XG4gICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc0ZpbGUgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZicsIHJ1bkFzKTtcbiAgY29uc3QgaXNEaXIgPSBhc3luYyAocCwgcnVuQXMgPSBudWxsKSA9PiBhd2FpdCBwZXJmb3JtUmVtb3RlRnNDaGVjayhwLCAnZCcsIHJ1bkFzKTtcbiAgY29uc3QgaXNQcmVzZW50ID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2UnLCBydW5Bcyk7XG5cbiAgbGV0IGRzdFBhdGggPSByZW1vdGVQYXRoO1xuICBsZXQgcGtnSWQgPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nYCk7XG4gICAgZHN0UGF0aCA9IHBhdGhJbkNvbnRhaW5lcjtcbiAgICBwa2dJZCA9IHBhY2thZ2VJZDtcbiAgfVxuXG4gIGlmIChwa2dJZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydydW4tYXMnLCBwa2dJZCwgJ2xzJ10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwa2dJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgZG9lcyBub3QgZXhpc3QuIFBlcmhhcHMsIGFscmVhZHkgZGVsZXRlZD9gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBleHBlY3RzRmlsZSA9ICFyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJyk7XG4gIGlmIChleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNGaWxlKGRzdFBhdGgsIHBrZ0lkKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBpdGVtIGF0ICcke2RzdFBhdGh9JyBpcyBub3QgYSBmaWxlYCk7XG4gIH0gZWxzZSBpZiAoIWV4cGVjdHNGaWxlICYmICFhd2FpdCBpc0Rpcihkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZm9sZGVyYCk7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoXG4gICAgICBbJ3J1bi1hcycsIHBrZ0lkLCBgcm0gLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9ICcke2VzY2FwZVBhdGgoZHN0UGF0aCl9J2BdKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWydybScsIGAtZiR7ZXhwZWN0c0ZpbGUgPyAnJyA6ICdyJ31gLCBkc3RQYXRoXSk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgc3RpbGwgZXhpc3RzIGFmdGVyIGJlaW5nIGRlbGV0ZWQuIGAgK1xuICAgICAgYElzIGl0IHdyaXRhYmxlP2ApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlbGV0ZUZpbGVPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgZmlsZSBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIChmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9wYXRoL2luL2J1bmRsZWApXG4gKi9cblxuLyoqXG4gKiBEZWxldGVzIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7RGVsZXRlRmlsZU9wdHN9IG9wdHNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlbW90ZSBmaWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxldGVkLlxuICogSWYgdGhlIHBhdGggdG8gYSByZW1vdGUgZmlsZSBpcyB2YWxpZCwgYnV0IHRoZSBmaWxlIGl0c2VsZiBkb2VzIG5vdCBleGlzdFxuICogdGhlbiBgZmFsc2VgIGlzIHJldHVybmVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBhcmd1bWVudCBpcyBpbnZhbGlkIG9yIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZVxuICogZGVsZXRpbmcgdGhlIGZpbGVcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVsZXRlRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURlbGV0ZUZpbGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7cmVtb3RlUGF0aH0gPSBvcHRzO1xuICBpZiAoIXJlbW90ZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ3JlbW90ZVBhdGgnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZm9sZGVyIGFuZCBub3QgdG8gYSBmaWxlLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGBcbiAgICApO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5hZGIsIHJlbW90ZVBhdGgpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxNQUFNQSxxQkFBcUIsR0FBRyxHQUFHO0FBRWpDLE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLE1BQU0sQ0FBRSxJQUFHRixxQkFBc0IsY0FBYSxDQUFDO0FBQ2xGLE1BQU1HLDJCQUEyQixHQUFHLCtDQUErQztBQUduRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztBQUFDO0FBV3BCLFNBQVNDLGtCQUFrQixDQUFFQyxVQUFVLEVBQUU7RUFDdkMsTUFBTUMsS0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-actions.js","names":["CONTAINER_PATH_MARKER","CONTAINER_PATH_PATTERN","RegExp","ANDROID_MEDIA_RESCAN_INTENT","commands","parseContainerPath","remotePath","match","exec","Error","path","posix","resolve","scanMedia","adb","log","debug","getApiLevel","shell","e","warn","stderr","message","escapePath","p","replace","pullFile","endsWith","errors","InvalidArgumentError","tmpDestination","startsWith","packageId","pathInContainer","basename","errorAndThrow","localFile","tempDir","prefix","suffix","pull","util","toInMemoryBase64","toString","fs","exists","unlink","mobilePullFile","opts","requireArgs","pushFile","base64Data","_","isArray","Buffer","from","content","writeFile","dirname","push","mobilePushFile","payload","pullFolder","tmpRoot","openDir","zip","toInMemoryZip","encodeToBase64","rimraf","mobilePullFolder","deleteFileOrFolder","performRemoteFsCheck","op","runAs","passFlag","checkCmd","fullCmd","includes","ign","isFile","isDir","isPresent","dstPath","pkgId","info","expectsFile","mobileDeleteFile"],"sources":["../../../lib/commands/file-actions.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, util, zip, tempDir } from 'appium/support';\nimport path from 'path';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\n\nconst CONTAINER_PATH_MARKER = '@';\n// https://regex101.com/r/PLdB0G/2\nconst CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);\nconst ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';\n\n\nconst commands = {};\n\n/**\n * Parses the actual destination path from the given value\n *\n * @param {string} remotePath The preformatted remote path, which looks like\n * `@my.app.id/my/path`\n * @returns {Array<string>} An array, where the first item is the parsed package\n * identifier and the second one is the actual destination path inside the package.\n * @throws {Error} If the given string cannot be parsed\n */\nfunction parseContainerPath (remotePath) {\n const match = CONTAINER_PATH_PATTERN.exec(remotePath);\n if (!match) {\n throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` +\n `'${remotePath}' is given instead`);\n }\n return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];\n}\n\n/**\n * Scans the given file/folder on the remote device\n * and adds matching items to the device's media library.\n * Exceptions are ignored and written into the log.\n *\n * @param {ADB} adb ADB instance\n * @param {Object?} log Logger instance\n * @param {string} remotePath The file/folder path on the remote device\n */\nasync function scanMedia (adb, remotePath, log = null) {\n log?.debug(`Performing media scan of '${remotePath}'`);\n try {\n // https://github.com/appium/appium/issues/16184\n if (await adb.getApiLevel() >= 29) {\n await adb.scanMedia(remotePath);\n } else {\n await adb.shell([\n 'am', 'broadcast',\n '-a', ANDROID_MEDIA_RESCAN_INTENT,\n '-d', `file://${remotePath}`\n ]);\n }\n } catch (e) {\n log?.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);\n }\n}\n\n/**\n * A small helper, which escapes single quotes in paths,\n * so they are safe to be passed as arguments of shell commands\n *\n * @param {string} p The initial remote path\n * @returns {string} The escaped path value\n */\nfunction escapePath (p) {\n return p.replace(/'/g, `\\\\'`);\n}\n\n/**\n * Pulls a remote file from the device.\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n *\n * @param {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside app bundle\n * @returns {string} Base64 encoded content of the pulled file\n * @throws {Error} If the pull operation failed\n */\ncommands.pullFile = async function pullFile (remotePath) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`);\n }\n let tmpDestination = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n try {\n await this.adb.pull(tmpDestination || remotePath, localFile);\n return (await util.toInMemoryBase64(localFile)).toString();\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PullFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n */\n\n/**\n * Pulls a remote file from the device.\n *\n * @param {PullFileOptions} opts\n * @returns {string} The same as `pullFile`\n */\ncommands.mobilePullFile = async function mobilePullFile (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFile(remotePath);\n};\n\n/**\n * Pushes the given data to a file on the remote device\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n * After a file is pushed it gets automatically scanned for possible\n * media occurrences. If the scan succeeds then the file is added to the\n * media library.\n *\n * @param {string} remotePath The full path to the remote file or\n * a file inside a package bundle\n * @param {string} base64Data Base64 encoded data to be written to the\n * remote file. The remote file will be silently overridden if it already exists.\n * @throws {Error} If there was an error while pushing the data\n */\ncommands.pushFile = async function pushFile (remotePath, base64Data) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`\n );\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n if (_.isArray(base64Data)) {\n // some clients (ahem) java, send a byte array encoding utf8 characters\n // instead of a string, which would be infinitely better!\n base64Data = Buffer.from(base64Data).toString('utf8');\n }\n const content = Buffer.from(base64Data, 'base64');\n let tmpDestination = null;\n try {\n await fs.writeFile(localFile, content.toString('binary'), 'binary');\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` +\n `Will put the data into '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(\n ['run-as', packageId, `mkdir -p '${escapePath(path.posix.dirname(pathInContainer))}'`]\n );\n await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.push(localFile, tmpDestination);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(tmpDestination)}' '${escapePath(pathInContainer)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n } else {\n // adb push creates folders and overwrites existing files.\n await this.adb.push(localFile, remotePath);\n\n // if we have pushed a file, it might be a media file, so ensure that\n // apps know about it\n await scanMedia(this.adb, remotePath, this.log);\n }\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PushFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n * @property {string} payload Base64-encoded content of the file to be pushed.\n */\n\n/**\n * Pushes the given data to a file on the remote device.\n *\n * @param {PushFileOptions} opts\n */\ncommands.mobilePushFile = async function mobilePushFile (opts = {}) {\n const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);\n return await this.pushFile(remotePath, payload);\n};\n\n/**\n * Pulls the whole folder from the remote device\n *\n * @param {string} remotePath The full path to a folder on the\n * remote device or a folder inside an application bundle\n * @returns {string} Base64-encoded and zipped content of the folder\n * @throws {Error} If there was a failure while getting the folder content\n */\ncommands.pullFolder = async function pullFolder (remotePath) {\n const tmpRoot = await tempDir.openDir();\n try {\n await this.adb.pull(remotePath, tmpRoot);\n return (await zip.toInMemoryZip(tmpRoot, {\n encodeToBase64: true,\n })).toString();\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * @typedef {Object} PullFolderOptions\n * @property {string} remotePath The full path to the remote folder.\n */\n\n/**\n * Pulls the whole folder from the device under test.\n *\n * @param {PullFolderOptions} opts\n * @returns {string} The same as `pullFolder`\n */\ncommands.mobilePullFolder = async function mobilePullFolder (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFolder(remotePath);\n};\n\n/**\n * Deletes the given folder or file from the remote device\n *\n * @param {ADB} adb\n * @param {string} remotePath The full path to the remote folder\n * or file (folder names must end with a single slash)\n * @throws {Error} If the provided remote path is invalid or\n * the package content cannot be accessed\n * @returns {boolean} `true` if the remote item has been successfully deleted.\n * If the remote path is valid, but the remote path does not exist\n * this function return `false`.\n */\nasync function deleteFileOrFolder (adb, remotePath) {\n const performRemoteFsCheck = async (p, op, runAs = null) => {\n const passFlag = '__PASS__';\n const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;\n const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;\n try {\n return _.includes(await adb.shell([fullCmd]), passFlag);\n } catch (ign) {\n return false;\n }\n };\n const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);\n const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);\n const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);\n\n let dstPath = remotePath;\n let pkgId = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);\n dstPath = pathInContainer;\n pkgId = packageId;\n }\n\n if (pkgId) {\n try {\n await adb.shell(['run-as', pkgId, 'ls']);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n\n if (!await isPresent(dstPath, pkgId)) {\n this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);\n return false;\n }\n\n const expectsFile = !remotePath.endsWith('/');\n if (expectsFile && !await isFile(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);\n } else if (!expectsFile && !await isDir(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);\n }\n\n if (pkgId) {\n await adb.shell(\n ['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);\n } else {\n await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);\n }\n if (await isPresent(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` +\n `Is it writable?`);\n }\n return true;\n}\n\n/**\n * @typedef {Object} DeleteFileOpts\n * @property {!string} remotePath The full path to the remote file\n * or a file inside an application bundle (for example `@my.app.id/path/in/bundle`)\n */\n\n/**\n * Deletes a file on the remote device\n *\n * @param {DeleteFileOpts} opts\n * @returns {boolean} `true` if the remote file has been successfully deleted.\n * If the path to a remote file is valid, but the file itself does not exist\n * then `false` is returned.\n * @throws {Error} If the argument is invalid or there was an error while\n * deleting the file\n */\ncommands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {\n const {remotePath} = opts;\n if (!remotePath) {\n throw new errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);\n }\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a folder and not to a file. ` +\n `'${remotePath}' is given instead`\n );\n }\n return await deleteFileOrFolder(this.adb, remotePath);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-actions.js","names":["CONTAINER_PATH_MARKER","CONTAINER_PATH_PATTERN","RegExp","ANDROID_MEDIA_RESCAN_INTENT","commands","parseContainerPath","remotePath","match","exec","Error","path","posix","resolve","scanMedia","adb","log","debug","getApiLevel","shell","e","warn","stderr","message","escapePath","p","replace","pullFile","endsWith","errors","InvalidArgumentError","tmpDestination","startsWith","packageId","pathInContainer","basename","errorAndThrow","localFile","tempDir","prefix","suffix","pull","util","toInMemoryBase64","toString","fs","exists","unlink","mobilePullFile","opts","requireArgs","pushFile","base64Data","_","isArray","Buffer","from","content","writeFile","dirname","push","mobilePushFile","payload","pullFolder","tmpRoot","openDir","zip","toInMemoryZip","encodeToBase64","rimraf","mobilePullFolder","deleteFileOrFolder","performRemoteFsCheck","op","runAs","passFlag","checkCmd","fullCmd","includes","ign","isFile","isDir","isPresent","dstPath","pkgId","info","expectsFile","mobileDeleteFile"],"sources":["../../../lib/commands/file-actions.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, util, zip, tempDir } from 'appium/support';\nimport path from 'path';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\n\nconst CONTAINER_PATH_MARKER = '@';\n// https://regex101.com/r/PLdB0G/2\nconst CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);\nconst ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';\n\n\nconst commands = {};\n\n/**\n * Parses the actual destination path from the given value\n *\n * @param {string} remotePath The preformatted remote path, which looks like\n * `@my.app.id/my/path`\n * @returns {Array<string>} An array, where the first item is the parsed package\n * identifier and the second one is the actual destination path inside the package.\n * @throws {Error} If the given string cannot be parsed\n */\nfunction parseContainerPath (remotePath) {\n const match = CONTAINER_PATH_PATTERN.exec(remotePath);\n if (!match) {\n throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` +\n `'${remotePath}' is given instead`);\n }\n return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];\n}\n\n/**\n * Scans the given file/folder on the remote device\n * and adds matching items to the device's media library.\n * Exceptions are ignored and written into the log.\n *\n * @param {ADB} adb ADB instance\n * @param {Object?} log Logger instance\n * @param {string} remotePath The file/folder path on the remote device\n */\nasync function scanMedia (adb, remotePath, log = null) {\n log?.debug(`Performing media scan of '${remotePath}'`);\n try {\n // https://github.com/appium/appium/issues/16184\n if (await adb.getApiLevel() >= 29) {\n await adb.scanMedia(remotePath);\n } else {\n await adb.shell([\n 'am', 'broadcast',\n '-a', ANDROID_MEDIA_RESCAN_INTENT,\n '-d', `file://${remotePath}`\n ]);\n }\n } catch (e) {\n log?.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);\n }\n}\n\n/**\n * A small helper, which escapes single quotes in paths,\n * so they are safe to be passed as arguments of shell commands\n *\n * @param {string} p The initial remote path\n * @returns {string} The escaped path value\n */\nfunction escapePath (p) {\n return p.replace(/'/g, `\\\\'`);\n}\n\n/**\n * Pulls a remote file from the device.\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n *\n * @param {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside app bundle\n * @returns {string} Base64 encoded content of the pulled file\n * @throws {Error} If the pull operation failed\n */\ncommands.pullFile = async function pullFile (remotePath) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`);\n }\n let tmpDestination = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n try {\n await this.adb.pull(tmpDestination || remotePath, localFile);\n return (await util.toInMemoryBase64(localFile)).toString();\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PullFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n */\n\n/**\n * Pulls a remote file from the device.\n *\n * @param {PullFileOptions} opts\n * @returns {string} The same as `pullFile`\n */\ncommands.mobilePullFile = async function mobilePullFile (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFile(remotePath);\n};\n\n/**\n * Pushes the given data to a file on the remote device\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n * After a file is pushed it gets automatically scanned for possible\n * media occurrences. If the scan succeeds then the file is added to the\n * media library.\n *\n * @param {string} remotePath The full path to the remote file or\n * a file inside a package bundle\n * @param {string} base64Data Base64 encoded data to be written to the\n * remote file. The remote file will be silently overridden if it already exists.\n * @throws {Error} If there was an error while pushing the data\n */\ncommands.pushFile = async function pushFile (remotePath, base64Data) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`\n );\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n if (_.isArray(base64Data)) {\n // some clients (ahem) java, send a byte array encoding utf8 characters\n // instead of a string, which would be infinitely better!\n base64Data = Buffer.from(base64Data).toString('utf8');\n }\n const content = Buffer.from(base64Data, 'base64');\n let tmpDestination = null;\n try {\n await fs.writeFile(localFile, content.toString('binary'), 'binary');\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` +\n `Will put the data into '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(\n ['run-as', packageId, `mkdir -p '${escapePath(path.posix.dirname(pathInContainer))}'`]\n );\n await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.push(localFile, tmpDestination);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(tmpDestination)}' '${escapePath(pathInContainer)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n } else {\n // adb push creates folders and overwrites existing files.\n await this.adb.push(localFile, remotePath);\n\n // if we have pushed a file, it might be a media file, so ensure that\n // apps know about it\n await scanMedia(this.adb, remotePath, this.log);\n }\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PushFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n * @property {string} payload Base64-encoded content of the file to be pushed.\n */\n\n/**\n * Pushes the given data to a file on the remote device.\n *\n * @param {PushFileOptions} opts\n */\ncommands.mobilePushFile = async function mobilePushFile (opts = {}) {\n const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);\n return await this.pushFile(remotePath, payload);\n};\n\n/**\n * Pulls the whole folder from the remote device\n *\n * @param {string} remotePath The full path to a folder on the\n * remote device or a folder inside an application bundle\n * @returns {string} Base64-encoded and zipped content of the folder\n * @throws {Error} If there was a failure while getting the folder content\n */\ncommands.pullFolder = async function pullFolder (remotePath) {\n const tmpRoot = await tempDir.openDir();\n try {\n await this.adb.pull(remotePath, tmpRoot);\n return (await zip.toInMemoryZip(tmpRoot, {\n encodeToBase64: true,\n })).toString();\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * @typedef {Object} PullFolderOptions\n * @property {string} remotePath The full path to the remote folder.\n */\n\n/**\n * Pulls the whole folder from the device under test.\n *\n * @param {PullFolderOptions} opts\n * @returns {string} The same as `pullFolder`\n */\ncommands.mobilePullFolder = async function mobilePullFolder (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFolder(remotePath);\n};\n\n/**\n * Deletes the given folder or file from the remote device\n *\n * @param {ADB} adb\n * @param {string} remotePath The full path to the remote folder\n * or file (folder names must end with a single slash)\n * @throws {Error} If the provided remote path is invalid or\n * the package content cannot be accessed\n * @returns {boolean} `true` if the remote item has been successfully deleted.\n * If the remote path is valid, but the remote path does not exist\n * this function return `false`.\n */\nasync function deleteFileOrFolder (adb, remotePath) {\n const performRemoteFsCheck = async (p, op, runAs = null) => {\n const passFlag = '__PASS__';\n const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;\n const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;\n try {\n return _.includes(await adb.shell([fullCmd]), passFlag);\n } catch (ign) {\n return false;\n }\n };\n const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);\n const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);\n const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);\n\n let dstPath = remotePath;\n let pkgId = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);\n dstPath = pathInContainer;\n pkgId = packageId;\n }\n\n if (pkgId) {\n try {\n await adb.shell(['run-as', pkgId, 'ls']);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n\n if (!await isPresent(dstPath, pkgId)) {\n this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);\n return false;\n }\n\n const expectsFile = !remotePath.endsWith('/');\n if (expectsFile && !await isFile(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);\n } else if (!expectsFile && !await isDir(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);\n }\n\n if (pkgId) {\n await adb.shell(\n ['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);\n } else {\n await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);\n }\n if (await isPresent(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` +\n `Is it writable?`);\n }\n return true;\n}\n\n/**\n * @typedef {Object} DeleteFileOpts\n * @property {!string} remotePath The full path to the remote file\n * or a file inside an application bundle (for example `@my.app.id/path/in/bundle`)\n */\n\n/**\n * Deletes a file on the remote device\n *\n * @param {DeleteFileOpts} opts\n * @returns {boolean} `true` if the remote file has been successfully deleted.\n * If the path to a remote file is valid, but the file itself does not exist\n * then `false` is returned.\n * @throws {Error} If the argument is invalid or there was an error while\n * deleting the file\n */\ncommands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {\n const {remotePath} = opts;\n if (!remotePath) {\n throw new errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);\n }\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a folder and not to a file. ` +\n `'${remotePath}' is given instead`\n );\n }\n return await deleteFileOrFolder(this.adb, remotePath);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|