appium-android-driver 5.8.11 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/lib/commands/execute.js +4 -2
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/network.js +57 -4
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/webview-helpers.js +6 -2
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/commands/execute.js +3 -0
- package/lib/commands/network.js +108 -4
- package/lib/webview-helpers.js +5 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [5.9.0](https://github.com/appium/appium-android-driver/compare/v5.8.12...v5.9.0) (2023-04-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Add mobile extensions to set and get connectivity ([#791](https://github.com/appium/appium-android-driver/issues/791)) ([315d893](https://github.com/appium/appium-android-driver/commit/315d8936536e96077e00edf5949e21a7831fba2a))
|
|
7
|
+
|
|
8
|
+
## [5.8.12](https://github.com/appium/appium-android-driver/compare/v5.8.11...v5.8.12) (2023-03-25)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Miscellaneous Chores
|
|
12
|
+
|
|
13
|
+
* ignore an error in collectWebviewsDetails ([#789](https://github.com/appium/appium-android-driver/issues/789)) ([9aaa6c5](https://github.com/appium/appium-android-driver/commit/9aaa6c54c619d33dee35e60fb8ae5ad1d9cf9d95))
|
|
14
|
+
|
|
1
15
|
## [5.8.11](https://github.com/appium/appium-android-driver/compare/v5.8.10...v5.8.11) (2023-03-01)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -59,7 +59,9 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
59
59
|
refreshGpsCache: 'mobileRefreshGpsCache',
|
|
60
60
|
startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',
|
|
61
61
|
isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',
|
|
62
|
-
stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording'
|
|
62
|
+
stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',
|
|
63
|
+
getConnectivity: 'mobileGetConnectivity',
|
|
64
|
+
setConnectivity: 'mobileSetConnectivity'
|
|
63
65
|
};
|
|
64
66
|
if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
|
|
65
67
|
throw new _driver.errors.UnknownCommandError(`Unknown mobile command "${mobileCommand}". ` + `Only ${_lodash.default.keys(mobileCommandsMapping)} commands are supported.`);
|
|
@@ -68,4 +70,4 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
68
70
|
};
|
|
69
71
|
var _default = extensions;
|
|
70
72
|
exports.default = _default;
|
|
71
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiZXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJsb2ciLCJpbmZvIiwicmVwbGFjZSIsInRyaW0iLCJleGVjdXRlTW9iaWxlIiwiXyIsImlzQXJyYXkiLCJpc1dlYkNvbnRleHQiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZW5kcG9pbnQiLCJjaHJvbWVkcml2ZXIiLCJqd3Byb3h5IiwiZG93bnN0cmVhbVByb3RvY29sIiwiUFJPVE9DT0xTIiwiTUpTT05XUCIsImNvbW1hbmQiLCJtb2JpbGVDb21tYW5kIiwib3B0cyIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInNlbnNvclNldCIsImdldERldmljZVRpbWUiLCJzdGFydFNjcmVlblN0cmVhbWluZyIsInN0b3BTY3JlZW5TdHJlYW1pbmciLCJnZXROb3RpZmljYXRpb25zIiwibGlzdFNtcyIsInB1c2hGaWxlIiwicHVsbEZpbGUiLCJwdWxsRm9sZGVyIiwiZGVsZXRlRmlsZSIsImlzQXBwSW5zdGFsbGVkIiwicXVlcnlBcHBTdGF0ZSIsImFjdGl2YXRlQXBwIiwicmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiaW5zdGFsbEFwcCIsImNsZWFyQXBwIiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJzdGFydEFjdGl2aXR5IiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJ1bmxvY2siLCJyZWZyZXNoR3BzQ2FjaGUiLCJzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsInN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJnZXRDb25uZWN0aXZpdHkiLCJzZXRDb25uZWN0aXZpdHkiLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZXhlY3V0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzLCBQUk9UT0NPTFMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG5leHRlbnNpb25zLmV4ZWN1dGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChzY3JpcHQsIGFyZ3MpIHtcbiAgaWYgKHNjcmlwdC5tYXRjaCgvXm1vYmlsZTovKSkge1xuICAgIHRoaXMubG9nLmluZm8oYEV4ZWN1dGluZyBuYXRpdmUgY29tbWFuZCAnJHtzY3JpcHR9J2ApO1xuICAgIHNjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKC9ebW9iaWxlOi8sICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vYmlsZShzY3JpcHQsIF8uaXNBcnJheShhcmdzKSA/IGFyZ3NbMF0gOiBhcmdzKTtcbiAgfVxuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuZG93bnN0cmVhbVByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUFxuICAgID8gJy9leGVjdXRlJ1xuICAgIDogJy9leGVjdXRlL3N5bmMnO1xuICByZXR1cm4gYXdhaXQgdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHtcbiAgICBzY3JpcHQsXG4gICAgYXJncyxcbiAgfSk7XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlTW9iaWxlIChtb2JpbGVDb21tYW5kLCBvcHRzID0ge30pIHtcbiAgY29uc3QgbW9iaWxlQ29tbWFuZHNNYXBwaW5nID0ge1xuICAgIHNoZWxsOiAnbW9iaWxlU2hlbGwnLFxuXG4gICAgZXhlY0VtdUNvbnNvbGVDb21tYW5kOiAnbW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBzdGFydFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nJyxcbiAgICBzdG9wU2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZycsXG5cbiAgICBnZXROb3RpZmljYXRpb25zOiAnbW9iaWxlR2V0Tm90aWZpY2F0aW9ucycsXG5cbiAgICBsaXN0U21zOiAnbW9iaWxlTGlzdFNtcycsXG5cbiAgICBwdXNoRmlsZTogJ21vYmlsZVB1c2hGaWxlJyxcbiAgICBwdWxsRmlsZTogJ21vYmlsZVB1bGxGaWxlJyxcbiAgICBwdWxsRm9sZGVyOiAnbW9iaWxlUHVsbEZvbGRlcicsXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgaXNBcHBJbnN0YWxsZWQ6ICdtb2JpbGVJc0FwcEluc3RhbGxlZCcsXG4gICAgcXVlcnlBcHBTdGF0ZTogJ21vYmlsZVF1ZXJ5QXBwU3RhdGUnLFxuICAgIGFjdGl2YXRlQXBwOiAnbW9iaWxlQWN0aXZhdGVBcHAnLFxuICAgIHJlbW92ZUFwcDogJ21vYmlsZVJlbW92ZUFwcCcsXG4gICAgdGVybWluYXRlQXBwOiAnbW9iaWxlVGVybWluYXRlQXBwJyxcbiAgICBpbnN0YWxsQXBwOiAnbW9iaWxlSW5zdGFsbEFwcCcsXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuICAgIHN0YXJ0QWN0aXZpdHk6ICdtb2JpbGVTdGFydEFjdGl2aXR5JyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuXG4gICAgcmVmcmVzaEdwc0NhY2hlOiAnbW9iaWxlUmVmcmVzaEdwc0NhY2hlJyxcblxuICAgIHN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nOiAnbW9iaWxlU3RhcnRNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcnLFxuICAgIGlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZzogJ21vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZycsXG4gICAgc3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZzogJ21vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcnLFxuXG4gICAgZ2V0Q29ubmVjdGl2aXR5OiAnbW9iaWxlR2V0Q29ubmVjdGl2aXR5JyxcbiAgICBzZXRDb25uZWN0aXZpdHk6ICdtb2JpbGVTZXRDb25uZWN0aXZpdHknLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLE1BQU1FLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckJBLFVBQVUsQ0FBQ0MsT0FBTyxHQUFHLGVBQWVBLE9BQU9BLENBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFO0VBQ3pELElBQUlELE1BQU0sQ0FBQ0UsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0lBQzVCLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUUsNkJBQTRCSixNQUFPLEdBQUUsQ0FBQztJQUNyREEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUNDLElBQUksRUFBRTtJQUM5QyxPQUFPLE1BQU0sSUFBSSxDQUFDQyxhQUFhLENBQUNQLE1BQU0sRUFBRVEsZUFBQyxDQUFDQyxPQUFPLENBQUNSLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUdBLElBQUksQ0FBQztFQUMzRTtFQUNBLElBQUksQ0FBQyxJQUFJLENBQUNTLFlBQVksRUFBRSxFQUFFO0lBQ3hCLE1BQU0sSUFBSUMsY0FBTSxDQUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","names":["_lodash","_interopRequireDefault","require","_driver","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","_default","exports","default"],"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,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,MAAME,UAAU,GAAG,CAAC,CAAC;AAErBA,UAAU,CAACC,OAAO,GAAG,eAAeA,OAAOA,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,aAAaA,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;
|
|
1
|
+
{"version":3,"file":"execute.js","names":["_lodash","_interopRequireDefault","require","_driver","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","getConnectivity","setConnectivity","has","UnknownCommandError","keys","_default","exports","default"],"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 getConnectivity: 'mobileGetConnectivity',\n setConnectivity: 'mobileSetConnectivity',\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":"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"}
|
|
@@ -18,6 +18,9 @@ const AIRPLANE_MODE_MASK = 0b001;
|
|
|
18
18
|
const WIFI_MASK = 0b010;
|
|
19
19
|
const DATA_MASK = 0b100;
|
|
20
20
|
const GEO_EPSILON = Number.MIN_VALUE;
|
|
21
|
+
const WIFI_KEY_NAME = 'wifi';
|
|
22
|
+
const DATA_KEY_NAME = 'data';
|
|
23
|
+
const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
|
|
21
24
|
commands.getNetworkConnection = async function getNetworkConnection() {
|
|
22
25
|
this.log.info('Getting network connection');
|
|
23
26
|
let airplaneModeOn = await this.adb.isAirplaneModeOn();
|
|
@@ -33,6 +36,52 @@ commands.getNetworkConnection = async function getNetworkConnection() {
|
|
|
33
36
|
commands.isWifiOn = async function isWifiOn() {
|
|
34
37
|
return await this.adb.isWifiOn();
|
|
35
38
|
};
|
|
39
|
+
commands.mobileSetConnectivity = async function mobileSetConnectivity(opts = {}) {
|
|
40
|
+
const {
|
|
41
|
+
wifi,
|
|
42
|
+
data,
|
|
43
|
+
airplaneMode
|
|
44
|
+
} = opts;
|
|
45
|
+
if (_lodash.default.every([wifi, data, airplaneMode], _lodash.default.isUndefined)) {
|
|
46
|
+
throw new _driver.errors.InvalidArgumentError(`Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`);
|
|
47
|
+
}
|
|
48
|
+
const currentState = await this.mobileGetConnectivity({
|
|
49
|
+
services: [...(_lodash.default.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]), ...(_lodash.default.isUndefined(data) ? [] : [DATA_KEY_NAME]), ...(_lodash.default.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME])]
|
|
50
|
+
});
|
|
51
|
+
const setters = [];
|
|
52
|
+
if (!_lodash.default.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {
|
|
53
|
+
setters.push(this.adb.setWifiState(wifi, this.isEmulator()));
|
|
54
|
+
}
|
|
55
|
+
if (!_lodash.default.isUndefined(data) && currentState.data !== Boolean(data)) {
|
|
56
|
+
setters.push(this.adb.setDataState(data, this.isEmulator()));
|
|
57
|
+
}
|
|
58
|
+
if (!_lodash.default.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {
|
|
59
|
+
setters.push(async () => {
|
|
60
|
+
await this.adb.setAirplaneMode(airplaneMode);
|
|
61
|
+
if (this.adb.getApiLevel() < 30) {
|
|
62
|
+
await this.adb.broadcastAirplaneMode(airplaneMode);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (!_lodash.default.isEmpty(setters)) {
|
|
67
|
+
await _bluebird.default.all(setters);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
commands.mobileGetConnectivity = async function mobileGetConnectivity(opts = {}) {
|
|
71
|
+
let {
|
|
72
|
+
services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME]
|
|
73
|
+
} = opts;
|
|
74
|
+
if (!_lodash.default.isArray(services)) {
|
|
75
|
+
services = [services];
|
|
76
|
+
}
|
|
77
|
+
const statePromises = {
|
|
78
|
+
wifi: _bluebird.default.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),
|
|
79
|
+
data: _bluebird.default.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),
|
|
80
|
+
airplaneMode: _bluebird.default.resolve(services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn())
|
|
81
|
+
};
|
|
82
|
+
await _bluebird.default.all(_lodash.default.values(statePromises));
|
|
83
|
+
return _lodash.default.fromPairs(services.map(k => [k, statePromises[k].value()]));
|
|
84
|
+
};
|
|
36
85
|
commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
37
86
|
this.log.info('Setting network connection');
|
|
38
87
|
const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;
|
|
@@ -47,10 +96,12 @@ commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
|
47
96
|
await this.adb.setAirplaneMode(shouldEnableAirplaneMode);
|
|
48
97
|
});
|
|
49
98
|
await this.wrapBootstrapDisconnect(async () => {
|
|
50
|
-
await this.adb.
|
|
99
|
+
if ((await this.adb.getApiLevel()) < 30) {
|
|
100
|
+
await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
|
|
101
|
+
}
|
|
51
102
|
});
|
|
52
103
|
} else {
|
|
53
|
-
this.log.info(`Not changing airplane mode, since it is already
|
|
104
|
+
this.log.info(`Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
|
|
54
105
|
}
|
|
55
106
|
if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
|
|
56
107
|
this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');
|
|
@@ -103,7 +154,9 @@ commands.toggleFlightMode = async function toggleFlightMode() {
|
|
|
103
154
|
await this.adb.setAirplaneMode(flightMode);
|
|
104
155
|
});
|
|
105
156
|
await this.wrapBootstrapDisconnect(async () => {
|
|
106
|
-
await this.adb.
|
|
157
|
+
if ((await this.adb.getApiLevel()) < 30) {
|
|
158
|
+
await this.adb.broadcastAirplaneMode(flightMode);
|
|
159
|
+
}
|
|
107
160
|
});
|
|
108
161
|
};
|
|
109
162
|
commands.setGeoLocation = async function setGeoLocation(location) {
|
|
@@ -212,4 +265,4 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
|
|
|
212
265
|
Object.assign(extensions, commands, helpers);
|
|
213
266
|
var _default = extensions;
|
|
214
267
|
exports.default = _default;
|
|
215
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iLCJ0eXBlIiwic2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlIiwic2hvdWxkRW5hYmxlV2lmaSIsInNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uIiwiY3VycmVudFN0YXRlIiwiaXNBaXJwbGFuZU1vZGVFbmFibGVkIiwiaXNXaUZpRW5hYmxlZCIsImlzRGF0YUVuYWJsZWQiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsInNldEFpcnBsYW5lTW9kZSIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzRW11bGF0b3IiLCJ3aWZpIiwidG9nZ2xlRGF0YSIsImRhdGEiLCJzZXRXaWZpQW5kRGF0YSIsInRvZ2dsZVdpRmkiLCJ0b2dnbGVGbGlnaHRNb2RlIiwiZmxpZ2h0TW9kZSIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJnZXRHZW9Mb2NhdGlvbiIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJtb2JpbGVSZWZyZXNoR3BzQ2FjaGUiLCJvcHRzIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiS2V5Q29kZSIsIlVQIiwiRE9XTiIsIlJJR0hUIiwiQ0VOVEVSIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImFwaSIsImdldEFwaUxldmVsIiwicHJvdmlkZXJzIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJpc0dwc0VuYWJsZWQiLCJpbmRleE9mIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInNlcSIsInB1c2giLCJrZXlldmVudCIsInRvZ2dsZVNldHRpbmciLCJlcnJvcnMiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwic2V0dGluZyIsInByZUtleVNlcSIsIl8iLCJpc051bGwiLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsImtleSIsImRvS2V5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImlnbiIsImJhY2siLCJCIiwiZGVsYXkiLCJ3cmFwcGVkIiwiYm9vdHN0cmFwIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwicmVzdGFydCIsInN0YXJ0IiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsImFjY2VwdFNzbENlcnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL25ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuXG5jb21tYW5kcy5nZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldE5ldHdvcmtDb25uZWN0aW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnR2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgbGV0IGFpcnBsYW5lTW9kZU9uID0gYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpO1xuICBsZXQgY29ubmVjdGlvbiA9IGFpcnBsYW5lTW9kZU9uID8gQUlSUExBTkVfTU9ERV9NQVNLIDogMDtcblxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgd2UgYXJlIGluIGFpcnBsYW5lIG1vZGVcbiAgaWYgKCFhaXJwbGFuZU1vZGVPbikge1xuICAgIGxldCB3aWZpT24gPSBhd2FpdCB0aGlzLmlzV2lmaU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAod2lmaU9uID8gV0lGSV9NQVNLIDogMCk7XG4gICAgbGV0IGRhdGFPbiA9IGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAoZGF0YU9uID8gREFUQV9NQVNLIDogMCk7XG4gIH1cblxuICByZXR1cm4gY29ubmVjdGlvbjtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgYWlycGxhbmUgbW9kZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgICAgICBgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMuc2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRHZW9Mb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0R2VvTG9jYXRpb24obG9jYXRpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRHZW9Mb2NhdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IGdldCB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpbmZvOiAke2UubWVzc2FnZX1gKTtcbiAgICB0aGlzLmxvZy53YXJuKGBSZXR1cm5pbmcgdGhlIGRlZmF1bHQgemVybydlZCB2YWx1ZXNgKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0aXR1ZGU6IEdFT19FUFNJTE9OLFxuICAgICAgbG9uZ2l0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGFsdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdwc0NhY2hlUmVmcmVzaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byBibG9jayB1bnRpbCBHUFMgY2FjaGUgaXMgcmVmcmVzaGVkLiBQcm92aWRpbmcgemVybyBvciBhIG5lZ2F0aXZlXG4gKiB2YWx1ZSB0byBpdCBza2lwcyB3YWl0aW5nIGNvbXBsZXRlbHkuXG4gKi9cblxuLyoqXG4gKiBTZW5kcyBhbiBhc3luYyByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZS5cbiAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXNcbiAqIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZC4gSW4gY2FzZSB0aGUgdmFuaWxsYVxuICogTG9jYXRpb25NYW5hZ2VyIGlzIHVzZWQgdGhlIGRldmljZSBBUEkgbGV2ZWwgbXVzdCBiZSBhdFxuICogdmVyc2lvbiAzMCAoQW5kcm9pZCBSKSBvciBoaWdoZXIuXG4gKlxuICogQHBhcmFtIHtHcHNDYWNoZVJlZnJlc2hPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlZnJlc2hHcHNDYWNoZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJlZnJlc2hHcHNDYWNoZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgdGltZW91dE1zIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLmFkYi5yZWZyZXNoR2VvTG9jYXRpb25DYWNoZSh0aW1lb3V0TXMpO1xufTtcblxuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbHRpdHVkZX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRHZW9Mb2NhdGlvbigpO1xuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZUZsb2F0KGxhdGl0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBhbHRpdHVkZTogcGFyc2VGbG9hdChhbHRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gIH07XG59O1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRFBBRF9DRU5URVJcbi8vIGluIHRoZSBhbmRyb2lkIGRvY3MsIHRoaXMgaXMgaG93IHRoZSBrZXljb2RlcyBhcmUgZGVmaW5lZFxuY29uc3QgS2V5Q29kZSA9IHtcbiAgVVA6IDE5LFxuICBET1dOOiAyMCxcbiAgUklHSFQ6IDIyLFxuICBDRU5URVI6IDIzXG59O1xuY29tbWFuZHMudG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUxvY2F0aW9uU2VydmljZXMgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUb2dnbGluZyBsb2NhdGlvbiBzZXJ2aWNlcycpO1xuICBsZXQgYXBpID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgbGV0IHByb3ZpZGVycyA9IGF3YWl0IHRoaXMuYWRiLmdldExvY2F0aW9uUHJvdmlkZXJzKCk7XG4gICAgbGV0IGlzR3BzRW5hYmxlZCA9IHByb3ZpZGVycy5pbmRleE9mKCdncHMnKSAhPT0gLTE7XG4gICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcighaXNHcHNFbmFibGVkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXBpID4gMTUpIHtcbiAgICBsZXQgc2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVBdO1xuICAgIGlmIChhcGkgPT09IDE2KSB7XG4gICAgICAvLyBUaGlzIHZlcnNpb24gb2YgQW5kcm9pZCBoYXMgYSBcInBhcmVudFwiIGJ1dHRvbiBpbiBpdHMgYWN0aW9uIGJhclxuICAgICAgc2VxLnB1c2goS2V5Q29kZS5ET1dOKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA8IDI4KSB7XG4gICAgICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiB0aGUgQWN0aW9uIGJhclxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFQsIEtleUNvZGUuUklHSFQsIEtleUNvZGUuVVBdO1xuICAgICAgLypcbiAgICAgICAqIE9uY2UgdGhlIExvY2F0aW9uIHNlcnZpY2VzIHN3aXRjaCBpcyBPRkYsIGl0IHdvbid0IHJlY2VpdmUgZm9jdXNcbiAgICAgICAqIHdoZW4gZ29pbmcgYmFjayB0byB0aGUgTG9jYXRpb24gU2VydmljZXMgc2V0dGluZ3Mgc2NyZWVuIHVubGVzcyB3ZVxuICAgICAgICogc2VuZCBhIGR1bW15IGtleWV2ZW50IChVUCkgKmJlZm9yZSogb3BlbmluZyB0aGUgc2V0dGluZ3Mgc2NyZWVuXG4gICAgICAgKi9cbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KEtleUNvZGUuVVApO1xuICAgIH0gZWxzZSBpZiAoYXBpID49IDI4KSB7XG4gICAgICAvLyBFdmVuIG5ld2VyIHZlcnNpb25zIG9mIGFuZHJvaWQgaGF2ZSB0aGUgdG9nZ2xlIGluIGEgYmFyIGJlbG93IHRoZSBhY3Rpb24gYmFyXG4gICAgICAvLyB0aGlzIG1lYW5zIGEgc2luZ2xlIHJpZ2h0IGNsaWNrIHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICBzZXEgPSBbS2V5Q29kZS5SSUdIVF07XG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy50b2dnbGVTZXR0aW5nKCdMT0NBVElPTl9TT1VSQ0VfU0VUVElOR1MnLCBzZXEpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlJ3Mgbm8gZ2xvYmFsIGxvY2F0aW9uIHNlcnZpY2VzIHRvZ2dsZSBvbiBvbGRlciBBbmRyb2lkIHZlcnNpb25zXG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn07XG5cbmhlbHBlcnMudG9nZ2xlU2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVNldHRpbmcgKHNldHRpbmcsIHByZUtleVNlcSkge1xuICAvKlxuICAgKiBwcmVLZXlTZXEgaXMgdGhlIGtleWV2ZW50IHNlcXVlbmNlIHRvIHNlbmQgb3ZlciBBREIgaW4gb3JkZXJcbiAgICogdG8gcG9zaXRpb24gdGhlIGN1cnNvciBvbiB0aGUgcmlnaHQgb3B0aW9uLlxuICAgKiBCeSBkZWZhdWx0IGl0J3MgW3VwLCB1cCwgZG93bl0gYmVjYXVzZSB3ZSB1c3VhbGx5IHRhcmdldCB0aGUgMXN0IGl0ZW0gaW5cbiAgICogdGhlIHNjcmVlbiwgYW5kIHNvbWV0aW1lcyB3aGVuIG9wZW5pbmcgc2V0dGluZ3MgYWN0aXZpdGllcyB0aGUgY3Vyc29yIGlzXG4gICAqIGFscmVhZHkgcG9zaXRpb25uZWQgb24gdGhlIDFzdCBpdGVtLCBidXQgd2UgY2FuJ3Qga25vdyBmb3Igc3VyZVxuICAgKi9cbiAgaWYgKF8uaXNOdWxsKHByZUtleVNlcSkpIHtcbiAgICBwcmVLZXlTZXEgPSBbS2V5Q29kZS5VUCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOXTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMub3BlblNldHRpbmdzQWN0aXZpdHkoc2V0dGluZyk7XG5cbiAgZm9yIChsZXQga2V5IG9mIHByZUtleVNlcSkge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoa2V5KTtcbiAgfVxuXG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuXG4gIC8qXG4gICAqIENsaWNrIGFuZCBoYW5kbGUgcG90ZW50aWFsIEFEQiBkaXNjb25uZWN0IHRoYXQgb2NjdXJzIG9uIG9mZmljaWFsXG4gICAqIGVtdWxhdG9yIHdoZW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLkNFTlRFUik7XG4gIH0pO1xuXG4gIC8qXG4gICAqIEluIG9uZSBwYXJ0aWN1bGFyIGNhc2UgKGVuYWJsZSBMb2NhdGlvbiBTZXJ2aWNlcyksIGEgcG9wLXVwIGlzXG4gICAqIGRpc3BsYXllZCBvbiBzb21lIHBsYXRmb3JtcyBzbyB0aGUgdXNlciBhY2NlcHRzIG9yIHJlZnVzZXMgdGhhdCBHb29nbGVcbiAgICogY29sbGVjdHMgbG9jYXRpb24gZGF0YS4gU28gd2Ugd2FpdCBmb3IgdGhhdCBwb3AtdXAgdG8gb3BlbiwgaWYgaXRcbiAgICogZG9lc24ndCB0aGVuIHByb2NlZWRcbiAgICovXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuUklHSFQpO1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBhd2FpdCB0aGlzLmFkYi5iYWNrKCk7XG59O1xuXG5oZWxwZXJzLmRvS2V5ID0gYXN5bmMgZnVuY3Rpb24gZG9LZXkgKGtleSkge1xuICAvLyBUT0RPOiBDb25maXJtIHdlIG5lZWQgdGhpcyBkZWxheS4gU2VlbXMgdG8gd29yayB3aXRob3V0IGl0LlxuICBhd2FpdCBCLmRlbGF5KDIwMDApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXkpO1xufTtcblxuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gIGlmICghdGhpcy5ib290c3RyYXApIHtcbiAgICByZXR1cm4gYXdhaXQgd3JhcHBlZCgpO1xuICB9XG5cbiAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3cmFwcGVkKCk7XG4gICAgYXdhaXQgdGhpcy5hZGIucmVzdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnN0YXJ0KHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0aGlzLm9wdHMuZGlzYWJsZUFuZHJvaWRXYXRjaGVycywgdGhpcy5vcHRzLmFjY2VwdFNzbENlcnRzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFJRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqRCxNQUFNSSxrQkFBa0IsR0FBRyxLQUFLO0FBQ2hDLE1BQU1DLFNBQVMsR0FBRyxLQUFLO0FBQ3ZCLE1BQU1DLFNBQVMsR0FBRyxLQUFLO0FBTXZCLE1BQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxTQUFTO0FBRXBDVCxRQUFRLENBQUNVLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQkEsQ0FBQSxFQUFJO0VBQ3JFLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUMsNEJBQTRCLENBQUM7RUFDM0MsSUFBSUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNDLGdCQUFnQixFQUFFO0VBQ3RELElBQUlD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
|
|
268
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsIldJRklfS0VZX05BTUUiLCJEQVRBX0tFWV9OQU1FIiwiQUlSUExBTkVfTU9ERV9LRVlfTkFNRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwibW9iaWxlU2V0Q29ubmVjdGl2aXR5Iiwib3B0cyIsIndpZmkiLCJkYXRhIiwiYWlycGxhbmVNb2RlIiwiXyIsImV2ZXJ5IiwiaXNVbmRlZmluZWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImN1cnJlbnRTdGF0ZSIsIm1vYmlsZUdldENvbm5lY3Rpdml0eSIsInNlcnZpY2VzIiwic2V0dGVycyIsIkJvb2xlYW4iLCJwdXNoIiwic2V0V2lmaVN0YXRlIiwiaXNFbXVsYXRvciIsInNldERhdGFTdGF0ZSIsInNldEFpcnBsYW5lTW9kZSIsImdldEFwaUxldmVsIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNFbXB0eSIsIkIiLCJhbGwiLCJpc0FycmF5Iiwic3RhdGVQcm9taXNlcyIsInJlc29sdmUiLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInZhbHVlcyIsImZyb21QYWlycyIsIm1hcCIsImsiLCJ2YWx1ZSIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ0b2dnbGVEYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiS2V5Q29kZSIsIlVQIiwiRE9XTiIsIlJJR0hUIiwiQ0VOVEVSIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImFwaSIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJrZXlldmVudCIsInRvZ2dsZVNldHRpbmciLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwic2V0dGluZyIsInByZUtleVNlcSIsImlzTnVsbCIsIm9wZW5TZXR0aW5nc0FjdGl2aXR5Iiwia2V5IiwiZG9LZXkiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiaWduIiwiYmFjayIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcbmNvbnN0IFdJRklfS0VZX05BTUUgPSAnd2lmaSc7XG5jb25zdCBEQVRBX0tFWV9OQU1FID0gJ2RhdGEnO1xuY29uc3QgQUlSUExBTkVfTU9ERV9LRVlfTkFNRSA9ICdhaXJwbGFuZU1vZGUnO1xuXG5jb21tYW5kcy5nZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldE5ldHdvcmtDb25uZWN0aW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnR2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgbGV0IGFpcnBsYW5lTW9kZU9uID0gYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpO1xuICBsZXQgY29ubmVjdGlvbiA9IGFpcnBsYW5lTW9kZU9uID8gQUlSUExBTkVfTU9ERV9NQVNLIDogMDtcblxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgd2UgYXJlIGluIGFpcnBsYW5lIG1vZGVcbiAgaWYgKCFhaXJwbGFuZU1vZGVPbikge1xuICAgIGxldCB3aWZpT24gPSBhd2FpdCB0aGlzLmlzV2lmaU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAod2lmaU9uID8gV0lGSV9NQVNLIDogMCk7XG4gICAgbGV0IGRhdGFPbiA9IGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAoZGF0YU9uID8gREFUQV9NQVNLIDogMCk7XG4gIH1cblxuICByZXR1cm4gY29ubmVjdGlvbjtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0Q29ubmVjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFuP30gd2lmaSBFaXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgV2ktRmkuXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBkYXRhIEVpdGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aW9uLlxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gYWlycGxhbmVNb2RlIEVpdGhlciB0byBlbmFibGUgdG8gZGlzYWJsZSB0aGUgQWlycGxhbmUgTW9kZVxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgZm9yIGRpZmZlcmVudCBzZXJ2aWNlc1xuICpcbiAqIEBwYXJhbSB7U2V0Q29ubmVjdGl2aXR5T3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIG5vbmUgb2Yga25vd24gcHJvcGVydGllcyB3ZXJlIHByb3ZpZGVkIG9yIHRoZXJlIHdhcyBhbiBlcnJvclxuICogd2hpbGUgY2hhbmdpbmcgY29ubmVjdGl2aXR5IHN0YXRlc1xuICovXG5jb21tYW5kcy5tb2JpbGVTZXRDb25uZWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXRDb25uZWN0aXZpdHkgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lmaSxcbiAgICBkYXRhLFxuICAgIGFpcnBsYW5lTW9kZSxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKF8uZXZlcnkoW3dpZmksIGRhdGEsIGFpcnBsYW5lTW9kZV0sIF8uaXNVbmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBFaXRoZXIgb25lIG9mIFsnJHtXSUZJX0tFWV9OQU1FfScsICcke0RBVEFfS0VZX05BTUV9JywgJyR7QUlSUExBTkVfTU9ERV9LRVlfTkFNRX0nXSBvcHRpb25zIG11c3QgYmUgcHJvdmlkZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0Q29ubmVjdGl2aXR5KHtcbiAgICBzZXJ2aWNlczogW1xuICAgICAgLi4uKF8uaXNVbmRlZmluZWQod2lmaSkgPyBbXSA6IFtXSUZJX0tFWV9OQU1FXSksXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZChkYXRhKSA/IFtdIDogW0RBVEFfS0VZX05BTUVdKSxcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKGFpcnBsYW5lTW9kZSkgPyBbXSA6IFtBSVJQTEFORV9NT0RFX0tFWV9OQU1FXSksXG4gICAgXVxuICB9KTtcbiAgY29uc3Qgc2V0dGVycyA9IFtdO1xuICBpZiAoIV8uaXNVbmRlZmluZWQod2lmaSkgJiYgY3VycmVudFN0YXRlLndpZmkgIT09IEJvb2xlYW4od2lmaSkpIHtcbiAgICBzZXR0ZXJzLnB1c2godGhpcy5hZGIuc2V0V2lmaVN0YXRlKHdpZmksIHRoaXMuaXNFbXVsYXRvcigpKSk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGRhdGEpICYmIGN1cnJlbnRTdGF0ZS5kYXRhICE9PSBCb29sZWFuKGRhdGEpKSB7XG4gICAgc2V0dGVycy5wdXNoKHRoaXMuYWRiLnNldERhdGFTdGF0ZShkYXRhLCB0aGlzLmlzRW11bGF0b3IoKSkpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChhaXJwbGFuZU1vZGUpICYmIGN1cnJlbnRTdGF0ZS5haXJwbGFuZU1vZGUgIT09IEJvb2xlYW4oYWlycGxhbmVNb2RlKSkge1xuICAgIHNldHRlcnMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoYWlycGxhbmVNb2RlKTtcbiAgICAgIGlmICh0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGFpcnBsYW5lTW9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoc2V0dGVycykpIHtcbiAgICBhd2FpdCBCLmFsbChzZXR0ZXJzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRDb25uZWN0aXZpdHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2lmaSBUcnVlIGlmIHdpZmkgaXMgZW5hYmxlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBkYXRhIFRydWUgaWYgbW9iaWxlIGRhdGEgY29ubmVjdGlvbiBpcyBlbmFibGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFpcnBsYW5lTW9kZSBUcnVlIGlmIEFpcnBsYW5lIE1vZGUgaXMgZW5hYmxlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0Q29ubmVjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXXxzdHJpbmc/fSBzZXJ2aWNlcyBvbmUgb3IgbW9yZSBzZXJ2aWNlcyB0byBnZXQgdGhlIGNvbm5lY3Rpdml0eSBmb3IuXG4gKiBTdXBwb3J0ZWQgc2VydmljZSBuYW1lcyBhcmU6IHdpZmksIGRhdGEsIGFpcnBsYW5lTW9kZS5cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY29ubmVjdGl2aXR5IHByb3BlcnRpZXMgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge0dldENvbm5lY3Rpdml0eU9wdGlvbnM/fSBvcHRzIElmIG5vIHNlcnZpY2UgbmFtZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBjb25uZWN0aXZpdHkgc3RhdGUgaXMgcmV0dXJuZWQgZm9yIGFsbCBvZiB0aGVtLlxuICogQHJldHVybnMge0dldENvbm5lY3Rpdml0eVJlc3VsdH1cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29ubmVjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29ubmVjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgbGV0IHtcbiAgICBzZXJ2aWNlcyA9IFtXSUZJX0tFWV9OQU1FLCBEQVRBX0tFWV9OQU1FLCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FXSxcbiAgfSA9IG9wdHM7XG4gIGlmICghXy5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgIHNlcnZpY2VzID0gW3NlcnZpY2VzXTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlUHJvbWlzZXMgPSB7XG4gICAgd2lmaTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKFdJRklfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNXaWZpT24oKSksXG4gICAgZGF0YTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKERBVEFfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNEYXRhT24oKSksXG4gICAgYWlycGxhbmVNb2RlOiBCLnJlc29sdmUoXG4gICAgICBzZXJ2aWNlcy5pbmNsdWRlcyhBSVJQTEFORV9NT0RFX0tFWV9OQU1FKSA/IHVuZGVmaW5lZCA6IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKVxuICAgICksXG4gIH07XG4gIGF3YWl0IEIuYWxsKF8udmFsdWVzKHN0YXRlUHJvbWlzZXMpKTtcbiAgcmV0dXJuIF8uZnJvbVBhaXJzKHNlcnZpY2VzLm1hcCgoaykgPT4gW2ssIHN0YXRlUHJvbWlzZXNba10udmFsdWUoKV0pKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBSUcsUUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(flightMode);\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","keyevent","toggleSetting","NotYetImplementedError","setting","preKeySeq","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
@@ -161,7 +161,11 @@ async function collectWebviewsDetails(adb, webviewsMapping, opts = {}) {
|
|
|
161
161
|
_logger.default.debug(e);
|
|
162
162
|
} finally {
|
|
163
163
|
if (localPort) {
|
|
164
|
-
|
|
164
|
+
try {
|
|
165
|
+
await adb.removePortForward(localPort);
|
|
166
|
+
} catch (e) {
|
|
167
|
+
_logger.default.debug(e);
|
|
168
|
+
}
|
|
165
169
|
}
|
|
166
170
|
}
|
|
167
171
|
})());
|
|
@@ -345,4 +349,4 @@ helpers.createChromedriverCaps = function createChromedriverCaps(opts, deviceId,
|
|
|
345
349
|
};
|
|
346
350
|
var _default = helpers;
|
|
347
351
|
exports.default = _default;
|
|
348
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2F4aW9zIiwiX3N1cHBvcnQiLCJfcG9ydHNjYW5uZXIiLCJfbHJ1Q2FjaGUiLCJfYmx1ZWJpcmQiLCJfcGF0aCIsIl9vcyIsIk5BVElWRV9XSU4iLCJleHBvcnRzIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiX29wdHMkY2hyb21lT3B0aW9ucyIsIl93ZWJWaWV3RGV0YWlscyRpbmZvIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlMiIsIl9vcHRzJGNocm9tZU9wdGlvbnMyIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgQ0hST01JVU1fV0lOID0gJ0NIUk9NSVVNJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgV0VCVklFV19QSURfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oXFxcXGQrKWApO1xuY29uc3QgV0VCVklFV19QS0dfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oW15cXFxcZFxcXFxzXVtcXFxcdy5dKilgKTtcbmNvbnN0IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOID0gL0BbXFx3Ll0rX2RldnRvb2xzX3JlbW90ZV8/KFxcZCspP1xcYi87XG5jb25zdCBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4gPSAvQChbXFx3Ll0rKV9kZXZ0b29sc19yZW1vdGVcXGIvO1xuY29uc3QgQ0hST01JVU1fREVWVE9PTFNfU09DS0VUID0gJ2Nocm9tZV9kZXZ0b29sc19yZW1vdGUnO1xuY29uc3QgQ0hST01FX1BBQ0tBR0VfTkFNRSA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgPSBbXG4gIENIUk9NRV9QQUNLQUdFX05BTUUsXG4gICdjb20uY2hyb21lLmJldGEnLFxuICAnY29tLmNocm9tZS5kZXYnLFxuICAnY29tLmNocm9tZS5jYW5hcnknLFxuXTtcbmNvbnN0IERFVlRPT0xTX1BPUlRTX1JBTkdFID0gWzEwOTAwLCAxMTAwMF07XG5jb25zdCBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAwLFxuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbn0pO1xuY29uc3QgQ0RQX1JFUV9USU1FT1VUID0gMjAwMDsgLy8gbXNcbmNvbnN0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAnYW5kcm9pZF9kZXZ0b29sc19wb3J0X2d1YXJkJyksXG4gIHt0aW1lb3V0OiA3LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuZnVuY3Rpb24gdG9EZXRhaWxzQ2FjaGVLZXkgKGFkYiwgd2Vidmlldykge1xuICByZXR1cm4gYCR7YWRiPy5jdXJEZXZpY2VJZH06JHt3ZWJ2aWV3fWA7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgbGlzdCBvZiBhbmRyb2lkIHN5c3RlbSBwcm9jZXNzZXMgYW5kIHJldHVybnMgb25lc1xuICogdGhhdCBsb29rIGxpa2Ugd2Vidmlld3NcbiAqIFNlZSBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIG1hdGNoaW5nIHdlYnZpZXcgc29ja2V0IG5hbWVzIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgJ0AnKVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MgKGFkYikge1xuICBjb25zdCBvdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IG5hbWVzID0gW107XG4gIGNvbnN0IGFsbE1hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBOdW0gUmVmQ291bnQgUHJvdG9jb2wgRmxhZ3MgVHlwZSBTdCBJbm9kZSBQYXRoXG4gICAgY29uc3QgWywsLCBmbGFncywsIHN0LCwgc29ja1BhdGhdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAoIXNvY2tQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNvY2tQYXRoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgYWxsTWF0Y2hlcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICB9XG4gICAgaWYgKGZsYWdzICE9PSAnMDAwMTAwMDAnIHx8IHN0ICE9PSAnMDEnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFERVZUT09MU19TT0NLRVRfUEFUVEVSTi50ZXN0KHNvY2tQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmFtZXMucHVzaChzb2NrUGF0aCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG5vIGFjdGl2ZSBkZXZ0b29scyBzb2NrZXRzJyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoYWxsTWF0Y2hlcykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgT3RoZXIgc29ja2V0cyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsTWF0Y2hlcywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkICR7bmFtZXMubGVuZ3RofSBhY3RpdmUgZGV2dG9vbHMgJHt1dGlsLnBsdXJhbGl6ZSgnc29ja2V0JywgbmFtZXMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWVzKSk7XG4gIH1cbiAgLy8gc29tZXRpbWVzIHRoZSB3ZWJ2aWV3IHByb2Nlc3Mgc2hvd3MgdXAgbXVsdGlwbGUgdGltZXMgcGVyIGFwcFxuICByZXR1cm4gXy51bmlxKG5hbWVzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvY1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgLSBUaGUgd2VidmlldyBwcm9jZXNzIG5hbWUgKGFzIHJldHVybmVkIGJ5XG4gKiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IC0gVGhlIGFjdHVhbCB3ZWJ2aWV3IGNvbnRleHQgbmFtZVxuICovXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgbGlzdCBvZiBzeXN0ZW0gcHJvY2Vzc2VzIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzLFxuICogYW5kIHJldHVybnMgdGhlbSBhbG9uZyB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRleHQgbmFtZSBhcHByb3ByaWF0ZSBmb3IgaXQuXG4gKiBJZiB3ZSBwYXNzIGluIGEgZGV2aWNlU29ja2V0LCB3ZSBvbmx5IGF0dGVtcHQgdG8gZmluZCB3ZWJ2aWV3cyB3aGljaCBtYXRjaFxuICogdGhhdCBzb2NrZXQgbmFtZSAodGhpcyBpcyBmb3IgYXBwcyB3aGljaCBlbWJlZCBDaHJvbWl1bSwgd2hpY2ggaXNuJ3QgdGhlXG4gKiBzYW1lIGFzIGNocm9tZS1iYWNrZWQgd2Vidmlld3MpLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7P3N0cmluZ30gZGV2aWNlU29ja2V0IC0gdGhlIGV4cGxpY3RseS1uYW1lZCBkZXZpY2Ugc29ja2V0IHRvIHVzZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxXZWJ2aWV3UHJvYz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdlYnZpZXdzRnJvbVByb2NzIChhZGIsIGRldmljZVNvY2tldCA9IG51bGwpIHtcbiAgY29uc3Qgc29ja2V0TmFtZXMgPSBhd2FpdCBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MoYWRiKTtcbiAgY29uc3Qgd2Vidmlld3MgPSBbXTtcbiAgZm9yIChjb25zdCBzb2NrZXROYW1lIG9mIHNvY2tldE5hbWVzKSB7XG4gICAgaWYgKGRldmljZVNvY2tldCA9PT0gQ0hST01JVU1fREVWVE9PTFNfU09DS0VUICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IENIUk9NSVVNX1dJTixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0TmFtZU1hdGNoID0gREVWVE9PTFNfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNyb3Nzd2Fsa01hdGNoID0gQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2hbMV0gJiYgIWNyb3Nzd2Fsa01hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlU29ja2V0ICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCB8fCAhZGV2aWNlU29ja2V0KSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2Vidmlldzogc29ja2V0TmFtZU1hdGNoWzFdXG4gICAgICAgICAgPyBgJHtXRUJWSUVXX0JBU0V9JHtzb2NrZXROYW1lTWF0Y2hbMV19YFxuICAgICAgICAgIDogYCR7V0VCVklFV19CQVNFfSR7Y3Jvc3N3YWxrTWF0Y2hbMV19YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3M7XG59XG5cbi8qKlxuICogQWxsb2NhdGVzIGEgbG9jYWwgcG9ydCBmb3IgZGV2dG9vbHMgY29tbXVuaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ja2V0TmFtZSBUaGUgcmVtb3RlIFVuaXggc29ja2V0IG5hbWVcbiAqIEBwYXJhbSB7P251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgbG9jYWwgcG9ydCBudW1iZXIgb3IgbnVsbCB0byBhcHBseVxuICogYXV0b2RldGVjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlmIHRoZSByZW1vdGUgc29ja2V0IGhhcyBiZWVuIGZvcndhcmRlZFxuICogc3VjY2Vzc2Z1bGx5IG9yIGBudWxsYCBvdGhlcndpc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWxsb2NhdGluZyB0aGUgbG9jYWwgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBhbGxvY2F0ZURldnRvb2xzUG9ydCAoYWRiLCBzb2NrZXROYW1lLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCkge1xuICAvLyBzb2NrZXQgbmFtZXMgY29tZSB3aXRoICdAJywgYnV0IHRoaXMgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgdGhlIGFic3RyYWN0XG4gIC8vIHJlbW90ZSBwb3J0LCBzbyByZW1vdmUgaXRcbiAgY29uc3QgcmVtb3RlUG9ydCA9IHNvY2tldE5hbWUucmVwbGFjZSgvXkAvLCAnJyk7XG4gIGxldCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVlRPT0xTX1BPUlRTX1JBTkdFO1xuICBpZiAod2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGVuZFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0ICsgKGVuZFBvcnQgLSBzdGFydFBvcnQpO1xuICAgIHN0YXJ0UG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3J3YXJkaW5nIHJlbW90ZSBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gYSBsb2NhbCBgICtcbiAgICBgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH1gKTtcbiAgaWYgKCF3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBZb3UgY291bGQgdXNlIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgYCArXG4gICAgICBgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvY2FsUG9ydDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgdG8gZm9yd2FyZCB0aGUgRGV2dG9vbHMgc29ja2V0IGAgK1xuICAgICAgICBgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBZb3UgY291bGQgc2V0IHRoZSBzdGFydGluZyBwb3J0IG51bWJlciBgICtcbiAgICAgICAgYG1hbnVhbGx5IGJ5IHByb3ZpZGluZyB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke2xvY2FsUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke3JlbW90ZVBvcnR9YF0pO1xuICAgIHJldHVybiBsb2NhbFBvcnQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldGFpbENvbGxlY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBzdGFydGluZyBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjayAoaWYgbm90IHRoZSBkZWZhdWx0IG9mIDkyMjIpLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgV2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZXMgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgQ2hyb21lIERlYnVnZ2VyIFByb3RvY29sIGRhdGEgY29sbGVjdGlvbi5cbiAqIE5vIGVycm9yIGlzIHRocm93biBpZiBDRFAgcmVxdWVzdCBmYWlscyAtIGluIHN1Y2ggY2FzZSBubyBkYXRhIHdpbGwgYmVcbiAqIHJlY29yZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYHdlYnZpZXdzTWFwcGluZ2AgaXRlbS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld1Byb3BzPn0gd2Vidmlld3NNYXBwaW5nIFRoZSBjdXJyZW50IHdlYnZpZXdzIG1hcHBpbmdcbiAqICEhISBFYWNoIGl0ZW0gb2YgdGhpcyBhcnJheSBnZXRzIG11dGF0ZWQgKGBpbmZvYC9gcGFnZXNgIHByb3BlcnRpZXMgZ2V0IGFkZGVkXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYG9wdHNgKSBpZiB0aGUgcmVxdWVzdGVkIGRldGFpbHMgaGF2ZSBiZWVuXG4gKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGZvciBpdCAhISFcbiAqIEBwYXJhbSB7RGV0YWlsQ29sbGVjdGlvbk9wdGlvbnN9IG9wdHMgSWYgYm90aCBgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXNgIGFuZFxuICogYGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbmAgcHJvcGVydGllcyBhcmUgZmFsc3kgdGhlbiBubyBkZXRhaWxzIGNvbGxlY3Rpb25cbiAqIGlzIHBlcmZvcm1lZFxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0V2Vidmlld3NEZXRhaWxzIChhZGIsIHdlYnZpZXdzTWFwcGluZywgb3B0cyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkod2Vidmlld3NNYXBwaW5nKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IG51bGwsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gbnVsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY2hlY2tpbmcgd2hldGhlciB3ZWJ2aWV3cyBoYXZlIGFjdGl2ZSBwYWdlczsgdXNlIHRoZSBgICtcbiAgICAgIGAnZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMnIGNhcCB0byB0dXJuIHRoaXMgY2hlY2sgb25gKTtcbiAgfVxuXG4gIGlmICghZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjb2xsZWN0aW5nIHdlYiB2aWV3IGRldGFpbHMuIERldGFpbHMgY29sbGVjdGlvbiBtaWdodCBoZWxwIGAgK1xuICAgICAgYHRvIG1ha2UgQ2hyb21lZHJpdmVyIGluaXRpYWxpemF0aW9uIG1vcmUgcHJlY2lzZS4gVXNlIHRoZSAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJyBgICtcbiAgICAgIGBjYXAgdG8gdHVybiBpdCBvbmApO1xuICB9XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiAhZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ29ubmVjdCB0byBlYWNoIGRldnRvb2xzIHNvY2tldCBhbmQgcmV0cmlldmUgd2ViIHZpZXcgZGV0YWlsc1xuICBsb2dnZXIuZGVidWcoYENvbGxlY3RpbmcgQ0RQIGRhdGEgb2YgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHdlYnZpZXdzTWFwcGluZy5sZW5ndGgsIHRydWUpfWApO1xuICBjb25zdCBkZXRhaWxDb2xsZWN0b3JzID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBkZXRhaWxDb2xsZWN0b3JzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFBvcnQgPSBhd2FpdCBhbGxvY2F0ZURldnRvb2xzUG9ydChhZGIsIGl0ZW0ucHJvYywgd2Vidmlld0RldnRvb2xzUG9ydCk7XG4gICAgICAgIGlmIChlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpdGVtLmluZm8gPSBhd2FpdCBjZHBJbmZvKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgICAgICAgaXRlbS5wYWdlcyA9IGF3YWl0IGNkcExpc3QobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobG9jYWxQb3J0KSB7XG4gICAgICAgICAgYXdhaXQgYWRiLnJlbW92ZVBvcnRGb3J3YXJkKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChkZXRhaWxDb2xsZWN0b3JzKTtcbiAgbG9nZ2VyLmRlYnVnKGBDRFAgZGF0YSBjb2xsZWN0aW9uIGNvbXBsZXRlZGApO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcExpc3QgKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL2xpc3RgLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwSW5mbyAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vdmVyc2lvbmAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgd2VidmlldyBuYW1lIGxpa2UgV0VCVklFV180Mjk2IGFuZCB1c2UgJ2FkYiBzaGVsbCBwcycgdG8gZmlndXJlIG91dFxuICogd2hpY2ggYXBwIHBhY2thZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgd2Vidmlldy4gT25lIG9mIHRoZSByZWFzb25zIHdlXG4gKiB3YW50IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlJ3JlIGxpc3Rpbmcgd2Vidmlld3MgZm9yIHRoZSBhY3R1YWwgQVVULFxuICogbm90IHNvbWUgb3RoZXIgcnVubmluZyBhcHBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyAtIGEgd2VidmlldyBwcm9jZXNzIG5hbWVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcCBydW5uaW5nIHRoZSB3ZWJ2aWV3XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIG5hbWVcbiAqL1xuaGVscGVycy5wcm9jRnJvbVdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBwcm9jRnJvbVdlYnZpZXcgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgaWYgKCFwaWRNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgUElEIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICB9XG5cbiAgY29uc3QgcGlkID0gcGlkTWF0Y2hbMV07XG4gIGxvZ2dlci5kZWJ1ZyhgJHt3ZWJ2aWV3fSBtYXBwZWQgdG8gcGlkICR7cGlkfWApO1xuICBsb2dnZXIuZGVidWcoYEdldHRpbmcgcHJvY2VzcyBuYW1lIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICBjb25zdCBwa2cgPSBhd2FpdCBhZGIuZ2V0TmFtZUJ5UGlkKHBpZCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR290IHByb2Nlc3MgbmFtZTogJyR7cGtnfSdgKTtcbiAgcmV0dXJuIHBrZztcbn07XG5cbi8qKlxuICogUGFyc2Ugd2VidmlldyBuYW1lcyBmb3IgZ2V0Q29udGV4dHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIHdlYnZpZXcgbmFtZXNcbiAqL1xuaGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyA9IGZ1bmN0aW9uIHBhcnNlV2Vidmlld05hbWVzICh3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW0NIUk9NSVVNX1dJTl07XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB7d2VidmlldywgcGFnZXMsIHByb2MsIHdlYnZpZXdOYW1lfSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgcGFnZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwaW5nIHRoZSB3ZWJ2aWV3ICcke3dlYnZpZXd9JyBhdCAnJHtwcm9jfScgYCArXG4gICAgICAgIGBzaW5jZSBpdCBoYXMgcmVwb3J0ZWQgaGF2aW5nIHplcm8gcGFnZXNgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAod2Vidmlld05hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHdlYnZpZXdOYW1lKTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3JywgcmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFdlYnZpZXdzT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFuZHJvaWREZXZpY2VTb2NrZXQgW251bGxdIC0gZGV2aWNlIHNvY2tldCBuYW1lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFt0cnVlXSAtIHdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2UgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFs5MjIyXSAtIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gW3RydWVdIC0gd2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3Blcnkgez9zdHJpbmd9IHdlYnZpZXdOYW1lIEFuIGFjdHVhbCB3ZWJ2aWV3IG5hbWUgZm9yIHN3aXRjaGluZyBjb250ZXh0XG4gKi9cblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cyBtYXBwaW5nIGJ5IGludHJvc3BlY3RpbmcgcHJvY2Vzc2VzIHdpdGggYWRiLFxuICogd2hlcmUgd2Vidmlld3MgYXJlIGxpc3RlZC4gSXQncyBwb3NzaWJsZSB0byBwYXNzIGluIGEgJ2RldmljZVNvY2tldCcgYXJnLCB3aGljaFxuICogbGltaXRzIHRoZSB3ZWJ2aWV3IHBvc3NpYmlsaXRpZXMgdG8gdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBDaHJvbWl1bSBkZXZ0b29sc1xuICogc29ja2V0IHdlJ3JlIGludGVyZXN0ZWQgaW4gKHNlZSBub3RlIG9uIHdlYnZpZXdzRnJvbVByb2NzKS4gV2UgY2FuIGFsc29cbiAqIGRpcmVjdCB0aGlzIG1ldGhvZCB0byB2ZXJpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgd2VidmlldyBwcm9jZXNzIGFjdHVhbGx5XG4gKiBoYXMgYW55IHBhZ2VzIChpZiBhIHByb2Nlc3MgZXhpc3RzIGJ1dCBubyBwYWdlcyBhcmUgZm91bmQsIENocm9tZWRyaXZlciB3aWxsXG4gKiBub3QgYWN0dWFsbHkgYmUgYWJsZSB0byBjb25uZWN0IHRvIGl0LCBzbyB0aGlzIHNlcnZlcyBhcyBhIGd1YXJkIGZvciB0aGF0XG4gKiBzdHJhbmdlIGZhaWx1cmUgbW9kZSkuIFRoZSBzdHJhdGVneSBmb3IgY2hlY2tpbmcgd2hldGhlciBhbnkgcGFnZXMgYXJlXG4gKiBhY3RpdmUgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkZWJ1ZyBzZXJ2ZXIgb24gdGhlIGRldmljZSxcbiAqIGhlbmNlIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lIHdoaWNoXG4gKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmhlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2ViVmlld3NNYXBwaW5nIChhZGIsIHtcbiAgYW5kcm9pZERldmljZVNvY2tldCA9IG51bGwsXG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IHRydWVcbn0gPSB7fSkge1xuICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cycpO1xuICBjb25zdCB3ZWJ2aWV3c01hcHBpbmcgPSBhd2FpdCB3ZWJ2aWV3c0Zyb21Qcm9jcyhhZGIsIGFuZHJvaWREZXZpY2VTb2NrZXQpO1xuXG4gIGF3YWl0IGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24sXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB3ZWJ2aWV3TWFwcGluZyBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBjb25zdCB7d2VidmlldywgaW5mb30gPSB3ZWJ2aWV3TWFwcGluZztcbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IG51bGw7XG5cbiAgICBsZXQgd3ZOYW1lID0gd2VidmlldztcbiAgICBsZXQgcHJvY2VzcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFuZHJvaWREZXZpY2VTb2NrZXQpIHtcbiAgICAgIGNvbnN0IHBrZ01hdGNoID0gV0VCVklFV19QS0dfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViIHZpZXcgbmFtZSBjb3VsZCBlaXRoZXIgYmUgc3VmZml4ZWQgd2l0aCBQSUQgb3IgdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAvLyBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgICAgICAgY29uc3QgcGtnID0gcGtnTWF0Y2ggPyBwa2dNYXRjaFsxXSA6IGF3YWl0IGhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3KGFkYiwgd2Vidmlldyk7XG4gICAgICAgIHd2TmFtZSA9IGAke1dFQlZJRVdfQkFTRX0ke3BrZ31gO1xuICAgICAgICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgICAgcHJvY2VzcyA9IHtcbiAgICAgICAgICBuYW1lOiBwa2csXG4gICAgICAgICAgaWQ6IHBpZE1hdGNoID8gcGlkTWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IHd2TmFtZTtcbiAgICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHd2TmFtZSk7XG4gICAgaWYgKGluZm8gfHwgcHJvY2Vzcykge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5zZXQoa2V5LCB7IGluZm8sIHByb2Nlc3MgfSk7XG4gICAgfSBlbHNlIGlmIChXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmhhcyhrZXkpKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3NNYXBwaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9jZXNzSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIHByb2Nlc3MgbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBUaGUgcHJvY2VzcyBpZCAoaWYgY291bGQgYmUgcmV0cmlldmVkKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2ViVmlld0RldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P1Byb2Nlc3NJbmZvfSBwcm9jZXNzIC0gV2ViIHZpZXcgcHJvY2VzcyBkZXRhaWxzXG4gKiBAcHJvcGVydHkge09iamVjdH0gaW5mbyAtIFdlYiB2aWV3IGRldGFpbHMgYXMgcmV0dXJuZWQgYnkgL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnQsIGZvciBleGFtcGxlOlxuICoge1xuICogIFwiQnJvd3NlclwiOiBcIkNocm9tZS83Mi4wLjM2MDEuMFwiLFxuICogIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzEzXzYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83Mi4wLjM2MDEuMCBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgXCJWOC1WZXJzaW9uXCI6IFwiNy4yLjIzM1wiLFxuICogIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEBjZmVkZTlkYjFkMTU0ZGUwNDY4Y2IwNTM4NDc5ZjM0YzA3NTVhMGY0KVwiLFxuICogIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovL2xvY2FsaG9zdDo5MjIyL2RldnRvb2xzL2Jyb3dzZXIvYjBiOGE0ZmItYmIxNy00MzU5LTk1MzMtYThkOWYzOTA4YmQ4XCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB3ZWIgdmlldyBkZXRhaWxzIHByZXZpb3VzbHkgY2FjaGVkIGJ5IGBnZXRXZWJ2aWV3c2AgY2FsbFxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyBUaGUgbmFtZSBvZiB0aGUgd2ViIHZpZXdcbiAqIEByZXR1cm5zIHs/V2ViVmlld0RldGFpbHN9IEVpdGhlciBgdW5kZWZpbmVkYCBvciB0aGUgcmVjZW50IHdlYiB2aWV3IGRldGFpbHNcbiAqL1xuaGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyA9IGZ1bmN0aW9uIGdldFdlYnZpZXdEZXRhaWxzIChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3ZWJ2aWV3KTtcbiAgcmV0dXJuIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZ2V0KGtleSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBDaHJvbWUgZHJpdmVyIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIEFwcGl1bSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBVc2VyLXByb3ZpZGVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgQW5kcm9pZCBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHBhcmFtIHs/V2ViVmlld0RldGFpbHN9IHdlYlZpZXdEZXRhaWxzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgY2FwYWJpbGl0aWVzIG9iamVjdC5cbiAqIFNlZSBodHRwczovL2Nocm9tZWRyaXZlci5jaHJvbWl1bS5vcmcvY2FwYWJpbGl0aWVzIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmhlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyA9IGZ1bmN0aW9uIGNyZWF0ZUNocm9tZWRyaXZlckNhcHMgKG9wdHMsIGRldmljZUlkLCB3ZWJWaWV3RGV0YWlscykge1xuICBjb25zdCBjYXBzID0geyBjaHJvbWVPcHRpb25zOiB7fSB9O1xuXG4gIGNvbnN0IGFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVPcHRpb25zPy5hbmRyb2lkUGFja2FnZVxuICAgIHx8IG9wdHMuYXBwUGFja2FnZVxuICAgIHx8IHdlYlZpZXdEZXRhaWxzPy5pbmZvPy5bJ0FuZHJvaWQtUGFja2FnZSddO1xuICBpZiAoYW5kcm9pZFBhY2thZ2UpIHtcbiAgICAvLyBjaHJvbWVkcml2ZXIgcmFpc2VzIGFuIGludmFsaWQgYXJndW1lbnQgZXJyb3Igd2hlbiBhbmRyb2lkUGFja2FnZSBpcyAnbnVsbCdcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwKSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkVXNlUnVubmluZ0FwcCA9IG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcDtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5KSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gb3B0cy5jaHJvbWVBbmRyb2lkUHJvY2VzcztcbiAgfSBlbHNlIGlmICh3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8ubmFtZSAmJiB3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8uaWQpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSB3ZWJWaWV3RGV0YWlscy5wcm9jZXNzLm5hbWU7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihvcHRzLmJyb3dzZXJOYW1lKSA9PT0gJ2Nocm9taXVtLXdlYnZpZXcnKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMucGFnZUxvYWRTdHJhdGVneSkge1xuICAgIGNhcHMucGFnZUxvYWRTdHJhdGVneSA9IG9wdHMucGFnZUxvYWRTdHJhdGVneTtcbiAgfVxuICBjb25zdCBpc0Nocm9tZSA9IF8udG9Mb3dlcihjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpID09PSAnY2hyb21lJztcbiAgaWYgKF8uaW5jbHVkZXMoS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMsIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgfHwgaXNDaHJvbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4dHJhY3RlZCBwYWNrYWdlIGZyb20gY29udGV4dCBuYW1lLCBpdCBjb3VsZCBjb21lIGluIGFzIGJhcmVcbiAgICAvLyBcImNocm9tZVwiLCBhbmQgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgZGV0YWlscyBhcmUgY29ycmVjdCwgaW5jbHVkaW5nXG4gICAgLy8gbm90IHVzaW5nIGFuIGFjdGl2aXR5IG9yIHByb2Nlc3MgaWRcbiAgICBpZiAoaXNDaHJvbWUpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IENIUk9NRV9QQUNLQUdFX05BTUU7XG4gICAgfVxuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5O1xuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3M7XG4gIH1cbiAgLy8gYWRkIGRldmljZSBpZCBmcm9tIGFkYlxuICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZERldmljZVNlcmlhbCA9IGRldmljZUlkO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0cy5sb2dnaW5nUHJlZnMpIHx8IF8uaXNQbGFpbk9iamVjdChvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcykpIHtcbiAgICBpZiAob3B0cy5sb2dnaW5nUHJlZnMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgJ2xvZ2dpbmdQcmVmcycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgJ2Nocm9tZUxvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWRgKTtcbiAgICB9XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcyB8fCBvcHRzLmxvZ2dpbmdQcmVmcztcbiAgfVxuICBpZiAob3B0cy5lbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcpIHtcbiAgICBsb2dnZXIud2FybihgVGhlICdlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcnIGNhcCBpcyBkZXByZWNhdGVkOyBzaW1wbHkgdXNlIGAgK1xuICAgICAgYHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZCwgd2l0aCBhICdwZXJmb3JtYW5jZScga2V5IHNldCB0byAnQUxMJ2ApO1xuICAgIGNvbnN0IG5ld1ByZWYgPSB7cGVyZm9ybWFuY2U6ICdBTEwnfTtcbiAgICAvLyBkb24ndCBvdmVyd3JpdGUgb3RoZXIgbG9nZ2luZyBwcmVmcyB0aGF0IGhhdmUgYmVlbiBzZW50IGluIGlmIHRoZXkgZXhpc3RcbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IGNhcHMubG9nZ2luZ1ByZWZzXG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGNhcHMubG9nZ2luZ1ByZWZzLCBuZXdQcmVmKVxuICAgICAgOiBuZXdQcmVmO1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lT3B0aW9ucz8uQXJndW1lbnRzKSB7XG4gICAgLy8gbWVyZ2UgYEFyZ3VtZW50c2AgYW5kIGBhcmdzYFxuICAgIG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzID0gWy4uLihvcHRzLmNocm9tZU9wdGlvbnMuYXJncyB8fCBbXSksIC4uLm9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHNdO1xuICAgIGRlbGV0ZSBvcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQcmVjYWxjdWxhdGVkIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXM6ICcgK1xuICAgIEpTT04uc3RyaW5naWZ5KGNhcHMuY2hyb21lT3B0aW9ucywgbnVsbCwgMikpO1xuXG4gIGNvbnN0IHByb3RlY3RlZENhcE5hbWVzID0gW107XG4gIGZvciAoY29uc3QgW29wdCwgdmFsXSBvZiBfLnRvUGFpcnMob3B0cy5jaHJvbWVPcHRpb25zKSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdKSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3RlY3RlZENhcE5hbWVzLnB1c2gob3B0KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkocHJvdGVjdGVkQ2FwTmFtZXMpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1RoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiAnICtcbiAgICAgICdieSB0aGUgcHJvdmlkZWQgY2hyb21lT3B0aW9uczonKTtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgcHJvdGVjdGVkQ2FwTmFtZXMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAgICR7b3B0TmFtZX0gKCR7SlNPTi5zdHJpbmdpZnkob3B0cy5jaHJvbWVPcHRpb25zW29wdE5hbWVdKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuZXhwb3J0IHsgaGVscGVycywgTkFUSVZFX1dJTiwgV0VCVklFV19XSU4sIFdFQlZJRVdfQkFT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
|
|
352
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2F4aW9zIiwiX3N1cHBvcnQiLCJfcG9ydHNjYW5uZXIiLCJfbHJ1Q2FjaGUiLCJfYmx1ZWJpcmQiLCJfcGF0aCIsIl9vcyIsIk5BVElWRV9XSU4iLCJleHBvcnRzIiwiV0VCVklFV19XSU4iLCJDSFJPTUlVTV9XSU4iLCJXRUJWSUVXX0JBU0UiLCJXRUJWSUVXX1BJRF9QQVRURVJOIiwiUmVnRXhwIiwiV0VCVklFV19QS0dfUEFUVEVSTiIsIkRFVlRPT0xTX1NPQ0tFVF9QQVRURVJOIiwiQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOIiwiQ0hST01JVU1fREVWVE9PTFNfU09DS0VUIiwiQ0hST01FX1BBQ0tBR0VfTkFNRSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiREVWVE9PTFNfUE9SVFNfUkFOR0UiLCJXRUJWSUVXU19ERVRBSUxTX0NBQ0hFIiwiTFJVIiwibWF4IiwidXBkYXRlQWdlT25HZXQiLCJDRFBfUkVRX1RJTUVPVVQiLCJERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQiLCJ1dGlsIiwiZ2V0TG9ja0ZpbGVHdWFyZCIsInBhdGgiLCJyZXNvbHZlIiwib3MiLCJ0bXBkaXIiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJoZWxwZXJzIiwidG9EZXRhaWxzQ2FjaGVLZXkiLCJhZGIiLCJ3ZWJ2aWV3IiwiY3VyRGV2aWNlSWQiLCJnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MiLCJvdXQiLCJzaGVsbCIsIm5hbWVzIiwiYWxsTWF0Y2hlcyIsImxpbmUiLCJzcGxpdCIsImZsYWdzIiwic3QiLCJzb2NrUGF0aCIsInRyaW0iLCJzdGFydHNXaXRoIiwicHVzaCIsInRlc3QiLCJfIiwiaXNFbXB0eSIsImxvZ2dlciIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsInBsdXJhbGl6ZSIsInVuaXEiLCJ3ZWJ2aWV3c0Zyb21Qcm9jcyIsImRldmljZVNvY2tldCIsInNvY2tldE5hbWVzIiwid2Vidmlld3MiLCJzb2NrZXROYW1lIiwicHJvYyIsInNvY2tldE5hbWVNYXRjaCIsImV4ZWMiLCJjcm9zc3dhbGtNYXRjaCIsImFsbG9jYXRlRGV2dG9vbHNQb3J0Iiwid2Vidmlld0RldnRvb2xzUG9ydCIsInJlbW90ZVBvcnQiLCJyZXBsYWNlIiwic3RhcnRQb3J0IiwiZW5kUG9ydCIsImxvY2FsUG9ydCIsImZpbmRBUG9ydE5vdEluVXNlIiwiZSIsIkVycm9yIiwiYWRiRXhlYyIsImNvbGxlY3RXZWJ2aWV3c0RldGFpbHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJvcHRzIiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJpbmZvIiwiZGV0YWlsQ29sbGVjdG9ycyIsIml0ZW0iLCJjZHBJbmZvIiwicGFnZXMiLCJjZHBMaXN0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJCIiwiYWxsIiwiYXhpb3MiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWxldGUiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiX29wdHMkY2hyb21lT3B0aW9ucyIsIl93ZWJWaWV3RGV0YWlscyRpbmZvIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlIiwiX3dlYlZpZXdEZXRhaWxzJHByb2NlMiIsIl9vcHRzJGNocm9tZU9wdGlvbnMyIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYnZpZXctaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgQ0hST01JVU1fV0lOID0gJ0NIUk9NSVVNJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuY29uc3QgV0VCVklFV19QSURfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oXFxcXGQrKWApO1xuY29uc3QgV0VCVklFV19QS0dfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke1dFQlZJRVdfQkFTRX0oW15cXFxcZFxcXFxzXVtcXFxcdy5dKilgKTtcbmNvbnN0IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOID0gL0BbXFx3Ll0rX2RldnRvb2xzX3JlbW90ZV8/KFxcZCspP1xcYi87XG5jb25zdCBDUk9TU1dBTEtfU09DS0VUX1BBVFRFUk4gPSAvQChbXFx3Ll0rKV9kZXZ0b29sc19yZW1vdGVcXGIvO1xuY29uc3QgQ0hST01JVU1fREVWVE9PTFNfU09DS0VUID0gJ2Nocm9tZV9kZXZ0b29sc19yZW1vdGUnO1xuY29uc3QgQ0hST01FX1BBQ0tBR0VfTkFNRSA9ICdjb20uYW5kcm9pZC5jaHJvbWUnO1xuY29uc3QgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMgPSBbXG4gIENIUk9NRV9QQUNLQUdFX05BTUUsXG4gICdjb20uY2hyb21lLmJldGEnLFxuICAnY29tLmNocm9tZS5kZXYnLFxuICAnY29tLmNocm9tZS5jYW5hcnknLFxuXTtcbmNvbnN0IERFVlRPT0xTX1BPUlRTX1JBTkdFID0gWzEwOTAwLCAxMTAwMF07XG5jb25zdCBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogMTAwLFxuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbn0pO1xuY29uc3QgQ0RQX1JFUV9USU1FT1VUID0gMjAwMDsgLy8gbXNcbmNvbnN0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRCA9IHV0aWwuZ2V0TG9ja0ZpbGVHdWFyZChcbiAgcGF0aC5yZXNvbHZlKG9zLnRtcGRpcigpLCAnYW5kcm9pZF9kZXZ0b29sc19wb3J0X2d1YXJkJyksXG4gIHt0aW1lb3V0OiA3LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuZnVuY3Rpb24gdG9EZXRhaWxzQ2FjaGVLZXkgKGFkYiwgd2Vidmlldykge1xuICByZXR1cm4gYCR7YWRiPy5jdXJEZXZpY2VJZH06JHt3ZWJ2aWV3fWA7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgbGlzdCBvZiBhbmRyb2lkIHN5c3RlbSBwcm9jZXNzZXMgYW5kIHJldHVybnMgb25lc1xuICogdGhhdCBsb29rIGxpa2Ugd2Vidmlld3NcbiAqIFNlZSBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIG1hdGNoaW5nIHdlYnZpZXcgc29ja2V0IG5hbWVzIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgJ0AnKVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MgKGFkYikge1xuICBjb25zdCBvdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IG5hbWVzID0gW107XG4gIGNvbnN0IGFsbE1hdGNoZXMgPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBOdW0gUmVmQ291bnQgUHJvdG9jb2wgRmxhZ3MgVHlwZSBTdCBJbm9kZSBQYXRoXG4gICAgY29uc3QgWywsLCBmbGFncywsIHN0LCwgc29ja1BhdGhdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAoIXNvY2tQYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNvY2tQYXRoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgYWxsTWF0Y2hlcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICB9XG4gICAgaWYgKGZsYWdzICE9PSAnMDAwMTAwMDAnIHx8IHN0ICE9PSAnMDEnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFERVZUT09MU19TT0NLRVRfUEFUVEVSTi50ZXN0KHNvY2tQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmFtZXMucHVzaChzb2NrUGF0aCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG5vIGFjdGl2ZSBkZXZ0b29scyBzb2NrZXRzJyk7XG4gICAgaWYgKCFfLmlzRW1wdHkoYWxsTWF0Y2hlcykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgT3RoZXIgc29ja2V0cyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsTWF0Y2hlcywgbnVsbCwgMil9YCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkICR7bmFtZXMubGVuZ3RofSBhY3RpdmUgZGV2dG9vbHMgJHt1dGlsLnBsdXJhbGl6ZSgnc29ja2V0JywgbmFtZXMubGVuZ3RoLCBmYWxzZSl9OiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWVzKSk7XG4gIH1cbiAgLy8gc29tZXRpbWVzIHRoZSB3ZWJ2aWV3IHByb2Nlc3Mgc2hvd3MgdXAgbXVsdGlwbGUgdGltZXMgcGVyIGFwcFxuICByZXR1cm4gXy51bmlxKG5hbWVzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvY1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgLSBUaGUgd2VidmlldyBwcm9jZXNzIG5hbWUgKGFzIHJldHVybmVkIGJ5XG4gKiBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3ZWJ2aWV3IC0gVGhlIGFjdHVhbCB3ZWJ2aWV3IGNvbnRleHQgbmFtZVxuICovXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgbGlzdCBvZiBzeXN0ZW0gcHJvY2Vzc2VzIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzLFxuICogYW5kIHJldHVybnMgdGhlbSBhbG9uZyB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRleHQgbmFtZSBhcHByb3ByaWF0ZSBmb3IgaXQuXG4gKiBJZiB3ZSBwYXNzIGluIGEgZGV2aWNlU29ja2V0LCB3ZSBvbmx5IGF0dGVtcHQgdG8gZmluZCB3ZWJ2aWV3cyB3aGljaCBtYXRjaFxuICogdGhhdCBzb2NrZXQgbmFtZSAodGhpcyBpcyBmb3IgYXBwcyB3aGljaCBlbWJlZCBDaHJvbWl1bSwgd2hpY2ggaXNuJ3QgdGhlXG4gKiBzYW1lIGFzIGNocm9tZS1iYWNrZWQgd2Vidmlld3MpLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7P3N0cmluZ30gZGV2aWNlU29ja2V0IC0gdGhlIGV4cGxpY3RseS1uYW1lZCBkZXZpY2Ugc29ja2V0IHRvIHVzZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxXZWJ2aWV3UHJvYz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdlYnZpZXdzRnJvbVByb2NzIChhZGIsIGRldmljZVNvY2tldCA9IG51bGwpIHtcbiAgY29uc3Qgc29ja2V0TmFtZXMgPSBhd2FpdCBnZXRQb3RlbnRpYWxXZWJ2aWV3UHJvY3MoYWRiKTtcbiAgY29uc3Qgd2Vidmlld3MgPSBbXTtcbiAgZm9yIChjb25zdCBzb2NrZXROYW1lIG9mIHNvY2tldE5hbWVzKSB7XG4gICAgaWYgKGRldmljZVNvY2tldCA9PT0gQ0hST01JVU1fREVWVE9PTFNfU09DS0VUICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IENIUk9NSVVNX1dJTixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0TmFtZU1hdGNoID0gREVWVE9PTFNfU09DS0VUX1BBVFRFUk4uZXhlYyhzb2NrZXROYW1lKTtcbiAgICBpZiAoIXNvY2tldE5hbWVNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNyb3Nzd2Fsa01hdGNoID0gQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2hbMV0gJiYgIWNyb3Nzd2Fsa01hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZGV2aWNlU29ja2V0ICYmIHNvY2tldE5hbWUgPT09IGBAJHtkZXZpY2VTb2NrZXR9YCB8fCAhZGV2aWNlU29ja2V0KSB7XG4gICAgICB3ZWJ2aWV3cy5wdXNoKHtcbiAgICAgICAgcHJvYzogc29ja2V0TmFtZSxcbiAgICAgICAgd2Vidmlldzogc29ja2V0TmFtZU1hdGNoWzFdXG4gICAgICAgICAgPyBgJHtXRUJWSUVXX0JBU0V9JHtzb2NrZXROYW1lTWF0Y2hbMV19YFxuICAgICAgICAgIDogYCR7V0VCVklFV19CQVNFfSR7Y3Jvc3N3YWxrTWF0Y2hbMV19YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3M7XG59XG5cbi8qKlxuICogQWxsb2NhdGVzIGEgbG9jYWwgcG9ydCBmb3IgZGV2dG9vbHMgY29tbXVuaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gc29ja2V0TmFtZSBUaGUgcmVtb3RlIFVuaXggc29ja2V0IG5hbWVcbiAqIEBwYXJhbSB7P251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgbG9jYWwgcG9ydCBudW1iZXIgb3IgbnVsbCB0byBhcHBseVxuICogYXV0b2RldGVjdGlvblxuICogQHJldHVybnMge251bWJlcn0gVGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlmIHRoZSByZW1vdGUgc29ja2V0IGhhcyBiZWVuIGZvcndhcmRlZFxuICogc3VjY2Vzc2Z1bGx5IG9yIGBudWxsYCBvdGhlcndpc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWxsb2NhdGluZyB0aGUgbG9jYWwgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBhbGxvY2F0ZURldnRvb2xzUG9ydCAoYWRiLCBzb2NrZXROYW1lLCB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCkge1xuICAvLyBzb2NrZXQgbmFtZXMgY29tZSB3aXRoICdAJywgYnV0IHRoaXMgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgdGhlIGFic3RyYWN0XG4gIC8vIHJlbW90ZSBwb3J0LCBzbyByZW1vdmUgaXRcbiAgY29uc3QgcmVtb3RlUG9ydCA9IHNvY2tldE5hbWUucmVwbGFjZSgvXkAvLCAnJyk7XG4gIGxldCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IERFVlRPT0xTX1BPUlRTX1JBTkdFO1xuICBpZiAod2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGVuZFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0ICsgKGVuZFBvcnQgLSBzdGFydFBvcnQpO1xuICAgIHN0YXJ0UG9ydCA9IHdlYnZpZXdEZXZ0b29sc1BvcnQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3J3YXJkaW5nIHJlbW90ZSBwb3J0ICR7cmVtb3RlUG9ydH0gdG8gYSBsb2NhbCBgICtcbiAgICBgcG9ydCBpbiByYW5nZSAke3N0YXJ0UG9ydH0uLiR7ZW5kUG9ydH1gKTtcbiAgaWYgKCF3ZWJ2aWV3RGV2dG9vbHNQb3J0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBZb3UgY291bGQgdXNlIHRoZSAnd2Vidmlld0RldnRvb2xzUG9ydCcgY2FwYWJpbGl0eSB0byBjdXN0b21pemUgYCArXG4gICAgICBgdGhlIHN0YXJ0aW5nIHBvcnQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IERFVlRPT0xTX1BPUlRfQUxMT0NBVElPTl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgbGV0IGxvY2FsUG9ydDtcbiAgICB0cnkge1xuICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgdG8gZm9yd2FyZCB0aGUgRGV2dG9vbHMgc29ja2V0IGAgK1xuICAgICAgICBgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBZb3UgY291bGQgc2V0IHRoZSBzdGFydGluZyBwb3J0IG51bWJlciBgICtcbiAgICAgICAgYG1hbnVhbGx5IGJ5IHByb3ZpZGluZyB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHlgKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke2xvY2FsUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke3JlbW90ZVBvcnR9YF0pO1xuICAgIHJldHVybiBsb2NhbFBvcnQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldGFpbENvbGxlY3Rpb25PcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFRoZSBzdGFydGluZyBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjayAoaWYgbm90IHRoZSBkZWZhdWx0IG9mIDkyMjIpLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgV2hldGhlciB0byBjaGVjayBmb3Igd2Vidmlld1xuICogcGFnZXMgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgQ2hyb21lIERlYnVnZ2VyIFByb3RvY29sIGRhdGEgY29sbGVjdGlvbi5cbiAqIE5vIGVycm9yIGlzIHRocm93biBpZiBDRFAgcmVxdWVzdCBmYWlscyAtIGluIHN1Y2ggY2FzZSBubyBkYXRhIHdpbGwgYmVcbiAqIHJlY29yZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYHdlYnZpZXdzTWFwcGluZ2AgaXRlbS5cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIFRoZSBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXk8V2Vidmlld1Byb3BzPn0gd2Vidmlld3NNYXBwaW5nIFRoZSBjdXJyZW50IHdlYnZpZXdzIG1hcHBpbmdcbiAqICEhISBFYWNoIGl0ZW0gb2YgdGhpcyBhcnJheSBnZXRzIG11dGF0ZWQgKGBpbmZvYC9gcGFnZXNgIHByb3BlcnRpZXMgZ2V0IGFkZGVkXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYG9wdHNgKSBpZiB0aGUgcmVxdWVzdGVkIGRldGFpbHMgaGF2ZSBiZWVuXG4gKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGZvciBpdCAhISFcbiAqIEBwYXJhbSB7RGV0YWlsQ29sbGVjdGlvbk9wdGlvbnN9IG9wdHMgSWYgYm90aCBgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXNgIGFuZFxuICogYGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbmAgcHJvcGVydGllcyBhcmUgZmFsc3kgdGhlbiBubyBkZXRhaWxzIGNvbGxlY3Rpb25cbiAqIGlzIHBlcmZvcm1lZFxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0V2Vidmlld3NEZXRhaWxzIChhZGIsIHdlYnZpZXdzTWFwcGluZywgb3B0cyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkod2Vidmlld3NNYXBwaW5nKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB3ZWJ2aWV3RGV2dG9vbHNQb3J0ID0gbnVsbCxcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IG51bGwsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uID0gbnVsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY2hlY2tpbmcgd2hldGhlciB3ZWJ2aWV3cyBoYXZlIGFjdGl2ZSBwYWdlczsgdXNlIHRoZSBgICtcbiAgICAgIGAnZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMnIGNhcCB0byB0dXJuIHRoaXMgY2hlY2sgb25gKTtcbiAgfVxuXG4gIGlmICghZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBjb2xsZWN0aW5nIHdlYiB2aWV3IGRldGFpbHMuIERldGFpbHMgY29sbGVjdGlvbiBtaWdodCBoZWxwIGAgK1xuICAgICAgYHRvIG1ha2UgQ2hyb21lZHJpdmVyIGluaXRpYWxpemF0aW9uIG1vcmUgcHJlY2lzZS4gVXNlIHRoZSAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJyBgICtcbiAgICAgIGBjYXAgdG8gdHVybiBpdCBvbmApO1xuICB9XG5cbiAgaWYgKCFlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyAmJiAhZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ29ubmVjdCB0byBlYWNoIGRldnRvb2xzIHNvY2tldCBhbmQgcmV0cmlldmUgd2ViIHZpZXcgZGV0YWlsc1xuICBsb2dnZXIuZGVidWcoYENvbGxlY3RpbmcgQ0RQIGRhdGEgb2YgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHdlYnZpZXdzTWFwcGluZy5sZW5ndGgsIHRydWUpfWApO1xuICBjb25zdCBkZXRhaWxDb2xsZWN0b3JzID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBkZXRhaWxDb2xsZWN0b3JzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFBvcnQgPSBhd2FpdCBhbGxvY2F0ZURldnRvb2xzUG9ydChhZGIsIGl0ZW0ucHJvYywgd2Vidmlld0RldnRvb2xzUG9ydCk7XG4gICAgICAgIGlmIChlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICBpdGVtLmluZm8gPSBhd2FpdCBjZHBJbmZvKGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzKSB7XG4gICAgICAgICAgaXRlbS5wYWdlcyA9IGF3YWl0IGNkcExpc3QobG9jYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobG9jYWxQb3J0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFkYi5yZW1vdmVQb3J0Rm9yd2FyZChsb2NhbFBvcnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChkZXRhaWxDb2xsZWN0b3JzKTtcbiAgbG9nZ2VyLmRlYnVnKGBDRFAgZGF0YSBjb2xsZWN0aW9uIGNvbXBsZXRlZGApO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcExpc3QgKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL2xpc3RgLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8vIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL1xuYXN5bmMgZnVuY3Rpb24gY2RwSW5mbyAobG9jYWxQb3J0KSB7XG4gIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgIHVybDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtsb2NhbFBvcnR9L2pzb24vdmVyc2lvbmAsXG4gICAgdGltZW91dDogQ0RQX1JFUV9USU1FT1VULFxuICB9KSkuZGF0YTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgd2VidmlldyBuYW1lIGxpa2UgV0VCVklFV180Mjk2IGFuZCB1c2UgJ2FkYiBzaGVsbCBwcycgdG8gZmlndXJlIG91dFxuICogd2hpY2ggYXBwIHBhY2thZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgd2Vidmlldy4gT25lIG9mIHRoZSByZWFzb25zIHdlXG4gKiB3YW50IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlJ3JlIGxpc3Rpbmcgd2Vidmlld3MgZm9yIHRoZSBhY3R1YWwgQVVULFxuICogbm90IHNvbWUgb3RoZXIgcnVubmluZyBhcHBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyAtIGEgd2VidmlldyBwcm9jZXNzIG5hbWVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcCBydW5uaW5nIHRoZSB3ZWJ2aWV3XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIG5hbWVcbiAqL1xuaGVscGVycy5wcm9jRnJvbVdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBwcm9jRnJvbVdlYnZpZXcgKGFkYiwgd2Vidmlldykge1xuICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgaWYgKCFwaWRNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgUElEIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICB9XG5cbiAgY29uc3QgcGlkID0gcGlkTWF0Y2hbMV07XG4gIGxvZ2dlci5kZWJ1ZyhgJHt3ZWJ2aWV3fSBtYXBwZWQgdG8gcGlkICR7cGlkfWApO1xuICBsb2dnZXIuZGVidWcoYEdldHRpbmcgcHJvY2VzcyBuYW1lIGZvciB3ZWJ2aWV3ICcke3dlYnZpZXd9J2ApO1xuICBjb25zdCBwa2cgPSBhd2FpdCBhZGIuZ2V0TmFtZUJ5UGlkKHBpZCk7XG4gIGxvZ2dlci5kZWJ1ZyhgR290IHByb2Nlc3MgbmFtZTogJyR7cGtnfSdgKTtcbiAgcmV0dXJuIHBrZztcbn07XG5cbi8qKlxuICogUGFyc2Ugd2VidmlldyBuYW1lcyBmb3IgZ2V0Q29udGV4dHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzIFNlZSBub3RlIG9uIGdldFdlYlZpZXdzTWFwcGluZ1xuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IC0gYSBsaXN0IG9mIHdlYnZpZXcgbmFtZXNcbiAqL1xuaGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyA9IGZ1bmN0aW9uIHBhcnNlV2Vidmlld05hbWVzICh3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW0NIUk9NSVVNX1dJTl07XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCB7d2VidmlldywgcGFnZXMsIHByb2MsIHdlYnZpZXdOYW1lfSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBpZiAoZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgcGFnZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwaW5nIHRoZSB3ZWJ2aWV3ICcke3dlYnZpZXd9JyBhdCAnJHtwcm9jfScgYCArXG4gICAgICAgIGBzaW5jZSBpdCBoYXMgcmVwb3J0ZWQgaGF2aW5nIHplcm8gcGFnZXNgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAod2Vidmlld05hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHdlYnZpZXdOYW1lKTtcbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBGb3VuZCAke3V0aWwucGx1cmFsaXplKCd3ZWJ2aWV3JywgcmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFdlYnZpZXdzT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFuZHJvaWREZXZpY2VTb2NrZXQgW251bGxdIC0gZGV2aWNlIHNvY2tldCBuYW1lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFt0cnVlXSAtIHdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2UgcHJlc2VuY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3ZWJ2aWV3RGV2dG9vbHNQb3J0IFs5MjIyXSAtIHBvcnQgdG8gdXNlIGZvciB3ZWJ2aWV3IHBhZ2VcbiAqIHByZXNlbmNlIGNoZWNrLlxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gW3RydWVdIC0gd2hldGhlciB0byBjb2xsZWN0XG4gKiB3ZWIgdmlldyBkZXRhaWxzIGFuZCBzZW5kIHRoZW0gdG8gQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yLCBzbyBpdCBjb3VsZFxuICogc2VsZWN0IGEgYmluYXJ5IG1vcmUgcHJlY2lzZWx5IGJhc2VkIG9uIHRoaXMgaW5mby5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3Blcnkgez9zdHJpbmd9IHdlYnZpZXdOYW1lIEFuIGFjdHVhbCB3ZWJ2aWV3IG5hbWUgZm9yIHN3aXRjaGluZyBjb250ZXh0XG4gKi9cblxuLyoqXG4gKiBHZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cyBtYXBwaW5nIGJ5IGludHJvc3BlY3RpbmcgcHJvY2Vzc2VzIHdpdGggYWRiLFxuICogd2hlcmUgd2Vidmlld3MgYXJlIGxpc3RlZC4gSXQncyBwb3NzaWJsZSB0byBwYXNzIGluIGEgJ2RldmljZVNvY2tldCcgYXJnLCB3aGljaFxuICogbGltaXRzIHRoZSB3ZWJ2aWV3IHBvc3NpYmlsaXRpZXMgdG8gdGhlIG9uZSBydW5uaW5nIG9uIHRoZSBDaHJvbWl1bSBkZXZ0b29sc1xuICogc29ja2V0IHdlJ3JlIGludGVyZXN0ZWQgaW4gKHNlZSBub3RlIG9uIHdlYnZpZXdzRnJvbVByb2NzKS4gV2UgY2FuIGFsc29cbiAqIGRpcmVjdCB0aGlzIG1ldGhvZCB0byB2ZXJpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgd2VidmlldyBwcm9jZXNzIGFjdHVhbGx5XG4gKiBoYXMgYW55IHBhZ2VzIChpZiBhIHByb2Nlc3MgZXhpc3RzIGJ1dCBubyBwYWdlcyBhcmUgZm91bmQsIENocm9tZWRyaXZlciB3aWxsXG4gKiBub3QgYWN0dWFsbHkgYmUgYWJsZSB0byBjb25uZWN0IHRvIGl0LCBzbyB0aGlzIHNlcnZlcyBhcyBhIGd1YXJkIGZvciB0aGF0XG4gKiBzdHJhbmdlIGZhaWx1cmUgbW9kZSkuIFRoZSBzdHJhdGVneSBmb3IgY2hlY2tpbmcgd2hldGhlciBhbnkgcGFnZXMgYXJlXG4gKiBhY3RpdmUgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkZWJ1ZyBzZXJ2ZXIgb24gdGhlIGRldmljZSxcbiAqIGhlbmNlIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lIHdoaWNoXG4gKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhZGIgLSBhbiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7R2V0V2Vidmlld3NPcHRzfSBvcHRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmhlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2ViVmlld3NNYXBwaW5nIChhZGIsIHtcbiAgYW5kcm9pZERldmljZVNvY2tldCA9IG51bGwsXG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IHRydWVcbn0gPSB7fSkge1xuICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cycpO1xuICBjb25zdCB3ZWJ2aWV3c01hcHBpbmcgPSBhd2FpdCB3ZWJ2aWV3c0Zyb21Qcm9jcyhhZGIsIGFuZHJvaWREZXZpY2VTb2NrZXQpO1xuXG4gIGF3YWl0IGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24sXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB3ZWJ2aWV3TWFwcGluZyBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBjb25zdCB7d2VidmlldywgaW5mb30gPSB3ZWJ2aWV3TWFwcGluZztcbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IG51bGw7XG5cbiAgICBsZXQgd3ZOYW1lID0gd2VidmlldztcbiAgICBsZXQgcHJvY2VzcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFuZHJvaWREZXZpY2VTb2NrZXQpIHtcbiAgICAgIGNvbnN0IHBrZ01hdGNoID0gV0VCVklFV19QS0dfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViIHZpZXcgbmFtZSBjb3VsZCBlaXRoZXIgYmUgc3VmZml4ZWQgd2l0aCBQSUQgb3IgdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAvLyBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgICAgICAgY29uc3QgcGtnID0gcGtnTWF0Y2ggPyBwa2dNYXRjaFsxXSA6IGF3YWl0IGhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3KGFkYiwgd2Vidmlldyk7XG4gICAgICAgIHd2TmFtZSA9IGAke1dFQlZJRVdfQkFTRX0ke3BrZ31gO1xuICAgICAgICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgICAgcHJvY2VzcyA9IHtcbiAgICAgICAgICBuYW1lOiBwa2csXG4gICAgICAgICAgaWQ6IHBpZE1hdGNoID8gcGlkTWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IHd2TmFtZTtcbiAgICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHd2TmFtZSk7XG4gICAgaWYgKGluZm8gfHwgcHJvY2Vzcykge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5zZXQoa2V5LCB7IGluZm8sIHByb2Nlc3MgfSk7XG4gICAgfSBlbHNlIGlmIChXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmhhcyhrZXkpKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3NNYXBwaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9jZXNzSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIHByb2Nlc3MgbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBUaGUgcHJvY2VzcyBpZCAoaWYgY291bGQgYmUgcmV0cmlldmVkKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2ViVmlld0RldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P1Byb2Nlc3NJbmZvfSBwcm9jZXNzIC0gV2ViIHZpZXcgcHJvY2VzcyBkZXRhaWxzXG4gKiBAcHJvcGVydHkge09iamVjdH0gaW5mbyAtIFdlYiB2aWV3IGRldGFpbHMgYXMgcmV0dXJuZWQgYnkgL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnQsIGZvciBleGFtcGxlOlxuICoge1xuICogIFwiQnJvd3NlclwiOiBcIkNocm9tZS83Mi4wLjM2MDEuMFwiLFxuICogIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzEzXzYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83Mi4wLjM2MDEuMCBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgXCJWOC1WZXJzaW9uXCI6IFwiNy4yLjIzM1wiLFxuICogIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEBjZmVkZTlkYjFkMTU0ZGUwNDY4Y2IwNTM4NDc5ZjM0YzA3NTVhMGY0KVwiLFxuICogIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovL2xvY2FsaG9zdDo5MjIyL2RldnRvb2xzL2Jyb3dzZXIvYjBiOGE0ZmItYmIxNy00MzU5LTk1MzMtYThkOWYzOTA4YmQ4XCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB3ZWIgdmlldyBkZXRhaWxzIHByZXZpb3VzbHkgY2FjaGVkIGJ5IGBnZXRXZWJ2aWV3c2AgY2FsbFxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyBUaGUgbmFtZSBvZiB0aGUgd2ViIHZpZXdcbiAqIEByZXR1cm5zIHs/V2ViVmlld0RldGFpbHN9IEVpdGhlciBgdW5kZWZpbmVkYCBvciB0aGUgcmVjZW50IHdlYiB2aWV3IGRldGFpbHNcbiAqL1xuaGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyA9IGZ1bmN0aW9uIGdldFdlYnZpZXdEZXRhaWxzIChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3ZWJ2aWV3KTtcbiAgcmV0dXJuIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZ2V0KGtleSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBDaHJvbWUgZHJpdmVyIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIEFwcGl1bSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBVc2VyLXByb3ZpZGVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgQW5kcm9pZCBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHBhcmFtIHs/V2ViVmlld0RldGFpbHN9IHdlYlZpZXdEZXRhaWxzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgY2FwYWJpbGl0aWVzIG9iamVjdC5cbiAqIFNlZSBodHRwczovL2Nocm9tZWRyaXZlci5jaHJvbWl1bS5vcmcvY2FwYWJpbGl0aWVzIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmhlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyA9IGZ1bmN0aW9uIGNyZWF0ZUNocm9tZWRyaXZlckNhcHMgKG9wdHMsIGRldmljZUlkLCB3ZWJWaWV3RGV0YWlscykge1xuICBjb25zdCBjYXBzID0geyBjaHJvbWVPcHRpb25zOiB7fSB9O1xuXG4gIGNvbnN0IGFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVPcHRpb25zPy5hbmRyb2lkUGFja2FnZVxuICAgIHx8IG9wdHMuYXBwUGFja2FnZVxuICAgIHx8IHdlYlZpZXdEZXRhaWxzPy5pbmZvPy5bJ0FuZHJvaWQtUGFja2FnZSddO1xuICBpZiAoYW5kcm9pZFBhY2thZ2UpIHtcbiAgICAvLyBjaHJvbWVkcml2ZXIgcmFpc2VzIGFuIGludmFsaWQgYXJndW1lbnQgZXJyb3Igd2hlbiBhbmRyb2lkUGFja2FnZSBpcyAnbnVsbCdcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwKSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkVXNlUnVubmluZ0FwcCA9IG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcDtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5KSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gb3B0cy5jaHJvbWVBbmRyb2lkUHJvY2VzcztcbiAgfSBlbHNlIGlmICh3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8ubmFtZSAmJiB3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8uaWQpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSB3ZWJWaWV3RGV0YWlscy5wcm9jZXNzLm5hbWU7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihvcHRzLmJyb3dzZXJOYW1lKSA9PT0gJ2Nocm9taXVtLXdlYnZpZXcnKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMucGFnZUxvYWRTdHJhdGVneSkge1xuICAgIGNhcHMucGFnZUxvYWRTdHJhdGVneSA9IG9wdHMucGFnZUxvYWRTdHJhdGVneTtcbiAgfVxuICBjb25zdCBpc0Nocm9tZSA9IF8udG9Mb3dlcihjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpID09PSAnY2hyb21lJztcbiAgaWYgKF8uaW5jbHVkZXMoS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMsIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgfHwgaXNDaHJvbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4dHJhY3RlZCBwYWNrYWdlIGZyb20gY29udGV4dCBuYW1lLCBpdCBjb3VsZCBjb21lIGluIGFzIGJhcmVcbiAgICAvLyBcImNocm9tZVwiLCBhbmQgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgZGV0YWlscyBhcmUgY29ycmVjdCwgaW5jbHVkaW5nXG4gICAgLy8gbm90IHVzaW5nIGFuIGFjdGl2aXR5IG9yIHByb2Nlc3MgaWRcbiAgICBpZiAoaXNDaHJvbWUpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IENIUk9NRV9QQUNLQUdFX05BTUU7XG4gICAgfVxuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5O1xuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3M7XG4gIH1cbiAgLy8gYWRkIGRldmljZSBpZCBmcm9tIGFkYlxuICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZERldmljZVNlcmlhbCA9IGRldmljZUlkO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0cy5sb2dnaW5nUHJlZnMpIHx8IF8uaXNQbGFpbk9iamVjdChvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcykpIHtcbiAgICBpZiAob3B0cy5sb2dnaW5nUHJlZnMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgJ2xvZ2dpbmdQcmVmcycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgJ2Nocm9tZUxvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWRgKTtcbiAgICB9XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcyB8fCBvcHRzLmxvZ2dpbmdQcmVmcztcbiAgfVxuICBpZiAob3B0cy5lbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcpIHtcbiAgICBsb2dnZXIud2FybihgVGhlICdlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcnIGNhcCBpcyBkZXByZWNhdGVkOyBzaW1wbHkgdXNlIGAgK1xuICAgICAgYHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZCwgd2l0aCBhICdwZXJmb3JtYW5jZScga2V5IHNldCB0byAnQUxMJ2ApO1xuICAgIGNvbnN0IG5ld1ByZWYgPSB7cGVyZm9ybWFuY2U6ICdBTEwnfTtcbiAgICAvLyBkb24ndCBvdmVyd3JpdGUgb3RoZXIgbG9nZ2luZyBwcmVmcyB0aGF0IGhhdmUgYmVlbiBzZW50IGluIGlmIHRoZXkgZXhpc3RcbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IGNhcHMubG9nZ2luZ1ByZWZzXG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGNhcHMubG9nZ2luZ1ByZWZzLCBuZXdQcmVmKVxuICAgICAgOiBuZXdQcmVmO1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lT3B0aW9ucz8uQXJndW1lbnRzKSB7XG4gICAgLy8gbWVyZ2UgYEFyZ3VtZW50c2AgYW5kIGBhcmdzYFxuICAgIG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzID0gWy4uLihvcHRzLmNocm9tZU9wdGlvbnMuYXJncyB8fCBbXSksIC4uLm9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHNdO1xuICAgIGRlbGV0ZSBvcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQcmVjYWxjdWxhdGVkIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXM6ICcgK1xuICAgIEpTT04uc3RyaW5naWZ5KGNhcHMuY2hyb21lT3B0aW9ucywgbnVsbCwgMikpO1xuXG4gIGNvbnN0IHByb3RlY3RlZENhcE5hbWVzID0gW107XG4gIGZvciAoY29uc3QgW29wdCwgdmFsXSBvZiBfLnRvUGFpcnMob3B0cy5jaHJvbWVPcHRpb25zKSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdKSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3RlY3RlZENhcE5hbWVzLnB1c2gob3B0KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkocHJvdGVjdGVkQ2FwTmFtZXMpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1RoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiAnICtcbiAgICAgICdieSB0aGUgcHJvdmlkZWQgY2hyb21lT3B0aW9uczonKTtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgcHJvdGVjdGVkQ2FwTmFtZXMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAgICR7b3B0TmFtZX0gKCR7SlNPTi5zdHJpbmdpZnkob3B0cy5jaHJvbWVPcHRpb25zW29wdE5hbWVdKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuZXhwb3J0IHsgaGVscGVycywgTkFUSVZFX1dJTiwgV0VCVklFV19XSU4sIFdFQlZJRVdfQkFTRSwgQ0hST01JVU1fV0lOLCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFNBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLEtBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLEdBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLE1BQU1TLFVBQVUsR0FBRyxZQUFZO0FBQUNDLE9BQUEsQ0FBQUQsVUFBQSxHQUFBQSxVQUFBO0FBQ2hDLE1BQU1FLFdBQVcsR0FBRyxTQUFTO0FBQUNELE9BQUEsQ0FBQUMsV0FBQSxHQUFBQSxXQUFBO0FBQzlCLE1BQU1DLFlBQVksR0FBRyxVQUFVO0FBQUNGLE9BQUEsQ0FBQUUsWUFBQSxHQUFBQSxZQUFBO0FBQ2hDLE1BQU1DLFlBQVksR0FBSSxHQUFFRixXQUFZLEdBQUU7QUFBQ0QsT0FBQSxDQUFBRyxZQUFBLEdBQUFBLFlBQUE7QUFDdkMsTUFBTUMsbUJBQW1CLEdBQUcsSUFBSUMsTUFBTSxDQUFFLElBQUdGLFlBQWEsUUFBTyxDQUFDO0FBQ2hFLE1BQU1HLG1CQUFtQixHQUFHLElBQUlELE1BQU0sQ0FBRSxJQUFHRixZQUFhLG9CQUFtQixDQUFDO0FBQzVFLE1BQU1JLHVCQUF1QixHQUFHLG1DQUFtQztBQUNuRSxNQUFN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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webview-helpers.js","names":["_lodash","_interopRequireDefault","require","_logger","_axios","_support","_portscanner","_lruCache","_bluebird","_path","_os","NATIVE_WIN","exports","WEBVIEW_WIN","CHROMIUM_WIN","WEBVIEW_BASE","WEBVIEW_PID_PATTERN","RegExp","WEBVIEW_PKG_PATTERN","DEVTOOLS_SOCKET_PATTERN","CROSSWALK_SOCKET_PATTERN","CHROMIUM_DEVTOOLS_SOCKET","CHROME_PACKAGE_NAME","KNOWN_CHROME_PACKAGE_NAMES","DEVTOOLS_PORTS_RANGE","WEBVIEWS_DETAILS_CACHE","LRU","max","updateAgeOnGet","CDP_REQ_TIMEOUT","DEVTOOLS_PORT_ALLOCATION_GUARD","util","getLockFileGuard","path","resolve","os","tmpdir","timeout","tryRecovery","helpers","toDetailsCacheKey","adb","webview","curDeviceId","getPotentialWebviewProcs","out","shell","names","allMatches","line","split","flags","st","sockPath","trim","startsWith","push","test","_","isEmpty","logger","debug","JSON","stringify","length","pluralize","uniq","webviewsFromProcs","deviceSocket","socketNames","webviews","socketName","proc","socketNameMatch","exec","crosswalkMatch","allocateDevtoolsPort","webviewDevtoolsPort","remotePort","replace","startPort","endPort","localPort","findAPortNotInUse","e","Error","adbExec","collectWebviewsDetails","webviewsMapping","opts","ensureWebviewsHavePages","enableWebviewDetailsCollection","info","detailCollectors","item","cdpInfo","pages","cdpList","removePortForward","B","all","axios","url","data","procFromWebview","pidMatch","pid","pkg","getNameByPid","parseWebviewNames","isChromeSession","result","webviewName","getWebViewsMapping","androidDeviceSocket","webviewMapping","wvName","process","undefined","pkgMatch","name","id","warn","message","key","set","has","delete","getWebviewDetails","get","createChromedriverCaps","deviceId","webViewDetails","_opts$chromeOptions","_webViewDetails$info","_webViewDetails$proce","_webViewDetails$proce2","_opts$chromeOptions2","caps","chromeOptions","androidPackage","appPackage","isBoolean","chromeUseRunningApp","androidUseRunningApp","chromeAndroidPackage","chromeAndroidActivity","androidActivity","chromeAndroidProcess","androidProcess","toLower","browserName","appActivity","pageLoadStrategy","isChrome","includes","androidDeviceSerial","isPlainObject","loggingPrefs","chromeLoggingPrefs","enablePerformanceLogging","newPref","performance","Object","assign","Arguments","args","protectedCapNames","opt","val","toPairs","isUndefined","optName","_default","default"],"sources":["../../lib/webview-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport logger from './logger';\nimport axios from 'axios';\nimport { util } from '@appium/support';\nimport { findAPortNotInUse } from 'portscanner';\nimport LRU from 'lru-cache';\nimport B from 'bluebird';\nimport path from 'path';\nimport os from 'os';\n\nconst NATIVE_WIN = 'NATIVE_APP';\nconst WEBVIEW_WIN = 'WEBVIEW';\nconst CHROMIUM_WIN = 'CHROMIUM';\nconst WEBVIEW_BASE = `${WEBVIEW_WIN}_`;\nconst WEBVIEW_PID_PATTERN = new RegExp(`^${WEBVIEW_BASE}(\\\\d+)`);\nconst WEBVIEW_PKG_PATTERN = new RegExp(`^${WEBVIEW_BASE}([^\\\\d\\\\s][\\\\w.]*)`);\nconst DEVTOOLS_SOCKET_PATTERN = /@[\\w.]+_devtools_remote_?(\\d+)?\\b/;\nconst CROSSWALK_SOCKET_PATTERN = /@([\\w.]+)_devtools_remote\\b/;\nconst CHROMIUM_DEVTOOLS_SOCKET = 'chrome_devtools_remote';\nconst CHROME_PACKAGE_NAME = 'com.android.chrome';\nconst KNOWN_CHROME_PACKAGE_NAMES = [\n CHROME_PACKAGE_NAME,\n 'com.chrome.beta',\n 'com.chrome.dev',\n 'com.chrome.canary',\n];\nconst DEVTOOLS_PORTS_RANGE = [10900, 11000];\nconst WEBVIEWS_DETAILS_CACHE = new LRU({\n max: 100,\n updateAgeOnGet: true,\n});\nconst CDP_REQ_TIMEOUT = 2000; // ms\nconst DEVTOOLS_PORT_ALLOCATION_GUARD = util.getLockFileGuard(\n path.resolve(os.tmpdir(), 'android_devtools_port_guard'),\n {timeout: 7, tryRecovery: true}\n);\n\nconst helpers = {};\n\nfunction toDetailsCacheKey (adb, webview) {\n return `${adb?.curDeviceId}:${webview}`;\n}\n\n/**\n * This function gets a list of android system processes and returns ones\n * that look like webviews\n * See https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\n * for more details\n *\n * @param {object} adb - an ADB instance\n *\n * @return {Array.<string>} - a list of matching webview socket names (including the leading '@')\n */\nasync function getPotentialWebviewProcs (adb) {\n const out = await adb.shell(['cat', '/proc/net/unix']);\n const names = [];\n const allMatches = [];\n for (const line of out.split('\\n')) {\n // Num RefCount Protocol Flags Type St Inode Path\n const [,,, flags,, st,, sockPath] = line.trim().split(/\\s+/);\n if (!sockPath) {\n continue;\n }\n if (sockPath.startsWith('@')) {\n allMatches.push(line.trim());\n }\n if (flags !== '00010000' || st !== '01') {\n continue;\n }\n if (!DEVTOOLS_SOCKET_PATTERN.test(sockPath)) {\n continue;\n }\n\n names.push(sockPath);\n }\n if (_.isEmpty(names)) {\n logger.debug('Found no active devtools sockets');\n if (!_.isEmpty(allMatches)) {\n logger.debug(`Other sockets are: ${JSON.stringify(allMatches, null, 2)}`);\n }\n } else {\n logger.debug(`Parsed ${names.length} active devtools ${util.pluralize('socket', names.length, false)}: ` +\n JSON.stringify(names));\n }\n // sometimes the webview process shows up multiple times per app\n return _.uniq(names);\n}\n\n/**\n * @typedef {Object} WebviewProc\n * @property {string} proc - The webview process name (as returned by\n * getPotentialWebviewProcs\n * @property {string} webview - The actual webview context name\n */\n/**\n * This function retrieves a list of system processes that look like webviews,\n * and returns them along with the webview context name appropriate for it.\n * If we pass in a deviceSocket, we only attempt to find webviews which match\n * that socket name (this is for apps which embed Chromium, which isn't the\n * same as chrome-backed webviews).\n *\n * @param {object} adb - an ADB instance\n * @param {?string} deviceSocket - the explictly-named device socket to use\n *\n * @return {Array.<WebviewProc>}\n */\nasync function webviewsFromProcs (adb, deviceSocket = null) {\n const socketNames = await getPotentialWebviewProcs(adb);\n const webviews = [];\n for (const socketName of socketNames) {\n if (deviceSocket === CHROMIUM_DEVTOOLS_SOCKET && socketName === `@${deviceSocket}`) {\n webviews.push({\n proc: socketName,\n webview: CHROMIUM_WIN,\n });\n continue;\n }\n\n const socketNameMatch = DEVTOOLS_SOCKET_PATTERN.exec(socketName);\n if (!socketNameMatch) {\n continue;\n }\n const crosswalkMatch = CROSSWALK_SOCKET_PATTERN.exec(socketName);\n if (!socketNameMatch[1] && !crosswalkMatch) {\n continue;\n }\n\n if (deviceSocket && socketName === `@${deviceSocket}` || !deviceSocket) {\n webviews.push({\n proc: socketName,\n webview: socketNameMatch[1]\n ? `${WEBVIEW_BASE}${socketNameMatch[1]}`\n : `${WEBVIEW_BASE}${crosswalkMatch[1]}`,\n });\n }\n }\n return webviews;\n}\n\n/**\n * Allocates a local port for devtools communication\n *\n * @param {ADB} adb ADB instance\n * @param {string} socketName The remote Unix socket name\n * @param {?number} webviewDevtoolsPort The local port number or null to apply\n * autodetection\n * @returns {number} The local port number if the remote socket has been forwarded\n * successfully or `null` otherwise\n * @throws {Error} If there was an error while allocating the local port\n */\nasync function allocateDevtoolsPort (adb, socketName, webviewDevtoolsPort = null) {\n // socket names come with '@', but this should not be a part of the abstract\n // remote port, so remove it\n const remotePort = socketName.replace(/^@/, '');\n let [startPort, endPort] = DEVTOOLS_PORTS_RANGE;\n if (webviewDevtoolsPort) {\n endPort = webviewDevtoolsPort + (endPort - startPort);\n startPort = webviewDevtoolsPort;\n }\n logger.debug(`Forwarding remote port ${remotePort} to a local ` +\n `port in range ${startPort}..${endPort}`);\n if (!webviewDevtoolsPort) {\n logger.debug(`You could use the 'webviewDevtoolsPort' capability to customize ` +\n `the starting port number`);\n }\n return await DEVTOOLS_PORT_ALLOCATION_GUARD(async () => {\n let localPort;\n try {\n localPort = await findAPortNotInUse(startPort, endPort);\n } catch (e) {\n throw new Error(`Cannot find any free port to forward the Devtools socket ` +\n `in range ${startPort}..${endPort}. You could set the starting port number ` +\n `manually by providing the 'webviewDevtoolsPort' capability`);\n }\n await adb.adbExec(['forward', `tcp:${localPort}`, `localabstract:${remotePort}`]);\n return localPort;\n });\n}\n\n/**\n * @typedef {Object} WebviewProps\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n */\n\n/**\n * @typedef {Object} DetailCollectionOptions\n * @property {?string|number} webviewDevtoolsPort The starting port to use for webview page\n * presence check (if not the default of 9222).\n * @property {?boolean} ensureWebviewsHavePages Whether to check for webview\n * pages presence\n * @property {boolean} enableWebviewDetailsCollection Whether to collect\n * web view details and send them to Chromedriver constructor, so it could\n * select a binary more precisely based on this info.\n */\n\n/**\n * This is a wrapper for Chrome Debugger Protocol data collection.\n * No error is thrown if CDP request fails - in such case no data will be\n * recorded into the corresponding `webviewsMapping` item.\n *\n * @param {ADB} adb The ADB instance\n * @param {Array<WebviewProps>} webviewsMapping The current webviews mapping\n * !!! Each item of this array gets mutated (`info`/`pages` properties get added\n * based on the provided `opts`) if the requested details have been\n * successfully retrieved for it !!!\n * @param {DetailCollectionOptions} opts If both `ensureWebviewsHavePages` and\n * `enableWebviewDetailsCollection` properties are falsy then no details collection\n * is performed\n */\nasync function collectWebviewsDetails (adb, webviewsMapping, opts = {}) {\n if (_.isEmpty(webviewsMapping)) {\n return;\n }\n\n const {\n webviewDevtoolsPort = null,\n ensureWebviewsHavePages = null,\n enableWebviewDetailsCollection = null,\n } = opts;\n\n if (!ensureWebviewsHavePages) {\n logger.info(`Not checking whether webviews have active pages; use the ` +\n `'ensureWebviewsHavePages' cap to turn this check on`);\n }\n\n if (!enableWebviewDetailsCollection) {\n logger.info(`Not collecting web view details. Details collection might help ` +\n `to make Chromedriver initialization more precise. Use the 'enableWebviewDetailsCollection' ` +\n `cap to turn it on`);\n }\n\n if (!ensureWebviewsHavePages && !enableWebviewDetailsCollection) {\n return;\n }\n\n // Connect to each devtools socket and retrieve web view details\n logger.debug(`Collecting CDP data of ${util.pluralize('webview', webviewsMapping.length, true)}`);\n const detailCollectors = [];\n for (const item of webviewsMapping) {\n detailCollectors.push((async () => {\n let localPort;\n try {\n localPort = await allocateDevtoolsPort(adb, item.proc, webviewDevtoolsPort);\n if (enableWebviewDetailsCollection) {\n item.info = await cdpInfo(localPort);\n }\n if (ensureWebviewsHavePages) {\n item.pages = await cdpList(localPort);\n }\n } catch (e) {\n logger.debug(e);\n } finally {\n if (localPort) {\n await adb.removePortForward(localPort);\n }\n }\n })());\n }\n await B.all(detailCollectors);\n logger.debug(`CDP data collection completed`);\n}\n\n// https://chromedevtools.github.io/devtools-protocol/\nasync function cdpList (localPort) {\n return (await axios({\n url: `http://127.0.0.1:${localPort}/json/list`,\n timeout: CDP_REQ_TIMEOUT,\n })).data;\n}\n\n// https://chromedevtools.github.io/devtools-protocol/\nasync function cdpInfo (localPort) {\n return (await axios({\n url: `http://127.0.0.1:${localPort}/json/version`,\n timeout: CDP_REQ_TIMEOUT,\n })).data;\n}\n\n/**\n * Take a webview name like WEBVIEW_4296 and use 'adb shell ps' to figure out\n * which app package is associated with that webview. One of the reasons we\n * want to do this is to make sure we're listing webviews for the actual AUT,\n * not some other running app\n *\n * @param {object} adb - an ADB instance\n * @param {string} webview - a webview process name\n *\n * @returns {string} - the package name of the app running the webview\n * @throws {Error} If there was a failure while retrieving the process name\n */\nhelpers.procFromWebview = async function procFromWebview (adb, webview) {\n const pidMatch = WEBVIEW_PID_PATTERN.exec(webview);\n if (!pidMatch) {\n throw new Error(`Could not find PID for webview '${webview}'`);\n }\n\n const pid = pidMatch[1];\n logger.debug(`${webview} mapped to pid ${pid}`);\n logger.debug(`Getting process name for webview '${webview}'`);\n const pkg = await adb.getNameByPid(pid);\n logger.debug(`Got process name: '${pkg}'`);\n return pkg;\n};\n\n/**\n * Parse webview names for getContexts\n *\n * @param {Array<WebviewsMapping>} webviewsMapping See note on getWebViewsMapping\n * @param {GetWebviewsOpts} opts See note on getWebViewsMapping\n * @return {Array.<string>} - a list of webview names\n */\nhelpers.parseWebviewNames = function parseWebviewNames (webviewsMapping, {\n ensureWebviewsHavePages = true,\n isChromeSession = false\n} = {}) {\n if (isChromeSession) {\n return [CHROMIUM_WIN];\n }\n\n const result = [];\n for (const {webview, pages, proc, webviewName} of webviewsMapping) {\n if (ensureWebviewsHavePages && pages?.length === 0) {\n logger.info(`Skipping the webview '${webview}' at '${proc}' ` +\n `since it has reported having zero pages`);\n continue;\n }\n if (webviewName) {\n result.push(webviewName);\n }\n }\n logger.debug(`Found ${util.pluralize('webview', result.length, true)}: ${JSON.stringify(result)}`);\n return result;\n};\n\n/**\n * @typedef {Object} GetWebviewsOpts\n * @property {string} androidDeviceSocket [null] - device socket name\n * @property {boolean} ensureWebviewsHavePages [true] - whether to check for webview\n * page presence\n * @property {number} webviewDevtoolsPort [9222] - port to use for webview page\n * presence check.\n * @property {boolean} enableWebviewDetailsCollection [true] - whether to collect\n * web view details and send them to Chromedriver constructor, so it could\n * select a binary more precisely based on this info.\n */\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc See note on WebviewProps\n * @property {string} webview See note on WebviewProps\n * @property {?Object} info See note on WebviewProps\n * @property {?Array<Object>} pages See note on WebviewProps\n * @propery {?string} webviewName An actual webview name for switching context\n */\n\n/**\n * Get a list of available webviews mapping by introspecting processes with adb,\n * where webviews are listed. It's possible to pass in a 'deviceSocket' arg, which\n * limits the webview possibilities to the one running on the Chromium devtools\n * socket we're interested in (see note on webviewsFromProcs). We can also\n * direct this method to verify whether a particular webview process actually\n * has any pages (if a process exists but no pages are found, Chromedriver will\n * not actually be able to connect to it, so this serves as a guard for that\n * strange failure mode). The strategy for checking whether any pages are\n * active involves sending a request to the remote debug server on the device,\n * hence it is also possible to specify the port on the host machine which\n * should be used for this communication.\n *\n * @param {object} adb - an ADB instance\n * @param {GetWebviewsOpts} opts\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\nhelpers.getWebViewsMapping = async function getWebViewsMapping (adb, {\n androidDeviceSocket = null,\n ensureWebviewsHavePages = true,\n webviewDevtoolsPort = null,\n enableWebviewDetailsCollection = true\n} = {}) {\n logger.debug('Getting a list of available webviews');\n const webviewsMapping = await webviewsFromProcs(adb, androidDeviceSocket);\n\n await collectWebviewsDetails(adb, webviewsMapping, {\n ensureWebviewsHavePages,\n enableWebviewDetailsCollection,\n webviewDevtoolsPort,\n });\n\n for (const webviewMapping of webviewsMapping) {\n const {webview, info} = webviewMapping;\n webviewMapping.webviewName = null;\n\n let wvName = webview;\n let process = undefined;\n if (!androidDeviceSocket) {\n const pkgMatch = WEBVIEW_PKG_PATTERN.exec(webview);\n try {\n // web view name could either be suffixed with PID or the package name\n // package names could not start with a digit\n const pkg = pkgMatch ? pkgMatch[1] : await helpers.procFromWebview(adb, webview);\n wvName = `${WEBVIEW_BASE}${pkg}`;\n const pidMatch = WEBVIEW_PID_PATTERN.exec(webview);\n process = {\n name: pkg,\n id: pidMatch ? pidMatch[1] : null,\n };\n } catch (e) {\n logger.warn(e.message);\n continue;\n }\n }\n\n webviewMapping.webviewName = wvName;\n const key = toDetailsCacheKey(adb, wvName);\n if (info || process) {\n WEBVIEWS_DETAILS_CACHE.set(key, { info, process });\n } else if (WEBVIEWS_DETAILS_CACHE.has(key)) {\n WEBVIEWS_DETAILS_CACHE.delete(key);\n }\n }\n return webviewsMapping;\n};\n\n/**\n * @typedef {Object} ProcessInfo\n * @property {string} name The process name\n * @property {?string} id The process id (if could be retrieved)\n */\n\n/**\n * @typedef {Object} WebViewDetails\n * @property {?ProcessInfo} process - Web view process details\n * @property {Object} info - Web view details as returned by /json/version CDP endpoint, for example:\n * {\n * \"Browser\": \"Chrome/72.0.3601.0\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3601.0 Safari/537.36\",\n * \"V8-Version\": \"7.2.233\",\n * \"WebKit-Version\": \"537.36 (@cfede9db1d154de0468cb0538479f34c0755a0f4)\",\n * \"webSocketDebuggerUrl\": \"ws://localhost:9222/devtools/browser/b0b8a4fb-bb17-4359-9533-a8d9f3908bd8\"\n * }\n */\n\n/**\n * Retrieves web view details previously cached by `getWebviews` call\n *\n * @param {ADB} adb ADB instance\n * @param {string} webview The name of the web view\n * @returns {?WebViewDetails} Either `undefined` or the recent web view details\n */\nhelpers.getWebviewDetails = function getWebviewDetails (adb, webview) {\n const key = toDetailsCacheKey(adb, webview);\n return WEBVIEWS_DETAILS_CACHE.get(key);\n};\n\n/**\n * Create Chrome driver capabilities based on the provided\n * Appium capabilities\n *\n * @param {Object} opts User-provided capabilities object\n * @param {string} deviceId The identifier of the Android device under test\n * @param {?WebViewDetails} webViewDetails\n * @returns {Object} The capabilities object.\n * See https://chromedriver.chromium.org/capabilities for more details.\n */\nhelpers.createChromedriverCaps = function createChromedriverCaps (opts, deviceId, webViewDetails) {\n const caps = { chromeOptions: {} };\n\n const androidPackage = opts.chromeOptions?.androidPackage\n || opts.appPackage\n || webViewDetails?.info?.['Android-Package'];\n if (androidPackage) {\n // chromedriver raises an invalid argument error when androidPackage is 'null'\n caps.chromeOptions.androidPackage = androidPackage;\n }\n if (_.isBoolean(opts.chromeUseRunningApp)) {\n caps.chromeOptions.androidUseRunningApp = opts.chromeUseRunningApp;\n }\n if (opts.chromeAndroidPackage) {\n caps.chromeOptions.androidPackage = opts.chromeAndroidPackage;\n }\n if (opts.chromeAndroidActivity) {\n caps.chromeOptions.androidActivity = opts.chromeAndroidActivity;\n }\n if (opts.chromeAndroidProcess) {\n caps.chromeOptions.androidProcess = opts.chromeAndroidProcess;\n } else if (webViewDetails?.process?.name && webViewDetails?.process?.id) {\n caps.chromeOptions.androidProcess = webViewDetails.process.name;\n }\n if (_.toLower(opts.browserName) === 'chromium-webview') {\n caps.chromeOptions.androidActivity = opts.appActivity;\n }\n if (opts.pageLoadStrategy) {\n caps.pageLoadStrategy = opts.pageLoadStrategy;\n }\n const isChrome = _.toLower(caps.chromeOptions.androidPackage) === 'chrome';\n if (_.includes(KNOWN_CHROME_PACKAGE_NAMES, caps.chromeOptions.androidPackage) || isChrome) {\n // if we have extracted package from context name, it could come in as bare\n // \"chrome\", and so we should make sure the details are correct, including\n // not using an activity or process id\n if (isChrome) {\n caps.chromeOptions.androidPackage = CHROME_PACKAGE_NAME;\n }\n delete caps.chromeOptions.androidActivity;\n delete caps.chromeOptions.androidProcess;\n }\n // add device id from adb\n caps.chromeOptions.androidDeviceSerial = deviceId;\n\n if (_.isPlainObject(opts.loggingPrefs) || _.isPlainObject(opts.chromeLoggingPrefs)) {\n if (opts.loggingPrefs) {\n logger.warn(`The 'loggingPrefs' cap is deprecated; use the 'chromeLoggingPrefs' cap instead`);\n }\n caps.loggingPrefs = opts.chromeLoggingPrefs || opts.loggingPrefs;\n }\n if (opts.enablePerformanceLogging) {\n logger.warn(`The 'enablePerformanceLogging' cap is deprecated; simply use ` +\n `the 'chromeLoggingPrefs' cap instead, with a 'performance' key set to 'ALL'`);\n const newPref = {performance: 'ALL'};\n // don't overwrite other logging prefs that have been sent in if they exist\n caps.loggingPrefs = caps.loggingPrefs\n ? Object.assign({}, caps.loggingPrefs, newPref)\n : newPref;\n }\n\n if (opts.chromeOptions?.Arguments) {\n // merge `Arguments` and `args`\n opts.chromeOptions.args = [...(opts.chromeOptions.args || []), ...opts.chromeOptions.Arguments];\n delete opts.chromeOptions.Arguments;\n }\n\n logger.debug('Precalculated Chromedriver capabilities: ' +\n JSON.stringify(caps.chromeOptions, null, 2));\n\n const protectedCapNames = [];\n for (const [opt, val] of _.toPairs(opts.chromeOptions)) {\n if (_.isUndefined(caps.chromeOptions[opt])) {\n caps.chromeOptions[opt] = val;\n } else {\n protectedCapNames.push(opt);\n }\n }\n if (!_.isEmpty(protectedCapNames)) {\n logger.info('The following Chromedriver capabilities cannot be overridden ' +\n 'by the provided chromeOptions:');\n for (const optName of protectedCapNames) {\n logger.info(` ${optName} (${JSON.stringify(opts.chromeOptions[optName])})`);\n }\n }\n\n return caps;\n};\n\nexport default helpers;\nexport { helpers, NATIVE_WIN, WEBVIEW_WIN, WEBVIEW_BASE, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webview-helpers.js","names":["_lodash","_interopRequireDefault","require","_logger","_axios","_support","_portscanner","_lruCache","_bluebird","_path","_os","NATIVE_WIN","exports","WEBVIEW_WIN","CHROMIUM_WIN","WEBVIEW_BASE","WEBVIEW_PID_PATTERN","RegExp","WEBVIEW_PKG_PATTERN","DEVTOOLS_SOCKET_PATTERN","CROSSWALK_SOCKET_PATTERN","CHROMIUM_DEVTOOLS_SOCKET","CHROME_PACKAGE_NAME","KNOWN_CHROME_PACKAGE_NAMES","DEVTOOLS_PORTS_RANGE","WEBVIEWS_DETAILS_CACHE","LRU","max","updateAgeOnGet","CDP_REQ_TIMEOUT","DEVTOOLS_PORT_ALLOCATION_GUARD","util","getLockFileGuard","path","resolve","os","tmpdir","timeout","tryRecovery","helpers","toDetailsCacheKey","adb","webview","curDeviceId","getPotentialWebviewProcs","out","shell","names","allMatches","line","split","flags","st","sockPath","trim","startsWith","push","test","_","isEmpty","logger","debug","JSON","stringify","length","pluralize","uniq","webviewsFromProcs","deviceSocket","socketNames","webviews","socketName","proc","socketNameMatch","exec","crosswalkMatch","allocateDevtoolsPort","webviewDevtoolsPort","remotePort","replace","startPort","endPort","localPort","findAPortNotInUse","e","Error","adbExec","collectWebviewsDetails","webviewsMapping","opts","ensureWebviewsHavePages","enableWebviewDetailsCollection","info","detailCollectors","item","cdpInfo","pages","cdpList","removePortForward","B","all","axios","url","data","procFromWebview","pidMatch","pid","pkg","getNameByPid","parseWebviewNames","isChromeSession","result","webviewName","getWebViewsMapping","androidDeviceSocket","webviewMapping","wvName","process","undefined","pkgMatch","name","id","warn","message","key","set","has","delete","getWebviewDetails","get","createChromedriverCaps","deviceId","webViewDetails","_opts$chromeOptions","_webViewDetails$info","_webViewDetails$proce","_webViewDetails$proce2","_opts$chromeOptions2","caps","chromeOptions","androidPackage","appPackage","isBoolean","chromeUseRunningApp","androidUseRunningApp","chromeAndroidPackage","chromeAndroidActivity","androidActivity","chromeAndroidProcess","androidProcess","toLower","browserName","appActivity","pageLoadStrategy","isChrome","includes","androidDeviceSerial","isPlainObject","loggingPrefs","chromeLoggingPrefs","enablePerformanceLogging","newPref","performance","Object","assign","Arguments","args","protectedCapNames","opt","val","toPairs","isUndefined","optName","_default","default"],"sources":["../../lib/webview-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport logger from './logger';\nimport axios from 'axios';\nimport { util } from '@appium/support';\nimport { findAPortNotInUse } from 'portscanner';\nimport LRU from 'lru-cache';\nimport B from 'bluebird';\nimport path from 'path';\nimport os from 'os';\n\nconst NATIVE_WIN = 'NATIVE_APP';\nconst WEBVIEW_WIN = 'WEBVIEW';\nconst CHROMIUM_WIN = 'CHROMIUM';\nconst WEBVIEW_BASE = `${WEBVIEW_WIN}_`;\nconst WEBVIEW_PID_PATTERN = new RegExp(`^${WEBVIEW_BASE}(\\\\d+)`);\nconst WEBVIEW_PKG_PATTERN = new RegExp(`^${WEBVIEW_BASE}([^\\\\d\\\\s][\\\\w.]*)`);\nconst DEVTOOLS_SOCKET_PATTERN = /@[\\w.]+_devtools_remote_?(\\d+)?\\b/;\nconst CROSSWALK_SOCKET_PATTERN = /@([\\w.]+)_devtools_remote\\b/;\nconst CHROMIUM_DEVTOOLS_SOCKET = 'chrome_devtools_remote';\nconst CHROME_PACKAGE_NAME = 'com.android.chrome';\nconst KNOWN_CHROME_PACKAGE_NAMES = [\n CHROME_PACKAGE_NAME,\n 'com.chrome.beta',\n 'com.chrome.dev',\n 'com.chrome.canary',\n];\nconst DEVTOOLS_PORTS_RANGE = [10900, 11000];\nconst WEBVIEWS_DETAILS_CACHE = new LRU({\n max: 100,\n updateAgeOnGet: true,\n});\nconst CDP_REQ_TIMEOUT = 2000; // ms\nconst DEVTOOLS_PORT_ALLOCATION_GUARD = util.getLockFileGuard(\n path.resolve(os.tmpdir(), 'android_devtools_port_guard'),\n {timeout: 7, tryRecovery: true}\n);\n\nconst helpers = {};\n\nfunction toDetailsCacheKey (adb, webview) {\n return `${adb?.curDeviceId}:${webview}`;\n}\n\n/**\n * This function gets a list of android system processes and returns ones\n * that look like webviews\n * See https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\n * for more details\n *\n * @param {object} adb - an ADB instance\n *\n * @return {Array.<string>} - a list of matching webview socket names (including the leading '@')\n */\nasync function getPotentialWebviewProcs (adb) {\n const out = await adb.shell(['cat', '/proc/net/unix']);\n const names = [];\n const allMatches = [];\n for (const line of out.split('\\n')) {\n // Num RefCount Protocol Flags Type St Inode Path\n const [,,, flags,, st,, sockPath] = line.trim().split(/\\s+/);\n if (!sockPath) {\n continue;\n }\n if (sockPath.startsWith('@')) {\n allMatches.push(line.trim());\n }\n if (flags !== '00010000' || st !== '01') {\n continue;\n }\n if (!DEVTOOLS_SOCKET_PATTERN.test(sockPath)) {\n continue;\n }\n\n names.push(sockPath);\n }\n if (_.isEmpty(names)) {\n logger.debug('Found no active devtools sockets');\n if (!_.isEmpty(allMatches)) {\n logger.debug(`Other sockets are: ${JSON.stringify(allMatches, null, 2)}`);\n }\n } else {\n logger.debug(`Parsed ${names.length} active devtools ${util.pluralize('socket', names.length, false)}: ` +\n JSON.stringify(names));\n }\n // sometimes the webview process shows up multiple times per app\n return _.uniq(names);\n}\n\n/**\n * @typedef {Object} WebviewProc\n * @property {string} proc - The webview process name (as returned by\n * getPotentialWebviewProcs\n * @property {string} webview - The actual webview context name\n */\n/**\n * This function retrieves a list of system processes that look like webviews,\n * and returns them along with the webview context name appropriate for it.\n * If we pass in a deviceSocket, we only attempt to find webviews which match\n * that socket name (this is for apps which embed Chromium, which isn't the\n * same as chrome-backed webviews).\n *\n * @param {object} adb - an ADB instance\n * @param {?string} deviceSocket - the explictly-named device socket to use\n *\n * @return {Array.<WebviewProc>}\n */\nasync function webviewsFromProcs (adb, deviceSocket = null) {\n const socketNames = await getPotentialWebviewProcs(adb);\n const webviews = [];\n for (const socketName of socketNames) {\n if (deviceSocket === CHROMIUM_DEVTOOLS_SOCKET && socketName === `@${deviceSocket}`) {\n webviews.push({\n proc: socketName,\n webview: CHROMIUM_WIN,\n });\n continue;\n }\n\n const socketNameMatch = DEVTOOLS_SOCKET_PATTERN.exec(socketName);\n if (!socketNameMatch) {\n continue;\n }\n const crosswalkMatch = CROSSWALK_SOCKET_PATTERN.exec(socketName);\n if (!socketNameMatch[1] && !crosswalkMatch) {\n continue;\n }\n\n if (deviceSocket && socketName === `@${deviceSocket}` || !deviceSocket) {\n webviews.push({\n proc: socketName,\n webview: socketNameMatch[1]\n ? `${WEBVIEW_BASE}${socketNameMatch[1]}`\n : `${WEBVIEW_BASE}${crosswalkMatch[1]}`,\n });\n }\n }\n return webviews;\n}\n\n/**\n * Allocates a local port for devtools communication\n *\n * @param {ADB} adb ADB instance\n * @param {string} socketName The remote Unix socket name\n * @param {?number} webviewDevtoolsPort The local port number or null to apply\n * autodetection\n * @returns {number} The local port number if the remote socket has been forwarded\n * successfully or `null` otherwise\n * @throws {Error} If there was an error while allocating the local port\n */\nasync function allocateDevtoolsPort (adb, socketName, webviewDevtoolsPort = null) {\n // socket names come with '@', but this should not be a part of the abstract\n // remote port, so remove it\n const remotePort = socketName.replace(/^@/, '');\n let [startPort, endPort] = DEVTOOLS_PORTS_RANGE;\n if (webviewDevtoolsPort) {\n endPort = webviewDevtoolsPort + (endPort - startPort);\n startPort = webviewDevtoolsPort;\n }\n logger.debug(`Forwarding remote port ${remotePort} to a local ` +\n `port in range ${startPort}..${endPort}`);\n if (!webviewDevtoolsPort) {\n logger.debug(`You could use the 'webviewDevtoolsPort' capability to customize ` +\n `the starting port number`);\n }\n return await DEVTOOLS_PORT_ALLOCATION_GUARD(async () => {\n let localPort;\n try {\n localPort = await findAPortNotInUse(startPort, endPort);\n } catch (e) {\n throw new Error(`Cannot find any free port to forward the Devtools socket ` +\n `in range ${startPort}..${endPort}. You could set the starting port number ` +\n `manually by providing the 'webviewDevtoolsPort' capability`);\n }\n await adb.adbExec(['forward', `tcp:${localPort}`, `localabstract:${remotePort}`]);\n return localPort;\n });\n}\n\n/**\n * @typedef {Object} WebviewProps\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n */\n\n/**\n * @typedef {Object} DetailCollectionOptions\n * @property {?string|number} webviewDevtoolsPort The starting port to use for webview page\n * presence check (if not the default of 9222).\n * @property {?boolean} ensureWebviewsHavePages Whether to check for webview\n * pages presence\n * @property {boolean} enableWebviewDetailsCollection Whether to collect\n * web view details and send them to Chromedriver constructor, so it could\n * select a binary more precisely based on this info.\n */\n\n/**\n * This is a wrapper for Chrome Debugger Protocol data collection.\n * No error is thrown if CDP request fails - in such case no data will be\n * recorded into the corresponding `webviewsMapping` item.\n *\n * @param {ADB} adb The ADB instance\n * @param {Array<WebviewProps>} webviewsMapping The current webviews mapping\n * !!! Each item of this array gets mutated (`info`/`pages` properties get added\n * based on the provided `opts`) if the requested details have been\n * successfully retrieved for it !!!\n * @param {DetailCollectionOptions} opts If both `ensureWebviewsHavePages` and\n * `enableWebviewDetailsCollection` properties are falsy then no details collection\n * is performed\n */\nasync function collectWebviewsDetails (adb, webviewsMapping, opts = {}) {\n if (_.isEmpty(webviewsMapping)) {\n return;\n }\n\n const {\n webviewDevtoolsPort = null,\n ensureWebviewsHavePages = null,\n enableWebviewDetailsCollection = null,\n } = opts;\n\n if (!ensureWebviewsHavePages) {\n logger.info(`Not checking whether webviews have active pages; use the ` +\n `'ensureWebviewsHavePages' cap to turn this check on`);\n }\n\n if (!enableWebviewDetailsCollection) {\n logger.info(`Not collecting web view details. Details collection might help ` +\n `to make Chromedriver initialization more precise. Use the 'enableWebviewDetailsCollection' ` +\n `cap to turn it on`);\n }\n\n if (!ensureWebviewsHavePages && !enableWebviewDetailsCollection) {\n return;\n }\n\n // Connect to each devtools socket and retrieve web view details\n logger.debug(`Collecting CDP data of ${util.pluralize('webview', webviewsMapping.length, true)}`);\n const detailCollectors = [];\n for (const item of webviewsMapping) {\n detailCollectors.push((async () => {\n let localPort;\n try {\n localPort = await allocateDevtoolsPort(adb, item.proc, webviewDevtoolsPort);\n if (enableWebviewDetailsCollection) {\n item.info = await cdpInfo(localPort);\n }\n if (ensureWebviewsHavePages) {\n item.pages = await cdpList(localPort);\n }\n } catch (e) {\n logger.debug(e);\n } finally {\n if (localPort) {\n try {\n await adb.removePortForward(localPort);\n } catch (e) {\n logger.debug(e);\n }\n }\n }\n })());\n }\n await B.all(detailCollectors);\n logger.debug(`CDP data collection completed`);\n}\n\n// https://chromedevtools.github.io/devtools-protocol/\nasync function cdpList (localPort) {\n return (await axios({\n url: `http://127.0.0.1:${localPort}/json/list`,\n timeout: CDP_REQ_TIMEOUT,\n })).data;\n}\n\n// https://chromedevtools.github.io/devtools-protocol/\nasync function cdpInfo (localPort) {\n return (await axios({\n url: `http://127.0.0.1:${localPort}/json/version`,\n timeout: CDP_REQ_TIMEOUT,\n })).data;\n}\n\n/**\n * Take a webview name like WEBVIEW_4296 and use 'adb shell ps' to figure out\n * which app package is associated with that webview. One of the reasons we\n * want to do this is to make sure we're listing webviews for the actual AUT,\n * not some other running app\n *\n * @param {object} adb - an ADB instance\n * @param {string} webview - a webview process name\n *\n * @returns {string} - the package name of the app running the webview\n * @throws {Error} If there was a failure while retrieving the process name\n */\nhelpers.procFromWebview = async function procFromWebview (adb, webview) {\n const pidMatch = WEBVIEW_PID_PATTERN.exec(webview);\n if (!pidMatch) {\n throw new Error(`Could not find PID for webview '${webview}'`);\n }\n\n const pid = pidMatch[1];\n logger.debug(`${webview} mapped to pid ${pid}`);\n logger.debug(`Getting process name for webview '${webview}'`);\n const pkg = await adb.getNameByPid(pid);\n logger.debug(`Got process name: '${pkg}'`);\n return pkg;\n};\n\n/**\n * Parse webview names for getContexts\n *\n * @param {Array<WebviewsMapping>} webviewsMapping See note on getWebViewsMapping\n * @param {GetWebviewsOpts} opts See note on getWebViewsMapping\n * @return {Array.<string>} - a list of webview names\n */\nhelpers.parseWebviewNames = function parseWebviewNames (webviewsMapping, {\n ensureWebviewsHavePages = true,\n isChromeSession = false\n} = {}) {\n if (isChromeSession) {\n return [CHROMIUM_WIN];\n }\n\n const result = [];\n for (const {webview, pages, proc, webviewName} of webviewsMapping) {\n if (ensureWebviewsHavePages && pages?.length === 0) {\n logger.info(`Skipping the webview '${webview}' at '${proc}' ` +\n `since it has reported having zero pages`);\n continue;\n }\n if (webviewName) {\n result.push(webviewName);\n }\n }\n logger.debug(`Found ${util.pluralize('webview', result.length, true)}: ${JSON.stringify(result)}`);\n return result;\n};\n\n/**\n * @typedef {Object} GetWebviewsOpts\n * @property {string} androidDeviceSocket [null] - device socket name\n * @property {boolean} ensureWebviewsHavePages [true] - whether to check for webview\n * page presence\n * @property {number} webviewDevtoolsPort [9222] - port to use for webview page\n * presence check.\n * @property {boolean} enableWebviewDetailsCollection [true] - whether to collect\n * web view details and send them to Chromedriver constructor, so it could\n * select a binary more precisely based on this info.\n */\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc See note on WebviewProps\n * @property {string} webview See note on WebviewProps\n * @property {?Object} info See note on WebviewProps\n * @property {?Array<Object>} pages See note on WebviewProps\n * @propery {?string} webviewName An actual webview name for switching context\n */\n\n/**\n * Get a list of available webviews mapping by introspecting processes with adb,\n * where webviews are listed. It's possible to pass in a 'deviceSocket' arg, which\n * limits the webview possibilities to the one running on the Chromium devtools\n * socket we're interested in (see note on webviewsFromProcs). We can also\n * direct this method to verify whether a particular webview process actually\n * has any pages (if a process exists but no pages are found, Chromedriver will\n * not actually be able to connect to it, so this serves as a guard for that\n * strange failure mode). The strategy for checking whether any pages are\n * active involves sending a request to the remote debug server on the device,\n * hence it is also possible to specify the port on the host machine which\n * should be used for this communication.\n *\n * @param {object} adb - an ADB instance\n * @param {GetWebviewsOpts} opts\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\nhelpers.getWebViewsMapping = async function getWebViewsMapping (adb, {\n androidDeviceSocket = null,\n ensureWebviewsHavePages = true,\n webviewDevtoolsPort = null,\n enableWebviewDetailsCollection = true\n} = {}) {\n logger.debug('Getting a list of available webviews');\n const webviewsMapping = await webviewsFromProcs(adb, androidDeviceSocket);\n\n await collectWebviewsDetails(adb, webviewsMapping, {\n ensureWebviewsHavePages,\n enableWebviewDetailsCollection,\n webviewDevtoolsPort,\n });\n\n for (const webviewMapping of webviewsMapping) {\n const {webview, info} = webviewMapping;\n webviewMapping.webviewName = null;\n\n let wvName = webview;\n let process = undefined;\n if (!androidDeviceSocket) {\n const pkgMatch = WEBVIEW_PKG_PATTERN.exec(webview);\n try {\n // web view name could either be suffixed with PID or the package name\n // package names could not start with a digit\n const pkg = pkgMatch ? pkgMatch[1] : await helpers.procFromWebview(adb, webview);\n wvName = `${WEBVIEW_BASE}${pkg}`;\n const pidMatch = WEBVIEW_PID_PATTERN.exec(webview);\n process = {\n name: pkg,\n id: pidMatch ? pidMatch[1] : null,\n };\n } catch (e) {\n logger.warn(e.message);\n continue;\n }\n }\n\n webviewMapping.webviewName = wvName;\n const key = toDetailsCacheKey(adb, wvName);\n if (info || process) {\n WEBVIEWS_DETAILS_CACHE.set(key, { info, process });\n } else if (WEBVIEWS_DETAILS_CACHE.has(key)) {\n WEBVIEWS_DETAILS_CACHE.delete(key);\n }\n }\n return webviewsMapping;\n};\n\n/**\n * @typedef {Object} ProcessInfo\n * @property {string} name The process name\n * @property {?string} id The process id (if could be retrieved)\n */\n\n/**\n * @typedef {Object} WebViewDetails\n * @property {?ProcessInfo} process - Web view process details\n * @property {Object} info - Web view details as returned by /json/version CDP endpoint, for example:\n * {\n * \"Browser\": \"Chrome/72.0.3601.0\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3601.0 Safari/537.36\",\n * \"V8-Version\": \"7.2.233\",\n * \"WebKit-Version\": \"537.36 (@cfede9db1d154de0468cb0538479f34c0755a0f4)\",\n * \"webSocketDebuggerUrl\": \"ws://localhost:9222/devtools/browser/b0b8a4fb-bb17-4359-9533-a8d9f3908bd8\"\n * }\n */\n\n/**\n * Retrieves web view details previously cached by `getWebviews` call\n *\n * @param {ADB} adb ADB instance\n * @param {string} webview The name of the web view\n * @returns {?WebViewDetails} Either `undefined` or the recent web view details\n */\nhelpers.getWebviewDetails = function getWebviewDetails (adb, webview) {\n const key = toDetailsCacheKey(adb, webview);\n return WEBVIEWS_DETAILS_CACHE.get(key);\n};\n\n/**\n * Create Chrome driver capabilities based on the provided\n * Appium capabilities\n *\n * @param {Object} opts User-provided capabilities object\n * @param {string} deviceId The identifier of the Android device under test\n * @param {?WebViewDetails} webViewDetails\n * @returns {Object} The capabilities object.\n * See https://chromedriver.chromium.org/capabilities for more details.\n */\nhelpers.createChromedriverCaps = function createChromedriverCaps (opts, deviceId, webViewDetails) {\n const caps = { chromeOptions: {} };\n\n const androidPackage = opts.chromeOptions?.androidPackage\n || opts.appPackage\n || webViewDetails?.info?.['Android-Package'];\n if (androidPackage) {\n // chromedriver raises an invalid argument error when androidPackage is 'null'\n caps.chromeOptions.androidPackage = androidPackage;\n }\n if (_.isBoolean(opts.chromeUseRunningApp)) {\n caps.chromeOptions.androidUseRunningApp = opts.chromeUseRunningApp;\n }\n if (opts.chromeAndroidPackage) {\n caps.chromeOptions.androidPackage = opts.chromeAndroidPackage;\n }\n if (opts.chromeAndroidActivity) {\n caps.chromeOptions.androidActivity = opts.chromeAndroidActivity;\n }\n if (opts.chromeAndroidProcess) {\n caps.chromeOptions.androidProcess = opts.chromeAndroidProcess;\n } else if (webViewDetails?.process?.name && webViewDetails?.process?.id) {\n caps.chromeOptions.androidProcess = webViewDetails.process.name;\n }\n if (_.toLower(opts.browserName) === 'chromium-webview') {\n caps.chromeOptions.androidActivity = opts.appActivity;\n }\n if (opts.pageLoadStrategy) {\n caps.pageLoadStrategy = opts.pageLoadStrategy;\n }\n const isChrome = _.toLower(caps.chromeOptions.androidPackage) === 'chrome';\n if (_.includes(KNOWN_CHROME_PACKAGE_NAMES, caps.chromeOptions.androidPackage) || isChrome) {\n // if we have extracted package from context name, it could come in as bare\n // \"chrome\", and so we should make sure the details are correct, including\n // not using an activity or process id\n if (isChrome) {\n caps.chromeOptions.androidPackage = CHROME_PACKAGE_NAME;\n }\n delete caps.chromeOptions.androidActivity;\n delete caps.chromeOptions.androidProcess;\n }\n // add device id from adb\n caps.chromeOptions.androidDeviceSerial = deviceId;\n\n if (_.isPlainObject(opts.loggingPrefs) || _.isPlainObject(opts.chromeLoggingPrefs)) {\n if (opts.loggingPrefs) {\n logger.warn(`The 'loggingPrefs' cap is deprecated; use the 'chromeLoggingPrefs' cap instead`);\n }\n caps.loggingPrefs = opts.chromeLoggingPrefs || opts.loggingPrefs;\n }\n if (opts.enablePerformanceLogging) {\n logger.warn(`The 'enablePerformanceLogging' cap is deprecated; simply use ` +\n `the 'chromeLoggingPrefs' cap instead, with a 'performance' key set to 'ALL'`);\n const newPref = {performance: 'ALL'};\n // don't overwrite other logging prefs that have been sent in if they exist\n caps.loggingPrefs = caps.loggingPrefs\n ? Object.assign({}, caps.loggingPrefs, newPref)\n : newPref;\n }\n\n if (opts.chromeOptions?.Arguments) {\n // merge `Arguments` and `args`\n opts.chromeOptions.args = [...(opts.chromeOptions.args || []), ...opts.chromeOptions.Arguments];\n delete opts.chromeOptions.Arguments;\n }\n\n logger.debug('Precalculated Chromedriver capabilities: ' +\n JSON.stringify(caps.chromeOptions, null, 2));\n\n const protectedCapNames = [];\n for (const [opt, val] of _.toPairs(opts.chromeOptions)) {\n if (_.isUndefined(caps.chromeOptions[opt])) {\n caps.chromeOptions[opt] = val;\n } else {\n protectedCapNames.push(opt);\n }\n }\n if (!_.isEmpty(protectedCapNames)) {\n logger.info('The following Chromedriver capabilities cannot be overridden ' +\n 'by the provided chromeOptions:');\n for (const optName of protectedCapNames) {\n logger.info(` ${optName} (${JSON.stringify(opts.chromeOptions[optName])})`);\n }\n }\n\n return caps;\n};\n\nexport default helpers;\nexport { helpers, NATIVE_WIN, WEBVIEW_WIN, WEBVIEW_BASE, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES };\n"],"mappings":"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"}
|
package/lib/commands/execute.js
CHANGED
|
@@ -73,6 +73,9 @@ extensions.executeMobile = async function executeMobile (mobileCommand, opts = {
|
|
|
73
73
|
startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',
|
|
74
74
|
isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',
|
|
75
75
|
stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',
|
|
76
|
+
|
|
77
|
+
getConnectivity: 'mobileGetConnectivity',
|
|
78
|
+
setConnectivity: 'mobileSetConnectivity',
|
|
76
79
|
};
|
|
77
80
|
|
|
78
81
|
if (!_.has(mobileCommandsMapping, mobileCommand)) {
|
package/lib/commands/network.js
CHANGED
|
@@ -13,6 +13,9 @@ const DATA_MASK = 0b100;
|
|
|
13
13
|
// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.
|
|
14
14
|
// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)
|
|
15
15
|
const GEO_EPSILON = Number.MIN_VALUE;
|
|
16
|
+
const WIFI_KEY_NAME = 'wifi';
|
|
17
|
+
const DATA_KEY_NAME = 'data';
|
|
18
|
+
const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
|
|
16
19
|
|
|
17
20
|
commands.getNetworkConnection = async function getNetworkConnection () {
|
|
18
21
|
this.log.info('Getting network connection');
|
|
@@ -37,6 +40,102 @@ commands.isWifiOn = async function isWifiOn () {
|
|
|
37
40
|
return await this.adb.isWifiOn();
|
|
38
41
|
};
|
|
39
42
|
|
|
43
|
+
/**
|
|
44
|
+
* @typedef {Object} SetConnectivityOptions
|
|
45
|
+
* @property {boolean?} wifi Either to enable or disable Wi-Fi.
|
|
46
|
+
* An unset value means to not change the state for the given service.
|
|
47
|
+
* @property {boolean?} data Either to enable or disable mobile data connection.
|
|
48
|
+
* An unset value means to not change the state for the given service.
|
|
49
|
+
* @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode
|
|
50
|
+
* An unset value means to not change the state for the given service.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Set the connectivity state for different services
|
|
55
|
+
*
|
|
56
|
+
* @param {SetConnectivityOptions} opts
|
|
57
|
+
* @throws {Error} If none of known properties were provided or there was an error
|
|
58
|
+
* while changing connectivity states
|
|
59
|
+
*/
|
|
60
|
+
commands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {
|
|
61
|
+
const {
|
|
62
|
+
wifi,
|
|
63
|
+
data,
|
|
64
|
+
airplaneMode,
|
|
65
|
+
} = opts;
|
|
66
|
+
|
|
67
|
+
if (_.every([wifi, data, airplaneMode], _.isUndefined)) {
|
|
68
|
+
throw new errors.InvalidArgumentError(
|
|
69
|
+
`Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const currentState = await this.mobileGetConnectivity({
|
|
74
|
+
services: [
|
|
75
|
+
...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),
|
|
76
|
+
...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),
|
|
77
|
+
...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),
|
|
78
|
+
]
|
|
79
|
+
});
|
|
80
|
+
const setters = [];
|
|
81
|
+
if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {
|
|
82
|
+
setters.push(this.adb.setWifiState(wifi, this.isEmulator()));
|
|
83
|
+
}
|
|
84
|
+
if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {
|
|
85
|
+
setters.push(this.adb.setDataState(data, this.isEmulator()));
|
|
86
|
+
}
|
|
87
|
+
if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {
|
|
88
|
+
setters.push(async () => {
|
|
89
|
+
await this.adb.setAirplaneMode(airplaneMode);
|
|
90
|
+
if (this.adb.getApiLevel() < 30) {
|
|
91
|
+
await this.adb.broadcastAirplaneMode(airplaneMode);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (!_.isEmpty(setters)) {
|
|
96
|
+
await B.all(setters);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @typedef {Object} GetConnectivityResult
|
|
102
|
+
* @property {boolean} wifi True if wifi is enabled
|
|
103
|
+
* @property {boolean} data True if mobile data connection is enabled
|
|
104
|
+
* @property {boolean} airplaneMode True if Airplane Mode is enabled
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @typedef {Object} GetConnectivityOptions
|
|
109
|
+
* @property {string[]|string?} services one or more services to get the connectivity for.
|
|
110
|
+
* Supported service names are: wifi, data, airplaneMode.
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Retrieves the connectivity properties from the device under test
|
|
115
|
+
*
|
|
116
|
+
* @param {GetConnectivityOptions?} opts If no service names are provided then the
|
|
117
|
+
* connectivity state is returned for all of them.
|
|
118
|
+
* @returns {GetConnectivityResult}
|
|
119
|
+
*/
|
|
120
|
+
commands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {
|
|
121
|
+
let {
|
|
122
|
+
services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],
|
|
123
|
+
} = opts;
|
|
124
|
+
if (!_.isArray(services)) {
|
|
125
|
+
services = [services];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const statePromises = {
|
|
129
|
+
wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),
|
|
130
|
+
data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),
|
|
131
|
+
airplaneMode: B.resolve(
|
|
132
|
+
services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()
|
|
133
|
+
),
|
|
134
|
+
};
|
|
135
|
+
await B.all(_.values(statePromises));
|
|
136
|
+
return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));
|
|
137
|
+
};
|
|
138
|
+
|
|
40
139
|
commands.setNetworkConnection = async function setNetworkConnection (type) {
|
|
41
140
|
this.log.info('Setting network connection');
|
|
42
141
|
// decode the input
|
|
@@ -54,11 +153,14 @@ commands.setNetworkConnection = async function setNetworkConnection (type) {
|
|
|
54
153
|
await this.adb.setAirplaneMode(shouldEnableAirplaneMode);
|
|
55
154
|
});
|
|
56
155
|
await this.wrapBootstrapDisconnect(async () => {
|
|
57
|
-
await this.adb.
|
|
156
|
+
if (await this.adb.getApiLevel() < 30) {
|
|
157
|
+
await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
|
|
158
|
+
}
|
|
58
159
|
});
|
|
59
160
|
} else {
|
|
60
|
-
this.log.info(
|
|
61
|
-
|
|
161
|
+
this.log.info(
|
|
162
|
+
`Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`
|
|
163
|
+
);
|
|
62
164
|
}
|
|
63
165
|
|
|
64
166
|
if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
|
|
@@ -124,7 +226,9 @@ commands.toggleFlightMode = async function toggleFlightMode () {
|
|
|
124
226
|
await this.adb.setAirplaneMode(flightMode);
|
|
125
227
|
});
|
|
126
228
|
await this.wrapBootstrapDisconnect(async () => {
|
|
127
|
-
await this.adb.
|
|
229
|
+
if (await this.adb.getApiLevel() < 30) {
|
|
230
|
+
await this.adb.broadcastAirplaneMode(flightMode);
|
|
231
|
+
}
|
|
128
232
|
});
|
|
129
233
|
};
|
|
130
234
|
|
package/lib/webview-helpers.js
CHANGED
|
@@ -257,7 +257,11 @@ async function collectWebviewsDetails (adb, webviewsMapping, opts = {}) {
|
|
|
257
257
|
logger.debug(e);
|
|
258
258
|
} finally {
|
|
259
259
|
if (localPort) {
|
|
260
|
-
|
|
260
|
+
try {
|
|
261
|
+
await adb.removePortForward(localPort);
|
|
262
|
+
} catch (e) {
|
|
263
|
+
logger.debug(e);
|
|
264
|
+
}
|
|
261
265
|
}
|
|
262
266
|
}
|
|
263
267
|
})());
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"mobile",
|
|
10
10
|
"mobile testing"
|
|
11
11
|
],
|
|
12
|
-
"version": "5.
|
|
12
|
+
"version": "5.9.0",
|
|
13
13
|
"author": "Appium Contributors",
|
|
14
14
|
"license": "Apache-2.0",
|
|
15
15
|
"repository": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@babel/runtime": "^7.0.0",
|
|
51
|
-
"appium-adb": "^9.
|
|
51
|
+
"appium-adb": "^9.11.0",
|
|
52
52
|
"appium-chromedriver": "^5.2.0",
|
|
53
53
|
"asyncbox": "^2.8.0",
|
|
54
54
|
"axios": "^1.x",
|