UNPKG

gst-atom-xcuitest-driver

Version:

ATOM driver for iOS using XCUITest for backend

308 lines (233 loc) 32 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.extensions = exports.helpers = exports.commands = void 0; require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _gstAtomBaseDriver = require("gst-atom-base-driver"); var _gstAtomIosDriver = require("gst-atom-ios-driver"); var _logger = _interopRequireDefault(require("../logger")); var _appiumSupport = require("appium-support"); var _momentTimezone = _interopRequireDefault(require("moment-timezone")); var _gstAtomIosDevice = require("gst-atom-ios-device"); let commands = {}, helpers = {}, extensions = {}; exports.extensions = extensions; exports.helpers = helpers; exports.commands = commands; const MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ'; commands.active = async function active() { if (this.isWebContext()) { return await this.executeAtom('active_element', []); } return await this.proxyCommand(`/element/active`, 'GET'); }; commands.background = async function background(seconds) { const homescreen = '/wda/homescreen'; const deactivateApp = '/wda/deactivateApp'; let endpoint; let params = {}; const selectEndpoint = timeoutSeconds => { if (!_appiumSupport.util.hasValue(timeoutSeconds)) { endpoint = homescreen; } else if (!isNaN(timeoutSeconds)) { const duration = parseFloat(timeoutSeconds); if (duration >= 0) { params = { duration }; endpoint = deactivateApp; } else { endpoint = homescreen; } } }; if (_lodash.default.has(seconds, 'timeout')) { const { timeout } = seconds; selectEndpoint(isNaN(timeout) ? timeout : parseFloat(timeout) / 1000.0); } else { selectEndpoint(seconds); } if (!endpoint) { _logger.default.errorAndThrow(`Argument value is expected to be a valid number. ` + `${JSON.stringify(seconds)} has been provided instead`); } return await this.proxyCommand(endpoint, 'POST', params, endpoint !== homescreen); }; commands.touchId = async function touchId(match = true) { await this.mobileSendBiometricMatch({ match }); }; commands.toggleEnrollTouchId = async function toggleEnrollTouchId(isEnabled = true) { await this.mobileEnrollBiometric({ isEnabled }); }; helpers.getWindowSizeWeb = async function getWindowSizeWeb() { return await this.executeAtom('get_window_size', []); }; helpers.getWindowSizeNative = async function getWindowSizeNative() { return await this.proxyCommand(`/window/size`, 'GET'); }; commands.getWindowSize = async function getWindowSize(windowHandle = 'current') { if (windowHandle !== 'current') { throw new _gstAtomBaseDriver.errors.NotYetImplementedError('Currently only getting current window size is supported.'); } if (!this.isWebContext()) { return await this.getWindowSizeNative(); } else { return await this.getWindowSizeWeb(); } }; commands.getDeviceTime = async function getDeviceTime(format = MOMENT_FORMAT_ISO8601) { _logger.default.info('Attempting to capture iOS device date and time'); if (!this.isRealDevice()) { return await _gstAtomIosDriver.iosCommands.general.getDeviceTime.call(this, format); } const { timestamp, utcOffset, timeZone } = await _gstAtomIosDevice.utilities.getDeviceTime(this.opts.udid, this.opts.usbmuxdRemoteHost, this.opts.usbmuxdRemotePort); _logger.default.debug(`timestamp: ${timestamp}, utcOffset: ${utcOffset}, timeZone: ${timeZone}`); const utc = _momentTimezone.default.unix(timestamp).utc(); if (Math.abs(utcOffset) <= 12 * 60) { return utc.utcOffset(utcOffset).format(format); } if (_lodash.default.includes(timeZone, '/')) { return utc.tz(timeZone).format(format); } if (Math.abs(timeZone) <= 12 * 60 * 60) { return utc.utcOffset(timeZone / 60).format(format); } _logger.default.warn('Did not know how to apply the UTC offset. Returning the timestamp without it'); return utc.format(format); }; commands.mobileGetDeviceTime = async function mobileGetDeviceTime(opts = {}) { return await this.getDeviceTime(opts.format); }; commands.getWindowRect = async function getWindowRect() { const { width, height } = await this.getWindowSize(); return { width, height, x: 0, y: 0 }; }; commands.hideKeyboard = async function hideKeyboard(strategy, ...possibleKeys) { if (!(this.opts.deviceName || '').includes('iPhone')) { try { await this.proxyCommand('/wda/keyboard/dismiss', 'POST'); return; } catch (ign) {} } _logger.default.debug('Cannot dismiss the keyboard using the native call. Trying to apply a workaround...'); let keyboard; try { keyboard = await this.findNativeElementOrElements('class name', 'XCUIElementTypeKeyboard', false); } catch (err) { _logger.default.debug('No keyboard found. Unable to hide.'); return; } possibleKeys.pop(); possibleKeys = possibleKeys.filter(element => !!element); if (possibleKeys.length) { for (const key of possibleKeys) { let el = _lodash.default.last(await this.findNativeElementOrElements('accessibility id', key, true, keyboard)); if (el) { _logger.default.debug(`Attempting to hide keyboard by pressing '${key}' key.`); await this.nativeClick(el); return; } } } else { _logger.default.debug('Finding keyboard and clicking final button to close'); if ((await this.getNativeAttribute('visible', keyboard)) === 'false') { _logger.default.debug('No visible keyboard found. Returning'); return; } let buttons = await this.findNativeElementOrElements('class name', 'XCUIElementTypeButton', true, keyboard); if (_lodash.default.isEmpty(buttons)) { _logger.default.warn(`No button elements found. Unable to hide.`); return; } await this.nativeClick(_lodash.default.last(buttons)); } }; commands.getStrings = _gstAtomIosDriver.iosCommands.general.getStrings; commands.removeApp = async function removeApp(bundleId) { return await this.mobileRemoveApp({ bundleId }); }; commands.launchApp = _gstAtomIosDriver.iosCommands.general.launchApp; commands.closeApp = _gstAtomIosDriver.iosCommands.general.closeApp; commands.keys = async function keys(keys) { if (!this.isWebContext()) { throw new _gstAtomBaseDriver.errors.UnknownError('Command should be proxied to WDA'); } let el = _appiumSupport.util.unwrapElement(await this.active()); if (_lodash.default.isEmpty(el)) { throw new _gstAtomBaseDriver.errors.NoSuchElementError(); } await this.setValue(keys, el); }; commands.setUrl = async function setUrl(url) { if (!this.isWebContext() && this.isRealDevice()) { return await this.proxyCommand('/url', 'POST', { url }); } return await _gstAtomIosDriver.iosCommands.general.setUrl.call(this, url); }; commands.getViewportRect = _gstAtomIosDriver.iosCommands.device.getViewportRect; commands.getScreenInfo = async function getScreenInfo() { return await this.proxyCommand('/wda/screen', 'GET'); }; commands.getStatusBarHeight = async function getStatusBarHeight() { const { statusBarSize } = await this.getScreenInfo(); return statusBarSize.height; }; commands.getDevicePixelRatio = async function getDevicePixelRatio() { const { scale } = await this.getScreenInfo(); return scale; }; commands.mobilePressButton = async function mobilePressButton(opts = {}) { const { name } = opts; if (!name) { _logger.default.errorAndThrow('Button name is mandatory'); } return await this.proxyCommand('/wda/pressButton', 'POST', { name }); }; commands.mobileSiriCommand = async function mobileSiriCommand(opts = {}) { const { text } = opts; if (!_appiumSupport.util.hasValue(text)) { _logger.default.errorAndThrow('"text" argument is mandatory'); } return await this.proxyCommand('/wda/siri/activate', 'POST', { text }); }; Object.assign(extensions, commands, helpers); var _default = extensions; exports.default = _default;require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJhY3RpdmUiLCJpc1dlYkNvbnRleHQiLCJleGVjdXRlQXRvbSIsInByb3h5Q29tbWFuZCIsImJhY2tncm91bmQiLCJzZWNvbmRzIiwiaG9tZXNjcmVlbiIsImRlYWN0aXZhdGVBcHAiLCJlbmRwb2ludCIsInBhcmFtcyIsInNlbGVjdEVuZHBvaW50IiwidGltZW91dFNlY29uZHMiLCJ1dGlsIiwiaGFzVmFsdWUiLCJpc05hTiIsImR1cmF0aW9uIiwicGFyc2VGbG9hdCIsIl8iLCJoYXMiLCJ0aW1lb3V0IiwibG9nIiwiZXJyb3JBbmRUaHJvdyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b3VjaElkIiwibWF0Y2giLCJtb2JpbGVTZW5kQmlvbWV0cmljTWF0Y2giLCJ0b2dnbGVFbnJvbGxUb3VjaElkIiwiaXNFbmFibGVkIiwibW9iaWxlRW5yb2xsQmlvbWV0cmljIiwiZ2V0V2luZG93U2l6ZVdlYiIsImdldFdpbmRvd1NpemVOYXRpdmUiLCJnZXRXaW5kb3dTaXplIiwid2luZG93SGFuZGxlIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsImdldERldmljZVRpbWUiLCJmb3JtYXQiLCJpbmZvIiwiaXNSZWFsRGV2aWNlIiwiaW9zQ29tbWFuZHMiLCJnZW5lcmFsIiwiY2FsbCIsInRpbWVzdGFtcCIsInV0Y09mZnNldCIsInRpbWVab25lIiwidXRpbGl0aWVzIiwib3B0cyIsInVkaWQiLCJ1c2JtdXhkUmVtb3RlSG9zdCIsInVzYm11eGRSZW1vdGVQb3J0IiwiZGVidWciLCJ1dGMiLCJtb21lbnQiLCJ1bml4IiwiTWF0aCIsImFicyIsImluY2x1ZGVzIiwidHoiLCJ3YXJuIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiaGlkZUtleWJvYXJkIiwic3RyYXRlZ3kiLCJwb3NzaWJsZUtleXMiLCJkZXZpY2VOYW1lIiwiaWduIiwia2V5Ym9hcmQiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJlcnIiLCJwb3AiLCJmaWx0ZXIiLCJlbGVtZW50IiwibGVuZ3RoIiwia2V5IiwiZWwiLCJsYXN0IiwibmF0aXZlQ2xpY2siLCJnZXROYXRpdmVBdHRyaWJ1dGUiLCJidXR0b25zIiwiaXNFbXB0eSIsImdldFN0cmluZ3MiLCJyZW1vdmVBcHAiLCJidW5kbGVJZCIsIm1vYmlsZVJlbW92ZUFwcCIsImxhdW5jaEFwcCIsImNsb3NlQXBwIiwia2V5cyIsIlVua25vd25FcnJvciIsInVud3JhcEVsZW1lbnQiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJzZXRWYWx1ZSIsInNldFVybCIsInVybCIsImdldFZpZXdwb3J0UmVjdCIsImRldmljZSIsImdldFNjcmVlbkluZm8iLCJnZXRTdGF0dXNCYXJIZWlnaHQiLCJzdGF0dXNCYXJTaXplIiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsInNjYWxlIiwibW9iaWxlUHJlc3NCdXR0b24iLCJuYW1lIiwibW9iaWxlU2lyaUNvbW1hbmQiLCJ0ZXh0IiwiT2JqZWN0IiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUlBLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLE9BQU8sR0FBRyxFQUE3QjtBQUFBLElBQWlDQyxVQUFVLEdBQUcsRUFBOUM7Ozs7QUFFQSxNQUFNQyxxQkFBcUIsR0FBRyxzQkFBOUI7O0FBR0FILFFBQVEsQ0FBQ0ksTUFBVCxHQUFrQixlQUFlQSxNQUFmLEdBQXlCO0FBQ3pDLE1BQUksS0FBS0MsWUFBTCxFQUFKLEVBQXlCO0FBQ3ZCLFdBQU8sTUFBTSxLQUFLQyxXQUFMLENBQWlCLGdCQUFqQixFQUFtQyxFQUFuQyxDQUFiO0FBQ0Q7O0FBQ0QsU0FBTyxNQUFN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U0FBTyxNQUFNLEtBQUtsQixZQUFMLENBQWtCLGtCQUFsQixFQUFzQyxNQUF0QyxFQUE4QztBQUFDdUcsSUFBQUE7QUFBRCxHQUE5QyxDQUFiO0FBQ0QsQ0FORDs7QUFRQTlHLFFBQVEsQ0FBQytHLGlCQUFULEdBQTZCLGVBQWVBLGlCQUFmLENBQWtDNUQsSUFBSSxHQUFHLEVBQXpDLEVBQTZDO0FBQ3hFLFFBQU07QUFBQzZELElBQUFBO0FBQUQsTUFBUzdELElBQWY7O0FBQ0EsTUFBSSxDQUFDbkMsb0JBQUtDLFFBQUwsQ0FBYytGLElBQWQsQ0FBTCxFQUEwQjtBQUN4QnhGLG9CQUFJQyxhQUFKLENBQWtCLDhCQUFsQjtBQUNEOztBQUNELFNBQU8sTUFBTSxLQUFLbEIsWUFBTCxDQUFrQixvQkFBbEIsRUFBd0MsTUFBeEMsRUFBZ0Q7QUFBQ3lHLElBQUFBO0FBQUQsR0FBaEQsQ0FBYjtBQUNELENBTkQ7O0FBUUFDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjaEgsVUFBZCxFQUEwQkYsUUFBMUIsRUFBb0NDLE9BQXBDO2VBR2VDLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnZ3N0LWF0b20tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgaW9zQ29tbWFuZHMgfSBmcm9tICdnc3QtYXRvbS1pb3MtZHJpdmVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5pbXBvcnQgeyB1dGlsaXRpZXMgfSBmcm9tICdnc3QtYXRvbS1pb3MtZGV2aWNlJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBNT01FTlRfRk9STUFUX0lTTzg2MDEgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuXG5cbmNvbW1hbmRzLmFjdGl2ZSA9IGFzeW5jIGZ1bmN0aW9uIGFjdGl2ZSAoKSB7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2FjdGl2ZV9lbGVtZW50JywgW10pO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvYWN0aXZlYCwgJ0dFVCcpO1xufTtcblxuLyoqXG4gKiBDbG9zZSBhcHAgKHNpbXVsYXRlIGRldmljZSBob21lIGJ1dHRvbikuIEl0IGlzIHBvc3NpYmxlIHRvIHJlc3RvcmVcbiAqIHRoZSBhcHAgYWZ0ZXIgdGhlIHRpbWVvdXQgb3Iga2VlcCBpdCBtaW5pbWl6ZWQgYmFzZWQgb24gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ8T2JqZWN0fSBzZWNvbmRzXG4gKiAtIGFueSBwb3NpdGl2ZSBudW1iZXIgb2Ygc2Vjb25kczogY29tZSBiYWNrIGFmdGVyIFggc2Vjb25kc1xuICogLSBhbnkgbmVnYXRpdmUgbnVtYmVyIG9mIHNlY29uZHMgb3IgemVybzogbmV2ZXIgY29tZSBiYWNrXG4gKiAtIHVuZGVmaW5lZC9udWxsOiBuZXZlciBjb21lIGJhY2tcbiAqIC0ge3RpbWVvdXQ6IDUwMDB9OiBjb21lIGJhY2sgYWZ0ZXIgNSBzZWNvbmRzXG4gKiAtIHt0aW1lb3V0OiBudWxsfSwge3RpbWVvdXQ6IC0yfTogbmV2ZXIgY29tZSBiYWNrXG4gKi9cbmNvbW1hbmRzLmJhY2tncm91bmQgPSBhc3luYyBmdW5jdGlvbiBiYWNrZ3JvdW5kIChzZWNvbmRzKSB7XG4gIGNvbnN0IGhvbWVzY3JlZW4gPSAnL3dkYS9ob21lc2NyZWVuJztcbiAgY29uc3QgZGVhY3RpdmF0ZUFwcCA9ICcvd2RhL2RlYWN0aXZhdGVBcHAnO1xuXG4gIGxldCBlbmRwb2ludDtcbiAgbGV0IHBhcmFtcyA9IHt9O1xuICBjb25zdCBzZWxlY3RFbmRwb2ludCA9ICh0aW1lb3V0U2Vjb25kcykgPT4ge1xuICAgIGlmICghdXRpbC5oYXNWYWx1ZSh0aW1lb3V0U2Vjb25kcykpIHtcbiAgICAgIGVuZHBvaW50ID0gaG9tZXNjcmVlbjtcbiAgICB9IGVsc2UgaWYgKCFpc05hTih0aW1lb3V0U2Vjb25kcykpIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gcGFyc2VGbG9hdCh0aW1lb3V0U2Vjb25kcyk7XG4gICAgICBpZiAoZHVyYXRpb24gPj0gMCkge1xuICAgICAgICBwYXJhbXMgPSB7ZHVyYXRpb259O1xuICAgICAgICBlbmRwb2ludCA9IGRlYWN0aXZhdGVBcHA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmRwb2ludCA9IGhvbWVzY3JlZW47XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBpZiAoXy5oYXMoc2Vjb25kcywgJ3RpbWVvdXQnKSkge1xuICAgIGNvbnN0IHt0aW1lb3V0fSA9IHNlY29uZHM7XG4gICAgc2VsZWN0RW5kcG9pbnQoaXNOYU4odGltZW91dCkgPyB0aW1lb3V0IDogcGFyc2VGbG9hdCh0aW1lb3V0KSAvIDEwMDAuMCk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0RW5kcG9pbnQoc2Vjb25kcyk7XG4gIH1cbiAgaWYgKCFlbmRwb2ludCkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBBcmd1bWVudCB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBhIHZhbGlkIG51bWJlci4gYCArXG4gICAgICBgJHtKU09OLnN0cmluZ2lmeShzZWNvbmRzKX0gaGFzIGJlZW4gcHJvdmlkZWQgaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChlbmRwb2ludCwgJ1BPU1QnLCBwYXJhbXMsIGVuZHBvaW50ICE9PSBob21lc2NyZWVuKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoSWQgPSBhc3luYyBmdW5jdGlvbiB0b3VjaElkIChtYXRjaCA9IHRydWUpIHtcbiAgYXdhaXQgdGhpcy5tb2JpbGVTZW5kQmlvbWV0cmljTWF0Y2goe21hdGNofSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVFbnJvbGxUb3VjaElkID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRW5yb2xsVG91Y2hJZCAoaXNFbmFibGVkID0gdHJ1ZSkge1xuICBhd2FpdCB0aGlzLm1vYmlsZUVucm9sbEJpb21ldHJpYyh7aXNFbmFibGVkfSk7XG59O1xuXG5oZWxwZXJzLmdldFdpbmRvd1NpemVXZWIgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dTaXplV2ViICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF93aW5kb3dfc2l6ZScsIFtdKTtcbn07XG5cbmhlbHBlcnMuZ2V0V2luZG93U2l6ZU5hdGl2ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1NpemVOYXRpdmUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93aW5kb3cvc2l6ZWAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dTaXplICh3aW5kb3dIYW5kbGUgPSAnY3VycmVudCcpIHtcbiAgaWYgKHdpbmRvd0hhbmRsZSAhPT0gJ2N1cnJlbnQnKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCdDdXJyZW50bHkgb25seSBnZXR0aW5nIGN1cnJlbnQgd2luZG93IHNpemUgaXMgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZU5hdGl2ZSgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemVXZWIoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgdGltZXN0YW1wLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgc2V0IG9mIGZvcm1hdCBzcGVjaWZpZXJzLiBSZWFkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tb21lbnRqcy5jb20vZG9jcy8gdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUgZm9ybWF0IHNwZWNpZmllcnMuIFRoZSBkZWZhdWx0IGZvcm1hdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAsIHdoaWNoIGNvbXBsaWVzIHRvIElTTy04NjAxXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgZGF0ZXRpbWUgc3RyaW5nIG9yIHRoZSByYXcgY29tbWFuZCBvdXRwdXQgaWYgZm9ybWF0dGluZyBmYWlsc1xuICovXG5jb21tYW5kcy5nZXREZXZpY2VUaW1lID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlVGltZSAoZm9ybWF0ID0gTU9NRU5UX0ZPUk1BVF9JU084NjAxKSB7XG4gIGxvZy5pbmZvKCdBdHRlbXB0aW5nIHRvIGNhcHR1cmUgaU9TIGRldmljZSBkYXRlIGFuZCB0aW1lJyk7XG4gIGlmICghdGhpcy5pc1JlYWxEZXZpY2UoKSkge1xuICAgIHJldHVybiBhd2FpdCBpb3NDb21tYW5kcy5nZW5lcmFsLmdldERldmljZVRpbWUuY2FsbCh0aGlzLCBmb3JtYXQpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHRpbWVzdGFtcCxcbiAgICB1dGNPZmZzZXQsXG4gICAgdGltZVpvbmUsXG4gIH0gPSBhd2FpdCB1dGlsaXRpZXMuZ2V0RGV2aWNlVGltZSh0aGlzLm9wdHMudWRpZCwgdGhpcy5vcHRzLnVzYm11eGRSZW1vdGVIb3N0LCB0aGlzLm9wdHMudXNibXV4ZFJlbW90ZVBvcnQpO1xuICBsb2cuZGVidWcoYHRpbWVzdGFtcDogJHt0aW1lc3RhbXB9LCB1dGNPZmZzZXQ6ICR7dXRjT2Zmc2V0fSwgdGltZVpvbmU6ICR7dGltZVpvbmV9YCk7XG4gIGNvbnN0IHV0YyA9IG1vbWVudC51bml4KHRpbWVzdGFtcCkudXRjKCk7XG4gIC8vIGF0IHNvbWUgcG9pbnQgb2YgdGltZSBBcHBsZSBzdGFydGVkIHRvIHJldHVybiB0aW1lc3RhbXBzXG4gIC8vIGluIHV0Y09mZnNldCBpbnN0ZWFkIG9mIGFjdHVhbCBVVEMgb2Zmc2V0c1xuICBpZiAoTWF0aC5hYnModXRjT2Zmc2V0KSA8PSAxMiAqIDYwKSB7XG4gICAgcmV0dXJuIHV0Yy51dGNPZmZzZXQodXRjT2Zmc2V0KS5mb3JtYXQoZm9ybWF0KTtcbiAgfVxuICAvLyB0aW1lWm9uZSBjb3VsZCBlaXRoZXIgYmUgYSB0aW1lIHpvbmUgbmFtZSBvclxuICAvLyBhbiBVVEMgb2Zmc2V0IGluIHNlY29uZHNcbiAgaWYgKF8uaW5jbHVkZXModGltZVpvbmUsICcvJykpIHtcbiAgICByZXR1cm4gdXRjLnR6KHRpbWVab25lKS5mb3JtYXQoZm9ybWF0KTtcbiAgfVxuICBpZiAoTWF0aC5hYnModGltZVpvbmUpIDw9IDEyICogNjAgKiA2MCkge1xuICAgIHJldHVybiB1dGMudXRjT2Zmc2V0KHRpbWVab25lIC8gNjApLmZvcm1hdChmb3JtYXQpO1xuICB9XG4gIGxvZy53YXJuKCdEaWQgbm90IGtub3cgaG93IHRvIGFwcGx5IHRoZSBVVEMgb2Zmc2V0LiBSZXR1cm5pbmcgdGhlIHRpbWVzdGFtcCB3aXRob3V0IGl0Jyk7XG4gIHJldHVybiB1dGMuZm9ybWF0KGZvcm1hdCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERldmljZVRpbWVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybWF0IFtZWVlZLU1NLUREVEhIOm1tOnNzWl0gLSBTZWUgZ2V0RGV2aWNlVGltZSNmb3JtYXRcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UgdGltZVxuICpcbiAqIEBwYXJhbSB7RGV2aWNlVGltZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldERldmljZVRpbWUgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VUaW1lKG9wdHMuZm9ybWF0KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dSZWN0ICgpIHtcbiAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuaGlkZUtleWJvYXJkID0gYXN5bmMgZnVuY3Rpb24gaGlkZUtleWJvYXJkIChzdHJhdGVneSwgLi4ucG9zc2libGVLZXlzKSB7XG4gIGlmICghKHRoaXMub3B0cy5kZXZpY2VOYW1lIHx8ICcnKS5pbmNsdWRlcygnaVBob25lJykpIHtcbiAgICAvLyBUT0RPOiBvbmNlIFdEQSBjYW4gaGFuZGxlIGRpc21pc3Npbmcga2V5Ym9hcmQgZm9yIGlwaG9uZSwgdGFrZSBhd2F5IGNvbmRpdGlvbmFsXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL2tleWJvYXJkL2Rpc21pc3MnLCAnUE9TVCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfVxuXG4gIGxvZy5kZWJ1ZygnQ2Fubm90IGRpc21pc3MgdGhlIGtleWJvYXJkIHVzaW5nIHRoZSBuYXRpdmUgY2FsbC4gVHJ5aW5nIHRvIGFwcGx5IGEgd29ya2Fyb3VuZC4uLicpO1xuXG4gIGxldCBrZXlib2FyZDtcbiAgdHJ5IHtcbiAgICBrZXlib2FyZCA9IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZUtleWJvYXJkJywgZmFsc2UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBubyBrZXlib2FyZCBmb3VuZFxuICAgIGxvZy5kZWJ1ZygnTm8ga2V5Ym9hcmQgZm91bmQuIFVuYWJsZSB0byBoaWRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBwb3NzaWJsZUtleXMucG9wKCk7IC8vIGxhc3QgcGFyYW1ldGVyIGlzIHRoZSBzZXNzaW9uIGlkXG4gIHBvc3NpYmxlS2V5cyA9IHBvc3NpYmxlS2V5cy5maWx0ZXIoKGVsZW1lbnQpID0+ICEhZWxlbWVudCk7IC8vIGdldCByaWQgb2YgdW5kZWZpbmVkIGVsZW1lbnRzXG4gIGlmIChwb3NzaWJsZUtleXMubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcG9zc2libGVLZXlzKSB7XG4gICAgICBsZXQgZWwgPSBfLmxhc3QoYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCBrZXksIHRydWUsIGtleWJvYXJkKSk7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGhpZGUga2V5Ym9hcmQgYnkgcHJlc3NpbmcgJyR7a2V5fScga2V5LmApO1xuICAgICAgICBhd2FpdCB0aGlzLm5hdGl2ZUNsaWNrKGVsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBmaW5kIHRoZSBrZXlib2FyZCwgYW5kIGhpdCB0aGUgbGFzdCBCdXR0b25cbiAgICBsb2cuZGVidWcoJ0ZpbmRpbmcga2V5Ym9hcmQgYW5kIGNsaWNraW5nIGZpbmFsIGJ1dHRvbiB0byBjbG9zZScpO1xuICAgIGlmIChhd2FpdCB0aGlzLmdldE5hdGl2ZUF0dHJpYnV0ZSgndmlzaWJsZScsIGtleWJvYXJkKSA9PT0gJ2ZhbHNlJykge1xuICAgICAgbG9nLmRlYnVnKCdObyB2aXNpYmxlIGtleWJvYXJkIGZvdW5kLiBSZXR1cm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGJ1dHRvbnMgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cygnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVCdXR0b24nLCB0cnVlLCBrZXlib2FyZCk7XG4gICAgaWYgKF8uaXNFbXB0eShidXR0b25zKSkge1xuICAgICAgbG9nLndhcm4oYE5vIGJ1dHRvbiBlbGVtZW50cyBmb3VuZC4gVW5hYmxlIHRvIGhpZGUuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubmF0aXZlQ2xpY2soXy5sYXN0KGJ1dHRvbnMpKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0U3RyaW5ncyA9IGlvc0NvbW1hbmRzLmdlbmVyYWwuZ2V0U3RyaW5ncztcblxuY29tbWFuZHMucmVtb3ZlQXBwID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQXBwIChidW5kbGVJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5tb2JpbGVSZW1vdmVBcHAoe2J1bmRsZUlkfSk7XG59O1xuXG5jb21tYW5kcy5sYXVuY2hBcHAgPSBpb3NDb21tYW5kcy5nZW5lcmFsLmxhdW5jaEFwcDtcblxuY29tbWFuZHMuY2xvc2VBcHAgPSBpb3NDb21tYW5kcy5nZW5lcmFsLmNsb3NlQXBwO1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25FcnJvcignQ29tbWFuZCBzaG91bGQgYmUgcHJveGllZCB0byBXREEnKTtcbiAgfVxuICBsZXQgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoYXdhaXQgdGhpcy5hY3RpdmUoKSk7XG4gIGlmIChfLmlzRW1wdHkoZWwpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hFbGVtZW50RXJyb3IoKTtcbiAgfVxuICBhd2FpdCB0aGlzLnNldFZhbHVlKGtleXMsIGVsKTtcbn07XG5cbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uIHNldFVybCAodXJsKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSAmJiB0aGlzLmlzUmVhbERldmljZSgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvdXJsJywgJ1BPU1QnLCB7dXJsfSk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGlvc0NvbW1hbmRzLmdlbmVyYWwuc2V0VXJsLmNhbGwodGhpcywgdXJsKTtcbn07XG5cbmNvbW1hbmRzLmdldFZpZXdwb3J0UmVjdCA9IGlvc0NvbW1hbmRzLmRldmljZS5nZXRWaWV3cG9ydFJlY3Q7XG5cbi8vIG1lbW9pemVkIGluIGNvbnN0cnVjdG9yXG5jb21tYW5kcy5nZXRTY3JlZW5JbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuSW5mbyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9zY3JlZW4nLCAnR0VUJyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdGF0dXNCYXJIZWlnaHQgPSBhc3luYyBmdW5jdGlvbiBnZXRTdGF0dXNCYXJIZWlnaHQgKCkge1xuICBjb25zdCB7c3RhdHVzQmFyU2l6ZX0gPSBhd2FpdCB0aGlzLmdldFNjcmVlbkluZm8oKTtcbiAgcmV0dXJuIHN0YXR1c0JhclNpemUuaGVpZ2h0O1xufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldERldmljZVBpeGVsUmF0aW8gPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQaXhlbFJhdGlvICgpIHtcbiAgY29uc3Qge3NjYWxlfSA9IGF3YWl0IHRoaXMuZ2V0U2NyZWVuSW5mbygpO1xuICByZXR1cm4gc2NhbGU7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVQcmVzc0J1dHRvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVByZXNzQnV0dG9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge25hbWV9ID0gb3B0cztcbiAgaWYgKCFuYW1lKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ0J1dHRvbiBuYW1lIGlzIG1hbmRhdG9yeScpO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9wcmVzc0J1dHRvbicsICdQT1NUJywge25hbWV9KTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVNpcmlDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2lyaUNvbW1hbmQgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dGV4dH0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUodGV4dCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnXCJ0ZXh0XCIgYXJndW1lbnQgaXMgbWFuZGF0b3J5Jyk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3NpcmkvYWN0aXZhdGUnLCAnUE9TVCcsIHt0ZXh0fSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcblxuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIGV4dGVuc2lvbnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=