@appium/base-driver 8.2.3 → 8.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/basedriver/capabilities.js +2 -4
- package/build/lib/basedriver/commands/event.js +2 -4
- package/build/lib/basedriver/commands/find.js +5 -14
- package/build/lib/basedriver/commands/index.js +2 -4
- package/build/lib/basedriver/commands/log.js +4 -9
- package/build/lib/basedriver/commands/session.js +19 -30
- package/build/lib/basedriver/commands/settings.js +5 -11
- package/build/lib/basedriver/commands/timeout.js +11 -18
- package/build/lib/basedriver/desired-caps.js +2 -4
- package/build/lib/basedriver/device-settings.js +15 -5
- package/build/lib/basedriver/driver.js +36 -23
- package/build/lib/basedriver/helpers.js +10 -12
- package/build/lib/basedriver/logger.js +2 -4
- package/build/lib/constants.js +2 -4
- package/build/lib/express/crash.js +2 -4
- package/build/lib/express/express-logging.js +3 -5
- package/build/lib/express/idempotency.js +3 -5
- package/build/lib/express/logger.js +2 -4
- package/build/lib/express/middleware.js +2 -4
- package/build/lib/express/server.js +2 -4
- package/build/lib/express/static.js +2 -4
- package/build/lib/express/websocket.js +2 -4
- package/build/lib/helpers/capabilities.js +37 -0
- package/build/lib/index.js +4 -8
- package/build/lib/jsonwp-proxy/protocol-converter.js +19 -15
- package/build/lib/jsonwp-proxy/proxy.js +20 -15
- package/build/lib/jsonwp-status/status.js +2 -4
- package/build/lib/protocol/errors.js +2 -4
- package/build/lib/protocol/helpers.js +2 -4
- package/build/lib/protocol/index.js +2 -4
- package/build/lib/protocol/protocol.js +37 -30
- package/build/lib/protocol/routes.js +68 -4
- package/build/lib/protocol/validators.js +2 -4
- package/build/test/basedriver/README.md +5 -0
- package/build/test/basedriver/driver-e2e-tests.js +2 -4
- package/build/test/basedriver/driver-tests.js +12 -17
- package/build/test/basedriver/index.js +2 -4
- package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +82 -0
- package/build/test/e2e/express/server.e2e.spec.js +159 -0
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
- package/build/test/e2e/protocol/fake-driver.js +163 -0
- package/build/test/e2e/protocol/helpers.js +25 -0
- package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
- package/build/test/helpers.js +2 -4
- package/build/test/unit/basedriver/capabilities.spec.js +672 -0
- package/build/test/unit/basedriver/capability.spec.js +353 -0
- package/build/test/unit/basedriver/commands/event.spec.js +110 -0
- package/build/test/unit/basedriver/commands/log.spec.js +85 -0
- package/build/test/unit/basedriver/driver.spec.js +15 -0
- package/build/test/unit/basedriver/helpers.spec.js +151 -0
- package/build/test/unit/basedriver/timeout.spec.js +135 -0
- package/build/test/unit/express/server.spec.js +155 -0
- package/build/test/unit/express/static.spec.js +26 -0
- package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
- package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
- package/build/test/unit/jsonwp-status/status.spec.js +34 -0
- package/build/test/unit/protocol/errors.spec.js +390 -0
- package/build/test/unit/protocol/routes.spec.js +80 -0
- package/build/test/unit/protocol/validator.spec.js +149 -0
- package/lib/basedriver/commands/find.js +3 -6
- package/lib/basedriver/commands/log.js +2 -4
- package/lib/basedriver/commands/session.js +21 -22
- package/lib/basedriver/commands/settings.js +3 -5
- package/lib/basedriver/commands/timeout.js +9 -10
- package/lib/basedriver/device-settings.js +10 -1
- package/lib/basedriver/driver.js +36 -12
- package/lib/basedriver/helpers.js +13 -11
- package/lib/express/express-logging.js +1 -1
- package/lib/express/idempotency.js +1 -1
- package/lib/helpers/capabilities.js +25 -0
- package/lib/index.js +2 -2
- package/lib/jsonwp-proxy/protocol-converter.js +14 -13
- package/lib/jsonwp-proxy/proxy.js +16 -12
- package/lib/protocol/protocol.js +34 -29
- package/lib/protocol/routes.js +60 -1
- package/package.json +36 -24
- package/test/basedriver/README.md +5 -0
- package/test/basedriver/driver-e2e-tests.js +1 -1
- package/test/basedriver/driver-tests.js +12 -7
- package/build/lib/protocol/sessions-cache.js +0 -88
- package/build/test/basedriver/capabilities-specs.js +0 -632
- package/build/test/basedriver/capability-specs.js +0 -396
- package/build/test/basedriver/commands/event-specs.js +0 -112
- package/build/test/basedriver/commands/log-specs.js +0 -80
- package/build/test/basedriver/driver-e2e-specs.js +0 -17
- package/build/test/basedriver/driver-specs.js +0 -17
- package/build/test/basedriver/helpers-e2e-specs.js +0 -194
- package/build/test/basedriver/helpers-specs.js +0 -153
- package/build/test/basedriver/timeout-specs.js +0 -139
- package/build/test/basedriver/websockets-e2e-specs.js +0 -84
- package/build/test/express/server-e2e-specs.js +0 -156
- package/build/test/express/server-specs.js +0 -151
- package/build/test/express/static-specs.js +0 -23
- package/build/test/jsonwp-proxy/mock-request.js +0 -93
- package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
- package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
- package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
- package/build/test/jsonwp-proxy/url-specs.js +0 -167
- package/build/test/jsonwp-status/status-specs.js +0 -36
- package/build/test/protocol/errors-specs.js +0 -388
- package/build/test/protocol/fake-driver.js +0 -168
- package/build/test/protocol/helpers.js +0 -27
- package/build/test/protocol/protocol-e2e-specs.js +0 -1182
- package/build/test/protocol/routes-specs.js +0 -82
- package/build/test/protocol/validator-specs.js +0 -151
- package/lib/protocol/sessions-cache.js +0 -74
- package/test/basedriver/capabilities-specs.js +0 -505
- package/test/basedriver/capability-specs.js +0 -409
- package/test/basedriver/commands/event-specs.js +0 -74
- package/test/basedriver/commands/log-specs.js +0 -70
- package/test/basedriver/driver-e2e-specs.js +0 -8
- package/test/basedriver/driver-specs.js +0 -8
- package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
- package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
- package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
- package/test/basedriver/fixtures/custom-element-finder.js +0 -29
- package/test/basedriver/helpers-e2e-specs.js +0 -187
- package/test/basedriver/helpers-specs.js +0 -137
- package/test/basedriver/timeout-specs.js +0 -133
- package/test/basedriver/websockets-e2e-specs.js +0 -75
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _log = _interopRequireDefault(require("../../../lib/basedriver/commands/log"));
|
|
8
|
-
|
|
9
|
-
var _sinon = _interopRequireDefault(require("sinon"));
|
|
10
|
-
|
|
11
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
12
|
-
|
|
13
|
-
const expect = chai.expect;
|
|
14
|
-
const FIRST_LOGS = ['first', 'logs'];
|
|
15
|
-
const SECOND_LOGS = ['second', 'logs'];
|
|
16
|
-
const SUPPORTED_LOG_TYPES = {
|
|
17
|
-
one: {
|
|
18
|
-
description: 'First logs',
|
|
19
|
-
getter: () => _lodash.default.clone(FIRST_LOGS)
|
|
20
|
-
},
|
|
21
|
-
two: {
|
|
22
|
-
description: 'Seconds logs',
|
|
23
|
-
getter: () => _lodash.default.clone(SECOND_LOGS)
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
describe('log commands -', function () {
|
|
27
|
-
beforeEach(function () {
|
|
28
|
-
_log.default.supportedLogTypes = {};
|
|
29
|
-
});
|
|
30
|
-
describe('getLogTypes', function () {
|
|
31
|
-
it('should return empty array when no supported log types', async function () {
|
|
32
|
-
(await _log.default.getLogTypes()).should.eql([]);
|
|
33
|
-
});
|
|
34
|
-
it('should return keys to log type object', async function () {
|
|
35
|
-
_log.default.supportedLogTypes = SUPPORTED_LOG_TYPES;
|
|
36
|
-
(await _log.default.getLogTypes()).should.eql(['one', 'two']);
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
describe('getLog', function () {
|
|
40
|
-
beforeEach(function () {
|
|
41
|
-
_sinon.default.spy(SUPPORTED_LOG_TYPES.one, 'getter');
|
|
42
|
-
|
|
43
|
-
_sinon.default.spy(SUPPORTED_LOG_TYPES.two, 'getter');
|
|
44
|
-
});
|
|
45
|
-
afterEach(function () {
|
|
46
|
-
SUPPORTED_LOG_TYPES.one.getter.restore();
|
|
47
|
-
SUPPORTED_LOG_TYPES.two.getter.restore();
|
|
48
|
-
});
|
|
49
|
-
it('should throw error if log type not supported', async function () {
|
|
50
|
-
await _log.default.getLog('one').should.eventually.be.rejected;
|
|
51
|
-
SUPPORTED_LOG_TYPES.one.getter.called.should.be.false;
|
|
52
|
-
SUPPORTED_LOG_TYPES.two.getter.called.should.be.false;
|
|
53
|
-
});
|
|
54
|
-
it('should throw an error with available log types if log type not supported', async function () {
|
|
55
|
-
_log.default.supportedLogTypes = SUPPORTED_LOG_TYPES;
|
|
56
|
-
let err;
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
await _log.default.getLog('three');
|
|
60
|
-
} catch (_err) {
|
|
61
|
-
err = _err;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
expect(err).to.exist;
|
|
65
|
-
err.message.should.eql(`Unsupported log type 'three'. Supported types: {"one":"First logs","two":"Seconds logs"}`);
|
|
66
|
-
SUPPORTED_LOG_TYPES.one.getter.called.should.be.false;
|
|
67
|
-
SUPPORTED_LOG_TYPES.two.getter.called.should.be.false;
|
|
68
|
-
});
|
|
69
|
-
it('should call getter on appropriate log when found', async function () {
|
|
70
|
-
_log.default.supportedLogTypes = SUPPORTED_LOG_TYPES;
|
|
71
|
-
let logs = await _log.default.getLog('one');
|
|
72
|
-
logs.should.eql(FIRST_LOGS);
|
|
73
|
-
SUPPORTED_LOG_TYPES.one.getter.called.should.be.true;
|
|
74
|
-
SUPPORTED_LOG_TYPES.two.getter.called.should.be.false;
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
});require('source-map-support').install();
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9jb21tYW5kcy9sb2ctc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsIkZJUlNUX0xPR1MiLCJTRUNPTkRfTE9HUyIsIlNVUFBPUlRFRF9MT0dfVFlQRVMiLCJvbmUiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsIl8iLCJjbG9uZSIsInR3byIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsImxvZ0NvbW1hbmRzIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJpdCIsImdldExvZ1R5cGVzIiwic2hvdWxkIiwiZXFsIiwic2lub24iLCJzcHkiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwiZ2V0TG9nIiwiZXZlbnR1YWxseSIsImJlIiwicmVqZWN0ZWQiLCJjYWxsZWQiLCJmYWxzZSIsImVyciIsIl9lcnIiLCJ0byIsImV4aXN0IiwibWVzc2FnZSIsImxvZ3MiLCJ0cnVlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxNQUFNLEdBQUdDLElBQUksQ0FBQ0QsTUFBcEI7QUFFQSxNQUFNRSxVQUFVLEdBQUcsQ0FBQyxPQUFELEVBQVUsTUFBVixDQUFuQjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxDQUFDLFFBQUQsRUFBVyxNQUFYLENBQXBCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUc7QUFDMUJDLEVBQUFBLEdBQUcsRUFBRTtBQUNIQyxJQUFBQSxXQUFXLEVBQUUsWUFEVjtBQUVIQyxJQUFBQSxNQUFNLEVBQUUsTUFBTUMsZ0JBQUVDLEtBQUYsQ0FBUVAsVUFBUjtBQUZYLEdBRHFCO0FBSzFCUSxFQUFBQSxHQUFHLEVBQUU7QUFDSEosSUFBQUEsV0FBVyxFQUFFLGNBRFY7QUFFSEMsSUFBQUEsTUFBTSxFQUFFLE1BQU1DLGdCQUFFQyxLQUFGLENBQVFOLFdBQVI7QUFGWDtBQUxxQixDQUE1QjtBQVdBUSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtBQUNyQ0MsRUFBQUEsVUFBVSxDQUFDLFlB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LE1BQUwsQ0FBWUMsR0FBWixDQUFnQmhCLFVBQWhCO0FBQ0FFLE1BQUFBLG1CQUFtQixDQUFDQyxHQUFwQixDQUF3QkUsTUFBeEIsQ0FBK0JvQixNQUEvQixDQUFzQ1YsTUFBdEMsQ0FBNkNRLEVBQTdDLENBQWdEVSxJQUFoRDtBQUNBL0IsTUFBQUEsbUJBQW1CLENBQUNNLEdBQXBCLENBQXdCSCxNQUF4QixDQUErQm9CLE1BQS9CLENBQXNDVixNQUF0QyxDQUE2Q1EsRUFBN0MsQ0FBZ0RHLEtBQWhEO0FBQ0QsS0FOQyxDQUFGO0FBT0QsR0FsQ08sQ0FBUjtBQW1DRCxDQWpETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZ0NvbW1hbmRzIGZyb20gJy4uLy4uLy4uL2xpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2xvZyc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY29uc3QgRklSU1RfTE9HUyA9IFsnZmlyc3QnLCAnbG9ncyddO1xuY29uc3QgU0VDT05EX0xPR1MgPSBbJ3NlY29uZCcsICdsb2dzJ107XG5jb25zdCBTVVBQT1JURURfTE9HX1RZUEVTID0ge1xuICBvbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpcnN0IGxvZ3MnLFxuICAgIGdldHRlcjogKCkgPT4gXy5jbG9uZShGSVJTVF9MT0dTKSxcbiAgfSxcbiAgdHdvOiB7XG4gICAgZGVzY3JpcHRpb246ICdTZWNvbmRzIGxvZ3MnLFxuICAgIGdldHRlcjogKCkgPT4gXy5jbG9uZShTRUNPTkRfTE9HUyksXG4gIH0sXG59O1xuXG5kZXNjcmliZSgnbG9nIGNvbW1hbmRzIC0nLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIC8vIHJlc2V0IHRoZSBzdXBwb3J0ZWQgbG9nIHR5cGVzXG4gICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7fTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdnZXRMb2dUeXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBhcnJheSB3aGVuIG5vIHN1cHBvcnRlZCBsb2cgdHlwZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAoYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nVHlwZXMoKSkuc2hvdWxkLmVxbChbXSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4ga2V5cyB0byBsb2cgdHlwZSBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsb2dDb21tYW5kcy5zdXBwb3J0ZWRMb2dUeXBlcyA9IFNVUFBPUlRFRF9MT0dfVFlQRVM7XG4gICAgICAoYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nVHlwZXMoKSkuc2hvdWxkLmVxbChbJ29uZScsICd0d28nXSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0TG9nJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3B5KFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLCAnZ2V0dGVyJyk7XG4gICAgICBzaW5vbi5zcHkoU1VQUE9SVEVEX0xPR19UWVBFUy50d28sICdnZXR0ZXInKTtcbiAgICB9KTtcbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUuZ2V0dGVyLnJlc3RvcmUoKTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLmdldHRlci5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBsb2cgdHlwZSBub3Qgc3VwcG9ydGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nKCdvbmUnKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZDtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy50d28uZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aXRoIGF2YWlsYWJsZSBsb2cgdHlwZXMgaWYgbG9nIHR5cGUgbm90IHN1cHBvcnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvZ0NvbW1hbmRzLnN1cHBvcnRlZExvZ1R5cGVzID0gU1VQUE9SVEVEX0xPR19UWVBFUztcbiAgICAgIGxldCBlcnI7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBsb2dDb21tYW5kcy5nZXRMb2coJ3RocmVlJyk7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIGVyciA9IF9lcnI7XG4gICAgICB9XG4gICAgICBleHBlY3QoZXJyKS50by5leGlzdDtcbiAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5lcWwoYFVuc3VwcG9ydGVkIGxvZyB0eXBlICd0aHJlZScuIFN1cHBvcnRlZCB0eXBlczoge1wib25lXCI6XCJGaXJzdCBsb2dzXCIsXCJ0d29cIjpcIlNlY29uZHMgbG9nc1wifWApO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUuZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgICBTVVBQT1JURURfTE9HX1RZUEVTLnR3by5nZXR0ZXIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZ2V0dGVyIG9uIGFwcHJvcHJpYXRlIGxvZyB3aGVuIGZvdW5kJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSBTVVBQT1JURURfTE9HX1RZUEVTO1xuICAgICAgbGV0IGxvZ3MgPSBhd2FpdCBsb2dDb21tYW5kcy5nZXRMb2coJ29uZScpO1xuICAgICAgbG9ncy5zaG91bGQuZXFsKEZJUlNUX0xPR1MpO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUuZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUudHJ1ZTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2Jhc2Vkcml2ZXIvY29tbWFuZHMvbG9nLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uIn0=
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lib = _interopRequireDefault(require("../../lib"));
|
|
8
|
-
|
|
9
|
-
var _driverE2eTests = _interopRequireDefault(require("./driver-e2e-tests"));
|
|
10
|
-
|
|
11
|
-
(0, _driverE2eTests.default)(_lib.default, {
|
|
12
|
-
platformName: 'iOS',
|
|
13
|
-
'appium:deviceName': 'Delorean'
|
|
14
|
-
});require('source-map-support').install();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9kcml2ZXItZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbIkJhc2VEcml2ZXIiLCJwbGF0Zm9ybU5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBLDZCQUFtQkEsWUFBbkIsRUFBK0I7QUFDN0JDLEVBQUFBLFlBQVksRUFBRSxLQURlO0FBRTdCLHVCQUFxQjtBQUZRLENBQS9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCBCYXNlRHJpdmVyIGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgYmFzZURyaXZlckUyRVRlc3RzIGZyb20gJy4vZHJpdmVyLWUyZS10ZXN0cyc7XG5iYXNlRHJpdmVyRTJFVGVzdHMoQmFzZURyaXZlciwge1xuICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nXG59KTtcbiJdLCJmaWxlIjoidGVzdC9iYXNlZHJpdmVyL2RyaXZlci1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lib = _interopRequireDefault(require("../../lib"));
|
|
8
|
-
|
|
9
|
-
var _driverTests = _interopRequireDefault(require("./driver-tests"));
|
|
10
|
-
|
|
11
|
-
(0, _driverTests.default)(_lib.default, {
|
|
12
|
-
platformName: 'iOS',
|
|
13
|
-
'appium:deviceName': 'Delorean'
|
|
14
|
-
});require('source-map-support').install();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9kcml2ZXItc3BlY3MuanMiXSwibmFtZXMiOlsiQmFzZURyaXZlciIsInBsYXRmb3JtTmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0EsMEJBQW9CQSxZQUFwQixFQUFnQztBQUM5QkMsRUFBQUEsWUFBWSxFQUFFLEtBRGdCO0FBRTlCLHVCQUFxQjtBQUZTLENBQWhDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCBCYXNlRHJpdmVyIGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgYmFzZURyaXZlclVuaXRUZXN0cyBmcm9tICcuL2RyaXZlci10ZXN0cyc7XG5iYXNlRHJpdmVyVW5pdFRlc3RzKEJhc2VEcml2ZXIsIHtcbiAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJ1xufSk7XG4iXSwiZmlsZSI6InRlc3QvYmFzZWRyaXZlci9kcml2ZXItc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _path = _interopRequireDefault(require("path"));
|
|
8
|
-
|
|
9
|
-
var _url = _interopRequireDefault(require("url"));
|
|
10
|
-
|
|
11
|
-
var _support = require("@appium/support");
|
|
12
|
-
|
|
13
|
-
var _helpers = require("../../lib/basedriver/helpers");
|
|
14
|
-
|
|
15
|
-
var _http = _interopRequireDefault(require("http"));
|
|
16
|
-
|
|
17
|
-
var _finalhandler = _interopRequireDefault(require("finalhandler"));
|
|
18
|
-
|
|
19
|
-
var _serveStatic = _interopRequireDefault(require("serve-static"));
|
|
20
|
-
|
|
21
|
-
var _contentDisposition = _interopRequireDefault(require("content-disposition"));
|
|
22
|
-
|
|
23
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
24
|
-
|
|
25
|
-
var _helpers2 = require("../helpers");
|
|
26
|
-
|
|
27
|
-
function getFixture(file) {
|
|
28
|
-
return _path.default.resolve(__dirname, '..', '..', '..', 'test', 'basedriver', 'fixtures', file);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
describe('app download and configuration', function () {
|
|
32
|
-
describe('configureApp', function () {
|
|
33
|
-
it('should get the path for a local .app', async function () {
|
|
34
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app'), '.app');
|
|
35
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
36
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
37
|
-
contents.should.eql('this is not really an app\n');
|
|
38
|
-
});
|
|
39
|
-
it('should get the path for a local .apk', async function () {
|
|
40
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeAndroidApp.apk'), '.apk');
|
|
41
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
42
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
43
|
-
contents.should.eql('this is not really an apk\n');
|
|
44
|
-
});
|
|
45
|
-
it('should unzip and get the path for a local .app.zip', async function () {
|
|
46
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app.zip'), '.app');
|
|
47
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
48
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
49
|
-
contents.should.eql('this is not really an app\n');
|
|
50
|
-
});
|
|
51
|
-
it('should unzip and get the path for a local .ipa', async function () {
|
|
52
|
-
let newAppPath = await (0, _helpers.configureApp)(getFixture('FakeIOSApp.ipa'), '.app');
|
|
53
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
54
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
55
|
-
contents.should.eql('this is not really an app\n');
|
|
56
|
-
});
|
|
57
|
-
it('should fail for a bad zip file', async function () {
|
|
58
|
-
await (0, _helpers.configureApp)(getFixture('BadZippedApp.zip'), '.app').should.be.rejectedWith(/PK/);
|
|
59
|
-
});
|
|
60
|
-
it('should fail if extensions do not match', async function () {
|
|
61
|
-
await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app'), '.wrong').should.be.rejectedWith(/did not have extension/);
|
|
62
|
-
});
|
|
63
|
-
it('should fail if zip file does not contain an app whose extension matches', async function () {
|
|
64
|
-
await (0, _helpers.configureApp)(getFixture('FakeIOSApp.app.zip'), '.wrong').should.be.rejectedWith(/did not have extension/);
|
|
65
|
-
});
|
|
66
|
-
describe('should download an app from the web', function () {
|
|
67
|
-
let port;
|
|
68
|
-
let serverUrl;
|
|
69
|
-
before(async function () {
|
|
70
|
-
port = await (0, _helpers2.getTestPort)(true);
|
|
71
|
-
serverUrl = `http://${_helpers2.TEST_HOST}:${port}`;
|
|
72
|
-
});
|
|
73
|
-
describe('server not available', function () {
|
|
74
|
-
it('should handle server not available', async function () {
|
|
75
|
-
await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip`, '.app').should.eventually.be.rejectedWith(/ECONNREFUSED/);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
describe('server available', function () {
|
|
79
|
-
let server;
|
|
80
|
-
before(function () {
|
|
81
|
-
const dir = _path.default.resolve(__dirname, '..', '..', '..', 'test', 'basedriver', 'fixtures');
|
|
82
|
-
|
|
83
|
-
const serve = (0, _serveStatic.default)(dir, {
|
|
84
|
-
index: false,
|
|
85
|
-
setHeaders: (res, path) => {
|
|
86
|
-
res.setHeader('Content-Disposition', (0, _contentDisposition.default)(path));
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
server = _http.default.createServer(function (req, res) {
|
|
90
|
-
if (req.url.indexOf('missing') !== -1) {
|
|
91
|
-
res.writeHead(404);
|
|
92
|
-
res.end();
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const contentType = new URLSearchParams(_url.default.parse(req.url).search).get('content-type');
|
|
97
|
-
|
|
98
|
-
if (contentType !== null) {
|
|
99
|
-
res.setHeader('content-type', contentType);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
serve(req, res, (0, _finalhandler.default)(req, res));
|
|
103
|
-
});
|
|
104
|
-
const close = server.close.bind(server);
|
|
105
|
-
|
|
106
|
-
server.close = async function () {
|
|
107
|
-
await _bluebird.default.delay(1000);
|
|
108
|
-
return await new _bluebird.default((resolve, reject) => {
|
|
109
|
-
server.on('close', resolve);
|
|
110
|
-
close(err => {
|
|
111
|
-
if (err) reject(err);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
server.listen(port);
|
|
117
|
-
});
|
|
118
|
-
after(async function () {
|
|
119
|
-
await server.close();
|
|
120
|
-
});
|
|
121
|
-
it('should download zip file', async function () {
|
|
122
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip`, '.app');
|
|
123
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
124
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
125
|
-
contents.should.eql('this is not really an app\n');
|
|
126
|
-
});
|
|
127
|
-
it('should download zip file with query string', async function () {
|
|
128
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip?sv=abc&sr=def`, '.app');
|
|
129
|
-
newAppPath.should.contain('.app');
|
|
130
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
131
|
-
contents.should.eql('this is not really an app\n');
|
|
132
|
-
});
|
|
133
|
-
it('should download an app file', async function () {
|
|
134
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app`, '.app');
|
|
135
|
-
newAppPath.should.contain('.app');
|
|
136
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
137
|
-
contents.should.eql('this is not really an app\n');
|
|
138
|
-
});
|
|
139
|
-
it('should accept multiple extensions', async function () {
|
|
140
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeIOSApp.app.zip`, ['.app', '.aab']);
|
|
141
|
-
newAppPath.should.contain('FakeIOSApp.app');
|
|
142
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
143
|
-
contents.should.eql('this is not really an app\n');
|
|
144
|
-
});
|
|
145
|
-
it('should download an apk file', async function () {
|
|
146
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.apk`, '.apk');
|
|
147
|
-
newAppPath.should.contain('.apk');
|
|
148
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
149
|
-
contents.should.eql('this is not really an apk\n');
|
|
150
|
-
});
|
|
151
|
-
it('should handle zip file that cannot be downloaded', async function () {
|
|
152
|
-
await (0, _helpers.configureApp)(`${serverUrl}/missing/FakeIOSApp.app.zip`, '.app').should.eventually.be.rejected;
|
|
153
|
-
});
|
|
154
|
-
it('should handle invalid protocol', async function () {
|
|
155
|
-
await (0, _helpers.configureApp)('file://C:/missing/FakeIOSApp.app.zip', '.app').should.eventually.be.rejectedWith(/is not supported/);
|
|
156
|
-
await (0, _helpers.configureApp)(`ftp://${_helpers2.TEST_HOST}:${port}/missing/FakeIOSApp.app.zip`, '.app').should.eventually.be.rejectedWith(/is not supported/);
|
|
157
|
-
});
|
|
158
|
-
it('should handle missing file in Windows path format', async function () {
|
|
159
|
-
await (0, _helpers.configureApp)('C:\\missing\\FakeIOSApp.app.zip', '.app').should.eventually.be.rejectedWith(/does not exist or is not accessible/);
|
|
160
|
-
});
|
|
161
|
-
it('should recognize zip mime types and unzip the downloaded file', async function () {
|
|
162
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.asd?content-type=${encodeURIComponent('application/zip')}`, '.apk');
|
|
163
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
164
|
-
newAppPath.should.not.contain('.asd');
|
|
165
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
166
|
-
contents.should.eql('this is not really an apk\n');
|
|
167
|
-
});
|
|
168
|
-
it('should recognize zip mime types with parameter and unzip the downloaded file', async function () {
|
|
169
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.asd?content-type=${encodeURIComponent('application/zip; parameter=value')}`, '.apk');
|
|
170
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
171
|
-
newAppPath.should.not.contain('.asd');
|
|
172
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
173
|
-
contents.should.eql('this is not really an apk\n');
|
|
174
|
-
});
|
|
175
|
-
it('should recognize zip mime types and unzip the downloaded file with query string', async function () {
|
|
176
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.asd?content-type=${encodeURIComponent('application/zip')}&sv=abc&sr=def`, '.apk');
|
|
177
|
-
newAppPath.should.contain('FakeAndroidApp.apk');
|
|
178
|
-
newAppPath.should.not.contain('.asd');
|
|
179
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
180
|
-
contents.should.eql('this is not really an apk\n');
|
|
181
|
-
});
|
|
182
|
-
it('should treat an unknown mime type as an app', async function () {
|
|
183
|
-
let newAppPath = await (0, _helpers.configureApp)(`${serverUrl}/FakeAndroidApp.apk?content-type=${encodeURIComponent('application/bip')}`, '.apk');
|
|
184
|
-
newAppPath.should.contain('.apk');
|
|
185
|
-
let contents = await _support.fs.readFile(newAppPath, 'utf8');
|
|
186
|
-
contents.should.eql('this is not really an apk\n');
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
});require('source-map-support').install();
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9oZWxwZXJzLWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJnZXRGaXh0dXJlIiwiZmlsZSIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiZGVzY3JpYmUiLCJpdCIsIm5ld0FwcFBhdGgiLCJzaG91bGQiLCJjb250YWluIiwiY29udGVudHMiLCJmcyIsInJlYWRGaWxlIiwiZXFsIiwiYmUiLCJyZWplY3RlZFdpdGgiLCJwb3J0Iiwic2VydmVyVXJsIiwiYmVmb3JlIiwiVEVTVF9IT1NUIiwiZXZlbnR1YWxseSIsInNlcnZlciIsImRpciIsInNlcnZlIiwiaW5kZXgiLCJzZXRIZWFkZXJzIiwicmVzIiwic2V0SGVhZGVyIiwiaHR0cCIsImNyZWF0ZVNlcnZlciIsInJlcSIsInVybCIsImluZGV4T2YiLCJ3cml0ZUhlYWQiLCJlbmQiLCJjb250ZW50VHlwZSIsIlVSTFNlYXJjaFBhcmFtcyIsInBhcnNlIiwic2VhcmNoIiwiZ2V0IiwiY2xvc2UiLCJiaW5kIiwiQiIsImRlbGF5IiwicmVqZWN0Iiwib24iLCJlcnIiLCJsaXN0ZW4iLCJhZnRlciIsInJlamVjdGVkIiwiZW5jb2RlVVJJQ29tcG9uZW50Iiwibm90Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxTQUFTQSxVQUFULENBQXFCQyxJQUFyQixFQUEyQjtBQUV6QixTQUFPQyxjQUFLQyxPQUFMLENBQWFDLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsSUFBcEMsRUFBMEMsTUFBMUMsRUFBa0QsWUFBbEQsRUFBZ0UsVUFBaEUsRUFBNEVILElBQTVFLENBQVA7QUFDRDs7QUFFREksUUFBUSxDQUFDLGdDQUFELEVBQW1DLFlBQVk7QUFDckRBLEVBQUFBLFFBQVEsQ0FBQyxjQUFELEVBQWlCLFlBQVk7QUFDbkNDLElBQUFBLEVBQUUsQ0FBQyxzQ0FB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QUFwQjtBQUNELFNBTEMsQ0FBRjtBQU1ELE9BakhPLENBQVI7QUFrSEQsS0FqSU8sQ0FBUjtBQWtJRCxHQXZLTyxDQUFSO0FBd0tELENBektPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCB7IGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGNvbmZpZ3VyZUFwcCB9IGZyb20gJy4uLy4uL2xpYi9iYXNlZHJpdmVyL2hlbHBlcnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgZmluYWxoYW5kbGVyIGZyb20gJ2ZpbmFsaGFuZGxlcic7XG5pbXBvcnQgc2VydmVTdGF0aWMgZnJvbSAnc2VydmUtc3RhdGljJztcbmltcG9ydCBjb250ZW50RGlzcG9zaXRpb24gZnJvbSAnY29udGVudC1kaXNwb3NpdGlvbic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQge1RFU1RfSE9TVCwgZ2V0VGVzdFBvcnR9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5cbmZ1bmN0aW9uIGdldEZpeHR1cmUgKGZpbGUpIHtcbiAgLy8gWFhYOiBfX2Rpcm5hbWUgZGlzYWxsb3dlZCBpbiBuYXRpdmUgRVNNXG4gIHJldHVybiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGVzdCcsICdiYXNlZHJpdmVyJywgJ2ZpeHR1cmVzJywgZmlsZSk7XG59XG5cbmRlc2NyaWJlKCdhcHAgZG93bmxvYWQgYW5kIGNvbmZpZ3VyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdjb25maWd1cmVBcHAnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIHBhdGggZm9yIGEgbG9jYWwgLmFwcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGdldEZpeHR1cmUoJ0Zha2VJT1NBcHAuYXBwJyksICcuYXBwJyk7XG4gICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlSU9TQXBwLmFwcCcpO1xuICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcHBcXG4nKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCB0aGUgcGF0aCBmb3IgYSBsb2NhbCAuYXBrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoZ2V0Rml4dHVyZSgnRmFrZUFuZHJvaWRBcHAuYXBrJyksICcuYXBrJyk7XG4gICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlQW5kcm9pZEFwcC5hcGsnKTtcbiAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBrXFxuJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB1bnppcCBhbmQgZ2V0IHRoZSBwYXRoIGZvciBhIGxvY2FsIC5hcHAuemlwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoZ2V0Rml4dHVyZSgnRmFrZUlPU0FwcC5hcHAuemlwJyksICcuYXBwJyk7XG4gICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlSU9TQXBwLmFwcCcpO1xuICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcHBcXG4nKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVuemlwIGFuZCBnZXQgdGhlIHBhdGggZm9yIGEgbG9jYWwgLmlwYScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGdldEZpeHR1cmUoJ0Zha2VJT1NBcHAuaXBhJyksICcuYXBwJyk7XG4gICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlSU9TQXBwLmFwcCcpO1xuICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcHBcXG4nKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGEgYmFkIHppcCBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29uZmlndXJlQXBwKGdldEZpeHR1cmUoJ0JhZFppcHBlZEFwcC56aXAnKSwgJy5hcHAnKVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvUEsvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgZXh0ZW5zaW9ucyBkbyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVBcHAoZ2V0Rml4dHVyZSgnRmFrZUlPU0FwcC5hcHAnKSwgJy53cm9uZycpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9kaWQgbm90IGhhdmUgZXh0ZW5zaW9uLyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHppcCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW4gYXBwIHdob3NlIGV4dGVuc2lvbiBtYXRjaGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29uZmlndXJlQXBwKGdldEZpeHR1cmUoJ0Zha2VJT1NBcHAuYXBwLnppcCcpLCAnLndyb25nJylcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2RpZCBub3QgaGF2ZSBleHRlbnNpb24vKTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnc2hvdWxkIGRvd25sb2FkIGFuIGFwcCBmcm9tIHRoZSB3ZWInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgcG9ydDtcbiAgICAgIGxldCBzZXJ2ZXJVcmw7XG5cbiAgICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBvcnQgPSBhd2FpdCBnZXRUZXN0UG9ydCh0cnVlKTtcbiAgICAgICAgc2VydmVyVXJsID0gYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fWA7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3NlcnZlciBub3QgYXZhaWxhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBzZXJ2ZXIgbm90IGF2YWlsYWJsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhd2FpdCBjb25maWd1cmVBcHAoYCR7c2VydmVyVXJsfS9GYWtlSU9TQXBwLmFwcC56aXBgLCAnLmFwcCcpXG4gICAgICAgICAgICAuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9FQ09OTlJFRlVTRUQvKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGRlc2NyaWJlKCdzZXJ2ZXIgYXZhaWxhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB1c2UgYSBsb2NhbCBzZXJ2ZXIgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jeSBvbiB0aGUgaW50ZXJuZXRcbiAgICAgICAgbGV0IHNlcnZlcjtcbiAgICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGVzdCcsICdiYXNlZHJpdmVyJywgJ2ZpeHR1cmVzJyk7XG4gICAgICAgICAgY29uc3Qgc2VydmUgPSBzZXJ2ZVN0YXRpYyhkaXIsIHtcbiAgICAgICAgICAgIGluZGV4OiBmYWxzZSxcbiAgICAgICAgICAgIHNldEhlYWRlcnM6IChyZXMsIHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsIGNvbnRlbnREaXNwb3NpdGlvbihwYXRoKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoZnVuY3Rpb24gKHJlcSwgcmVzKSB7XG4gICAgICAgICAgICBpZiAocmVxLnVybC5pbmRleE9mKCdtaXNzaW5nJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNDA0KTtcbiAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmb3IgdGVzdGluZyB6aXAgZmlsZSBjb250ZW50IHR5cGVzXG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnBhcnNlKHJlcS51cmwpLnNlYXJjaCkuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCBjb250ZW50VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJ2ZShyZXEsIHJlcywgZmluYWxoYW5kbGVyKHJlcSwgcmVzKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgY2xvc2UgPSBzZXJ2ZXIuY2xvc2UuYmluZChzZXJ2ZXIpO1xuICAgICAgICAgIHNlcnZlci5jbG9zZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIHBhdXNlIGEgbW9tZW50IG9yIHdlIGdldCBFQ09OUkVTRVQgZXJyb3JzXG4gICAgICAgICAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgc2VydmVyLm9uKCdjbG9zZScsIHJlc29sdmUpO1xuICAgICAgICAgICAgICBjbG9zZSgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNlcnZlci5saXN0ZW4ocG9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZG93bmxvYWQgemlwIGZpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoYCR7c2VydmVyVXJsfS9GYWtlSU9TQXBwLmFwcC56aXBgLCAnLmFwcCcpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJ0Zha2VJT1NBcHAuYXBwJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBwXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIGRvd25sb2FkIHppcCBmaWxlIHdpdGggcXVlcnkgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGAke3NlcnZlclVybH0vRmFrZUlPU0FwcC5hcHAuemlwP3N2PWFiYyZzcj1kZWZgLCAnLmFwcCcpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJy5hcHAnKTtcbiAgICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShuZXdBcHBQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcHBcXG4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgZG93bmxvYWQgYW4gYXBwIGZpbGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoYCR7c2VydmVyVXJsfS9GYWtlSU9TQXBwLmFwcGAsICcuYXBwJyk7XG4gICAgICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignLmFwcCcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwcFxcbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBhY2NlcHQgbXVsdGlwbGUgZXh0ZW5zaW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChgJHtzZXJ2ZXJVcmx9L0Zha2VJT1NBcHAuYXBwLnppcGAsIFsnLmFwcCcsICcuYWFiJ10pO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJ0Zha2VJT1NBcHAuYXBwJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBwXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIGRvd25sb2FkIGFuIGFwayBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGAke3NlcnZlclVybH0vRmFrZUFuZHJvaWRBcHAuYXBrYCwgJy5hcGsnKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCcuYXBrJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBrXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSB6aXAgZmlsZSB0aGF0IGNhbm5vdCBiZSBkb3dubG9hZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyZUFwcChgJHtzZXJ2ZXJVcmx9L21pc3NpbmcvRmFrZUlPU0FwcC5hcHAuemlwYCwgJy5hcHAnKVxuICAgICAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgaW52YWxpZCBwcm90b2NvbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhd2FpdCBjb25maWd1cmVBcHAoJ2ZpbGU6Ly9DOi9taXNzaW5nL0Zha2VJT1NBcHAuYXBwLnppcCcsICcuYXBwJylcbiAgICAgICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2lzIG5vdCBzdXBwb3J0ZWQvKTtcbiAgICAgICAgICBhd2FpdCBjb25maWd1cmVBcHAoYGZ0cDovLyR7VEVTVF9IT1NUfToke3BvcnR9L21pc3NpbmcvRmFrZUlPU0FwcC5hcHAuemlwYCwgJy5hcHAnKVxuICAgICAgICAgICAgLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvaXMgbm90IHN1cHBvcnRlZC8pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWlzc2luZyBmaWxlIGluIFdpbmRvd3MgcGF0aCBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgY29uZmlndXJlQXBwKCdDOlxcXFxtaXNzaW5nXFxcXEZha2VJT1NBcHAuYXBwLnppcCcsICcuYXBwJylcbiAgICAgICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2RvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlLyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlY29nbml6ZSB6aXAgbWltZSB0eXBlcyBhbmQgdW56aXAgdGhlIGRvd25sb2FkZWQgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChgJHtzZXJ2ZXJVcmx9L0Zha2VBbmRyb2lkQXBwLmFzZD9jb250ZW50LXR5cGU9JHtlbmNvZGVVUklDb21wb25lbnQoJ2FwcGxpY2F0aW9uL3ppcCcpfWAsICcuYXBrJyk7XG4gICAgICAgICAgbmV3QXBwUGF0aC5zaG91bGQuY29udGFpbignRmFrZUFuZHJvaWRBcHAuYXBrJyk7XG4gICAgICAgICAgbmV3QXBwUGF0aC5zaG91bGQubm90LmNvbnRhaW4oJy5hc2QnKTtcbiAgICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShuZXdBcHBQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcGtcXG4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgcmVjb2duaXplIHppcCBtaW1lIHR5cGVzIHdpdGggcGFyYW1ldGVyIGFuZCB1bnppcCB0aGUgZG93bmxvYWRlZCBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxldCBuZXdBcHBQYXRoID0gYXdhaXQgY29uZmlndXJlQXBwKGAke3NlcnZlclVybH0vRmFrZUFuZHJvaWRBcHAuYXNkP2NvbnRlbnQtdHlwZT0ke2VuY29kZVVSSUNvbXBvbmVudCgnYXBwbGljYXRpb24vemlwOyBwYXJhbWV0ZXI9dmFsdWUnKX1gLCAnLmFwaycpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJ0Zha2VBbmRyb2lkQXBwLmFwaycpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLm5vdC5jb250YWluKCcuYXNkJyk7XG4gICAgICAgICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEZpbGUobmV3QXBwUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb250ZW50cy5zaG91bGQuZXFsKCd0aGlzIGlzIG5vdCByZWFsbHkgYW4gYXBrXFxuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlY29nbml6ZSB6aXAgbWltZSB0eXBlcyBhbmQgdW56aXAgdGhlIGRvd25sb2FkZWQgZmlsZSB3aXRoIHF1ZXJ5IHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsZXQgbmV3QXBwUGF0aCA9IGF3YWl0IGNvbmZpZ3VyZUFwcChgJHtzZXJ2ZXJVcmx9L0Zha2VBbmRyb2lkQXBwLmFzZD9jb250ZW50LXR5cGU9JHtlbmNvZGVVUklDb21wb25lbnQoJ2FwcGxpY2F0aW9uL3ppcCcpfSZzdj1hYmMmc3I9ZGVmYCwgJy5hcGsnKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5jb250YWluKCdGYWtlQW5kcm9pZEFwcC5hcGsnKTtcbiAgICAgICAgICBuZXdBcHBQYXRoLnNob3VsZC5ub3QuY29udGFpbignLmFzZCcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKG5ld0FwcFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29udGVudHMuc2hvdWxkLmVxbCgndGhpcyBpcyBub3QgcmVhbGx5IGFuIGFwa1xcbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCB0cmVhdCBhbiB1bmtub3duIG1pbWUgdHlwZSBhcyBhbiBhcHAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGV0IG5ld0FwcFBhdGggPSBhd2FpdCBjb25maWd1cmVBcHAoYCR7c2VydmVyVXJsfS9GYWtlQW5kcm9pZEFwcC5hcGs/Y29udGVudC10eXBlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KCdhcHBsaWNhdGlvbi9iaXAnKX1gLCAnLmFwaycpO1xuICAgICAgICAgIG5ld0FwcFBhdGguc2hvdWxkLmNvbnRhaW4oJy5hcGsnKTtcbiAgICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShuZXdBcHBQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnRlbnRzLnNob3VsZC5lcWwoJ3RoaXMgaXMgbm90IHJlYWxseSBhbiBhcGtcXG4nKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9iYXNlZHJpdmVyL2hlbHBlcnMtZTJlLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _support = require("@appium/support");
|
|
8
|
-
|
|
9
|
-
var _helpers = require("../../lib/basedriver/helpers");
|
|
10
|
-
|
|
11
|
-
var _sinon = _interopRequireDefault(require("sinon"));
|
|
12
|
-
|
|
13
|
-
describe('helpers', function () {
|
|
14
|
-
describe('#isPackageOrBundle', function () {
|
|
15
|
-
it('should accept packages and bundles', function () {
|
|
16
|
-
(0, _helpers.isPackageOrBundle)('io.appium.testapp').should.be.true;
|
|
17
|
-
});
|
|
18
|
-
it('should not accept non-packages or non-bundles', function () {
|
|
19
|
-
(0, _helpers.isPackageOrBundle)('foo').should.be.false;
|
|
20
|
-
(0, _helpers.isPackageOrBundle)('/path/to/an.app').should.be.false;
|
|
21
|
-
(0, _helpers.isPackageOrBundle)('/path/to/an.apk').should.be.false;
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
describe('#duplicateKeys', function () {
|
|
25
|
-
it('should translate key in an object', function () {
|
|
26
|
-
(0, _helpers.duplicateKeys)({
|
|
27
|
-
'foo': 'hello world'
|
|
28
|
-
}, 'foo', 'bar').should.eql({
|
|
29
|
-
'foo': 'hello world',
|
|
30
|
-
'bar': 'hello world'
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
it('should translate key in an object within an object', function () {
|
|
34
|
-
(0, _helpers.duplicateKeys)({
|
|
35
|
-
'key': {
|
|
36
|
-
'foo': 'hello world'
|
|
37
|
-
}
|
|
38
|
-
}, 'foo', 'bar').should.eql({
|
|
39
|
-
'key': {
|
|
40
|
-
'foo': 'hello world',
|
|
41
|
-
'bar': 'hello world'
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
it('should translate key in an object with an array', function () {
|
|
46
|
-
(0, _helpers.duplicateKeys)([{
|
|
47
|
-
'key': {
|
|
48
|
-
'foo': 'hello world'
|
|
49
|
-
}
|
|
50
|
-
}, {
|
|
51
|
-
'foo': 'HELLO WORLD'
|
|
52
|
-
}], 'foo', 'bar').should.eql([{
|
|
53
|
-
'key': {
|
|
54
|
-
'foo': 'hello world',
|
|
55
|
-
'bar': 'hello world'
|
|
56
|
-
}
|
|
57
|
-
}, {
|
|
58
|
-
'foo': 'HELLO WORLD',
|
|
59
|
-
'bar': 'HELLO WORLD'
|
|
60
|
-
}]);
|
|
61
|
-
});
|
|
62
|
-
it('should duplicate both keys', function () {
|
|
63
|
-
(0, _helpers.duplicateKeys)({
|
|
64
|
-
'keyOne': {
|
|
65
|
-
'foo': 'hello world'
|
|
66
|
-
},
|
|
67
|
-
'keyTwo': {
|
|
68
|
-
'bar': 'HELLO WORLD'
|
|
69
|
-
}
|
|
70
|
-
}, 'foo', 'bar').should.eql({
|
|
71
|
-
'keyOne': {
|
|
72
|
-
'foo': 'hello world',
|
|
73
|
-
'bar': 'hello world'
|
|
74
|
-
},
|
|
75
|
-
'keyTwo': {
|
|
76
|
-
'bar': 'HELLO WORLD',
|
|
77
|
-
'foo': 'HELLO WORLD'
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
it('should not do anything to primitives', function () {
|
|
82
|
-
[0, 1, -1, true, false, null, undefined, '', 'Hello World'].forEach(item => {
|
|
83
|
-
should.equal((0, _helpers.duplicateKeys)(item), item);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
it('should rename keys on big complex objects', function () {
|
|
87
|
-
const input = [{
|
|
88
|
-
'foo': 'bar'
|
|
89
|
-
}, {
|
|
90
|
-
hello: {
|
|
91
|
-
world: {
|
|
92
|
-
'foo': 'BAR'
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
foo: 'bahr'
|
|
96
|
-
}, 'foo', null, 0];
|
|
97
|
-
const expectedOutput = [{
|
|
98
|
-
'foo': 'bar',
|
|
99
|
-
'FOO': 'bar'
|
|
100
|
-
}, {
|
|
101
|
-
hello: {
|
|
102
|
-
world: {
|
|
103
|
-
'foo': 'BAR',
|
|
104
|
-
'FOO': 'BAR'
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
foo: 'bahr',
|
|
108
|
-
FOO: 'bahr'
|
|
109
|
-
}, 'foo', null, 0];
|
|
110
|
-
(0, _helpers.duplicateKeys)(input, 'foo', 'FOO').should.deep.equal(expectedOutput);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe('#configureApp', function () {
|
|
114
|
-
let sandbox;
|
|
115
|
-
beforeEach(function () {
|
|
116
|
-
sandbox = _sinon.default.createSandbox();
|
|
117
|
-
sandbox.stub(_support.zip, 'extractAllTo').resolves();
|
|
118
|
-
sandbox.stub(_support.zip, 'assertValidZip').resolves();
|
|
119
|
-
sandbox.stub(_support.fs, 'mv').resolves();
|
|
120
|
-
sandbox.stub(_support.fs, 'stat').resolves({
|
|
121
|
-
isFile: () => true,
|
|
122
|
-
isDirectory: () => false
|
|
123
|
-
});
|
|
124
|
-
sandbox.stub(_support.fs, 'exists').resolves(true);
|
|
125
|
-
sandbox.stub(_support.fs, 'hash').resolves('0xDEADBEEF');
|
|
126
|
-
sandbox.stub(_support.fs, 'glob').resolves(['/path/to/an.apk']);
|
|
127
|
-
sandbox.stub(_support.fs, 'rimraf').resolves();
|
|
128
|
-
sandbox.stub(_support.tempDir, 'openDir').resolves('/some/dir');
|
|
129
|
-
});
|
|
130
|
-
afterEach(function () {
|
|
131
|
-
sandbox.restore();
|
|
132
|
-
});
|
|
133
|
-
it('should pass "useSystemUnzip" flag through to @appium/support', async function () {
|
|
134
|
-
await (0, _helpers.configureApp)('/path/to/an.apk.zip', '.apk');
|
|
135
|
-
_support.zip.extractAllTo.getCall(0).lastArg.useSystemUnzip.should.be.true;
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
describe('parseCapsArray', function () {
|
|
140
|
-
it('should parse string into array', function () {
|
|
141
|
-
(0, _helpers.parseCapsArray)('/tmp/my/app.zip').should.eql(['/tmp/my/app.zip']);
|
|
142
|
-
});
|
|
143
|
-
it('should parse array as string into array', function () {
|
|
144
|
-
(0, _helpers.parseCapsArray)('["/tmp/my/app.zip"]').should.eql(['/tmp/my/app.zip']);
|
|
145
|
-
(0, _helpers.parseCapsArray)('["/tmp/my/app.zip","/tmp/my/app2.zip"]').should.eql(['/tmp/my/app.zip', '/tmp/my/app2.zip']);
|
|
146
|
-
});
|
|
147
|
-
it('should return an array without change', function () {
|
|
148
|
-
(0, _helpers.parseCapsArray)(['a', 'b']).should.eql(['a', 'b']);
|
|
149
|
-
});
|
|
150
|
-
});require('source-map-support').install();
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9oZWxwZXJzLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJzaG91bGQiLCJiZSIsInRydWUiLCJmYWxzZSIsImVxbCIsInVuZGVmaW5lZCIsImZvckVhY2giLCJpdGVtIiwiZXF1YWwiLCJpbnB1dCIsImhlbGxvIiwid29ybGQiLCJmb28iLCJleHBlY3RlZE91dHB1dCIsIkZPTyIsImRlZXAiLCJzYW5kYm94IiwiYmVmb3JlRWFjaCIsInNpbm9uIiwiY3JlYXRlU2FuZGJveCIsInN0dWIiLCJ6aXAiLCJyZXNvbHZlcyIsImZzIiwiaXNGaWxlIiwiaXNEaXJlY3RvcnkiLCJ0ZW1wRGlyIiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsImV4dHJhY3RBbGxUbyIsImdldENhbGwiLCJsYXN0QXJnIiwidXNlU3lzdGVtVW56aXAiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBQSxRQUFRLENBQUMsU0FBRCxFQUFZLFlBQVk7QUFDOUJBLEVBQUFBLFFBQVEsQ0FBQyxvQkFBRCxFQUF1QixZQUFZO0FBQ3pDQyxJQUFBQSxFQUFFLENBQUMsb0NBQUQsRUFBdUMsWUFBWTtBQUNuRCxzQ0FBa0IsbUJBQWxCLEVBQXVDQyxNQUF2QyxDQUE4Q0MsRUFBOUMsQ0FBaURDLElBQWpEO0FBQ0QsS0FGQyxDQUFGO0FBR0FILElBQUFBLEVBQUUsQ0FBQywrQ0FBRCxFQUFrRCxZQUFZO0FBQzlELHNDQUFrQixLQUFsQixFQUF5QkMsTUFBekIsQ0FBZ0NDLEVBQWhDLENBQW1DRSxLQUFuQztBQUNBLHNDQUFrQixpQkFBbEIsRUFBcUNILE1BQXJDLENBQTRDQyxFQUE1QyxDQUErQ0UsS0FBL0M7QUFDQSxzQ0FBa0IsaUJBQWxCLEVBQXFDSCxNQUFyQyxDQUE0Q0MsRUFBNUMsQ0FBK0NFLEtBQS9DO0FBQ0QsS0FKQyxDQUFGO0FBS0QsR0FUTyxDQUFSO0FBV0FMLEVBQUFBLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixZ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ZnMsIHRlbXBEaXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgY29uZmlndXJlQXBwLCBpc1BhY2thZ2VPckJ1bmRsZSwgZHVwbGljYXRlS2V5cywgcGFyc2VDYXBzQXJyYXkgfSBmcm9tICcuLi8uLi9saWIvYmFzZWRyaXZlci9oZWxwZXJzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuZGVzY3JpYmUoJ2hlbHBlcnMnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCcjaXNQYWNrYWdlT3JCdW5kbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgcGFja2FnZXMgYW5kIGJ1bmRsZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1BhY2thZ2VPckJ1bmRsZSgnaW8uYXBwaXVtLnRlc3RhcHAnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBhY2NlcHQgbm9uLXBhY2thZ2VzIG9yIG5vbi1idW5kbGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNQYWNrYWdlT3JCdW5kbGUoJ2ZvbycpLnNob3VsZC5iZS5mYWxzZTtcbiAgICAgIGlzUGFja2FnZU9yQnVuZGxlKCcvcGF0aC90by9hbi5hcHAnKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgICBpc1BhY2thZ2VPckJ1bmRsZSgnL3BhdGgvdG8vYW4uYXBrJykuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2R1cGxpY2F0ZUtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0cmFuc2xhdGUga2V5IGluIGFuIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGR1cGxpY2F0ZUtleXMoeydmb28nOiAnaGVsbG8gd29ybGQnfSwgJ2ZvbycsICdiYXInKS5zaG91bGQuZXFsKHsnZm9vJzogJ2hlbGxvIHdvcmxkJywgJ2Jhcic6ICdoZWxsbyB3b3JsZCd9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRyYW5zbGF0ZSBrZXkgaW4gYW4gb2JqZWN0IHdpdGhpbiBhbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkdXBsaWNhdGVLZXlzKHsna2V5Jzogeydmb28nOiAnaGVsbG8gd29ybGQnfX0sICdmb28nLCAnYmFyJykuc2hvdWxkLmVxbCh7J2tleSc6IHsnZm9vJzogJ2hlbGxvIHdvcmxkJywgJ2Jhcic6ICdoZWxsbyB3b3JsZCd9fSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0cmFuc2xhdGUga2V5IGluIGFuIG9iamVjdCB3aXRoIGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgZHVwbGljYXRlS2V5cyhbXG4gICAgICAgIHsna2V5Jzogeydmb28nOiAnaGVsbG8gd29ybGQnfX0sXG4gICAgICAgIHsnZm9vJzogJ0hFTExPIFdPUkxEJ31cbiAgICAgIF0sICdmb28nLCAnYmFyJykuc2hvdWxkLmVxbChbXG4gICAgICAgIHsna2V5Jzogeydmb28nOiAnaGVsbG8gd29ybGQnLCAnYmFyJzogJ2hlbGxvIHdvcmxkJ319LFxuICAgICAgICB7J2Zvbyc6ICdIRUxMTyBXT1JMRCcsICdiYXInOiAnSEVMTE8gV09STEQnfVxuICAgICAgXSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBkdXBsaWNhdGUgYm90aCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZHVwbGljYXRlS2V5cyh7XG4gICAgICAgICdrZXlPbmUnOiB7XG4gICAgICAgICAgJ2Zvbyc6ICdoZWxsbyB3b3JsZCcsXG4gICAgICAgIH0sXG4gICAgICAgICdrZXlUd28nOiB7XG4gICAgICAgICAgJ2Jhcic6ICdIRUxMTyBXT1JMRCcsXG4gICAgICAgIH0sXG4gICAgICB9LCAnZm9vJywgJ2JhcicpLnNob3VsZC5lcWwoe1xuICAgICAgICAna2V5T25lJzoge1xuICAgICAgICAgICdmb28nOiAnaGVsbG8gd29ybGQnLFxuICAgICAgICAgICdiYXInOiAnaGVsbG8gd29ybGQnLFxuICAgICAgICB9LFxuICAgICAgICAna2V5VHdvJzoge1xuICAgICAgICAgICdiYXInOiAnSEVMTE8gV09STEQnLFxuICAgICAgICAgICdmb28nOiAnSEVMTE8gV09STEQnLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBkbyBhbnl0aGluZyB0byBwcmltaXRpdmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgWzAsIDEsIC0xLCB0cnVlLCBmYWxzZSwgbnVsbCwgdW5kZWZpbmVkLCAnJywgJ0hlbGxvIFdvcmxkJ10uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBzaG91bGQuZXF1YWwoZHVwbGljYXRlS2V5cyhpdGVtKSwgaXRlbSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlbmFtZSBrZXlzIG9uIGJpZyBjb21wbGV4IG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IFtcbiAgICAgICAgeydmb28nOiAnYmFyJ30sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWxsbzoge1xuICAgICAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgICAgJ2Zvbyc6ICdCQVInLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZm9vOiAnYmFocidcbiAgICAgICAgfSxcbiAgICAgICAgJ2ZvbycsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDBcbiAgICAgIF07XG4gICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9IFtcbiAgICAgICAgeydmb28nOiAnYmFyJywgJ0ZPTyc6ICdiYXInfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlbGxvOiB7XG4gICAgICAgICAgICB3b3JsZDoge1xuICAgICAgICAgICAgICAnZm9vJzogJ0JBUicsXG4gICAgICAgICAgICAgICdGT08nOiAnQkFSJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGZvbzogJ2JhaHInLFxuICAgICAgICAgIEZPTzogJ2JhaHInXG4gICAgICAgIH0sXG4gICAgICAgICdmb28nLFxuICAgICAgICBudWxsLFxuICAgICAgICAwXG4gICAgICBdO1xuICAgICAgZHVwbGljYXRlS2V5cyhpbnB1dCwgJ2ZvbycsICdGT08nKS5zaG91bGQuZGVlcC5lcXVhbChleHBlY3RlZE91dHB1dCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjY29uZmlndXJlQXBwJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBzYW5kYm94O1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgICAgc2FuZGJveC5zdHViKHppcCwgJ2V4dHJhY3RBbGxUbycpLnJlc29sdmVzKCk7XG4gICAgICBzYW5kYm94LnN0dWIoemlwLCAnYXNzZXJ0VmFsaWRaaXAnKS5yZXNvbHZlcygpO1xuICAgICAgc2FuZGJveC5zdHViKGZzLCAnbXYnKS5yZXNvbHZlcygpO1xuICAgICAgc2FuZGJveC5zdHViKGZzLCAnc3RhdCcpLnJlc29sdmVzKHtcbiAgICAgICAgaXNGaWxlOiAoKSA9PiB0cnVlLFxuICAgICAgICBpc0RpcmVjdG9yeTogKCkgPT4gZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHNhbmRib3guc3R1YihmcywgJ2V4aXN0cycpLnJlc29sdmVzKHRydWUpO1xuICAgICAgc2FuZGJveC5zdHViKGZzLCAnaGFzaCcpLnJlc29sdmVzKCcweERFQURCRUVGJyk7XG4gICAgICBzYW5kYm94LnN0dWIoZnMsICdnbG9iJykucmVzb2x2ZXMoWycvcGF0aC90by9hbi5hcGsnXSk7XG4gICAgICBzYW5kYm94LnN0dWIoZnMsICdyaW1yYWYnKS5yZXNvbHZlcygpO1xuICAgICAgc2FuZGJveC5zdHViKHRlbXBEaXIsICdvcGVuRGlyJykucmVzb2x2ZXMoJy9zb21lL2RpcicpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIFwidXNlU3lzdGVtVW56aXBcIiBmbGFnIHRocm91Z2ggdG8gQGFwcGl1bS9zdXBwb3J0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29uZmlndXJlQXBwKCcvcGF0aC90by9hbi5hcGsuemlwJywgJy5hcGsnKTtcbiAgICAgIHppcC5leHRyYWN0QWxsVG8uZ2V0Q2FsbCgwKS5sYXN0QXJnLnVzZVN5c3RlbVVuemlwLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgncGFyc2VDYXBzQXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgcGFyc2Ugc3RyaW5nIGludG8gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgcGFyc2VDYXBzQXJyYXkoJy90bXAvbXkvYXBwLnppcCcpLnNob3VsZC5lcWwoWycvdG1wL215L2FwcC56aXAnXSk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHBhcnNlIGFycmF5IGFzIHN0cmluZyBpbnRvIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgIHBhcnNlQ2Fwc0FycmF5KCdbXCIvdG1wL215L2FwcC56aXBcIl0nKS5zaG91bGQuZXFsKFsnL3RtcC9teS9hcHAuemlwJ10pO1xuICAgIHBhcnNlQ2Fwc0FycmF5KCdbXCIvdG1wL215L2FwcC56aXBcIixcIi90bXAvbXkvYXBwMi56aXBcIl0nKS5zaG91bGQuZXFsKFtcbiAgICAgICcvdG1wL215L2FwcC56aXAnLFxuICAgICAgJy90bXAvbXkvYXBwMi56aXAnXG4gICAgXSk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHJldHVybiBhbiBhcnJheSB3aXRob3V0IGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICBwYXJzZUNhcHNBcnJheShbJ2EnLCAnYiddKS5zaG91bGQuZXFsKFsnYScsICdiJ10pO1xuICB9KTtcbn0pOyJdLCJmaWxlIjoidGVzdC9iYXNlZHJpdmVyL2hlbHBlcnMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|