appium-instruments
Version:
IOS Instruments + instruments-without-delay launcher used by Appium
264 lines (216 loc) • 29.4 kB
JavaScript
require('source-map-support').install();
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _Promise = require('babel-runtime/core-js/promise')['default'];
var _interopRequireWildcard = require('babel-runtime/helpers/interop-require-wildcard')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _this2 = this;
var _ = require('..');
var _teen_process = require('teen_process');
var tp = _interopRequireWildcard(_teen_process);
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _appiumXcode = require('appium-xcode');
var _appiumXcode2 = _interopRequireDefault(_appiumXcode);
var _appiumTestSupport = require('appium-test-support');
var _appiumSupport = require('appium-support');
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
_chai2['default'].should();
var XCODE_VERSION = {
versionString: '7.1.1',
versionFloat: 7.1,
major: 7,
minor: 1,
patch: 1
};
describe('instruments', function () {
describe('quickInstrument', function callee$1$0() {
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
var _this = this;
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
it('should create instruments', function callee$2$0() {
var opts, instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
opts = {
app: '/a/b/c/my.app'
};
context$3$0.next = 3;
return _regeneratorRuntime.awrap(_.Instruments.quickInstruments(opts));
case 3:
instruments = context$3$0.sent;
instruments.app.should.equal(opts.app);
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
case 1:
case 'end':
return context$2$0.stop();
}
}, null, _this2);
});
describe('constructor', function () {
it('should create instruments', function () {
var opts = {
app: '/a/b/c/my.app'
};
var instruments = new _.Instruments(opts);
instruments.app.should.equal(opts.app);
});
});
describe('configure', (0, _appiumTestSupport.withMocks)({ xcode: _appiumXcode2['default'], utils: _.utils }, function (mocks) {
it('should work', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
instruments = new _.Instruments({});
mocks.xcode.expects('getVersion').once().returns(_Promise.resolve(XCODE_VERSION));
mocks.xcode.expects('getAutomationTraceTemplatePath').once().returns(_Promise.resolve('/a/b/c/d/tracetemplate'));
mocks.utils.expects('getInstrumentsPath').once().returns(_Promise.resolve('/a/b/c/instrumentspath'));
context$3$0.next = 6;
return _regeneratorRuntime.awrap(instruments.configure());
case 6:
instruments.xcodeVersion.versionString.should.equal(XCODE_VERSION.versionString);
instruments.template.should.equal('/a/b/c/d/tracetemplate');
instruments.instrumentsPath.should.equal('/a/b/c/instrumentspath');
(0, _appiumTestSupport.verify)(mocks);
case 10:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
});
}));
describe('spawnInstruments', (0, _appiumTestSupport.withMocks)({ fs: _appiumSupport.fs, tp: tp, utils: _.utils }, function (mocks) {
it('should work', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
instruments = new _.Instruments({});
instruments.xcodeVersion = XCODE_VERSION;
instruments.template = '/a/b/c/d/tracetemplate';
instruments.instrumentsPath = '/a/b/c/instrumentspath';
mocks.fs.expects('exists').once().returns(_Promise.resolve(false));
mocks.tp.expects('spawn').once().returns({});
mocks.utils.expects('getIwdPath').once().returns(_Promise.resolve('/a/b/c/iwd'));
context$3$0.next = 9;
return _regeneratorRuntime.awrap(instruments.spawnInstruments());
case 9:
(0, _appiumTestSupport.verify)(mocks);
case 10:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
});
it('should properly handle process arguments', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
instruments = new _.Instruments({});
instruments.processArguments = '-e firstoption firstoptionsarg -e secondoption second option arg';
instruments.xcodeVersion = XCODE_VERSION;
instruments.template = '/a/b/c/d/tracetemplate';
instruments.instrumentsPath = '/a/b/c/instrumentspath';
mocks.fs.expects('exists').once().returns(_Promise.resolve(false));
mocks.tp.expects('spawn').once().withArgs(_sinon2['default'].match(instruments.instrumentsPath),
// sinon.match.string,
["-t", "/a/b/c/d/tracetemplate", "-D", "/tmp/appium-instruments/instrumentscli0.trace", undefined, "-e", "firstoption", "firstoptionsarg", "-e", "secondoption", "second option arg", "-e", "UIASCRIPT", undefined, "-e", "UIARESULTSPATH", "/tmp/appium-instruments"], _sinon2['default'].match.object).returns({});
mocks.utils.expects('getIwdPath').once().returns(_Promise.resolve('/a/b/c/iwd'));
context$3$0.next = 10;
return _regeneratorRuntime.awrap(instruments.spawnInstruments());
case 10:
(0, _appiumTestSupport.verify)(mocks);
case 11:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
});
it('should properly handle non-environment-variable process arguments', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
instruments = new _.Instruments({});
instruments.processArguments = 'some random process arguments';
instruments.xcodeVersion = XCODE_VERSION;
instruments.template = '/a/b/c/d/tracetemplate';
instruments.instrumentsPath = '/a/b/c/instrumentspath';
mocks.fs.expects('exists').once().returns(_Promise.resolve(false));
mocks.tp.expects('spawn').once().withArgs(_sinon2['default'].match(instruments.instrumentsPath),
// sinon.match.string,
["-t", "/a/b/c/d/tracetemplate", "-D", "/tmp/appium-instruments/instrumentscli0.trace", undefined, "some random process arguments", "-e", "UIASCRIPT", undefined, "-e", "UIARESULTSPATH", "/tmp/appium-instruments"], _sinon2['default'].match.object).returns({});
mocks.utils.expects('getIwdPath').once().returns(_Promise.resolve('/a/b/c/iwd'));
context$3$0.next = 10;
return _regeneratorRuntime.awrap(instruments.spawnInstruments());
case 10:
(0, _appiumTestSupport.verify)(mocks);
case 11:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
});
it('should properly handle process arguments as hash', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
instruments = new _.Instruments({});
instruments.processArguments = { firstoption: 'firstoptionsarg', secondoption: 'second option arg' };
instruments.xcodeVersion = XCODE_VERSION;
instruments.template = '/a/b/c/d/tracetemplate';
instruments.instrumentsPath = '/a/b/c/instrumentspath';
mocks.fs.expects('exists').once().returns(_Promise.resolve(false));
mocks.tp.expects('spawn').once().withArgs(_sinon2['default'].match(instruments.instrumentsPath),
// sinon.match.string,
["-t", "/a/b/c/d/tracetemplate", "-D", "/tmp/appium-instruments/instrumentscli0.trace", undefined, "-e", "firstoption", "firstoptionsarg", "-e", "secondoption", "second option arg", "-e", "UIASCRIPT", undefined, "-e", "UIARESULTSPATH", "/tmp/appium-instruments"], _sinon2['default'].match.object).returns({});
mocks.utils.expects('getIwdPath').once().returns(_Promise.resolve('/a/b/c/iwd'));
context$3$0.next = 10;
return _regeneratorRuntime.awrap(instruments.spawnInstruments());
case 10:
(0, _appiumTestSupport.verify)(mocks);
case 11:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
});
it('should add language and locale arguments when appropriate', function callee$2$0() {
var instruments;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
instruments = new _.Instruments({ locale: "de_DE", language: "de" });
instruments.processArguments = 'some random process arguments';
instruments.xcodeVersion = XCODE_VERSION;
instruments.template = '/a/b/c/d/tracetemplate';
instruments.instrumentsPath = '/a/b/c/instrumentspath';
mocks.fs.expects('exists').once().returns(_Promise.resolve(false));
mocks.tp.expects('spawn').once().withArgs(_sinon2['default'].match(instruments.instrumentsPath),
// sinon.match.string,
["-t", "/a/b/c/d/tracetemplate", "-D", "/tmp/appium-instruments/instrumentscli0.trace", undefined, "some random process arguments", "-e", "UIASCRIPT", undefined, "-e", "UIARESULTSPATH", "/tmp/appium-instruments", "-AppleLanguages (de)", "-NSLanguages (de)", "-AppleLocale de_DE"], _sinon2['default'].match.object).returns({});
mocks.utils.expects('getIwdPath').once().returns(_Promise.resolve('/a/b/c/iwd'));
context$3$0.next = 10;
return _regeneratorRuntime.awrap(instruments.spawnInstruments());
case 10:
(0, _appiumTestSupport.verify)(mocks);
case 11:
case 'end':
return context$3$0.stop();
}
}, null, _this2);
});
}));
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaW5zdHJ1bWVudHMtc3BlY3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Z0JBRW1DLElBQUk7OzRCQUNuQixjQUFjOztJQUF0QixFQUFFOztvQkFDRyxNQUFNOzs7OzJCQUNMLGNBQWM7Ozs7aUNBQ0UscUJBQXFCOzs2QkFDcEMsZ0JBQWdCOztxQkFDakIsT0FBTzs7OztBQUd6QixrQkFBSyxNQUFNLEVBQUUsQ0FBQzs7QUFFZCxJQUFNLGFBQWEsR0FBRztBQUNwQixlQUFhLEVBQUUsT0FBTztBQUN0QixjQUFZLEVBQUUsR0FBRztBQUNqQixPQUFLLEVBQUUsQ0FBQztBQUNSLE9BQUssRUFBRSxDQUFDO0FBQ1IsT0FBSyxFQUFFLENBQUM7Q0FDVCxDQUFDOztBQUVGLFFBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBTTtBQUM1QixVQUFRLENBQUMsaUJBQWlCLEVBQUU7Ozs7OztBQUMxQixZQUFFLENBQUMsMkJBQTJCLEVBQUU7Z0JBQzFCLElBQUksRUFHSixXQUFXOzs7O0FBSFgsc0JBQUksR0FBRztBQUNULHVCQUFHLEVBQUUsZUFBZTttQkFDckI7O21EQUN1QixjQUFZLGdCQUFnQixDQUFDLElBQUksQ0FBQzs7O0FBQXRELDZCQUFXOztBQUNmLDZCQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7O1dBQ3hDLENBQUMsQ0FBQzs7Ozs7OztHQUNKLENBQUMsQ0FBQztBQUNILFVBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBTTtBQUM1QixNQUFFLENBQUMsMkJBQTJCLEVBQUUsWUFBTTtBQUNwQyxVQUFJLElBQUksR0FBRztBQUNULFdBQUcsRUFBRSxlQUFlO09BQ3JCLENBQUM7QUFDRixVQUFJLFdBQVcsR0FBRyxrQkFBZ0IsSUFBSSxDQUFDLENBQUM7QUFDeEMsaUJBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMs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d0JBQXdCLENBQUM7QUFDaEQsdUJBQVcsQ0FBQyxlQUFlLEdBQUcsd0JBQXdCLENBQUM7QUFDdkQsaUJBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLGlCQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDN0IsUUFBUSxDQUNQLG1CQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDOztBQUV4QyxhQUFDLElBQUksRUFBRSx3QkFBd0IsRUFDOUIsSUFBSSxFQUFFLCtDQUErQyxFQUFFLFNBQVMsRUFDaEUsK0JBQStCLEVBQy9CLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUM1QixJQUFJLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQ2pELHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsb0JBQW9CLENBQUMsRUFDdEIsbUJBQU0sS0FBSyxDQUFDLE1BQU0sQ0FDbkIsQ0FDQSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZixpQkFBSyxDQUFDLEtBQUssQ0FDUixPQUFPLENBQUMsWUFBWSxDQUFDLENBQ3JCLElBQUksRUFBRSxDQUNOLE9BQU8sQ0FBQyxTQUFRLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDOzs2Q0FDcEMsV0FBVyxDQUFDLGdCQUFnQixFQUFFOzs7O0FBRXBDLDJDQUFPLEtBQUssQ0FBQyxDQUFDOzs7Ozs7O0tBQ2YsQ0FBQyxDQUFDO0dBQ0osQ0FBQyxDQUFDLENBQUM7Q0FDTCxDQUFDLENBQUMiLCJmaWxlIjoidGVzdC9pbnN0cnVtZW50cy1zcGVjcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBJbnN0cnVtZW50cywgdXRpbHMgfSBmcm9tICcuLic7XG5pbXBvcnQgKiBhcyB0cCBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgeGNvZGUgZnJvbSAnYXBwaXVtLXhjb2RlJztcbmltcG9ydCB7IHdpdGhNb2NrcywgdmVyaWZ5IH0gZnJvbSAnYXBwaXVtLXRlc3Qtc3VwcG9ydCc7XG5pbXBvcnQgeyBmcyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuY2hhaS5zaG91bGQoKTtcblxuY29uc3QgWENPREVfVkVSU0lPTiA9IHtcbiAgdmVyc2lvblN0cmluZzogJzcuMS4xJyxcbiAgdmVyc2lvbkZsb2F0OiA3LjEsXG4gIG1ham9yOiA3LFxuICBtaW5vcjogMSxcbiAgcGF0Y2g6IDFcbn07XG5cbmRlc2NyaWJlKCdpbnN0cnVtZW50cycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3F1aWNrSW5zdHJ1bWVudCcsIGFzeW5jICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpbnN0cnVtZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBvcHRzID0ge1xuICAgICAgICBhcHA6ICcvYS9iL2MvbXkuYXBwJyxcbiAgICAgIH07XG4gICAgICBsZXQgaW5zdHJ1bWVudHMgPSBhd2FpdCBJbnN0cnVtZW50cy5xdWlja0luc3RydW1lbnRzKG9wdHMpO1xuICAgICAgaW5zdHJ1bWVudHMuYXBwLnNob3VsZC5lcXVhbChvcHRzLmFwcCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnY29uc3RydWN0b3InLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaW5zdHJ1bWVudHMnLCAoKSA9PiB7XG4gICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgYXBwOiAnL2EvYi9jL215LmFwcCcsXG4gICAgICB9O1xuICAgICAgbGV0IGluc3RydW1lbnRzID0gbmV3IEluc3RydW1lbnRzKG9wdHMpO1xuICAgICAgaW5zdHJ1bWVudHMuYXBwLnNob3VsZC5lcXVhbChvcHRzLmFwcCk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnY29uZmlndXJlJywgd2l0aE1vY2tzKHt4Y29kZSwgdXRpbHN9LCAobW9ja3MpID0+IHtcbiAgICBpdCgnc2hvdWxkIHdvcmsnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgaW5zdHJ1bWVudHMgPSBuZXcgSW5zdHJ1bWVudHMoe30pO1xuICAgICAgbW9ja3MueGNvZGVcbiAgICAgICAgLmV4cGVjdHMoJ2dldFZlcnNpb24nKVxuICAgICAgICAub25jZSgpXG4gICAgICAgIC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZShYQ09ERV9WRVJTSU9OKSk7XG4gICAgICBtb2Nrcy54Y29kZVxuICAgICAgICAuZXhwZWN0cygnZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoJylcbiAgICAgICAgLm9uY2UoKVxuICAgICAgICAucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJy9hL2IvYy9kL3RyYWNldGVtcGxhdGUnKSk7XG4gICAgICBtb2Nrcy51dGlsc1xuICAgICAgICAuZXhwZWN0cygnZ2V0SW5zdHJ1bWVudHNQYXRoJylcbiAgICAgICAgLm9uY2UoKVxuICAgICAgICAucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJy9hL2IvYy9pbnN0cnVtZW50c3BhdGgnKSk7XG4gICAgICBhd2FpdCBpbnN0cnVtZW50cy5jb25maWd1cmUoKTtcbiAgICAgIGluc3RydW1lbnRzLnhjb2RlVmVyc2lvbi52ZXJzaW9uU3RyaW5nLnNob3VsZC5lcXVhbChYQ09ERV9WRVJTSU9OLnZlcnNpb25TdHJpbmcpO1xuICAgICAgaW5zdHJ1bWVudHMudGVtcGxhdGUuc2hvdWxkLmVxdWFsKCcvYS9iL2MvZC90cmFjZXRlbXBsYXRlJyk7XG4gICAgICBpbnN0cnVtZW50cy5pbnN0cnVtZW50c1BhdGguc2hvdWxkLmVxdWFsKCcvYS9iL2MvaW5zdHJ1bWVudHNwYXRoJyk7XG4gICAgICB2ZXJpZnkobW9ja3MpO1xuICAgIH0pO1xuICB9KSk7XG4gIGRlc2NyaWJlKCdzcGF3bkluc3RydW1lbnRzJywgd2l0aE1vY2tzKHtmcywgdHAsIHV0aWxzfSwgKG1vY2tzKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB3b3JrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGluc3RydW1lbnRzID0gbmV3IEluc3RydW1lbnRzKHt9KTtcbiAgICAgIGluc3RydW1lbnRzLnhjb2RlVmVyc2lvbiA9IFhDT0RFX1ZFUlNJT047XG4gICAgICBpbnN0cnVtZW50cy50ZW1wbGF0ZSA9ICcvYS9iL2MvZC90cmFjZXRlbXBsYXRlJztcbiAgICAgIGluc3RydW1lbnRzLmluc3RydW1lbnRzUGF0aCA9ICcvYS9iL2MvaW5zdHJ1bWVudHNwYXRoJztcbiAgICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZShmYWxzZSkpO1xuICAgICAgbW9ja3MudHAuZXhwZWN0cygnc3Bhd24nKS5vbmNlKCkucmV0dXJucyh7fSk7XG4gICAgICBtb2Nrcy51dGlsc1xuICAgICAgICAuZXhwZWN0cygnZ2V0SXdkUGF0aCcpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCcvYS9iL2MvaXdkJykpO1xuICAgICAgYXdhaXQgaW5zdHJ1bWVudHMuc3Bhd25JbnN0cnVtZW50cygpO1xuICAgICAgdmVyaWZ5KG1vY2tzKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGhhbmRsZSBwcm9jZXNzIGFyZ3VtZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpbnN0cnVtZW50cyA9IG5ldyBJbnN0cnVtZW50cyh7fSk7XG4gICAgICBpbnN0cnVtZW50cy5wcm9jZXNzQXJndW1lbnRzID0gJy1lIGZpcnN0b3B0aW9uIGZpcnN0b3B0aW9uc2FyZyAtZSBzZWNvbmRvcHRpb24gc2Vjb25kIG9wdGlvbiBhcmcnO1xuICAgICAgaW5zdHJ1bWVudHMueGNvZGVWZXJzaW9uID0gWENPREVfVkVSU0lPTjtcbiAgICAgIGluc3RydW1lbnRzLnRlbXBsYXRlID0gJy9hL2IvYy9kL3RyYWNldGVtcGxhdGUnO1xuICAgICAgaW5zdHJ1bWVudHMuaW5zdHJ1bWVudHNQYXRoID0gJy9hL2IvYy9pbnN0cnVtZW50c3BhdGgnO1xuICAgICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykub25jZSgpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7XG4gICAgICBtb2Nrcy50cC5leHBlY3RzKCdzcGF3bicpLm9uY2UoKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgc2lub24ubWF0Y2goaW5zdHJ1bWVudHMuaW5zdHJ1bWVudHNQYXRoKSxcbiAgICAgICAgICAvLyBzaW5vbi5tYXRjaC5zdHJpbmcsXG4gICAgICAgICAgW1wiLXRcIiwgXCIvYS9iL2MvZC90cmFjZXRlbXBsYXRlXCIsXG4gICAgICAgICAgIFwiLURcIiwgXCIvdG1wL2FwcGl1bS1pbnN0cnVtZW50cy9pbnN0cnVtZW50c2NsaTAudHJhY2VcIiwgdW5kZWZpbmVkLFxuICAgICAgICAgICBcIi1lXCIsIFwiZmlyc3RvcHRpb25cIiwgXCJmaXJzdG9wdGlvbnNhcmdcIixcbiAgICAgICAgICAgXCItZVwiLCBcInNlY29uZG9wdGlvblwiLCBcInNlY29uZCBvcHRpb24gYXJnXCIsXG4gICAgICAgICAgIFwiLWVcIiwgXCJVSUFTQ1JJUFRcIiwgdW5kZWZpbmVkLFxuICAgICAgICAgICBcIi1lXCIsIFwiVUlBUkVTVUxUU1BBVEhcIiwgXCIvdG1wL2FwcGl1bS1pbnN0cnVtZW50c1wiXSxcbiAgICAgICAgICBzaW5vbi5tYXRjaC5vYmplY3RcbiAgICAgICAgKVxuICAgICAgICAucmV0dXJucyh7fSk7XG4gICAgICBtb2Nrcy51dGlsc1xuICAgICAgICAuZXhwZWN0cygnZ2V0SXdkUGF0aCcpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCcvYS9iL2MvaXdkJykpO1xuICAgICAgYXdhaXQgaW5zdHJ1bWVudHMuc3Bhd25JbnN0cnVtZW50cygpO1xuXG4gICAgICB2ZXJpZnkobW9ja3MpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgaGFuZGxlIG5vbi1lbnZpcm9ubWVudC12YXJpYWJsZSBwcm9jZXNzIGFyZ3VtZW50cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpbnN0cnVtZW50cyA9IG5ldyBJbnN0cnVtZW50cyh7fSk7XG4gICAgICBpbnN0cnVtZW50cy5wcm9jZXNzQXJndW1lbnRzID0gJ3NvbWUgcmFuZG9tIHByb2Nlc3MgYXJndW1lbnRzJztcbiAgICAgIGluc3RydW1lbnRzLnhjb2RlVmVyc2lvbiA9IFhDT0RFX1ZFUlNJT047XG4gICAgICBpbnN0cnVtZW50cy50ZW1wbGF0ZSA9ICcvYS9iL2MvZC90cmFjZXRlbXBsYXRlJztcbiAgICAgIGluc3RydW1lbnRzLmluc3RydW1lbnRzUGF0aCA9ICcvYS9iL2MvaW5zdHJ1bWVudHNwYXRoJztcbiAgICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZShmYWxzZSkpO1xuICAgICAgbW9ja3MudHAuZXhwZWN0cygnc3Bhd24nKS5vbmNlKClcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgIHNpbm9uLm1hdGNoKGluc3RydW1lbnRzLmluc3RydW1lbnRzUGF0aCksXG4gICAgICAgICAgLy8gc2lub24ubWF0Y2guc3RyaW5nLFxuICAgICAgICAgIFtcIi10XCIsIFwiL2EvYi9jL2QvdHJhY2V0ZW1wbGF0ZVwiLFxuICAgICAgICAgICBcIi1EXCIsIFwiL3RtcC9hcHBpdW0taW5zdHJ1bWVudHMvaW5zdHJ1bWVudHNjbGkwLnRyYWNlXCIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgXCJzb21lIHJhbmRvbSBwcm9jZXNzIGFyZ3VtZW50c1wiLFxuICAgICAgICAgICBcIi1lXCIsIFwiVUlBU0NSSVBUXCIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgXCItZVwiLCBcIlVJQVJFU1VMVFNQQVRIXCIsIFwiL3RtcC9hcHBpdW0taW5zdHJ1bWVudHNcIl0sXG4gICAgICAgICAgc2lub24ubWF0Y2gub2JqZWN0XG4gICAgICAgIClcbiAgICAgICAgLnJldHVybnMoe30pO1xuICAgICAgbW9ja3MudXRpbHNcbiAgICAgICAgLmV4cGVjdHMoJ2dldEl3ZFBhdGgnKVxuICAgICAgICAub25jZSgpXG4gICAgICAgIC5yZXR1cm5zKFByb21pc2UucmVzb2x2ZSgnL2EvYi9jL2l3ZCcpKTtcbiAgICAgIGF3YWl0IGluc3RydW1lbnRzLnNwYXduSW5zdHJ1bWVudHMoKTtcblxuICAgICAgdmVyaWZ5KG1vY2tzKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGhhbmRsZSBwcm9jZXNzIGFyZ3VtZW50cyBhcyBoYXNoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGluc3RydW1lbnRzID0gbmV3IEluc3RydW1lbnRzKHt9KTtcbiAgICAgIGluc3RydW1lbnRzLnByb2Nlc3NBcmd1bWVudHMgPSB7Zmlyc3RvcHRpb246ICdmaXJzdG9wdGlvbnNhcmcnLCBzZWNvbmRvcHRpb246ICdzZWNvbmQgb3B0aW9uIGFyZyd9O1xuICAgICAgaW5zdHJ1bWVudHMueGNvZGVWZXJzaW9uID0gWENPREVfVkVSU0lPTjtcbiAgICAgIGluc3RydW1lbnRzLnRlbXBsYXRlID0gJy9hL2IvYy9kL3RyYWNldGVtcGxhdGUnO1xuICAgICAgaW5zdHJ1bWVudHMuaW5zdHJ1bWVudHNQYXRoID0gJy9hL2IvYy9pbnN0cnVtZW50c3BhdGgnO1xuICAgICAgbW9ja3MuZnMuZXhwZWN0cygnZXhpc3RzJykub25jZSgpLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7XG4gICAgICBtb2Nrcy50cC5leHBlY3RzKCdzcGF3bicpLm9uY2UoKVxuICAgICAgICAud2l0aEFyZ3MoXG4gICAgICAgICAgc2lub24ubWF0Y2goaW5zdHJ1bWVudHMuaW5zdHJ1bWVudHNQYXRoKSxcbiAgICAgICAgICAvLyBzaW5vbi5tYXRjaC5zdHJpbmcsXG4gICAgICAgICAgW1wiLXRcIiwgXCIvYS9iL2MvZC90cmFjZXRlbXBsYXRlXCIsXG4gICAgICAgICAgIFwiLURcIiwgXCIvdG1wL2FwcGl1bS1pbnN0cnVtZW50cy9pbnN0cnVtZW50c2NsaTAudHJhY2VcIiwgdW5kZWZpbmVkLFxuICAgICAgICAgICBcIi1lXCIsIFwiZmlyc3RvcHRpb25cIiwgXCJmaXJzdG9wdGlvbnNhcmdcIixcbiAgICAgICAgICAgXCItZVwiLCBcInNlY29uZG9wdGlvblwiLCBcInNlY29uZCBvcHRpb24gYXJnXCIsXG4gICAgICAgICAgIFwiLWVcIiwgXCJVSUFTQ1JJUFRcIiwgdW5kZWZpbmVkLFxuICAgICAgICAgICBcIi1lXCIsIFwiVUlBUkVTVUxUU1BBVEhcIiwgXCIvdG1wL2FwcGl1bS1pbnN0cnVtZW50c1wiXSxcbiAgICAgICAgICBzaW5vbi5tYXRjaC5vYmplY3RcbiAgICAgICAgKVxuICAgICAgICAucmV0dXJucyh7fSk7XG4gICAgICBtb2Nrcy51dGlsc1xuICAgICAgICAuZXhwZWN0cygnZ2V0SXdkUGF0aCcpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLnJldHVybnMoUHJvbWlzZS5yZXNvbHZlKCcvYS9iL2MvaXdkJykpO1xuICAgICAgYXdhaXQgaW5zdHJ1bWVudHMuc3Bhd25JbnN0cnVtZW50cygpO1xuXG4gICAgICB2ZXJpZnkobW9ja3MpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgYWRkIGxhbmd1YWdlIGFuZCBsb2NhbGUgYXJndW1lbnRzIHdoZW4gYXBwcm9wcmlhdGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgaW5zdHJ1bWVudHMgPSBuZXcgSW5zdHJ1bWVudHMoe2xvY2FsZTogXCJkZV9ERVwiLCBsYW5ndWFnZTogXCJkZVwifSk7XG4gICAgICBpbnN0cnVtZW50cy5wcm9jZXNzQXJndW1lbnRzID0gJ3NvbWUgcmFuZG9tIHByb2Nlc3MgYXJndW1lbnRzJztcbiAgICAgIGluc3RydW1lbnRzLnhjb2RlVmVyc2lvbiA9IFhDT0RFX1ZFUlNJT047XG4gICAgICBpbnN0cnVtZW50cy50ZW1wbGF0ZSA9ICcvYS9iL2MvZC90cmFjZXRlbXBsYXRlJztcbiAgICAgIGluc3RydW1lbnRzLmluc3RydW1lbnRzUGF0aCA9ICcvYS9iL2MvaW5zdHJ1bWVudHNwYXRoJztcbiAgICAgIG1vY2tzLmZzLmV4cGVjdHMoJ2V4aXN0cycpLm9uY2UoKS5yZXR1cm5zKFByb21pc2UucmVzb2x2ZShmYWxzZSkpO1xuICAgICAgbW9ja3MudHAuZXhwZWN0cygnc3Bhd24nKS5vbmNlKClcbiAgICAgICAgLndpdGhBcmdzKFxuICAgICAgICAgIHNpbm9uLm1hdGNoKGluc3RydW1lbnRzLmluc3RydW1lbnRzUGF0aCksXG4gICAgICAgICAgLy8gc2lub24ubWF0Y2guc3RyaW5nLFxuICAgICAgICAgIFtcIi10XCIsIFwiL2EvYi9jL2QvdHJhY2V0ZW1wbGF0ZVwiLFxuICAgICAgICAgICBcIi1EXCIsIFwiL3RtcC9hcHBpdW0taW5zdHJ1bWVudHMvaW5zdHJ1bWVudHNjbGkwLnRyYWNlXCIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgXCJzb21lIHJhbmRvbSBwcm9jZXNzIGFyZ3VtZW50c1wiLFxuICAgICAgICAgICBcIi1lXCIsIFwiVUlBU0NSSVBUXCIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgXCItZVwiLCBcIlVJQVJFU1VMVFNQQVRIXCIsIFwiL3RtcC9hcHBpdW0taW5zdHJ1bWVudHNcIixcbiAgICAgICAgICAgXCItQXBwbGVMYW5ndWFnZXMgKGRlKVwiLFxuICAgICAgICAgICBcIi1OU0xhbmd1YWdlcyAoZGUpXCIsXG4gICAgICAgICAgIFwiLUFwcGxlTG9jYWxlIGRlX0RFXCJdLFxuICAgICAgICAgIHNpbm9uLm1hdGNoLm9iamVjdFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5zKHt9KTtcbiAgICAgIG1vY2tzLnV0aWxzXG4gICAgICAgIC5leHBlY3RzKCdnZXRJd2RQYXRoJylcbiAgICAgICAgLm9uY2UoKVxuICAgICAgICAucmV0dXJucyhQcm9taXNlLnJlc29sdmUoJy9hL2IvYy9pd2QnKSk7XG4gICAgICBhd2FpdCBpbnN0cnVtZW50cy5zcGF3bkluc3RydW1lbnRzKCk7XG5cbiAgICAgIHZlcmlmeShtb2Nrcyk7XG4gICAgfSk7XG4gIH0pKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIuLi8uLiJ9