@testim/testim-cli
Version:
Command line interface for running Testing on you CI
384 lines (317 loc) • 30.6 kB
JavaScript
;
var _createClass = require('babel-runtime/helpers/create-class')['default'];
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _Object$keys = require('babel-runtime/core-js/object/keys')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _deepmerge = require('deepmerge');
var _deepmerge2 = _interopRequireDefault(_deepmerge);
var _utilsConfigParser = require('./utils/ConfigParser');
var _utilsConfigParser2 = _interopRequireDefault(_utilsConfigParser);
var _ = require('../');
var Runner = (function () {
function Runner() {
_classCallCheck(this, Runner);
this.haltSIGINT = false;
this.sigintWasCalled = false;
this.hasSessionID = false;
this.failures = 0;
}
_createClass(Runner, [{
key: 'run',
value: function run(m) {
var config, capabilities;
return _regeneratorRuntime.async(function run$(context$2$0) {
var _this = this;
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
this.cid = m.cid;
this.configParser = new _utilsConfigParser2['default']();
this.configParser.addConfigFile(m.configFile);
this.configParser.merge(m.argv);
config = this.configParser.getConfig();
capabilities = this.configParser.getCapabilities(m.cid);
this.framework = this.initialiseFramework(config);
global.browser = this.initialiseInstance(m.isMultiremote, capabilities);
this.initialisePlugins(config);
/**
* store end method before it gets fiberised by wdio-sync
*/
this.endSession = global.browser.end.bind(global.browser);
/**
* initialisation successful, send start message
*/
process.send({
event: 'runner:start',
cid: m.cid,
capabilities: capabilities,
config: config
});
/**
* register runner events
*/
global.browser.on('init', function (payload) {
process.send({
event: 'runner:init',
cid: m.cid,
sessionID: payload.sessionID,
options: payload.options,
desiredCapabilities: payload.desiredCapabilities
});
_this.hasSessionID = true;
});
global.browser.on('command', function (payload) {
process.send({
event: 'runner:command',
cid: m.cid,
method: payload.method,
uri: payload.uri,
data: payload.data
});
});
global.browser.on('result', function (payload) {
process.send({
event: 'runner:result',
cid: m.cid,
requestData: payload.requestData,
requestOptions: payload.requestOptions,
body: payload.body // ToDo figure out if this slows down the execution time
});
});
global.browser.on('error', function (payload) {
process.send({
event: 'runner:error',
cid: m.cid,
err: payload.err,
requestData: payload.requestData,
requestOptions: payload.requestOptions,
body: payload.body
});
});
this.haltSIGINT = true;
context$2$0.prev = 16;
context$2$0.next = 19;
return _regeneratorRuntime.awrap(global.browser.init());
case 19:
this.haltSIGINT = false;
/**
* kill session of SIGINT signal showed up while trying to
* get a session ID
*/
if (!this.sigintWasCalled) {
context$2$0.next = 23;
break;
}
context$2$0.next = 23;
return _regeneratorRuntime.awrap(this.end(1));
case 23:
context$2$0.next = 25;
return _regeneratorRuntime.awrap(this.framework.run(m.cid, config, m.specs, capabilities));
case 25:
this.failures = context$2$0.sent;
context$2$0.next = 28;
return _regeneratorRuntime.awrap(this.end(this.failures));
case 28:
context$2$0.next = 35;
break;
case 30:
context$2$0.prev = 30;
context$2$0.t0 = context$2$0['catch'](16);
process.send({
event: 'error',
cid: this.cid,
capabilities: capabilities,
error: {
message: context$2$0.t0.message,
stack: context$2$0.t0.stack
}
});
context$2$0.next = 35;
return _regeneratorRuntime.awrap(this.end(1));
case 35:
case 'end':
return context$2$0.stop();
}
}, null, this, [[16, 30]]);
}
/**
* end test runner instance and exit process
*/
}, {
key: 'end',
value: function end() {
var failures = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];
return _regeneratorRuntime.async(function end$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
if (!this.hasSessionID) {
context$2$0.next = 3;
break;
}
context$2$0.next = 3;
return _regeneratorRuntime.awrap(this.endSession());
case 3:
process.send({
event: 'runner:end',
failures: failures,
cid: this.cid
});
process.exit(failures === 0 ? 0 : 1);
case 5:
case 'end':
return context$2$0.stop();
}
}, null, this);
}
}, {
key: 'sigintHandler',
value: function sigintHandler() {
if (this.sigintWasCalled) {
return;
}
this.sigintWasCalled = true;
if (this.haltSIGINT) {
return;
}
global.browser.removeAllListeners();
this.end(1);
}
}, {
key: 'initialiseFramework',
value: function initialiseFramework(config) {
if (typeof config.framework !== 'string') {
throw new Error('You haven\'t defined a valid framework. ' + 'Please checkout http://webdriver.io/guide/testrunner/frameworks.html');
}
var frameworkLibrary = config.framework.toLowerCase();
try {
return require('wdio-' + frameworkLibrary + '-framework');
} catch (e) {
throw new Error('Couldn\'t load "' + frameworkLibrary + '" framework. You need to install ' + ('it with `$ npm install wdio-' + frameworkLibrary + '-framework`!'));
}
}
}, {
key: 'initialiseInstance',
value: function initialiseInstance(isMultiremote, capabilities) {
var config = this.configParser.getConfig();
if (!isMultiremote) {
config.desiredCapabilities = capabilities;
return (0, _.remote)(config);
}
var options = capabilities;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(_Object$keys(options)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var browserName = _step.value;
options[browserName] = (0, _deepmerge2['default'])(config, options[browserName]);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var browser = (0, _.multiremote)(options);
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = _getIterator(_Object$keys(options)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var browserName = _step2.value;
global[browserName] = browser.select(browserName);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2['return']) {
_iterator2['return']();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return browser;
}
/**
* initialise WebdriverIO compliant plugins
*/
}, {
key: 'initialisePlugins',
value: function initialisePlugins(config) {
if (typeof config.plugins !== 'object') {
return;
}
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = _getIterator(_Object$keys(config.plugins)), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var pluginName = _step3.value;
var plugin = undefined;
try {
plugin = require(pluginName);
} catch (e) {
throw new Error('Couldn\'t find plugin "' + pluginName + '". You need to install it ' + ('with `$ npm install ' + pluginName + '`!'));
}
if (typeof plugin.init !== 'function') {
throw new Error('The plugin "' + pluginName + '" is not WebdriverIO compliant!');
}
plugin.init(global.browser, config.plugins[pluginName]);
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3['return']) {
_iterator3['return']();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
}
}]);
return Runner;
})();
var runner = new Runner();
process.on('message', function (m) {
runner[m.command](m)['catch'](function (e) {
/**
* custom exit code to propagate initialisation error
*/
process.send({
event: 'runner:error',
error: {
message: e.message,
stack: e.stack
},
capabilities: runner.configParser.getCapabilities(runner.cid),
cid: runner.cid
});
process.exit(1);
});
});
/**
* catches ctrl+c event
*/
process.on('SIGINT', function () {
runner.sigintHandler();
});
//# sourceMappingURL=data:application/json;base64,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O0FBS0YsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsWUFBTTtBQUN2QixVQUFNLENBQUMsYUFBYSxFQUFFLENBQUE7Q0FDekIsQ0FBQyxDQUFBIiwiZmlsZSI6InJ1bm5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnXG5cbmltcG9ydCBDb25maWdQYXJzZXIgZnJvbSAnLi91dGlscy9Db25maWdQYXJzZXInXG5pbXBvcnQgeyByZW1vdGUsIG11bHRpcmVtb3RlIH0gZnJvbSAnLi4vJ1xuXG5jbGFzcyBSdW5uZXIge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5oYWx0U0lHSU5UID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaWdpbnRXYXNDYWxsZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLmhhc1Nlc3Npb25JRCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZmFpbHVyZXMgPSAwXG4gICAgfVxuXG4gICAgYXN5bmMgcnVuIChtKSB7XG4gICAgICAgIHRoaXMuY2lkID0gbS5jaWRcblxuICAgICAgICB0aGlzLmNvbmZpZ1BhcnNlciA9IG5ldyBDb25maWdQYXJzZXIoKVxuICAgICAgICB0aGlzLmNvbmZpZ1BhcnNlci5hZGRDb25maWdGaWxlKG0uY29uZmlnRmlsZSlcbiAgICAgICAgdGhpcy5jb25maWdQYXJzZXIubWVyZ2UobS5hcmd2KVxuXG4gICAgICAgIGxldCBjb25maWcgPSB0aGlzLmNvbmZpZ1BhcnNlci5nZXRDb25maWcoKVxuICAgICAgICBsZXQgY2FwYWJpbGl0aWVzID0gdGhpcy5jb25maWdQYXJzZXIuZ2V0Q2FwYWJpbGl0aWVzKG0uY2lkKVxuXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrID0gdGhpcy5pbml0aWFsaXNlRnJhbWV3b3JrKGNvbmZpZylcbiAgICAgICAgZ2xvYmFsLmJyb3dzZXIgPSB0aGlzLmluaXRpYWxpc2VJbnN0YW5jZShtLmlzTXVsdGlyZW1vdGUsIGNhcGFiaWxpdGllcylcbiAgICAgICAgdGhpcy5pbml0aWFsaXNlUGx1Z2lucyhjb25maWcpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHN0b3JlIGVuZCBtZXRob2QgYmVmb3JlIGl0IGdldHMgZmliZXJpc2VkIGJ5IHdkaW8tc3luY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmRTZXNzaW9uID0gZ2xvYmFsLmJyb3dzZXIuZW5kLmJpbmQoZ2xvYmFsLmJyb3dzZXIpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGluaXRpYWxpc2F0aW9uIHN1Y2Nlc3NmdWwsIHNlbmQgc3RhcnQgbWVzc2FnZVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzcy5zZW5kKHtcbiAgICAgICAgICAgIGV2ZW50OiAncnVubmVyOnN0YXJ0JyxcbiAgICAgICAgICAgIGNpZDogbS5jaWQsXG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICAgIH0pXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJlZ2lzdGVyIHJ1bm5lciBldmVudHNcbiAgICAgICAgICovXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdpbml0JywgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3Muc2VuZCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdydW5uZXI6aW5pdCcsXG4gICAgICAgICAgICAgICAgY2lkOiBtLmNpZCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSUQ6IHBheWxvYWQuc2Vzc2lvbklELFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHBheWxvYWQub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBkZXNpcmVkQ2FwYWJpbGl0aWVzOiBwYXlsb2FkLmRlc2lyZWRDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuaGFzU2Vzc2lvbklEID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdjb21tYW5kJywgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3Muc2VuZCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdydW5uZXI6Y29tbWFuZCcsXG4gICAgICAgICAgICAgICAgY2lkOiBtLmNpZCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBheWxvYWQubWV0aG9kLFxuICAgICAgICAgICAgICAgIHVyaTogcGF5bG9hZC51cmksXG4gICAgICAgICAgICAgICAgZGF0YTogcGF5bG9hZC5kYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdyZXN1bHQnLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgcHJvY2Vzcy5zZW5kKHtcbiAgICAgICAgICAgICAgICBldmVudDogJ3J1bm5lcjpyZXN1bHQnLFxuICAgICAgICAgICAgICAgIGNpZDogbS5jaWQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IHBheWxvYWQucmVxdWVzdERhdGEsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHBheWxvYWQucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgYm9keTogcGF5bG9hZC5ib2R5IC8vIFRvRG8gZmlndXJlIG91dCBpZiB0aGlzIHNsb3dzIGRvd24gdGhlIGV4ZWN1dGlvbiB0aW1lXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLm9uKCdlcnJvcicsIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAncnVubmVyOmVycm9yJyxcbiAgICAgICAgICAgICAgICBjaWQ6IG0uY2lkLFxuICAgICAgICAgICAgICAgIGVycjogcGF5bG9hZC5lcnIsXG4gICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IHBheWxvYWQucmVxdWVzdERhdGEsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHBheWxvYWQucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgYm9keTogcGF5bG9hZC5ib2R5XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaGFsdFNJR0lOVCA9IHRydWVcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZ2xvYmFsLmJyb3dzZXIuaW5pdCgpXG4gICAgICAgICAgICB0aGlzLmhhbHRTSUdJTlQgPSBmYWxzZVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGtpbGwgc2Vzc2lvbiBvZiBTSUdJTlQgc2lnbmFsIHNob3dlZCB1cCB3aGlsZSB0cnlpbmcgdG9cbiAgICAgICAgICAgICAqIGdldCBhIHNlc3Npb24gSURcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc2lnaW50V2FzQ2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmQoMSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mYWlsdXJlcyA9IGF3YWl0IHRoaXMuZnJhbWV3b3JrLnJ1bihtLmNpZCwgY29uZmlnLCBtLnNwZWNzLCBjYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVuZCh0aGlzLmZhaWx1cmVzKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNpZDogdGhpcy5jaWQsXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2s6IGUuc3RhY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVuZCgxKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZW5kIHRlc3QgcnVubmVyIGluc3RhbmNlIGFuZCBleGl0IHByb2Nlc3NcbiAgICAgKi9cbiAgICBhc3luYyBlbmQgKGZhaWx1cmVzID0gMCkge1xuICAgICAgICBpZiAodGhpcy5oYXNTZXNzaW9uSUQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5kU2Vzc2lvbigpXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLnNlbmQoe1xuICAgICAgICAgICAgZXZlbnQ6ICdydW5uZXI6ZW5kJyxcbiAgICAgICAgICAgIGZhaWx1cmVzOiBmYWlsdXJlcyxcbiAgICAgICAgICAgIGNpZDogdGhpcy5jaWRcbiAgICAgICAgfSlcbiAgICAgICAgcHJvY2Vzcy5leGl0KGZhaWx1cmVzID09PSAwID8gMCA6IDEpXG4gICAgfVxuXG4gICAgc2lnaW50SGFuZGxlciAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ2ludFdhc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNpZ2ludFdhc0NhbGxlZCA9IHRydWVcblxuICAgICAgICBpZiAodGhpcy5oYWx0U0lHSU5UKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGdsb2JhbC5icm93c2VyLnJlbW92ZUFsbExpc3RlbmVycygpXG4gICAgICAgIHRoaXMuZW5kKDEpXG4gICAgfVxuXG4gICAgaW5pdGlhbGlzZUZyYW1ld29yayAoY29uZmlnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmZyYW1ld29yayAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgWW91IGhhdmVuJ3QgZGVmaW5lZCBhIHZhbGlkIGZyYW1ld29yay4gYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSBjaGVja291dCBodHRwOi8vd2ViZHJpdmVyLmlvL2d1aWRlL3Rlc3RydW5uZXIvZnJhbWV3b3Jrcy5odG1sYFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZyYW1ld29ya0xpYnJhcnkgPSBjb25maWcuZnJhbWV3b3JrLnRvTG93ZXJDYXNlKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlKGB3ZGlvLSR7ZnJhbWV3b3JrTGlicmFyeX0tZnJhbWV3b3JrYClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3VsZG4ndCBsb2FkIFwiJHtmcmFtZXdvcmtMaWJyYXJ5fVwiIGZyYW1ld29yay4gWW91IG5lZWQgdG8gaW5zdGFsbCBgICtcbiAgICAgICAgICAgICAgICBgaXQgd2l0aCBcXGAkIG5wbSBpbnN0YWxsIHdkaW8tJHtmcmFtZXdvcmtMaWJyYXJ5fS1mcmFtZXdvcmtcXGAhYFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGlzZUluc3RhbmNlIChpc011bHRpcmVtb3RlLCBjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHRoaXMuY29uZmlnUGFyc2VyLmdldENvbmZpZygpXG5cbiAgICAgICAgaWYgKCFpc011bHRpcmVtb3RlKSB7XG4gICAgICAgICAgICBjb25maWcuZGVzaXJlZENhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgcmV0dXJuIHJlbW90ZShjb25maWcpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IGNhcGFiaWxpdGllc1xuICAgICAgICBmb3IgKGxldCBicm93c2VyTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9uc1ticm93c2VyTmFtZV0gPSBtZXJnZShjb25maWcsIG9wdGlvbnNbYnJvd3Nlck5hbWVdKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJyb3dzZXIgPSBtdWx0aXJlbW90ZShvcHRpb25zKVxuICAgICAgICBmb3IgKGxldCBicm93c2VyTmFtZSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuICAgICAgICAgICAgZ2xvYmFsW2Jyb3dzZXJOYW1lXSA9IGJyb3dzZXIuc2VsZWN0KGJyb3dzZXJOYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBicm93c2VyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaW5pdGlhbGlzZSBXZWJkcml2ZXJJTyBjb21wbGlhbnQgcGx1Z2luc1xuICAgICAqL1xuICAgIGluaXRpYWxpc2VQbHVnaW5zIChjb25maWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcucGx1Z2lucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgcGx1Z2luTmFtZSBvZiBPYmplY3Qua2V5cyhjb25maWcucGx1Z2lucykpIHtcbiAgICAgICAgICAgIGxldCBwbHVnaW5cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4gPSByZXF1aXJlKHBsdWdpbk5hbWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGRuJ3QgZmluZCBwbHVnaW4gXCIke3BsdWdpbk5hbWV9XCIuIFlvdSBuZWVkIHRvIGluc3RhbGwgaXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGB3aXRoIFxcYCQgbnBtIGluc3RhbGwgJHtwbHVnaW5OYW1lfVxcYCFgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5pbml0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGx1Z2luIFwiJHtwbHVnaW5OYW1lfVwiIGlzIG5vdCBXZWJkcml2ZXJJTyBjb21wbGlhbnQhYClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGx1Z2luLmluaXQoZ2xvYmFsLmJyb3dzZXIsIGNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgcnVubmVyID0gbmV3IFJ1bm5lcigpXG5cbnByb2Nlc3Mub24oJ21lc3NhZ2UnLCAobSkgPT4ge1xuICAgIHJ1bm5lclttLmNvbW1hbmRdKG0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjdXN0b20gZXhpdCBjb2RlIHRvIHByb3BhZ2F0ZSBpbml0aWFsaXNhdGlvbiBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzcy5zZW5kKHtcbiAgICAgICAgICAgIGV2ZW50OiAncnVubmVyOmVycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIHN0YWNrOiBlLnN0YWNrXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBydW5uZXIuY29uZmlnUGFyc2VyLmdldENhcGFiaWxpdGllcyhydW5uZXIuY2lkKSxcbiAgICAgICAgICAgIGNpZDogcnVubmVyLmNpZFxuICAgICAgICB9KVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9KVxufSlcblxuLyoqXG4gKiBjYXRjaGVzIGN0cmwrYyBldmVudFxuICovXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgcnVubmVyLnNpZ2ludEhhbmRsZXIoKVxufSlcbiJdfQ==