Bots Home
|
Create an App
ES6
Author:
onesinmiedo
Description
Source Code
Launch Bot
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"); // 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)); 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 _status_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./status.js */ "./js/status.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 = _status_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 == _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].RUNNING; } }, { key: "clearData", value: function clearData() { if (this.stats) this.clearStats(); } ////////////// // commands // ////////////// }, { key: "pause", value: function pause(data) { this.status = _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].PAUSED; this.onPause(data); } }, { key: "stop", value: function stop(data) { this.status = _status_js__WEBPACK_IMPORTED_MODULE_1__["status"].STOPPED; this.clearData(); this.onStop(data); } }, { key: "run", value: function run(data) { this.status = _status_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 []; } }]); 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 _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); }); } }]); return BotManager; }(); /***/ }), /***/ "./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); } }]); 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/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/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) { var oldData = { best: this.bestTipper(), highest: this.highestTip() }; this.history.push({ username: tip.from_user, amount: tip.amount, fan: tip.from_user_in_fanclub, time: Date.now() }); var newData = { best: this.bestTipper(), highest: this.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: "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/status.js": /*!**********************!*\ !*** ./js/status.js ***! \**********************/ /*! exports provided: status */ /***/ (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; }); var status = { STOPPED: -1, PAUSED: 0, RUNNING: 1 }; /***/ }), /***/ "./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); // foregroundColor = '#b7ff00'; // backgroundColor = '#ff00cc'; 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.settingsInputFields = 10; _this.thanks = { '1-10': ['Thanks $u, keep them comming ;)', 'Very nice of you $u. Thanks for the tip'], '69': ['$t tokens uh? is that a suggestion?', '$t is my favorite number! how did you know, $u?', '$t is fun, don\'t you think? you like to be on top, $u? I do'], '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! let me ride you like a cowgirl. Thanks a lot!!'], '5000-': ['OH MY GOD!! $t fucking tokens!! Fuck me now! ... and then keep going! I love it!', '$t fucking tokens!!! OMG ...My pussy is yours $u, my ass is yours, my mouth is yours.'] }; _this.loadConfig(cb); _this.sortThanks(); return _this; } _createClass(ThanksManager, [{ 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(cb) { this.readConfig(cb); 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: "readConfig", value: function readConfig(cb) { var _this4 = this; this.settings = {}; this.getSettingsChoices().map(function (item) { return item.name; }).forEach(function (key) { _this4.settings[key] = cb.settings[key]; }); } }, { 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"); 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 = [{ 'amount': 10, 'description': 'PM', 'type': 'main' }]; _this.loadConfig(cb); _this.cb.log(_this.menu); _this.sortMenu(); _this.cb.log(_this.menu); return _this; } _createClass(TipMenu, [{ key: "sortMenu", value: function sortMenu() { var _this2 = this; Object.keys(this.menu).forEach(function (key) { _this2.menu[key].sort(function (a, b) { return b.amount - a.amount; }); }); } ////////////////////// // Config // ////////////////////// }, { key: "loadConfig", value: function loadConfig(cb) { this.readConfig(cb); this.processMenuItem(); } }, { key: "processMenuItem", value: function processMenuItem() { var _this3 = this; this.menu = {}; 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)]; if (Array.isArray(_this3.menu[type])) _this3.menu[type].push({ value: value, description: description });else _this3.menu[type] = [{ value: value, description: description }]; }); } }, { key: "readConfig", value: function readConfig(cb) { var _this4 = this; this.settings = {}; this.getSettingsChoices().map(function (item) { return item.name; }).forEach(function (key) { _this4.settings[key] = cb.settings[key]; }); } }, { 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; } }]); 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.stats.addTip(tip); this.sendThanks(tip); this.sendChanges(changes); } }, { 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: "clearData", value: function clearData() { this.stats.clearStats(); } }, { 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vanMvYXBwLmpzIiwid2VicGFjazovLy8uL2pzL2JsYWNrX2xpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vanMvYm90LmpzIiwid2VicGFjazovLy8uL2pzL2JvdF9tYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL2pzL2VjaG8uanMiLCJ3ZWJwYWNrOi8vLy4vanMva2VyYmVyb3MuanMiLCJ3ZWJwYWNrOi8vLy4vanMvbWVzc2VuZ2VyLmpzIiwid2VicGFjazovLy8uL2pzL25vdGlmaWVyLmpzIiwid2VicGFjazovLy8uL2pzL3N0YXRzLmpzIiwid2VicGFjazovLy8uL2pzL3N0YXR1cy5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aGFua3NfbWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aXBfbWVudS5qcyIsIndlYnBhY2s6Ly8vLi9qcy90aXBwZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvdmFsdWVzLmpzIl0sIm5hbWVzIjpbImFwcCIsIkJvdE1hbmFnZXIiLCJjYiIsImFkZCIsIktlcmJlcm9zIiwiTm90aWZpZXIiLCJUaXBNZW51IiwiVGlwcGVyIiwiTWVzc2VuZ2VyIiwiVGhhbmtzTWFuYWdlciIsInNldHRpbmdzX2Nob2ljZXMiLCJnZXRTZXR0aW5nc0Nob2ljZXMiLCJibGFja0xpc3QiLCJ1c2VycyIsIkJvdCIsImJhY2tncm91bmRDb2xvciIsImNvbG9yIiwibmV3bGluZSIsImNvcmVDb21tYW5kcyIsImNoZWNrSW50ZXJmYWNlIiwic3RhdHMiLCJTdGF0cyIsInN0YXR1cyIsIlJVTk5JTkciLCJjbGVhckRhdGEiLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIm1ldGhvZE5hbWUiLCJjbGVhclN0YXRzIiwiZGF0YSIsIlBBVVNFRCIsIm9uUGF1c2UiLCJTVE9QUEVEIiwib25TdG9wIiwib25SdW4iLCJjYk1lc3NhZ2UiLCJwYXJzZU1lc3NhZ2VGb3JDb21tYW5kcyIsInRpcCIsInVzZXIiLCJnZXRDb21tYW5kIiwibSIsImlzUnVubmluZyIsImlzQ29yZUNvbW1hbmQiLCJvcHRpb25zIiwibWVzc2FnZVRleHQiLCJtZXNzYWdlQXJyYXkiLCJ0cmltIiwic3BsaXQiLCJhbGlhcyIsInNsaWNlIiwiYWN0aW9uIiwicGVybWlzc2lvbnMiLCJpc19tb2QiLCJpbmRleE9mIiwicm9vbV9zbHVnIiwiYm90cyIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsIm9uTWVzc2FnZSIsIm1lc3NhZ2UiLCJvblRpcCIsIm9uRW50ZXIiLCJvbkxlYXZlIiwib25EcmF3UGFuZWwiLCJyZWR1Y2UiLCJyZXN1bHQiLCJib3QiLCJjb25jYXQiLCJpZCIsInB1c2giLCJmaW5kIiwiaXRlbSIsInNwbGljZSIsImZpbmRJbmRleCIsImZvckVhY2giLCJFY2hvIiwidGV4dCIsImxlbmd0aCIsInVuaWNvZGVDaGFycyIsInRvcExlZnRDb3JuZXIiLCJyZXBlYXQiLCJkYXNoQ2hhciIsInZlcnREYXNoIiwiYm90dG9tTGVmdENvcm5lciIsImNoYXIiLCJmb3JtYXRQcmVmaXgiLCJsaW5lcyIsIm1hcCIsImxpbmUiLCJqb2luIiwidGltZXMiLCJncm91cCIsImludmVyc2UiLCJiYWNrZ3JvdW5kIiwic2VuZE5vdGljZSIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImZvcmVncm91bmRDb2xvciIsInBhcnNlQmxhY2tsaXN0IiwiYmxhY2tsaXN0IiwiaXNDbGVhbiIsInRvTG93ZXJDYXNlIiwiaXNQcml2aWxlZ2VkIiwibm90aWZ5QWJ1c2UiLCJibGFja2xpc3RlZCIsImNoZWNrUGVybWlzc2lvbiIsInNlbmQiLCJwYXJzZSIsInNvbWUiLCJlbGVtZW50IiwidGVzdCIsIlJlZ0V4cCIsIm1zZyIsInRpcFN1bSIsImdldCIsInN1bUZyb21Vc2VyIiwicHJlZml4Iiwic2V0dGluZ3MiLCJmb3JtYXRMaW5lcyIsImhpc3RvcnkiLCJvbGREYXRhIiwiYmVzdCIsImJlc3RUaXBwZXIiLCJoaWdoZXN0IiwiaGlnaGVzdFRpcCIsInVzZXJuYW1lIiwiZnJvbV91c2VyIiwiYW1vdW50IiwiZmFuIiwiZnJvbV91c2VyX2luX2ZhbmNsdWIiLCJ0aW1lIiwibmV3RGF0YSIsIm5ld0Jlc3QiLCJuZXdIaWdoZXN0IiwiYWNjdW11bGF0b3IiLCJjdXJyZW50IiwibWludXRlcyIsInBhcnNlRmxvYXQiLCJzdW0iLCJ0b0ZpeGVkIiwiZm91bmQiLCJNYXRoIiwibWF4Iiwic29ydCIsImEiLCJiIiwiaGlnaGVzdEJ5VXNlciIsInN1bUJ5VXNlciIsImZpbHRlciIsInJldmVyc2UiLCJoclRpbWUiLCJtaWxpc2Vjb25kcyIsInNlY29uZHMiLCJmbG9vciIsImgiLCJzIiwic2V0dGluZ3NJbnB1dEZpZWxkcyIsInRoYW5rcyIsImxvYWRDb25maWciLCJzb3J0VGhhbmtzIiwiT2JqZWN0Iiwia2V5cyIsInBhcnNlSW50IiwibWluIiwicmV3cml0ZVJhbmdlIiwibXNncyIsInJhbmdlIiwiY2FuZGlkYXRlcyIsImdldENhbmRpZGF0ZXMiLCJyYW5kb20iLCJyZXBsYWNlIiwidGlwQW1vdW50IiwiZXhhY3QiLCJyZWFkQ29uZmlnIiwicHJvY2Vzc1RoYW5rcyIsImtleSIsInVuZGVmaW5lZCIsImhhc093blByb3BlcnR5IiwibGFiZWwiLCJ0eXBlIiwiY2hvaWNlMSIsImNob2ljZTIiLCJkZWZhdWx0VmFsdWUiLCJyZXF1aXJlZCIsImkiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJ0eXBlcyIsImRlZmF1bHRUeXBlIiwibGlzdFByZWZpeCIsIm1lbnUiLCJsb2ciLCJzb3J0TWVudSIsInByb2Nlc3NNZW51SXRlbSIsIm1hdGNoIiwidmFsdWUiLCJpbmRleCIsIkFycmF5IiwiaXNBcnJheSIsInR5cGVzRmllbGQiLCJjaGFuZ2VzIiwiYWRkVGlwIiwic2VuZFRoYW5rcyIsInNlbmRDaGFuZ2VzIiwic2VuZEJvbGQiLCJnZXRUaGFua3MiLCJ0b2tlblJhdGUiLCJ0b3AiLCJraW5nIiwicmF0ZSIsIk51bWJlciIsImlzTmFOIiwiY291bnRlciIsImxpc3QiLCJzdG9wIiwicnVuIiwicGF1c2UiLCJzcGFjZSIsImRvdCIsImhlYXJ0Iiwic3RhciIsIndoaXRlU3RhciIsInNxdWFyZSIsInRyaWFuZ2xlUmlnaHQiLCJ3aGl0ZUhlYXJ0IiwiYXJyb3ciLCJ0cmlhbmdsZURvd24iLCJsb25nRGFzaCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBRUE7O0FBRUEsSUFBTUEsR0FBRyxHQUFHLElBQUlDLDBEQUFKLENBQWVDLEVBQWYsQ0FBWjtBQUNBRixHQUFHLENBQUNHLEdBQUosQ0FBUSxVQUFSLEVBQW9CLElBQUlDLHFEQUFKLENBQWFKLEdBQWIsRUFBa0JFLEVBQWxCLENBQXBCO0FBQ0FGLEdBQUcsQ0FBQ0csR0FBSixDQUFRLFVBQVIsRUFBb0IsSUFBSUUscURBQUosQ0FBYUwsR0FBYixFQUFrQkUsRUFBbEIsQ0FBcEI7QUFDQUYsR0FBRyxDQUFDRyxHQUFKLENBQVEsU0FBUixFQUFtQixJQUFJRyxvREFBSixDQUFZTixHQUFaLEVBQWlCRSxFQUFqQixDQUFuQjtBQUNBRixHQUFHLENBQUNHLEdBQUosQ0FBUSxRQUFSLEVBQWtCLElBQUlJLGlEQUFKLENBQVdQLEdBQVgsRUFBZ0JFLEVBQWhCLENBQWxCO0FBQ0FGLEdBQUcsQ0FBQ0csR0FBSixDQUFRLFdBQVIsRUFBcUIsSUFBSUssdURBQUosQ0FBY1IsR0FBZCxFQUFtQkUsRUFBbkIsQ0FBckI7QUFDQUYsR0FBRyxDQUFDRyxHQUFKLENBQVEsUUFBUixFQUFrQixJQUFJTSxnRUFBSixDQUFrQlQsR0FBbEIsRUFBdUJFLEVBQXZCLENBQWxCO0FBRUFBLEVBQUUsQ0FBQ1EsZ0JBQUgsR0FBc0JWLEdBQUcsQ0FBQ1csa0JBQUosRUFBdEIsQzs7Ozs7Ozs7Ozs7O0FDakJBO0FBQUE7QUFBTyxJQUFNQyxTQUFTLEdBQUc7QUFDeEJDLE9BQUssRUFBRSxFQURpQjtBQUV4QkQsV0FBUyxFQUFFLENBQUMsTUFBRCxFQUFTLE9BQVQsRUFBa0IsT0FBbEIsRUFBMkIsY0FBM0IsRUFBMkMsY0FBM0M7QUFGYSxDQUFsQixDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQVA7QUFDQTtBQUNBOzs7O0FBR08sSUFBTUUsR0FBYjtBQUFBO0FBQUE7QUFNQyxlQUFZZCxHQUFaLEVBQWlCRSxFQUFqQixFQUFxQjtBQUFBOztBQUFBLFNBTHJCYSxlQUtxQixHQUxILEVBS0c7QUFBQSxTQUpyQkMsS0FJcUIsR0FKSCxTQUlHO0FBQUEsU0FIckJDLE9BR3FCLEdBSEgsSUFHRztBQUFBLFNBRnJCQyxZQUVxQixHQUZILENBQUMsS0FBRCxFQUFPLE1BQVAsRUFBYyxPQUFkLENBRUc7QUFDcEIsU0FBS0MsY0FBTDtBQUNBLFNBQUtqQixFQUFMLEdBQVVBLEVBQVY7QUFDQSxTQUFLRixHQUFMLEdBQVdBLEdBQVg7QUFDQSxTQUFLb0IsS0FBTCxHQUFhLElBQUlDLCtDQUFKLENBQVVyQixHQUFWLEVBQWVFLEVBQWYsQ0FBYjtBQUNBLFNBQUtvQixNQUFMLEdBQWNBLGlEQUFNLENBQUNDLE9BQXJCO0FBQ0E7O0FBWkY7QUFBQTtBQUFBLHFDQWNrQjtBQUNoQixVQUFHLENBQUMsS0FBS0MsU0FBTixJQUFtQixDQUFDLEtBQUtDLGNBQTVCLEVBQTRDLENBQzNDO0FBQ0E7QUFDRDtBQWxCRjtBQUFBO0FBQUEsa0NBb0JlQyxPQXBCZixFQW9Cd0I7QUFDdEIsYUFBTyxLQUFLUixZQUFMLENBQWtCUyxRQUFsQixDQUEyQkQsT0FBM0IsQ0FBUDtBQUNBO0FBdEJGO0FBQUE7QUFBQSw4QkF3QldFLFVBeEJYLEVBd0J1QjtBQUNyQixhQUFPLEtBQUtBLFVBQUwsS0FBb0IsT0FBTyxLQUFLQSxVQUFMLENBQVAsSUFBMkIsVUFBdEQ7QUFDQTtBQTFCRjtBQUFBO0FBQUEsZ0NBNEJhO0FBQ1gsYUFBTyxLQUFLTixNQUFMLElBQWVBLGlEQUFNLENBQUNDLE9BQTdCO0FBQ0E7QUE5QkY7QUFBQTtBQUFBLGdDQWdDYTtBQUNYLFVBQUksS0FBS0gsS0FBVCxFQUFnQixLQUFLUyxVQUFMO0FBQ2hCLEtBbENGLENBb0NDO0FBQ0E7QUFDQTs7QUF0Q0Q7QUFBQTtBQUFBLDBCQXdDT0MsSUF4Q1AsRUF3Q2E7QUFDWCxXQUFLUixNQUFMLEdBQWNBLGlEQUFNLENBQUNTLE1BQXJCO0FBQ0EsV0FBS0MsT0FBTCxDQUFhRixJQUFiO0FBQ0E7QUEzQ0Y7QUFBQTtBQUFBLHlCQTZDTUEsSUE3Q04sRUE2Q1k7QUFDVixXQUFLUixNQUFMLEdBQWNBLGlEQUFNLENBQUNXLE9BQXJCO0FBQ0EsV0FBS1QsU0FBTDtBQUNBLFdBQUtVLE1BQUwsQ0FBWUosSUFBWjtBQUNBO0FBakRGO0FBQUE7QUFBQSx3QkFtREtBLElBbkRMLEVBbURXO0FBQ1QsV0FBS1IsTUFBTCxHQUFjQSxpREFBTSxDQUFDQyxPQUFyQjtBQUNBLFdBQUtZLEtBQUwsQ0FBV0wsSUFBWDtBQUNBLEtBdERGLENBd0RDO0FBQ0E7QUFDQTs7QUExREQ7QUFBQTtBQUFBLDRCQTREU0EsSUE1RFQsRUE0RGU7QUFDYjtBQUNBO0FBOURGO0FBQUE7QUFBQSwyQkFnRVFBLElBaEVSLEVBZ0VjO0FBQ1o7QUFDQTtBQWxFRjtBQUFBO0FBQUEsMEJBb0VPQSxJQXBFUCxFQW9FYTtBQUNYO0FBQ0E7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeEVEO0FBQUE7QUFBQSw4QkF5RldNLFNBekZYLEVBeUZzQjtBQUNwQixXQUFLQyx1QkFBTCxDQUE2QkQsU0FBN0I7QUFDQTtBQUdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE5RkQ7QUFBQTtBQUFBLDBCQStHT0UsR0EvR1AsRUErR1k7QUFBRTtBQUFTO0FBRXRCOzs7Ozs7Ozs7Ozs7Ozs7QUFqSEQ7QUFBQTtBQUFBLDRCQStIU0MsSUEvSFQsRUErSGU7QUFBRTtBQUFTO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7QUFqSUQ7QUFBQTtBQUFBLDRCQStJU0EsSUEvSVQsRUErSWU7QUFBRTtBQUFTO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7QUFqSkQ7QUFBQTtBQUFBLGdDQStKYUEsSUEvSmIsRUErSm1CO0FBQUU7QUFBUyxLQS9KOUIsQ0FpS0M7QUFDQTtBQUNBOztBQW5LRDtBQUFBO0FBQUEsNENBc0t5QkgsU0F0S3pCLEVBc0tvQztBQUNsQyxVQUFNVixPQUFPLEdBQUcsS0FBS2MsVUFBTCxDQUFnQkosU0FBUyxDQUFDSyxDQUExQixDQUFoQjs7QUFFQSxVQUFJZixPQUFKLEVBQWE7QUFDWixTQUFDLEtBQUtnQixTQUFMLE1BQW9CLEtBQUtDLGFBQUwsQ0FBbUJqQixPQUFPLENBQUNrQixPQUFSLENBQWdCLENBQWhCLENBQW5CLENBQXJCLEtBQWlFLE9BQU8sS0FBS25CLGNBQVosSUFBOEIsVUFBL0YsSUFBOEcsS0FBS0EsY0FBTCxDQUFvQkMsT0FBTyxDQUFDa0IsT0FBNUIsRUFBcUNSLFNBQXJDLENBQTlHLENBRFksQ0FFWjs7QUFDQUEsaUJBQVMsQ0FBQyxRQUFELENBQVQsR0FBc0IsSUFBdEI7QUFDQTs7QUFDRCxhQUFPQSxTQUFQO0FBQ0E7QUEvS0Y7QUFBQTtBQUFBLCtCQWlMWVMsV0FqTFosRUFpTHlCO0FBQ3ZCLFVBQU1DLFlBQVksR0FBR0QsV0FBVyxDQUFDRSxJQUFaLEdBQW1CQyxLQUFuQixDQUF5QixLQUF6QixDQUFyQjs7QUFDQSxVQUFJLEtBQUtDLEtBQUwsSUFBYyxLQUFLQSxLQUFMLENBQVd0QixRQUFYLENBQW9CbUIsWUFBWSxDQUFDLENBQUQsQ0FBaEMsQ0FBbEIsRUFBd0Q7QUFDdkQ7QUFDQSxlQUFPO0FBQUNwQixpQkFBTyxFQUFHb0IsWUFBWSxDQUFDLENBQUQsQ0FBdkI7QUFBNEJGLGlCQUFPLEVBQUdFLFlBQVksQ0FBQ0ksS0FBYixDQUFtQixDQUFuQjtBQUF0QyxTQUFQO0FBQ0E7O0FBQ0QsYUFBTyxLQUFQO0FBQ0E7QUF4TEY7QUFBQTtBQUFBLG9DQTBMaUJDLE1BMUxqQixFQTBMeUJmLFNBMUx6QixFQTBMb0M7QUFDbEM7QUFBTztBQUNOLGFBQUtnQixXQUFMLENBQWlCRCxNQUFqQixLQUNRZixTQUFTLENBQUNpQixNQUFWLElBQW9CLEtBQUtELFdBQUwsQ0FBaUJELE1BQWpCLENBQXBCLElBQWdELEtBQUtDLFdBQUwsQ0FBaUJELE1BQWpCLEVBQXlCRyxPQUF6QixDQUFpQyxHQUFqQyxLQUF5QyxDQURqRyxJQUN1RztBQUMvRmxCLGlCQUFTLENBQUNHLElBQVYsSUFBa0IsS0FBS3JDLEVBQUwsQ0FBUXFELFNBQTFCLElBQXVDLEtBQUtILFdBQUwsQ0FBaUJELE1BQWpCLEVBQXlCRyxPQUF6QixDQUFpQyxHQUFqQyxLQUF5QyxDQUZ4RixJQUU4RjtBQUN0RixhQUFLRixXQUFMLENBQWlCRCxNQUFqQixFQUF5QkcsT0FBekIsQ0FBaUMsR0FBakMsS0FBeUMsQ0FKbEQsQ0FJcUQ7O0FBSnJEO0FBTUE7QUFqTUY7QUFBQTtBQUFBLHlDQW1Nc0I7QUFDcEIsYUFBTyxFQUFQO0FBQ0E7QUFyTUY7O0FBQUE7QUFBQSxJLENBeU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ROTyxJQUFNckQsVUFBYjtBQUFBO0FBQUE7QUFDQyxzQkFBWUMsRUFBWixFQUFnQjtBQUFBOztBQUFBOztBQUNkLFNBQUtBLEVBQUwsR0FBMkJBLEVBQTNCO0FBQ0EsU0FBS3NELElBQUwsR0FBMkIsRUFBM0I7QUFDQSxTQUFLOUMsZ0JBQUwsR0FBMkIsRUFBM0I7QUFDQSxTQUFLK0MsS0FBTCxHQUEyQkMsSUFBSSxDQUFDQyxHQUFMLEVBQTNCO0FBRUQsU0FBS3pELEVBQUwsQ0FBUTBELFNBQVIsQ0FBa0IsVUFBQ0MsT0FBRCxFQUFhO0FBQzlCLFdBQUksQ0FBQ0QsU0FBTCxDQUFlQyxPQUFmO0FBQ0EsS0FGRDtBQUdBLFNBQUszRCxFQUFMLENBQVE0RCxLQUFSLENBQWMsVUFBQ3hCLEdBQUQsRUFBUztBQUN0QixXQUFJLENBQUN3QixLQUFMLENBQVd4QixHQUFYO0FBQ0EsS0FGRDtBQUdBLFNBQUtwQyxFQUFMLENBQVE2RCxPQUFSLENBQWdCLFVBQUN4QixJQUFELEVBQVU7QUFDekIsV0FBSSxDQUFDd0IsT0FBTCxDQUFheEIsSUFBYjtBQUNBLEtBRkQ7QUFHQSxTQUFLckMsRUFBTCxDQUFROEQsT0FBUixDQUFnQixVQUFDekIsSUFBRCxFQUFVO0FBQ3pCLFdBQUksQ0FBQ3lCLE9BQUwsQ0FBYXpCLElBQWI7QUFDQSxLQUZEO0FBR0EsU0FBS3JDLEVBQUwsQ0FBUStELFdBQVIsQ0FBb0IsVUFBQzFCLElBQUQsRUFBVTtBQUM3QixXQUFJLENBQUMwQixXQUFMLENBQWlCMUIsSUFBakI7QUFDQSxLQUZEO0FBR0EsR0F0QkYsQ0F3QkM7QUFDQTtBQUNBOzs7QUExQkQ7QUFBQTtBQUFBLHlDQTRCc0I7QUFDcEIsYUFBTyxLQUFLaUIsSUFBTCxDQUFVVSxNQUFWLENBQWlCLFVBQUNDLE1BQUQsRUFBU0MsR0FBVCxFQUFpQjtBQUN4QyxZQUFJLE9BQU9BLEdBQUcsQ0FBQ0EsR0FBSixDQUFRekQsa0JBQWYsSUFBcUMsVUFBekMsRUFBb0Q7QUFDbkQsaUJBQU93RCxNQUFNLENBQUNFLE1BQVAsQ0FBY0QsR0FBRyxDQUFDQSxHQUFKLENBQVF6RCxrQkFBUixFQUFkLENBQVA7QUFDQTtBQUNELE9BSk0sRUFJTCxFQUpLLENBQVAsQ0FEb0IsQ0FNcEI7QUFDQSxLQW5DRixDQXFDQztBQUNBO0FBQ0E7O0FBdkNEO0FBQUE7QUFBQSx3QkF5Q0syRCxFQXpDTCxFQXlDU0YsR0F6Q1QsRUF5Q2M7QUFDWixXQUFLWixJQUFMLENBQVVlLElBQVYsQ0FBZTtBQUFDRCxVQUFFLEVBQUZBLEVBQUQ7QUFBS0YsV0FBRyxFQUFIQTtBQUFMLE9BQWY7QUFDQTtBQTNDRjtBQUFBO0FBQUEsd0JBNkNLRSxFQTdDTCxFQTZDUztBQUNQLGFBQU8sS0FBS2QsSUFBTCxDQUFVZ0IsSUFBVixDQUFlLFVBQUNDLElBQUQsRUFBVTtBQUMvQixlQUFPQSxJQUFJLENBQUNILEVBQUwsSUFBV0EsRUFBbEI7QUFDQSxPQUZNLEVBRUosS0FGSSxDQUFQO0FBR0E7QUFqREY7QUFBQTtBQUFBLDJCQW1EUUEsRUFuRFIsRUFtRFk7QUFDVixXQUFLZCxJQUFMLENBQVVrQixNQUFWLENBQWlCLEtBQUtsQixJQUFMLENBQVVtQixTQUFWLENBQW9CLFVBQUNGLElBQUQsRUFBUTtBQUM1QyxlQUFPQSxJQUFJLENBQUNILEVBQUwsSUFBV0EsRUFBbEI7QUFDQSxPQUZnQixDQUFqQixFQUVHLENBRkg7QUFHQSxLQXZERixDQXlEQztBQUNBO0FBQ0E7O0FBM0REO0FBQUE7QUFBQSw4QkE2RFdULE9BN0RYLEVBNkRvQjtBQUNsQixXQUFLTCxJQUFMLENBQVVvQixPQUFWLENBQWtCLFVBQUNSLEdBQUQsRUFBUztBQUN6QixlQUFPQSxHQUFHLENBQUNBLEdBQUosQ0FBUVIsU0FBZixJQUE0QixVQUE3QixJQUE0Q1EsR0FBRyxDQUFDQSxHQUFKLENBQVFSLFNBQVIsQ0FBa0JDLE9BQWxCLENBQTVDO0FBQ0EsT0FGRDtBQUdBO0FBakVGO0FBQUE7QUFBQSwwQkFtRU92QixHQW5FUCxFQW1FWTtBQUNWLFdBQUtrQixJQUFMLENBQVVvQixPQUFWLENBQWtCLFVBQUNSLEdBQUQsRUFBUztBQUMxQkEsV0FBRyxDQUFDQSxHQUFKLENBQVExQixTQUFSLE1BQXdCLE9BQU8wQixHQUFHLENBQUNBLEdBQUosQ0FBUU4sS0FBZixJQUF3QixVQUFoRCxJQUErRE0sR0FBRyxDQUFDQSxHQUFKLENBQVFOLEtBQVIsQ0FBY3hCLEdBQWQsQ0FBL0Q7QUFDQSxPQUZEO0FBR0E7QUF2RUY7QUFBQTtBQUFBLDRCQXlFU0MsSUF6RVQsRUF5RWU7QUFDYixXQUFLaUIsSUFBTCxDQUFVb0IsT0FBVixDQUFrQixVQUFDUixHQUFELEVBQVM7QUFDMUJBLFdBQUcsQ0FBQ0EsR0FBSixDQUFRMUIsU0FBUixNQUF3QixPQUFPMEIsR0FBRyxDQUFDQSxHQUFKLENBQVFMLE9BQWYsSUFBMEIsVUFBbEQsSUFBaUVLLEdBQUcsQ0FBQ0EsR0FBSixDQUFRTCxPQUFSLENBQWdCeEIsSUFBaEIsQ0FBakU7QUFDQSxPQUZEO0FBR0E7QUE3RUY7QUFBQTtBQUFBLDRCQStFU0EsSUEvRVQsRUErRWU7QUFDYixXQUFLaUIsSUFBTCxDQUFVb0IsT0FBVixDQUFrQixVQUFDUixHQUFELEVBQVM7QUFDMUJBLFdBQUcsQ0FBQ0EsR0FBSixDQUFRMUIsU0FBUixNQUF3QixPQUFPMEIsR0FBRyxDQUFDQSxHQUFKLENBQVFKLE9BQWYsSUFBMEIsVUFBbEQsSUFBaUVJLEdBQUcsQ0FBQ0EsR0FBSixDQUFRSixPQUFSLENBQWdCekIsSUFBaEIsQ0FBakU7QUFDQSxPQUZEO0FBR0E7QUFuRkY7QUFBQTtBQUFBLGdDQXFGYUEsSUFyRmIsRUFxRm1CO0FBQ2pCLFdBQUtpQixJQUFMLENBQVVvQixPQUFWLENBQWtCLFVBQUNSLEdBQUQsRUFBUztBQUMxQkEsV0FBRyxDQUFDQSxHQUFKLENBQVExQixTQUFSLE1BQXdCLE9BQU8wQixHQUFHLENBQUNBLEdBQUosQ0FBUUgsV0FBZixJQUE4QixVQUF0RCxJQUFxRUcsR0FBRyxDQUFDQSxHQUFKLENBQVFILFdBQVIsQ0FBb0IxQixJQUFwQixDQUFyRTtBQUNBLE9BRkQ7QUFHQTtBQXpGRjs7QUFBQTtBQUFBLEk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBRU8sSUFBTXNDLElBQWI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFFQztBQUNBO0FBQ0E7QUFKRCxnQ0FNb0JDLElBTnBCLEVBTXFDO0FBQUEsVUFBWEMsTUFBVyx1RUFBSixFQUFJO0FBQ25DLHVCQUFVQyx1REFBWSxDQUFDQyxhQUF2QixTQUF1Q0osSUFBSSxDQUFDSyxNQUFMLENBQVlGLHVEQUFZLENBQUNHLFFBQXpCLEVBQW1DSixNQUFuQyxDQUF2QywyQkFDVUMsdURBQVksQ0FBQ0ksUUFEdkIsY0FDbUNOLElBRG5DLDJCQUVVRSx1REFBWSxDQUFDSyxnQkFGdkIsU0FFMENSLElBQUksQ0FBQ0ssTUFBTCxDQUFZRix1REFBWSxDQUFDRyxRQUF6QixFQUFtQ0osTUFBbkMsQ0FGMUM7QUFHQTtBQVZGO0FBQUE7QUFBQSxrQ0FZc0JELElBWnRCLEVBWTRCUSxJQVo1QixFQVlrQztBQUNoQyx1QkFBVVQsSUFBSSxDQUFDSyxNQUFMLENBQVlJLElBQVosRUFBaUIsQ0FBakIsQ0FBViwyQkFDVVQsSUFBSSxDQUFDVSxZQUFMLENBQWtCRCxJQUFsQixDQURWLDJCQUVVVCxJQUFJLENBQUNLLE1BQUwsQ0FBWUksSUFBWixFQUFpQixDQUFqQixDQUZWO0FBR0E7QUFoQkY7QUFBQTtBQUFBLGlDQWtCcUJSLElBbEJyQixFQWtCMkJRLElBbEIzQixFQWtCaUM7QUFDL0IsVUFBSUUsS0FBSyxHQUFHVixJQUFJLENBQUM5QixLQUFMLENBQVcsSUFBWCxDQUFaO0FBQ0EsYUFBT3dDLEtBQUssQ0FBQ0MsR0FBTixDQUFVLFVBQUFDLElBQUk7QUFBQSx5QkFBT0osSUFBUCxjQUFlSSxJQUFmO0FBQUEsT0FBZCxFQUFxQ0MsSUFBckMsQ0FBMEMsSUFBMUMsQ0FBUDtBQUNBO0FBckJGO0FBQUE7QUFBQSwyQkF1QmVMLElBdkJmLEVBdUJxQk0sS0F2QnJCLEVBdUI0QjtBQUMxQixVQUFJekIsTUFBTSxHQUFHLEVBQWI7O0FBQ0EsYUFBTXlCLEtBQUssRUFBWDtBQUFlekIsY0FBTSxJQUFJbUIsSUFBVjtBQUFmOztBQUNBLGFBQU9uQixNQUFQO0FBQ0EsS0EzQkYsQ0E2QkM7QUFDQTtBQUNBOztBQS9CRDtBQUFBO0FBQUEsK0JBaUNrRjtBQUFBOztBQUFBLDRCQUFwRTBCLEtBQW9FO0FBQUEsVUFBcEVBLEtBQW9FLDJCQUE5RCxFQUE4RDtBQUFBLDJCQUExRHRELElBQTBEO0FBQUEsVUFBMURBLElBQTBELDBCQUFuRCxFQUFtRDtBQUFBLDhCQUEvQ3VELE9BQStDO0FBQUEsVUFBL0NBLE9BQStDLDZCQUFyQyxLQUFxQztBQUFBLFVBQTlCOUUsS0FBOEIsUUFBOUJBLEtBQThCO0FBQUEsVUFBdkIrRSxVQUF1QixRQUF2QkEsVUFBdUI7QUFBQSxVQUFYakIsSUFBVyxRQUFYQSxJQUFXO0FBQUEsVUFBTDVFLEVBQUssUUFBTEEsRUFBSztBQUNoRjRGLGFBQU8sYUFBMkIsQ0FBQzlFLEtBQUQsRUFBUStFLFVBQVIsQ0FBM0IsRUFBTUEsVUFBTixhQUFrQi9FLEtBQWxCLG1CQUFQO0FBQ0FkLFFBQUUsQ0FBQzhGLFVBQUgsQ0FBY2xCLElBQWQsRUFBb0J2QyxJQUFwQixFQUEwQndELFVBQTFCLEVBQXNDL0UsS0FBdEMsRUFBNkMsUUFBN0MsRUFBdUQ2RSxLQUF2RDtBQUNBO0FBcENGO0FBQUE7QUFBQSxvQ0FzQ3NGO0FBQUE7O0FBQUEsOEJBQXBFQSxLQUFvRTtBQUFBLFVBQXBFQSxLQUFvRSw0QkFBOUQsRUFBOEQ7QUFBQSw2QkFBMUR0RCxJQUEwRDtBQUFBLFVBQTFEQSxJQUEwRCwyQkFBbkQsRUFBbUQ7QUFBQSxnQ0FBL0N1RCxPQUErQztBQUFBLFVBQS9DQSxPQUErQyw4QkFBckMsS0FBcUM7QUFBQSxVQUE5QjlFLEtBQThCLFNBQTlCQSxLQUE4QjtBQUFBLFVBQXZCK0UsVUFBdUIsU0FBdkJBLFVBQXVCO0FBQUEsVUFBWGpCLElBQVcsU0FBWEEsSUFBVztBQUFBLFVBQUw1RSxFQUFLLFNBQUxBLEVBQUs7QUFDcEY0RixhQUFPLGFBQTJCLENBQUM5RSxLQUFELEVBQVErRSxVQUFSLENBQTNCLEVBQU1BLFVBQU4sYUFBa0IvRSxLQUFsQixtQkFBUDtBQUNBZCxRQUFFLENBQUM4RixVQUFILENBQWNsQixJQUFkLEVBQW9CdkMsSUFBcEIsRUFBMEJ3RCxVQUExQixFQUFzQy9FLEtBQXRDLEVBQTZDLE1BQTdDLEVBQXFENkUsS0FBckQ7QUFDQTtBQXpDRjs7QUFBQTtBQUFBLEk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRkE7QUFDQTtBQUNBO0FBRU8sSUFBTXpGLFFBQWI7QUFBQTtBQUFBO0FBQUE7O0FBWUMsb0JBQVlKLEdBQVosRUFBaUJFLEVBQWpCLEVBQXFCO0FBQUE7O0FBQUE7O0FBQ3BCLGtGQUFNRixHQUFOLEVBQVdFLEVBQVg7QUFEb0IsVUFYckIrRixJQVdxQixHQVhILHVCQVdHO0FBQUEsVUFWckJDLFdBVXFCLEdBVkgsb0RBVUc7QUFBQSxVQVRyQmpELEtBU3FCLEdBVEgsQ0FBQyxNQUFELEVBQVEsTUFBUixDQVNHO0FBQUEsVUFSckJHLFdBUXFCLEdBUkg7QUFDakIsa0JBQVcsSUFETTtBQUVqQixrQkFBVztBQUZNLEtBUUc7QUFBQSxVQUhsQitDLGVBR2tCLEdBSEEsU0FHQTtBQUFBLFVBRnJCcEYsZUFFcUIsR0FGSCxTQUVHO0FBRXBCLFVBQUtGLEtBQUwsR0FBaUIsTUFBS3VGLGNBQUwsQ0FBb0J4Rix3REFBUyxDQUFDQyxLQUE5QixDQUFqQjtBQUNBLFVBQUt3RixTQUFMLEdBQWlCLE1BQUtELGNBQUwsQ0FBb0J4Rix3REFBUyxDQUFDQSxTQUE5QixDQUFqQjtBQUhvQjtBQUlwQjs7QUFoQkY7QUFBQTtBQUFBLDhCQWtCV2lELE9BbEJYLEVBa0JvQjtBQUNsQixXQUFLeEIsdUJBQUwsQ0FBNkJ3QixPQUE3Qjs7QUFDQSxVQUFJLENBQUNBLE9BQU8sQ0FBQyxRQUFELENBQVIsSUFBc0IsQ0FBQyxLQUFLeUMsT0FBTCxDQUFhekMsT0FBTyxDQUFDcEIsQ0FBckIsQ0FBM0IsRUFBb0Q7QUFDbkQsWUFBSSxLQUFLNUIsS0FBTCxDQUFXYyxRQUFYLENBQW9Ca0MsT0FBTyxDQUFDdEIsSUFBUixDQUFhZ0UsV0FBYixFQUFwQixDQUFKLEVBQXFEO0FBQ3BEMUMsaUJBQU8sQ0FBQyxRQUFELENBQVAsR0FBb0IsSUFBcEI7QUFDQSxTQUZELE1BRU8sSUFBSSxDQUFDLEtBQUsyQyxZQUFMLENBQWtCM0MsT0FBbEIsQ0FBTCxFQUFpQztBQUN2QyxlQUFLNEMsV0FBTCxDQUFpQjVDLE9BQU8sQ0FBQ3BCLENBQXpCLEVBQTRCb0IsT0FBTyxDQUFDdEIsSUFBcEM7QUFDQXNCLGlCQUFPLENBQUMsUUFBRCxDQUFQLEdBQW9CLElBQXBCO0FBQ0E7QUFDRDs7QUFDRCxhQUFPQSxPQUFQO0FBQ0E7QUE3QkY7QUFBQTtBQUFBLGlDQStCY0EsT0EvQmQsRUErQnVCO0FBQ3JCLGFBQU8sS0FBSzNELEVBQUwsQ0FBUXFELFNBQVIsSUFBcUJNLE9BQU8sQ0FBQ3RCLElBQTdCLElBQXFDc0IsT0FBTyxDQUFDUixNQUFwRDtBQUNBO0FBakNGO0FBQUE7QUFBQSw0QkFtQ1N5QixJQW5DVCxFQW1DZTtBQUNiLGFBQU8sQ0FBQyxLQUFLNEIsV0FBTCxDQUFpQjVCLElBQUksQ0FBQ3lCLFdBQUwsRUFBakIsQ0FBUjtBQUNBO0FBckNGO0FBQUE7QUFBQSxtQ0F1Q2dCM0QsT0F2Q2hCLEVBdUN5QmlCLE9BdkN6QixFQXVDa0M7QUFBQTs7QUFDaEMsVUFBSSxDQUFDLEtBQUs4QyxlQUFMLENBQXFCL0QsT0FBTyxDQUFDLENBQUQsQ0FBNUIsRUFBaUNpQixPQUFqQyxDQUFMLEVBQWdEO0FBQy9DO0FBQ0EsT0FIK0IsQ0FJaEM7OztBQUNBLFVBQUlqQixPQUFPLENBQUNtQyxNQUFSLEdBQWlCLENBQWpCLElBQXNCbkMsT0FBTyxDQUFDLENBQUQsQ0FBUCxJQUFjLFVBQXhDLEVBQW9EO0FBQ25EQSxlQUFPLENBQUNNLEtBQVIsQ0FBYyxDQUFkLEVBQWlCMEIsT0FBakIsQ0FBeUIsVUFBQ3JDLElBQUQsRUFBVTtBQUNsQyxjQUFJLENBQUMsTUFBSSxDQUFDMUIsS0FBTCxDQUFXYyxRQUFYLENBQW9CWSxJQUFwQixDQUFMLEVBQStCO0FBQzlCLGtCQUFJLENBQUMxQixLQUFMLENBQVcwRCxJQUFYLENBQWdCaEMsSUFBaEI7O0FBQ0FzQyx5REFBSSxDQUFDK0IsSUFBTCxDQUFVO0FBQUNyRSxrQkFBSSxFQUFFc0IsT0FBTyxDQUFDdEIsSUFBZjtBQUFxQnVDLGtCQUFJLGlCQUFVdkMsSUFBVixxQ0FBekI7QUFBMkV2QixtQkFBSyxFQUFFLE1BQUksQ0FBQ21GLGVBQXZGO0FBQXdHSix3QkFBVSxFQUFFLE1BQUksQ0FBQ2hGLGVBQXpIO0FBQTBJYixnQkFBRSxFQUFFLE1BQUksQ0FBQ0E7QUFBbkosYUFBVjtBQUNBO0FBQ0QsU0FMRDtBQU1BLE9BWitCLENBYWhDOzs7QUFDQSxVQUFJMEMsT0FBTyxDQUFDbUMsTUFBUixHQUFpQixDQUFqQixJQUFzQm5DLE9BQU8sQ0FBQyxDQUFELENBQVAsSUFBYyxVQUF4QyxFQUFvRDtBQUNuRCxZQUFNYSxLQUFLLEdBQUdJLE9BQU8sQ0FBQ3BCLENBQVIsQ0FBVWEsT0FBVixDQUFrQixVQUFsQixJQUFnQyxXQUFXeUIsTUFBekQ7QUFBQSxZQUNNRCxJQUFJLEdBQUlqQixPQUFPLENBQUNwQixDQUFSLENBQVVTLEtBQVYsQ0FBZ0JPLEtBQWhCLEVBQXVCVixJQUF2QixFQURkOztBQUVBLFlBQUksQ0FBQyxLQUFLc0QsU0FBTCxDQUFlMUUsUUFBZixDQUF3Qm1ELElBQXhCLENBQUwsRUFBbUM7QUFDbEMsZUFBS3VCLFNBQUwsQ0FBZTlCLElBQWYsQ0FBb0IsS0FBS3NDLEtBQUwsQ0FBVy9CLElBQVgsQ0FBcEI7QUFDQUQsdURBQUksQ0FBQytCLElBQUwsQ0FBVTtBQUFDckUsZ0JBQUksRUFBRXNCLE9BQU8sQ0FBQ3RCLElBQWY7QUFBcUJ1QyxnQkFBSSxZQUFLQSxJQUFMLHFDQUF6QjtBQUFzRTlELGlCQUFLLEVBQUUsS0FBS21GLGVBQWxGO0FBQW1HSixzQkFBVSxFQUFFLEtBQUtoRixlQUFwSDtBQUFxSWIsY0FBRSxFQUFFLEtBQUtBO0FBQTlJLFdBQVY7QUFDQTtBQUNEO0FBQ0Q7QUE3REY7QUFBQTtBQUFBLGdDQStEYTRFLElBL0RiLEVBK0RtQjtBQUNqQixhQUFPLEtBQUt1QixTQUFMLENBQWVTLElBQWYsQ0FBb0IsVUFBQUMsT0FBTyxFQUFJO0FBQ3JDLFlBQUksT0FBT0EsT0FBUCxJQUFrQixRQUF0QixFQUNDLE9BQU9qQyxJQUFJLENBQUN5QixXQUFMLEdBQW1CNUUsUUFBbkIsQ0FBNEJvRixPQUE1QixDQUFQOztBQUNELFlBQUksUUFBT0EsT0FBUCxLQUFrQixRQUF0QixFQUErQjtBQUM5QixpQkFBT0EsT0FBTyxDQUFDQyxJQUFSLENBQWFsQyxJQUFJLENBQUN5QixXQUFMLEVBQWIsQ0FBUDtBQUNBO0FBQ0QsT0FOTSxDQUFQO0FBT0E7QUFFRDs7Ozs7QUF6RUQ7QUFBQTtBQUFBLG1DQTZFZ0JGLFNBN0VoQixFQTZFMkI7QUFBQTs7QUFDekIsYUFBT0EsU0FBUyxDQUFDWixHQUFWLENBQWMsVUFBQWhCLElBQUksRUFBSTtBQUM1QixlQUFPLE1BQUksQ0FBQ29DLEtBQUwsQ0FBV3BDLElBQVgsQ0FBUDtBQUNBLE9BRk0sQ0FBUDtBQUdBO0FBRUQ7Ozs7O0FBbkZEO0FBQUE7QUFBQSwwQkF1Rk9LLElBdkZQLEVBdUZZO0FBQ1YsVUFBSSxXQUFXa0MsSUFBWCxDQUFnQmxDLElBQWhCLENBQUosRUFBMkI7QUFDMUIsZUFBTyxJQUFJbUMsTUFBSixDQUFXbkMsSUFBSSxDQUFDNUIsS0FBTCxDQUFXLENBQVgsRUFBYSxDQUFDLENBQWQsQ0FBWCxDQUFQO0FBQ0E7O0FBQ0QsYUFBTzRCLElBQUksQ0FBQ3lCLFdBQUwsRUFBUDtBQUNBO0FBNUZGO0FBQUE7QUFBQSxnQ0E4RmExQyxPQTlGYixFQThGc0J0QixJQTlGdEIsRUE4RjRCO0FBQzFCLFVBQU1yQyxFQUFFLEdBQUcsS0FBS0EsRUFBaEI7QUFBQSxVQUNHNEUsSUFBSSxzQkFBZWpCLE9BQWYsc0JBQWtDdEIsSUFBbEMsc0NBRFA7QUFHQXNDLG1EQUFJLENBQUMrQixJQUFMLENBQVU7QUFBQ2YsYUFBSyxFQUFDLEtBQVA7QUFBY2YsWUFBSSxFQUFKQSxJQUFkO0FBQW9COUQsYUFBSyxFQUFFLEtBQUttRixlQUFoQztBQUFpREosa0JBQVUsRUFBRSxLQUFLaEYsZUFBbEU7QUFBbUZiLFVBQUUsRUFBRkE7QUFBbkYsT0FBVjtBQUNBMkUsbURBQUksQ0FBQytCLElBQUwsQ0FBVTtBQUFDckUsWUFBSSxFQUFFLEtBQUtyQyxFQUFMLENBQVFxRCxTQUFmO0FBQTBCdUIsWUFBSSxFQUFKQSxJQUExQjtBQUFnQzlELGFBQUssRUFBRSxLQUFLbUYsZUFBNUM7QUFBNkRKLGtCQUFVLEVBQUUsS0FBS2hGLGVBQTlFO0FBQStGYixVQUFFLEVBQUZBO0FBQS9GLE9BQVY7QUFDQTtBQXBHRjs7QUFBQTtBQUFBLEVBQThCWSwyQ0FBOUIsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSkE7QUFFTyxJQUFNTixTQUFiO0FBQUE7QUFBQTtBQUFBOztBQUdDLHFCQUFZUixHQUFaLEVBQWlCRSxFQUFqQixFQUFvQjtBQUFBOztBQUFBOztBQUNuQixtRkFBTUYsR0FBTixFQUFVRSxFQUFWO0FBRG1CLFVBRmpCK0YsSUFFaUIsR0FGVixlQUVVO0FBQUE7QUFFbkI7O0FBTEY7QUFBQTtBQUFBLDhCQU9XaUIsR0FQWCxFQU9nQjtBQUNkLFVBQU1DLE1BQU0sR0FBRyxLQUFLbkgsR0FBTCxDQUFTb0gsR0FBVCxDQUFhLFFBQWIsRUFBdUJoRyxLQUF2QixDQUE2QmlHLFdBQTdCLENBQXlDSCxHQUFHLENBQUMzRSxJQUE3QyxDQUFmO0FBQUEsVUFDWStFLE1BQU0sR0FBR0gsTUFBTSxHQUFHLENBQVQsY0FBaUJBLE1BQWpCLFVBQTRCLEVBRGpEO0FBRU1ELFNBQUcsQ0FBQ3pFLENBQUosYUFBVzZFLE1BQVgsU0FBb0JKLEdBQUcsQ0FBQ3pFLENBQXhCO0FBQ047QUFYRjs7QUFBQTtBQUFBLEVBQStCM0IsMkNBQS9CLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRkE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHTyxJQUFNVCxRQUFiO0FBQUE7QUFBQTtBQUFBOztBQVNDLG9CQUFZTCxHQUFaLEVBQWlCRSxFQUFqQixFQUFvQztBQUFBOztBQUFBLFFBQWZxSCxRQUFlLHVFQUFKLEVBQUk7O0FBQUE7O0FBQ25DLGtGQUFNdkgsR0FBTixFQUFXRSxFQUFYO0FBRG1DLFVBUnBDK0YsSUFRb0MsR0FSbEIsY0FRa0I7QUFBQSxVQVBwQ0MsV0FPb0MsR0FQbEIsa0NBT2tCO0FBQUEsVUFOcENqRCxLQU1vQyxHQU5sQixDQUFDLE1BQUQsRUFBUSxNQUFSLENBTWtCO0FBQUEsVUFMcENHLFdBS29DLEdBTGxCO0FBQ2pCLFdBQUs7QUFEWSxLQUtrQjtBQUFBLFVBRnBDMEIsSUFFb0MsR0FGbEIsRUFFa0I7QUFFbkN5QyxZQUFRLENBQUN2RyxLQUFULEtBQTZCLE1BQUtBLEtBQUwsR0FBYXVHLFFBQVEsQ0FBQ3ZHLEtBQW5EO0FBQ0F1RyxZQUFRLENBQUN4RyxlQUFULEtBQTZCLE1BQUtBLGVBQUwsR0FBdUJ3RyxRQUFRLENBQUN4RyxlQUE3RDtBQUhtQztBQUluQzs7QUFiRjtBQUFBO0FBQUEsbUNBZWdCNkIsT0FmaEIsRUFleUJSLFNBZnpCLEVBZW9DO0FBQ2xDLFVBQUksQ0FBQyxLQUFLdUUsZUFBTCxDQUFxQi9ELE9BQU8sQ0FBQyxDQUFELENBQTVCLEVBQWlDUixTQUFqQyxDQUFMLEVBQWtEO0FBQ2pEO0FBQ0E7O0FBRUQsV0FBSzBDLElBQUwsR0FBWWxDLE9BQU8sQ0FBQytDLElBQVIsQ0FBYSxHQUFiLENBQVo7QUFDQSxXQUFLYixJQUFMLEdBQVlELDZDQUFJLENBQUMyQyxXQUFMLENBQWlCLEtBQUsxQyxJQUF0QixDQUFaO0FBQ0FELG1EQUFJLENBQUMrQixJQUFMLENBQVU7QUFBQzFHLFVBQUUsRUFBQyxLQUFLQSxFQUFUO0FBQWE0RSxZQUFJLEVBQUUsS0FBS0E7QUFBeEIsT0FBVjtBQUNBO0FBdkJGO0FBQUE7QUFBQSw0QkF5QlN2QyxJQXpCVCxFQXlCZTtBQUNic0MsbURBQUksQ0FBQytCLElBQUwsQ0FBVTtBQUFDMUcsVUFBRSxFQUFDLEtBQUtBLEVBQVQ7QUFBYXFDLFlBQUksRUFBQ0EsSUFBSSxDQUFDQSxJQUF2QjtBQUE2QnVDLFlBQUksa0JBQVd2QyxJQUFJLENBQUNBLElBQWhCO0FBQWpDLE9BQVY7QUFDQTtBQTNCRjs7QUFBQTtBQUFBLEVBQThCekIsMkNBQTlCLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUE8sSUFBTU8sS0FBYjtBQUFBO0FBQUE7QUFHQyxpQkFBWXJCLEdBQVosRUFBaUJFLEVBQWpCLEVBQXFCO0FBQUE7O0FBQUEsU0FGckIrRixJQUVxQixHQUZkLE9BRWM7QUFDcEIsU0FBS2pHLEdBQUwsR0FBV0EsR0FBWDtBQUNBLFNBQUtFLEVBQUwsR0FBVUEsRUFBVjtBQUNBLFNBQUt1SCxPQUFMLEdBQWUsRUFBZjtBQUNBO0FBRUQ7Ozs7Ozs7QUFURDtBQUFBO0FBQUEsMkJBY1FuRixHQWRSLEVBY2E7QUFDTCxVQUFNb0YsT0FBTyxHQUFHO0FBQ3JCQyxZQUFJLEVBQUUsS0FBS0MsVUFBTCxFQURlO0FBRXJCQyxlQUFPLEVBQUMsS0FBS0MsVUFBTDtBQUZhLE9BQWhCO0FBSU4sV0FBS0wsT0FBTCxDQUFhbEQsSUFBYixDQUFrQjtBQUNqQndELGdCQUFRLEVBQUV6RixHQUFHLENBQUMwRixTQURHO0FBRWpCQyxjQUFNLEVBQUkzRixHQUFHLENBQUMyRixNQUZHO0FBR2pCQyxXQUFHLEVBQU81RixHQUFHLENBQUM2RixvQkFIRztBQUlqQkMsWUFBSSxFQUFNMUUsSUFBSSxDQUFDQyxHQUFMO0FBSk8sT0FBbEI7QUFPTSxVQUFNMEUsT0FBTyxHQUFHO0FBQ3JCVixZQUFJLEVBQUUsS0FBS0MsVUFBTCxFQURlO0FBRXJCQyxlQUFPLEVBQUMsS0FBS0MsVUFBTDtBQUZhLE9BQWhCO0FBQUEsVUFJTFEsT0FBTyxHQUFHWixPQUFPLENBQUNDLElBQVIsQ0FBYUksUUFBYixJQUF5Qk0sT0FBTyxDQUFDVixJQUFSLENBQWFJLFFBQXRDLEdBQWlELEVBQWpELEdBQXFETSxPQUFPLENBQUNWLElBSmxFO0FBQUEsVUFLTFksVUFBVSxHQUFHYixPQUFPLENBQUNHLE9BQVIsQ0FBZ0JJLE1BQWhCLElBQTBCSSxPQUFPLENBQUNSLE9BQVIsQ0FBZ0JJLE1BQTFDLEdBQW1ELEVBQW5ELEdBQXVESSxPQUFPLENBQUNSLE9BTHZFO0FBT04sYUFBTztBQUNORixZQUFJLEVBQUVXLE9BREE7QUFFTlQsZUFBTyxFQUFFVTtBQUZILE9BQVA7QUFJQTtBQXJDRjtBQUFBO0FBQUEsMEJBdUNPO0FBQ0wsYUFBTyxLQUFLZCxPQUFMLENBQWF2RCxNQUFiLENBQW9CLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQsRUFBMEI7QUFDcEQsZUFBT0QsV0FBVyxHQUFHQyxPQUFPLENBQUNSLE1BQTdCO0FBQ0EsT0FGTSxFQUVKLENBRkksQ0FBUDtBQUdBO0FBM0NGO0FBQUE7QUFBQSxnQ0E2Q2E7QUFDWCxVQUFNUyxPQUFPLEdBQUcsQ0FBQ2hGLElBQUksQ0FBQ0MsR0FBTCxLQUFhLEtBQUszRCxHQUFMLENBQVN5RCxLQUF2QixLQUErQixLQUFHLElBQWxDLENBQWhCO0FBQ0EsYUFBT2tGLFVBQVUsQ0FBQyxDQUFDLEtBQUtDLEdBQUwsS0FBV0YsT0FBWixFQUFxQkcsT0FBckIsQ0FBNkIsQ0FBN0IsQ0FBRCxDQUFqQjtBQUNBO0FBaERGO0FBQUE7QUFBQSxvQ0FrRGlCO0FBQ2YsYUFBTyxLQUFLcEIsT0FBTCxDQUFhdkQsTUFBYixDQUFvQixVQUFDc0UsV0FBRCxFQUFhQyxPQUFiLEVBQXVCO0FBQ2pELFlBQUlLLEtBQUssR0FBR04sV0FBVyxDQUFDaEUsSUFBWixDQUFpQixVQUFBQyxJQUFJO0FBQUEsaUJBQUlBLElBQUksQ0FBQ3NELFFBQUwsSUFBaUJVLE9BQU8sQ0FBQ1YsUUFBN0I7QUFBQSxTQUFyQixDQUFaOztBQUNBLFlBQUcsQ0FBQ2UsS0FBSixFQUFXO0FBQ1ZBLGVBQUssR0FBRztBQUFDZixvQkFBUSxFQUFFVSxPQUFPLENBQUNWLFFBQW5CO0FBQTZCRSxrQkFBTSxFQUFFO0FBQXJDLFdBQVI7QUFDQU8scUJBQVcsQ0FBQ2pFLElBQVosQ0FBaUJ1RSxLQUFqQjtBQUNBOztBQUNEQSxhQUFLLENBQUNiLE1BQU4sR0FBZWMsSUFBSSxDQUFDQyxHQUFMLENBQVNGLEtBQUssQ0FBQ2IsTUFBZixFQUF1QlEsT0FBTyxDQUFDUixNQUEvQixDQUFmO0FBQ0EsZUFBT08sV0FBUDtBQUNBLE9BUk0sRUFRTCxFQVJLLEVBUURTLElBUkMsQ0FRSSxVQUFDQyxDQUFELEVBQUlDLENBQUosRUFBVTtBQUNwQixlQUFPQSxDQUFDLENBQUNsQixNQUFGLEdBQVdpQixDQUFDLENBQUNqQixNQUFwQjtBQUNBLE9BVk0sQ0FBUDtBQVdBO0FBOURGO0FBQUE7QUFBQSxpQ0FnRWM7QUFDWixhQUFPLEtBQUttQixhQUFMLEdBQXFCLENBQXJCLEtBQTJCO0FBQUNyQixnQkFBUSxFQUFFLEVBQVg7QUFBZUUsY0FBTSxFQUFDO0FBQXRCLE9BQWxDO0FBQ0E7QUFsRUY7QUFBQTtBQUFBLGdDQW9FYTtBQUNYLGFBQU8sS0FBS1IsT0FBTCxDQUFhdkQsTUFBYixDQUFvQixVQUFDc0UsV0FBRCxFQUFhQyxPQUFiLEVBQXVCO0FBQ2pELFlBQUlLLEtBQUssR0FBR04sV0FBVyxDQUFDaEUsSUFBWixDQUFpQixVQUFBQyxJQUFJO0FBQUEsaUJBQUlBLElBQUksQ0FBQ3NELFFBQUwsSUFBaUJVLE9BQU8sQ0FBQ1YsUUFBN0I7QUFBQSxTQUFyQixDQUFaOztBQUNBLFlBQUcsQ0FBQ2UsS0FBSixFQUFXO0FBQ1ZBLGVBQUssR0FBRztBQUFDZixvQkFBUSxFQUFFVSxPQUFPLENBQUNWLFFBQW5CO0FBQTZCRSxrQkFBTSxFQUFFO0FBQXJDLFdBQVI7QUFDQU8scUJBQVcsQ0FBQ2pFLElBQVosQ0FBaUJ1RSxLQUFqQjtBQUNBOztBQUNEQSxhQUFLLENBQUNiLE1BQU4sSUFBa0JRLE9BQU8sQ0FBQ1IsTUFBMUI7QUFDQSxlQUFPTyxXQUFQO0FBQ0EsT0FSTSxFQVFMLEVBUkssRUFRRFMsSUFSQyxDQVFJLFVBQUNDLENBQUQsRUFBSUMsQ0FBSixFQUFVO0FBQ3BCLGVBQU9BLENBQUMsQ0FBQ2xCLE1BQUYsR0FBV2lCLENBQUMsQ0FBQ2pCLE1BQXBCO0FBQ0EsT0FWTSxDQUFQO0FBV0E7QUFoRkY7QUFBQTtBQUFBLGlDQWtGYztBQUNaLGFBQU8sS0FBS29CLFNBQUwsR0FBaUIsQ0FBakIsS0FBdUI7QUFBQ3RCLGdCQUFRLEVBQUUsRUFBWDtBQUFlRSxjQUFNLEVBQUM7QUFBdEIsT0FBOUI7QUFDQTtBQXBGRjtBQUFBO0FBQUEsZ0NBc0ZhRixRQXRGYixFQXNGdUI7QUFDckIsYUFBTyxLQUFLTixPQUFMLENBQWE2QixNQUFiLENBQW9CLFVBQUE3RSxJQUFJLEVBQUk7QUFDbEMsZUFBT3NELFFBQVEsSUFBSXRELElBQUksQ0FBQ3NELFFBQXhCO0FBQ0EsT0FGTSxFQUVKN0QsTUFGSSxDQUVHLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQsRUFBMEI7QUFDbkMsZUFBT0QsV0FBVyxHQUFHQyxPQUFPLENBQUNSLE1BQTdCO0FBQ0EsT0FKTSxFQUlKLENBSkksQ0FBUDtBQUtBO0FBNUZGO0FBQUE7QUFBQSxrQ0E4RmU7QUFDYixhQUFPLEtBQUtSLE9BQUwsQ0FBYTZCLE1BQWIsQ0FBb0IsVUFBQTdFLElBQUksRUFBSTtBQUNsQyxlQUFPQSxJQUFJLENBQUN5RCxHQUFaO0FBQ0EsT0FGTSxFQUVKaEUsTUFGSSxDQUVHLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQsRUFBMEI7QUFDbkMsZUFBT0QsV0FBVyxHQUFHQyxPQUFPLENBQUNSLE1BQTdCO0FBQ0EsT0FKTSxFQUlKLENBSkksQ0FBUDtBQUtBO0FBcEdGO0FBQUE7QUFBQSwrQkFzR1k7QUFDVixhQUFPLEtBQUtSLE9BQUwsQ0FBYThCLE9BQWIsR0FBdUI5RCxHQUF2QixDQUEyQixVQUFDaEIsSUFBRCxFQUFVO0FBQzNDLHlCQUFVQSxJQUFJLENBQUNzRCxRQUFmLGVBQTRCdEQsSUFBSSxDQUFDd0QsTUFBakMsc0JBQW1ENUcsS0FBSyxDQUFDbUksTUFBTixDQUFhL0UsSUFBSSxDQUFDMkQsSUFBbEIsQ0FBbkQ7QUFDQSxPQUZNLEVBRUp6QyxJQUZJLENBRUMsSUFGRCxDQUFQO0FBR0E7QUExR0Y7QUFBQTtBQUFBLGlDQTRHYztBQUNaLFdBQUs4QixPQUFMLEdBQWUsRUFBZjtBQUNBO0FBOUdGO0FBQUE7QUFBQSwyQkFnSGVnQyxXQWhIZixFQWdINEI7QUFDMUIsVUFBTUMsT0FBTyxHQUFHWCxJQUFJLENBQUNZLEtBQUwsQ0FBV0YsV0FBVyxHQUFHLElBQXpCLENBQWhCO0FBQ0EsVUFBTUcsQ0FBQyxHQUFHYixJQUFJLENBQUNZLEtBQUwsQ0FBV0QsT0FBTyxHQUFHLElBQXJCLENBQVY7QUFDQSxVQUFNakgsQ0FBQyxHQUFHc0csSUFBSSxDQUFDWSxLQUFMLENBQVlELE9BQU8sR0FBRyxJQUFYLEdBQW1CLEVBQTlCLENBQVY7QUFDQSxVQUFNRyxDQUFDLEdBQUdILE9BQU8sR0FBRyxFQUFwQjtBQUNBLGFBQU8sQ0FBQ0UsQ0FBQyxHQUFHLENBQUosR0FBUUEsQ0FBQyxHQUFHLE1BQUosSUFBY0EsQ0FBQyxHQUFHLENBQUosR0FBUSxJQUFSLEdBQWUsR0FBN0IsQ0FBUixHQUE0QyxFQUE3QyxLQUFvREMsQ0FBQyxJQUFJLENBQUwsSUFBVXBILENBQUMsR0FBRyxDQUFkLEdBQWtCLE1BQWxCLEdBQTJCLEVBQS9FLEtBQ09BLENBQUMsR0FBRyxDQUFKLEdBQVFBLENBQUMsR0FBRyxRQUFKLElBQWdCQSxDQUFDLEdBQUcsQ0FBSixHQUFRLElBQVIsR0FBZSxHQUEvQixDQUFSLEdBQThDLEVBRHJELEtBQzREb0gsQ0FBQyxHQUFHLENBQUosSUFBU0QsQ0FBQyxHQUFHbkgsQ0FBSixHQUFRLENBQWpCLEdBQXFCLE1BQXJCLEdBQThCLEVBRDFGLEtBRU9vSCxDQUFDLEdBQUcsQ0FBSixHQUFRQSxDQUFDLEdBQUcsUUFBSixJQUFnQkEsQ0FBQyxHQUFHLENBQUosR0FBUSxJQUFSLEdBQWUsR0FBL0IsQ0FBUixHQUE4QyxFQUZyRCxJQUUyRCxLQUZsRTtBQUdBO0FBeEhGOztBQUFBO0FBQUEsSTs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFPLElBQU12SSxNQUFNLEdBQUc7QUFDckJXLFNBQU8sRUFBRSxDQUFDLENBRFc7QUFFckJGLFFBQU0sRUFBRSxDQUZhO0FBR3JCUixTQUFPLEVBQUU7QUFIWSxDQUFmLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQVA7QUFDTyxJQUFNZCxhQUFiO0FBQUE7QUFBQTtBQUFBOztBQVdJO0FBQ0g7QUFJQSx5QkFBWVQsR0FBWixFQUFpQkUsRUFBakIsRUFBcUI7QUFBQTs7QUFBQTs7QUFDcEIsdUZBQU1GLEdBQU4sRUFBVUUsRUFBVjtBQURvQixVQWZyQitGLElBZXFCLEdBZkgsb0JBZUc7QUFBQSxVQWRyQkMsV0FjcUIsR0FkSCx5Q0FjRztBQUFBLFVBYmxCakQsS0Fha0IsR0FiQSxDQUFDLFNBQUQsRUFBVyxTQUFYLENBYUE7QUFBQSxVQVpsQkcsV0FZa0IsR0FaQTtBQUFDLGFBQU8sSUFBUjtBQUNkLGNBQVEsSUFETTtBQUVkLFlBQVEsSUFGTTtBQUdDLGNBQVEsR0FIVDtBQUlDLGFBQVEsR0FKVDtBQUtDLGVBQVE7QUFMVCxLQVlBO0FBQUEsVUFIckIwRyxtQkFHcUIsR0FIQyxFQUdEO0FBRXBCLFVBQUtDLE1BQUwsR0FBYztBQUNiLGNBQVMsQ0FDUixpQ0FEUSxFQUVSLHlDQUZRLENBREk7QUFLYixZQUFLLENBQ0oscUNBREksRUFFSixpREFGSSxFQUdKLDhEQUhJLENBTFE7QUFVYixjQUFPLENBQ04sNkJBRE0sRUFFTiwwQkFGTSxDQVZNO0FBY2IsaUJBQVUsQ0FDVCwwQkFEUyxFQUVULGdDQUZTLENBZEc7QUFrQmIsZ0JBQVUsQ0FDVCw4QkFEUyxFQUVULHFCQUZTLEVBR1QsWUFIUyxDQWxCRztBQXVCYixpQkFBVSxDQUNULCtCQURTLENBdkJHO0FBMEJiLGVBQVUsQ0FDVCxxQ0FEUyxFQUVULCtEQUZTLENBMUJHO0FBOEJiLGVBQVMsQ0FDUixrRkFEUSxFQUVSLHVGQUZRO0FBOUJJLEtBQWQ7O0FBcUNBLFVBQUtDLFVBQUwsQ0FBZ0I5SixFQUFoQjs7QUFDQSxVQUFLK0osVUFBTDs7QUF4Q29CO0FBeUNwQjs7QUF6REY7QUFBQTtBQUFBLGlDQTJEYztBQUFBOztBQUNaLFdBQUtGLE1BQUwsR0FBY0csTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS0osTUFBakIsRUFBeUJkLElBQXpCLENBQThCLFVBQUNDLENBQUQsRUFBR0MsQ0FBSCxFQUFTO0FBQ3BELFlBQUdELENBQUMsQ0FBQzVGLE9BQUYsQ0FBVSxHQUFWLElBQWlCLENBQWpCLElBQXNCNkYsQ0FBQyxDQUFDN0YsT0FBRixDQUFVLEdBQVYsSUFBaUIsQ0FBMUMsRUFDQyxPQUFPOEcsUUFBUSxDQUFDbEIsQ0FBRCxDQUFSLEdBQWNrQixRQUFRLENBQUNqQixDQUFELENBQTdCO0FBQ0QsWUFBR0QsQ0FBQyxDQUFDNUYsT0FBRixDQUFVLEdBQVYsSUFBaUIsQ0FBakIsSUFBc0I2RixDQUFDLENBQUM3RixPQUFGLENBQVUsR0FBVixLQUFrQixDQUEzQyxFQUNDLE9BQU8sQ0FBQyxDQUFSO0FBQ0QsWUFBRzRGLENBQUMsQ0FBQzVGLE9BQUYsQ0FBVSxHQUFWLEtBQWtCLENBQWxCLElBQXVCNkYsQ0FBQyxDQUFDN0YsT0FBRixDQUFVLEdBQVYsSUFBaUIsQ0FBM0MsRUFDQyxPQUFPLENBQVA7O0FBRUQsWUFBRzRGLENBQUMsQ0FBQzVGLE9BQUYsQ0FBVSxHQUFWLEtBQWtCLENBQWxCLElBQXVCNkYsQ0FBQyxDQUFDN0YsT0FBRixDQUFVLEdBQVYsS0FBa0IsQ0FBNUMsRUFBK0M7QUFDOUMsaUJBQU84RyxRQUFRLENBQUNsQixDQUFDLENBQUNsRyxLQUFGLENBQVEsR0FBUixFQUFhLENBQWIsQ0FBRCxDQUFSLEdBQTRCb0gsUUFBUSxDQUFDakIsQ0FBQyxDQUFDbkcsS0FBRixDQUFRLEdBQVIsRUFBYSxDQUFiLENBQUQsQ0FBM0M7QUFDQTs7QUFDRCxZQUFHa0csQ0FBQyxDQUFDNUYsT0FBRixDQUFVLEdBQVYsS0FBa0IsQ0FBbEIsSUFBdUI2RixDQUFDLENBQUM3RixPQUFGLENBQVUsR0FBVixJQUFpQixDQUEzQyxFQUE4QztBQUM3QyxpQkFBTzhHLFFBQVEsQ0FBQ2xCLENBQUMsQ0FBQ2xHLEtBQUYsQ0FBUSxHQUFSLEVBQWEsQ0FBYixDQUFELENBQVIsR0FBNEJvSCxRQUFRLENBQUNqQixDQUFDLENBQUNuRyxLQUFGLENBQVEsR0FBUixFQUFhLENBQWIsQ0FBRCxDQUEzQztBQUNBOztBQUNELFlBQUdrRyxDQUFDLENBQUM1RixPQUFGLENBQVUsR0FBVixJQUFpQixDQUFqQixJQUFzQjZGLENBQUMsQ0FBQzdGLE9BQUYsQ0FBVSxHQUFWLEtBQWtCLENBQTNDLEVBQThDO0FBQzdDLGlCQUFPOEcsUUFBUSxDQUFDbEIsQ0FBQyxDQUFDbEcsS0FBRixDQUFRLEdBQVIsRUFBYSxDQUFiLENBQUQsQ0FBUixHQUE0Qm9ILFFBQVEsQ0FBQ2pCLENBQUMsQ0FBQ25HLEtBQUYsQ0FBUSxHQUFSLEVBQWEsQ0FBYixDQUFELENBQTNDO0FBQ0E7O0FBQ0QsWUFBR2tHLENBQUMsQ0FBQzVGLE9BQUYsQ0FBVSxHQUFWLElBQWlCLENBQWpCLElBQXNCNkYsQ0FBQyxDQUFDN0YsT0FBRixDQUFVLEdBQVYsSUFBaUIsQ0FBMUMsRUFBNkM7QUFDNUMsaUJBQU84RyxRQUFRLENBQUNsQixDQUFDLENBQUNsRyxLQUFGLENBQVEsR0FBUixFQUFhLENBQWIsQ0FBRCxDQUFSLEdBQTRCb0gsUUFBUSxDQUFDakIsQ0FBQyxDQUFDbkcsS0FBRixDQUFRLEdBQVIsRUFBYSxDQUFiLENBQUQsQ0FBM0M7QUFDQTtBQUNELE9BcEJhLEVBb0JYeUMsR0FwQlcsQ0FvQlAsVUFBQ2hCLElBQUQsRUFBVTtBQUNoQixlQUFPO0FBQ040RixhQUFHLEVBQUUsTUFBSSxDQUFDQyxZQUFMLENBQWtCN0YsSUFBbEIsRUFBd0J6QixLQUF4QixDQUE4QixHQUE5QixFQUFtQyxDQUFuQyxDQURDO0FBRU5nRyxhQUFHLEVBQUUsTUFBSSxDQUFDc0IsWUFBTCxDQUFrQjdGLElBQWxCLEVBQXdCekIsS0FBeEIsQ0FBOEIsR0FBOUIsRUFBbUMsQ0FBbkMsS0FBeUMsTUFBSSxDQUFDc0gsWUFBTCxDQUFrQjdGLElBQWxCLEVBQXdCekIsS0FBeEIsQ0FBOEIsR0FBOUIsRUFBbUMsQ0FBbkMsQ0FGeEM7QUFHTnVILGNBQUksRUFBRSxNQUFJLENBQUNSLE1BQUwsQ0FBWXRGLElBQVo7QUFIQSxTQUFQO0FBS0EsT0ExQmEsQ0FBZDtBQTJCQTtBQXZGRjtBQUFBO0FBQUEsaUNBeUZjK0YsS0F6RmQsRUF5RnFCO0FBQ25CLFVBQUlBLEtBQUssQ0FBQ2xILE9BQU4sQ0FBYyxHQUFkLEtBQW9CLENBQXhCLEVBQ0Msa0JBQVdrSCxLQUFYO0FBRUQsVUFBR0EsS0FBSyxDQUFDbEgsT0FBTixDQUFjLEdBQWQsS0FBcUJrSCxLQUFLLENBQUN6RixNQUFOLEdBQWEsQ0FBckMsRUFDQyxpQkFBVXlGLEtBQVY7QUFFRCxhQUFPQSxLQUFQO0FBQ0E7QUFqR0Y7QUFBQTtBQUFBLDhCQW1HV2xJLEdBbkdYLEVBbUdnQjtBQUNkLFVBQU1tSSxVQUFVLEdBQUcsS0FBS0MsYUFBTCxDQUFtQnBJLEdBQUcsQ0FBQzJGLE1BQXZCLENBQW5CO0FBQ0EsYUFBT3dDLFVBQVUsQ0FBQzFCLElBQUksQ0FBQ1ksS0FBTCxDQUFXWixJQUFJLENBQUM0QixNQUFMLEtBQWdCNUIsSUFBSSxDQUFDWSxLQUFMLENBQVdjLFVBQVUsQ0FBQzFGLE1BQXRCLENBQTNCLENBQUQsQ0FBVixDQUNMNkYsT0FESyxDQUNHLElBREgsRUFDU3RJLEdBQUcsQ0FBQzBGLFNBRGIsRUFFTDRDLE9BRkssQ0FFRyxJQUZILEVBRVN0SSxHQUFHLENBQUMyRixNQUZiLENBQVA7QUFHQTtBQXhHRjtBQUFBO0FBQUEsa0NBMEdlNEMsU0ExR2YsRUEwRzBCO0FBQ3hCLFVBQUlDLEtBQUssR0FBRyxLQUFLZixNQUFMLENBQVlULE1BQVosQ0FBbUIsVUFBQTdFLElBQUksRUFBSTtBQUN0QyxlQUFPb0csU0FBUyxJQUFJcEcsSUFBSSxDQUFDdUUsR0FBbEIsSUFBeUI2QixTQUFTLElBQUlwRyxJQUFJLENBQUM0RixHQUFsRDtBQUNBLE9BRlcsQ0FBWjs7QUFHQSxVQUFHUyxLQUFLLENBQUMvRixNQUFOLEdBQWUsQ0FBbEIsRUFBcUI7QUFDcEIsZUFBTytGLEtBQUssQ0FBQ3JGLEdBQU4sQ0FBVSxVQUFBaEIsSUFBSSxFQUFJO0FBQ3hCLGlCQUFPQSxJQUFJLENBQUM4RixJQUFaO0FBQ0EsU0FGTSxFQUVKckcsTUFGSSxDQUVHLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQ7QUFBQSxpQkFBMEJELFdBQVcsQ0FBQ25FLE1BQVosQ0FBbUJvRSxPQUFuQixDQUExQjtBQUFBLFNBRkgsRUFFeUQsRUFGekQsQ0FBUDtBQUdBOztBQUVELGFBQU8sS0FBS3NCLE1BQUwsQ0FBWVQsTUFBWixDQUFtQixVQUFBN0UsSUFBSSxFQUFJO0FBQ2pDLGVBQU9vRyxTQUFTLElBQUlwRyxJQUFJLENBQUN1RSxHQUFsQixJQUF5QjZCLFNBQVMsSUFBSXBHLElBQUksQ0FBQzRGLEdBQWxEO0FBQ0EsT0FGTSxFQUVKNUUsR0FGSSxDQUVBLFVBQUFoQixJQUFJLEVBQUk7QUFDZCxlQUFPQSxJQUFJLENBQUM4RixJQUFaO0FBQ0EsT0FKTSxFQUlKckcsTUFKSSxDQUlHLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQ7QUFBQSxlQUEwQkQsV0FBVyxDQUFDbkUsTUFBWixDQUFtQm9FLE9BQW5CLENBQTFCO0FBQUEsT0FKSCxFQUl5RCxFQUp6RCxDQUFQO0FBS0EsS0F6SEYsQ0E0SEk7QUFDQTtBQUNBOztBQTlISjtBQUFBO0FBQUEsK0JBZ0lZdkksRUFoSVosRUFnSWdCO0FBQ2QsV0FBSzZLLFVBQUwsQ0FBZ0I3SyxFQUFoQjtBQUNBLFdBQUs4SyxhQUFMO0FBQ0E7QUFuSUY7QUFBQTtBQUFBLG9DQXFJaUI7QUFBQTs7QUFDZmQsWUFBTSxDQUFDQyxJQUFQLENBQVksS0FBSzVDLFFBQWpCLEVBQTJCK0IsTUFBM0IsQ0FBa0MsVUFBQTJCLEdBQUcsRUFBSTtBQUN4QyxlQUFPQSxHQUFHLENBQUMzSCxPQUFKLENBQVksV0FBWixLQUE0QixDQUE1QixJQUFpQyxNQUFJLENBQUNpRSxRQUFMLENBQWMwRCxHQUFkLEtBQXNCQyxTQUF2RCxJQUFvRSxNQUFJLENBQUMzRCxRQUFMLENBQWMwRCxHQUFkLEVBQW1CbEksSUFBbkIsR0FBMEJnQyxNQUExQixHQUFtQyxDQUE5RztBQUNBLE9BRkQsRUFFR0gsT0FGSCxDQUVXLFVBQUFxRyxHQUFHLEVBQUk7QUFBQSxvQ0FDTSxNQUFJLENBQUMxRCxRQUFMLENBQWMwRCxHQUFkLEVBQW1CakksS0FBbkIsQ0FBeUIsR0FBekIsQ0FETjtBQUFBO0FBQUEsWUFDVlYsR0FEVTtBQUFBLFlBQ0x1QixPQURLOztBQUVqQixZQUFHLE9BQU8sTUFBSSxDQUFDa0csTUFBWixJQUFzQixRQUF0QixJQUFrQyxNQUFJLENBQUNBLE1BQUwsQ0FBWW9CLGNBQVosQ0FBMkI3SSxHQUEzQixDQUFyQyxFQUNDLE1BQUksQ0FBQ3lILE1BQUwsQ0FBWXpILEdBQVosRUFBaUJpQyxJQUFqQixDQUFzQlYsT0FBdEIsRUFERCxLQUdDLE1BQUksQ0FBQ2tHLE1BQUwsQ0FBWXpILEdBQVosSUFBbUIsQ0FBQ3VCLE9BQUQsQ0FBbkI7QUFDRCxPQVJEO0FBU0E7QUEvSUY7QUFBQTtBQUFBLCtCQWlKWTNELEVBakpaLEVBaUpnQjtBQUFBOztBQUNkLFdBQUtxSCxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsV0FBSzVHLGtCQUFMLEdBQTBCOEUsR0FBMUIsQ0FBOEIsVUFBQWhCLElBQUksRUFBSTtBQUNyQyxlQUFPQSxJQUFJLENBQUN3QixJQUFaO0FBQ0EsT0FGRCxFQUVHckIsT0FGSCxDQUVXLFVBQUFxRyxHQUFHLEVBQUk7QUFDakIsY0FBSSxDQUFDMUQsUUFBTCxDQUFjMEQsR0FBZCxJQUFxQi9LLEVBQUUsQ0FBQ3FILFFBQUgsQ0FBWTBELEdBQVosQ0FBckI7QUFDQSxPQUpEO0FBS0E7QUF4SkY7QUFBQTtBQUFBLHlDQTBKeUI7QUFDakIsVUFBTTlHLE1BQU0sR0FBRyxDQUNYO0FBQ0k4QixZQUFJLEVBQWMsa0JBRHRCO0FBRUltRixhQUFLLEVBQWEsZ0RBRnRCO0FBR0lDLFlBQUksRUFBYyxRQUh0QjtBQUlJQyxlQUFPLEVBQVcsS0FKdEI7QUFLSUMsZUFBTyxFQUFXLElBTHRCO0FBTUlDLG9CQUFZLEVBQU0sS0FOdEI7QUFPSUMsZ0JBQVEsRUFBVTtBQVB0QixPQURXLENBQWY7O0FBWU4sV0FBSSxJQUFJQyxDQUFDLEdBQUcsQ0FBWixFQUFlQSxDQUFDLEdBQUcsS0FBSzVCLG1CQUF4QixFQUE2QzRCLENBQUMsRUFBOUMsRUFBa0Q7QUFDakR2SCxjQUFNLENBQUNJLElBQVAsQ0FBWTtBQUNDMEIsY0FBSSxxQkFBMEJ5RixDQUExQixDQURMO0FBRUNOLGVBQUssb0JBQXdCTSxDQUF4QixNQUZOO0FBR0NMLGNBQUksRUFBYyxLQUhuQjtBQUlDTSxtQkFBUyxFQUFTLENBSm5CO0FBS0NDLG1CQUFTLEVBQVMsR0FMbkI7QUFNQ0osc0JBQVksRUFBTSxFQU5uQjtBQU9DQyxrQkFBUSxFQUFVO0FBUG5CLFNBQVo7QUFTQTs7QUFDRCxhQUFPdEgsTUFBUDtBQUNHO0FBbkxMOztBQUFBO0FBQUEsRUFBbUNyRCwyQ0FBbkMsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNEQTtBQUNPLElBQU1SLE9BQWI7QUFBQTtBQUFBO0FBQUE7O0FBV0k7QUFDSDtBQWNBLG1CQUFZTixHQUFaLEVBQWlCRSxFQUFqQixFQUFxQjtBQUFBOztBQUFBOztBQUNkLGlGQUFNRixHQUFOLEVBQVVFLEVBQVY7QUFEYyxVQXpCckIrRixJQXlCcUIsR0F6QkgsY0F5Qkc7QUFBQSxVQXhCckJDLFdBd0JxQixHQXhCSCx3Q0F3Qkc7QUFBQSxVQXZCbEJqRCxLQXVCa0IsR0F2QkEsQ0FBQyxLQUFELEVBQU8sT0FBUCxFQUFlLEtBQWYsRUFBcUIsT0FBckIsQ0F1QkE7QUFBQSxVQXRCbEJHLFdBc0JrQixHQXRCQTtBQUFDLGFBQU8sSUFBUjtBQUNkLGNBQVEsSUFETTtBQUVkLFlBQVEsSUFGTTtBQUdDLGNBQVEsR0FIVDtBQUlDLGFBQVEsR0FKVDtBQUtDLGVBQVE7QUFMVCxLQXNCQTtBQUFBLFVBYnJCMEcsbUJBYXFCLEdBYkMsRUFhRDtBQUFBLFVBWmxCK0IsS0FZa0IsR0FaVixDQUFDLE1BQUQsRUFBUyxLQUFULENBWVU7QUFBQSxVQVhsQkMsV0FXa0IsR0FYSixNQVdJO0FBQUEsVUFWbEJDLFVBVWtCLEdBVkwsVUFVSztBQUFBLFVBVGxCQyxJQVNrQixHQVRYLENBQ0g7QUFDSSxnQkFBVyxFQURmO0FBRUkscUJBQWUsSUFGbkI7QUFHSSxjQUFTO0FBSGIsS0FERyxDQVNXOztBQUdwQixVQUFLaEMsVUFBTCxDQUFnQjlKLEVBQWhCOztBQUNNLFVBQUtBLEVBQUwsQ0FBUStMLEdBQVIsQ0FBWSxNQUFLRCxJQUFqQjs7QUFDQSxVQUFLRSxRQUFMOztBQUNBLFVBQUtoTSxFQUFMLENBQVErTCxHQUFSLENBQVksTUFBS0QsSUFBakI7O0FBTmM7QUFPcEI7O0FBakNGO0FBQUE7QUFBQSwrQkFtQ1k7QUFBQTs7QUFDSjlCLFlBQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUs2QixJQUFqQixFQUF1QnBILE9BQXZCLENBQStCLFVBQUFxRyxHQUFHLEVBQUk7QUFDbEMsY0FBSSxDQUFDZSxJQUFMLENBQVVmLEdBQVYsRUFBZWhDLElBQWYsQ0FBb0IsVUFBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQVU7QUFDMUIsaUJBQU9BLENBQUMsQ0FBQ2xCLE1BQUYsR0FBV2lCLENBQUMsQ0FBQ2pCLE1BQXBCO0FBQ0gsU0FGRDtBQUdILE9BSkQ7QUFLTixLQXpDRixDQTRDSTtBQUNBO0FBQ0E7O0FBOUNKO0FBQUE7QUFBQSwrQkFnRFkvSCxFQWhEWixFQWdEZ0I7QUFDZCxXQUFLNkssVUFBTCxDQUFnQjdLLEVBQWhCO0FBQ0EsV0FBS2lNLGVBQUw7QUFDQTtBQW5ERjtBQUFBO0FBQUEsc0NBcURtQjtBQUFBOztBQUNYLFdBQUtILElBQUwsR0FBWSxFQUFaO0FBQ045QixZQUFNLENBQUNDLElBQVAsQ0FBWSxLQUFLNUMsUUFBakIsRUFBMkIrQixNQUEzQixDQUFrQyxVQUFBMkIsR0FBRyxFQUFJO0FBQ3hDLGVBQU9BLEdBQUcsQ0FBQ21CLEtBQUosQ0FBVSxNQUFJLENBQUNMLFVBQUwsR0FBa0IsUUFBNUIsS0FBeUMsSUFBekMsSUFBaUQsTUFBSSxDQUFDeEUsUUFBTCxDQUFjMEQsR0FBZCxLQUFzQkMsU0FBdkUsSUFBb0YsTUFBSSxDQUFDM0QsUUFBTCxDQUFjMEQsR0FBZCxFQUFtQmxJLElBQW5CLEdBQTBCZ0MsTUFBMUIsR0FBbUMsQ0FBOUg7QUFDQSxPQUZELEVBRUdILE9BRkgsQ0FFVyxVQUFBcUcsR0FBRyxFQUFJO0FBQUEsb0NBQ3FCLE1BQUksQ0FBQzFELFFBQUwsQ0FBYzBELEdBQWQsRUFBbUJqSSxLQUFuQixDQUF5QixHQUF6QixDQURyQjtBQUFBO0FBQUEsWUFDRHFKLEtBREM7QUFBQSxZQUNNbkcsV0FETjs7QUFFUixZQUFJb0csS0FBSyxHQUFHckIsR0FBRyxDQUFDbUIsS0FBSixDQUFVLFFBQVYsRUFBb0IsQ0FBcEIsQ0FBWjtBQUFBLFlBQ0lmLElBQUksR0FBSSxNQUFJLENBQUM5RCxRQUFMLFdBQWlCLE1BQUksQ0FBQ3dFLFVBQXRCLGlCQUF1Q08sS0FBdkMsRUFEWjs7QUFFVCxZQUFHQyxLQUFLLENBQUNDLE9BQU4sQ0FBYyxNQUFJLENBQUNSLElBQUwsQ0FBVVgsSUFBVixDQUFkLENBQUgsRUFDQyxNQUFJLENBQUNXLElBQUwsQ0FBVVgsSUFBVixFQUFnQjlHLElBQWhCLENBQXFCO0FBQUM4SCxlQUFLLEVBQUxBLEtBQUQ7QUFBUW5HLHFCQUFXLEVBQVhBO0FBQVIsU0FBckIsRUFERCxLQUdhLE1BQUksQ0FBQzhGLElBQUwsQ0FBVVgsSUFBVixJQUFrQixDQUFDO0FBQUNnQixlQUFLLEVBQUxBLEtBQUQ7QUFBUW5HLHFCQUFXLEVBQVhBO0FBQVIsU0FBRCxDQUFsQjtBQUNQLE9BVlA7QUFXQTtBQWxFRjtBQUFBO0FBQUEsK0JBb0VZaEcsRUFwRVosRUFvRWdCO0FBQUE7O0FBQ2QsV0FBS3FILFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxXQUFLNUcsa0JBQUwsR0FBMEI4RSxHQUExQixDQUE4QixVQUFBaEIsSUFBSSxFQUFJO0FBQ3JDLGVBQU9BLElBQUksQ0FBQ3dCLElBQVo7QUFDQSxPQUZELEVBRUdyQixPQUZILENBRVcsVUFBQXFHLEdBQUcsRUFBSTtBQUNqQixjQUFJLENBQUMxRCxRQUFMLENBQWMwRCxHQUFkLElBQXFCL0ssRUFBRSxDQUFDcUgsUUFBSCxDQUFZMEQsR0FBWixDQUFyQjtBQUNNLE9BSlA7QUFLQTtBQTNFRjtBQUFBO0FBQUEseUNBNkV5QjtBQUNqQixVQUFNOUcsTUFBTSxHQUFHLENBQ1g7QUFDSThCLFlBQUksRUFBYyxnQkFEdEI7QUFFSW1GLGFBQUssRUFBYSw4Q0FGdEI7QUFHSUMsWUFBSSxFQUFjLFFBSHRCO0FBSUlDLGVBQU8sRUFBVyxLQUp0QjtBQUtJQyxlQUFPLEVBQVcsSUFMdEI7QUFNSUMsb0JBQVksRUFBTSxLQU50QjtBQU9JQyxnQkFBUSxFQUFVO0FBUHRCLE9BRFcsQ0FBZjs7QUFZTixXQUFJLElBQUlDLENBQUMsR0FBRyxDQUFaLEVBQWVBLENBQUMsR0FBRyxLQUFLNUIsbUJBQXhCLEVBQTZDNEIsQ0FBQyxFQUE5QyxFQUFrRDtBQUNqRHZILGNBQU0sQ0FBQ0ksSUFBUCxDQUFZO0FBQ0MwQixjQUFJLFlBQWlCLEtBQUs4RixVQUF0QixTQUFtQ0wsQ0FBbkMsQ0FETDtBQUVDTixlQUFLLHNCQUEwQk0sQ0FBMUIsNkJBRk47QUFHQ0wsY0FBSSxFQUFjLEtBSG5CO0FBSUNNLG1CQUFTLEVBQVMsQ0FKbkI7QUFLQ0MsbUJBQVMsRUFBUyxHQUxuQjtBQU1DSixzQkFBWSxFQUFPLEtBQUtRLElBQUwsQ0FBVU4sQ0FBVixLQUFnQixLQUFLTSxJQUFMLENBQVVOLENBQVYsRUFBYXpELE1BQTdCLElBQXVDLEtBQUsrRCxJQUFMLENBQVVOLENBQVYsRUFBYXhGLFdBQXJELGFBQXVFLEtBQUs4RixJQUFMLENBQVVOLENBQVYsRUFBYXpELE1BQXBGLGdCQUFnRyxLQUFLK0QsSUFBTCxDQUFVTixDQUFWLEVBQWF4RixXQUE3RyxJQUE2SCxFQU5oSjtBQU9DdUYsa0JBQVEsRUFBVTtBQVBuQixTQUFaO0FBU1MsWUFBSWdCLFVBQVUsR0FBRztBQUNieEcsY0FBSSxZQUFpQixLQUFLOEYsVUFBdEIsaUJBQXVDTCxDQUF2QyxDQURTO0FBRWJOLGVBQUssc0JBQTBCTSxDQUExQixXQUZRO0FBR2JMLGNBQUksRUFBYyxRQUhMO0FBSWJHLHNCQUFZLEVBQU8sS0FBS1EsSUFBTCxDQUFVTixDQUFWLEtBQWdCLEtBQUtNLElBQUwsQ0FBVU4sQ0FBVixFQUFhTCxJQUE5QixJQUF1QyxNQUo1QztBQUtiSSxrQkFBUSxFQUFVO0FBTEwsU0FBakI7O0FBT0EsYUFBSyxJQUFJQyxHQUFDLEdBQUcsQ0FBYixFQUFnQkEsR0FBQyxHQUFHLEtBQUtHLEtBQUwsQ0FBVzlHLE1BQS9CLEVBQXVDMkcsR0FBQyxFQUF4QyxFQUEyQztBQUN2Q2Usb0JBQVUsaUJBQVVmLEdBQUMsR0FBQyxDQUFaLEVBQVYsR0FBNkIsS0FBS0csS0FBTCxDQUFXSCxHQUFYLENBQTdCO0FBQ0g7O0FBQ0R2SCxjQUFNLENBQUNJLElBQVAsQ0FBWWtJLFVBQVo7QUFDVDs7QUFDRCxhQUFPdEksTUFBUDtBQUNHO0FBakhMOztBQUFBO0FBQUEsRUFBNkJyRCwyQ0FBN0IsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFFTyxJQUFNUCxNQUFiO0FBQUE7QUFBQTtBQUFBOztBQWdCQyxrQkFBWVAsR0FBWixFQUFpQkUsRUFBakIsRUFBcUI7QUFBQTs7QUFBQTs7QUFDcEIsZ0ZBQU1GLEdBQU4sRUFBV0UsRUFBWDtBQURvQixVQWZsQitGLElBZWtCLEdBZkEsWUFlQTtBQUFBLFVBZGxCQyxXQWNrQixHQWRBLHlCQWNBO0FBQUEsVUFibEJqRCxLQWFrQixHQWJBLENBQUMsT0FBRCxFQUFTLE9BQVQsQ0FhQTtBQUFBLFVBWmxCRyxXQVlrQixHQVpBO0FBQUMsY0FBUSxLQUFUO0FBQ0MsY0FBUSxLQURUO0FBRUMsY0FBUSxLQUZUO0FBR0MsY0FBUSxLQUhUO0FBSUMsY0FBUSxLQUpUO0FBS0MsY0FBUSxHQUxUO0FBTUMsYUFBUSxHQU5UO0FBT0MsZUFBUTtBQVBULEtBWUE7QUFBQSxVQUhsQitDLGVBR2tCLEdBSEEsU0FHQTtBQUFBLFVBRmxCcEYsZUFFa0IsR0FGQSxTQUVBO0FBQUE7QUFFcEI7O0FBbEJGO0FBQUE7QUFBQSwwQkFvQk91QixHQXBCUCxFQW9CWTtBQUNKLFVBQU1vSyxPQUFPLEdBQUcsS0FBS3RMLEtBQUwsQ0FBV3VMLE1BQVgsQ0FBa0JySyxHQUFsQixDQUFoQjtBQUNBLFdBQUtzSyxVQUFMLENBQWdCdEssR0FBaEI7QUFDQSxXQUFLdUssV0FBTCxDQUFpQkgsT0FBakI7QUFDTjtBQXhCRjtBQUFBO0FBQUEsZ0NBMEJnQkEsT0ExQmhCLEVBMEJ5QjtBQUNqQixVQUFNeE0sRUFBRSxHQUFHLEtBQUtBLEVBQWhCO0FBQ0EsVUFBSXdNLE9BQU8sQ0FBQy9FLElBQVIsSUFBZ0IsRUFBcEIsRUFDSTlDLDZDQUFJLENBQUNpSSxRQUFMLENBQWM7QUFBQzVNLFVBQUUsRUFBRkEsRUFBRDtBQUFLNEUsWUFBSSxZQUFLNEgsT0FBTyxDQUFDL0UsSUFBUixDQUFhSSxRQUFsQixvQkFBVDtBQUFzRC9HLGFBQUssRUFBRSxLQUFLbUYsZUFBbEU7QUFBbUZKLGtCQUFVLEVBQUUsS0FBS2hGO0FBQXBHLE9BQWQ7QUFFSixVQUFJMkwsT0FBTyxDQUFDN0UsT0FBUixJQUFtQixFQUF2QixFQUNJaEQsNkNBQUksQ0FBQ2lJLFFBQUwsQ0FBYztBQUFDNU0sVUFBRSxFQUFGQSxFQUFEO0FBQUs0RSxZQUFJLFlBQUs0SCxPQUFPLENBQUM3RSxPQUFSLENBQWdCRSxRQUFyQix5Q0FBNEQyRSxPQUFPLENBQUM3RSxPQUFSLENBQWdCSSxNQUE1RSxZQUFUO0FBQXNHakgsYUFBSyxFQUFFLEtBQUttRixlQUFsSDtBQUFtSUosa0JBQVUsRUFBRSxLQUFLaEY7QUFBcEosT0FBZDtBQUNQO0FBakNMO0FBQUE7QUFBQSwrQkFtQ1l1QixHQW5DWixFQW1DaUI7QUFDZixVQUFNcEMsRUFBRSxHQUFPLEtBQUtBLEVBQXBCO0FBQUEsVUFDWTZKLE1BQU0sR0FBRyxLQUFLL0osR0FBTCxDQUFTb0gsR0FBVCxDQUFhLFFBQWIsQ0FEckI7QUFBQSxVQUVZdEMsSUFBSSxHQUFLaUYsTUFBTSxDQUFDZ0QsU0FBUCxDQUFpQnpLLEdBQWpCLENBRnJCO0FBSU11QyxtREFBSSxDQUFDaUksUUFBTCxDQUFjO0FBQUM1TSxVQUFFLEVBQUZBLEVBQUQ7QUFBSzRFLFlBQUksRUFBSkEsSUFBTDtBQUFXOUQsYUFBSyxFQUFFK0ksTUFBTSxDQUFDNUQsZUFBUCxJQUEwQixLQUFLQSxlQUFqRDtBQUFrRUosa0JBQVUsRUFBRWdFLE1BQU0sQ0FBQ2hKLGVBQVAsSUFBMEIsS0FBS0E7QUFBN0csT0FBZDtBQUNOO0FBekNGO0FBQUE7QUFBQSwyQkEyQ1dlLElBM0NYLEVBMkNpQjtBQUNULFVBQU1nRCxJQUFJLGdCQUFTLEtBQUttQixJQUFkLHdCQUFWO0FBQ0FwQixtREFBSSxDQUFDaUksUUFBTCxDQUFjO0FBQUN2SyxZQUFJLEVBQUVULElBQUksQ0FBQ1MsSUFBWjtBQUFrQnVDLFlBQUksRUFBSkEsSUFBbEI7QUFBd0I5RCxhQUFLLEVBQUUsS0FBL0I7QUFBc0MrRSxrQkFBVSxFQUFDLE9BQWpEO0FBQTBEN0YsVUFBRSxFQUFFLEtBQUtBO0FBQW5FLE9BQWQ7QUFFSDtBQS9DTDtBQUFBO0FBQUEsMEJBaURVNEIsSUFqRFYsRUFpRGdCO0FBQ1IsVUFBTWdELElBQUksZ0JBQVMsS0FBS21CLElBQWQsd0JBQVY7QUFDQXBCLG1EQUFJLENBQUNpSSxRQUFMLENBQWM7QUFBQ3ZLLFlBQUksRUFBRVQsSUFBSSxDQUFDUyxJQUFaO0FBQWtCdUMsWUFBSSxFQUFKQSxJQUFsQjtBQUF3QjlELGFBQUssRUFBRSxPQUEvQjtBQUF3QytFLGtCQUFVLEVBQUMsT0FBbkQ7QUFBNEQ3RixVQUFFLEVBQUUsS0FBS0E7QUFBckUsT0FBZDtBQUNIO0FBcERMO0FBQUE7QUFBQSw0QkFzRFk0QixJQXREWixFQXNEa0I7QUFDVixVQUFNZ0QsSUFBSSxnQkFBUyxLQUFLbUIsSUFBZCx1QkFBVjtBQUNBcEIsbURBQUksQ0FBQ2lJLFFBQUwsQ0FBYztBQUFDdkssWUFBSSxFQUFFVCxJQUFJLENBQUNTLElBQVo7QUFBa0J1QyxZQUFJLEVBQUpBLElBQWxCO0FBQXdCOUQsYUFBSyxFQUFFLFFBQS9CO0FBQXlDK0Usa0JBQVUsRUFBQyxPQUFwRDtBQUE2RDdGLFVBQUUsRUFBRSxLQUFLQTtBQUF0RSxPQUFkO0FBQ0g7QUF6REw7QUFBQTtBQUFBLDJCQTJEVztBQUNILGFBQU8sS0FBS2tCLEtBQUwsQ0FBV3dHLFVBQVgsRUFBUDtBQUNIO0FBN0RMO0FBQUE7QUFBQSw4QkErRGM7QUFDTixhQUFPLEtBQUt4RyxLQUFMLENBQVcwRyxVQUFYLEVBQVA7QUFDSDtBQWpFTDtBQUFBO0FBQUEsZ0NBbUVnQjtBQUNSLGFBQU8sS0FBSzFHLEtBQUwsQ0FBVzRMLFNBQVgsRUFBUDtBQUNIO0FBckVMO0FBQUE7QUFBQSwyQkF1RWtCO0FBQUEsVUFBVEMsR0FBUyx1RUFBSCxDQUFHO0FBQ1YsYUFBT0EsR0FBRyxHQUFHLEtBQUs3TCxLQUFMLENBQVdpSSxTQUFYLEdBQXVCbkcsS0FBdkIsQ0FBNkIsQ0FBN0IsRUFBK0IrSixHQUEvQixDQUFILEdBQXlDLEtBQUs3TCxLQUFMLENBQVdpSSxTQUFYLEVBQW5EO0FBQ0gsS0F6RUwsQ0E0RUk7QUFDQTtBQUNBOztBQTlFSjtBQUFBO0FBQUEseUNBZ0Z5QjtBQUNqQixhQUFPLEVBQVA7QUFDSCxLQWxGTCxDQW9GSTtBQUNBO0FBQ0E7O0FBdEZKO0FBQUE7QUFBQSxnQ0F5RmdCO0FBQ1IsV0FBS2pJLEtBQUwsQ0FBV1MsVUFBWDtBQUNIO0FBM0ZMO0FBQUE7QUFBQSxtQ0E2Rm1CZSxPQTdGbkIsRUE2RjRCaUIsT0E3RjVCLEVBNkZxQztBQUU3QixVQUFJLENBQUMsS0FBSzhDLGVBQUwsQ0FBcUIvRCxPQUFPLENBQUMsQ0FBRCxDQUE1QixFQUFpQ2lCLE9BQWpDLENBQUwsRUFBZ0Q7QUFDNUMsZUFBTyxLQUFQO0FBQ0gsT0FKNEIsQ0FNN0I7OztBQUNBLFVBQUlqQixPQUFPLENBQUNtQyxNQUFSLElBQWtCLENBQWxCLElBQXVCbkMsT0FBTyxDQUFDLENBQUQsQ0FBUCxJQUFjLE1BQXpDLEVBQWlEO0FBQzdDLFlBQU1zSyxJQUFJLEdBQUcsS0FBS0EsSUFBTCxFQUFiO0FBQUEsWUFDTXBJLElBQUksR0FBR29JLElBQUksQ0FBQ25GLFFBQUwsYUFDRW1GLElBQUksQ0FBQ25GLFFBRFAscUNBQzBDbUYsSUFBSSxDQUFDakYsTUFEL0MscUNBRGI7QUFJQXBELHFEQUFJLENBQUNpSSxRQUFMLENBQWM7QUFBQ3ZLLGNBQUksRUFBRXNCLE9BQU8sQ0FBQ3RCLElBQWY7QUFBcUJ1QyxjQUFJLEVBQUpBLElBQXJCO0FBQTJCOUQsZUFBSyxFQUFFLEtBQUttRixlQUF2QztBQUF3REosb0JBQVUsRUFBRSxLQUFLaEYsZUFBekU7QUFBMEZiLFlBQUUsRUFBRSxLQUFLQTtBQUFuRyxTQUFkO0FBQ0gsT0FiNEIsQ0FlN0I7OztBQUNBLFVBQUkwQyxPQUFPLENBQUNtQyxNQUFSLElBQWtCLENBQWxCLElBQXVCbkMsT0FBTyxDQUFDLENBQUQsQ0FBUCxJQUFjLE1BQXpDLEVBQWlEO0FBQzdDLFlBQU1pRixPQUFPLEdBQUcsS0FBS0EsT0FBTCxFQUFoQjtBQUFBLFlBQ00vQyxLQUFJLEdBQUcrQyxPQUFPLENBQUNFLFFBQVIsYUFDRUYsT0FBTyxDQUFDRSxRQURWLDhDQUNzREYsT0FBTyxDQUFDSSxNQUQ5RCxzQ0FEYjs7QUFJQXBELHFEQUFJLENBQUNpSSxRQUFMLENBQWM7QUFBQ3ZLLGNBQUksRUFBRXNCLE9BQU8sQ0FBQ3RCLElBQWY7QUFBcUJ1QyxjQUFJLEVBQUpBLEtBQXJCO0FBQTJCOUQsZUFBSyxFQUFFLEtBQUttRixlQUF2QztBQUF3REosb0JBQVUsRUFBRSxLQUFLaEYsZUFBekU7QUFBMEZiLFlBQUUsRUFBRSxLQUFLQTtBQUFuRyxTQUFkO0FBQ0gsT0F0QjRCLENBd0I3Qjs7O0FBQ0EsVUFBSTBDLE9BQU8sQ0FBQ21DLE1BQVIsSUFBa0IsQ0FBbEIsSUFBdUJuQyxPQUFPLENBQUMsQ0FBRCxDQUFQLElBQWMsTUFBekMsRUFBaUQ7QUFDN0MsWUFBTXVLLElBQUksR0FBRyxLQUFLSCxTQUFMLEVBQWI7QUFBQSxZQUNNbEksTUFBSSxHQUFHLENBQUNzSSxNQUFNLENBQUNDLEtBQVAsQ0FBYUYsSUFBYixDQUFELDhDQUNtQ0EsSUFEbkMsNkNBRGI7O0FBSUF0SSxxREFBSSxDQUFDaUksUUFBTCxDQUFjO0FBQUN2SyxjQUFJLEVBQUVzQixPQUFPLENBQUN0QixJQUFmO0FBQXFCdUMsY0FBSSxFQUFKQSxNQUFyQjtBQUEyQjlELGVBQUssRUFBRSxLQUFLbUYsZUFBdkM7QUFBd0RKLG9CQUFVLEVBQUUsS0FBS2hGLGVBQXpFO0FBQTBGYixZQUFFLEVBQUUsS0FBS0E7QUFBbkcsU0FBZDtBQUNILE9BL0I0QixDQWlDN0I7OztBQUNBLFVBQUkwQyxPQUFPLENBQUNtQyxNQUFSLElBQWtCLENBQWxCLElBQXVCbkMsT0FBTyxDQUFDLENBQUQsQ0FBUCxJQUFjLE1BQXpDLEVBQWlEO0FBQzdDLFlBQUkwSyxPQUFPLEdBQUcsQ0FBZDs7QUFDQSxZQUFNeEksTUFBSSxHQUFHLEtBQUt5SSxJQUFMLEdBQVlySixNQUFaLENBQW1CLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQsRUFBeUI7QUFDckQsaUJBQU9ELFdBQVcsR0FBRyxJQUFkLGFBQXdCLEVBQUU4RSxPQUExQixlQUFzQzdFLE9BQU8sQ0FBQ1YsUUFBOUMsZ0JBQTREVSxPQUFPLENBQUNSLE1BQXBFLENBQVA7QUFDSCxTQUZZLEVBRVgsRUFGVyxFQUVQbEYsSUFGTyxDQUVGLElBRkUsQ0FBYjs7QUFJQThCLHFEQUFJLENBQUNpSSxRQUFMLENBQWM7QUFBQ3ZLLGNBQUksRUFBRXNCLE9BQU8sQ0FBQ3RCLElBQWY7QUFBcUJ1QyxjQUFJLEVBQUpBLE1BQXJCO0FBQTJCOUQsZUFBSyxFQUFFLEtBQUttRixlQUF2QztBQUF3REosb0JBQVUsRUFBRSxLQUFLaEYsZUFBekU7QUFBMEZiLFlBQUUsRUFBRSxLQUFLQTtBQUFuRyxTQUFkO0FBQ0gsT0F6QzRCLENBMkM3Qjs7O0FBQ0EsVUFBSTBDLE9BQU8sQ0FBQ21DLE1BQVIsSUFBa0IsQ0FBbEIsSUFBdUJuQyxPQUFPLENBQUMsQ0FBRCxDQUFQLElBQWMsTUFBekMsRUFBaUQ7QUFDN0MsWUFBSTBLLFFBQU8sR0FBRyxDQUFkOztBQUNBLFlBQU14SSxNQUFJLEdBQUcsS0FBS3lJLElBQUwsQ0FBVSxDQUFWLEVBQWFySixNQUFiLENBQW9CLFVBQUNzRSxXQUFELEVBQWNDLE9BQWQsRUFBeUI7QUFDdEQsaUJBQU9ELFdBQVcsR0FBRyxJQUFkLGFBQXdCLEVBQUU4RSxRQUExQixlQUFzQzdFLE9BQU8sQ0FBQ1YsUUFBOUMsZ0JBQTREVSxPQUFPLENBQUNSLE1BQXBFLENBQVA7QUFDSCxTQUZZLEVBRVgsRUFGVyxFQUVQbEYsSUFGTyxDQUVGLElBRkUsQ0FBYjs7QUFJQThCLHFEQUFJLENBQUNpSSxRQUFMLENBQWM7QUFBQ3ZLLGNBQUksRUFBRXNCLE9BQU8sQ0FBQ3RCLElBQWY7QUFBcUJ1QyxjQUFJLEVBQUpBLE1BQXJCO0FBQTJCOUQsZUFBSyxFQUFFLEtBQUttRixlQUF2QztBQUF3REosb0JBQVUsRUFBRSxLQUFLaEYsZUFBekU7QUFBMEZiLFlBQUUsRUFBRSxLQUFLQTtBQUFuRyxTQUFkO0FBQ0gsT0FuRDRCLENBcUQ3Qjs7O0FBQ0EsVUFBSTBDLE9BQU8sQ0FBQ21DLE1BQVIsSUFBa0IsQ0FBbEIsSUFBdUJuQyxPQUFPLENBQUMsQ0FBRCxDQUFQLElBQWMsTUFBekMsRUFBaUQ7QUFDN0MsYUFBSzRLLElBQUwsQ0FBVTtBQUFDM0osaUJBQU8sRUFBUEE7QUFBRCxTQUFWO0FBQ0gsT0F4RDRCLENBMEQ3Qjs7O0FBQ0EsVUFBSWpCLE9BQU8sQ0FBQ21DLE1BQVIsSUFBa0IsQ0FBbEIsSUFBdUJuQyxPQUFPLENBQUMsQ0FBRCxDQUFQLElBQWMsS0FBekMsRUFBZ0Q7QUFDNUMsYUFBSzZLLEdBQUwsQ0FBUztBQUFDNUosaUJBQU8sRUFBUEE7QUFBRCxTQUFUO0FBQ0gsT0E3RDRCLENBK0Q3Qjs7O0FBQ0EsVUFBSWpCLE9BQU8sQ0FBQ21DLE1BQVIsSUFBa0IsQ0FBbEIsSUFBdUJuQyxPQUFPLENBQUMsQ0FBRCxDQUFQLElBQWMsT0FBekMsRUFBa0Q7QUFDOUMsYUFBSzhLLEtBQUwsQ0FBVztBQUFDN0osaUJBQU8sRUFBUEE7QUFBRCxTQUFYO0FBQ0g7QUFDSjtBQWhLTDs7QUFBQTtBQUFBLEVBQTRCL0MsMkNBQTVCLEU7Ozs7Ozs7Ozs7OztBQ0hBO0FBQUE7QUFBTyxJQUFNa0UsWUFBWSxHQUFHO0FBQ3BCMkksT0FBSyxFQUFjLEdBREM7QUFFcEJDLEtBQUcsRUFBZ0IsUUFGQztBQUVTO0FBQzdCQyxPQUFLLEVBQWMsUUFIQztBQUdTO0FBQzdCQyxNQUFJLEVBQWUsUUFKQztBQUlTO0FBQzdCQyxXQUFTLEVBQVUsUUFMQztBQUtTO0FBQzdCQyxRQUFNLEVBQWEsUUFOQztBQU9wQkMsZUFBYSxFQUFNLFFBUEM7QUFRcEI5SSxVQUFRLEVBQVcsUUFSQztBQVNwQitJLFlBQVUsRUFBUyxRQVRDO0FBVXBCQyxPQUFLLEVBQWMsUUFWQztBQVdwQkMsY0FBWSxFQUFPLFFBWEM7QUFZcEJDLFVBQVEsRUFBVyxRQVpDO0FBYXBCcEosZUFBYSxFQUFNLFFBYkM7QUFjcEJJLGtCQUFnQixFQUFHLFFBZEM7QUFlcEJELFVBQVEsRUFBVztBQWZDLENBQXJCLEMiLCJmaWxlIjoiYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9qcy9hcHAuanNcIik7XG4iLCJpbXBvcnQge05vdGlmaWVyfSAgICAgIGZyb20gJy4vbm90aWZpZXIuanMnO1xuaW1wb3J0IHtUaXBwZXJ9ICAgICAgICBmcm9tICcuL3RpcHBlci5qcyc7XG5pbXBvcnQge01lc3Nlbmdlcn0gICAgIGZyb20gJy4vbWVzc2VuZ2VyLmpzJztcbmltcG9ydCB7Qm90TWFuYWdlcn0gICAgZnJvbSAnLi9ib3RfbWFuYWdlci5qcyc7XG5pbXBvcnQge1RoYW5rc01hbmFnZXJ9IGZyb20gJy4vdGhhbmtzX21hbmFnZXIuanMnO1xuaW1wb3J0IHtLZXJiZXJvc30gICAgICBmcm9tICcuL2tlcmJlcm9zLmpzJztcbmltcG9ydCB7VGlwTWVudX0gICAgICBmcm9tICcuL3RpcF9tZW51LmpzJztcbi8vIGltcG9ydCB7VGlja2V0U2hvd30gICAgICBmcm9tICcuL3RpY2tldF9zaG93LmpzJztcblxuY29uc3QgYXBwID0gbmV3IEJvdE1hbmFnZXIoY2IpO1xuYXBwLmFkZCgna2VyYmVyb3MnLCBuZXcgS2VyYmVyb3MoYXBwLCBjYikpO1xuYXBwLmFkZCgnbm90aWZpZXInLCBuZXcgTm90aWZpZXIoYXBwLCBjYikpO1xuYXBwLmFkZCgndGlwTWVudScsIG5ldyBUaXBNZW51KGFwcCwgY2IpKTtcbmFwcC5hZGQoJ3RpcHBlcicsIG5ldyBUaXBwZXIoYXBwLCBjYikpO1xuYXBwLmFkZCgnbWVzc2VuZ2VyJywgbmV3IE1lc3NlbmdlcihhcHAsIGNiKSk7XG5hcHAuYWRkKCd0aGFua3MnLCBuZXcgVGhhbmtzTWFuYWdlcihhcHAsIGNiKSk7XG5cbmNiLnNldHRpbmdzX2Nob2ljZXMgPSBhcHAuZ2V0U2V0dGluZ3NDaG9pY2VzKCk7XG5cbiIsImV4cG9ydCBjb25zdCBibGFja0xpc3QgPSB7XG5cdHVzZXJzOiBbXSxcblx0YmxhY2tMaXN0OiBbJ3NoaXQnLCAnd2hvcmUnLCAnYml0Y2gnLCAncmVtb3ZlIHNwYWNlJywgJy9mdWNrKGluZyk/LyddXG59OyIsImltcG9ydCB7U3RhdHN9IGZyb20gJy4vc3RhdHMuanMnXG5pbXBvcnQge3N0YXR1c30gZnJvbSAnLi9zdGF0dXMuanMnO1xuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBDQiBib3RzLlxuICovXG5leHBvcnQgY2xhc3MgQm90IHtcblx0YmFja2dyb3VuZENvbG9yID0gJycgO1xuXHRjb2xvciAgICAgICAgICAgPSAnIzAwMDAwMCcgO1xuXHRuZXdsaW5lICAgICAgICAgPSAnXFxuJztcblx0Y29yZUNvbW1hbmRzICAgID0gWydydW4nLCdzdG9wJywncGF1c2UnXTtcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG5cdFx0dGhpcy5jaGVja0ludGVyZmFjZSgpO1xuXHRcdHRoaXMuY2IgPSBjYjtcblx0XHR0aGlzLmFwcCA9IGFwcDtcblx0XHR0aGlzLnN0YXRzID0gbmV3IFN0YXRzKGFwcCwgY2IpO1xuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzLlJVTk5JTkc7XG5cdH1cblxuXHRjaGVja0ludGVyZmFjZSgpIHtcblx0XHRpZighdGhpcy5jbGVhckRhdGEgfHwgIXRoaXMucHJvY2Vzc0NvbW1hbmQpIHtcblx0XHRcdC8vIGlmICghdGhpcy5wcm9jZXNzQ29tbWFuZCkgdGhyb3cgbmV3IEVycm9yKCdDbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIHByb2Nlc3NDb21tYW5kKCkgZnVuY3Rpb24uICcpO1xuXHRcdH1cblx0fVxuXG5cdGlzQ29yZUNvbW1hbmQoY29tbWFuZCkge1xuXHRcdHJldHVybiB0aGlzLmNvcmVDb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKTtcblx0fVxuXG5cdGhhc01ldGhvZChtZXRob2ROYW1lKSB7XG5cdFx0cmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0gJiYgdHlwZW9mIHRoaXNbbWV0aG9kTmFtZV0gPT0gJ2Z1bmN0aW9uJztcblx0fVxuXG5cdGlzUnVubmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5zdGF0dXMgPT0gc3RhdHVzLlJVTk5JTkc7XG5cdH1cblxuXHRjbGVhckRhdGEoKSB7XG5cdFx0aWYgKHRoaXMuc3RhdHMpIHRoaXMuY2xlYXJTdGF0cygpO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy9cblx0Ly8gY29tbWFuZHMgLy9cblx0Ly8vLy8vLy8vLy8vLy9cblxuXHRwYXVzZShkYXRhKSB7XG5cdFx0dGhpcy5zdGF0dXMgPSBzdGF0dXMuUEFVU0VEO1xuXHRcdHRoaXMub25QYXVzZShkYXRhKTtcblx0fVxuXG5cdHN0b3AoZGF0YSkge1xuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzLlNUT1BQRUQ7XG5cdFx0dGhpcy5jbGVhckRhdGEoKTtcblx0XHR0aGlzLm9uU3RvcChkYXRhKTtcblx0fVxuXG5cdHJ1bihkYXRhKSB7XG5cdFx0dGhpcy5zdGF0dXMgPSBzdGF0dXMuUlVOTklORztcblx0XHR0aGlzLm9uUnVuKGRhdGEpO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vXG5cdC8vIGV2ZW50cyAvL1xuXHQvLy8vLy8vLy8vLy9cblxuXHRvblBhdXNlKGRhdGEpIHtcblx0XHRyZXR1cm47XG5cdH0gIFxuXG5cdG9uU3RvcChkYXRhKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0b25SdW4oZGF0YSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBbb25NZXNzYWdlIGRlc2NyaXB0aW9uXVxuXHQgKiBAcGFyYW0gIHtvYmplY3R9IG1lc3NhZ2UgSW5mbyByZWxhdGVkIHRvIHRoZSBtZXNzYWdlLlxuXHQgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKlxuXHQgKiBjOiBtZXNzYWdlIGNvbG9yXG5cdCAqIG06IHRoZSBtZXNzYWdlIHRleHRcblx0ICogdXNlcjogdXNlcm5hbWUgb2YgbWVzc2FnZSBzZW5kZXJcblx0ICogZjogbWVzc2FnZSBmb250XG5cdCAqIGluX2ZhbmNsdWI6IGlzIHRoZSB1c2VyIGluIHRoZSBicm9hZGNhc3RlcnMgZmFuIGNsdWJcblx0ICogaGFzX3Rva2VuczogZG9lcyB0aGUgdXNlciBoYXZlIGF0IGxlYXN0IDEgdG9rZW5cblx0ICogaXNfbW9kOiBpcyB0aGUgdXNlciBhIG1vZGVyYXRvclxuXHQgKiB0aXBwZWRfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBibHVl4oCdP1xuXHQgKiB0aXBwZWRfYWxvdF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxwdXJwbGXigJ0/XG5cdCAqIHRpcHBlZF90b25zX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgcHVycGxl4oCdP1xuXHQgKiBnZW5kZXI6IOKAnG3igJ0gKG1hbGUpLCDigJxm4oCdIChmZW1hbGUpLCDigJxz4oCdICh0cmFucyksIG9yIOKAnGPigJ0gKGNvdXBsZSlcblx0ICovXG5cdG9uTWVzc2FnZShjYk1lc3NhZ2UpIHtcblx0XHR0aGlzLnBhcnNlTWVzc2FnZUZvckNvbW1hbmRzKGNiTWVzc2FnZSk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBbb25UaXAgZGVzY3JpcHRpb25dXG5cdCAqIEBwYXJhbSAge29iamVjdH0gdGlwIEluZm8gcmVsYXRlZCB0byB0aGUgdGlwLiBcblx0ICogQHJldHVybiB7W3R5cGVdfSAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKiBcblx0ICogYW1vdW50OiBhbW91bnQgb2YgdGlwXG5cdCAqIG1lc3NhZ2U6IG1lc3NhZ2UgaW4gdGlwXG5cdCAqIHRvX3VzZXI6IHVzZXIgd2hvIHJlY2VpdmVkIHRpcFxuXHQgKiBmcm9tX3VzZXI6IHVzZXIgd2hvIHNlbnQgdGlwXG5cdCAqIGZyb21fdXNlcl9pbl9mYW5jbHViOiBpcyB0aGUgdXNlciBpbiB0aGUgYnJvYWRjYXN0ZXJzIGZhbiBjbHViXG5cdCAqIGZyb21fdXNlcl9oYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBmcm9tX3VzZXJfaXNfbW9kOiBpcyB0aGUgdXNlciBhIG1vZGVyYXRvclxuXHQgKiBmcm9tX3VzZXJfdGlwcGVkX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgYmx1ZeKAnT9cblx0ICogZnJvbV91c2VyX3RpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogZnJvbV91c2VyX3RpcHBlZF90b25zX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgcHVycGxl4oCdP1xuXHQgKiBmcm9tX3VzZXJfZ2VuZGVyOiDigJxt4oCdIChtYWxlKSwg4oCcZuKAnSAoZmVtYWxlKSwg4oCcc+KAnSAodHJhbnMpLCBvciDigJxj4oCdIChjb3VwbGUpXG5cdCAqL1xuXHRvblRpcCh0aXApIHsgcmV0dXJuOyB9XG5cblx0LyoqXG5cdCAqIFtvbkVudGVyIGRlc2NyaXB0aW9uXVxuXHQgKiBAcGFyYW0gIHtvYmplY3R9IHVzZXIgSW5mbyByZWxhdGVkIHRvIHRoZSB1c2VyIHdobyBlbnRlcnMgdGhlIHJvb20uXG5cdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG5cdCAqXG5cdCAqIHVzZXI6IHVzZXIgd2hvIGVudGVyZWQgdGhlIHJvb21cblx0ICogaW5fZmFuY2x1YjogaXMgdGhlIHVzZXIgaW4gdGhlIGJyb2FkY2FzdGVy4oCZcyBmYW4gY2x1YlxuXHQgKiBoYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBpc19tb2Q6IGlzIHRoZSB1c2VyIGEgbW9kZXJhdG9yXG5cdCAqIHRpcHBlZF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIGJsdWXigJ0/XG5cdCAqIHRpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogdGlwcGVkX3RvbnNfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBwdXJwbGXigJ0/XG5cdCAqIGdlbmRlcjog4oCcbeKAnSAobWFsZSksIOKAnGbigJ0gKGZlbWFsZSksIOKAnHPigJ0gKHRyYW5zKSwgb3Ig4oCcY+KAnSAoY291cGxlKVxuXHQgKi9cblx0b25FbnRlcih1c2VyKSB7IHJldHVybjsgfVxuXG5cdC8qKlxuXHQgKiBbb25MZWF2ZSBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2JqZWN0fSB1c2VyIEluZm8gcmVsYXRlZCB0byB0aGUgdXNlciB3aG8gbGVhdmVzIHRoZSByb29tLlxuXHQgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgW2Rlc2NyaXB0aW9uXVxuXHQgKiBcblx0ICogdXNlcjogdXNlciB3aG8gbGVmdCB0aGUgcm9vbVxuXHQgKiBpbl9mYW5jbHViOiBpcyB0aGUgdXNlciBpbiB0aGUgYnJvYWRjYXN0ZXLigJlzIGZhbiBjbHViXG5cdCAqIGhhc190b2tlbnM6IGRvZXMgdGhlIHVzZXIgaGF2ZSBhdCBsZWFzdCAxIHRva2VuXG5cdCAqIGlzX21vZDogaXMgdGhlIHVzZXIgYSBtb2RlcmF0b3Jcblx0ICogdGlwcGVkX3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnGRhcmsgYmx1ZeKAnT9cblx0ICogdGlwcGVkX2Fsb3RfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCccHVycGxl4oCdP1xuXHQgKiB0aXBwZWRfdG9uc19yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIHB1cnBsZeKAnT9cblx0ICogZ2VuZGVyOiDigJxt4oCdIChtYWxlKSwg4oCcZuKAnSAoZmVtYWxlKSwg4oCcc+KAnSAodHJhbnMpLCBvciDigJxj4oCdIChjb3VwbGUpXG5cdCAqL1xuXHRvbkxlYXZlKHVzZXIpIHsgcmV0dXJuOyB9XG5cblx0LyoqXG5cdCAqIFtvbkRyYXdQYW5lbCBkZXNjcmlwdGlvbl1cblx0ICogQHBhcmFtICB7b2plY3R9IHVzZXIgSW5mbyByZWxhdGVkIHRvIHRoZSB1c2VyIHdobyBlbnRlcnMgdGhlIHJvb20uXG5cdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG5cdCAqXG5cdCAqIHVzZXI6IHVzZXIgd2hvIGVudGVyZWQgdGhlIHJvb21cblx0ICogaW5fZmFuY2x1YjogaXMgdGhlIHVzZXIgaW4gdGhlIGJyb2FkY2FzdGVy4oCZcyBmYW4gY2x1YlxuXHQgKiBoYXNfdG9rZW5zOiBkb2VzIHRoZSB1c2VyIGhhdmUgYXQgbGVhc3QgMSB0b2tlblxuXHQgKiBpc19tb2Q6IGlzIHRoZSB1c2VyIGEgbW9kZXJhdG9yXG5cdCAqIHRpcHBlZF9yZWNlbnRseTogaXMgdGhlIHVzZXIgYSDigJxkYXJrIGJsdWXigJ0/XG5cdCAqIHRpcHBlZF9hbG90X3JlY2VudGx5OiBpcyB0aGUgdXNlciBhIOKAnHB1cnBsZeKAnT9cblx0ICogdGlwcGVkX3RvbnNfcmVjZW50bHk6IGlzIHRoZSB1c2VyIGEg4oCcZGFyayBwdXJwbGXigJ0/XG5cdCAqIGdlbmRlcjog4oCcbeKAnSAobWFsZSksIOKAnGbigJ0gKGZlbWFsZSksIOKAnHPigJ0gKHRyYW5zKSwgb3Ig4oCcY+KAnSAoY291cGxlKVxuXHQgKi9cblx0b25EcmF3UGFuZWwodXNlcikgeyByZXR1cm47IH1cblxuXHQvLy8vLy8vLy8vL1xuXHQvLyB1dGlscyAvL1xuXHQvLy8vLy8vLy8vL1xuXG5cblx0cGFyc2VNZXNzYWdlRm9yQ29tbWFuZHMoY2JNZXNzYWdlKSB7XG5cdFx0Y29uc3QgY29tbWFuZCA9IHRoaXMuZ2V0Q29tbWFuZChjYk1lc3NhZ2UubSk7XG5cblx0XHRpZiAoY29tbWFuZCkge1xuXHRcdFx0KHRoaXMuaXNSdW5uaW5nKCkgfHwgdGhpcy5pc0NvcmVDb21tYW5kKGNvbW1hbmQub3B0aW9uc1swXSkpICYmICh0eXBlb2YgdGhpcy5wcm9jZXNzQ29tbWFuZCA9PSAnZnVuY3Rpb24nKSAmJiB0aGlzLnByb2Nlc3NDb21tYW5kKGNvbW1hbmQub3B0aW9ucywgY2JNZXNzYWdlKTtcblx0XHRcdC8vIFRPRE86IHNob2xkIGdpdmUgZmVlZGJhY2s/XG5cdFx0XHRjYk1lc3NhZ2VbJ1gtU3BhbSddID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGNiTWVzc2FnZTtcblx0fVxuXG5cdGdldENvbW1hbmQobWVzc2FnZVRleHQpIHtcblx0XHRjb25zdCBtZXNzYWdlQXJyYXkgPSBtZXNzYWdlVGV4dC50cmltKCkuc3BsaXQoL1xccysvKTtcblx0XHRpZiAodGhpcy5hbGlhcyAmJiB0aGlzLmFsaWFzLmluY2x1ZGVzKG1lc3NhZ2VBcnJheVswXSkpIHtcblx0XHRcdC8vIHJldHVybnMgYSBkYXRhIG9iamVjdCB3aXRoIGNvbW1hbmQgYW5kIG9wdGlvbnNcblx0XHRcdHJldHVybiB7Y29tbWFuZCA6IG1lc3NhZ2VBcnJheVswXSwgb3B0aW9ucyA6IG1lc3NhZ2VBcnJheS5zbGljZSgxKX07XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNoZWNrUGVybWlzc2lvbihhY3Rpb24sIGNiTWVzc2FnZSkge1xuXHRcdHJldHVybiAvKiB0aGlzLmNoZWNrT3B0aW9uKCcqJywgY2JNZXNzYWdlKSB8fCAqLyAoXG5cdFx0XHR0aGlzLnBlcm1pc3Npb25zW2FjdGlvbl0gJiYgXG5cdCAgICAgICBcdFx0KGNiTWVzc2FnZS5pc19tb2QgJiYgdGhpcy5wZXJtaXNzaW9uc1thY3Rpb25dICYmIHRoaXMucGVybWlzc2lvbnNbYWN0aW9uXS5pbmRleE9mKCdtJykgPj0gMCkgfHwgLy8gaWYgbW9kIGlzIGFsbG93ZWRcblx0XHQgICAgICAgXHQoY2JNZXNzYWdlLnVzZXIgPT0gdGhpcy5jYi5yb29tX3NsdWcgJiYgdGhpcy5wZXJtaXNzaW9uc1thY3Rpb25dLmluZGV4T2YoJ2InKSA+PSAwKSB8fCAvLyBvciBicm9hZGNhc3RlciBpcyBhbGxvd2VkXG5cdFx0ICAgICAgIFx0KHRoaXMucGVybWlzc2lvbnNbYWN0aW9uXS5pbmRleE9mKCdhJykgPj0gMCkgLy8gb3IgZXZlcnlvbmUgaXMgYWxsb3dlZFxuXHRcdCk7IFxuXHR9XG5cblx0Z2V0U2V0dGluZ3NDaG9pY2VzKCkgeyBcblx0XHRyZXR1cm4gW107IFxuXHR9XG59XG5cblxuLy8gY29uc3QgY29uZmlnID0ge1xuLy8gXHRkZXNjcmlwdGlvbjogJycsXG4vLyBcdGhlbHAgOiBbXG4vLyBcdFx0e1xuLy8gXHRcdFx0YWNjZXNzOicnLFxuLy8gXHRcdFx0dGV4dDonJyxcbi8vIFx0XHR9XG4vLyBcdF1cbi8vIH0iLCJleHBvcnQgY2xhc3MgQm90TWFuYWdlciB7XG5cdGNvbnN0cnVjdG9yKGNiKSB7XG5cdFx0XHR0aGlzLmNiICAgICAgICAgICAgICAgICAgPSBjYjtcblx0XHRcdHRoaXMuYm90cyAgICAgICAgICAgICAgICA9IFtdO1xuXHRcdFx0dGhpcy5zZXR0aW5nc19jaG9pY2VzICAgID0gW107XG5cdFx0XHR0aGlzLnN0YXJ0ICAgICAgICAgICAgICAgPSBEYXRlLm5vdygpO1xuXG5cdFx0dGhpcy5jYi5vbk1lc3NhZ2UoKG1lc3NhZ2UpID0+IHtcblx0XHRcdHRoaXMub25NZXNzYWdlKG1lc3NhZ2UpO1xuXHRcdH0pO1xuXHRcdHRoaXMuY2Iub25UaXAoKHRpcCkgPT4ge1xuXHRcdFx0dGhpcy5vblRpcCh0aXApO1xuXHRcdH0pO1xuXHRcdHRoaXMuY2Iub25FbnRlcigodXNlcikgPT4ge1xuXHRcdFx0dGhpcy5vbkVudGVyKHVzZXIpO1xuXHRcdH0pO1xuXHRcdHRoaXMuY2Iub25MZWF2ZSgodXNlcikgPT4ge1xuXHRcdFx0dGhpcy5vbkxlYXZlKHVzZXIpO1xuXHRcdH0pO1xuXHRcdHRoaXMuY2Iub25EcmF3UGFuZWwoKHVzZXIpID0+IHtcblx0XHRcdHRoaXMub25EcmF3UGFuZWwodXNlcik7XG5cdFx0fSk7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIGJvdCBsaXN0IG1hbmFnZW1lbnQgLy9cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdGdldFNldHRpbmdzQ2hvaWNlcygpIHtcblx0XHRyZXR1cm4gdGhpcy5ib3RzLnJlZHVjZSgocmVzdWx0LCBib3QpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgYm90LmJvdC5nZXRTZXR0aW5nc0Nob2ljZXMgPT0gJ2Z1bmN0aW9uJyl7XG5cdFx0XHRcdHJldHVybiByZXN1bHQuY29uY2F0KGJvdC5ib3QuZ2V0U2V0dGluZ3NDaG9pY2VzKCkpOyBcblx0XHRcdH1cblx0XHR9LFtdKTtcblx0XHQvLyB0aGlzLmNiLmxvZyhyZXN1bHQpO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBib3QgbGlzdCBtYW5hZ2VtZW50IC8vXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRhZGQoaWQsIGJvdCkgeyBcblx0XHR0aGlzLmJvdHMucHVzaCh7aWQsIGJvdH0pO1xuXHR9XG5cblx0Z2V0KGlkKSB7XG5cdFx0cmV0dXJuIHRoaXMuYm90cy5maW5kKChpdGVtKSA9PiB7XG5cdFx0XHRyZXR1cm4gaXRlbS5pZCA9PSBpZDtcblx0XHR9KVsnYm90J107XG5cdH1cblxuXHRyZW1vdmUoaWQpIHtcblx0XHR0aGlzLmJvdHMuc3BsaWNlKHRoaXMuYm90cy5maW5kSW5kZXgoKGl0ZW0pPT57XG5cdFx0XHRyZXR1cm4gaXRlbS5pZCA9PSBpZDtcblx0XHR9KSwxKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vL1xuXHQvLyBldmVudHMgLy9cblx0Ly8vLy8vLy8vLy8vXG5cblx0b25NZXNzYWdlKG1lc3NhZ2UpIHtcblx0XHR0aGlzLmJvdHMuZm9yRWFjaCgoYm90KSA9PiB7XG5cdFx0XHQodHlwZW9mIGJvdC5ib3Qub25NZXNzYWdlID09ICdmdW5jdGlvbicpICYmIGJvdC5ib3Qub25NZXNzYWdlKG1lc3NhZ2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25UaXAodGlwKSB7XG5cdFx0dGhpcy5ib3RzLmZvckVhY2goKGJvdCkgPT4ge1xuXHRcdFx0Ym90LmJvdC5pc1J1bm5pbmcoKSAmJiAodHlwZW9mIGJvdC5ib3Qub25UaXAgPT0gJ2Z1bmN0aW9uJykgJiYgYm90LmJvdC5vblRpcCh0aXApO1xuXHRcdH0pO1xuXHR9XG5cblx0b25FbnRlcih1c2VyKSB7XG5cdFx0dGhpcy5ib3RzLmZvckVhY2goKGJvdCkgPT4ge1xuXHRcdFx0Ym90LmJvdC5pc1J1bm5pbmcoKSAmJiAodHlwZW9mIGJvdC5ib3Qub25FbnRlciA9PSAnZnVuY3Rpb24nKSAmJiBib3QuYm90Lm9uRW50ZXIodXNlcik7XG5cdFx0fSk7XG5cdH1cblxuXHRvbkxlYXZlKHVzZXIpIHtcblx0XHR0aGlzLmJvdHMuZm9yRWFjaCgoYm90KSA9PiB7XG5cdFx0XHRib3QuYm90LmlzUnVubmluZygpICYmICh0eXBlb2YgYm90LmJvdC5vbkxlYXZlID09ICdmdW5jdGlvbicpICYmIGJvdC5ib3Qub25MZWF2ZSh1c2VyKTtcblx0XHR9KTtcblx0fVxuXG5cdG9uRHJhd1BhbmVsKHVzZXIpIHtcblx0XHR0aGlzLmJvdHMuZm9yRWFjaCgoYm90KSA9PiB7XG5cdFx0XHRib3QuYm90LmlzUnVubmluZygpICYmICh0eXBlb2YgYm90LmJvdC5vbkRyYXdQYW5lbCA9PSAnZnVuY3Rpb24nKSAmJiBib3QuYm90Lm9uRHJhd1BhbmVsKHVzZXIpO1xuXHRcdH0pO1xuXHR9XG59IiwiaW1wb3J0IHt1bmljb2RlQ2hhcnN9IGZyb20gJy4vdmFsdWVzLmpzJztcblxuZXhwb3J0IGNsYXNzIEVjaG8ge1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBmb3JtYXQgbWVzc2FnZXMgLy9cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFxuXHRzdGF0aWMgZm9ybWF0TGluZXModGV4dCwgbGVuZ3RoPTEwKSB7XG5cdFx0cmV0dXJuIGAke3VuaWNvZGVDaGFycy50b3BMZWZ0Q29ybmVyfSR7RWNoby5yZXBlYXQodW5pY29kZUNoYXJzLmRhc2hDaGFyLCBsZW5ndGgpfVxuXHRcdCAgICAgICAgJHt1bmljb2RlQ2hhcnMudmVydERhc2h9ICR7dGV4dH1cblx0XHQgICAgICAgICR7dW5pY29kZUNoYXJzLmJvdHRvbUxlZnRDb3JuZXJ9JHtFY2hvLnJlcGVhdCh1bmljb2RlQ2hhcnMuZGFzaENoYXIsIGxlbmd0aCl9YDtcblx0fVxuXG5cdHN0YXRpYyBmb3JtYXRCcmFja2V0KHRleHQsIGNoYXIpIHtcblx0XHRyZXR1cm4gYCR7RWNoby5yZXBlYXQoY2hhciw0KX1cblx0XHQgICAgICAgICR7RWNoby5mb3JtYXRQcmVmaXgoY2hhcil9XG5cdFx0ICAgICAgICAke0VjaG8ucmVwZWF0KGNoYXIsNCl9YDtcblx0fVxuXG5cdHN0YXRpYyBmb3JtYXRQcmVmaXgodGV4dCwgY2hhcikge1xuXHRcdGxldCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuXHRcdHJldHVybiBsaW5lcy5tYXAobGluZSA9PiBgJHtjaGFyfSAke2xpbmV9YCkuam9pbignXFxuJyk7XG5cdH1cblxuXHRzdGF0aWMgcmVwZWF0KGNoYXIsIHRpbWVzKSB7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXHRcdHdoaWxlKHRpbWVzLS0pIHJlc3VsdCArPSBjaGFyO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gc2VuZCBub3RpY2VzIC8vXG5cdC8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdHN0YXRpYyBzZW5kKHtncm91cD0nJywgdXNlciA9ICcnLCBpbnZlcnNlID0gZmFsc2UsIGNvbG9yLCBiYWNrZ3JvdW5kLCB0ZXh0LCBjYn0pIHtcblx0XHRpbnZlcnNlICYmIChbYmFja2dyb3VuZCwgY29sb3JdID0gW2NvbG9yLCBiYWNrZ3JvdW5kXSk7XG5cdFx0Y2Iuc2VuZE5vdGljZSh0ZXh0LCB1c2VyLCBiYWNrZ3JvdW5kLCBjb2xvciwgJ25vcm1hbCcsIGdyb3VwKTtcblx0fVxuXG5cdHN0YXRpYyBzZW5kQm9sZCh7Z3JvdXA9JycsIHVzZXIgPSAnJywgaW52ZXJzZSA9IGZhbHNlLCBjb2xvciwgYmFja2dyb3VuZCwgdGV4dCwgY2J9KSB7XG5cdFx0aW52ZXJzZSAmJiAoW2JhY2tncm91bmQsIGNvbG9yXSA9IFtjb2xvciwgYmFja2dyb3VuZF0pO1xuXHRcdGNiLnNlbmROb3RpY2UodGV4dCwgdXNlciwgYmFja2dyb3VuZCwgY29sb3IsICdib2xkJywgZ3JvdXApO1xuXHR9XG5cbn0iLCJpbXBvcnQge0JvdH0gIGZyb20gXCIuL2JvdC5qc1wiO1xuaW1wb3J0IHtFY2hvfSAgZnJvbSBcIi4vZWNoby5qc1wiO1xuaW1wb3J0IHtibGFja0xpc3R9IGZyb20gJy4vYmxhY2tfbGlzdC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXJiZXJvcyBleHRlbmRzIEJvdCB7XG5cdG5hbWUgICAgICAgICAgICA9ICdTUEFNL2FidXNlIGZpbHRlciBib3QnO1xuXHRkZXNjcmlwdGlvbiAgICAgPSAnQSBib3QgZm9yIGhhbmRsaW5nIGluc3VsdHMsIGFidXNpdmUgbGFuZ3VhZ2UsIFNQQU0nO1xuXHRhbGlhcyAgICAgICAgICAgPSBbJyFrZXInLCcva2VyJ107XG5cdHBlcm1pc3Npb25zICAgICA9IHtcblx0XHQnYWRkLXVzZXInOidibScsIFxuXHRcdCdhZGQtdGV4dCc6J2JtJ1xuXHR9O1xuXG4gICAgZm9yZWdyb3VuZENvbG9yID0gJyNmZmZmZmYnO1xuXHRiYWNrZ3JvdW5kQ29sb3IgPSAnIzk5MDBmZic7XG5cdFxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG5cdFx0c3VwZXIoYXBwLCBjYik7XG5cdFx0dGhpcy51c2VycyAgICAgPSB0aGlzLnBhcnNlQmxhY2tsaXN0KGJsYWNrTGlzdC51c2Vycyk7XG5cdFx0dGhpcy5ibGFja2xpc3QgPSB0aGlzLnBhcnNlQmxhY2tsaXN0KGJsYWNrTGlzdC5ibGFja0xpc3QpO1xuXHR9XG5cblx0b25NZXNzYWdlKG1lc3NhZ2UpIHtcblx0XHR0aGlzLnBhcnNlTWVzc2FnZUZvckNvbW1hbmRzKG1lc3NhZ2UpO1xuXHRcdGlmICghbWVzc2FnZVsnWC1TcGFtJ10gJiYgIXRoaXMuaXNDbGVhbihtZXNzYWdlLm0pKSB7XG5cdFx0XHRpZiAodGhpcy51c2Vycy5pbmNsdWRlcyhtZXNzYWdlLnVzZXIudG9Mb3dlckNhc2UoKSkpIHtcblx0XHRcdFx0bWVzc2FnZVsnWC1TcGFtJ10gPSB0cnVlO1x0XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLmlzUHJpdmlsZWdlZChtZXNzYWdlKSkge1xuXHRcdFx0XHR0aGlzLm5vdGlmeUFidXNlKG1lc3NhZ2UubSwgbWVzc2FnZS51c2VyKTtcblx0XHRcdFx0bWVzc2FnZVsnWC1TcGFtJ10gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbWVzc2FnZTtcblx0fVxuXG5cdGlzUHJpdmlsZWdlZChtZXNzYWdlKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2Iucm9vbV9zbHVnID09IG1lc3NhZ2UudXNlciB8fCBtZXNzYWdlLmlzX21vZDsgXG5cdH1cblxuXHRpc0NsZWFuKHRleHQpIHtcblx0XHRyZXR1cm4gIXRoaXMuYmxhY2tsaXN0ZWQodGV4dC50b0xvd2VyQ2FzZSgpKTtcblx0fVxuXG5cdHByb2Nlc3NDb21tYW5kKG9wdGlvbnMsIG1lc3NhZ2UpIHtcblx0XHRpZiAoIXRoaXMuY2hlY2tQZXJtaXNzaW9uKG9wdGlvbnNbMF0sIG1lc3NhZ2UpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIGFkZC11c2VyXG5cdFx0aWYgKG9wdGlvbnMubGVuZ3RoID4gMSAmJiBvcHRpb25zWzBdID09ICdhZGQtdXNlcicpIHtcblx0XHRcdG9wdGlvbnMuc2xpY2UoMSkuZm9yRWFjaCgodXNlcikgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMudXNlcnMuaW5jbHVkZXModXNlcikpe1xuXHRcdFx0XHRcdHRoaXMudXNlcnMucHVzaCh1c2VyKTtcblx0XHRcdFx0XHRFY2hvLnNlbmQoe3VzZXI6IG1lc3NhZ2UudXNlciwgdGV4dDogYHVzZXIgJHt1c2VyfSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYmxhY2tsaXN0YCwgY29sb3I6IHRoaXMuZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kOiB0aGlzLmJhY2tncm91bmRDb2xvciwgY2I6IHRoaXMuY2J9KTtcblx0XHRcdFx0fSBcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBhZGQtdGV4dFxuXHRcdGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1swXSA9PSAnYWRkLXRleHQnKSB7XG5cdFx0XHRjb25zdCBzdGFydCA9IG1lc3NhZ2UubS5pbmRleE9mKCdhZGQtdGV4dCcpICsgJ2FkZC10ZXh0Jy5sZW5ndGgsXG5cdFx0XHQgICAgICB0ZXh0ICA9IG1lc3NhZ2UubS5zbGljZShzdGFydCkudHJpbSgpO1xuXHRcdFx0aWYgKCF0aGlzLmJsYWNrbGlzdC5pbmNsdWRlcyh0ZXh0KSl7XG5cdFx0XHRcdHRoaXMuYmxhY2tsaXN0LnB1c2godGhpcy5wYXJzZSh0ZXh0KSk7XG5cdFx0XHRcdEVjaG8uc2VuZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0OiBgJHt0ZXh0fSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYmxhY2tsaXN0YCwgY29sb3I6IHRoaXMuZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kOiB0aGlzLmJhY2tncm91bmRDb2xvciwgY2I6IHRoaXMuY2J9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRibGFja2xpc3RlZCh0ZXh0KSB7XG5cdFx0cmV0dXJuIHRoaXMuYmxhY2tsaXN0LnNvbWUoZWxlbWVudCA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpXG5cdFx0XHRcdHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRpZiAodHlwZW9mIGVsZW1lbnQgPT0gJ29iamVjdCcpe1xuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC50ZXN0KHRleHQudG9Mb3dlckNhc2UoKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIHRoZSBibGFjayBsaXN0IGZyb20gdGhlIG9iamVjdCBwcm92aWRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gYmxhY2tsaXN0IFRoZSBibGFja2xpc3Qgd2l0aCBzdHJpbmdzIGFuZCByZWdleHBzXG5cdCAqL1xuXHRwYXJzZUJsYWNrbGlzdChibGFja2xpc3QpIHtcblx0XHRyZXR1cm4gYmxhY2tsaXN0Lm1hcChpdGVtID0+IHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlKGl0ZW0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSB0ZXh0L3JlZ3JleHAgdG8gdGhlIGJsYWNrbGlzdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgc3RyaW5nIHRvIGJlIHBhcnNlZFxuXHQgKi9cblx0cGFyc2UodGV4dCl7XG5cdFx0aWYgKC9eXFwvLipcXC8kLy50ZXN0KHRleHQpKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFJlZ0V4cCh0ZXh0LnNsaWNlKDEsLTEpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTtcblx0fVxuXG5cdG5vdGlmeUFidXNlKG1lc3NhZ2UsIHVzZXIpIHtcblx0XHRjb25zdCBjYiA9IHRoaXMuY2IsXG5cdFx0XHQgIHRleHQgPSBgTWVzc2FnZSAnJHttZXNzYWdlfScgXFxuZnJvbSAke3VzZXJ9IFxcbmhhcyBiZWVuIHNpbGVuY2VkIGJ5IGtlcmJlcm9zLmA7XG5cblx0XHRFY2hvLnNlbmQoe2dyb3VwOidyZWQnLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYn0pO1xuXHRcdEVjaG8uc2VuZCh7dXNlcjogdGhpcy5jYi5yb29tX3NsdWcsIHRleHQsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNifSk7XG5cdH1cbn0iLCJpbXBvcnQgIHtCb3R9IGZyb20gXCIuL2JvdC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2VuZ2VyIGV4dGVuZHMgQm90IHtcbiAgICBuYW1lID0gJ01lc3NlbmdlciBib3QnO1xuXG5cdGNvbnN0cnVjdG9yKGFwcCwgY2Ipe1xuXHRcdHN1cGVyKGFwcCxjYik7XG5cdH1cdFxuXG5cdG9uTWVzc2FnZShtc2cpIHtcblx0XHRjb25zdCB0aXBTdW0gPSB0aGlzLmFwcC5nZXQoJ3RpcHBlcicpLnN0YXRzLnN1bUZyb21Vc2VyKG1zZy51c2VyKSxcbiAgICAgICAgICAgICAgcHJlZml4ID0gdGlwU3VtID4gMCA/IGBbJHt0aXBTdW19XSBgOicnO1xuICAgICAgICBtc2cubSA9IGAke3ByZWZpeH0ke21zZy5tfWA7XG5cdH1cbn0iLCJpbXBvcnQge0JvdH0gICAgICAgICAgZnJvbSAnLi9ib3QuanMnO1xuaW1wb3J0IHtUaGFua3NNYW5hZ2VyfSBmcm9tIFwiLi90aGFua3NfbWFuYWdlci5qc1wiO1xuaW1wb3J0IHtFY2hvfSAgICAgICAgZnJvbSBcIi4vZWNoby5qc1wiO1xuXG4vKipcbiAqIE5vdGlmaWVyLlxuICovXG5leHBvcnQgY2xhc3MgTm90aWZpZXIgZXh0ZW5kcyBCb3Qge1xuXHRuYW1lICAgICAgICAgICAgPSAnTm90aWZpZXIgYm90Jztcblx0ZGVzY3JpcHRpb24gICAgID0gJ0EgYm90IGZvciBoYW5kbGluZyBub3RpZmljYXRpb25zJztcblx0YWxpYXMgICAgICAgICAgID0gWychbm90JywnL25vdCddO1xuXHRwZXJtaXNzaW9ucyAgICAgPSB7XG5cdFx0JyonOiAnYm0nXG5cdH07XG5cdHRleHQgICAgICAgICAgICA9ICcnO1xuXHRcblx0Y29uc3RydWN0b3IoYXBwLCBjYiwgc2V0dGluZ3MgPSB7fSkge1xuXHRcdHN1cGVyKGFwcCwgY2IpO1xuXHRcdHNldHRpbmdzLmNvbG9yICAgICAgICAgICB8fCAodGhpcy5jb2xvciA9IHNldHRpbmdzLmNvbG9yKTtcblx0XHRzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3IgfHwgKHRoaXMuYmFja2dyb3VuZENvbG9yID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yKTtcblx0fVxuXG5cdHByb2Nlc3NDb21tYW5kKG9wdGlvbnMsIGNiTWVzc2FnZSkge1xuXHRcdGlmICghdGhpcy5jaGVja1Blcm1pc3Npb24ob3B0aW9uc1swXSwgY2JNZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHR0aGlzLnRleHQgPSBvcHRpb25zLmpvaW4oJyAnKTtcblx0XHR0aGlzLnRleHQgPSBFY2hvLmZvcm1hdExpbmVzKHRoaXMudGV4dCk7XG5cdFx0RWNoby5zZW5kKHtjYjp0aGlzLmNiLCB0ZXh0OiB0aGlzLnRleHR9KTtcblx0fVxuXG5cdG9uRW50ZXIodXNlcikge1xuXHRcdEVjaG8uc2VuZCh7Y2I6dGhpcy5jYiwgdXNlcjp1c2VyLnVzZXIsIHRleHQ6IGBoZWxsbyAke3VzZXIudXNlcn0hYH0pO1xuXHR9XG59IiwiZXhwb3J0IGNsYXNzIFN0YXRzIHtcblx0bmFtZSA9ICdTdGF0cyc7XG5cblx0Y29uc3RydWN0b3IoYXBwLCBjYikge1xuXHRcdHRoaXMuYXBwID0gYXBwO1xuXHRcdHRoaXMuY2IgPSBjYjtcblx0XHR0aGlzLmhpc3RvcnkgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSB0aXAgZW50cnkgdG8gdGhlIGhpc3RvcnkuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB0aXAgVGlwIGRhdGEuXG5cdCAqIEByZXR1cm4ge29iamVjdH0gRGF0YSBob2xkaW5nIHRoZSBjaGFuZ2VzLlxuXHQgKi9cblx0YWRkVGlwKHRpcCkge1xuICAgICAgICBjb25zdCBvbGREYXRhID0ge1xuXHRcdFx0YmVzdDogdGhpcy5iZXN0VGlwcGVyKCksIFxuXHRcdFx0aGlnaGVzdDp0aGlzLmhpZ2hlc3RUaXAoKVxuXHRcdH07XG5cdFx0dGhpcy5oaXN0b3J5LnB1c2goe1xuXHRcdFx0dXNlcm5hbWU6IHRpcC5mcm9tX3VzZXIsXG5cdFx0XHRhbW91bnQgIDogdGlwLmFtb3VudCxcblx0XHRcdGZhbiAgICAgOiB0aXAuZnJvbV91c2VyX2luX2ZhbmNsdWIsXG5cdFx0XHR0aW1lICAgIDogRGF0ZS5ub3coKVxuXHRcdH0pO1xuXG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSB7XG5cdFx0XHRiZXN0OiB0aGlzLmJlc3RUaXBwZXIoKSwgXG5cdFx0XHRoaWdoZXN0OnRoaXMuaGlnaGVzdFRpcCgpXG5cdFx0fSxcblx0XHRcdG5ld0Jlc3QgPSBvbGREYXRhLmJlc3QudXNlcm5hbWUgPT0gbmV3RGF0YS5iZXN0LnVzZXJuYW1lID8gJyc6IG5ld0RhdGEuYmVzdCxcblx0XHRcdG5ld0hpZ2hlc3QgPSBvbGREYXRhLmhpZ2hlc3QuYW1vdW50ID09IG5ld0RhdGEuaGlnaGVzdC5hbW91bnQgPyAnJzogbmV3RGF0YS5oaWdoZXN0O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGJlc3Q6IG5ld0Jlc3QsIFxuXHRcdFx0aGlnaGVzdDogbmV3SGlnaGVzdFxuXHRcdH07XG5cdH1cblxuXHRzdW0oKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gYWNjdW11bGF0b3IgKyBjdXJyZW50LmFtb3VudDtcblx0XHR9LCAwKTtcblx0fVxuXG5cdHRva2VuUmF0ZSgpIHtcblx0XHRjb25zdCBtaW51dGVzID0gKERhdGUubm93KCkgLSB0aGlzLmFwcC5zdGFydCkvKDYwKjEwMDApO1xuXHRcdHJldHVybiBwYXJzZUZsb2F0KCh0aGlzLnN1bSgpL21pbnV0ZXMpLnRvRml4ZWQoMikpO1xuXHR9XG5cblx0aGlnaGVzdEJ5VXNlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LnJlZHVjZSgoYWNjdW11bGF0b3IsY3VycmVudCk9Pntcblx0XHRcdGxldCBmb3VuZCA9IGFjY3VtdWxhdG9yLmZpbmQoaXRlbSA9PiBpdGVtLnVzZXJuYW1lID09IGN1cnJlbnQudXNlcm5hbWUpO1xuXHRcdFx0aWYoIWZvdW5kKSB7IFxuXHRcdFx0XHRmb3VuZCA9IHt1c2VybmFtZTogY3VycmVudC51c2VybmFtZSwgYW1vdW50OiAwfTtcblx0XHRcdFx0YWNjdW11bGF0b3IucHVzaChmb3VuZCk7XG5cdFx0XHR9XG5cdFx0XHRmb3VuZC5hbW91bnQgPSBNYXRoLm1heChmb3VuZC5hbW91bnQsIGN1cnJlbnQuYW1vdW50KTtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0XHR9LFtdKS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRyZXR1cm4gYi5hbW91bnQgLSBhLmFtb3VudDtcblx0XHR9KTtcblx0fVxuXG5cdGhpZ2hlc3RUaXAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlnaGVzdEJ5VXNlcigpWzBdIHx8IHt1c2VybmFtZTogJycsIGFtb3VudDowfTtcblx0fVxuXG5cdHN1bUJ5VXNlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LnJlZHVjZSgoYWNjdW11bGF0b3IsY3VycmVudCk9Pntcblx0XHRcdGxldCBmb3VuZCA9IGFjY3VtdWxhdG9yLmZpbmQoaXRlbSA9PiBpdGVtLnVzZXJuYW1lID09IGN1cnJlbnQudXNlcm5hbWUpO1xuXHRcdFx0aWYoIWZvdW5kKSB7IFxuXHRcdFx0XHRmb3VuZCA9IHt1c2VybmFtZTogY3VycmVudC51c2VybmFtZSwgYW1vdW50OiAwfTtcblx0XHRcdFx0YWNjdW11bGF0b3IucHVzaChmb3VuZCk7XG5cdFx0XHR9XG5cdFx0XHRmb3VuZC5hbW91bnQgICArPSBjdXJyZW50LmFtb3VudDtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0XHR9LFtdKS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRyZXR1cm4gYi5hbW91bnQgLSBhLmFtb3VudDtcblx0XHR9KTtcblx0fVxuXG5cdGJlc3RUaXBwZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3VtQnlVc2VyKClbMF0gfHwge3VzZXJuYW1lOiAnJywgYW1vdW50OjB9O1xuXHR9XG5cblx0c3VtRnJvbVVzZXIodXNlcm5hbWUpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LmZpbHRlcihpdGVtID0+IHtcblx0XHRcdHJldHVybiB1c2VybmFtZSA9PSBpdGVtLnVzZXJuYW1lO1xuXHRcdH0pLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IHtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvciArIGN1cnJlbnQuYW1vdW50O1xuXHRcdH0sIDApO1xuXHR9XG5cblx0c3VtRnJvbUZhbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaGlzdG9yeS5maWx0ZXIoaXRlbSA9PiB7XG5cdFx0XHRyZXR1cm4gaXRlbS5mYW47XG5cdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yICsgY3VycmVudC5hbW91bnQ7XG5cdFx0fSwgMCk7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5oaXN0b3J5LnJldmVyc2UoKS5tYXAoKGl0ZW0pID0+IHtcblx0XHRcdHJldHVybiBgJHtpdGVtLnVzZXJuYW1lfTogJHtpdGVtLmFtb3VudH0gdG9rZW5zOiAke1N0YXRzLmhyVGltZShpdGVtLnRpbWUpfWA7XG5cdFx0fSkuam9pbignXFxuJyk7XG5cdH1cblxuXHRjbGVhclN0YXRzKCkge1xuXHRcdHRoaXMuaGlzdG9yeSA9IFtdO1xuXHR9XG5cblx0c3RhdGljIGhyVGltZShtaWxpc2Vjb25kcykge1xuXHRcdGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGlzZWNvbmRzIC8gMTAwMCk7XG5cdFx0Y29uc3QgaCA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDM2MDApO1xuXHRcdGNvbnN0IG0gPSBNYXRoLmZsb29yKChzZWNvbmRzICUgMzYwMCkgLyA2MCk7XG5cdFx0Y29uc3QgcyA9IHNlY29uZHMgJSA2MDsgXG5cdFx0cmV0dXJuIChoID4gMCA/IGggKyAnaG91cicgKyAoaCA+IDEgPyAncyAnIDogJyAnKSA6ICcnKSArIChzID09IDAgJiYgbSA+IDAgPyAnYW5kICcgOiAnJykgK1xuICAgICAgICAgICAgICAgKG0gPiAwID8gbSArICdtaW51dGUnICsgKG0gPiAxID8gJ3MgJyA6ICcgJykgOiAnJykgKyAocyA+IDAgJiYgaCArIG0gPiAwID8gJ2FuZCAnIDogJycpICtcbiAgICAgICAgICAgICAgIChzID4gMCA/IHMgKyAnc2Vjb25kJyArIChzID4gMSA/ICdzICcgOiAnICcpIDogJycpICsgJ2Fnbyc7XG5cdH1cbn0iLCJleHBvcnQgY29uc3Qgc3RhdHVzID0ge1xuXHRTVE9QUEVEOiAtMSxcblx0UEFVU0VEOiAwLFxuXHRSVU5OSU5HOiAxLFxufSIsImltcG9ydCB7Qm90fSBmcm9tIFwiLi9ib3QuanNcIjtcbmV4cG9ydCBjbGFzcyBUaGFua3NNYW5hZ2VyIGV4dGVuZHMgQm90IHtcblx0bmFtZSAgICAgICAgICAgID0gJ1RoYW5rcyBtYW5hZ2VyIGJvdCc7XG5cdGRlc2NyaXB0aW9uICAgICA9ICdBIGJvdCBmb3IgaGFuZGxpbmcgXCJ0aGFuayB5b3VcIiBtZXNzYWdlcyc7XG4gICAgYWxpYXMgICAgICAgICAgID0gWychdGhhbmtzJywnL3RoYW5rcyddO1xuICAgIHBlcm1pc3Npb25zICAgICA9IHsnYWRkJzogJ2JtJyxcblx0XHRcdFx0XHQgICAnbGlzdCc6ICdibScsXG5cdFx0XHRcdFx0ICAgJ3JtJyAgOiAnYm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAnc3RvcCc6ICdiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3J1bicgOiAnYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdwYXVzZSc6J2InXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgLy8gZm9yZWdyb3VuZENvbG9yID0gJyNiN2ZmMDAnO1xuXHQvLyBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmMDBjYyc7XG5cdHNldHRpbmdzSW5wdXRGaWVsZHMgPSAxMDtcblxuXG5cdGNvbnN0cnVjdG9yKGFwcCwgY2IpIHtcblx0XHRzdXBlcihhcHAsY2IpO1xuXHRcdHRoaXMudGhhbmtzID0ge1xuXHRcdFx0JzEtMTAnIDogW1xuXHRcdFx0XHQnVGhhbmtzICR1LCBrZWVwIHRoZW0gY29tbWluZyA7KScsXG5cdFx0XHRcdCdWZXJ5IG5pY2Ugb2YgeW91ICR1LiBUaGFua3MgZm9yIHRoZSB0aXAnXG5cdFx0XHRdLFxuXHRcdFx0JzY5JzpbXG5cdFx0XHRcdCckdCB0b2tlbnMgdWg/IGlzIHRoYXQgYSBzdWdnZXN0aW9uPycsXG5cdFx0XHRcdCckdCBpcyBteSBmYXZvcml0ZSBudW1iZXIhIGhvdyBkaWQgeW91IGtub3csICR1PycsXG5cdFx0XHRcdCckdCBpcyBmdW4sIGRvblxcJ3QgeW91IHRoaW5rPyB5b3UgbGlrZSB0byBiZSBvbiB0b3AsICR1PyBJIGRvJ1xuXHRcdFx0XSxcblx0XHRcdCczMDAtJzpbXG5cdFx0XHRcdCdHZWV6ICR1LCB0aGFuayB5b3Ugc28gbXVjaCEnLFxuXHRcdFx0XHQnRnVjayAkdS4gRG9uXFwndCBzdG9wIG5vdycsXG5cdFx0XHRdLFxuXHRcdFx0JzEwMS0yMDAnOltcblx0XHRcdFx0J1lvdVxcJ3JlIHNvIGdlbmVyb3VzLCAkdSEnLFxuXHRcdFx0XHQnTG92ZSB5b3UsICR1ISAkdCB0b2tlbnMhIDwzIDwzJ1xuXHRcdFx0XSxcblx0XHRcdCcxNS0xMDAnOiBbXG5cdFx0XHRcdCdNbW1tbSAuLi4gT01HLCB0aGFuayB5b3UgJHUhJywgXG5cdFx0XHRcdCdTbyBzd2VldCBvZiB5b3UsICR1Jyxcblx0XHRcdFx0J1RoYW5rcyAkdSEnXG5cdFx0XHRdLFxuXHRcdFx0JzIwMS0zMDAnOltcblx0XHRcdFx0JyR0IHRva2VucyEgdGhhdFxcJ3MgaW5zYW5lICR1ISdcblx0XHRcdF0sXG5cdFx0XHQnMTAwMC0nIDogW1xuXHRcdFx0XHQnWWVzLCB5ZXMsIFlFU1NTU1NTICR1ISB0aGFuayB5b3UhISEnLFxuXHRcdFx0XHQnWWVlZWVlZWhhLCAkdSEgbGV0IG1lIHJpZGUgeW91IGxpa2UgYSBjb3dnaXJsLiBUaGFua3MgYSBsb3QhIScsXG5cdFx0XHRdLFxuXHRcdFx0JzUwMDAtJzogW1xuXHRcdFx0XHQnT0ggTVkgR09EISEgJHQgZnVja2luZyB0b2tlbnMhISBGdWNrIG1lIG5vdyEgLi4uIGFuZCB0aGVuIGtlZXAgZ29pbmchIEkgbG92ZSBpdCEnLFxuXHRcdFx0XHQnJHQgZnVja2luZyB0b2tlbnMhISEgT01HIC4uLk15IHB1c3N5IGlzIHlvdXJzICR1LCBteSBhc3MgaXMgeW91cnMsIG15IG1vdXRoIGlzIHlvdXJzLidcblx0XHRcdF1cblx0XHRcdFxuXHRcdH07XG5cblx0XHR0aGlzLmxvYWRDb25maWcoY2IpO1xuXHRcdHRoaXMuc29ydFRoYW5rcygpO1xuXHR9XG5cblx0c29ydFRoYW5rcygpIHtcblx0XHR0aGlzLnRoYW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudGhhbmtzKS5zb3J0KChhLGIpID0+IHtcblx0XHRcdGlmKGEuaW5kZXhPZignLScpIDwgMCAmJiBiLmluZGV4T2YoJy0nKSA8IDApXG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhKSAtIHBhcnNlSW50KGIpO1xuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPCAwICYmIGIuaW5kZXhPZignLScpID49IDApXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdGlmKGEuaW5kZXhPZignLScpID49IDAgJiYgYi5pbmRleE9mKCctJykgPCAwKVxuXHRcdFx0XHRyZXR1cm4gMTtcblxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPT0gMCAmJiBiLmluZGV4T2YoJy0nKSA9PSAwKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhLnNwbGl0KCctJylbMV0pIC0gcGFyc2VJbnQoYi5zcGxpdCgnLScpWzFdKTtcblx0XHRcdH1cblx0XHRcdGlmKGEuaW5kZXhPZignLScpID09IDAgJiYgYi5pbmRleE9mKCctJykgPiAwKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUludChhLnNwbGl0KCctJylbMV0pIC0gcGFyc2VJbnQoYi5zcGxpdCgnLScpWzFdKTtcdFx0XHRcdFxuXHRcdFx0fVxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPiAwICYmIGIuaW5kZXhPZignLScpID09IDApIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlSW50KGEuc3BsaXQoJy0nKVsxXSkgLSBwYXJzZUludChiLnNwbGl0KCctJylbMV0pO1xuXHRcdFx0fVxuXHRcdFx0aWYoYS5pbmRleE9mKCctJykgPiAwICYmIGIuaW5kZXhPZignLScpID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoYS5zcGxpdCgnLScpWzBdKSAtIHBhcnNlSW50KGIuc3BsaXQoJy0nKVswXSk7XG5cdFx0XHR9XG5cdFx0fSkubWFwKChpdGVtKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtaW46IHRoaXMucmV3cml0ZVJhbmdlKGl0ZW0pLnNwbGl0KCctJylbMF0sIFxuXHRcdFx0XHRtYXg6IHRoaXMucmV3cml0ZVJhbmdlKGl0ZW0pLnNwbGl0KCctJylbMV0gfHwgdGhpcy5yZXdyaXRlUmFuZ2UoaXRlbSkuc3BsaXQoJy0nKVswXSwgXG5cdFx0XHRcdG1zZ3M6IHRoaXMudGhhbmtzW2l0ZW1dXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cblx0cmV3cml0ZVJhbmdlKHJhbmdlKSB7XG5cdFx0aWYgKHJhbmdlLmluZGV4T2YoJy0nKT09MClcblx0XHRcdHJldHVybiBgMSR7cmFuZ2V9YDtcblxuXHRcdGlmKHJhbmdlLmluZGV4T2YoJy0nKT09KHJhbmdlLmxlbmd0aC0xKSlcblx0XHRcdHJldHVybiBgJHtyYW5nZX0xMDAwMDAwYDtcblxuXHRcdHJldHVybiByYW5nZTtcblx0fVxuXG5cdGdldFRoYW5rcyh0aXApIHtcblx0XHRjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5nZXRDYW5kaWRhdGVzKHRpcC5hbW91bnQpO1xuXHRcdHJldHVybiBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IoY2FuZGlkYXRlcy5sZW5ndGgpKV0uXG5cdFx0XHRcdHJlcGxhY2UoJyR1JywgdGlwLmZyb21fdXNlcikuXG5cdFx0XHRcdHJlcGxhY2UoJyR0JywgdGlwLmFtb3VudCk7XG5cdH1cblxuXHRnZXRDYW5kaWRhdGVzKHRpcEFtb3VudCkge1xuXHRcdGxldCBleGFjdCA9IHRoaXMudGhhbmtzLmZpbHRlcihpdGVtID0+IHtcblx0XHRcdHJldHVybiB0aXBBbW91bnQgPT0gaXRlbS5tYXggJiYgdGlwQW1vdW50ID09IGl0ZW0ubWluOyBcblx0XHR9KTtcblx0XHRpZihleGFjdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gZXhhY3QubWFwKGl0ZW0gPT4ge1xuXHRcdFx0XHRyZXR1cm4gaXRlbS5tc2dzO1xuXHRcdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KGN1cnJlbnQpLFtdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy50aGFua3MuZmlsdGVyKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIHRpcEFtb3VudCA8PSBpdGVtLm1heCAmJiB0aXBBbW91bnQgPj0gaXRlbS5taW47IFxuXHRcdH0pLm1hcChpdGVtID0+IHtcblx0XHRcdHJldHVybiBpdGVtLm1zZ3M7XG5cdFx0fSkucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KGN1cnJlbnQpLFtdKTtcblx0fVxuXG5cdCAgXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIENvbmZpZyAgICAgICAgICAgLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFxuXHRsb2FkQ29uZmlnKGNiKSB7XG5cdFx0dGhpcy5yZWFkQ29uZmlnKGNiKTtcblx0XHR0aGlzLnByb2Nlc3NUaGFua3MoKTtcblx0fVxuXG5cdHByb2Nlc3NUaGFua3MoKSB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5zZXR0aW5ncykuZmlsdGVyKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4ga2V5LmluZGV4T2YoJ3RoYW5rc01zZycpID09IDAgJiYgdGhpcy5zZXR0aW5nc1trZXldICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNldHRpbmdzW2tleV0udHJpbSgpLmxlbmd0aCA+IDA7XG5cdFx0fSkuZm9yRWFjaChrZXkgPT4ge1xuXHRcdFx0Y29uc3QgW3RpcCwgbWVzc2FnZV0gPSB0aGlzLnNldHRpbmdzW2tleV0uc3BsaXQoJ3wnKTtcblx0XHRcdGlmKHR5cGVvZiB0aGlzLnRoYW5rcyA9PSAnT2JqZWN0JyAmJiB0aGlzLnRoYW5rcy5oYXNPd25Qcm9wZXJ0eSh0aXApKVxuXHRcdFx0XHR0aGlzLnRoYW5rc1t0aXBdLnB1c2gobWVzc2FnZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMudGhhbmtzW3RpcF0gPSBbbWVzc2FnZV07XG5cdFx0fSk7XG5cdH1cblxuXHRyZWFkQ29uZmlnKGNiKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IHt9O1xuXHRcdHRoaXMuZ2V0U2V0dGluZ3NDaG9pY2VzKCkubWFwKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIGl0ZW0ubmFtZTtcblx0XHR9KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHR0aGlzLnNldHRpbmdzW2tleV0gPSBjYi5zZXR0aW5nc1trZXldO1xuXHRcdH0pO1xuXHR9XG5cbiAgICBnZXRTZXR0aW5nc0Nob2ljZXMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgOiBcInRoYW5rc0JvdEVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBcIiMjIyMjIyMjIyMjIFRIQU5LUyBCT1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBcIixcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgOiBcImNob2ljZVwiLFxuICAgICAgICAgICAgICAgIGNob2ljZTEgICAgICAgICA6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlMiAgICAgICAgIDogXCJub1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICAgIH0sICAgIFxuXHRcdF1cblx0XHRcblx0XHRmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXR0aW5nc0lucHV0RmllbGRzOyBpKyspIHtcblx0XHRcdHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgOiBgdGhhbmtzTXNnJHtpfWAsXG4gICAgICAgICAgICAgICAgbGFiZWwgICAgICAgICAgIDogYE1lc3NhZ2UgJHtpfSBgLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgbWluTGVuZ3RoICAgICAgIDogNSxcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggICAgICAgOiAyNTUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlICAgIDogXCJcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiBmYWxzZSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBcbn0iLCJpbXBvcnQge0JvdH0gZnJvbSBcIi4vYm90LmpzXCI7XG5leHBvcnQgY2xhc3MgVGlwTWVudSBleHRlbmRzIEJvdCB7XG5cdG5hbWUgICAgICAgICAgICA9ICdUaXAgbWVudSBib3QnO1xuXHRkZXNjcmlwdGlvbiAgICAgPSAnQSBib3QgZm9yIGhhbmRsaW5nIHRpcHMgZm9yIGEgdGlwIG1lbnUnO1xuICAgIGFsaWFzICAgICAgICAgICA9IFsnIXRtJywnIW1lbnUnLCcvdG0nLCcvbWVudSddO1xuICAgIHBlcm1pc3Npb25zICAgICA9IHsnYWRkJzogJ2JtJyxcblx0XHRcdFx0XHQgICAnbGlzdCc6ICdibScsXG5cdFx0XHRcdFx0ICAgJ3JtJyAgOiAnYm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAnc3RvcCc6ICdiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3J1bicgOiAnYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdwYXVzZSc6J2InXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgLy8gZm9yZWdyb3VuZENvbG9yID0gJyNmZmZmZmYnO1xuXHQvLyBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmYWEzZSc7XG5cdHNldHRpbmdzSW5wdXRGaWVsZHMgPSAzMDtcbiAgICB0eXBlcyA9IFsnbWFpbicsICdmaXQnXTtcbiAgICBkZWZhdWx0VHlwZSA9ICdtYWluJztcbiAgICBsaXN0UHJlZml4ID0gJ21lbnVJdGVtJztcbiAgICBtZW51ID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICAnYW1vdW50JyA6IDEwLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ1BNJyxcbiAgICAgICAgICAgICd0eXBlJyA6ICdtYWluJyxcbiAgICAgICAgfVxuICAgIF07XG5cblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG4gICAgICAgIHN1cGVyKGFwcCxjYik7XG5cblx0XHR0aGlzLmxvYWRDb25maWcoY2IpO1xuICAgICAgICB0aGlzLmNiLmxvZyh0aGlzLm1lbnUpO1xuICAgICAgICB0aGlzLnNvcnRNZW51KCk7XG4gICAgICAgIHRoaXMuY2IubG9nKHRoaXMubWVudSk7XG5cdH1cblxuXHRzb3J0TWVudSgpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5tZW51KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lbnVba2V5XS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIuYW1vdW50IC0gYS5hbW91bnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cdH1cblxuXHQgIFxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBDb25maWcgICAgICAgICAgIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcblx0bG9hZENvbmZpZyhjYikge1xuXHRcdHRoaXMucmVhZENvbmZpZyhjYik7XG5cdFx0dGhpcy5wcm9jZXNzTWVudUl0ZW0oKTtcblx0fVxuXG5cdHByb2Nlc3NNZW51SXRlbSgpIHtcbiAgICAgICAgdGhpcy5tZW51ID0ge307XG5cdFx0T2JqZWN0LmtleXModGhpcy5zZXR0aW5ncykuZmlsdGVyKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4ga2V5Lm1hdGNoKHRoaXMubGlzdFByZWZpeCArICdbMC05XSsnKSAhPSBudWxsICYmIHRoaXMuc2V0dGluZ3Nba2V5XSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZXR0aW5nc1trZXldLnRyaW0oKS5sZW5ndGggPiAwO1xuXHRcdH0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGVzY3JpcHRpb25dID0gdGhpcy5zZXR0aW5nc1trZXldLnNwbGl0KCd8Jyk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBrZXkubWF0Y2goLyhcXGQrKSQvKVswXSxcbiAgICAgICAgICAgICAgICB0eXBlICA9IHRoaXMuc2V0dGluZ3NbYCR7dGhpcy5saXN0UHJlZml4fVR5cGUke2luZGV4fWBdO1xuXHRcdFx0aWYoQXJyYXkuaXNBcnJheSh0aGlzLm1lbnVbdHlwZV0pKVxuXHRcdFx0XHR0aGlzLm1lbnVbdHlwZV0ucHVzaCh7dmFsdWUsIGRlc2NyaXB0aW9ufSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5tZW51W3R5cGVdID0gW3t2YWx1ZSwgZGVzY3JpcHRpb259XTtcbiAgICAgICAgfSk7XG5cdH1cblxuXHRyZWFkQ29uZmlnKGNiKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IHt9O1xuXHRcdHRoaXMuZ2V0U2V0dGluZ3NDaG9pY2VzKCkubWFwKGl0ZW0gPT4ge1xuXHRcdFx0cmV0dXJuIGl0ZW0ubmFtZTtcblx0XHR9KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHR0aGlzLnNldHRpbmdzW2tleV0gPSBjYi5zZXR0aW5nc1trZXldO1xuICAgICAgICB9KTtcblx0fVxuXG4gICAgZ2V0U2V0dGluZ3NDaG9pY2VzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogXCJtZW51Qm90RW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIGxhYmVsICAgICAgICAgICA6IFwiIyMjIyMjIyMjIyMgTUVOVSBCT1QgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBcIixcbiAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgOiBcImNob2ljZVwiLFxuICAgICAgICAgICAgICAgIGNob2ljZTEgICAgICAgICA6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgY2hvaWNlMiAgICAgICAgIDogXCJub1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICAgIH0sICAgIFxuICAgICAgICBdO1xuXHRcdFxuXHRcdGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnNldHRpbmdzSW5wdXRGaWVsZHM7IGkrKykge1xuXHRcdFx0cmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgICA6IGAke3RoaXMubGlzdFByZWZpeH0ke2l9YCxcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBgTWVudSBpdGVtICR7aX0gKGZvcm1hdDogdmFsdWUgfCB0ZXh0KSBgLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgbWluTGVuZ3RoICAgICAgIDogNSxcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggICAgICAgOiAyNTUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlICAgIDogKHRoaXMubWVudVtpXSAmJiB0aGlzLm1lbnVbaV0uYW1vdW50ICYmIHRoaXMubWVudVtpXS5kZXNjcmlwdGlvbikgPyBgJHt0aGlzLm1lbnVbaV0uYW1vdW50fSB8ICR7dGhpcy5tZW51W2ldLmRlc2NyaXB0aW9ufWAgOiAnJyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHR5cGVzRmllbGQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgIDogYCR7dGhpcy5saXN0UHJlZml4fVR5cGUke2l9YCxcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICAgICAgOiBgTWVudSBpdGVtICR7aX0gdHlwZSBgLFxuICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICA6ICdjaG9pY2UnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSAgICA6ICh0aGlzLm1lbnVbaV0gJiYgdGhpcy5tZW51W2ldLnR5cGUpIHx8ICdtYWluJyxcbiAgICAgICAgICAgICAgICByZXF1aXJlZCAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIHR5cGVzRmllbGRbYGNob2ljZSR7aSsxfWBdID0gdGhpcy50eXBlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHR5cGVzRmllbGQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuICAgIH1cbn0iLCJpbXBvcnQge0JvdH0gIGZyb20gJy4vYm90LmpzJztcbmltcG9ydCB7RWNob30gZnJvbSBcIi4vZWNoby5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVGlwcGVyIGV4dGVuZHMgQm90e1xuICAgIG5hbWUgICAgICAgICAgICA9ICdUaXBwZXIgYm90JztcbiAgICBkZXNjcmlwdGlvbiAgICAgPSAnQSBib3QgZm9yIGhhbmRsaW5nIHRpcHMnO1xuICAgIGFsaWFzICAgICAgICAgICA9IFsnIXRpcHInLCcvdGlwciddO1xuICAgIHBlcm1pc3Npb25zICAgICA9IHsna2luZyc6ICdibWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAnYm9tYic6ICdibWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAncmF0ZSc6ICdibWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAnbGlzdCc6ICdibWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAndG9wNSc6ICdibWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAnc3RvcCc6ICdiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ3J1bicgOiAnYicsXG4gICAgICAgICAgICAgICAgICAgICAgICdwYXVzZSc6J2InXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgZm9yZWdyb3VuZENvbG9yID0gJyNiN2ZmMDAnO1xuICAgIGJhY2tncm91bmRDb2xvciA9ICcjNDgwMGZmJztcblxuXHRjb25zdHJ1Y3RvcihhcHAsIGNiKSB7XG5cdFx0c3VwZXIoYXBwLCBjYik7XG5cdH1cblxuXHRvblRpcCh0aXApIHtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuc3RhdHMuYWRkVGlwKHRpcCk7XG4gICAgICAgIHRoaXMuc2VuZFRoYW5rcyh0aXApO1xuICAgICAgICB0aGlzLnNlbmRDaGFuZ2VzKGNoYW5nZXMpO1xuXHR9XG5cbiAgICBzZW5kQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IGNiID0gdGhpcy5jYjtcbiAgICAgICAgaWYgKGNoYW5nZXMuYmVzdCAhPSAnJylcbiAgICAgICAgICAgIEVjaG8uc2VuZEJvbGQoe2NiLCB0ZXh0OiBgJHtjaGFuZ2VzLmJlc3QudXNlcm5hbWV9IGlzIG15IG5ldyBLSU5HYCwgY29sb3I6IHRoaXMuZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kOiB0aGlzLmJhY2tncm91bmRDb2xvcn0pXG5cbiAgICAgICAgaWYgKGNoYW5nZXMuaGlnaGVzdCAhPSAnJylcbiAgICAgICAgICAgIEVjaG8uc2VuZEJvbGQoe2NiLCB0ZXh0OiBgJHtjaGFuZ2VzLmhpZ2hlc3QudXNlcm5hbWV9IGhvbGRzIHRoZSBISUdIRVNUIHRpcCB3aXRoICR7Y2hhbmdlcy5oaWdoZXN0LmFtb3VudH0gdG9rZW5zYCwgY29sb3I6IHRoaXMuZm9yZWdyb3VuZENvbG9yLCBiYWNrZ3JvdW5kOiB0aGlzLmJhY2tncm91bmRDb2xvcn0pXG4gICAgfVxuXG5cdHNlbmRUaGFua3ModGlwKSB7XG5cdFx0Y29uc3QgY2IgICAgID0gdGhpcy5jYixcbiAgICAgICAgICAgICAgdGhhbmtzID0gdGhpcy5hcHAuZ2V0KCd0aGFua3MnKSxcbiAgICAgICAgICAgICAgdGV4dCAgID0gdGhhbmtzLmdldFRoYW5rcyh0aXApO1xuXG4gICAgICAgIEVjaG8uc2VuZEJvbGQoe2NiLCB0ZXh0LCBjb2xvcjogdGhhbmtzLmZvcmVncm91bmRDb2xvciB8fCB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhhbmtzLmJhY2tncm91bmRDb2xvciB8fCB0aGlzLmJhY2tncm91bmRDb2xvcn0pXG5cdH1cblxuICAgIG9uU3RvcChkYXRhKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBgKiogJHt0aGlzLm5hbWV9IHN0YXR1czogU1RPUFBFRCAqKmA7XG4gICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdyZWQnLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIFxuICAgIH1cblxuICAgIG9uUnVuKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGAqKiAke3RoaXMubmFtZX0gc3RhdHVzOiBSVU5OSU5HICoqYDtcbiAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogZGF0YS51c2VyLCB0ZXh0LCBjb2xvcjogJ2dyZWVuJywgYmFja2dyb3VuZDond2hpdGUnLCBjYjogdGhpcy5jYn0pO1xuICAgIH1cblxuICAgIG9uUGF1c2UoZGF0YSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYCoqICR7dGhpcy5uYW1lfSBzdGF0dXM6IFBBVVNFRCAqKmA7XG4gICAgICAgIEVjaG8uc2VuZEJvbGQoe3VzZXI6IGRhdGEudXNlciwgdGV4dCwgY29sb3I6ICdvcmFuZ2UnLCBiYWNrZ3JvdW5kOid3aGl0ZScsIGNiOiB0aGlzLmNifSk7XG4gICAgfVxuXG4gICAga2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHMuYmVzdFRpcHBlcigpO1xuICAgIH1cblxuICAgIGhpZ2hlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRzLmhpZ2hlc3RUaXAoKTtcbiAgICB9XG5cbiAgICB0b2tlblJhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRzLnRva2VuUmF0ZSgpO1xuICAgIH1cblxuICAgIGxpc3QodG9wID0gMCkge1xuICAgICAgICByZXR1cm4gdG9wID8gdGhpcy5zdGF0cy5zdW1CeVVzZXIoKS5zbGljZSgwLHRvcCkgOiB0aGlzLnN0YXRzLnN1bUJ5VXNlcigpO1xuICAgIH1cblxuICAgIFxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBDb25maWcgICAgICAgICAgIC8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIFxuICAgIGdldFNldHRpbmdzQ2hvaWNlcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSW50ZXJmYWNlIG1ldGhvZHMgLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgXG5cbiAgICBjbGVhckRhdGEoKSB7XG4gICAgICAgIHRoaXMuc3RhdHMuY2xlYXJTdGF0cygpO1xuICAgIH1cbiAgICBcbiAgICBwcm9jZXNzQ29tbWFuZChvcHRpb25zLCBtZXNzYWdlKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUGVybWlzc2lvbihvcHRpb25zWzBdLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8ga2luZ1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdraW5nJykge1xuICAgICAgICAgICAgY29uc3Qga2luZyA9IHRoaXMua2luZygpLFxuICAgICAgICAgICAgICAgICAgdGV4dCA9IGtpbmcudXNlcm5hbWUgPyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2tpbmcudXNlcm5hbWV9IGlzIG15IGtpbmcgdGlwcGVyIHdpdGggJHtraW5nLmFtb3VudH0gdG9rZW5zYCA6XG4gICAgICAgICAgICAgICAgICAgICAgICBgTm9vZHkgaGFzIHRpcHBlZCB5ZXRgO1xuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYm9tYlxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMSAmJiBvcHRpb25zWzBdID09ICdib21iJykge1xuICAgICAgICAgICAgY29uc3QgaGlnaGVzdCA9IHRoaXMuaGlnaGVzdCgpLFxuICAgICAgICAgICAgICAgICAgdGV4dCA9IGhpZ2hlc3QudXNlcm5hbWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7aGlnaGVzdC51c2VybmFtZX0gZ2F2ZSB0aGUgaGlnaGVzdCBzaW5nZS10aXAgd2l0aCAke2hpZ2hlc3QuYW1vdW50fSB0b2tlbnNgIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGBOb2JvZHkgaGFzIHRpcHBlZCB5ZXRgO1xuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yYXRlXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3JhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCByYXRlID0gdGhpcy50b2tlblJhdGUoKSxcbiAgICAgICAgICAgICAgICAgIHRleHQgPSAhTnVtYmVyLmlzTmFOKHJhdGUpP1xuICAgICAgICAgICAgICAgICAgICAgICAgYFRva2VuIHJhdGUgc2luY2UgdGhlIGJvdCBzdGFydGVkOiR7cmF0ZX0gdG9rZW5zL21pbnV0ZWAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vYm9keSBoYXMgdGlwcGVkIHlldGA7XG4gICAgICAgICAgICBFY2hvLnNlbmRCb2xkKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2xpc3RcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAnbGlzdCcpIHtcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmxpc3QoKS5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKyAnXFxuJyArIGAkeysrY291bnRlcn0uICR7Y3VycmVudC51c2VybmFtZX0gOiAke2N1cnJlbnQuYW1vdW50fWA7XG4gICAgICAgICAgICB9LCcnKS50cmltKCdcXG4nKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgRWNoby5zZW5kQm9sZCh7dXNlcjogbWVzc2FnZS51c2VyLCB0ZXh0LCBjb2xvcjogdGhpcy5mb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmQ6IHRoaXMuYmFja2dyb3VuZENvbG9yLCBjYjogdGhpcy5jYn0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b3A1XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PSAxICYmIG9wdGlvbnNbMF0gPT0gJ3RvcDUnKSB7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5saXN0KDUpLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+e1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciArICdcXG4nICsgYCR7Kytjb3VudGVyfS4gJHtjdXJyZW50LnVzZXJuYW1lfSA6ICR7Y3VycmVudC5hbW91bnR9YDtcbiAgICAgICAgICAgIH0sJycpLnRyaW0oJ1xcbicpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBFY2hvLnNlbmRCb2xkKHt1c2VyOiBtZXNzYWdlLnVzZXIsIHRleHQsIGNvbG9yOiB0aGlzLmZvcmVncm91bmRDb2xvciwgYmFja2dyb3VuZDogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsIGNiOiB0aGlzLmNifSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL3N0b3BcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAnc3RvcCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCh7bWVzc2FnZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9ydW5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncnVuJykge1xuICAgICAgICAgICAgdGhpcy5ydW4oe21lc3NhZ2V9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcGF1c2VcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09IDEgJiYgb3B0aW9uc1swXSA9PSAncGF1c2UnKSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlKHttZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iLCJleHBvcnQgY29uc3QgdW5pY29kZUNoYXJzID0ge1xuICAgICAgICBzcGFjZSAgICAgICAgICAgIDogJ1xcdTAwMjAnLFxuICAgICAgICBkb3QgICAgICAgICAgICAgIDogJ1xcdTIyYzUnLCAvLyBkb3RcbiAgICAgICAgaGVhcnQgICAgICAgICAgICA6ICdcXHUyNjY1JywgLy8gaGVhcnRcbiAgICAgICAgc3RhciAgICAgICAgICAgICA6ICdcXHUyNjA1JywgLy8gZmlsbGVkIHN0YXJcbiAgICAgICAgd2hpdGVTdGFyICAgICAgICA6ICdcXHUyNjA2JywgLy8gd2hpdGUgc3RhclxuICAgICAgICBzcXVhcmUgICAgICAgICAgIDogJ1xcdTI1ZmMnLFxuICAgICAgICB0cmlhbmdsZVJpZ2h0ICAgIDogJ1xcdTI1YjYnLFxuICAgICAgICBkYXNoQ2hhciAgICAgICAgIDogJ1xcdTI1MDAnLFxuICAgICAgICB3aGl0ZUhlYXJ0ICAgICAgIDogJ1xcdTI2NjEnLFxuICAgICAgICBhcnJvdyAgICAgICAgICAgIDogJ1xcdTIxOTInLFxuICAgICAgICB0cmlhbmdsZURvd24gICAgIDogJ1xcdTI1YmMnLFxuICAgICAgICBsb25nRGFzaCAgICAgICAgIDogJ1xcdTIwMTUnLFxuICAgICAgICB0b3BMZWZ0Q29ybmVyICAgIDogJ1xcdTI1MGMnLFxuICAgICAgICBib3R0b21MZWZ0Q29ybmVyIDogJ1xcdTI1MTQn
© Copyright Chaturbate 2011- 2025. All Rights Reserved.