UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

166 lines (123 loc) 22 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.initMJpegServer = initMJpegServer; exports.TEST_IMG_JPG = exports.MJpegStream = void 0; require("source-map-support/register"); var _lodash = _interopRequireDefault(require("lodash")); var _logger = _interopRequireDefault(require("./logger")); var _http = _interopRequireDefault(require("http")); var _bluebird = _interopRequireDefault(require("bluebird")); var _imageUtil = require("./image-util"); var _mjpegServer = _interopRequireDefault(require("mjpeg-server")); var _stream = require("stream"); var _node = require("./node"); var _axios = _interopRequireDefault(require("axios")); let MJpegConsumer = null; async function initMJpegConsumer() { if (!MJpegConsumer) { try { MJpegConsumer = await (0, _node.requirePackage)('mjpeg-consumer'); } catch (ign) {} } if (!MJpegConsumer) { throw new Error('mjpeg-consumer module is required to use MJPEG-over-HTTP features. ' + 'Please install it first (npm i -g mjpeg-consumer) and restart Appium.'); } } const TEST_IMG_JPG = '/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAeAAD/4QOBaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MCA3OS4xNjA0NTEsIDIwMTcvMDUvMDYtMDE6MDg6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NGY5ODc1OTctZGE2My00Y2M0LTkzNDMtNGYyNjgzMGUwNjk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjlDMzI3QkY0N0Q3NTExRThCMTlDOTVDMDc2RDE5MDY5IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjlDMzI3QkYzN0Q3NTExRThCMTlDOTVDMDc2RDE5MDY5IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NGY5ODc1OTctZGE2My00Y2M0LTkzNDMtNGYyNjgzMGUwNjk3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjRmOTg3NTk3LWRhNjMtNGNjNC05MzQzLTRmMjY4MzBlMDY5NyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoXHh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoaJjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/AABEIACAAIAMBIgACEQEDEQH/xABgAAEAAwEAAAAAAAAAAAAAAAAABAUHCAEBAAAAAAAAAAAAAAAAAAAAABAAAQMCAgsAAAAAAAAAAAAAAAECBBEDEgYhMRODo7PTVAUWNhEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8Az8AAdAAAAAAI8+fE8dEuTZtzZR7VMb6OdTE5GJoYirrUp/e8qd9wb3TGe/lJ2551sx8D/9k='; exports.TEST_IMG_JPG = TEST_IMG_JPG; const MJPEG_SERVER_TIMEOUT_MS = 10000; class MJpegStream extends _stream.Writable { constructor(mJpegUrl, errorHandler = _lodash.default.noop, options = {}) { super(options); this.errorHandler = errorHandler; this.url = mJpegUrl; this.clear(); } get lastChunkBase64() { return !_lodash.default.isEmpty(this.lastChunk) && _lodash.default.isBuffer(this.lastChunk) ? this.lastChunk.toString('base64') : null; } async lastChunkPNG() { if (_lodash.default.isEmpty(this.lastChunk) || !_lodash.default.isBuffer(this.lastChunk)) { return null; } try { const jpg = await (0, _imageUtil.getJimpImage)(this.lastChunk); return await jpg.getBuffer(_imageUtil.MIME_PNG); } catch (e) { return null; } } async lastChunkPNGBase64() { const png = await this.lastChunkPNG(); return png ? png.toString('base64') : null; } clear() { this.registerStartSuccess = null; this.registerStartFailure = null; this.responseStream = null; this.consumer = null; this.lastChunk = null; this.updateCount = 0; } async start(serverTimeout = MJPEG_SERVER_TIMEOUT_MS) { this.stop(); await initMJpegConsumer(); this.consumer = new MJpegConsumer(); const startPromise = new _bluebird.default((res, rej) => { this.registerStartSuccess = res; this.registerStartFailure = rej; }).timeout(serverTimeout, `Waited ${serverTimeout}ms but the MJPEG server never sent any images`); const onErr = err => { _logger.default.error(`Error getting MJpeg screenshot chunk: ${err.message}`); this.errorHandler(err); if (this.registerStartFailure) { this.registerStartFailure(err); } }; try { this.responseStream = (await (0, _axios.default)({ url: this.url, responseType: 'stream', timeout: serverTimeout })).data; } catch (e) { return onErr(e); } this.responseStream.on('error', onErr).pipe(this.consumer).pipe(this); await startPromise; } stop() { if (!this.consumer) { return; } this.responseStream.unpipe(this.consumer); this.consumer.unpipe(this); this.responseStream.destroy(); this.clear(); } write(data) { this.lastChunk = data; this.updateCount++; if (this.registerStartSuccess) { this.registerStartSuccess(); this.registerStartSuccess = null; } } } exports.MJpegStream = MJpegStream; function initMJpegServer(port, intMs = 300, times = 20) { const server = _http.default.createServer(async function (req, res) { const mJpegReqHandler = _mjpegServer.default.createReqHandler(req, res); const jpg = Buffer.from(TEST_IMG_JPG, 'base64'); for (let i = 0; i < times; i++) { await _bluebird.default.delay(intMs); mJpegReqHandler._write(jpg, null, _lodash.default.noop); } mJpegReqHandler.close(); }).listen(port); return server; }require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9tanBlZy5qcyJdLCJuYW1lcyI6WyJNSnBlZ0NvbnN1bWVyIiwiaW5pdE1KcGVnQ29uc3VtZXIiLCJpZ24iLCJFcnJvciIsIlRFU1RfSU1HX0pQRyIsIk1KUEVHX1NFUlZFUl9USU1FT1VUX01TIiwiTUpwZWdTdHJlYW0iLCJXcml0YWJsZSIsImNvbnN0cnVjdG9yIiwibUpwZWdVcmwiLCJlcnJvckhhbmRsZXIiLCJfIiwibm9vcCIsIm9wdGlvbnMiLCJ1cmwiLCJjbGVhciIsImxhc3RDaHVua0Jhc2U2NCIsImlzRW1wdHkiLCJsYXN0Q2h1bmsiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwibGFzdENodW5rUE5HIiwianBnIiwiZ2V0QnVmZmVyIiwiTUlNRV9QTkciLCJlIiwibGFzdENodW5rUE5HQmFzZTY0IiwicG5nIiwicmVnaXN0ZXJTdGFydFN1Y2Nlc3MiLCJyZWdpc3RlclN0YXJ0RmFpbHVyZSIsInJlc3BvbnNlU3RyZWFtIiwiY29uc3VtZXIiLCJ1cGRhdGVDb3VudCIsInN0YXJ0Iiwic2VydmVyVGltZW91dCIsInN0b3AiLCJzdGFydFByb21pc2UiLCJCIiwicmVzIiwicmVqIiwidGltZW91dCIsIm9uRXJyIiwiZXJyIiwibG9nIiwiZXJyb3IiLCJtZXNzYWdlIiwicmVzcG9uc2VUeXBlIiwiZGF0YSIsIm9uIiwicGlwZSIsInVucGlwZSIsImRlc3Ryb3kiLCJ3cml0ZSIsImluaXRNSnBlZ1NlcnZlciIsInBvcnQiLCJpbnRNcyIsInRpbWVzIiwic2VydmVyIiwiaHR0cCIsImNyZWF0ZVNlcnZlciIsInJlcSIsIm1KcGVnUmVxSGFuZGxlciIsIm1KcGVnU2VydmVyIiwiY3JlYXRlUmVxSGFuZGxlciIsIkJ1ZmZlciIsImZyb20iLCJpIiwiZGVsYXkiLCJfd3JpdGUiLCJjbG9zZSIsImxpc3RlbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FB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dkQsUUFBTUMsTUFBTSxHQUFHQyxjQUFLQyxZQUFMLENBQWtCLGdCQUFnQkMsR0FBaEIsRUFBcUJ0QixHQUFyQixFQUEwQjtBQUN6RCxVQUFNdUIsZUFBZSxHQUFHQyxxQkFBWUMsZ0JBQVosQ0FBNkJILEdBQTdCLEVBQWtDdEIsR0FBbEMsQ0FBeEI7O0FBQ0EsVUFBTWhCLEdBQUcsR0FBRzBDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZN0QsWUFBWixFQUEwQixRQUExQixDQUFaOztBQUdBLFNBQUssSUFBSThELENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdWLEtBQXBCLEVBQTJCVSxDQUFDLEVBQTVCLEVBQWdDO0FBQzlCLFlBQU03QixrQkFBRThCLEtBQUYsQ0FBUVosS0FBUixDQUFOOztBQUNBTSxNQUFBQSxlQUFlLENBQUNPLE1BQWhCLENBQXVCOUMsR0FBdkIsRUFBNEIsSUFBNUIsRUFBa0NYLGdCQUFFQyxJQUFwQztBQUNEOztBQUNEaUQsSUFBQUEsZUFBZSxDQUFDUSxLQUFoQjtBQUNELEdBVmMsRUFVWkMsTUFWWSxDQVVMaEIsSUFWSyxDQUFmOztBQVlBLFNBQU9HLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZ2V0SmltcEltYWdlLCBNSU1FX1BORyB9IGZyb20gJy4vaW1hZ2UtdXRpbCc7XG5pbXBvcnQgbUpwZWdTZXJ2ZXIgZnJvbSAnbWpwZWctc2VydmVyJztcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHJlcXVpcmVQYWNrYWdlIH0gZnJvbSAnLi9ub2RlJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cblxuLy8gbGF6eSBsb2FkIHRoaXMsIGFzIGl0IG1pZ2h0IG5vdCBiZSBhdmFpbGFibGVcbmxldCBNSnBlZ0NvbnN1bWVyID0gbnVsbDtcblxuLyoqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYG1qcGVnLWNvbnN1bWVyYCBtb2R1bGUgaXMgbm90IGluc3RhbGxlZCBvciBjYW5ub3QgYmUgbG9hZGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRNSnBlZ0NvbnN1bWVyICgpIHtcbiAgaWYgKCFNSnBlZ0NvbnN1bWVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIE1KcGVnQ29uc3VtZXIgPSBhd2FpdCByZXF1aXJlUGFja2FnZSgnbWpwZWctY29uc3VtZXInKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cbiAgaWYgKCFNSnBlZ0NvbnN1bWVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtanBlZy1jb25zdW1lciBtb2R1bGUgaXMgcmVxdWlyZWQgdG8gdXNlIE1KUEVHLW92ZXItSFRUUCBmZWF0dXJlcy4gJyArXG4gICAgICAgICAgICAgICAgICAgICdQbGVhc2UgaW5zdGFsbCBpdCBmaXJzdCAobnBtIGkgLWcgbWpwZWctY29uc3VtZXIpIGFuZCByZXN0YXJ0IEFwcGl1bS4nKTtcbiAgfVxufVxuXG5jb25zdCBURVNUX0lNR19KUEcgPSAnLzlqLzRRQVlSWGhwWmdBQVNVa3FBQWdBQUFBQUFBQUFBQUFBQVAvc0FCRkVkV05yZVFBQkFBUUFBQUFlQUFELzRRT0JhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMd0E4UDNod1lXTnJaWFFnWW1WbmFXNDlJdSs3dnlJZ2FXUTlJbGMxVFRCTmNFTmxhR2xJZW5KbFUzcE9WR042YTJNNVpDSS9QaUE4ZURwNGJYQnRaWFJoSUhodGJHNXpPbmc5SW1Ga2IySmxPbTV6T20xbGRHRXZJaUI0T25odGNIUnJQU0pCWkc5aVpTQllUVkFnUTI5eVpTQTFMall0WXpFME1DQTNPUzR4TmpBME5URXNJREl3TVRjdk1EVXZNRFl0TURFNk1EZzZNakVnSUNBZ0lDQWdJQ0krSUR4eVpHWTZVa1JHSUhodGJHNXpPbkprWmowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzh3TWk4eU1pMXlaR1l0YzNsdWRHRjRMVzV6SXlJK0lEeHlaR1k2UkdWelkzSnBjSFJwYjI0Z2NtUm1PbUZpYjNWMFBTSWlJSGh0Ykc1ek9uaHRjRTFOUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmJXMHZJaUI0Yld4dWN6cHpkRkpsWmowaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wzTlVlWEJsTDFKbGMyOTFjbU5sVW1WbUl5SWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJYQk5UVHBQY21sbmFXNWhiRVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TkdZNU9EYzFPVGN0WkdFMk15MDBZMk0wTFRrek5ETXROR1l5Tmpnek1HVXdOamszSWlCNGJYQk5UVHBFYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2psRE16STNRa1kwTjBRM05URXhSVGhDTVRsRE9UVkRNRGMyUkRFNU1EWTVJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPamxETXpJM1FrWXpOMFEzTlRFeFJUaENNVGxET1RWRE1EYzJSREU1TURZNUlpQjRiWEE2UTNKbFlYUnZjbFJ2YjJ3OUlrRmtiMkpsSUZCb2IzUnZjMmh2Y0NCRFF5QXlNREU0SUNoTllXTnBiblJ2YzJncElqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZOR1k1T0RjMU9UY3RaR0UyTXkwMFkyTTBMVGt6TkRNdE5HWXlOamd6TUdVd05qazNJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPalJtT1RnM05UazNMV1JoTmpNdE5HTmpOQzA1TXpRekxUUm1Nalk0TXpCbE1EWTVOeUl2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHYvdUFBNUJaRzlpWlFCa3dBQUFBQUgvMndDRUFCQUxDd3NNQ3hBTURCQVhEdzBQRnhzVUVCQVVHeDhYRnhjWEZ4OGVGeG9hR2hvWEhoNGpKU2NsSXg0dkx6TXpMeTlBUUVCQVFFQkFRRUJBUUVCQVFFQUJFUThQRVJNUkZSSVNGUlFSRkJFVUdoUVdGaFFhSmhvYUhCb2FKakFqSGg0ZUhpTXdLeTRuSnljdUt6VTFNREExTlVCQVAwQkFRRUJBUUVCQVFFQkFRUC9BQUJFSUFDQUFJQU1CSWdBQ0VRRURFUUgveEFCZ0FBRUFBd0VBQUFBQUFBQUFBQUFBQUFBQUJBVUhDQUVCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQVFNQ0Fnc0FBQUFBQUFBQUFBQUFBQUVDQkJFREVnWWhNUk9EbzdQVFZBVVdOaEVCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9hQUF3REFRQUNFUU1SQUQ4QXo4QUFkQUFBQUFBSTgrZkU4ZEV1VFp0elpSN1ZNYjZPZFRFNUdKb1lpcnJVcC9lOHFkOXdiM1RHZS9sSjI1NTFzeDhELzlrPSc7XG5cbi8vIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCBpbWFnZSBpbiB0aGUgc3RyZWFtXG5jb25zdCBNSlBFR19TRVJWRVJfVElNRU9VVF9NUyA9IDEwMDAwO1xuXG4vKiogQ2xhc3Mgd2hpY2ggc3RvcmVzIHRoZSBsYXN0IGJpdCBvZiBkYXRhIHN0cmVhbWVkIGludG8gaXQgKi9cbmNsYXNzIE1KcGVnU3RyZWFtIGV4dGVuZHMgV3JpdGFibGUge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gTUpwZWdTdHJlYW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1KcGVnVXJsIC0gVVJMIG9mIE1KUEVHLW92ZXItSFRUUCBzdHJlYW1cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2Vycm9ySGFuZGxlcj1ub29wXSAtIGFkZGl0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlXG4gICAqIGNhbGxlZCBpbiB0aGUgY2FzZSBvZiBhbnkgZXJyb3JzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBXcml0YWJsZSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IgKG1KcGVnVXJsLCBlcnJvckhhbmRsZXIgPSBfLm5vb3AsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG4gICAgdGhpcy51cmwgPSBtSnBlZ1VybDtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlNjQtZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBKUEVHXG4gICAqXG4gICAqIEByZXR1cm5zIHs/c3RyaW5nfSBiYXNlNjQtZW5jb2RlZCBKUEVHIGltYWdlIGRhdGFcbiAgICogb3IgYG51bGxgIGlmIG5vIGltYWdlIGNhbiBiZSBwYXJzZWRcbiAgICovXG4gIGdldCBsYXN0Q2h1bmtCYXNlNjQgKCkge1xuICAgIHJldHVybiAhXy5pc0VtcHR5KHRoaXMubGFzdENodW5rKSAmJiBfLmlzQnVmZmVyKHRoaXMubGFzdENodW5rKVxuICAgICAgPyB0aGlzLmxhc3RDaHVuay50b1N0cmluZygnYmFzZTY0JylcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFBORyB2ZXJzaW9uIG9mIHRoZSBKUEVHIGJ1ZmZlclxuICAgKlxuICAgKiBAcmV0dXJucyB7P0J1ZmZlcn0gUE5HIGltYWdlIGRhdGEgb3IgYG51bGxgIGlmIG5vIFBOR1xuICAgKiBpbWFnZSBjYW4gYmUgcGFyc2VkXG4gICAqL1xuICBhc3luYyBsYXN0Q2h1bmtQTkcgKCkge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5sYXN0Q2h1bmspIHx8ICFfLmlzQnVmZmVyKHRoaXMubGFzdENodW5rKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGpwZyA9IGF3YWl0IGdldEppbXBJbWFnZSh0aGlzLmxhc3RDaHVuayk7XG4gICAgICByZXR1cm4gYXdhaXQganBnLmdldEJ1ZmZlcihNSU1FX1BORyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmFzZTY0LWVuY29kZWQgdmVyc2lvbiBvZiB0aGUgUE5HXG4gICAqXG4gICAqIEByZXR1cm5zIHs/c3RyaW5nfSBiYXNlNjQtZW5jb2RlZCBQTkcgaW1hZ2UgZGF0YVxuICAgKiBvciBgbnVsbGAgaWYgbm8gaW1hZ2UgY2FuIGJlIHBhcnNlZFxuICAgKi9cbiAgYXN5bmMgbGFzdENodW5rUE5HQmFzZTY0ICgpIHtcbiAgICBjb25zdCBwbmcgPSBhd2FpdCB0aGlzLmxhc3RDaHVua1BORygpO1xuICAgIHJldHVybiBwbmcgPyBwbmcudG9TdHJpbmcoJ2Jhc2U2NCcpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBpbnRlcm5hbCBzdGF0ZVxuICAgKi9cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMucmVnaXN0ZXJTdGFydFN1Y2Nlc3MgPSBudWxsO1xuICAgIHRoaXMucmVnaXN0ZXJTdGFydEZhaWx1cmUgPSBudWxsO1xuICAgIHRoaXMucmVzcG9uc2VTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMuY29uc3VtZXIgPSBudWxsO1xuICAgIHRoaXMubGFzdENodW5rID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZUNvdW50ID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCByZWFkaW5nIHRoZSBNSnBlZyBzdHJlYW0gYW5kIHN0b3JpbmcgdGhlIGxhc3QgaW1hZ2VcbiAgICovXG4gIGFzeW5jIHN0YXJ0IChzZXJ2ZXJUaW1lb3V0ID0gTUpQRUdfU0VSVkVSX1RJTUVPVVRfTVMpIHtcbiAgICAvLyBlbnN1cmUgd2UncmUgbm90IHN0YXJ0ZWQgYWxyZWFkeVxuICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgYXdhaXQgaW5pdE1KcGVnQ29uc3VtZXIoKTtcblxuICAgIHRoaXMuY29uc3VtZXIgPSBuZXcgTUpwZWdDb25zdW1lcigpO1xuXG4gICAgLy8gdXNlIHRoZSBkZWZlcnJlZCBwYXR0ZXJuIHNvIHdlIGNhbiB3YWl0IGZvciB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbVxuICAgIC8vIGJhc2VkIG9uIHdoYXQgY29tZXMgaW4gZnJvbSBhbiBleHRlcm5hbCBwaXBlXG4gICAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3IEIoKHJlcywgcmVqKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3RhcnRTdWNjZXNzID0gcmVzO1xuICAgICAgdGhpcy5yZWdpc3RlclN0YXJ0RmFpbHVyZSA9IHJlajtcbiAgICB9KVxuICAgIC8vIHN0YXJ0IGEgdGltZW91dCBzbyB0aGF0IGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgcmV0dXJuIGRhdGEsIHdlIGRvbid0XG4gICAgLy8gYmxvY2sgZm9yZXZlci5cbiAgICAgIC50aW1lb3V0KHNlcnZlclRpbWVvdXQsXG4gICAgICAgIGBXYWl0ZWQgJHtzZXJ2ZXJUaW1lb3V0fW1zIGJ1dCB0aGUgTUpQRUcgc2VydmVyIG5ldmVyIHNlbnQgYW55IGltYWdlc2ApO1xuXG4gICAgY29uc3Qgb25FcnIgPSAoZXJyKSA9PiB7XG4gICAgICBsb2cuZXJyb3IoYEVycm9yIGdldHRpbmcgTUpwZWcgc2NyZWVuc2hvdCBjaHVuazogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyKGVycik7XG4gICAgICBpZiAodGhpcy5yZWdpc3RlclN0YXJ0RmFpbHVyZSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU3RhcnRGYWlsdXJlKGVycik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlc3BvbnNlU3RyZWFtID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnc3RyZWFtJyxcbiAgICAgICAgdGltZW91dDogc2VydmVyVGltZW91dCxcbiAgICAgIH0pKS5kYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBvbkVycihlKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3BvbnNlU3RyZWFtXG4gICAgICAub24oJ2Vycm9yJywgb25FcnIpIC8vIGVuc3VyZSB3ZSBkbyBzb21ldGhpbmcgd2l0aCBlcnJvcnNcbiAgICAgIC5waXBlKHRoaXMuY29uc3VtZXIpIC8vIGFsbG93IGNodW5raW5nIGFuZCB0cmFuc2Zvcm1pbmcgb2YganBlZyBkYXRhXG4gICAgICAucGlwZSh0aGlzKTsgLy8gc2VuZCB0aGUgYWN0dWFsIGpwZWdzIHRvIG91cnNlbGZcblxuICAgIGF3YWl0IHN0YXJ0UHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHJlYWRpbmcgdGhlIE1KcGVnIHN0cmVhbS4gRW5zdXJlIHdlIGRpc2Nvbm5lY3QgYWxsIHRoZSBwaXBlcyBhbmQgc3RvcFxuICAgKiB0aGUgSFRUUCByZXF1ZXN0IGl0c2VsZi4gVGhlbiByZXNldCB0aGUgc3RhdGUuXG4gICAqL1xuICBzdG9wICgpIHtcbiAgICBpZiAoIXRoaXMuY29uc3VtZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3BvbnNlU3RyZWFtLnVucGlwZSh0aGlzLmNvbnN1bWVyKTtcbiAgICB0aGlzLmNvbnN1bWVyLnVucGlwZSh0aGlzKTtcbiAgICB0aGlzLnJlc3BvbnNlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIFdyaXRhYmxlIHdyaXRlKCkgbWV0aG9kIGluIG9yZGVyIHRvIHNhdmUgdGhlIGxhc3QgaW1hZ2UgYW5kXG4gICAqIGxvZyB0aGUgbnVtYmVyIG9mIGltYWdlcyB3ZSBoYXZlIHJlY2VpdmVkXG4gICAqIEBvdmVycmlkZVxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIGJpbmFyeSBkYXRhIHN0cmVhbWVkIGZyb20gdGhlIE1KcGVnIGNvbnN1bWVyXG4gICAqL1xuICB3cml0ZSAoZGF0YSkge1xuICAgIHRoaXMubGFzdENodW5rID0gZGF0YTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50Kys7XG5cbiAgICBpZiAodGhpcy5yZWdpc3RlclN0YXJ0U3VjY2Vzcykge1xuICAgICAgdGhpcy5yZWdpc3RlclN0YXJ0U3VjY2VzcygpO1xuICAgICAgdGhpcy5yZWdpc3RlclN0YXJ0U3VjY2VzcyA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3RhcnQgYW4gbWpwZWcgc2VydmVyIGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nLCB3aGljaCBqdXN0IHNlbmRzIHRoZSBzYW1lXG4gKiBpbWFnZSBvdmVyIGFuZCBvdmVyLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHNlcnZlci5cbiAqIEBwYXJhbSB7aW50fSBwb3J0IC0gcG9ydCB0aGUgc2VydmVyIHNob3VsZCBsaXN0ZW4gb25cbiAqIEBwYXJhbSB7aW50fSBbaW50TXNdIC0gaG93IG9mdGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIHB1c2ggYW4gaW1hZ2VcbiAqIEBwYXJhbSB7aW50fSBbdGltZXNdIC0gaG93IG1hbnkgdGltZXMgdGhlIHNlcnZlciBzaG91bGQgcHVzaCBhbiBpbWFnZSBiZWZvcmVcbiAqIGl0IGNsb3NlcyB0aGUgY29ubmVjdGlvblxuICogQHJldHVybnMge2h0dHAuU2VydmVyfVxuICovXG5mdW5jdGlvbiBpbml0TUpwZWdTZXJ2ZXIgKHBvcnQsIGludE1zID0gMzAwLCB0aW1lcyA9IDIwKSB7XG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIGZ1bmN0aW9uIChyZXEsIHJlcykge1xuICAgIGNvbnN0IG1KcGVnUmVxSGFuZGxlciA9IG1KcGVnU2VydmVyLmNyZWF0ZVJlcUhhbmRsZXIocmVxLCByZXMpO1xuICAgIGNvbnN0IGpwZyA9IEJ1ZmZlci5mcm9tKFRFU1RfSU1HX0pQRywgJ2Jhc2U2NCcpO1xuXG4gICAgLy8ganVzdCBzZW5kIHRoZSBzYW1lIGpwZWcgb3ZlciBhbmQgb3ZlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGltZXM7IGkrKykge1xuICAgICAgYXdhaXQgQi5kZWxheShpbnRNcyk7XG4gICAgICBtSnBlZ1JlcUhhbmRsZXIuX3dyaXRlKGpwZywgbnVsbCwgXy5ub29wKTtcbiAgICB9XG4gICAgbUpwZWdSZXFIYW5kbGVyLmNsb3NlKCk7XG4gIH0pLmxpc3Rlbihwb3J0KTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuXG5leHBvcnQgeyBNSnBlZ1N0cmVhbSwgaW5pdE1KcGVnU2VydmVyLCBURVNUX0lNR19KUEcgfTtcbiJdLCJmaWxlIjoibGliL21qcGVnLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=