Apps Home
|
Create an App
es6
Author:
onesinmiedo
Description
Source Code
Launch App
Current Users
Created by:
Onesinmiedo
/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./js/app.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./js/app.js": /*!*******************!*\ !*** ./js/app.js ***! \*******************/ /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _notifier_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notifier.js */ "./js/notifier.js"); /* harmony import */ var _tipper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tipper.js */ "./js/tipper.js"); /* harmony import */ var _messenger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messenger.js */ "./js/messenger.js"); /* harmony import */ var _bot_manager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bot_manager.js */ "./js/bot_manager.js"); /* harmony import */ var _thanks_manager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./thanks_manager.js */ "./js/thanks_manager.js"); /* harmony import */ var _kerberos_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kerberos.js */ "./js/kerberos.js"); /* harmony import */ var _tip_menu_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tip_menu.js */ "./js/tip_menu.js"); /* harmony import */ var _room_subject_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./room_subject.js */ "./js/room_subject.js"); /* harmony import */ var _multi_goal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./multi_goal.js */ "./js/multi_goal.js"); // import {TicketShow} from './ticket_show.js'; var app = new _bot_manager_js__WEBPACK_IMPORTED_MODULE_3__["BotManager"](cb); app.add('kerberos', new _kerberos_js__WEBPACK_IMPORTED_MODULE_5__["Kerberos"](app, cb)); app.add('notifier', new _notifier_js__WEBPACK_IMPORTED_MODULE_0__["Notifier"](app, cb)); app.add('tipMenu', new _tip_menu_js__WEBPACK_IMPORTED_MODULE_6__["TipMenu"](app, cb)); app.add('tipper', new _tipper_js__WEBPACK_IMPORTED_MODULE_1__["Tipper"](app, cb)); app.add('messenger', new _messenger_js__WEBPACK_IMPORTED_MODULE_2__["Messenger"](app, cb)); app.add('thanks', new _thanks_manager_js__WEBPACK_IMPORTED_MODULE_4__["ThanksManager"](app, cb)); app.add('roomSubject', new _room_subject_js__WEBPACK_IMPORTED_MODULE_7__["RoomSubject"](app, cb)); app.add('multiGoal', new _multi_goal_js__WEBPACK_IMPORTED_MODULE_8__["MultiGoal"](app, cb)); cb.settings_choices = app.getSettingsChoices(); /***/ }), /***/ "./js/black_list.js": /*!**************************!*\ !*** ./js/black_list.js ***! \**************************/ /*! exports provided: blackList */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "blackList", function() { return blackList; }); var blackList = { users: [], blackList: ['shit', 'whore', 'bitch', 'remove space', '/fuck(ing)?/'] }; /***/ }), /***/ "./js/bot.js": /*!*******************!*\ !*** ./js/bot.js ***! \*******************/ /*! exports provided: Bot */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Bot", function() { return Bot; }); /* harmony import */ var _stats_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stats.js */ "./js/stats.js"); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./consts.js */ "./js/consts.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * Base class for CB bots. */ var Bot = /*#__PURE__*/ function () { function Bot(app, cb) { _classCallCheck(this, Bot); this.backgroundColor = ''; this.color = '#000000'; this.newline = '\n'; this.coreCommands = ['run', 'stop', 'pause']; this.checkInterface(); this.cb = cb; this.app = app; this.stats = new _stats_js__WEBPACK_IMPORTED_MODULE_0__["Stats"](app, cb); this.status = _consts_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; } _createClass(Bot, [{ key: "checkInterface", value: function checkInterface() { if (!this.clearData || !this.processCommand) {// if (!this.processCommand) throw new Error('Class does not implement the processCommand() function. '); } } }, { key: "isCoreCommand", value: function isCoreCommand(command) { return this.coreCommands.includes(command); } }, { key: "hasMethod", value: function hasMethod(methodName) { return this[methodName] && typeof this[methodName] == 'function'; } }, { key: "isRunning", value: function isRunning() { return this.status == _consts_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; } }, { key: "clearData", value: function clearData() { if (this.stats) this.stats.clearStats(); } ////////////// // commands // ////////////// }, { key: "pause", value: function pause(data) { this.status = _consts_js__WEBPACK_IMPORTED_MODULE_1__["status"].PAUSED; this.onPause(data); } }, { key: "stop", value: function stop(data) { this.status = _consts_js__WEBPACK_IMPORTED_MODULE_1__["status"].STOPPED; this.clearData(); this.onStop(data); } }, { key: "run", value: function run(data) { this.status = _consts_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; this.onRun(data); } //////////// // events // //////////// }, { key: "onPause", value: function onPause(data) { return; } }, { key: "onStop", value: function onStop(data) { return; } }, { key: "onRun", value: function onRun(data) { return; } /** * [onMessage description] * @param {object} message Info related to the message. * @return {[type]} [description] * * c: message color * m: the message text * user: username of message sender * f: message font * in_fanclub: is the user in the broadcasters fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onMessage", value: function onMessage(cbMessage) { this.parseMessageForCommands(cbMessage); } /** * [onTip description] * @param {object} tip Info related to the tip. * @return {[type]} [description] * * amount: amount of tip * message: message in tip * to_user: user who received tip * from_user: user who sent tip * from_user_in_fanclub: is the user in the broadcasters fan club * from_user_has_tokens: does the user have at least 1 token * from_user_is_mod: is the user a moderator * from_user_tipped_recently: is the user a “dark blue”? * from_user_tipped_alot_recently: is the user a “purple”? * from_user_tipped_tons_recently: is the user a “dark purple”? * from_user_gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onTip", value: function onTip(tip) { return; } /** * [onEnter description] * @param {object} user Info related to the user who enters the room. * @return {[type]} [description] * * user: user who entered the room * in_fanclub: is the user in the broadcaster’s fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onEnter", value: function onEnter(user) { return; } /** * [onLeave description] * @param {object} user Info related to the user who leaves the room. * @return {[type]} [description] * * user: user who left the room * in_fanclub: is the user in the broadcaster’s fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onLeave", value: function onLeave(user) { return; } /** * [onDrawPanel description] * @param {oject} user Info related to the user who enters the room. * @return {[type]} [description] * * user: user who entered the room * in_fanclub: is the user in the broadcaster’s fan club * has_tokens: does the user have at least 1 token * is_mod: is the user a moderator * tipped_recently: is the user a “dark blue”? * tipped_alot_recently: is the user a “purple”? * tipped_tons_recently: is the user a “dark purple”? * gender: “m” (male), “f” (female), “s” (trans), or “c” (couple) */ }, { key: "onDrawPanel", value: function onDrawPanel(user) { return; } /////////// // utils // /////////// }, { key: "parseMessageForCommands", value: function parseMessageForCommands(cbMessage) { var command = this.getCommand(cbMessage.m); if (command) { (this.isRunning() || this.isCoreCommand(command.options[0])) && typeof this.processCommand == 'function' && this.processCommand(command.options, cbMessage); // TODO: shold give feedback? cbMessage['X-Spam'] = true; } return cbMessage; } }, { key: "getCommand", value: function getCommand(messageText) { var messageArray = messageText.trim().split(/\s+/); if (this.alias && this.alias.includes(messageArray[0])) { // returns a data object with command and options return { command: messageArray[0], options: messageArray.slice(1) }; } return false; } }, { key: "checkPermission", value: function checkPermission(action, cbMessage) { return ( /* this.checkOption('*', cbMessage) || */ this.permissions[action] && cbMessage.is_mod && this.permissions[action] && this.permissions[action].indexOf('m') >= 0 || // if mod is allowed cbMessage.user == this.cb.room_slug && this.permissions[action].indexOf('b') >= 0 || // or broadcaster is allowed this.permissions[action].indexOf('a') >= 0 // or everyone is allowed ); } }, { key: "getSettingsChoices", value: function getSettingsChoices() { return []; } ////////////////////// // Config // ////////////////////// }, { key: "readConfig", value: function readConfig(cb) { var _this = this; this.settings = {}; if (typeof this.getSettingsChoices == 'function') { this.getSettingsChoices().map(function (item) { return item.name; }).forEach(function (key) { _this.settings[key] = cb.settings[key]; }); } } }]); return Bot; }(); // const config = { // description: '', // help : [ // { // access:'', // text:'', // } // ] // } /***/ }), /***/ "./js/bot_manager.js": /*!***************************!*\ !*** ./js/bot_manager.js ***! \***************************/ /*! exports provided: BotManager */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BotManager", function() { return BotManager; }); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var BotManager = /*#__PURE__*/ function () { function BotManager(cb) { var _this = this; _classCallCheck(this, BotManager); this.cb = cb; this.bots = []; this.settings_choices = []; this.start = Date.now(); this.cb.onMessage(function (message) { _this.onMessage(message); }); this.cb.onTip(function (tip) { _this.onTip(tip); }); this.cb.onEnter(function (user) { _this.onEnter(user); }); this.cb.onLeave(function (user) { _this.onLeave(user); }); this.cb.onDrawPanel(function (user) { _this.onDrawPanel(user); }); } ///////////////////////// // bot list management // ///////////////////////// _createClass(BotManager, [{ key: "getSettingsChoices", value: function getSettingsChoices() { return this.bots.reduce(function (result, bot) { if (typeof bot.bot.getSettingsChoices == 'function') { return result.concat(bot.bot.getSettingsChoices()); } }, []); // this.cb.log(result); } ///////////////////////// // bot list management // ///////////////////////// }, { key: "add", value: function add(id, bot) { this.bots.push({ id: id, bot: bot }); } }, { key: "get", value: function get(id) { return this.bots.find(function (item) { return item.id == id; })['bot']; } }, { key: "remove", value: function remove(id) { this.bots.splice(this.bots.findIndex(function (item) { return item.id == id; }), 1); } //////////// // events // //////////// }, { key: "onMessage", value: function onMessage(message) { this.bots.forEach(function (bot) { typeof bot.bot.onMessage == 'function' && bot.bot.onMessage(message); }); } }, { key: "onTip", value: function onTip(tip) { this.bots.forEach(function (bot) { bot.bot.isRunning() && typeof bot.bot.onTip == 'function' && bot.bot.onTip(tip); }); } }, { key: "onEnter", value: function onEnter(user) { this.bots.forEach(function (bot) { bot.bot.isRunning() && typeof bot.bot.onEnter == 'function' && bot.bot.onEnter(user); }); } }, { key: "onLeave", value: function onLeave(user) { this.bots.forEach(function (bot) { bot.bot.isRunning() && typeof bot.bot.onLeave == 'function' && bot.bot.onLeave(user); }); } }, { key: "onDrawPanel", value: function onDrawPanel(user) { this.bots.forEach(function (bot) { bot.bot.isRunning() && typeof bot.bot.onDrawPanel == 'function' && bot.bot.onDrawPanel(user); }); } }, { key: "log", value: function log(value) { if (_typeof(value) == 'object') this.cb.sendNotice(JSON.stringify(value), this.cb.room_slug, '', 'red', 'normal'); } }]); return BotManager; }(); /***/ }), /***/ "./js/consts.js": /*!**********************!*\ !*** ./js/consts.js ***! \**********************/ /*! exports provided: status, format */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "status", function() { return status; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "format", function() { return format; }); var status = { STOPPED: -1, PAUSED: 0, RUNNING: 1 }; var format = { LIST: 0, ROW: 1 }; /***/ }), /***/ "./js/echo.js": /*!********************!*\ !*** ./js/echo.js ***! \********************/ /*! exports provided: Echo */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Echo", function() { return Echo; }); /* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./values.js */ "./js/values.js"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var Echo = /*#__PURE__*/ function () { function Echo() { _classCallCheck(this, Echo); } _createClass(Echo, null, [{ key: "formatLines", ///////////////////// // format messages // ///////////////////// value: function formatLines(text) { var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10; return "".concat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].topLeftCorner).concat(Echo.repeat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].dashChar, length), "\n\t\t ").concat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].vertDash, " ").concat(text, "\n\t\t ").concat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].bottomLeftCorner).concat(Echo.repeat(_values_js__WEBPACK_IMPORTED_MODULE_0__["unicodeChars"].dashChar, length)); } }, { key: "formatBracket", value: function formatBracket(text, char) { return "".concat(Echo.repeat(char, 4), "\n\t\t ").concat(Echo.formatPrefix(char), "\n\t\t ").concat(Echo.repeat(char, 4)); } }, { key: "formatPrefix", value: function formatPrefix(text, char) { var lines = text.split('\n'); return lines.map(function (line) { return "".concat(char, " ").concat(line); }).join('\n'); } }, { key: "repeat", value: function repeat(char, times) { var result = ''; while (times--) { result += char; } return result; } ////////////////// // send notices // ////////////////// }, { key: "send", value: function send(_ref) { var _ref2; var _ref$group = _ref.group, group = _ref$group === void 0 ? '' : _ref$group, _ref$user = _ref.user, user = _ref$user === void 0 ? '' : _ref$user, _ref$inverse = _ref.inverse, inverse = _ref$inverse === void 0 ? false : _ref$inverse, color = _ref.color, background = _ref.background, text = _ref.text, cb = _ref.cb; inverse && (_ref2 = [color, background], background = _ref2[0], color = _ref2[1], _ref2); cb.sendNotice(text, user, background, color, 'normal', group); } }, { key: "sendBold", value: function sendBold(_ref3) { var _ref4; var _ref3$group = _ref3.group, group = _ref3$group === void 0 ? '' : _ref3$group, _ref3$user = _ref3.user, user = _ref3$user === void 0 ? '' : _ref3$user, _ref3$inverse = _ref3.inverse, inverse = _ref3$inverse === void 0 ? false : _ref3$inverse, color = _ref3.color, background = _ref3.background, text = _ref3.text, cb = _ref3.cb; inverse && (_ref4 = [color, background], background = _ref4[0], color = _ref4[1], _ref4); cb.sendNotice(text, user, background, color, 'bold', group); } }, { key: "sendCommandFeedback", value: function sendCommandFeedback(_ref5) { var _ref5$user = _ref5.user, user = _ref5$user === void 0 ? '' : _ref5$user, _ref5$color = _ref5.color, color = _ref5$color === void 0 ? 'black' : _ref5$color, _ref5$background = _ref5.background, background = _ref5$background === void 0 ? '' : _ref5$background, text = _ref5.text, cb = _ref5.cb; cb.sendNotice(text, user, background, color, 'normal'); } }]); return Echo; }(); /***/ }), /***/ "./js/kerberos.js": /*!************************!*\ !*** ./js/kerberos.js ***! \************************/ /*! exports provided: Kerberos */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kerberos", function() { return Kerberos; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); /* harmony import */ var _black_list_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./black_list.js */ "./js/black_list.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Kerberos = /*#__PURE__*/ function (_Bot) { _inherits(Kerberos, _Bot); function Kerberos(app, cb) { var _this; _classCallCheck(this, Kerberos); _this = _possibleConstructorReturn(this, _getPrototypeOf(Kerberos).call(this, app, cb)); _this.name = 'SPAM/abuse filter bot'; _this.description = 'A bot for handling insults, abusive language, SPAM'; _this.alias = ['!ker', '/ker']; _this.permissions = { 'add-user': 'bm', 'add-text': 'bm' }; _this.foregroundColor = '#ffffff'; _this.backgroundColor = '#9900ff'; _this.users = _this.parseBlacklist(_black_list_js__WEBPACK_IMPORTED_MODULE_2__["blackList"].users); _this.blacklist = _this.parseBlacklist(_black_list_js__WEBPACK_IMPORTED_MODULE_2__["blackList"].blackList); return _this; } _createClass(Kerberos, [{ key: "onMessage", value: function onMessage(message) { this.parseMessageForCommands(message); if (!message['X-Spam'] && !this.isClean(message.m)) { if (this.users.includes(message.user.toLowerCase())) { message['X-Spam'] = true; } else if (!this.isPrivileged(message)) { this.notifyAbuse(message.m, message.user); message['X-Spam'] = true; } } return message; } }, { key: "isPrivileged", value: function isPrivileged(message) { return this.cb.room_slug == message.user || message.is_mod; } }, { key: "isClean", value: function isClean(text) { return !this.blacklisted(text.toLowerCase()); } }, { key: "processCommand", value: function processCommand(options, message) { var _this2 = this; if (!this.checkPermission(options[0], message)) { return; } // add-user if (options.length > 1 && options[0] == 'add-user') { options.slice(1).forEach(function (user) { if (!_this2.users.includes(user)) { _this2.users.push(user); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ user: message.user, text: "user ".concat(user, " has been added to the blacklist"), color: _this2.foregroundColor, background: _this2.backgroundColor, cb: _this2.cb }); } }); } // add-text if (options.length > 1 && options[0] == 'add-text') { var start = message.m.indexOf('add-text') + 'add-text'.length, text = message.m.slice(start).trim(); if (!this.blacklist.includes(text)) { this.blacklist.push(this.parse(text)); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ user: message.user, text: "".concat(text, " has been added to the blacklist"), color: this.foregroundColor, background: this.backgroundColor, cb: this.cb }); } } } }, { key: "blacklisted", value: function blacklisted(text) { return this.blacklist.some(function (element) { if (typeof element == 'string') return text.toLowerCase().includes(element); if (_typeof(element) == 'object') { return element.test(text.toLowerCase()); } }); } /** * Builds the black list from the object provided * @param {object} blacklist The blacklist with strings and regexps */ }, { key: "parseBlacklist", value: function parseBlacklist(blacklist) { var _this3 = this; return blacklist.map(function (item) { return _this3.parse(item); }); } /** * Adds a text/regrexp to the blacklist * @param {string} text The string to be parsed */ }, { key: "parse", value: function parse(text) { if (/^\/.*\/$/.test(text)) { return new RegExp(text.slice(1, -1)); } return text.toLowerCase(); } }, { key: "notifyAbuse", value: function notifyAbuse(message, user) { var cb = this.cb, text = "Message '".concat(message, "' \nfrom ").concat(user, " \nhas been silenced by kerberos."); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ group: 'red', text: text, color: this.foregroundColor, background: this.backgroundColor, cb: cb }); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].send({ user: this.cb.room_slug, text: text, color: this.foregroundColor, background: this.backgroundColor, cb: cb }); } }]); return Kerberos; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/messenger.js": /*!*************************!*\ !*** ./js/messenger.js ***! \*************************/ /*! exports provided: Messenger */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Messenger", function() { return Messenger; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Messenger = /*#__PURE__*/ function (_Bot) { _inherits(Messenger, _Bot); function Messenger(app, cb) { var _this; _classCallCheck(this, Messenger); _this = _possibleConstructorReturn(this, _getPrototypeOf(Messenger).call(this, app, cb)); _this.name = 'Messenger bot'; return _this; } _createClass(Messenger, [{ key: "onMessage", value: function onMessage(msg) { var tipSum = this.app.get('tipper').stats.sumFromUser(msg.user), prefix = tipSum > 0 ? "[".concat(tipSum, "] ") : ''; msg.m = "".concat(prefix).concat(msg.m); } }]); return Messenger; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/multi_goal.js": /*!**************************!*\ !*** ./js/multi_goal.js ***! \**************************/ /*! exports provided: MultiGoal */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MultiGoal", function() { return MultiGoal; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var MultiGoal = /*#__PURE__*/ function (_Bot) { _inherits(MultiGoal, _Bot); function MultiGoal(app, cb) { var _this; _classCallCheck(this, MultiGoal); _this = _possibleConstructorReturn(this, _getPrototypeOf(MultiGoal).call(this, app, cb)); _this.name = 'Multi goal bot'; _this.description = 'A bot for managing multi goals'; _this.alias = ['!goal', '/goal']; _this.permissions = { 'set': 'bm', 'add': 'bm', 'del': 'bm', 'clear': 'bm', 'stop': 'b', 'run': 'b', 'pause': 'b' }; _this.settingsInputFields = 5; _this.foregroundColor = '#ffffff'; _this.backgroundColor = '#ff00cc'; _this.subjectManager = _this.app.get('roomSubject'); _this.init({ user: cb.room_slug }); return _this; } _createClass(MultiGoal, [{ key: "init", value: function init(data) { this.readConfig(this.cb); this.settings.multiGoalBotEnabled == 'yes' && this.run(data) || this.stop(data); } }, { key: "onStop", value: function onStop(data) { var text = "** ".concat(this.name, " status: STOPPED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendCommandFeedback({ user: data.user, text: text, color: 'red', background: 'white', cb: this.cb }); } }, { key: "onRun", value: function onRun(data) { var text = "** ".concat(this.name, " status: RUNNING **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendCommandFeedback({ user: data.user, text: text, color: 'green', background: 'white', cb: this.cb }); } }, { key: "onPause", value: function onPause(data) { var text = "** ".concat(this.name, " status: PAUSED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendCommandFeedback({ user: data.user, text: text, color: 'orange', background: 'white', cb: this.cb }); } ////////////////////// // Config // ////////////////////// }, { key: "getSettingsChoices", value: function getSettingsChoices() { var result = [{ name: "multiGoalBotEnabled", label: "########### MULTI-GOAL BOT ###################### ", type: "choice", choice1: "yes", choice2: "no", defaultValue: "yes", required: true }, { name: "multiGoalBotLoop", label: "Loop after last goal is reached? ", type: "choice", choice1: "yes", choice2: "no", defaultValue: "yes", required: true }]; for (var i = 0; i < this.settingsInputFields; i++) { result.push({ name: "goal".concat(i), label: "Goal ".concat(i, " (format: amount|description)"), type: "str", minLength: 5, maxLength: 255, defaultValue: "", required: false }); } return result; } ////////////////////// // Interface methods // ////////////////////// }, { key: "processCommand", value: function processCommand(options, message) { if (!this.checkPermission(options[0], message)) { return false; } //stop if (options.length == 1 && options[0] == 'stop') { this.stop({ message: message }); } //run if (options.length == 1 && options[0] == 'run') { this.run({ message: message }); } //pause if (options.length == 1 && options[0] == 'pause') { this.pause({ message: message }); } } }]); return MultiGoal; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/notifier.js": /*!************************!*\ !*** ./js/notifier.js ***! \************************/ /*! exports provided: Notifier */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notifier", function() { return Notifier; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _thanks_manager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./thanks_manager.js */ "./js/thanks_manager.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } /** * Notifier. */ var Notifier = /*#__PURE__*/ function (_Bot) { _inherits(Notifier, _Bot); function Notifier(app, cb) { var _this; var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, Notifier); _this = _possibleConstructorReturn(this, _getPrototypeOf(Notifier).call(this, app, cb)); _this.name = 'Notifier bot'; _this.description = 'A bot for handling notifications'; _this.alias = ['!not', '/not']; _this.permissions = { '*': 'bm' }; _this.text = ''; settings.color || (_this.color = settings.color); settings.backgroundColor || (_this.backgroundColor = settings.backgroundColor); return _this; } _createClass(Notifier, [{ key: "processCommand", value: function processCommand(options, cbMessage) { if (!this.checkPermission(options[0], cbMessage)) { return; } this.text = options.join(' '); this.text = _echo_js__WEBPACK_IMPORTED_MODULE_2__["Echo"].formatLines(this.text); _echo_js__WEBPACK_IMPORTED_MODULE_2__["Echo"].send({ cb: this.cb, text: this.text }); } }, { key: "onEnter", value: function onEnter(user) { _echo_js__WEBPACK_IMPORTED_MODULE_2__["Echo"].send({ cb: this.cb, user: user.user, text: "hello ".concat(user.user, "!") }); } }]); return Notifier; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/room_subject.js": /*!****************************!*\ !*** ./js/room_subject.js ***! \****************************/ /*! exports provided: RoomSubject */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RoomSubject", function() { return RoomSubject; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var RoomSubject = /*#__PURE__*/ function (_Bot) { _inherits(RoomSubject, _Bot); function RoomSubject(app, cb) { var _this; _classCallCheck(this, RoomSubject); _this = _possibleConstructorReturn(this, _getPrototypeOf(RoomSubject).call(this, app, cb)); _this.name = 'Room subject bot'; _this.description = 'A bot for managing the room suject'; _this.alias = ['!subject', '/subject']; _this.permissions = { 'set': 'bm', 'add': 'bm', 'del': 'bm', 'clear': 'bm', 'stop': 'b', 'run': 'b', 'pause': 'b' }; _this.subject = "Welcome to my show!"; _this.tags = ['latina', 'fit', 'muscles', 'strong', 'abs', 'biceps', 'thighs', 'lush', 'domi', 'lovense', 'twerk', 'ass', 'anal', 'shaved', 'redhair', 'tattoos', 'squirt', 'spanking', 'buttplug', 'sweet', 'friendly', 'dance']; _this.sufixes = {}; _this.foregroundColor = '#ffffff'; _this.backgroundColor = '#ff00cc'; _this.updateRoomSubject(); _this.init({ user: _this.cb.room_slug }); return _this; } _createClass(RoomSubject, [{ key: "init", value: function init(data) { this.run(data); } }, { key: "onStop", value: function onStop(data) { var text = "** ".concat(this.name, " status: STOPPED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendCommandFeedback({ user: data.user, text: text, color: 'red', background: 'white', cb: this.cb }); this.updateRoomSubject(); } }, { key: "onRun", value: function onRun(data) { var text = "** ".concat(this.name, " status: RUNNING **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendCommandFeedback({ user: data.user, text: text, color: 'green', background: 'white', cb: this.cb }); } }, { key: "onPause", value: function onPause(data) { var text = "** ".concat(this.name, " status: PAUSED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendCommandFeedback({ user: data.user, text: text, color: 'orange', background: 'white', cb: this.cb }); } ////////////////////// // Config // ////////////////////// }, { key: "getSettingsChoices", value: function getSettingsChoices() { return [{ name: "roomSubject", label: "########### ROOM SUBJECT ###################### ", type: "str", minLength: 5, maxLength: 255, defaultValue: this.subject, required: true }, { name: "roomTags ", label: "tags ", type: "str", minLength: 5, maxLength: 255, defaultValue: this.tags.join(', '), required: false }]; } ////////////////////// // Interface methods // ////////////////////// }, { key: "processCommand", value: function processCommand(options, message) { var _this2 = this; if (!this.checkPermission(options[0], message)) { return false; } // set subject if (options.length > 1 && options[0] == 'set') { var subject = options.splice(1); this.subject = subject.length > 0 ? subject.join(' ') : ''; this.updateRoomSubject(); } // add tags if (options.length > 1 && options[0] == 'add') { options.splice(1).forEach(function (tag) { if (!_this2.tags.find(function (t) { return t.toLowerCase() == tag.toLowerCase(); })) _this2.tags.push(tag); }); this.updateRoomSubject(); } // delete tags if (options.length > 1 && options[0] == 'del') { options.splice(1).forEach(function (tag) { var index = _this2.tags.indexOf(tag); if (index < 0) _this2.tags.splice(index, 1); }); this.updateRoomSubject(); } // clear all tags if (options.length > 1 && options[0] == 'clear') { this.tags = []; this.updateRoomSubject(); } //stop if (options.length == 1 && options[0] == 'stop') { this.stop({ message: message }); } //run if (options.length == 1 && options[0] == 'run') { this.run({ message: message }); } //pause if (options.length == 1 && options[0] == 'pause') { this.pause({ message: message }); } } // returns the hashtags }, { key: "getHashtags", value: function getHashtags() { return this.tags.map(function (tag) { return "#".concat(tag); }).join(' '); } // returns the subject and the tags }, { key: "getFullSubject", value: function getFullSubject() { return "".concat(this.subject, " ").concat(this.getHashtags()); } // adds a sufix to the sufixes object }, { key: "setSufix", value: function setSufix(key, value) { this.sufixes[key] = value; this.updateRoomSubject(); } // deletes a sufix from the sufixes object }, { key: "unsetSufix", value: function unsetSufix(key) { delete this.sufixes[key]; this.updateRoomSubject(); } // updates room subject and appends a given text }, { key: "updateRoomSubject", value: function updateRoomSubject() { var _this3 = this; var sufixes = Object.keys(this.sufixes).filter(function (key) { return _this3.sufixes[key]; }).map(function (key) { return _this3.sufixes[key]; }).join(' :: '); this.cb.changeRoomSubject("".concat(this.getFullSubject()).concat(sufixes ? ' ::' + sufixes : '')); } }]); return RoomSubject; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/stats.js": /*!*********************!*\ !*** ./js/stats.js ***! \*********************/ /*! exports provided: Stats */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Stats", function() { return Stats; }); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var Stats = /*#__PURE__*/ function () { function Stats(app, cb) { _classCallCheck(this, Stats); this.name = 'Stats'; this.app = app; this.cb = cb; this.history = []; } /** * Add a tip entry to the history. * @param {object} tip Tip data. * @return {object} Data holding the changes. */ _createClass(Stats, [{ key: "addTip", value: function addTip(tip) { this.history.push({ username: tip.from_user, amount: tip.amount, fan: tip.from_user_in_fanclub, time: Date.now() }); } }, { key: "sum", value: function sum() { return this.history.reduce(function (accumulator, current) { return accumulator + current.amount; }, 0); } }, { key: "tokenRate", value: function tokenRate() { var minutes = (Date.now() - this.app.start) / (60 * 1000); return parseFloat((this.sum() / minutes).toFixed(2)); } }, { key: "highestByUser", value: function highestByUser() { return this.history.reduce(function (accumulator, current) { var found = accumulator.find(function (item) { return item.username == current.username; }); if (!found) { found = { username: current.username, amount: 0 }; accumulator.push(found); } found.amount = Math.max(found.amount, current.amount); return accumulator; }, []).sort(function (a, b) { return b.amount - a.amount; }); } }, { key: "highestTip", value: function highestTip() { return this.highestByUser()[0] || { username: '', amount: 0 }; } }, { key: "sumByUser", value: function sumByUser() { return this.history.reduce(function (accumulator, current) { var found = accumulator.find(function (item) { return item.username == current.username; }); if (!found) { found = { username: current.username, amount: 0 }; accumulator.push(found); } found.amount += current.amount; return accumulator; }, []).sort(function (a, b) { return b.amount - a.amount; }); } }, { key: "bestTipper", value: function bestTipper() { return this.sumByUser()[0] || { username: '', amount: 0 }; } }, { key: "sumFromUser", value: function sumFromUser(username) { return this.history.filter(function (item) { return username == item.username; }).reduce(function (accumulator, current) { return accumulator + current.amount; }, 0); } }, { key: "sumFromFans", value: function sumFromFans() { return this.history.filter(function (item) { return item.fan; }).reduce(function (accumulator, current) { return accumulator + current.amount; }, 0); } }, { key: "toString", value: function toString() { return this.history.reverse().map(function (item) { return "".concat(item.username, ": ").concat(item.amount, " tokens: ").concat(Stats.hrTime(item.time)); }).join('\n'); } }, { key: "clearStats", value: function clearStats() { this.history = []; } }], [{ key: "hrTime", value: function hrTime(miliseconds) { var seconds = Math.floor(miliseconds / 1000); var h = Math.floor(seconds / 3600); var m = Math.floor(seconds % 3600 / 60); var s = seconds % 60; return (h > 0 ? h + 'hour' + (h > 1 ? 's ' : ' ') : '') + (s == 0 && m > 0 ? 'and ' : '') + (m > 0 ? m + 'minute' + (m > 1 ? 's ' : ' ') : '') + (s > 0 && h + m > 0 ? 'and ' : '') + (s > 0 ? s + 'second' + (s > 1 ? 's ' : ' ') : '') + 'ago'; } }]); return Stats; }(); /***/ }), /***/ "./js/thanks_manager.js": /*!******************************!*\ !*** ./js/thanks_manager.js ***! \******************************/ /*! exports provided: ThanksManager */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ThanksManager", function() { return ThanksManager; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var ThanksManager = /*#__PURE__*/ function (_Bot) { _inherits(ThanksManager, _Bot); function ThanksManager(app, cb) { var _this; _classCallCheck(this, ThanksManager); _this = _possibleConstructorReturn(this, _getPrototypeOf(ThanksManager).call(this, app, cb)); _this.name = 'Thanks manager bot'; _this.description = 'A bot for handling "thank you" messages'; _this.alias = ['!thanks', '/thanks']; _this.permissions = { 'add': 'bm', 'list': 'bm', 'rm': 'bm', 'stop': 'b', 'run': 'b', 'pause': 'b' }; _this.foregroundColor = '#ffff00'; _this.backgroundColor = '#2200cc'; _this.settingsInputFields = 10; _this.thanks = { '1-10': ['Thanks $u, keep them comming ;)', 'Very nice of you $u. Thanks for the tip'], '69': ['$t tokens uh? nice choice :)', '$t is my favorite number! how did you know, $u?', '$t is fun, don\'t you think?'], '300-': ['Geez $u, thank you so much!', 'Fuck $u. Don\'t stop now'], '101-200': ['You\'re so generous, $u!', 'Love you, $u! $t tokens! <3 <3'], '15-100': ['Mmmmm ... OMG, thank you $u!', 'So sweet of you, $u', 'Thanks $u!'], '201-300': ['$t tokens! that\'s insane $u!'], '1000-': ['Yes, yes, YESSSSSS $u! thank you!!!', 'Yeeeeeeha, $u!. Thanks a lot!!'], '5000-': ['OH MY GOD!! $t fucking tokens!! I love it!', '$t fucking tokens!!! OMG!'] }; _this.init({ user: cb.room_slug }); return _this; } _createClass(ThanksManager, [{ key: "init", value: function init(data) { this.readConfig(this.cb); this.loadConfig(); this.sortThanks(); this.settings.thanksBotEnabled == 'yes' && this.run(data) || this.stop(data); } }, { key: "sortThanks", value: function sortThanks() { var _this2 = this; this.thanks = Object.keys(this.thanks).sort(function (a, b) { if (a.indexOf('-') < 0 && b.indexOf('-') < 0) return parseInt(a) - parseInt(b); if (a.indexOf('-') < 0 && b.indexOf('-') >= 0) return -1; if (a.indexOf('-') >= 0 && b.indexOf('-') < 0) return 1; if (a.indexOf('-') == 0 && b.indexOf('-') == 0) { return parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]); } if (a.indexOf('-') == 0 && b.indexOf('-') > 0) { return parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]); } if (a.indexOf('-') > 0 && b.indexOf('-') == 0) { return parseInt(a.split('-')[1]) - parseInt(b.split('-')[1]); } if (a.indexOf('-') > 0 && b.indexOf('-') > 0) { return parseInt(a.split('-')[0]) - parseInt(b.split('-')[0]); } }).map(function (item) { return { min: _this2.rewriteRange(item).split('-')[0], max: _this2.rewriteRange(item).split('-')[1] || _this2.rewriteRange(item).split('-')[0], msgs: _this2.thanks[item] }; }); } }, { key: "rewriteRange", value: function rewriteRange(range) { if (range.indexOf('-') == 0) return "1".concat(range); if (range.indexOf('-') == range.length - 1) return "".concat(range, "1000000"); return range; } }, { key: "getThanks", value: function getThanks(tip) { var candidates = this.getCandidates(tip.amount); return candidates[Math.floor(Math.random() * Math.floor(candidates.length))].replace('$u', tip.from_user).replace('$t', tip.amount); } }, { key: "getCandidates", value: function getCandidates(tipAmount) { var exact = this.thanks.filter(function (item) { return tipAmount == item.max && tipAmount == item.min; }); if (exact.length > 0) { return exact.map(function (item) { return item.msgs; }).reduce(function (accumulator, current) { return accumulator.concat(current); }, []); } return this.thanks.filter(function (item) { return tipAmount <= item.max && tipAmount >= item.min; }).map(function (item) { return item.msgs; }).reduce(function (accumulator, current) { return accumulator.concat(current); }, []); } ////////////////////// // Config // ////////////////////// }, { key: "loadConfig", value: function loadConfig() { this.processThanks(); } }, { key: "processThanks", value: function processThanks() { var _this3 = this; Object.keys(this.settings).filter(function (key) { return key.indexOf('thanksMsg') == 0 && _this3.settings[key] != undefined && _this3.settings[key].trim().length > 0; }).forEach(function (key) { var _this3$settings$key$s = _this3.settings[key].split('|'), _this3$settings$key$s2 = _slicedToArray(_this3$settings$key$s, 2), tip = _this3$settings$key$s2[0], message = _this3$settings$key$s2[1]; if (typeof _this3.thanks == 'Object' && _this3.thanks.hasOwnProperty(tip)) _this3.thanks[tip].push(message);else _this3.thanks[tip] = [message]; }); } }, { key: "getSettingsChoices", value: function getSettingsChoices() { var result = [{ name: "thanksBotEnabled", label: "########### THANKS BOT ###################### ", type: "choice", choice1: "yes", choice2: "no", defaultValue: "yes", required: true }]; for (var i = 0; i < this.settingsInputFields; i++) { result.push({ name: "thanksMsg".concat(i), label: "Message ".concat(i, " "), type: "str", minLength: 5, maxLength: 255, defaultValue: "", required: false }); } return result; } }]); return ThanksManager; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/tip_menu.js": /*!************************!*\ !*** ./js/tip_menu.js ***! \************************/ /*! exports provided: TipMenu */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TipMenu", function() { return TipMenu; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); /* harmony import */ var _consts_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./consts.js */ "./js/consts.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var TipMenu = /*#__PURE__*/ function (_Bot) { _inherits(TipMenu, _Bot); // foregroundColor = '#ffffff'; // backgroundColor = '#ffaa3e'; function TipMenu(app, cb) { var _this; _classCallCheck(this, TipMenu); _this = _possibleConstructorReturn(this, _getPrototypeOf(TipMenu).call(this, app, cb)); _this.name = 'Tip menu bot'; _this.description = 'A bot for handling tips for a tip menu'; _this.alias = ['!tm', '!menu', '/tm', '/menu']; _this.permissions = { 'add': 'bm', 'list': 'bm', 'rm': 'bm', 'stop': 'b', 'run': 'b', 'pause': 'b' }; _this.settingsInputFields = 30; _this.types = ['main', 'fit']; _this.defaultType = 'main'; _this.listPrefix = 'menuItem'; _this.menu = []; _this.showAs = _consts_js__WEBPACK_IMPORTED_MODULE_2__["format"].ROW; _this.readConfig(cb); _this.init({ user: cb.room_slug }); _this.showMenu(); // this.app.log(this.menu); return _this; } _createClass(TipMenu, [{ key: "init", value: function init(data) { this.processMenuItems(); this.sortMenu(); this.run(); // ((this.settings.menuBotEnabled == 'yes') && this.run(data)) || this.stop(data); } }, { key: "sortMenu", value: function sortMenu() { var _this2 = this; Object.keys(this.menu).forEach(function (key) { _this2.menu[key].sort(function (a, b) { return b.value - a.value < 1 ? 1 : -1; }); }); } }, { key: "processMenuItems", value: function processMenuItems() { var _this3 = this; this.menu = {}; // filter menu items (those with the bot prefix and a number at the end) Object.keys(this.settings).filter(function (key) { return key.match(_this3.listPrefix + '[0-9]+') != null && _this3.settings[key] != undefined && _this3.settings[key].trim().length > 0; }).forEach(function (key) { var _this3$settings$key$s = _this3.settings[key].split('|'), _this3$settings$key$s2 = _slicedToArray(_this3$settings$key$s, 2), value = _this3$settings$key$s2[0], description = _this3$settings$key$s2[1]; var index = key.match(/(\d+)$/)[0], type = _this3.settings["".concat(_this3.listPrefix, "Type").concat(index)]; // add item to corresponding type if (Array.isArray(_this3.menu[type])) _this3.menu[type].push({ value: value, description: description, times: 0 });else _this3.menu[type] = [{ value: value, description: description, times: 0 }]; }); } }, { key: "getSettingsChoices", value: function getSettingsChoices() { var result = [{ name: "menuBotEnabled", label: "########### MENU BOT ###################### ", type: "choice", choice1: "yes", choice2: "no", defaultValue: "yes", required: true }]; for (var i = 0; i < this.settingsInputFields; i++) { result.push({ name: "".concat(this.listPrefix).concat(i), label: "Menu item ".concat(i, " (format: value | text) "), type: "str", minLength: 5, maxLength: 255, defaultValue: this.menu[i] && this.menu[i].amount && this.menu[i].description ? "".concat(this.menu[i].amount, " | ").concat(this.menu[i].description) : '', required: false }); var typesField = { name: "".concat(this.listPrefix, "Type").concat(i), label: "Menu item ".concat(i, " type "), type: 'choice', defaultValue: this.menu[i] && this.menu[i].type || 'main', required: false }; for (var _i2 = 0; _i2 < this.types.length; _i2++) { typesField["choice".concat(_i2 + 1)] = this.types[_i2]; } result.push(typesField); } return result; } }, { key: "showMenu", value: function showMenu() { if (!this.isRunning()) return; // this.app.log(this.menu); // Object.keys(this.menu).forEach((type,idx,menu) => { // const items = menu[type].map(item => {`${item.description} - ${item.value}`}); // Echo.send({cb, color: this.color, background: this.backgroundColor, text: items.join(' -- ')}); // }); } }]); return TipMenu; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/tipper.js": /*!**********************!*\ !*** ./js/tipper.js ***! \**********************/ /*! exports provided: Tipper */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tipper", function() { return Tipper; }); /* harmony import */ var _bot_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bot.js */ "./js/bot.js"); /* harmony import */ var _echo_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./echo.js */ "./js/echo.js"); function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Tipper = /*#__PURE__*/ function (_Bot) { _inherits(Tipper, _Bot); function Tipper(app, cb) { var _this; _classCallCheck(this, Tipper); _this = _possibleConstructorReturn(this, _getPrototypeOf(Tipper).call(this, app, cb)); _this.name = 'Tipper bot'; _this.description = 'A bot for handling tips'; _this.alias = ['!tipr', '/tipr']; _this.permissions = { 'king': 'bma', 'bomb': 'bma', 'rate': 'bma', 'list': 'bma', 'top5': 'bma', 'stop': 'b', 'run': 'b', 'pause': 'b' }; _this.foregroundColor = '#b7ff00'; _this.backgroundColor = '#4800ff'; return _this; } _createClass(Tipper, [{ key: "onTip", value: function onTip(tip) { var changes = this.updateStats(tip); this.sendThanks(tip); this.sendChanges(changes); } }, { key: "updateStats", value: function updateStats(tip) { var oldData = { best: this.stats.bestTipper(), highest: this.stats.highestTip() }; this.stats.addTip(tip); var newData = { best: this.stats.bestTipper(), highest: this.stats.highestTip() }, newBest = oldData.best.username == newData.best.username ? '' : newData.best, newHighest = oldData.highest.amount == newData.highest.amount ? '' : newData.highest; return { best: newBest, highest: newHighest }; } }, { key: "sendChanges", value: function sendChanges(changes) { var cb = this.cb; if (changes.best != '') _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ cb: cb, text: "".concat(changes.best.username, " is my new KING"), color: this.foregroundColor, background: this.backgroundColor }); if (changes.highest != '') _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ cb: cb, text: "".concat(changes.highest.username, " holds the HIGHEST tip with ").concat(changes.highest.amount, " tokens"), color: this.foregroundColor, background: this.backgroundColor }); } }, { key: "sendThanks", value: function sendThanks(tip) { var cb = this.cb, thanks = this.app.get('thanks'), text = thanks.getThanks(tip); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ cb: cb, text: text, color: thanks.foregroundColor || this.foregroundColor, background: thanks.backgroundColor || this.backgroundColor }); } }, { key: "onStop", value: function onStop(data) { var text = "** ".concat(this.name, " status: STOPPED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: data.user, text: text, color: 'red', background: 'white', cb: this.cb }); } }, { key: "onRun", value: function onRun(data) { var text = "** ".concat(this.name, " status: RUNNING **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: data.user, text: text, color: 'green', background: 'white', cb: this.cb }); } }, { key: "onPause", value: function onPause(data) { var text = "** ".concat(this.name, " status: PAUSED **"); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: data.user, text: text, color: 'orange', background: 'white', cb: this.cb }); } }, { key: "king", value: function king() { return this.stats.bestTipper(); } }, { key: "highest", value: function highest() { return this.stats.highestTip(); } }, { key: "tokenRate", value: function tokenRate() { return this.stats.tokenRate(); } }, { key: "list", value: function list() { var top = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return top ? this.stats.sumByUser().slice(0, top) : this.stats.sumByUser(); } ////////////////////// // Config // ////////////////////// }, { key: "getSettingsChoices", value: function getSettingsChoices() { return []; } ////////////////////// // Interface methods // ////////////////////// }, { key: "processCommand", value: function processCommand(options, message) { if (!this.checkPermission(options[0], message)) { return false; } // king if (options.length == 1 && options[0] == 'king') { var king = this.king(), text = king.username ? "".concat(king.username, " is my king tipper with ").concat(king.amount, " tokens") : "Noody has tipped yet"; _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: text, color: this.foregroundColor, background: this.backgroundColor, cb: this.cb }); } // bomb if (options.length == 1 && options[0] == 'bomb') { var highest = this.highest(), _text = highest.username ? "".concat(highest.username, " gave the highest singe-tip with ").concat(highest.amount, " tokens") : "Nobody has tipped yet"; _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text, color: this.foregroundColor, background: this.backgroundColor, cb: this.cb }); } //rate if (options.length == 1 && options[0] == 'rate') { var rate = this.tokenRate(), _text2 = !Number.isNaN(rate) ? "Token rate since the bot started:".concat(rate, " tokens/minute") : "Nobody has tipped yet"; _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text2, color: this.foregroundColor, background: this.backgroundColor, cb: this.cb }); } //list if (options.length == 1 && options[0] == 'list') { var counter = 0; var _text3 = this.list().reduce(function (accumulator, current) { return accumulator + '\n' + "".concat(++counter, ". ").concat(current.username, " : ").concat(current.amount); }, '').trim('\n'); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text3, color: this.foregroundColor, background: this.backgroundColor, cb: this.cb }); } //top5 if (options.length == 1 && options[0] == 'top5') { var _counter = 0; var _text4 = this.list(5).reduce(function (accumulator, current) { return accumulator + '\n' + "".concat(++_counter, ". ").concat(current.username, " : ").concat(current.amount); }, '').trim('\n'); _echo_js__WEBPACK_IMPORTED_MODULE_1__["Echo"].sendBold({ user: message.user, text: _text4, color: this.foregroundColor, background: this.backgroundColor, cb: this.cb }); } //stop if (options.length == 1 && options[0] == 'stop') { this.stop({ message: message }); } //run if (options.length == 1 && options[0] == 'run') { this.run({ message: message }); } //pause if (options.length == 1 && options[0] == 'pause') { this.pause({ message: message }); } } }]); return Tipper; }(_bot_js__WEBPACK_IMPORTED_MODULE_0__["Bot"]); /***/ }), /***/ "./js/values.js": /*!**********************!*\ !*** ./js/values.js ***! \**********************/ /*! exports provided: unicodeChars */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unicodeChars", function() { return unicodeChars; }); var unicodeChars = { space: " ", dot: "\u22C5", // dot heart: "\u2665", // heart star: "\u2605", // filled star whiteStar: "\u2606", // white star square: "\u25FC", triangleRight: "\u25B6", dashChar: "\u2500", whiteHeart: "\u2661", arrow: "\u2192", triangleDown: "\u25BC", longDash: "\u2015", topLeftCorner: "\u250C", bottomLeftCorner: "\u2514", vertDash: "\u2502" }; /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vanMvYXBwLmpzIiwid2VicGFjazovLy8uL2pzL2JsYWNrX2xpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vanMvYm90LmpzIiwid2VicGFjazovLy8uL2pzL2JvdF9tYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL2pzL2NvbnN0cy5qcyIsIndlYnBhY2s6Ly8vLi9qcy9lY2hvLmpzIiwid2VicGFjazovLy8uL2pzL2tlcmJlcm9zLmpzIiwid2VicGFjazovLy8uL2pzL21lc3Nlbmdlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy9tdWx0aV9nb2FsLmpzIiwid2VicGFjazovLy8uL2pzL25vdGlmaWVyLmpzIiwid2VicGFjazovLy8uL2pzL3Jvb21fc3ViamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9qcy9zdGF0cy5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aGFua3NfbWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aXBfbWVudS5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aXBwZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvdmFsdWVzLmpzIl0sIm5hbWVzIjpbImFwcCIsIkJvdE1hbmFnZXIiLCJjYiIsImFkZCIsIktlcmJlcm9zIiwiTm90aWZpZXIiLCJUaXBNZW51IiwiVGlwcGVyIiwiTWVzc2VuZ2VyIiwiVGhhbmtzTWFuYWdlciIsIlJvb21TdWJqZWN0IiwiTXVsdGlHb2FsIiwic2V0dGluZ3NfY2hvaWNlcyIsImdldFNldHRpbmdzQ2hvaWNlcyIsImJsYWNrTGlzdCIsInVzZXJzIiwiQm90IiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJuZXdsaW5lIiwiY29yZUNvbW1hbmRzIiwiY2hlY2tJbnRlcmZhY2UiLCJzdGF0cyIsIlN0YXRzIiwic3RhdHVzIiwiUlVOTklORyIsImNsZWFyRGF0YSIsInByb2Nlc3NDb21tYW5kIiwiY29tbWFuZCIsImluY2x1ZGVzIiwibWV0aG9kTmFtZSIsImNsZWFyU3RhdHMiLCJkYXRhIiwiUEFVU0VEIiwib25QYXVzZSIsIlNUT1BQRUQiLCJvblN0b3AiLCJvblJ1biIsImNiTWVzc2FnZSIsInBhcnNlTWVzc2FnZUZvckNvbW1hbmRzIiwidGlwIiwidXNlciIsImdldENvbW1hbmQiLCJtIiwiaXNSdW5uaW5nIiwiaXNDb3JlQ29tbWFuZCIsIm9wdGlvbnMiLCJtZXNzYWdlVGV4dCIsIm1lc3NhZ2VBcnJheSIsInRyaW0iLCJzcGxpdCIsImFsaWFzIiwic2xpY2UiLCJhY3Rpb24iLCJwZXJtaXNzaW9ucyIsImlzX21vZCIsImluZGV4T2YiLCJyb29tX3NsdWciLCJzZXR0aW5ncyIsIm1hcCIsIml0ZW0iLCJuYW1lIiwiZm9yRWFjaCIsImtleSIsImJvdHMiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJvbk1lc3NhZ2UiLCJtZXNzYWdlIiwib25UaXAiLCJvbkVudGVyIiwib25MZWF2ZSIsIm9uRHJhd1BhbmVsIiwicmVkdWNlIiwicmVzdWx0IiwiYm90IiwiY29uY2F0IiwiaWQiLCJwdXNoIiwiZmluZCIsInNwbGljZSIsImZpbmRJbmRleCIsInZhbHVlIiwic2VuZE5vdGljZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJmb3JtYXQiLCJMSVNUIiwiUk9XIiwiRWNobyIsInRleHQiLCJsZW5ndGgiLCJ1bmljb2RlQ2hhcnMiLCJ0b3BMZWZ0Q29ybmVyIiwicmVwZWF0IiwiZGFzaENoYXIiLCJ2ZXJ0RGFzaCIsImJvdHRvbUxlZnRDb3JuZXIiLCJjaGFyIiwiZm9ybWF0UHJlZml4IiwibGluZXMiLCJsaW5lIiwiam9pbiIsInRpbWVzIiwiZ3JvdXAiLCJpbnZlcnNlIiwiYmFja2dyb3VuZCIsImRlc2NyaXB0aW9uIiwiZm9yZWdyb3VuZENvbG9yIiwicGFyc2VCbGFja2xpc3QiLCJibGFja2xpc3QiLCJpc0NsZWFuIiwidG9Mb3dlckNhc2UiLCJpc1ByaXZpbGVnZWQiLCJub3RpZnlBYnVzZSIsImJsYWNrbGlzdGVkIiwiY2hlY2tQZXJtaXNzaW9uIiwic2VuZCIsInBhcnNlIiwic29tZSIsImVsZW1lbnQiLCJ0ZXN0IiwiUmVnRXhwIiwibXNnIiwidGlwU3VtIiwiZ2V0Iiwic3VtRnJvbVVzZXIiLCJwcmVmaXgiLCJzZXR0aW5nc0lucHV0RmllbGRzIiwic3ViamVjdE1hbmFnZXIiLCJpbml0IiwicmVhZENvbmZpZyIsIm11bHRpR29hbEJvdEVuYWJsZWQiLCJydW4iLCJzdG9wIiwic2VuZENvbW1hbmRGZWVkYmFjayIsImxhYmVsIiwidHlwZSIsImNob2ljZTEiLCJjaG9pY2UyIiwiZGVmYXVsdFZhbHVlIiwicmVxdWlyZWQiLCJpIiwibWluTGVuZ3RoIiwibWF4TGVuZ3RoIiwicGF1c2UiLCJmb3JtYXRMaW5lcyIsInN1YmplY3QiLCJ0YWdzIiwic3VmaXhlcyIsInVwZGF0ZVJvb21TdWJqZWN0IiwidGFnIiwidCIsImluZGV4IiwiZ2V0SGFzaHRhZ3MiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiY2hhbmdlUm9vbVN1YmplY3QiLCJnZXRGdWxsU3ViamVjdCIsImhpc3RvcnkiLCJ1c2VybmFtZSIsImZyb21fdXNlciIsImFtb3VudCIsImZhbiIsImZyb21fdXNlcl9pbl9mYW5jbHViIiwidGltZSIsImFjY3VtdWxhdG9yIiwiY3VycmVudCIsIm1pbnV0ZXMiLCJwYXJzZUZsb2F0Iiwic3VtIiwidG9GaXhlZCIsImZvdW5kIiwiTWF0aCIsIm1heCIsInNvcnQiLCJhIiwiYiIsImhpZ2hlc3RCeVVzZXIiLCJzdW1CeVVzZXIiLCJyZXZlcnNlIiwiaHJUaW1lIiwibWlsaXNlY29uZHMiLCJzZWNvbmRzIiwiZmxvb3IiLCJoIiwicyIsInRoYW5rcyIsImxvYWRDb25maWciLCJzb3J0VGhhbmtzIiwidGhhbmtzQm90RW5hYmxlZCIsInBhcnNlSW50IiwibWluIiwicmV3cml0ZVJhbmdlIiwibXNncyIsInJhbmdlIiwiY2FuZGlkYXRlcyIsImdldENhbmRpZGF0ZXMiLCJyYW5kb20iLCJyZXBsYWNlIiwidGlwQW1vdW50IiwiZXhhY3QiLCJwcm9jZXNzVGhhbmtzIiwidW5kZWZpbmVkIiwiaGFzT3duUHJvcGVydHkiLCJ0eXBlcyIsImRlZmF1bHRUeXBlIiwibGlzdFByZWZpeCIsIm1lbnUiLCJzaG93QXMiLCJzaG93TWVudSIsInByb2Nlc3NNZW51SXRlbXMiLCJzb3J0TWVudSIsIm1hdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwidHlwZXNGaWVsZCIsImNoYW5nZXMiLCJ1cGRhdGVTdGF0cyIsInNlbmRUaGFua3MiLCJzZW5kQ2hhbmdlcyIsIm9sZERhdGEiLCJiZXN0IiwiYmVzdFRpcHBlciIsImhpZ2hlc3QiLCJoaWdoZXN0VGlwIiwiYWRkVGlwIiwibmV3RGF0YSIsIm5ld0Jlc3QiLCJuZXdIaWdoZXN0Iiwic2VuZEJvbGQiLCJnZXRUaGFua3MiLCJ0b2tlblJhdGUiLCJ0b3AiLCJraW5nIiwicmF0ZSIsIk51bWJlciIsImlzTmFOIiwiY291bnRlciIsImxpc3QiLCJzcGFjZSIsImRvdCIsImhlYXJ0Iiwic3RhciIsIndoaXRlU3RhciIsInNxdWFyZSIsInRyaWFuZ2xlUmlnaHQiLCJ3aGl0ZUhlYXJ0IiwiYXJyb3ciLCJ0cmlhbmdsZURvd24iLCJsb25nRGFzaCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FB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QUFRLEVBQVcsUUFSQztBQVNwQnlKLFlBQVUsRUFBUyxRQVRDO0FBVXBCQyxPQUFLLEVBQWMsUUFWQztBQVdwQkMsY0FBWSxFQUFPLFFBWEM7QUFZcEJDLFVBQVEsRUFBVyxRQVpDO0FBYXBCOUosZUFBYSxFQUFNLFFBYkM7QUFjcEJJLGtCQUFnQixFQUFHLFFBZEM7QUFlcEJELFVBQVEsRUFBVztBQWZDLENBQXJCLEMiLCJmaWxlIjoiYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9qcy9hcHAuanNcIik7XG4iLCJpbXBvcnQge05vdGlmaWVyfSAgICAgIGZyb20gJy4vbm90aWZpZXIuanMnO1xuaW1wb3J0IHtUaXBwZXJ9ICAgICAgICBmcm9tICcuL3RpcHBlci5qcyc7XG5pbXBvcnQge01lc3Nlbmdlcn0gICAgIGZyb20gJy4vbWVzc2VuZ2VyLmpzJztcbmltcG9ydCB7Qm90TWFuYWdlcn0gICAgZnJvbSAnLi9ib3RfbWFuYWdlci5qcyc7XG5pbXBvcnQge1RoYW5rc01hbmFnZXJ9IGZyb20gJy4vdGhhbmtzX21hbmFnZXIuanMnO1xuaW1wb3J0IHtLZXJiZXJvc30gICAgICBmcm9tICcuL2tlcmJlcm9zLmpzJztcbmltcG9ydCB7VGlwTWVudX0gICAgICAgZnJvbSAnLi90aXBfbWVudS5qcyc7XG5pbXBvcnQge1Jvb21TdWJqZWN0fSAgIGZyb20gJy4vcm9vbV9zdWJqZWN0LmpzJztcbmltcG9ydCB7TXVsdGlHb2FsfSAgICAgZnJvbSAnLi9tdWx0aV9nb2FsLmpzJztcbi8vIGltcG9ydCB7VGlja2V0U2hvd30gICAgICBmcm9tICcuL3RpY2tldF9zaG93LmpzJztcblxuY29uc3QgYXBwID0gbmV3IEJvdE1hbmFnZXIoY2IpO1xuYXBwLmFkZCgna2VyYmVyb3MnLCAgbmV3IEtlcmJlcm9zKGFwcCwgY2IpKTtcbmFwcC5hZGQoJ25vdGlmaWVyJywgIG5ldyBOb3RpZmllcihhcHAsIGNiKSk7XG5hcHAuYWRkKCd0aXBNZW51JywgICBuZXcgVGlwTWVudShhcHAsIGNiKSk7XG5hcHAuYWRkKCd0aXBwZXInLCAgICBuZXcgVGlwcGVyKGFwcCwgY2IpKTtcbmFwcC5hZGQoJ21lc3NlbmdlcicsIG5ldyBNZXNzZW5nZXIoYXBwLCBjYikpO1xuYXBwLmFkZCgndGhhbmtzJywgICAgbmV3IFRoYW5rc01hbmFnZXIoYXBwLCBjYikpO1xuYXBwLmFkZCgncm9vbVN1YmplY3QnLG5ldyBSb29tU3ViamVjdChhcHAsIGNiKSk7XG5hcHAuYWRkKCdtdWx0aUdvYWwnLCBuZXcgTXVsdGlHb2FsKGFwcCwgY2IpKTtcblxuY2Iuc2V0dGluZ3NfY2hvaWNlcyA9IGFwcC5nZXRTZXR0aW5nc0Nob2ljZXMoKTtcblxuIiwiZXhwb3J0IGNvbnN0IGJsYWNrTGlzdCA9IHtcblx0dXNlcnM6IFtdLFxuXHRibGFja0xpc3Q6IFsnc2hpdCcsICd3aG9yZScsICdiaXRjaCcsICdyZW1vdmUgc3BhY2UnLCAnL2Z1Y2soaW5nKT8vJ11cbn07IiwiaW1wb3J0IHtTdGF0c30gZnJvbSAnLi9zdGF0cy5qcydcbmltcG9ydCB7c3RhdHVzfSBmcm9tICcuL2NvbnN0cy5qcyc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQ0IgYm90cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvdCB7XG5cdGJhY2tncm91bmRDb2xvciA9ICcnIDtcblx0Y29sb3IgICAgICAgICAgID0gJyMwMDAwMDAnIDtcblx0bmV3bGluZSAgICAgICAgID0gJ1xcbic7XG5cdGNvcmVDb21tYW5kcyAgICA9IFsncnVuJywnc3RvcCcsJ3BhdXNlJ107XG5cblx0Y29uc3RydWN0b3IoYXBwLCBjYikge1xuXHRcdHRoaXMuY2hlY2tJbnRlcmZhY2UoKTtcblx0XHR0aGlzLmNiID0gY2I7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5zdGF0cyA9IG5ldyBTdGF0cyhhcHAsIGNiKTtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cy5SVU5OSU5HO1xuXHR9XG5cblx0Y2hlY2tJbnRlcmZhY2UoKSB7XG5cdFx0aWYoIXRoaXMuY2xlYXJEYXRhIHx8ICF0aGlzLnByb2Nlc3NDb21tYW5kKSB7XG5cdFx0XHQvLyBpZiAoIXRoaXMucHJvY2Vzc0NvbW1hbmQpIHRocm93IG5ldyBFcnJvcignQ2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBwcm9jZXNzQ29tbWFuZCgpIGZ1bmN0aW9uLiAnKTtcblx0XHR9XG5cdH1cblxuXHRpc0NvcmVDb21tYW5kKGNvbW1hbmQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb3JlQ29tbWFuZHMuaW5jbHVkZXMoY29tbWFuZCk7XG5cdH1cblxuXHRoYXNNZXRob2QobWV0aG9kTmFtZSkge1xuXHRcdHJldHVybiB0aGlzW21ldGhvZE5hbWVdICYmIHR5cGVvZiB0aGlzW21ldGhvZE5hbWVdID09ICdmdW5jdGlvbic7XG5cdH1cblxuXHRpc1J1bm5pbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdHVzID09IHN0YXR1cy5SVU5OSU5HO1xuXHR9XG5cblx0Y2xlYXJEYXRhKCkge1xuXHRcdGlmICh0aGlzLnN0YXRzKSB0aGlzLnN0YXRzLmNsZWFyU3RhdHMoKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vXG5cdC8vIGNvbW1hbmRzIC8vXG5cdC8vLy8vLy8vLy8vLy8vXG5cblx0cGF1c2UoZGF0YSkge1xuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzLlBBVVNFRDtcblx0XHR0aGlzLm9uUGF1c2UoZGF0YSk7XG5cdH1cblxuXHRzdG9wKGRhdGEpIHtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cy5TVE9QUEVEO1xuXHRcdHRoaXMuY2xlYXJEYXRhKCk7XG5cdFx0dGhpcy5vblN0b3AoZGF0YSk7XG5cdH1cblxuXHRydW4oZGF0YSkge1xuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzLlJVTk5JTkc7XG5cdFx0dGhpcy5vblJ1bihkYXRhKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vL1xuXHQvLyBldmVudHMgLy9cblx0Ly8vLy8vLy8vLy8vXG5cblx0b25QYXVzZShkYXRhKSB7XG5cdFx0cmV0dXJuO1xuXHR9ICBcblxuXHRvblN0b3AoZGF0YSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdG9uUnVuKGRhdGEpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogW29uTWVzc2FnZSBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2JqZWN0fSBtZXNzYWdlIEluZm8gcmVsYXRlZCB0byB0aGUgbWVzc2FnZS5cblx0ICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgIFtkZXNjcmlwdGlvbl1cblx0ICpcblx0ICogYzogbWVzc2FnZSBjb2xvclxuXHQgKiBtOiB0aGUgbWVzc2FnZSB0ZXh0XG5cdCAqIHVzZXI6IHVzZXJuYW1lIG9mIG1lc3NhZ2Ugc2VuZGVyXG5cdCAqIGY6IG1lc3NhZ2UgZm9udFxuXHQgKiBpbl9mYW5jbHViOiBpcyB0aGUgdXNlciBpbiB0aGUgYnJvYWRjYXN0ZXJzIGZhbiBjbHViXG5cdCAqIGhhc190b2tlbnM6IGRvZXMgdGhlIHVzZXIgaGF2ZSBhdCBsZWFzdCAxIHRva2VuXG5cdCAqIGlzX21vZDogaXMgdGhlIHVzZXIgYSBtb2RlcmF0b3Jcblx0ICogdGlwcGVkX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgYmx1ZeKAnT9cblx0ICogdGlwcGVkX2Fsb3RfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCccHVycGxl4oCdP1xuXHQgKiB0aXBwZWRfdG9uc19yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIHB1cnBsZeKAnT9cblx0ICogZ2VuZGVyOiDigJxt4oCdIChtYWxlKSwg4oCcZuKAnSAoZmVtYWxlKSwg4oCcc+KAnSAodHJhbnMpLCBvciDigJxj4oCdIChjb3VwbGUpXG5cdCAqL1xuXHRvbk1lc3NhZ2UoY2JNZXNzYWdlKSB7XG5cdFx0dGhpcy5wYXJzZU1lc3NhZ2VGb3JDb21tYW5kcyhjYk1lc3NhZ2UpO1xuXHR9XG5cblxuXHQvKipcblx0ICogW29uVGlwIGRlc2NyaXB0aW9uXVxuXHQgKiBAcGFyYW0gIHtvYmplY3R9IHRpcCBJbmZvIHJlbGF0ZWQgdG8gdGhlIHRpcC4gXG5cdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgIFtkZXNjcmlwdGlvbl1cblx0ICogXG5cdCAqIGFtb3VudDogYW1vdW50IG9mIHRpcFxuXHQgKiBtZXNzYWdlOiBtZXNzYWdlIGluIHRpcFxuXHQgKiB0b191c2VyOiB1c2VyIHdobyByZWNlaXZlZCB0aXBcblx0ICogZnJvbV91c2VyOiB1c2VyIHdobyBzZW50IHRpcFxuXHQgKiBmcm9tX3VzZXJfaW5fZmFuY2x1YjogaXMgdGhlIHVzZXIgaW4gdGhlIGJyb2FkY2FzdGVycyBmYW4gY2x1YlxuXHQgKiBmcm9tX3VzZXJfaGFzX3Rva2VuczogZG9lcyB0aGUgdXNlciBoYXZlIGF0IGxlYXN0IDEgdG9rZW5cblx0ICogZnJvbV91c2VyX2lzX21vZDogaXMgdGhlIHVzZXIgYSBtb2RlcmF0b3Jcblx0ICogZnJvbV91c2VyX3RpcHBlZF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIGJsdWXigJ0/XG5cdCAqIGZyb21fdXNlcl90aXBwZWRfYWxvdF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxwdXJwbGXigJ0/XG5cdCAqIGZyb21fdXNlcl90aXBwZWRfdG9uc19yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIHB1cnBsZeKAnT9cblx0ICogZnJvbV91c2VyX2dlbmRlcjog4oCcbeKAnSAobWFsZSksIOKAnGbigJ0gKGZlbWFsZSksIOKAnHPigJ0gKHRyYW5zKSwgb3Ig4oCcY+KAnSAoY291cGxlKVxuXHQgKi9cblx0b25UaXAodGlwKSB7IHJldHVybjsgfVxuXG5cdC8qKlxuXHQgKiBbb25FbnRlciBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2JqZWN0fSB1c2VyIEluZm8gcmVsYXRlZCB0byB0aGUgdXNlciB3aG8gZW50ZXJzIHRoZSByb29tLlxuXHQgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKlxuXHQgKiB1c2VyOiB1c2VyIHdobyBlbnRlcmVkIHRoZSByb29tXG5cdCAqIGluX2ZhbmNsdWI6IGlzIHRoZSB1c2VyIGluIHRoZSBicm9hZGNhc3RlcuKAmXMgZmFuIGNsdWJcblx0ICogaGFzX3Rva2VuczogZG9lcyB0aGUgdXNlciBoYXZlIGF0IGxlYXN0IDEgdG9rZW5cblx0ICogaXNfbW9kOiBpcyB0aGUgdXNlciBhIG1vZGVyYXRvclxuXHQgKiB0aXBwZWRfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBibHVl4oCdP1xuXHQgKiB0aXBwZWRfYWxvdF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxwdXJwbGXigJ0/XG5cdCAqIHRpcHBlZF90b25zX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgcHVycGxl4oCdP1xuXHQgKiBnZW5kZXI6IOKAnG3igJ0gKG1hbGUpLCDigJxm4oCdIChmZW1hbGUpLCDigJxz4oCdICh0cmFucyksIG9yIOKAnGPigJ0gKGNvdXBsZSlcblx0ICovXG5cdG9uRW50ZXIodXNlcikgeyByZXR1cm47IH1cblxuXHQvKipcblx0ICogW29uTGVhdmUgZGVzY3JpcHRpb25dXG5cdCAqIEBwYXJhbSAge29iamVjdH0gdXNlciBJbmZvIHJlbGF0ZWQgdG8gdGhlIHVzZXIgd2hvIGxlYXZlcyB0aGUgcm9vbS5cblx0ICogQHJldHVybiB7W3R5cGVdfSAgICAgIFtkZXNjcmlwdGlvbl1cblx0ICogXG5cdCAqIHVzZXI6IHVzZXIgd2hvIGxlZnQgdGhlIHJvb21cblx0ICogaW5fZmFuY2x1YjogaXMgdGhlIHVzZXIgaW4gdGhlIGJyb2FkY2FzdGVy4oCZcyBmYW4gY2x1YlxuXHQgKiBoYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBpc19tb2Q6IGlzIHRoZSB1c2VyIGEgbW9kZXJhdG9yXG5cdCAqIHRpcHBlZF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIGJsdWXigJ0/XG5cdCAqIHRpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogdGlwcGVkX3RvbnNfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBwdXJwbGXigJ0/XG5cdCAqIGdlbmRlcjog4oCcbeKAnSAobWFsZSksIOKAnGbigJ0gKGZlbWFsZSksIOKAnHPigJ0gKHRyYW5zKSwgb3Ig4oCcY+KAnSAoY291cGxlKVxuXHQgKi9cblx0b25MZWF2ZSh1c2VyKSB7IHJldHVybjsgfVxuXG5cdC8qKlxuXHQgKiBbb25EcmF3UGFuZWwgZGVzY3JpcHRpb25dXG5cdCAqIEBwYXJhbSAge29qZWN0fSB1c2VyIEluZm8gcmVsYXRlZCB0byB0aGUgdXNlciB3aG8gZW50ZXJzIHRoZSByb29tLlxuXHQgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKlxuXHQgKiB1c2VyOiB1c2VyIHdobyBlbnRlcmVkIHRoZSByb29tXG5cdCAqIGluX2ZhbmNsdWI6IGlzIHRoZSB1c2VyIGluIHRoZSBicm9hZGNhc3RlcuKAmXMgZmFuIGNsdWJcblx0ICogaGFzX3Rva2VuczogZG9lcyB0aGUgdXNlciBoYXZlIGF0IGxlYXN0IDEgdG9rZW5cblx0ICogaXNfbW9kOiBpcyB0aGUgdXNlciBhIG1vZGVyYXRvclxuXHQgKiB0aXBwZWRfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBibHVl4oCdP1xuXHQgKiB0aXBwZWRfYWxvdF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxwdXJwbGXigJ0/XG5cdCAqIHRpcHBlZF90b25zX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgcHVycGxl4oCdP1xuXHQgKiBnZW5kZXI6IOKAnG3igJ0gKG1hbGUpLCDigJxm4oCdIChmZW1hbGUpLCDigJxz4oCdICh0cmFucyksIG9yIOKAnGPigJ0gKGNvdXBsZSlcblx0ICovXG5cdG9uRHJhd1BhbmVsKHVzZXIpIHsgcmV0dXJuOyB9XG5cblx0Ly8vLy8vLy8vLy9cblx0Ly8gdXRpbHMgLy9cblx0Ly8vLy8vLy8vLy9cblxuXG5cdHBhcnNlTWVzc2FnZUZvckNvbW1hbmRzKGNiTWVzc2FnZSkge1xuXHRcdGNvbnN0IGNvbW1hbmQgPSB0aGlzLmdldENvbW1hbmQoY2JNZXNzYWdlLm0pO1xuXG5cdFx0aWYgKGNvbW1hbmQpIHtcblx0XHRcdCh0aGlzLmlzUnVubmluZygpIHx8IHRoaXMuaXNDb3JlQ29tbWFuZChjb21tYW5kLm9wdGlvbnNbMF0pKSAmJiAodHlwZW9mIHRoaXMucHJvY2Vzc0NvbW1hbmQgPT0gJ2Z1bmN0aW9uJykgJiYgdGhpcy5wcm9jZXNzQ29tbWFuZChjb21tYW5kLm9wdGlvbnMsIGNiTWVzc2FnZSk7XG5cdFx0XHQvLyBUT0RPOiBzaG9sZCBnaXZlIGZlZWRiYWNrP1xuXHRcdFx0Y2JNZXNzYWdlWydYLVNwYW0nXSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBjYk1lc3NhZ2U7XG5cdH1cblxuXHRnZXRDb21tYW5kKG1lc3NhZ2VUZXh0KSB7XG5cdFx0Y29uc3QgbWVzc2FnZUFycmF5ID0gbWVzc2FnZVRleHQudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG5cdFx0aWYgKHRoaXMuYWxpYXMgJiYgdGhpcy5hbGlhcy5pbmNsdWRlcyhtZXNzYWdlQXJyYXlbMF0pKSB7XG5cdFx0XHQvLyByZXR1cm5zIGEgZGF0YSBvYmplY3Qgd2l0aCBjb21tYW5kIGFuZCBvcHRpb25zXG5cdFx0XHRyZXR1cm4ge2NvbW1hbmQgOiBtZXNzYWdlQXJyYXlbMF0sIG9wdGlvbnMgOiBtZXNzYWdlQXJyYXkuc2xpY2UoMSl9O1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjaGVja1Blcm1pc3Npb24oYWN0aW9uLCBjYk1lc3NhZ2UpIHtcblx0XHRyZXR1cm4gLyogdGhpcy5jaGVja09wdGlvbignKicsIGNiTWVzc2FnZSkgfHwgKi8gKFxuXHRcdFx0dGhpcy5wZXJtaXNzaW9uc1thY3Rpb25dICYmIFxuXHQgICAgICAgXHRcdChjYk1lc3NhZ2UuaXNfbW9kICYmIHRoaXMucGVybWlzc2lvbnNbYWN0aW9uXSAmJiB0aGlzLnBlcm1pc3Npb25zW2FjdGlvbl0uaW5kZXhPZignbScpID49IDApIHx8IC8vIGlmIG1vZCBpcyBhbGxvd2VkXG5cdFx0ICAgICAgIFx0KGNiTWVzc2FnZS51c2VyID09IHRoaXMuY2Iucm9vbV9zbHVnICYmIHRoaXMucGVybWlzc2lvbnNbYWN0aW9uXS5pbmRleE9mKCdiJykgPj0gMCkgfHwgLy8gb3IgYnJvYWRjYXN0ZXIgaXMgYWxsb3dlZFxuXHRcdCAgICAgICBcdCh0aGlzLnBlcm1pc3Npb25zW2FjdGlvbl0uaW5kZXhPZignYScpID49IDApIC8vIG9yIGV2ZXJ5b25lIGlzIGFsbG93ZWRcblx0XHQpOyBcblx0fVxuXG5cdGdldFNldHRpbmdzQ2hvaWNlcygpIHsgXG5cdFx0cmV0dXJuIFtdOyBcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBDb25maWcgICAgICAgICAgIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cblx0cmVhZENvbmZpZyhjYikge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0ge307XG5cdFx0XG5cdFx0aWYgKHR5cGVvZiB0aGlzLmdldFNldHRpbmdzQ2hvaWNlcyAgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dGhpcy5nZXRTZXR0aW5nc0Nob2ljZXMoKS5tYXAoaXRlbSA9PiB7XG5cdFx0XHRcdHJldHVybiBpdGVtLm5hbWU7XG5cdFx0XHR9KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3Nba2V5XSA9IGNiLnNldHRpbmdzW2tleV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuXG4vLyBjb25zdCBjb25maWcgPSB7XG4vLyBcdGRlc2NyaXB0aW9uOiAnJyxcbi8vIFx0aGVscCA6IFtcbi8vIFx0XHR7XG4vLyBcdFx0XHRhY2Nlc3M6JycsXG4vLyBcdFx0XHR0ZXh0OicnLFxuLy8gXHRcdH1cbi8vIFx0XVxuLy8gfSIsImV4cG9ydCBjbGFzcyBCb3RNYW5hZ2VyIHtcblx0Y29uc3RydWN0b3IoY2IpIHtcblx0XHRcdHRoaXMuY2IgICAgICAgICAgICAgICAgICA9IGNiO1xuXHRcdFx0dGhpcy5ib3RzICAgICAgICAgICAgICAgID0gW107XG5cdFx0XHR0aGlzLnNldHRpbmdzX2Nob2ljZXMgICAgPSBbXTtcblx0XHRcdHRoaXMuc3RhcnQgICAgICAgICAgICAgICA9IERhdGUubm93KCk7XG5cblx0XHR0aGlzLmNiLm9uTWVzc2FnZSgobWVzc2FnZSkgPT4ge1xuXHRcdFx0dGhpcy5vbk1lc3NhZ2UobWVzc2FnZSk7XG5cdFx0fSk7XG5cdFx0dGhpcy5jYi5vblRpcCgodGlwKSA9PiB7XG5cdFx0XHR0aGlzLm9uVGlwKHRpcCk7XG5cdFx0fSk7XG5cdFx0dGhpcy5jYi5vbkVudGVyKCh1c2VyKSA9PiB7XG5cdFx0XHR0aGlzLm9uRW50ZXIodXNlcik7XG5cdFx0fSk7XG5cdFx0dGhpcy5jYi5vbkxlYXZlKCh1c2VyKSA9PiB7XG5cdFx0XHR0aGlzLm9uTGVhdmUodXNlcik7XG5cdFx0fSk7XG5cdFx0dGhpcy5jYi5vbkRyYXdQYW5lbCgodXNlcikgPT4ge1xuXHRcdFx0dGhpcy5vbkRyYXdQYW5lbCh1c2VyKTtcblx0XHR9KTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gYm90IGxpc3QgbWFuYWdlbWVudCAvL1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Z2V0U2V0dGluZ3NDaG9pY2VzKCkge1xuXHRcdHJldHVybiB0aGlzLmJvdHMucmVkdWNlKChyZXN1bHQsIGJvdCkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBib3QuYm90LmdldFNldHRpbmdzQ2hvaWNlcyA9PSAnZnVuY3Rpb24nKXtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdC5jb25jYXQoYm90LmJvdC5nZXRTZXR0aW5nc0Nob2ljZXMoKSk7IFxuXHRcdFx0fVxuXHRcdH0sW10pO1xuXHRcdC8vIHRoaXMuY2IubG9nKHJlc3VsdCk7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIGJvdCBsaXN0IG1hbmFnZW1lbnQgLy9cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdGFkZChpZCwgYm90KSB7IFxuXHRcdHRoaXMuYm90cy5wdXNoKHtpZCwgYm90fSk7XG5cdH1cblxuXHRnZXQoaWQpIHtcblx0XHRyZXR1cm4gdGhpcy5ib3RzLmZpbmQoKGl0ZW0pID0+IHtcblx0XHRcdHJldHVybiBpdGVtLmlkID09IGlkO1xuXHRcdH0pWydib3QnXTtcblx0fVxuXG5cdHJlbW92ZShpZCkge1xuXHRcdHRoaXMuYm90cy5zcGxpY2UodGhpcy5ib3RzLmZpbmRJbmRleCgoaXRlbSk9Pntcblx0XHRcdHJldHVybiBpdGVtLmlkID09IGlkO1xuXHRcdH0pLDEpO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vXG5cdC8vIGV2ZW50cyAvL1xuXHQvLy8vLy8vLy8vLy9cblxuXHRvbk1lc3NhZ2UobWVzc2FnZSkge1xuXHRcdHRoaXMuYm90cy5mb3JFYWNoKChib3QpID0+IHtcblx0XHRcdCh0eXBlb2YgYm90LmJvdC5vbk1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJykgJiYgYm90LmJvdC5vbk1lc3NhZ2UobWVzc2FnZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRvblRpcCh0aXApIHtcblx0XHR0aGlzLmJvdHMuZm9yRWFjaCgoYm90KSA9PiB7XG5cdFx0XHRib3QuYm90LmlzUnVubmluZygpICYmICh0eXBlb2YgYm90LmJvdC5vblRpcCA9PSAnZnVuY3Rpb24nKSAmJiBib3QuYm90Lm9uVGlwKHRpcCk7XG5cdFx0fSk7XG5cdH1cblxuXHRvbkVudGVyKHVzZXIpIHtcblx0XHR0aGlzLmJvdHMuZm9yRWFjaCgoYm90KSA9PiB7XG5cdFx0XHRib3QuYm90LmlzUnVubmluZygpICYmICh0eXBlb2YgYm90LmJvdC5vbkVudGVyID09ICdmdW5jdGlvbicpICYmIGJvdC5ib3Qub25FbnRlcih1c2VyKTtcblx0XHR9KTtcblx0fVxuXG5cdG9uTGVhdmUodXNlcikge1xuXHRcdHRoaXMuYm90cy5mb3JFYWNoKChib3QpID0+IHtcblx0XHRcdGJvdC5ib3QuaXNSdW5uaW5nKCkgJiYgKHR5cGVvZiBib3QuYm90Lm9uTGVhdmUgPT0gJ2Z1bmN0aW9uJykgJiYgYm90LmJvdC5vbkxlYXZlKHVzZXIpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25EcmF3UGFuZWwodXNlcikge1xuXHRcdHRoaXMuYm90cy5mb3JFYWNoKChib3QpID0+IHtcblx0XHRcdGJvdC5ib3QuaXNSdW5uaW5nKCkgJiYgKHR5cGVvZiBib3QuYm90Lm9uRHJhd1BhbmVsID09ICdmdW5jdGlvbicpICYmIGJvdC5ib3Qub25EcmF3UGFuZWwodXNlcik7XG5cdFx0fSk7XG5cdH1cblxuXHRsb2codmFsdWUpIHtcblx0XHRpZih0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpXG5cdFx0XHR0aGlzLmNiLnNlbmROb3RpY2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpLCB0aGlzLmNiLnJvb21fc2x1ZywgJycsICdyZWQnLCAnbm9ybWFsJyk7XG5cdH1cblxufSIsImV4cG9ydCBjb25zdCBzdGF0dXMgPSB7XG5cdFNUT1BQRUQ6IC0xLFxuXHRQQVVTRUQ6IDAsXG5cdFJVTk5JTkc6IDEsXG59XG5leHBvcnQgY29uc3QgZm9ybWF0ID0ge1xuXHRMSVNUOiAwLFxuXHRST1cgOiAxLFxufTsiLCJpbXBvcnQge3VuaWNvZGVDaGFyc30gZnJvbSAnLi92YWx1ZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgRWNobyB7XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIGZvcm1hdCBtZXNzYWdlcyAvL1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XG5cdHN0YXRpYyBmb3JtYXRMaW5lcyh0ZXh0LCBsZW5ndGg9MTApIHtcblx0XHRyZXR1cm4gYCR7dW5pY29kZUNoYXJzLnRvcExlZnRDb3JuZXJ9JHtFY2hvLnJlcGVhdCh1bmljb2RlQ2hhcnMuZGFzaENoYXIsIGxlbmd0aCl9XG5cdFx0ICAgICAgICAke3VuaWNvZGVDaGFycy52ZXJ0RGFzaH0gJHt0ZXh0fVxuXHRcdCAgICAgICAgJHt1bmljb2RlQ2hhcnMuYm90dG9tTGVmdENvcm5lcn0ke0VjaG8ucmVwZWF0KHVuaWNvZGVDaGFycy5kYXNoQ2hhciwgbGVuZ3RoKX1gO1xuXHR9XG5cblx0c3RhdGljIGZvcm1hdEJyYWNrZXQodGV4dCwgY2hhcikge1xuXHRcdHJldHVybiBgJHtFY2hvLnJlcGVhdChjaGFyLDQpfVxuXHRcdCAgICAgICAgJHtFY2hvLmZvcm1hdFByZWZpeChjaGFyKX1cblx0XHQgICAgICAgICR7RWNoby5yZXBlYXQoY2hhciw0KX1gO1xuXHR9XG5cblx0c3RhdGljIGZvcm1hdFByZWZpeCh0ZXh0LCBjaGFyKSB7XG5cdFx0bGV0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cdFx0cmV0dXJuIGxpbmVzLm1hcChsaW5lID0+IGAke2NoYXJ9ICR7bGluZX1gKS5qb2luKCdcXG4nKTtcblx0fVxuXG5cdHN0YXRpYyByZXBlYXQoY2hhciwgdGltZXMpIHtcblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cdFx0d2hpbGUodGltZXMtLSkgcmVzdWx0ICs9IGNoYXI7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBzZW5kIG5vdGljZXMgLy9cblx0Ly8vLy8vLy8vLy8vLy8vLy8vXG5cblx0c3RhdGljIHNlbmQoe2dyb3VwPScnLCB1c2VyID0gJycsIGludmVyc2UgPSBmYWxzZSwgY29sb3IsIGJhY2tncm91bmQsIHRleHQsIGNifSkge1xuXHRcdGludmVyc2UgJiYgKFtiYWNrZ3JvdW5kLCBjb2xvcl0gPSBbY29sb3IsIGJhY2tncm91bmRdKTtcblx0XHRjYi5zZW5kTm90aWNlKHRleHQsIHVzZXIsIGJhY2tncm91bmQsIGNvbG9yLCAnbm9ybWFsJywgZ3JvdXApO1xuXHR9XG5cblx0c3RhdGljIHNlbmRCb2xkKHtncm91cD0nJywgdXNlciA9ICcnLCBpbnZlcnNlID0gZmFsc2UsIGNvbG9yLCBiYWNrZ3JvdW5kLCB0ZXh0LCBjYn0pIHtcblx0XHRpbnZlcnNlICYmIChbYmFja2dyb3VuZCwgY29sb3JdID0gW2NvbG9yLCBiYWNrZ3JvdW5kXSk7XG5cdFx0Y2Iuc2VuZE5vdGljZSh0ZXh0LCB1c2VyLCBiYWNrZ3JvdW5kLCBjb2xvciwgJ2JvbGQnLCBncm91cCk7XG5cdH1cblxuXHRzdGF0aWMgc2VuZENvbW1hbmRGZWVkYmFjayh7dXNlciA9ICcnLCAgY29sb3I9J2JsYWNrJywgYmFja2dyb3VuZD0nJywgdGV4dCwgY2J9KSB7XG5cdFx0Y2Iuc2VuZE5vdGljZSh0ZXh0LCB1c2VyLCBiYWNrZ3JvdW5kLCBjb2xvciwgJ25vcm1hbCcpO1xuXHR9XG59IiwiaW1wb3J0IHtCb3R9ICBmcm9tIFwiLi9ib3QuanNcIjtcbmltcG9ydCB7RWNob30gIGZyb20gXCIuL2VjaG8uanNcIjtcbmltcG9ydCB7YmxhY2tMaXN0fSBmcm9tICcuL2JsYWNrX2xpc3QuanMnO1xuXG5leHBvcnQgY2xhc3MgS2VyYmVyb3MgZXh0ZW5kcyBCb3Qge1xuXHRuYW1lICAgICAgICAgICAgPSAnU1BBTS9hYnVzZSBmaWx0ZXIgYm90Jztcblx0ZGVzY3JpcHRpb24gICAgID0gJ0EgYm90IGZvciBoYW5kbGluZyBpbnN1bHRzLCBhYnVzaXZlIGxhbmd1YWdlLCBTUEFNJztcblx0YWxpYXMgICAgICAgICAgID0gWycha2VyJywnL2tlciddO1xuXHRwZXJtaXNzaW9ucyAgICAgPSB7XG5cdFx0J2FkZC11c2VyJzonYm0nLCBcblx0XHQnYWRkLXRleHQnOidibSdcblx0fTtcblxuICAgIGZvcmVncm91bmRDb2xvciA9ICcjZmZmZmZmJztcblx0YmFja2dyb3VuZENvbG9yID0gJyM5OTAwZmYnO1xuXHRcblx0Y29uc3RydWN0b3IoYXBwLCBjYikge1xuXHRcdHN1cGVyKGFwcCwgY2IpO1xuXHRcdHRoaXMudXNlcnMgICAgID0gdGhpcy5wYXJzZUJsYWNrbGlzdChibGFja0xpc3QudXNlcnMpO1xuXHRcdHRoaXMuYmxhY2tsaXN0ID0gdGhpcy5wYXJzZUJsYWNrbGlzdChibGFja0xpc3QuYmxhY2tMaXN0KTtcblx0fVxuXG5cdG9uTWVzc2FnZShtZXNzYWdlKSB7XG5cdFx0dGhpcy5wYXJzZU1lc3NhZ2VGb3JDb21tYW5kcyhtZXNzYWdlKTtcblx0XHRpZiAoIW1lc3NhZ2VbJ1gtU3BhbSddICYmICF0aGlzLmlzQ2xlYW4obWVzc2FnZS5tKSkge1xuXHRcdFx0aWYgKHRoaXMudXNlcnMuaW5jbHVkZXMobWVzc2FnZS51c2VyLnRvTG93ZXJDYXNlKCkpKSB7XG5cdFx0XHRcdG1lc3NhZ2VbJ1gtU3BhbSddID0gdHJ1ZTtcdFxuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5pc1ByaXZpbGVnZWQobWVzc2FnZSkpIHtcblx0XHRcdFx0dGhpcy5ub3RpZnlBYnVzZShtZXNzYWdlLm0sIG1lc3NhZ2UudXNlcik7XG5cdFx0XHRcdG1lc3NhZ2VbJ1gtU3BhbSddID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdH1cblxuXHRpc1ByaXZpbGVnZWQobWVzc2FnZSkge1xuXHRcdHJldHVybiB0aGlzLmNiLnJvb21fc2x1ZyA9PSBtZXNzYWdlLnVzZXIgfHwgbWVzc2FnZS5pc19tb2Q7IFxuXHR9XG5cblx0aXNDbGVhbih0ZXh0KSB7XG5cdFx0cmV0dXJuICF0aGlzLmJsYWNrbGlzdGVkKHRleHQudG9Mb3dlckNhc2UoKSk7XG5cdH1cblxuXHRwcm9jZXNzQ29tbWFuZChvcHRpb25zLCBtZXNzYWdlKSB7XG5cdFx0aWYgKCF0aGlzLmNoZWNrUGVybWlzc2lvbihvcHRpb25zWzBdLCBtZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBhZGQtdXNlclxuXHRcdGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1swXSA9PSAnYWRkLXVzZXInKSB7XG5cdFx0XHRvcHRpb25zLnNsaWNlKDEpLmZvckVhY2goKHVzZXIpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLnVzZXJzLmluY2x1ZGVzKHVzZXIpKXtcblx0XHRcdFx0XHR0aGlzLnVzZXJzLnB1c2godXNlcik7XG5cdFx0XHRcdFx0RWNoby5zZW5kKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQ6IGB1c2VyICR7dXNlcn0gaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGJsYWNrbGlzdGAsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG5cdFx0XHRcdH0gXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gYWRkLXRleHRcblx0XHRpZiAob3B0aW9ucy5sZW5ndGggPiAxICYmIG9wdGlvbnNbMF0gPT0gJ2FkZC10ZXh0Jykge1xuXHRcdFx0Y29uc3Qgc3RhcnQgPSBtZXNzYWdlLm0uaW5kZXhPZignYWRkLXRleHQnKSArICdhZGQtdGV4dCcubGVuZ3RoLFxuXHRcdFx0ICAgICAgdGV4dCAgPSBtZXNzYWdlLm0uc2xpY2Uoc3RhcnQpLnRyaW0oKTtcblx0XHRcdGlmICghdGhpcy5ibGFja2xpc3QuaW5jbHVkZXModGV4dCkpe1xuXHRcdFx0XHR0aGlzLmJsYWNrbGlzdC5wdXNoKHRoaXMucGFyc2UodGV4dCkpO1xuXHRcdFx0XHRFY2hvLnNlbmQoe3VzZXI6IG1lc3NhZ2UudXNlciwgdGV4dDogYCR7dGV4dH0gaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGJsYWNrbGlzdGAsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YmxhY2tsaXN0ZWQodGV4dCkge1xuXHRcdHJldHVybiB0aGlzLmJsYWNrbGlzdC5zb21lKGVsZW1lbnQgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKVxuXHRcdFx0XHRyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGVsZW1lbnQpO1xuXHRcdFx0aWYgKHR5cGVvZiBlbGVtZW50ID09ICdvYmplY3QnKXtcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQudGVzdCh0ZXh0LnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyB0aGUgYmxhY2sgbGlzdCBmcm9tIHRoZSBvYmplY3QgcHJvdmlkZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IGJsYWNrbGlzdCBUaGUgYmxhY2tsaXN0IHdpdGggc3RyaW5ncyBhbmQgcmVnZXhwc1xuXHQgKi9cblx0cGFyc2VCbGFja2xpc3QoYmxhY2tsaXN0KSB7XG5cdFx0cmV0dXJuIGJsYWNrbGlzdC5tYXAoaXRlbSA9PiB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZShpdGVtKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgdGV4dC9yZWdyZXhwIHRvIHRoZSBibGFja2xpc3Rcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byBiZSBwYXJzZWRcblx0ICovXG5cdHBhcnNlKHRleHQpe1xuXHRcdGlmICgvXlxcLy4qXFwvJC8udGVzdCh0ZXh0KSkge1xuXHRcdFx0cmV0dXJuIG5ldyBSZWdFeHAodGV4dC5zbGljZSgxLC0xKSk7XG5cdFx0fVxuXHRcdHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7XG5cdH1cblxuXHRub3RpZnlBYnVzZShtZXNzYWdlLCB1c2VyKSB7XG5cdFx0Y29uc3QgY2IgPSB0aGlzLmNiLFxuXHRcdFx0ICB0ZXh0ID0gYE1lc3NhZ2UgJyR7bWVzc2FnZX0nIFxcbmZyb20gJHt1c2VyfSBcXG5oYXMgYmVlbiBzaWxlbmNlZCBieSBrZXJiZXJvcy5gO1xuXG5cdFx0RWNoby5zZW5kKHtncm91cDoncmVkJywgdGV4dCwgY29sb3I6IHRoaXMuZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kOiB0aGlzLmJhY2tncm91bmRDb2xvciwgY2J9KTtcblx0XHRFY2hvLnNlbmQoe3VzZXI6IHRoaXMuY2Iucm9vbV9zbHVnLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYn0pO1xuXHR9XG59IiwiaW1wb3J0ICB7Qm90fSBmcm9tIFwiLi9ib3QuanNcIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NlbmdlciBleHRlbmRzIEJvdCB7XG4gICAgbmFtZSA9ICdNZXNzZW5nZXIgYm90JztcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKXtcblx0XHRzdXBlcihhcHAsY2IpO1xuXHR9XHRcblxuXHRvbk1lc3NhZ2UobXNnKSB7XG5cdFx0Y29uc3QgdGlwU3VtID0gdGhpcy5hcHAuZ2V0KCd0aXBwZXInKS5zdGF0cy5zdW1Gcm9tVXNlcihtc2cudXNlciksXG4gICAgICAgICAgICAgIHByZWZpeCA9IHRpcFN1bSA+IDAgPyBgWyR7dGlwU3VtfV0gYDonJztcbiAgICAgICAgbXNnLm0gPSBgJHtwcmVmaXh9JHttc2cubX1gO1xuXHR9XG59IiwiaW1wb3J0IHtCb3R9ICBmcm9tICcuL2JvdC5qcyc7XG5pbXBvcnQge0VjaG99IGZyb20gXCIuL2VjaG8uanNcIjtcblxuZXhwb3J0IGNsYXNzIE11bHRpR29hbCBleHRlbmRzIEJvdHtcbiAgICBuYW1lICAgICAgICAgICAgPSAnTXVsdGkgZ29hbCBib3QnO1xuICAgIGRlc2NyaXB0aW9uICAgICA9ICdBIGJvdCBmb3IgbWFuYWdpbmcgbXVsdGkgZ29hbHMnO1xuICAgIGFsaWFzICAgICAgICAgICA9IFsnIWdvYWwnLCcvZ29hbCddO1xuICAgIHBlcm1pc3Npb25zICAgICA9IHsnc2V0JzogJ2JtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ2FkZCc6ICdibScsXG4gICAgICAgICAgICAgICAgICAgICAgICdkZWwnOiAnYm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAnY2xlYXInOiAnYm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAnc3RvcCc6ICdiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3J1bicgOiAnYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdwYXVzZSc6J2InXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgc2V0dGluZ3NJbnB1dEZpZWxkcyA9IDU7XG4gICAgZm9yZWdyb3VuZENvbG9yID0gJyNmZmZmZmYnO1xuICAgIGJhY2tncm91bmRDb2xvciA9ICcjZmYwMGNjJztcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG4gICAgICAgIHN1cGVyKGFwcCwgY2IpO1xuICAgICAgICB0aGlzLnN1YmplY3RNYW5hZ2VyID0gdGhpcy5hcHAuZ2V0KCdyb29tU3ViamVjdCcpO1xuXG4gICAgICAgIHRoaXMuaW5pdCh7dXNlcjogY2Iucm9vbV9zbHVnfSk7XG4gICAgfVxuXG5cdGluaXQoZGF0YSkge1xuXHRcdHRoaXMucmVhZENvbmZpZyh0aGlzLmNiKTtcblx0XHQoKHRoaXMuc2V0dGluZ3MubXVsdGlHb2FsQm90RW5hYmxlZCA9PSAneWVzJykgJiYgdGhpcy5ydW4oZGF0YSkpIHx8IHRoaXMuc3RvcChkYXRhKTtcblx0fVxuXG4gICAgb25TdG9wKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGAqKiAke3RoaXMubmFtZX0gc3RhdHVzOiBTVE9QUEVEICoqYDtcbiAgICAgICAgRWNoby5zZW5kQ29tbWFuZEZlZWRiYWNrKHt1c2VyOiBkYXRhLnVzZXIsIHRleHQsIGNvbG9yOiAncmVkJywgYmFja2dyb3VuZDond2hpdGUnLCBjYjogdGhpcy5jYn0pO1xuICAgIH1cblxuICAgIG9uUnVuKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGAqKiAke3RoaXMubmFtZX0gc3RhdHVzOiBSVU5OSU5HICoqYDtcbiAgICAgICAgRWNoby5zZW5kQ29tbWFuZEZlZWRiYWNrKHt1c2VyOiBkYXRhLnVzZXIsIHRleHQsIGNvbG9yOiAnZ3JlZW4nLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgfVxuXG4gICAgb25QYXVzZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgKiogJHt0aGlzLm5hbWV9IHN0YXR1czogUEFVU0VEICoqYDtcbiAgICAgICAgRWNoby5zZW5kQ29tbWFuZEZlZWRiYWNrKHt1c2VyOiBkYXRhLnVzZXIsIHRleHQsIGNvbG9yOiAnb3JhbmdlJywgYmFja2dyb3VuZDond2hpdGUnLCBjYjogdGhpcy5jYn0pO1xuICAgIH1cbiAgICBcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQ29uZmlnICAgICAgICAgICAvL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBcbiAgICBnZXRTZXR0aW5nc0Nob2ljZXMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgOiBcIm11bHRpR29hbEJvdEVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBcIiMjIyMjIyMjIyMjIE1VTFRJLUdPQUwgQk9UICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgXCIsXG4gICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgIDogXCJjaG9pY2VcIixcbiAgICAgICAgICAgICAgICBjaG9pY2UxICAgICAgICAgOiBcInllc1wiLFxuICAgICAgICAgICAgICAgIGNob2ljZTIgICAgICAgICA6IFwibm9cIixcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgICAgOiBcInllc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkICAgICAgICA6IHRydWUsXG4gICAgICAgICAgICB9LCAgICBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgOiBcIm11bHRpR29hbEJvdExvb3BcIixcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBcIkxvb3AgYWZ0ZXIgbGFzdCBnb2FsIGlzIHJlYWNoZWQ/IFwiLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6IFwiY2hvaWNlXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlMSAgICAgICAgIDogXCJ5ZXNcIixcbiAgICAgICAgICAgICAgICBjaG9pY2UyICAgICAgICAgOiBcIm5vXCIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlICAgIDogXCJ5ZXNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiB0cnVlLFxuICAgICAgICAgICAgfSwgICAgXG5cdFx0XVxuXHRcdFxuXHRcdGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnNldHRpbmdzSW5wdXRGaWVsZHM7IGkrKykge1xuXHRcdFx0cmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICA6IGBnb2FsJHtpfWAsXG4gICAgICAgICAgICAgICAgbGFiZWwgICAgICAgICAgIDogYEdvYWwgJHtpfSAoZm9ybWF0OiBhbW91bnR8ZGVzY3JpcHRpb24pYCxcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgOiBcInN0clwiLFxuICAgICAgICAgICAgICAgIG1pbkxlbmd0aCAgICAgICA6IDUsXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoICAgICAgIDogMjU1LFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6IFwiXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIDogZmFsc2UsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcbiAgICB9XG4gICAgXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEludGVyZmFjZSBtZXRob2RzIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIFxuXG4gICAgcHJvY2Vzc0NvbW1hbmQob3B0aW9ucywgbWVzc2FnZSkge1xuXG4gICAgICAgIGlmICghdGhpcy5jaGVja1Blcm1pc3Npb24ob3B0aW9uc1swXSwgbWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9zdG9wXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3N0b3AnKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3Aoe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9ydW5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncnVuJykge1xuICAgICAgICAgICAgdGhpcy5ydW4oe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9wYXVzZVxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdwYXVzZScpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2Uoe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbn0iLCJpbXBvcnQge0JvdH0gICAgICAgICAgZnJvbSAnLi9ib3QuanMnO1xuaW1wb3J0IHtUaGFua3NNYW5hZ2VyfSBmcm9tIFwiLi90aGFua3NfbWFuYWdlci5qc1wiO1xuaW1wb3J0IHtFY2hvfSAgICAgICAgZnJvbSBcIi4vZWNoby5qc1wiO1xuXG4vKipcbiAqIE5vdGlmaWVyLlxuICovXG5leHBvcnQgY2xhc3MgTm90aWZpZXIgZXh0ZW5kcyBCb3Qge1xuXHRuYW1lICAgICAgICAgICAgPSAnTm90aWZpZXIgYm90Jztcblx0ZGVzY3JpcHRpb24gICAgID0gJ0EgYm90IGZvciBoYW5kbGluZyBub3RpZmljYXRpb25zJztcblx0YWxpYXMgICAgICAgICAgID0gWychbm90JywnL25vdCddO1xuXHRwZXJtaXNzaW9ucyAgICAgPSB7XG5cdFx0JyonOiAnYm0nXG5cdH07XG5cdHRleHQgICAgICAgICAgICA9ICcnO1xuXHRcblx0Y29uc3RydWN0b3IoYXBwLCBjYiwgc2V0dGluZ3MgPSB7fSkge1xuXHRcdHN1cGVyKGFwcCwgY2IpO1xuXHRcdHNldHRpbmdzLmNvbG9yICAgICAgICAgICB8fCAodGhpcy5jb2xvciA9IHNldHRpbmdzLmNvbG9yKTtcblx0XHRzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3IgfHwgKHRoaXMuYmFja2dyb3VuZENvbG9yID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yKTtcblx0fVxuXG5cdHByb2Nlc3NDb21tYW5kKG9wdGlvbnMsIGNiTWVzc2FnZSkge1xuXHRcdGlmICghdGhpcy5jaGVja1Blcm1pc3Npb24ob3B0aW9uc1swXSwgY2JNZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHR0aGlzLnRleHQgPSBvcHRpb25zLmpvaW4oJyAnKTtcblx0XHR0aGlzLnRleHQgPSBFY2hvLmZvcm1hdExpbmVzKHRoaXMudGV4dCk7XG5cdFx0RWNoby5zZW5kKHtjYjp0aGlzLmNiLCB0ZXh0OiB0aGlzLnRleHR9KTtcblx0fVxuXG5cdG9uRW50ZXIodXNlcikge1xuXHRcdEVjaG8uc2VuZCh7Y2I6dGhpcy5jYiwgdXNlcjp1c2VyLnVzZXIsIHRleHQ6IGBoZWxsbyAke3VzZXIudXNlcn0hYH0pO1xuXHR9XG59IiwiaW1wb3J0IHtCb3R9ICBmcm9tICcuL2JvdC5qcyc7XG5pbXBvcnQge0VjaG99IGZyb20gXCIuL2VjaG8uanNcIjtcblxuZXhwb3J0IGNsYXNzIFJvb21TdWJqZWN0IGV4dGVuZHMgQm90e1xuICAgIG5hbWUgICAgICAgICAgICA9ICdSb29tIHN1YmplY3QgYm90JztcbiAgICBkZXNjcmlwdGlvbiAgICAgPSAnQSBib3QgZm9yIG1hbmFnaW5nIHRoZSByb29tIHN1amVjdCc7XG4gICAgYWxpYXMgICAgICAgICAgID0gWychc3ViamVjdCcsJy9zdWJqZWN0J107XG4gICAgcGVybWlzc2lvbnMgICAgID0geydzZXQnOiAnYm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAnYWRkJzogJ2JtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ2RlbCc6ICdibScsXG4gICAgICAgICAgICAgICAgICAgICAgICdjbGVhcic6ICdibScsXG4gICAgICAgICAgICAgICAgICAgICAgICdzdG9wJzogJ2InLFxuICAgICAgICAgICAgICAgICAgICAgICAncnVuJyA6ICdiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3BhdXNlJzonYidcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICBzdWJqZWN0ICAgICAgICAgPSBcIldlbGNvbWUgdG8gbXkgc2hvdyFcIjtcbiAgICB0YWdzICAgICAgICAgICAgPSBbJ2xhdGluYScsICdmaXQnLCAnbXVzY2xlcycsICdzdHJvbmcnLCAnYWJzJywgJ2JpY2VwcycsICd0aGlnaHMnLCAnbHVzaCcsICdkb21pJywgJ2xvdmVuc2UnLCAndHdlcmsnLCAnYXNzJywgJ2FuYWwnLCAnc2hhdmVkJywgJ3JlZGhhaXInLCAndGF0dG9vcycsICdzcXVpcnQnLCAnc3BhbmtpbmcnLCAnYnV0dHBsdWcnLCAnc3dlZXQnLCAnZnJpZW5kbHknLCAnZGFuY2UnXTtcbiAgICBzdWZpeGVzICAgICAgICAgPSB7fTtcbiAgICBmb3JlZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZic7XG4gICAgYmFja2dyb3VuZENvbG9yID0gJyNmZjAwY2MnO1xuXG5cdGNvbnN0cnVjdG9yKGFwcCwgY2IpIHtcbiAgICAgICAgc3VwZXIoYXBwLCBjYik7XG4gICAgICAgIHRoaXMudXBkYXRlUm9vbVN1YmplY3QoKTtcblxuICAgICAgICB0aGlzLmluaXQoe3VzZXI6IHRoaXMuY2Iucm9vbV9zbHVnfSk7XG4gICAgfVxuXG5cdGluaXQoZGF0YSkge1xuXHRcdHRoaXMucnVuKGRhdGEpO1xuXHR9XG5cbiAgICBvblN0b3AoZGF0YSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYCoqICR7dGhpcy5uYW1lfSBzdGF0dXM6IFNUT1BQRUQgKipgO1xuICAgICAgICBFY2hvLnNlbmRDb21tYW5kRmVlZGJhY2soe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdyZWQnLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVSb29tU3ViamVjdCgpOyAgICAgICAgXG4gICAgfVxuXG4gICAgb25SdW4oZGF0YSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYCoqICR7dGhpcy5uYW1lfSBzdGF0dXM6IFJVTk5JTkcgKipgO1xuICAgICAgICBFY2hvLnNlbmRDb21tYW5kRmVlZGJhY2soe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdncmVlbicsIGJhY2tncm91bmQ6J3doaXRlJywgY2I6IHRoaXMuY2J9KTtcbiAgICB9XG5cbiAgICBvblBhdXNlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGAqKiAke3RoaXMubmFtZX0gc3RhdHVzOiBQQVVTRUQgKipgO1xuICAgICAgICBFY2hvLnNlbmRDb21tYW5kRmVlZGJhY2soe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdvcmFuZ2UnLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgfVxuICAgIFxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBDb25maWcgICAgICAgICAgIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIFxuICAgIGdldFNldHRpbmdzQ2hvaWNlcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgOiBcInJvb21TdWJqZWN0XCIsXG4gICAgICAgICAgICAgICAgbGFiZWwgICAgICAgICAgIDogXCIjIyMjIyMjIyMjIyBST09NIFNVQkpFQ1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBcIixcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgOiBcInN0clwiLFxuICAgICAgICAgICAgICAgIG1pbkxlbmd0aCAgICAgICA6IDUsXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoICAgICAgIDogMjU1LFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6IHRoaXMuc3ViamVjdCxcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgOiBgcm9vbVRhZ3MgYCxcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBgdGFncyBgLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgbWluTGVuZ3RoICAgICAgIDogNSxcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggICAgICAgOiAyNTUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlICAgIDogdGhpcy50YWdzLmpvaW4oJywgJyksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIDogZmFsc2UsXG5cdFx0XHR9ICAgIFxuXHRcdF1cblx0XHRcbiAgICB9XG4gICAgXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEludGVyZmFjZSBtZXRob2RzIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIFxuXG4gICAgcHJvY2Vzc0NvbW1hbmQob3B0aW9ucywgbWVzc2FnZSkge1xuXG4gICAgICAgIGlmICghdGhpcy5jaGVja1Blcm1pc3Npb24ob3B0aW9uc1swXSwgbWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzdWJqZWN0XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1swXSA9PSAnc2V0Jykge1xuICAgICAgICAgICAgY29uc3Qgc3ViamVjdCA9IG9wdGlvbnMuc3BsaWNlKDEpO1xuXG4gICAgICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0Lmxlbmd0aCA+IDAgPyBzdWJqZWN0LmpvaW4oJyAnKSA6ICcnO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVSb29tU3ViamVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBhZGQgdGFncyBcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSAmJiBvcHRpb25zWzBdID09ICdhZGQnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnNwbGljZSgxKS5mb3JFYWNoKHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRhZ3MuZmluZCggdCA9PiB0LnRvTG93ZXJDYXNlKCkgPT0gdGFnLnRvTG93ZXJDYXNlKCkpKSBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJvb21TdWJqZWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWxldGUgdGFnc1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxICYmIG9wdGlvbnNbMF0gPT0gJ2RlbCcpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuc3BsaWNlKDEpLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnRhZ3MuaW5kZXhPZih0YWcpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFncy5zcGxpY2UoaW5kZXgsMSk7ICBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJvb21TdWJqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGNsZWFyIGFsbCB0YWdzXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1swXSA9PSAnY2xlYXInKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUm9vbVN1YmplY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9zdG9wXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3N0b3AnKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3Aoe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9ydW5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncnVuJykge1xuICAgICAgICAgICAgdGhpcy5ydW4oe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy9wYXVzZVxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdwYXVzZScpIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2Uoe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJldHVybnMgdGhlIGhhc2h0YWdzXG4gICAgZ2V0SGFzaHRhZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3MubWFwKCB0YWcgPT4gYCMke3RhZ31gKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0aGUgc3ViamVjdCBhbmQgdGhlIHRhZ3NcbiAgICBnZXRGdWxsU3ViamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuc3ViamVjdH0gJHt0aGlzLmdldEhhc2h0YWdzKCl9YFxuICAgIH1cblxuICAgIC8vIGFkZHMgYSBzdWZpeCB0byB0aGUgc3VmaXhlcyBvYmplY3RcbiAgICBzZXRTdWZpeChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3VmaXhlc1trZXldID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlUm9vbVN1YmplY3QoKTtcbiAgICB9XG5cbiAgICAvLyBkZWxldGVzIGEgc3VmaXggZnJvbSB0aGUgc3VmaXhlcyBvYmplY3RcbiAgICB1bnNldFN1Zml4KGtleSkge1xuICAgICAgICBkZWxldGUgdGhpcy5zdWZpeGVzW2tleV07XG4gICAgICAgIHRoaXMudXBkYXRlUm9vbVN1YmplY3QoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gdXBkYXRlcyByb29tIHN1YmplY3QgYW5kIGFwcGVuZHMgYSBnaXZlbiB0ZXh0XG4gICAgdXBkYXRlUm9vbVN1YmplY3QoKSB7XG4gICAgICAgIGNvbnN0IHN1Zml4ZXMgPSBPYmplY3Qua2V5cyh0aGlzLnN1Zml4ZXMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihrZXkgPT4gdGhpcy5zdWZpeGVzW2tleV0pLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChrZXkgPT4gdGhpcy5zdWZpeGVzW2tleV0pLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4oJyA6OiAnKTtcblxuICAgICAgICB0aGlzLmNiLmNoYW5nZVJvb21TdWJqZWN0KGAke3RoaXMuZ2V0RnVsbFN1YmplY3QoKX0ke3N1Zml4ZXMgPyAnIDo6JyArIHN1Zml4ZXMgOiAnJ31gKTtcbiAgICB9XG5cbiAgICBcbn0iLCJleHBvcnQgY2xhc3MgU3RhdHMge1xuXHRuYW1lID0gJ1N0YXRzJztcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5jYiA9IGNiO1xuXHRcdHRoaXMuaGlzdG9yeSA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIHRpcCBlbnRyeSB0byB0aGUgaGlzdG9yeS5cblx0ICogQHBhcmFtIHtvYmplY3R9IHRpcCBUaXAgZGF0YS5cblx0ICogQHJldHVybiB7b2JqZWN0fSBEYXRhIGhvbGRpbmcgdGhlIGNoYW5nZXMuXG5cdCAqL1xuXHRhZGRUaXAodGlwKSB7XG5cdFx0dGhpcy5oaXN0b3J5LnB1c2goe1xuXHRcdFx0dXNlcm5hbWU6IHRpcC5mcm9tX3VzZXIsXG5cdFx0XHRhbW91bnQgIDogdGlwLmFtb3VudCxcblx0XHRcdGZhbiAgICAgOiB0aXAuZnJvbV91c2VyX2luX2ZhbmNsdWIsXG5cdFx0XHR0aW1lICAgIDogRGF0ZS5ub3coKVxuXHRcdH0pO1xuXHR9XG5cblx0c3VtKCkge1xuXHRcdHJldHVybiB0aGlzLmhpc3RvcnkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yICsgY3VycmVudC5hbW91bnQ7XG5cdFx0fSwgMCk7XG5cdH1cblxuXHR0b2tlblJhdGUoKSB7XG5cdFx0Y29uc3QgbWludXRlcyA9IChEYXRlLm5vdygpIC0gdGhpcy5hcHAuc3RhcnQpLyg2MCoxMDAwKTtcblx0XHRyZXR1cm4gcGFyc2VGbG9hdCgodGhpcy5zdW0oKS9taW51dGVzKS50b0ZpeGVkKDIpKTtcblx0fVxuXG5cdGhpZ2hlc3RCeVVzZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5yZWR1Y2UoKGFjY3VtdWxhdG9yLGN1cnJlbnQpPT57XG5cdFx0XHRsZXQgZm91bmQgPSBhY2N1bXVsYXRvci5maW5kKGl0ZW0gPT4gaXRlbS51c2VybmFtZSA9PSBjdXJyZW50LnVzZXJuYW1lKTtcblx0XHRcdGlmKCFmb3VuZCkgeyBcblx0XHRcdFx0Zm91bmQgPSB7dXNlcm5hbWU6IGN1cnJlbnQudXNlcm5hbWUsIGFtb3VudDogMH07XG5cdFx0XHRcdGFjY3VtdWxhdG9yLnB1c2goZm91bmQpO1xuXHRcdFx0fVxuXHRcdFx0Zm91bmQuYW1vdW50ID0gTWF0aC5tYXgoZm91bmQuYW1vdW50LCBjdXJyZW50LmFtb3VudCk7XG5cdFx0XHRyZXR1cm4gYWNjdW11bGF0b3I7XG5cdFx0fSxbXSkuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0cmV0dXJuIGIuYW1vdW50IC0gYS5hbW91bnQ7XG5cdFx0fSk7XG5cdH1cblxuXHRoaWdoZXN0VGlwKCkge1xuXHRcdHJldHVybiB0aGlzLmhpZ2hlc3RCeVVzZXIoKVswXSB8fCB7dXNlcm5hbWU6ICcnLCBhbW91bnQ6MH07XG5cdH1cblxuXHRzdW1CeVVzZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5yZWR1Y2UoKGFjY3VtdWxhdG9yLGN1cnJlbnQpPT57XG5cdFx0XHRsZXQgZm91bmQgPSBhY2N1bXVsYXRvci5maW5kKGl0ZW0gPT4gaXRlbS51c2VybmFtZSA9PSBjdXJyZW50LnVzZXJuYW1lKTtcblx0XHRcdGlmKCFmb3VuZCkgeyBcblx0XHRcdFx0Zm91bmQgPSB7dXNlcm5hbWU6IGN1cnJlbnQudXNlcm5hbWUsIGFtb3VudDogMH07XG5cdFx0XHRcdGFjY3VtdWxhdG9yLnB1c2goZm91bmQpO1xuXHRcdFx0fVxuXHRcdFx0Zm91bmQuYW1vdW50ICAgKz0gY3VycmVudC5hbW91bnQ7XG5cdFx0XHRyZXR1cm4gYWNjdW11bGF0b3I7XG5cdFx0fSxbXSkuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0cmV0dXJuIGIuYW1vdW50IC0gYS5hbW91bnQ7XG5cdFx0fSk7XG5cdH1cblxuXHRiZXN0VGlwcGVyKCkge1xuXHRcdHJldHVybiB0aGlzLnN1bUJ5VXNlcigpWzBdIHx8IHt1c2VybmFtZTogJycsIGFtb3VudDowfTtcblx0fVxuXG5cdHN1bUZyb21Vc2VyKHVzZXJuYW1lKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5maWx0ZXIoaXRlbSA9PiB7XG5cdFx0XHRyZXR1cm4gdXNlcm5hbWUgPT0gaXRlbS51c2VybmFtZTtcblx0XHR9KS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gYWNjdW11bGF0b3IgKyBjdXJyZW50LmFtb3VudDtcblx0XHR9LCAwKTtcblx0fVxuXG5cdHN1bUZyb21GYW5zKCkge1xuXHRcdHJldHVybiB0aGlzLmhpc3RvcnkuZmlsdGVyKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIGl0ZW0uZmFuO1xuXHRcdH0pLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IHtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvciArIGN1cnJlbnQuYW1vdW50O1xuXHRcdH0sIDApO1xuXHR9XG5cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5yZXZlcnNlKCkubWFwKChpdGVtKSA9PiB7XG5cdFx0XHRyZXR1cm4gYCR7aXRlbS51c2VybmFtZX06ICR7aXRlbS5hbW91bnR9IHRva2VuczogJHtTdGF0cy5oclRpbWUoaXRlbS50aW1lKX1gO1xuXHRcdH0pLmpvaW4oJ1xcbicpO1xuXHR9XG5cblx0Y2xlYXJTdGF0cygpIHtcblx0XHR0aGlzLmhpc3RvcnkgPSBbXTtcblx0fVxuXG5cdHN0YXRpYyBoclRpbWUobWlsaXNlY29uZHMpIHtcblx0XHRjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxpc2Vjb25kcyAvIDEwMDApO1xuXHRcdGNvbnN0IGggPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcblx0XHRjb25zdCBtID0gTWF0aC5mbG9vcigoc2Vjb25kcyAlIDM2MDApIC8gNjApO1xuXHRcdGNvbnN0IHMgPSBzZWNvbmRzICUgNjA7IFxuXHRcdHJldHVybiAoaCA+IDAgPyBoICsgJ2hvdXInICsgKGggPiAxID8gJ3MgJyA6ICcgJykgOiAnJykgKyAocyA9PSAwICYmIG0gPiAwID8gJ2FuZCAnIDogJycpICtcbiAgICAgICAgICAgICAgIChtID4gMCA/IG0gKyAnbWludXRlJyArIChtID4gMSA/ICdzICcgOiAnICcpIDogJycpICsgKHMgPiAwICYmIGggKyBtID4gMCA/ICdhbmQgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAocyA+IDAgPyBzICsgJ3NlY29uZCcgKyAocyA+IDEgPyAncyAnIDogJyAnKSA6ICcnKSArICdhZ28nO1xuXHR9XG59IiwiaW1wb3J0IHtCb3R9IGZyb20gXCIuL2JvdC5qc1wiO1xuZXhwb3J0IGNsYXNzIFRoYW5rc01hbmFnZXIgZXh0ZW5kcyBCb3Qge1xuXHRuYW1lICAgICAgICAgICAgPSAnVGhhbmtzIG1hbmFnZXIgYm90Jztcblx0ZGVzY3JpcHRpb24gICAgID0gJ0EgYm90IGZvciBoYW5kbGluZyBcInRoYW5rIHlvdVwiIG1lc3NhZ2VzJztcbiAgICBhbGlhcyAgICAgICAgICAgPSBbJyF0aGFua3MnLCcvdGhhbmtzJ107XG4gICAgcGVybWlzc2lvbnMgICAgID0geydhZGQnOiAnYm0nLFxuXHRcdFx0XHRcdCAgICdsaXN0JzogJ2JtJyxcblx0XHRcdFx0XHQgICAncm0nICA6ICdibScsXG4gICAgICAgICAgICAgICAgICAgICAgICdzdG9wJzogJ2InLFxuICAgICAgICAgICAgICAgICAgICAgICAncnVuJyA6ICdiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3BhdXNlJzonYidcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICBmb3JlZ3JvdW5kQ29sb3IgPSAnI2ZmZmYwMCc7XG5cdGJhY2tncm91bmRDb2xvciA9ICcjMjIwMGNjJztcblx0c2V0dGluZ3NJbnB1dEZpZWxkcyA9IDEwO1xuXG5cblx0Y29uc3RydWN0b3IoYXBwLCBjYikge1xuXHRcdHN1cGVyKGFwcCxjYik7XG5cdFx0dGhpcy50aGFua3MgPSB7XG5cdFx0XHQnMS0xMCcgOiBbXG5cdFx0XHRcdCdUaGFua3MgJHUsIGtlZXAgdGhlbSBjb21taW5nIDspJyxcblx0XHRcdFx0J1ZlcnkgbmljZSBvZiB5b3UgJHUuIFRoYW5rcyBmb3IgdGhlIHRpcCdcblx0XHRcdF0sXG5cdFx0XHQnNjknOltcblx0XHRcdFx0JyR0IHRva2VucyB1aD8gbmljZSBjaG9pY2UgOiknLFxuXHRcdFx0XHQnJHQgaXMgbXkgZmF2b3JpdGUgbnVtYmVyISBob3cgZGlkIHlvdSBrbm93LCAkdT8nLFxuXHRcdFx0XHQnJHQgaXMgZnVuLCBkb25cXCd0IHlvdSB0aGluaz8nXG5cdFx0XHRdLFxuXHRcdFx0JzMwMC0nOltcblx0XHRcdFx0J0dlZXogJHUsIHRoYW5rIHlvdSBzbyBtdWNoIScsXG5cdFx0XHRcdCdGdWNrICR1LiBEb25cXCd0IHN0b3Agbm93Jyxcblx0XHRcdF0sXG5cdFx0XHQnMTAxLTIwMCc6W1xuXHRcdFx0XHQnWW91XFwncmUgc28gZ2VuZXJvdXMsICR1IScsXG5cdFx0XHRcdCdMb3ZlIHlvdSwgJHUhICR0IHRva2VucyEgPDMgPDMnXG5cdFx0XHRdLFxuXHRcdFx0JzE1LTEwMCc6IFtcblx0XHRcdFx0J01tbW1tIC4uLiBPTUcsIHRoYW5rIHlvdSAkdSEnLCBcblx0XHRcdFx0J1NvIHN3ZWV0IG9mIHlvdSwgJHUnLFxuXHRcdFx0XHQnVGhhbmtzICR1ISdcblx0XHRcdF0sXG5cdFx0XHQnMjAxLTMwMCc6W1xuXHRcdFx0XHQnJHQgdG9rZW5zISB0aGF0XFwncyBpbnNhbmUgJHUhJ1xuXHRcdFx0XSxcblx0XHRcdCcxMDAwLScgOiBbXG5cdFx0XHRcdCdZZXMsIHllcywgWUVTU1NTU1MgJHUhIHRoYW5rIHlvdSEhIScsXG5cdFx0XHRcdCdZZWVlZWVlaGEsICR1IS4gVGhhbmtzIGEgbG90ISEnLFxuXHRcdFx0XSxcblx0XHRcdCc1MDAwLSc6IFtcblx0XHRcdFx0J09IIE1ZIEdPRCEhICR0IGZ1Y2tpbmcgdG9rZW5zISEgSSBsb3ZlIGl0IScsXG5cdFx0XHRcdCckdCBmdWNraW5nIHRva2VucyEhISBPTUchJ1xuXHRcdFx0XVxuXHRcdFx0XG5cdFx0fTtcblxuXHRcdFxuXHRcdHRoaXMuaW5pdCh7dXNlcjogY2Iucm9vbV9zbHVnfSk7XG5cdH1cblx0XG5cdGluaXQoZGF0YSkge1xuXHRcdHRoaXMucmVhZENvbmZpZyh0aGlzLmNiKVxuXHRcdHRoaXMubG9hZENvbmZpZygpO1xuXHRcdHRoaXMuc29ydFRoYW5rcygpO1xuXHRcdCgodGhpcy5zZXR0aW5ncy50aGFua3NCb3RFbmFibGVkID09ICd5ZXMnKSAmJiB0aGlzLnJ1bihkYXRhKSkgfHwgdGhpcy5zdG9wKGRhdGEpO1xuXHR9XG5cblx0c29ydFRoYW5rcygpIHtcblx0XHR0aGlzLnRoYW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudGhhbmtzKS5zb3J0KChhLGIpID0+IHtcblx0XHRcdGlmKGEuaW5kZXhPZignLScpIDwgMCAmJiBiLmluZGV4T2YoJy0nKSA8IDApXG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhKSAtIHBhcnNlSW50KGIpO1xuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPCAwICYmIGIuaW5kZXhPZignLScpID49IDApXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdGlmKGEuaW5kZXhPZignLScpID49IDAgJiYgYi5pbmRleE9mKCctJykgPCAwKVxuXHRcdFx0XHRyZXR1cm4gMTtcblxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPT0gMCAmJiBiLmluZGV4T2YoJy0nKSA9PSAwKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhLnNwbGl0KCctJylbMV0pIC0gcGFyc2VJbnQoYi5zcGxpdCgnLScpWzFdKTtcblx0XHRcdH1cblx0XHRcdGlmKGEuaW5kZXhPZignLScpID09IDAgJiYgYi5pbmRleE9mKCctJykgPiAwKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhLnNwbGl0KCctJylbMV0pIC0gcGFyc2VJbnQoYi5zcGxpdCgnLScpWzFdKTtcdFx0XHRcdFxuXHRcdFx0fVxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPiAwICYmIGIuaW5kZXhPZignLScpID09IDApIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KGEuc3BsaXQoJy0nKVsxXSkgLSBwYXJzZUludChiLnNwbGl0KCctJylbMV0pO1xuXHRcdFx0fVxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPiAwICYmIGIuaW5kZXhPZignLScpID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoYS5zcGxpdCgnLScpWzBdKSAtIHBhcnNlSW50KGIuc3BsaXQoJy0nKVswXSk7XG5cdFx0XHR9XG5cdFx0fSkubWFwKChpdGVtKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtaW46IHRoaXMucmV3cml0ZVJhbmdlKGl0ZW0pLnNwbGl0KCctJylbMF0sIFxuXHRcdFx0XHRtYXg6IHRoaXMucmV3cml0ZVJhbmdlKGl0ZW0pLnNwbGl0KCctJylbMV0gfHwgdGhpcy5yZXdyaXRlUmFuZ2UoaXRlbSkuc3BsaXQoJy0nKVswXSwgXG5cdFx0XHRcdG1zZ3M6IHRoaXMudGhhbmtzW2l0ZW1dXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cblx0cmV3cml0ZVJhbmdlKHJhbmdlKSB7XG5cdFx0aWYgKHJhbmdlLmluZGV4T2YoJy0nKT09MClcblx0XHRcdHJldHVybiBgMSR7cmFuZ2V9YDtcblxuXHRcdGlmKHJhbmdlLmluZGV4T2YoJy0nKT09KHJhbmdlLmxlbmd0aC0xKSlcblx0XHRcdHJldHVybiBgJHtyYW5nZX0xMDAwMDAwYDtcblxuXHRcdHJldHVybiByYW5nZTtcblx0fVxuXG5cdGdldFRoYW5rcyh0aXApIHtcblx0XHRjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5nZXRDYW5kaWRhdGVzKHRpcC5hbW91bnQpO1xuXHRcdHJldHVybiBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IoY2FuZGlkYXRlcy5sZW5ndGgpKV0uXG5cdFx0XHRcdHJlcGxhY2UoJyR1JywgdGlwLmZyb21fdXNlcikuXG5cdFx0XHRcdHJlcGxhY2UoJyR0JywgdGlwLmFtb3VudCk7XG5cdH1cblxuXHRnZXRDYW5kaWRhdGVzKHRpcEFtb3VudCkge1xuXHRcdGxldCBleGFjdCA9IHRoaXMudGhhbmtzLmZpbHRlcihpdGVtID0+IHtcblx0XHRcdHJldHVybiB0aXBBbW91bnQgPT0gaXRlbS5tYXggJiYgdGlwQW1vdW50ID09IGl0ZW0ubWluOyBcblx0XHR9KTtcblx0XHRpZihleGFjdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gZXhhY3QubWFwKGl0ZW0gPT4ge1xuXHRcdFx0XHRyZXR1cm4gaXRlbS5tc2dzO1xuXHRcdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KGN1cnJlbnQpLFtdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy50aGFua3MuZmlsdGVyKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIHRpcEFtb3VudCA8PSBpdGVtLm1heCAmJiB0aXBBbW91bnQgPj0gaXRlbS5taW47IFxuXHRcdH0pLm1hcChpdGVtID0+IHtcblx0XHRcdHJldHVybiBpdGVtLm1zZ3M7XG5cdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KGN1cnJlbnQpLFtdKTtcblx0fVxuXG5cdCAgXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIENvbmZpZyAgICAgICAgICAgLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFxuXHRsb2FkQ29uZmlnKCkge1xuXHRcdHRoaXMucHJvY2Vzc1RoYW5rcygpO1xuXHR9XG5cblx0cHJvY2Vzc1RoYW5rcygpIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLnNldHRpbmdzKS5maWx0ZXIoa2V5ID0+IHtcblx0XHRcdHJldHVybiBrZXkuaW5kZXhPZigndGhhbmtzTXNnJykgPT0gMCAmJiB0aGlzLnNldHRpbmdzW2tleV0gIT0gdW5kZWZpbmVkICYmIHRoaXMuc2V0dGluZ3Nba2V5XS50cmltKCkubGVuZ3RoID4gMDtcblx0XHR9KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHRjb25zdCBbdGlwLCBtZXNzYWdlXSA9IHRoaXMuc2V0dGluZ3Nba2V5XS5zcGxpdCgnfCcpO1xuXHRcdFx0aWYodHlwZW9mIHRoaXMudGhhbmtzID09ICdPYmplY3QnICYmIHRoaXMudGhhbmtzLmhhc093blByb3BlcnR5KHRpcCkpXG5cdFx0XHRcdHRoaXMudGhhbmtzW3RpcF0ucHVzaChtZXNzYWdlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy50aGFua3NbdGlwXSA9IFttZXNzYWdlXTtcblx0XHR9KTtcblx0fVxuXG4gICAgZ2V0U2V0dGluZ3NDaG9pY2VzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogXCJ0aGFua3NCb3RFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgbGFiZWwgICAgICAgICAgIDogXCIjIyMjIyMjIyMjIyBUSEFOS1MgQk9UICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgXCIsXG4gICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgIDogXCJjaG9pY2VcIixcbiAgICAgICAgICAgICAgICBjaG9pY2UxICAgICAgICAgOiBcInllc1wiLFxuICAgICAgICAgICAgICAgIGNob2ljZTIgICAgICAgICA6IFwibm9cIixcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgICAgOiBcInllc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkICAgICAgICA6IHRydWUsXG4gICAgICAgICAgICB9LCAgICBcblx0XHRdXG5cdFx0XG5cdFx0Zm9yKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0dGluZ3NJbnB1dEZpZWxkczsgaSsrKSB7XG5cdFx0XHRyZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogYHRoYW5rc01zZyR7aX1gLFxuICAgICAgICAgICAgICAgIGxhYmVsICAgICAgICAgICA6IGBNZXNzYWdlICR7aX0gYCxcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgOiBcInN0clwiLFxuICAgICAgICAgICAgICAgIG1pbkxlbmd0aCAgICAgICA6IDUsXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoICAgICAgIDogMjU1LFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6IFwiXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIDogZmFsc2UsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgXG59IiwiaW1wb3J0IHtCb3R9IGZyb20gXCIuL2JvdC5qc1wiO1xuaW1wb3J0IHtFY2hvfSBmcm9tIFwiLi9lY2hvLmpzXCI7XG5pbXBvcnQge2Zvcm1hdH0gZnJvbSBcIi4vY29uc3RzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaXBNZW51IGV4dGVuZHMgQm90IHtcblxuXHRuYW1lICAgICAgICAgICAgPSAnVGlwIG1lbnUgYm90Jztcblx0ZGVzY3JpcHRpb24gICAgID0gJ0EgYm90IGZvciBoYW5kbGluZyB0aXBzIGZvciBhIHRpcCBtZW51JztcbiAgICBhbGlhcyAgICAgICAgICAgPSBbJyF0bScsJyFtZW51JywnL3RtJywnL21lbnUnXTtcbiAgICBwZXJtaXNzaW9ucyAgICAgPSB7J2FkZCc6ICdibScsXG5cdFx0XHRcdFx0ICAgJ2xpc3QnOiAnYm0nLFxuXHRcdFx0XHRcdCAgICdybScgIDogJ2JtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3AnOiAnYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdydW4nIDogJ2InLFxuICAgICAgICAgICAgICAgICAgICAgICAncGF1c2UnOidiJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgIC8vIGZvcmVncm91bmRDb2xvciA9ICcjZmZmZmZmJztcblx0Ly8gYmFja2dyb3VuZENvbG9yID0gJyNmZmFhM2UnO1xuXHRzZXR0aW5nc0lucHV0RmllbGRzID0gMzA7XG4gICAgdHlwZXMgICAgICAgICAgICAgICA9IFsnbWFpbicsICdmaXQnXTtcbiAgICBkZWZhdWx0VHlwZSAgICAgICAgID0gJ21haW4nO1xuICAgIGxpc3RQcmVmaXggICAgICAgICAgPSAnbWVudUl0ZW0nO1xuICAgIG1lbnUgICAgICAgICAgICAgICAgPSBbXTtcbiAgICBzaG93QXMgICAgICAgICAgICAgID0gZm9ybWF0LlJPVztcblxuXG5cdGNvbnN0cnVjdG9yKGFwcCwgY2IpIHtcbiAgICAgICAgc3VwZXIoYXBwLGNiKTtcbiAgICAgICAgdGhpcy5yZWFkQ29uZmlnKGNiKTtcbiAgICAgICAgdGhpcy5pbml0KHt1c2VyOiBjYi5yb29tX3NsdWd9KTtcbiAgICAgICAgdGhpcy5zaG93TWVudSgpO1xuICAgICAgICAvLyB0aGlzLmFwcC5sb2codGhpcy5tZW51KTtcblx0fVxuXG4gICAgaW5pdChkYXRhKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc01lbnVJdGVtcygpO1xuICAgICAgICB0aGlzLnNvcnRNZW51KCk7XG4gICAgICAgIHRoaXMucnVuKCk7XG5cdFx0Ly8gKCh0aGlzLnNldHRpbmdzLm1lbnVCb3RFbmFibGVkID09ICd5ZXMnKSAmJiB0aGlzLnJ1bihkYXRhKSkgfHwgdGhpcy5zdG9wKGRhdGEpO1xuICAgIH1cblxuXHRzb3J0TWVudSgpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5tZW51KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lbnVba2V5XS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChiLnZhbHVlIC0gYS52YWx1ZSA8IDEgPyAxIDogLTEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXHR9XG5cblx0ICBcblx0cHJvY2Vzc01lbnVJdGVtcygpIHtcbiAgICAgICAgdGhpcy5tZW51ID0ge307XG5cbiAgICAgICAgLy8gZmlsdGVyIG1lbnUgaXRlbXMgKHRob3NlIHdpdGggdGhlIGJvdCBwcmVmaXggYW5kIGEgbnVtYmVyIGF0IHRoZSBlbmQpXG5cdFx0T2JqZWN0LmtleXModGhpcy5zZXR0aW5ncykuZmlsdGVyKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4ga2V5Lm1hdGNoKHRoaXMubGlzdFByZWZpeCArICdbMC05XSsnKSAhPSBudWxsICYmIHRoaXMuc2V0dGluZ3Nba2V5XSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZXR0aW5nc1trZXldLnRyaW0oKS5sZW5ndGggPiAwO1xuXHRcdH0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGVzY3JpcHRpb25dID0gdGhpcy5zZXR0aW5nc1trZXldLnNwbGl0KCd8Jyk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBrZXkubWF0Y2goLyhcXGQrKSQvKVswXSxcbiAgICAgICAgICAgICAgICB0eXBlICA9IHRoaXMuc2V0dGluZ3NbYCR7dGhpcy5saXN0UHJlZml4fVR5cGUke2luZGV4fWBdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhZGQgaXRlbSB0byBjb3JyZXNwb25kaW5nIHR5cGVcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkodGhpcy5tZW51W3R5cGVdKSlcblx0XHRcdFx0dGhpcy5tZW51W3R5cGVdLnB1c2goe3ZhbHVlLCBkZXNjcmlwdGlvbiwgdGltZXM6IDB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVbdHlwZV0gPSBbe3ZhbHVlLCBkZXNjcmlwdGlvbiwgdGltZXM6IDB9XTtcbiAgICAgICAgfSk7XG5cdH1cblxuXG4gICAgZ2V0U2V0dGluZ3NDaG9pY2VzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogXCJtZW51Qm90RW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIGxhYmVsICAgICAgICAgICA6IFwiIyMjIyMjIyMjIyMgTUVOVSBCT1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBcIixcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgOiBcImNob2ljZVwiLFxuICAgICAgICAgICAgICAgIGNob2ljZTEgICAgICAgICA6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlMiAgICAgICAgIDogXCJub1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICAgIH0sICAgIFxuICAgICAgICBdO1xuXHRcdFxuXHRcdGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnNldHRpbmdzSW5wdXRGaWVsZHM7IGkrKykge1xuXHRcdFx0cmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICA6IGAke3RoaXMubGlzdFByZWZpeH0ke2l9YCxcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBgTWVudSBpdGVtICR7aX0gKGZvcm1hdDogdmFsdWUgfCB0ZXh0KSBgLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgbWluTGVuZ3RoICAgICAgIDogNSxcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggICAgICAgOiAyNTUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlICAgIDogKHRoaXMubWVudVtpXSAmJiB0aGlzLm1lbnVbaV0uYW1vdW50ICYmIHRoaXMubWVudVtpXS5kZXNjcmlwdGlvbikgPyBgJHt0aGlzLm1lbnVbaV0uYW1vdW50fSB8ICR7dGhpcy5tZW51W2ldLmRlc2NyaXB0aW9ufWAgOiAnJyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHR5cGVzRmllbGQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogYCR7dGhpcy5saXN0UHJlZml4fVR5cGUke2l9YCxcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBgTWVudSBpdGVtICR7aX0gdHlwZSBgLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6ICdjaG9pY2UnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6ICh0aGlzLm1lbnVbaV0gJiYgdGhpcy5tZW51W2ldLnR5cGUpIHx8ICdtYWluJyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIHR5cGVzRmllbGRbYGNob2ljZSR7aSsxfWBdID0gdGhpcy50eXBlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHR5cGVzRmllbGQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHNob3dNZW51KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKCkpICByZXR1cm47XG4gICAgICAgIC8vIHRoaXMuYXBwLmxvZyh0aGlzLm1lbnUpO1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLm1lbnUpLmZvckVhY2goKHR5cGUsaWR4LG1lbnUpID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGl0ZW1zID0gbWVudVt0eXBlXS5tYXAoaXRlbSA9PiB7YCR7aXRlbS5kZXNjcmlwdGlvbn0gLSAke2l0ZW0udmFsdWV9YH0pO1xuICAgICAgICAvLyAgICAgRWNoby5zZW5kKHtjYiwgY29sb3I6IHRoaXMuY29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCB0ZXh0OiBpdGVtcy5qb2luKCcgLS0gJyl9KTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICB9XG59IiwiaW1wb3J0IHtCb3R9ICBmcm9tICcuL2JvdC5qcyc7XG5pbXBvcnQge0VjaG99IGZyb20gXCIuL2VjaG8uanNcIjtcblxuZXhwb3J0IGNsYXNzIFRpcHBlciBleHRlbmRzIEJvdHtcbiAgICBuYW1lICAgICAgICAgICAgPSAnVGlwcGVyIGJvdCc7XG4gICAgZGVzY3JpcHRpb24gICAgID0gJ0EgYm90IGZvciBoYW5kbGluZyB0aXBzJztcbiAgICBhbGlhcyAgICAgICAgICAgPSBbJyF0aXByJywnL3RpcHInXTtcbiAgICBwZXJtaXNzaW9ucyAgICAgPSB7J2tpbmcnOiAnYm1hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ2JvbWInOiAnYm1hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3JhdGUnOiAnYm1hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ2xpc3QnOiAnYm1hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3RvcDUnOiAnYm1hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3AnOiAnYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdydW4nIDogJ2InLFxuICAgICAgICAgICAgICAgICAgICAgICAncGF1c2UnOidiJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgIGZvcmVncm91bmRDb2xvciA9ICcjYjdmZjAwJztcbiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAnIzQ4MDBmZic7XG5cblx0Y29uc3RydWN0b3IoYXBwLCBjYikge1xuXHRcdHN1cGVyKGFwcCwgY2IpO1xuXHR9XG5cblx0b25UaXAodGlwKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnVwZGF0ZVN0YXRzKHRpcCk7XG4gICAgICAgIHRoaXMuc2VuZFRoYW5rcyh0aXApO1xuICAgICAgICB0aGlzLnNlbmRDaGFuZ2VzKGNoYW5nZXMpO1xuXHR9XG5cbiAgICB1cGRhdGVTdGF0cyh0aXApIHtcbiAgICAgICAgY29uc3Qgb2xkRGF0YSA9IHtcblx0XHRcdGJlc3Q6ICAgIHRoaXMuc3RhdHMuYmVzdFRpcHBlcigpLCBcblx0XHRcdGhpZ2hlc3Q6IHRoaXMuc3RhdHMuaGlnaGVzdFRpcCgpXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICB0aGlzLnN0YXRzLmFkZFRpcCh0aXApO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHtcblx0XHRcdGJlc3Q6ICAgIHRoaXMuc3RhdHMuYmVzdFRpcHBlcigpLCBcblx0XHRcdGhpZ2hlc3Q6IHRoaXMuc3RhdHMuaGlnaGVzdFRpcCgpXG5cdFx0fSxcbiAgXG4gICAgICAgIG5ld0Jlc3QgICAgICAgPSBvbGREYXRhLmJlc3QudXNlcm5hbWUgPT0gbmV3RGF0YS5iZXN0LnVzZXJuYW1lID8gJyc6IG5ld0RhdGEuYmVzdCxcbiAgICAgICAgbmV3SGlnaGVzdCAgICA9IG9sZERhdGEuaGlnaGVzdC5hbW91bnQgPT0gbmV3RGF0YS5oaWdoZXN0LmFtb3VudCA/ICcnOiBuZXdEYXRhLmhpZ2hlc3Q7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YmVzdDogICAgbmV3QmVzdCwgXG5cdFx0XHRoaWdoZXN0OiBuZXdIaWdoZXN0XG5cdFx0fTtcbiAgICB9XG4gIFxuICAgIHNlbmRDaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgY2IgPSB0aGlzLmNiO1xuICAgICAgICBpZiAoY2hhbmdlcy5iZXN0ICE9ICcnKVxuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7Y2IsIHRleHQ6IGAke2NoYW5nZXMuYmVzdC51c2VybmFtZX0gaXMgbXkgbmV3IEtJTkdgLCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yfSlcblxuICAgICAgICBpZiAoY2hhbmdlcy5oaWdoZXN0ICE9ICcnKVxuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7Y2IsIHRleHQ6IGAke2NoYW5nZXMuaGlnaGVzdC51c2VybmFtZX0gaG9sZHMgdGhlIEhJR0hFU1QgdGlwIHdpdGggJHtjaGFuZ2VzLmhpZ2hlc3QuYW1vdW50fSB0b2tlbnNgLCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yfSlcbiAgICB9XG5cblx0c2VuZFRoYW5rcyh0aXApIHtcblx0XHRjb25zdCBjYiAgICAgPSB0aGlzLmNiLFxuICAgICAgICAgICAgICB0aGFua3MgPSB0aGlzLmFwcC5nZXQoJ3RoYW5rcycpLFxuICAgICAgICAgICAgICB0ZXh0ICAgPSB0aGFua3MuZ2V0VGhhbmtzKHRpcCk7XG5cbiAgICAgICAgRWNoby5zZW5kQm9sZCh7Y2IsIHRleHQsIGNvbG9yOiB0aGFua3MuZm9yZWdyb3VuZENvbG9yIHx8IHRoaXMuZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kOiB0aGFua3MuYmFja2dyb3VuZENvbG9yIHx8IHRoaXMuYmFja2dyb3VuZENvbG9yfSlcblx0fVxuXG4gICAgb25TdG9wKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGAqKiAke3RoaXMubmFtZX0gc3RhdHVzOiBTVE9QUEVEICoqYDtcbiAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogZGF0YS51c2VyLCB0ZXh0LCBjb2xvcjogJ3JlZCcsIGJhY2tncm91bmQ6J3doaXRlJywgY2I6IHRoaXMuY2J9KTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgb25SdW4oZGF0YSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYCoqICR7dGhpcy5uYW1lfSBzdGF0dXM6IFJVTk5JTkcgKipgO1xuICAgICAgICBFY2hvLnNlbmRCb2xkKHt1c2VyOiBkYXRhLnVzZXIsIHRleHQsIGNvbG9yOiAnZ3JlZW4nLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgfVxuXG4gICAgb25QYXVzZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgKiogJHt0aGlzLm5hbWV9IHN0YXR1czogUEFVU0VEICoqYDtcbiAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogZGF0YS51c2VyLCB0ZXh0LCBjb2xvcjogJ29yYW5nZScsIGJhY2tncm91bmQ6J3doaXRlJywgY2I6IHRoaXMuY2J9KTtcbiAgICB9XG5cbiAgICBraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0cy5iZXN0VGlwcGVyKCk7XG4gICAgfVxuXG4gICAgaGlnaGVzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHMuaGlnaGVzdFRpcCgpO1xuICAgIH1cblxuICAgIHRva2VuUmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHMudG9rZW5SYXRlKCk7XG4gICAgfVxuXG4gICAgbGlzdCh0b3AgPSAwKSB7XG4gICAgICAgIHJldHVybiB0b3AgPyB0aGlzLnN0YXRzLnN1bUJ5VXNlcigpLnNsaWNlKDAsdG9wKSA6IHRoaXMuc3RhdHMuc3VtQnlVc2VyKCk7XG4gICAgfVxuXG4gICAgXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIENvbmZpZyAgICAgICAgICAgLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgXG4gICAgZ2V0U2V0dGluZ3NDaG9pY2VzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBJbnRlcmZhY2UgbWV0aG9kcyAvL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICBcbiAgICBcbiAgICBwcm9jZXNzQ29tbWFuZChvcHRpb25zLCBtZXNzYWdlKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUGVybWlzc2lvbihvcHRpb25zWzBdLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8ga2luZ1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdraW5nJykge1xuICAgICAgICAgICAgY29uc3Qga2luZyA9IHRoaXMua2luZygpLFxuICAgICAgICAgICAgICAgICAgdGV4dCA9IGtpbmcudXNlcm5hbWUgPyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2tpbmcudXNlcm5hbWV9IGlzIG15IGtpbmcgdGlwcGVyIHdpdGggJHtraW5nLmFtb3VudH0gdG9rZW5zYCA6XG4gICAgICAgICAgICAgICAgICAgICAgICBgTm9vZHkgaGFzIHRpcHBlZCB5ZXRgO1xuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYm9tYlxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdib21iJykge1xuICAgICAgICAgICAgY29uc3QgaGlnaGVzdCA9IHRoaXMuaGlnaGVzdCgpLFxuICAgICAgICAgICAgICAgICAgdGV4dCA9IGhpZ2hlc3QudXNlcm5hbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7aGlnaGVzdC51c2VybmFtZX0gZ2F2ZSB0aGUgaGlnaGVzdCBzaW5nZS10aXAgd2l0aCAke2hpZ2hlc3QuYW1vdW50fSB0b2tlbnNgIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGBOb2JvZHkgaGFzIHRpcHBlZCB5ZXRgO1xuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yYXRlXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3JhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCByYXRlID0gdGhpcy50b2tlblJhdGUoKSxcbiAgICAgICAgICAgICAgICAgIHRleHQgPSAhTnVtYmVyLmlzTmFOKHJhdGUpP1xuICAgICAgICAgICAgICAgICAgICAgICAgYFRva2VuIHJhdGUgc2luY2UgdGhlIGJvdCBzdGFydGVkOiR7cmF0ZX0gdG9rZW5zL21pbnV0ZWAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vYm9keSBoYXMgdGlwcGVkIHlldGA7XG4gICAgICAgICAgICBFY2hvLnNlbmRCb2xkKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2xpc3RcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAnbGlzdCcpIHtcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmxpc3QoKS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKyAnXFxuJyArIGAkeysrY291bnRlcn0uICR7Y3VycmVudC51c2VybmFtZX0gOiAke2N1cnJlbnQuYW1vdW50fWA7XG4gICAgICAgICAgICB9LCcnKS50cmltKCdcXG4nKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b3A1XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3RvcDUnKSB7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5saXN0KDUpLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+e1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciArICdcXG4nICsgYCR7Kytjb3VudGVyfS4gJHtjdXJyZW50LnVzZXJuYW1lfSA6ICR7Y3VycmVudC5hbW91bnR9YDtcbiAgICAgICAgICAgIH0sJycpLnRyaW0oJ1xcbicpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBFY2hvLnNlbmRCb2xkKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL3N0b3BcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAnc3RvcCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCh7bWVzc2FnZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9ydW5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncnVuJykge1xuICAgICAgICAgICAgdGhpcy5ydW4oe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcGF1c2VcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncGF1c2UnKSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlKHttZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iLCJleHBvcnQgY29uc3QgdW5pY29kZUNoYXJzID0ge1xuICAgICAgICBzcGFjZSAgICAgICAgICAgIDogJ1xcdTAwMjAnLFxuICAgICAgICBkb3QgICAgICAgICAgICAgIDogJ1xcdTIyYzUnLCAvLyBkb3RcbiAgICAgICAgaGVhcnQgICAgICAgICAgICA6ICdcXHUyNjY1JywgLy8gaGVhcnRcbiAgICAgICAgc3RhciAgICAgICAgICAgICA6ICdcXHUyNjA1JywgLy8gZmlsbGVkIHN0YXJcbiAgICAgICAgd2hpdGVTdGFyICAgICAgICA6ICdcXHUyNjA2JywgLy8gd2hpdGUgc3RhclxuICAgICAgICBzcXVhcmUgICAgICAgICAgIDogJ1xcdTI1ZmMnLFxuICAgICAgICB0cmlhbmdsZVJpZ2h0ICAgIDogJ1xcdTI1YjYnLFxuICAgICAgICBkYXNoQ2hhciAgICAgICAgIDogJ1xcdTI1MDAnLFxuICAgICAgICB3aGl0ZUhlYXJ0ICAgICAgIDogJ1xcdTI2NjEnLFxuICAgICAgICBhcnJvdyAgICAgICAgICAgIDogJ1xcdTIxOTInLFxuICAgICAgICB0cmlhbmdsZURvd24gICAgIDogJ1xcdTI1YmMnLFxuICAgICAgICBsb25nRGFzaCAgICAgICAgIDogJ1xcdTIwMTUnLFxuICAgICAgICB0b3BMZWZ0Q29ybmVyICAgIDogJ1xcdTI1MGMnLFxuICAgICAgICBib3R0b21MZWZ0Q29ybmVyIDogJ1xcdTI1MTQnLFxuICAgICAgICB2ZXJ0RGFzaCAgICAgICAgIDogJ1xcdTI1MDInIFxuICAgIH07Il0sInNvdXJjZVJvb3QiOiIifQ==
© Copyright Chaturbate 2011- 2025. All Rights Reserved.