smartlog-destination-local/index.js
2016-02-20 10:52:23 +01:00

326 lines
40 KiB
JavaScript

#!/usr/bin/env node
/// <reference path="./index.ts" />
var BeautylogPlugins;
(function (BeautylogPlugins) {
var plugins = {};
BeautylogPlugins.init = function () {
plugins = {
lodash: require("lodash"),
smartenv: require("smartenv"),
q: require("q")
};
if (plugins.smartenv.getEnv().isNode) {
plugins = plugins.lodash.assign(plugins, {
colors: require("colors"),
clc: require("cli-color"),
figlet: require("figlet")
});
}
return plugins;
};
})(BeautylogPlugins || (BeautylogPlugins = {}));
/// <reference path="./index.ts" />
var tableHelpers = {
makeRow: function (cellCounterArg, colorArg) {
if (cellCounterArg === void 0) { cellCounterArg = 2; }
if (colorArg === void 0) { colorArg = "cyan"; }
var rowArray = [];
for (var i = 0; i < (cellCounterArg); i++) {
rowArray.push(String(i + 1).cyan);
}
return rowArray;
}
};
var ConsoleTable = (function () {
function ConsoleTable(tableTypeArg, tableHeadArrayArg) {
if (tableHeadArrayArg === void 0) { tableHeadArrayArg = tableHelpers.makeRow(); }
switch (tableTypeArg) {
case "checks":
this.tableHead = ['Check Item:'.cyan, 'Status:'.cyan];
break;
case "custom":
this.tableHead = tableHeadArrayArg;
break;
default:
break;
}
this.rows = [];
this.type = tableTypeArg;
}
ConsoleTable.prototype.push = function (row) {
this.rows.push(row);
};
ConsoleTable.prototype.print = function () {
var table = new BeautylogNodeTable.cliTable({
head: this.tableHead
});
for (var row in this.rows) {
if (this.rows[row][1] == "success") {
this.rows[row][1] = ' '.bgGreen + ' ' + this.rows[row][1];
}
else if (this.rows[row][1] == "error") {
this.rows[row][1] = ' '.bgRed + ' ' + this.rows[row][1];
}
table.push(this.rows[row]);
}
;
console.log(table.toString());
};
return ConsoleTable;
})();
/// <reference path="./index.ts" />
var BeautylogNode;
(function (BeautylogNode) {
function init() {
var beautylogNode = {
log: BeautylogNodeLog.init(),
code: BeautylogNodeCode.init(),
figlet: BeautylogNodeFiglet.figlet,
figletSync: BeautylogNodeFiglet.figletSync
};
/**
* logs an directory to console
* @param logText
* @returns {boolean}
*/
beautylogNode.dir = function (logText) {
return beautylogNode.log(logText, 'dir');
};
/**
* logs an error to console
* @param logText
* @returns {boolean}
*/
beautylogNode.error = function (logText) {
return beautylogNode.log(logText, 'error');
};
/**
* logs an info to console
* @param logText
* @returns {boolean}
*/
beautylogNode.info = function (logText) {
return beautylogNode.log(logText, 'info');
};
/**
* logs an 'OK!' message to console
* @param logText
* @returns {boolean}
*/
beautylogNode.ok = function (logText) {
return beautylogNode.log(logText, 'ok');
};
/**
* logs a success to console
* @param logText string to log as error
* @returns {boolean}
*/
beautylogNode.success = function (logText) {
return beautylogNode.log(logText, 'success');
};
/**
* logs a 'warn:' message to console
* @param logText string to log as error
* @returns {boolean}
*/
beautylogNode.warn = function (logText) {
return beautylogNode.log(logText, 'warn');
};
beautylogNode.table = BeautylogNodeTable.init();
return beautylogNode;
}
BeautylogNode.init = init;
})(BeautylogNode || (BeautylogNode = {}));
/// <reference path="./index.ts" />
var BeautylogNodeLog;
(function (BeautylogNodeLog) {
BeautylogNodeLog.init = function () {
var localBl = {
dirPrefix: plugins.clc.bgXterm(39).xterm(231).bold(' DIR ') + ' ',
errorPrefix: ' Error: '.bgRed.white.bold + ' ',
infoPrefix: plugins.clc.bgXterm(198).xterm(231).bold(' INFO ') + ' ',
normalPrefix: ' Log: '.bgCyan.white.bold + ' ',
okPrefix: ' '.bgGreen + ' OK! '.bgBlack.green.bold + ' ',
successPrefix: ' Success: '.bgGreen.white.bold + ' ',
warnPrefix: ' '.bgYellow + ' Warn: '.bgBlack.yellow.bold + ' '
};
/**
*
* @param logText
* @param logType
* @returns {boolean}
*/
var logFunction = function (logText, logType) {
if (logText === void 0) { logText = 'empty log'; }
if (logType === void 0) { logType = 'normal'; }
try {
switch (logType) {
case 'dir':
logText = localBl.dirPrefix + plugins.clc.xterm(26)(logText);
break;
case 'error':
logText = localBl.errorPrefix + logText.red.bold;
break;
case 'info':
logText = localBl.infoPrefix + plugins.clc.xterm(198)(logText);
break;
case 'normal':
logText = localBl.normalPrefix + logText.cyan.bold;
break;
case 'ok':
logText = localBl.okPrefix + logText.bold;
break;
case 'success':
logText = localBl.successPrefix + logText.green.bold;
break;
case 'warn':
logText = localBl.warnPrefix + logText.bold;
break;
case 'log':
default:
logText.blue.bold;
console.log(('unknown logType for "' + logText + '"').red.bold);
break;
}
console.log(logText);
return true;
}
catch (error) {
console.log(localBl.errorPrefix + 'You seem to have tried logging something strange'.red.bold + error);
return false;
}
};
return logFunction;
};
})(BeautylogNodeLog || (BeautylogNodeLog = {}));
/// <reference path="./index.ts" />
var BeautylogNodeCode;
(function (BeautylogNodeCode) {
BeautylogNodeCode.init = function () {
var codeFunction = function (codeString, options) {
var hlight = require("hlight");
var codeSnippet = {
source: codeString,
highlighted: "default"
};
if (typeof codeString != "string") {
console.log("beautylog.code() expects a string as first argument!");
return;
}
;
if (typeof options != "undefined") {
codeSnippet.highlighted = hlight(codeSnippet.source, options.language);
}
};
return codeFunction;
};
})(BeautylogNodeCode || (BeautylogNodeCode = {}));
/// <reference path="./index.ts" />
var BeautylogNodeTable;
(function (BeautylogNodeTable) {
function init() {
BeautylogNodeTable.cliTable = require("cli-table2");
var beautylogOsTable = {};
beautylogOsTable.new = function (typeArg, tableHeadArrayArg) {
var newConsoleTable = new ConsoleTable(typeArg, tableHeadArrayArg);
return newConsoleTable;
};
return beautylogOsTable;
}
BeautylogNodeTable.init = init;
})(BeautylogNodeTable || (BeautylogNodeTable = {}));
/// <reference path="./index.ts" />
var BeautylogNodeFiglet;
(function (BeautylogNodeFiglet) {
var defaultOptions = {
font: "Star Wars",
color: "green",
cb: function () { }
};
BeautylogNodeFiglet.figlet = function (textArg, optionsArg) {
var done = plugins.q.defer();
var mergeOptions = plugins.lodash.cloneDeep(defaultOptions);
var options = plugins.lodash.assign(mergeOptions, optionsArg);
plugins.figlet(textArg, {
font: options.font,
horizontalLayout: 'default',
verticalLayout: 'default'
}, function (err, data) {
if (err) {
console.log('Something went wrong...');
console.dir(err);
return;
}
console.log(data[options.color]);
options.cb();
done.resolve();
});
return done.promise;
};
BeautylogNodeFiglet.figletSync = function (textArg, optionsArg) {
var mergeOptions = plugins.lodash.cloneDeep(defaultOptions);
var options = plugins.lodash.assign(mergeOptions, optionsArg);
console.log(plugins.figlet.textSync(textArg, {
font: options.font,
horizontalLayout: 'default',
verticalLayout: 'default'
})[options.color]);
return true;
};
})(BeautylogNodeFiglet || (BeautylogNodeFiglet = {}));
/// <reference path="./index.ts" />
var BeautylogBrowser;
(function (BeautylogBrowser) {
function init() {
var beautylogBrowser = {};
beautylogBrowser.log = function (message) {
console.log('%c Log: %c ' + message, "background:#42A5F5;color:#ffffff", "color:#42A5F5;");
};
beautylogBrowser.info = function (message) {
console.log('%c Info: %c ' + message, 'background:#EC407A;color:#ffffff;', 'color:#EC407A;');
};
beautylogBrowser.ok = function (message) {
console.log('%c OK: %c ' + message, "background:#000000;color:#8BC34A;", "color:#000000;");
};
beautylogBrowser.success = function (message) {
console.log('%c Success: %c ' + message, "background:#8BC34A;color:#ffffff;", "color:#8BC34A;");
};
beautylogBrowser.warn = function (message) {
console.log('%c Warn: %c ' + message, "background:#000000;color:#FB8C00;", "color:#000000;");
};
return beautylogBrowser;
}
BeautylogBrowser.init = init;
})(BeautylogBrowser || (BeautylogBrowser = {}));
/// <reference path="./index.ts" />
/// <reference path="./typings/main.d.ts" />
/// <reference path="./beautylog.plugins.ts" />
/// <reference path="./beautylog.classes.ts" />
/// <reference path="./beautylog.node.ts" />
/// <reference path="./beautylog.node.log.ts" />
/// <reference path="./beautylog.node.code.ts" />
/// <reference path="./beautylog.node.table.ts" />
/// <reference path="./beautylog.node.figlet.ts" />
/// <reference path="./beautylog.browser.ts" />
/// <reference path="./beautylog.promisechain.ts" />
var plugins = BeautylogPlugins.init();
var beautylog = (function () {
switch (plugins.smartenv.getEnv().runtimeEnv) {
case "node":
var beautylogOs = BeautylogNode.init();
return beautylogOs;
break;
case "browser":
var beautylogBrowser = BeautylogBrowser.init();
return beautylogBrowser;
break;
default:
console.log("something is strange about the platform in which you try to use beautylog");
break;
}
})();
module.exports = beautylog;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJlYXV0eWxvZy5wbHVnaW5zLnRzIiwiYmVhdXR5bG9nLmNsYXNzZXMudHMiLCJiZWF1dHlsb2cubm9kZS50cyIsImJlYXV0eWxvZy5ub2RlLmxvZy50cyIsImJlYXV0eWxvZy5ub2RlLmNvZGUudHMiLCJiZWF1dHlsb2cubm9kZS50YWJsZS50cyIsImJlYXV0eWxvZy5ub2RlLmZpZ2xldC50cyIsImJlYXV0eWxvZy5icm93c2VyLnRzIiwiYmVhdXR5bG9nLnByb21pc2VjaGFpbi50cyIsImluZGV4LnRzIl0sIm5hbWVzIjpbIkJlYXV0eWxvZ1BsdWdpbnMiLCJDb25zb2xlVGFibGUiLCJDb25zb2xlVGFibGUuY29uc3RydWN0b3IiLCJDb25zb2xlVGFibGUucHVzaCIsIkNvbnNvbGVUYWJsZS5wcmludCIsIkJlYXV0eWxvZ05vZGUiLCJCZWF1dHlsb2dOb2RlLmluaXQiLCJCZWF1dHlsb2dOb2RlTG9nIiwiQmVhdXR5bG9nTm9kZUNvZGUiLCJCZWF1dHlsb2dOb2RlVGFibGUiLCJCZWF1dHlsb2dOb2RlVGFibGUuaW5pdCIsIkJlYXV0eWxvZ05vZGVGaWdsZXQiLCJCZWF1dHlsb2dCcm93c2VyIiwiQmVhdXR5bG9nQnJvd3Nlci5pbml0Il0sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFDbkMsSUFBTyxnQkFBZ0IsQ0FpQnRCO0FBakJELFdBQU8sZ0JBQWdCLEVBQUMsQ0FBQztJQUNyQkEsSUFBSUEsT0FBT0EsR0FBT0EsRUFBRUEsQ0FBQ0E7SUFDVkEscUJBQUlBLEdBQUdBO1FBQ2QsT0FBTyxHQUFHO1lBQ04sTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDekIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDbEIsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztZQUNs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LGdCQUFnQixRQW9CdEI7QUNyQkQsQUFDQSxtQ0FEbUM7QUNBbkMsNENBQTRDO0FBQzVDLCtDQUErQztBQUMvQywrQ0FBK0M7QUFDL0MsNENBQTRDO0FBQzVDLGdEQUFnRDtBQUNoRCxpREFBaUQ7QUFDakQsa0RBQWtEO0FBQ2xELG1EQUFtRDtBQUNuRCwrQ0FBK0M7QUFDL0Msb0RBQW9EO0FBRXBELElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3RDLElBQUksU0FBUyxHQUFHLENBQUM7SUFDYixNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsS0FBSyxNQUFNO1lBQ1AsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDbkIsS0FBSyxDQUFDO1FBQ1YsS0FBSyxTQUFTO1lBQ1YsSUFBSSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDeEIsS0FBSyxDQUFDO1FBQ1Y7WUFDSSxPQUFPLENBQUMsR0FBRyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7WUFDekYsS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDTCxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2luZGV4LnRzXCIgLz5cbm1vZHVsZSBCZWF1dHlsb2dQbHVnaW5zIHtcbiAgICB2YXIgcGx1Z2luczphbnkgPSB7fTtcbiAgICBleHBvcnQgdmFyIGluaXQgPSBmdW5jdGlvbigpe1xuICAgICAgICBwbHVnaW5zID0ge1xuICAgICAgICAgICAgbG9kYXNoOiByZXF1aXJlKFwibG9kYXNoXCIpLFxuICAgICAgICAgICAgc21hcnRlbnY6IHJlcXVpcmUoXCJzbWFydGVudlwiKSxcbiAgICAgICAgICAgIHE6IHJlcXVpcmUoXCJxXCIpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwbHVnaW5zLnNtYXJ0ZW52LmdldEVudigpLmlzTm9kZSl7XG4gICAgICAgICAgICBwbHVnaW5zID0gcGx1Z2lucy5sb2Rhc2guYXNzaWduKHBsdWdpbnMse1xuICAgICAgICAgICAgICAgIGNvbG9yczogcmVxdWlyZShcImNvbG9yc1wiKSxcbiAgICAgICAgICAgICAgICBjbGM6IHJlcXVpcmUoXCJjbGktY29sb3JcIiksXG4gICAgICAgICAgICAgICAgZmlnbGV0OiByZXF1aXJlKFwiZmlnbGV0XCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGx1Z2lucztcbiAgICB9O1xufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2luZGV4LnRzXCIgLz5cbnZhciB0YWJsZUhlbHBlcnMgPSB7XG4gICAgbWFrZVJvdzogZnVuY3Rpb24oY2VsbENvdW50ZXJBcmc6bnVtYmVyID0gMixjb2xvckFyZzpzdHJpbmcgPSBcImN5YW5cIil7XG4gICAgICAgIHZhciByb3dBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IChjZWxsQ291bnRlckFyZyk7IGkrKykge1xuICAgICAgICAgICAgcm93QXJyYXkucHVzaChTdHJpbmcoaSArIDEpLmN5YW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dBcnJheTtcbiAgICB9XG59O1xuXG5jbGFzcyBDb25zb2xlVGFibGUge1xuICAgIHRhYmxlSGVhZDpzdHJpbmdbXTtcbiAgICByb3dzO1xuICAgIHR5cGU6c3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHRhYmxlVHlwZUFyZzpzdHJpbmcsdGFibGVIZWFkQXJyYXlBcmc6c3RyaW5nW10gPSB0YWJsZUhlbHBlcnMubWFrZVJvdygpKSB7XG4gICAgICAgIHN3aXRjaCAodGFibGVUeXBlQXJnKSB7XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tzXCI6XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZUhlYWQgPSBbJ0NoZWNrIEl0ZW06Jy5jeWFuLCdTdGF0dXM6Jy5jeWFuXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjdXN0b21cIjpcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlSGVhZCA9IHRhYmxlSGVhZEFycmF5QXJnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy50eXBlID0gdGFibGVUeXBlQXJnO1xuICAgIH1cbiAgICBwdXNoKHJvdzpzdHJpbmdbXSl7XG4gICAgICAgIHRoaXMucm93cy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIHByaW50KCkge1xuICAgICAgICB2YXIgdGFibGUgPSBuZXcgQmVhdXR5bG9nTm9kZVRhYmxlLmNsaVRhYmxlKHtcbiAgICAgICAgICAgIGhlYWQ6IHRoaXMudGFibGVIZWFkXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKHZhciByb3cgaW4gdGhpcy5yb3dzKXtcbiAgICAgICAgICAgIGlmKHRoaXMucm93c1tyb3ddWzFdID09IFwic3VjY2Vzc1wiKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd3Nbcm93XVsxXSA9ICcgJy5iZ0dyZWVuICsgJyAnICsgdGhpcy5yb3dzW3Jvd11bMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm93c1tyb3ddWzFdID09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucm93c1tyb3ddWzFdID0gJyAnLmJnUmVkICsgJyAnICsgdGhpcy5yb3dzW3Jvd11bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWJsZS5wdXNoKHRoaXMucm93c1tyb3ddKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2codGFibGUudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ05vZGUge1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgIHZhciBiZWF1dHlsb2dOb2RlOmFueSA9IHtcbiAgICAgICAgICAgIGxvZzpCZWF1dHlsb2dOb2RlTG9nLmluaXQoKSxcbiAgICAgICAgICAgIGNvZGU6QmVhdXR5bG9nTm9kZUNvZGUuaW5pdCgpLFxuICAgICAgICAgICAgZmlnbGV0OkJlYXV0eWxvZ05vZGVGaWdsZXQuZmlnbGV0LFxuICAgICAgICAgICAgZmlnbGV0U3luYzpCZWF1dHlsb2dOb2RlRmlnbGV0LmZpZ2xldFN5bmNcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogbG9ncyBhbiBkaXJlY3RvcnkgdG8gY29uc29sZVxuICAgICAgICAgKiBAcGFyYW0gbG9nVGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUuZGlyID0gZnVuY3Rpb24obG9nVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlYXV0eWxvZ05vZGUubG9nKGxvZ1RleHQsICdkaXInKTtcbiAgICAgICAgfTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGFuIGVycm9yIHRvIGNvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIGxvZ1RleHRcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBiZWF1dHlsb2dOb2RlLmVycm9yID0gZnVuY3Rpb24obG9nVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlYXV0eWxvZ05vZGUubG9nKGxvZ1RleHQsICdlcnJvcicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGFuIGluZm8gdG8gY29uc29sZVxuICAgICAgICAgKiBAcGFyYW0gbG9nVGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUuaW5mbyA9IGZ1bmN0aW9uKGxvZ1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlLmxvZyhsb2dUZXh0LCAnaW5mbycpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGFuICdPSyEnIG1lc3NhZ2UgdG8gY29uc29sZVxuICAgICAgICAgKiBAcGFyYW0gbG9nVGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUub2sgPSBmdW5jdGlvbihsb2dUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmVhdXR5bG9nTm9kZS5sb2cobG9nVGV4dCwgJ29rJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGxvZ3MgYSBzdWNjZXNzIHRvIGNvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIGxvZ1RleHQgc3RyaW5nIHRvIGxvZyBhcyBlcnJvclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUuc3VjY2VzcyA9IGZ1bmN0aW9uKGxvZ1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlLmxvZyhsb2dUZXh0LCAnc3VjY2VzcycpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGEgJ3dhcm46JyBtZXNzYWdlIHRvIGNvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIGxvZ1RleHQgc3RyaW5nIHRvIGxvZyBhcyBlcnJvclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUud2FybiA9IGZ1bmN0aW9uKGxvZ1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlLmxvZyhsb2dUZXh0LCAnd2FybicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGJlYXV0eWxvZ05vZGUudGFibGUgPSBCZWF1dHlsb2dOb2RlVGFibGUuaW5pdCgpO1xuXG4gICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlO1xuICAgIH1cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbmRleC50c1wiIC8+XG5tb2R1bGUgQmVhdXR5bG9nTm9kZUxvZyB7XG4gICAgZXhwb3J0IHZhciBpbml0ID0gZnVuY3Rpb24oKXtcblxuICAgICAgICB2YXIgbG9jYWxCbCA9IHtcbiAgICAgICAgICAgIGRpclByZWZpeDogcGx1Z2lucy5jbGMuYmdYdGVybSgzOSkueHRlcm0oMjMxKS5ib2xkKCcgRElSICcpICsgJyAnLFxuICAgICAgICAgICAgZXJyb3JQcmVmaXg6ICcgRXJyb3I6ICcuYmdSZWQud2hpdGUuYm9sZCArICcgJyxcbiAgICAgICAgICAgIGluZm9QcmVmaXg6IHBsdWdpbnMuY2xjLmJnWHRlcm0oMTk4KS54dGVybSgyMzEpLmJvbGQoJyBJTkZPICcpICsgJyAnLFxuICAgICAgICAgICAgbm9ybWFsUHJlZml4OiAnIExvZzogJy5iZ0N5YW4ud2hpdGUuYm9sZCArICcgJyxcbiAgICAgICAgICAgIG9rUHJlZml4OiAnICcuYmdHcmVlbiArICcgT0shICcuYmdCbGFjay5ncmVlbi5ib2xkICsgJyAnLFxuICAgICAgICAgICAgc3VjY2Vzc1ByZWZpeDogJyBTdWNjZXNzOiAnLmJnR3JlZW4ud2hpdGUuYm9sZCArICcgJyxcbiAgICAgICAgICAgIHdhcm5QcmVmaXg6ICcgJy5iZ1llbGxvdyArICcgV2FybjogJy5iZ0JsYWNrLnllbGxvdy5ib2xkICsgJyAnXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBsb2dUZXh0XG4gICAgICAgICAqIEBwYXJhbSBsb2dUeXBlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGxvZ0Z1bmN0aW9uID0gZnVuY3Rpb24obG9nVGV4dDpzdHJpbmcgPSAnZW1wdHkgbG9nJywgbG9nVHlwZTpzdHJpbmcgPSAnbm9ybWFsJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGxvZ1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGlyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1RleHQgPSBsb2NhbEJsLmRpclByZWZpeCArIHBsdWdpbnMuY2xjLnh0ZXJtKDI2KShsb2dUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXh0ID0gbG9jYWxCbC5lcnJvclByZWZpeCArIGxvZ1RleHQucmVkLmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5mbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXh0ID0gbG9jYWxCbC5pbmZvUHJlZml4ICsgcGx1Z2lucy5jbGMueHRlcm0oMTk4KShsb2dUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdub3JtYWwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dCA9IGxvY2FsQmwubm9ybWFsUHJlZml4ICsgbG9nVGV4dC5jeWFuLmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2snOlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dCA9IGxvY2FsQmwub2tQcmVmaXggKyBsb2dUZXh0LmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXh0ID0gbG9jYWxCbC5zdWNjZXNzUHJlZml4ICsgbG9nVGV4dC5ncmVlbi5ib2xkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dCA9IGxvY2FsQmwud2FyblByZWZpeCArIGxvZ1RleHQuYm9sZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsb2cnOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dC5ibHVlLmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygoJ3Vua25vd24gbG9nVHlwZSBmb3IgXCInICsgbG9nVGV4dCArICdcIicpLnJlZC5ib2xkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dUZXh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvY2FsQmwuZXJyb3JQcmVmaXggKyAnWW91IHNlZW0gdG8gaGF2ZSB0cmllZCBsb2dnaW5nIHNvbWV0aGluZyBzdHJhbmdlJy5yZWQuYm9sZCArIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBsb2dGdW5jdGlvbjtcbiAgICB9XG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ05vZGVDb2RlIHtcbiAgICBleHBvcnQgdmFyIGluaXQgPSBmdW5jdGlvbigpIHtcblxuXG4gICAgICAgIHZhciBjb2RlRnVuY3Rpb24gPSBmdW5jdGlvbihjb2RlU3RyaW5nLG9wdGlvbnM/KXtcbiAgICAgICAgICAgIHZhciBobGlnaHQgPSByZXF1aXJlKFwiaGxpZ2h0XCIpO1xuICAgICAgICAgICAgdmFyIGNvZGVTbmlwcGV0ID0ge1xuICAgICAgICAgICAgICAgIHNvdXJjZTpjb2RlU3RyaW5nLFxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOlwiZGVmYXVsdFwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlU3RyaW5nICE9IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmVhdXR5bG9nLmNvZGUoKSBleHBlY3RzIGEgc3RyaW5nIGFzIGZpcnN0IGFyZ3VtZW50IVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIGNvZGVTbmlwcGV0LmhpZ2hsaWdodGVkID0gaGxpZ2h0KGNvZGVTbmlwcGV0LnNvdXJjZSxvcHRpb25zLmxhbmd1YWdlKTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNvZGVTbmlwcGV0LmhpZ2hsaWdodGVkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gY29kZUZ1bmN0aW9uO1xuICAgIH1cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbmRleC50c1wiIC8+XG5tb2R1bGUgQmVhdXR5bG9nTm9kZVRhYmxlIHtcbiAgICBleHBvcnQgdmFyIGNsaVRhYmxlO1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBjbGlUYWJsZSA9ICByZXF1aXJlKFwiY2xpLXRhYmxlMlwiKTtcbiAgICAgICAgdmFyIGJlYXV0eWxvZ09zVGFibGU6YW55ID0ge307XG5cbiAgICAgICAgYmVhdXR5bG9nT3NUYWJsZS5uZXcgPSBmdW5jdGlvbih0eXBlQXJnOnN0cmluZyx0YWJsZUhlYWRBcnJheUFyZz8pIHtcbiAgICAgICAgICAgIHZhciBuZXdDb25zb2xlVGFibGUgPSBuZXcgQ29uc29sZVRhYmxlKHR5cGVBcmcsdGFibGVIZWFkQXJyYXlBcmcpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbnNvbGVUYWJsZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJlYXV0eWxvZ09zVGFibGU7XG4gICAgfVxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2luZGV4LnRzXCIgLz5cbm1vZHVsZSBCZWF1dHlsb2dOb2RlRmlnbGV0IHtcbiAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIGZvbnQ6XCJTdGFyIFdhcnNcIixcbiAgICAgICAgY29sb3I6IFwiZ3JlZW5cIixcbiAgICAgICAgY2I6IGZ1bmN0aW9uKCl7fVxuICAgIH07XG4gICAgZXhwb3J0IHZhciBmaWdsZXQgPSBmdW5jdGlvbih0ZXh0QXJnOnN0cmluZyxvcHRpb25zQXJnPyl7XG4gICAgICAgIHZhciBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgICAgIHZhciBtZXJnZU9wdGlvbnMgPSBwbHVnaW5zLmxvZGFzaC5jbG9uZURlZXAoZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHBsdWdpbnMubG9kYXNoLmFzc2lnbihtZXJnZU9wdGlvbnMsb3B0aW9uc0FyZyk7XG4gICAgICAgIHBsdWdpbnMuZmlnbGV0KHRleHRBcmcse1xuICAgICAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICAgICAgaG9yaXpvbnRhbExheW91dDogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdmVydGljYWxMYXlvdXQ6ICdkZWZhdWx0J1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4nKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGFbb3B0aW9ucy5jb2xvcl0pO1xuICAgICAgICAgICAgb3B0aW9ucy5jYigpO1xuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xuICAgIH07XG4gICAgZXhwb3J0IHZhciBmaWdsZXRTeW5jID0gZnVuY3Rpb24odGV4dEFyZzpzdHJpbmcsb3B0aW9uc0FyZz8pe1xuICAgICAgICB2YXIgbWVyZ2VPcHRpb25zID0gcGx1Z2lucy5sb2Rhc2guY2xvbmVEZWVwKGRlZmF1bHRPcHRpb25zKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBwbHVnaW5zLmxvZGFzaC5hc3NpZ24obWVyZ2VPcHRpb25zLG9wdGlvbnNBcmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhwbHVnaW5zLmZpZ2xldC50ZXh0U3luYyh0ZXh0QXJnLHtcbiAgICAgICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgICAgIGhvcml6b250YWxMYXlvdXQ6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHZlcnRpY2FsTGF5b3V0OiAnZGVmYXVsdCdcbiAgICAgICAgfSlbb3B0aW9ucy5jb2xvcl0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ0Jyb3dzZXIge1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgYmVhdXR5bG9nQnJvd3NlcjphbnkgPSB7fTtcbiAgICAgICAgYmVhdXR5bG9nQnJvd3Nlci5sb2cgPSBmdW5jdGlvbihtZXNzYWdlKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyBMb2c6ICVjICcgKyBtZXNzYWdlLFwiYmFja2dyb3VuZDojNDJBNUY1O2NvbG9yOiNmZmZmZmZcIixcImNvbG9yOiM0MkE1RjU7XCIpO1xuICAgICAgICB9O1xuICAgICAgICBiZWF1dHlsb2dCcm93c2VyLmluZm8gPSBmdW5jdGlvbihtZXNzYWdlKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyBJbmZvOiAlYyAnICsgbWVzc2FnZSwnYmFja2dyb3VuZDojRUM0MDdBO2NvbG9yOiNmZmZmZmY7JywnY29sb3I6I0VDNDA3QTsnKTtcbiAgICAgICAgfTtcbiAgICAgICAgYmVhdXR5bG9nQnJvd3Nlci5vayA9IGZ1bmN0aW9uKG1lc3NhZ2Upe1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIE9LOiAlYyAnICsgbWVzc2FnZSxcImJhY2tncm91bmQ6IzAwMDAwMDtjb2xvcjojOEJDMzRBO1wiLFwiY29sb3I6IzAwMDAwMDtcIik7XG4gICAgICAgIH07XG4gICAgICAgIGJlYXV0eWxvZ0Jyb3dzZXIuc3VjY2VzcyA9IGZ1bmN0aW9uKG1lc3NhZ2Upe1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIFN1Y2Nlc3M6ICVjICcgKyBtZXNzYWdlLFwiYmFja2dyb3VuZDojOEJDMzRBO2NvbG9yOiNmZmZmZmY7XCIsXCJjb2xvcjojOEJDMzRBO1wiKTtcbiAgICAgICAgfTtcbiAgICAgICAgYmVhdXR5bG9nQnJvd3Nlci53YXJuID0gZnVuY3Rpb24obWVzc2FnZSl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgV2FybjogJWMgJyArIG1lc3NhZ2UsXCJiYWNrZ3JvdW5kOiMwMDAwMDA7Y29sb3I6I0ZCOEMwMDtcIixcImNvbG9yOiMwMDAwMDA7XCIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYmVhdXR5bG9nQnJvd3NlcjtcbiAgICB9XG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ1Byb21pc2VDaGFpbiB7XG5cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cucGx1Z2lucy50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cuY2xhc3Nlcy50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS5sb2cudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYmVhdXR5bG9nLm5vZGUuY29kZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS50YWJsZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS5maWdsZXQudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYmVhdXR5bG9nLmJyb3dzZXIudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYmVhdXR5bG9nLnByb21pc2VjaGFpbi50c1wiIC8+XG5cbnZhciBwbHVnaW5zID0gQmVhdXR5bG9nUGx1Z2lucy5pbml0KCk7XG52YXIgYmVhdXR5bG9nID0gKGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAocGx1Z2lucy5zbWFydGVudi5nZXRFbnYoKS5ydW50aW1lRW52KSB7XG4gICAgICAgIGNhc2UgXCJub2RlXCI6XG4gICAgICAgICAgICB2YXIgYmVhdXR5bG9nT3MgPSBCZWF1dHlsb2dOb2RlLmluaXQoKTtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dPcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYnJvd3NlclwiOlxuICAgICAgICAgICAgdmFyIGJlYXV0eWxvZ0Jyb3dzZXIgPSBCZWF1dHlsb2dCcm93c2VyLmluaXQoKTtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dCcm93c2VyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNvbWV0aGluZyBpcyBzdHJhbmdlIGFib3V0IHRoZSBwbGF0Zm9ybSBpbiB3aGljaCB5b3UgdHJ5IHRvIHVzZSBiZWF1dHlsb2dcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59KSgpO1xubW9kdWxlLmV4cG9ydHMgPSBiZWF1dHlsb2c7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=