snipe-it/public/js/app.js
2017-01-11 01:02:32 -08:00

76 lines
60 KiB
JavaScript

/******/ (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;
/******/ // identity function for calling harmory imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/ // define getter function for harmory exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ };
/******/ // 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 = 25);
/******/ })
/************************************************************************/
/******/ ({
/***/ 25:
/***/ function(module, exports) {
eval("/*! AdminLTE app.js\n * ================\n * Main JS application file for AdminLTE v2. This file\n * should be included in all pages. It controls some layout\n * options and implements exclusive AdminLTE plugins.\n *\n * @Author Almsaeed Studio\n * @Support <http://www.almsaeedstudio.com>\n * @Email <[email protected]>\n * @version 2.3.0\n * @license MIT <http://opensource.org/licenses/MIT>\n */\n\n//Make sure jQuery has been loaded before app.js\nif (typeof jQuery === \"undefined\") {\n throw new Error(\"AdminLTE requires jQuery\");\n}\n\n\n/* AdminLTE\n *\n * @type Object\n * @description $.AdminLTE is the main object for the template's app.\n * It's used for implementing functions and options related\n * to the template. Keeping everything wrapped in an object\n * prevents conflict with other plugins and is a better\n * way to organize our code.\n */\n$.AdminLTE = {};\n\n/* --------------------\n * - AdminLTE Options -\n * --------------------\n * Modify these options to suit your implementation\n */\n$.AdminLTE.options = {\n //Add slimscroll to navbar menus\n //This requires you to load the slimscroll plugin\n //in every page before app.js\n navbarMenuSlimscroll: true,\n navbarMenuSlimscrollWidth: \"3px\", //The width of the scroll bar\n navbarMenuHeight: \"200px\", //The height of the inner menu\n //General animation speed for JS animated elements such as box collapse/expand and\n //sidebar treeview slide up/down. This options accepts an integer as milliseconds,\n //'fast', 'normal', or 'slow'\n animationSpeed: 500,\n //Sidebar push menu toggle button selector\n sidebarToggleSelector: \"[data-toggle='offcanvas']\",\n //Activate sidebar push menu\n sidebarPushMenu: true,\n //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)\n sidebarSlimScroll: true,\n //Enable sidebar expand on hover effect for sidebar mini\n //This option is forced to true if both the fixed layout and sidebar mini\n //are used together\n sidebarExpandOnHover: false,\n //BoxRefresh Plugin\n enableBoxRefresh: true,\n //Bootstrap.js tooltip\n enableBSToppltip: true,\n BSTooltipSelector: \"[data-toggle='tooltip']\",\n //Enable Fast Click. Fastclick.js creates a more\n //native touch experience with touch devices. If you\n //choose to enable the plugin, make sure you load the script\n //before AdminLTE's app.js\n enableFastclick: true,\n //Control Sidebar Options\n enableControlSidebar: true,\n controlSidebarOptions: {\n //Which button should trigger the open/close event\n toggleBtnSelector: \"[data-toggle='control-sidebar']\",\n //The sidebar selector\n selector: \".control-sidebar\",\n //Enable slide over content\n slide: true\n },\n //Box Widget Plugin. Enable this plugin\n //to allow boxes to be collapsed and/or removed\n enableBoxWidget: true,\n //Box Widget plugin options\n boxWidgetOptions: {\n boxWidgetIcons: {\n //Collapse icon\n collapse: 'fa-minus',\n //Open icon\n open: 'fa-plus',\n //Remove icon\n remove: 'fa-times'\n },\n boxWidgetSelectors: {\n //Remove button selector\n remove: '[data-widget=\"remove\"]',\n //Collapse button selector\n collapse: '[data-widget=\"collapse\"]'\n }\n },\n //Direct Chat plugin options\n directChat: {\n //Enable direct chat by default\n enable: true,\n //The button to open and close the chat contacts pane\n contactToggleSelector: '[data-widget=\"chat-pane-toggle\"]'\n },\n //Define the set of colors to use globally around the website\n colors: {\n lightBlue: \"#3c8dbc\",\n red: \"#f56954\",\n green: \"#00a65a\",\n aqua: \"#00c0ef\",\n yellow: \"#f39c12\",\n blue: \"#0073b7\",\n navy: \"#001F3F\",\n teal: \"#39CCCC\",\n olive: \"#3D9970\",\n lime: \"#01FF70\",\n orange: \"#FF851B\",\n fuchsia: \"#F012BE\",\n purple: \"#8E24AA\",\n maroon: \"#D81B60\",\n black: \"#222222\",\n gray: \"#d2d6de\"\n },\n //The standard screen sizes that bootstrap uses.\n //If you change these in the variables.less file, change\n //them here too.\n screenSizes: {\n xs: 480,\n sm: 768,\n md: 992,\n lg: 1200\n }\n};\n\n/* ------------------\n * - Implementation -\n * ------------------\n * The next block of code implements AdminLTE's\n * functions and plugins as specified by the\n * options above.\n */\n$(function () {\n \"use strict\";\n\n //Fix for IE page transitions\n $(\"body\").removeClass(\"hold-transition\");\n\n //Extend options if external options exist\n if (typeof AdminLTEOptions !== \"undefined\") {\n $.extend(true,\n $.AdminLTE.options,\n AdminLTEOptions);\n }\n\n //Easy access to options\n var o = $.AdminLTE.options;\n\n //Set up the object\n _init();\n\n //Activate the layout maker\n $.AdminLTE.layout.activate();\n\n //Enable sidebar tree view controls\n $.AdminLTE.tree('.sidebar');\n\n //Enable control sidebar\n if (o.enableControlSidebar) {\n $.AdminLTE.controlSidebar.activate();\n }\n\n //Add slimscroll to navbar dropdown\n if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {\n $(\".navbar .menu\").slimscroll({\n height: o.navbarMenuHeight,\n alwaysVisible: false,\n size: o.navbarMenuSlimscrollWidth\n }).css(\"width\", \"100%\");\n }\n\n //Activate sidebar push menu\n if (o.sidebarPushMenu) {\n $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);\n }\n\n //Activate Bootstrap tooltip\n if (o.enableBSToppltip) {\n $('body').tooltip({\n selector: o.BSTooltipSelector\n });\n }\n\n //Activate box widget\n if (o.enableBoxWidget) {\n $.AdminLTE.boxWidget.activate();\n }\n\n //Activate fast click\n if (o.enableFastclick && typeof FastClick != 'undefined') {\n FastClick.attach(document.body);\n }\n\n //Activate direct chat widget\n if (o.directChat.enable) {\n $(document).on('click', o.directChat.contactToggleSelector, function () {\n var box = $(this).parents('.direct-chat').first();\n box.toggleClass('direct-chat-contacts-open');\n });\n }\n\n /*\n * INITIALIZE BUTTON TOGGLE\n * ------------------------\n */\n $('.btn-group[data-toggle=\"btn-toggle\"]').each(function () {\n var group = $(this);\n $(this).find(\".btn\").on('click', function (e) {\n group.find(\".btn.active\").removeClass(\"active\");\n $(this).addClass(\"active\");\n e.preventDefault();\n });\n\n });\n});\n\n/* ----------------------------------\n * - Initialize the AdminLTE Object -\n * ----------------------------------\n * All AdminLTE functions are implemented below.\n */\nfunction _init() {\n 'use strict';\n /* Layout\n * ======\n * Fixes the layout height in case min-height fails.\n *\n * @type Object\n * @usage $.AdminLTE.layout.activate()\n * $.AdminLTE.layout.fix()\n * $.AdminLTE.layout.fixSidebar()\n */\n $.AdminLTE.layout = {\n activate: function () {\n var _this = this;\n _this.fix();\n _this.fixSidebar();\n $(window, \".wrapper\").resize(function () {\n _this.fix();\n _this.fixSidebar();\n });\n },\n fix: function () {\n //Get window height and the wrapper height\n var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();\n var window_height = $(window).height();\n var sidebar_height = $(\".sidebar\").height();\n //Set the min-height of the content and sidebar based on the\n //the height of the document.\n if ($(\"body\").hasClass(\"fixed\")) {\n $(\".content-wrapper, .right-side\").css('min-height', window_height - $('.main-footer').outerHeight());\n } else {\n var postSetWidth;\n if (window_height >= sidebar_height) {\n $(\".content-wrapper, .right-side\").css('min-height', window_height - neg);\n postSetWidth = window_height - neg;\n } else {\n $(\".content-wrapper, .right-side\").css('min-height', sidebar_height);\n postSetWidth = sidebar_height;\n }\n\n //Fix for the control sidebar height\n var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);\n if (typeof controlSidebar !== \"undefined\") {\n if (controlSidebar.height() > postSetWidth)\n $(\".content-wrapper, .right-side\").css('min-height', controlSidebar.height());\n }\n\n }\n },\n fixSidebar: function () {\n //Make sure the body tag has the .fixed class\n if (!$(\"body\").hasClass(\"fixed\")) {\n if (typeof $.fn.slimScroll != 'undefined') {\n $(\".sidebar\").slimScroll({destroy: true}).height(\"auto\");\n }\n return;\n } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {\n window.console.error(\"Error: the fixed layout requires the slimscroll plugin!\");\n }\n //Enable slimscroll for fixed layout\n if ($.AdminLTE.options.sidebarSlimScroll) {\n if (typeof $.fn.slimScroll != 'undefined') {\n //Destroy if it exists\n $(\".sidebar\").slimScroll({destroy: true}).height(\"auto\");\n //Add slimscroll\n $(\".sidebar\").slimscroll({\n height: ($(window).height() - $(\".main-header\").height()) + \"px\",\n color: \"rgba(0,0,0,0.2)\",\n size: \"3px\"\n });\n }\n }\n }\n };\n\n /* PushMenu()\n * ==========\n * Adds the push menu functionality to the sidebar.\n *\n * @type Function\n * @usage: $.AdminLTE.pushMenu(\"[data-toggle='offcanvas']\")\n */\n $.AdminLTE.pushMenu = {\n activate: function (toggleBtn) {\n //Get the screen sizes\n var screenSizes = $.AdminLTE.options.screenSizes;\n\n //Enable sidebar toggle\n $(toggleBtn).on('click', function (e) {\n e.preventDefault();\n\n //Enable sidebar push menu\n if ($(window).width() > (screenSizes.sm - 1)) {\n if ($(\"body\").hasClass('sidebar-collapse')) {\n $(\"body\").removeClass('sidebar-collapse').trigger('expanded.pushMenu');\n } else {\n $(\"body\").addClass('sidebar-collapse').trigger('collapsed.pushMenu');\n }\n }\n //Handle sidebar push menu for small screens\n else {\n if ($(\"body\").hasClass('sidebar-open')) {\n $(\"body\").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');\n } else {\n $(\"body\").addClass('sidebar-open').trigger('expanded.pushMenu');\n }\n }\n });\n\n $(\".content-wrapper\").click(function () {\n //Enable hide menu when clicking on the content-wrapper on small screens\n if ($(window).width() <= (screenSizes.sm - 1) && $(\"body\").hasClass(\"sidebar-open\")) {\n $(\"body\").removeClass('sidebar-open');\n }\n });\n\n //Enable expand on hover for sidebar mini\n if ($.AdminLTE.options.sidebarExpandOnHover\n || ($('body').hasClass('fixed')\n && $('body').hasClass('sidebar-mini'))) {\n this.expandOnHover();\n }\n },\n expandOnHover: function () {\n var _this = this;\n var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;\n //Expand sidebar on hover\n $('.main-sidebar').hover(function () {\n if ($('body').hasClass('sidebar-mini')\n && $(\"body\").hasClass('sidebar-collapse')\n && $(window).width() > screenWidth) {\n _this.expand();\n }\n }, function () {\n if ($('body').hasClass('sidebar-mini')\n && $('body').hasClass('sidebar-expanded-on-hover')\n && $(window).width() > screenWidth) {\n _this.collapse();\n }\n });\n },\n expand: function () {\n $(\"body\").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');\n },\n collapse: function () {\n if ($('body').hasClass('sidebar-expanded-on-hover')) {\n $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');\n }\n }\n };\n\n /* Tree()\n * ======\n * Converts the sidebar into a multilevel\n * tree view menu.\n *\n * @type Function\n * @Usage: $.AdminLTE.tree('.sidebar')\n */\n $.AdminLTE.tree = function (menu) {\n var _this = this;\n var animationSpeed = $.AdminLTE.options.animationSpeed;\n $(document).on('click', menu + ' li a', function (e) {\n //Get the clicked link and the next element\n var $this = $(this);\n var checkElement = $this.next();\n\n //Check if the next element is a menu and is visible\n if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {\n //Close the menu\n checkElement.slideUp(animationSpeed, function () {\n checkElement.removeClass('menu-open');\n //Fix the layout in case the sidebar stretches over the height of the window\n //_this.layout.fix();\n });\n checkElement.parent(\"li\").removeClass(\"active\");\n }\n //If the menu is not visible\n else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {\n //Get the parent menu\n var parent = $this.parents('ul').first();\n //Close all open menus within the parent\n var ul = parent.find('ul:visible').slideUp(animationSpeed);\n //Remove the menu-open class from the parent\n ul.removeClass('menu-open');\n //Get the parent li\n var parent_li = $this.parent(\"li\");\n\n //Open the target menu and add the menu-open class\n checkElement.slideDown(animationSpeed, function () {\n //Add the class active to the parent li\n checkElement.addClass('menu-open');\n parent.find('li.active').removeClass('active');\n parent_li.addClass('active');\n //Fix the layout in case the sidebar stretches over the height of the window\n _this.layout.fix();\n });\n }\n //if this isn't a link, prevent the page from being redirected\n if (checkElement.is('.treeview-menu')) {\n e.preventDefault();\n }\n });\n };\n\n /* ControlSidebar\n * ==============\n * Adds functionality to the right sidebar\n *\n * @type Object\n * @usage $.AdminLTE.controlSidebar.activate(options)\n */\n $.AdminLTE.controlSidebar = {\n //instantiate the object\n activate: function () {\n //Get the object\n var _this = this;\n //Update options\n var o = $.AdminLTE.options.controlSidebarOptions;\n //Get the sidebar\n var sidebar = $(o.selector);\n //The toggle button\n var btn = $(o.toggleBtnSelector);\n\n //Listen to the click event\n btn.on('click', function (e) {\n e.preventDefault();\n //If the sidebar is not open\n if (!sidebar.hasClass('control-sidebar-open')\n && !$('body').hasClass('control-sidebar-open')) {\n //Open the sidebar\n _this.open(sidebar, o.slide);\n } else {\n _this.close(sidebar, o.slide);\n }\n });\n\n //If the body has a boxed layout, fix the sidebar bg position\n var bg = $(\".control-sidebar-bg\");\n _this._fix(bg);\n\n //If the body has a fixed layout, make the control sidebar fixed\n if ($('body').hasClass('fixed')) {\n _this._fixForFixed(sidebar);\n } else {\n //If the content height is less than the sidebar's height, force max height\n if ($('.content-wrapper, .right-side').height() < sidebar.height()) {\n _this._fixForContent(sidebar);\n }\n }\n },\n //Open the control sidebar\n open: function (sidebar, slide) {\n //Slide over content\n if (slide) {\n sidebar.addClass('control-sidebar-open');\n } else {\n //Push the content by adding the open class to the body instead\n //of the sidebar itself\n $('body').addClass('control-sidebar-open');\n }\n },\n //Close the control sidebar\n close: function (sidebar, slide) {\n if (slide) {\n sidebar.removeClass('control-sidebar-open');\n } else {\n $('body').removeClass('control-sidebar-open');\n }\n },\n _fix: function (sidebar) {\n var _this = this;\n if ($(\"body\").hasClass('layout-boxed')) {\n sidebar.css('position', 'absolute');\n sidebar.height($(\".wrapper\").height());\n $(window).resize(function () {\n _this._fix(sidebar);\n });\n } else {\n sidebar.css({\n 'position': 'fixed',\n 'height': 'auto'\n });\n }\n },\n _fixForFixed: function (sidebar) {\n sidebar.css({\n 'position': 'fixed',\n 'max-height': '100%',\n 'overflow': 'auto',\n 'padding-bottom': '50px'\n });\n },\n _fixForContent: function (sidebar) {\n $(\".content-wrapper, .right-side\").css('min-height', sidebar.height());\n }\n };\n\n /* BoxWidget\n * =========\n * BoxWidget is a plugin to handle collapsing and\n * removing boxes from the screen.\n *\n * @type Object\n * @usage $.AdminLTE.boxWidget.activate()\n * Set all your options in the main $.AdminLTE.options object\n */\n $.AdminLTE.boxWidget = {\n selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,\n icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,\n animationSpeed: $.AdminLTE.options.animationSpeed,\n activate: function (_box) {\n var _this = this;\n if (!_box) {\n _box = document; // activate all boxes per default\n }\n //Listen for collapse event triggers\n $(_box).on('click', _this.selectors.collapse, function (e) {\n e.preventDefault();\n _this.collapse($(this));\n });\n\n //Listen for remove event triggers\n $(_box).on('click', _this.selectors.remove, function (e) {\n e.preventDefault();\n _this.remove($(this));\n });\n },\n collapse: function (element) {\n var _this = this;\n //Find the box parent\n var box = element.parents(\".box\").first();\n //Find the body and the footer\n var box_content = box.find(\"> .box-body, > .box-footer, > form >.box-body, > form > .box-footer\");\n if (!box.hasClass(\"collapsed-box\")) {\n //Convert minus into plus\n element.children(\":first\")\n .removeClass(_this.icons.collapse)\n .addClass(_this.icons.open);\n //Hide the content\n box_content.slideUp(_this.animationSpeed, function () {\n box.addClass(\"collapsed-box\");\n });\n } else {\n //Convert plus into minus\n element.children(\":first\")\n .removeClass(_this.icons.open)\n .addClass(_this.icons.collapse);\n //Show the content\n box_content.slideDown(_this.animationSpeed, function () {\n box.removeClass(\"collapsed-box\");\n });\n }\n },\n remove: function (element) {\n //Find the box parent\n var box = element.parents(\".box\").first();\n box.slideUp(this.animationSpeed);\n }\n };\n}\n\n/* ------------------\n * - Custom Plugins -\n * ------------------\n * All custom plugins are defined below.\n */\n\n/*\n * BOX REFRESH BUTTON\n * ------------------\n * This is a custom plugin to use with the component BOX. It allows you to add\n * a refresh button to the box. It converts the box's state to a loading state.\n *\n * @type plugin\n * @usage $(\"#box-widget\").boxRefresh( options );\n */\n(function ($) {\n\n \"use strict\";\n\n $.fn.boxRefresh = function (options) {\n\n // Render options\n var settings = $.extend({\n //Refresh button selector\n trigger: \".refresh-btn\",\n //File source to be loaded (e.g: ajax/src.php)\n source: \"\",\n //Callbacks\n onLoadStart: function (box) {\n return box;\n }, //Right after the button has been clicked\n onLoadDone: function (box) {\n return box;\n } //When the source has been loaded\n\n }, options);\n\n //The overlay\n var overlay = $('<div class=\"overlay\"><div class=\"fa fa-refresh fa-spin\"></div></div>');\n\n return this.each(function () {\n //if a source is specified\n if (settings.source === \"\") {\n if (window.console) {\n window.console.log(\"Please specify a source first - boxRefresh()\");\n }\n return;\n }\n //the box\n var box = $(this);\n //the button\n var rBtn = box.find(settings.trigger).first();\n\n //On trigger click\n rBtn.on('click', function (e) {\n e.preventDefault();\n //Add loading overlay\n start(box);\n\n //Perform ajax call\n box.find(\".box-body\").load(settings.source, function () {\n done(box);\n });\n });\n });\n\n function start(box) {\n //Add overlay and loading img\n box.append(overlay);\n\n settings.onLoadStart.call(box);\n }\n\n function done(box) {\n //Remove overlay and loading img\n box.find(overlay).remove();\n\n settings.onLoadDone.call(box);\n }\n\n };\n\n})(jQuery);\n\n/*\n * EXPLICIT BOX ACTIVATION\n * -----------------------\n * This is a custom plugin to use with the component BOX. It allows you to activate\n * a box inserted in the DOM after the app.js was loaded.\n *\n * @type plugin\n * @usage $(\"#box-widget\").activateBox();\n */\n(function ($) {\n\n 'use strict';\n\n $.fn.activateBox = function () {\n $.AdminLTE.boxWidget.activate(this);\n };\n\n})(jQuery);\n\n/*\n * TODO LIST CUSTOM PLUGIN\n * -----------------------\n * This plugin depends on iCheck plugin for checkbox and radio inputs\n *\n * @type plugin\n * @usage $(\"#todo-widget\").todolist( options );\n */\n(function ($) {\n\n 'use strict';\n\n $.fn.todolist = function (options) {\n // Render options\n var settings = $.extend({\n //When the user checks the input\n onCheck: function (ele) {\n return ele;\n },\n //When the user unchecks the input\n onUncheck: function (ele) {\n return ele;\n }\n }, options);\n\n return this.each(function () {\n\n if (typeof $.fn.iCheck != 'undefined') {\n $('input', this).on('ifChecked', function () {\n var ele = $(this).parents(\"li\").first();\n ele.toggleClass(\"done\");\n settings.onCheck.call(ele);\n });\n\n $('input', this).on('ifUnchecked', function () {\n var ele = $(this).parents(\"li\").first();\n ele.toggleClass(\"done\");\n settings.onUncheck.call(ele);\n });\n } else {\n $('input', this).on('change', function () {\n var ele = $(this).parents(\"li\").first();\n ele.toggleClass(\"done\");\n if ($('input', ele).is(\":checked\")) {\n settings.onCheck.call(ele);\n } else {\n settings.onUncheck.call(ele);\n }\n });\n }\n });\n };\n}(jQuery));\n\n//-------------\n//- PIE CHART -\n//-------------\n// Get context with jQuery - using jQuery's .get() method.\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vcmVzb3VyY2VzL2Fzc2V0cy9qcy9hcHAuanM/OGI2NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQWRtaW5MVEUgYXBwLmpzXG4gKiA9PT09PT09PT09PT09PT09XG4gKiBNYWluIEpTIGFwcGxpY2F0aW9uIGZpbGUgZm9yIEFkbWluTFRFIHYyLiBUaGlzIGZpbGVcbiAqIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgcGFnZXMuIEl0IGNvbnRyb2xzIHNvbWUgbGF5b3V0XG4gKiBvcHRpb25zIGFuZCBpbXBsZW1lbnRzIGV4Y2x1c2l2ZSBBZG1pbkxURSBwbHVnaW5zLlxuICpcbiAqIEBBdXRob3IgIEFsbXNhZWVkIFN0dWRpb1xuICogQFN1cHBvcnQgPGh0dHA6Ly93d3cuYWxtc2FlZWRzdHVkaW8uY29tPlxuICogQEVtYWlsICAgPHN1cHBvcnRAYWxtc2FlZWRzdHVkaW8uY29tPlxuICogQHZlcnNpb24gMi4zLjBcbiAqIEBsaWNlbnNlIE1JVCA8aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD5cbiAqL1xuXG4vL01ha2Ugc3VyZSBqUXVlcnkgaGFzIGJlZW4gbG9hZGVkIGJlZm9yZSBhcHAuanNcbmlmICh0eXBlb2YgalF1ZXJ5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIkFkbWluTFRFIHJlcXVpcmVzIGpRdWVyeVwiKTtcbn1cblxuXG4vKiBBZG1pbkxURVxuICpcbiAqIEB0eXBlIE9iamVjdFxuICogQGRlc2NyaXB0aW9uICQuQWRtaW5MVEUgaXMgdGhlIG1haW4gb2JqZWN0IGZvciB0aGUgdGVtcGxhdGUncyBhcHAuXG4gKiAgICAgICAgICAgICAgSXQncyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgZnVuY3Rpb25zIGFuZCBvcHRpb25zIHJlbGF0ZWRcbiAqICAgICAgICAgICAgICB0byB0aGUgdGVtcGxhdGUuIEtlZXBpbmcgZXZlcnl0aGluZyB3cmFwcGVkIGluIGFuIG9iamVjdFxuICogICAgICAgICAgICAgIHByZXZlbnRzIGNvbmZsaWN0IHdpdGggb3RoZXIgcGx1Z2lucyBhbmQgaXMgYSBiZXR0ZXJcbiAqICAgICAgICAgICAgICB3YXkgdG8gb3JnYW5pemUgb3VyIGNvZGUuXG4gKi9cbiQuQWRtaW5MVEUgPSB7fTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIC0gQWRtaW5MVEUgT3B0aW9ucyAtXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTW9kaWZ5IHRoZXNlIG9wdGlvbnMgdG8gc3VpdCB5b3VyIGltcGxlbWVudGF0aW9uXG4gKi9cbiQuQWRtaW5MVEUub3B0aW9ucyA9IHtcbiAgLy9BZGQgc2xpbXNjcm9sbCB0byBuYXZiYXIgbWVudXNcbiAgLy9UaGlzIHJlcXVpcmVzIHlvdSB0byBsb2FkIHRoZSBzbGltc2Nyb2xsIHBsdWdpblxuICAvL2luIGV2ZXJ5IHBhZ2UgYmVmb3JlIGFwcC5qc1xuICBuYXZiYXJNZW51U2xpbXNjcm9sbDogdHJ1ZSxcbiAgbmF2YmFyTWVudVNsaW1zY3JvbGxXaWR0aDogXCIzcHhcIiwgLy9UaGUgd2lkdGggb2YgdGhlIHNjcm9sbCBiYXJcbiAgbmF2YmFyTWVudUhlaWdodDogXCIyMDBweFwiLCAvL1RoZSBoZWlnaHQgb2YgdGhlIGlubmVyIG1lbnVcbiAgLy9HZW5lcmFsIGFuaW1hdGlvbiBzcGVlZCBmb3IgSlMgYW5pbWF0ZWQgZWxlbWVudHMgc3VjaCBhcyBib3ggY29sbGFwc2UvZXhwYW5kIGFuZFxuICAvL3NpZGViYXIgdHJlZXZpZXcgc2xpZGUgdXAvZG93bi4gVGhpcyBvcHRpb25zIGFjY2VwdHMgYW4gaW50ZWdlciBhcyBtaWxsaXNlY29uZHMsXG4gIC8vJ2Zhc3QnLCAnbm9ybWFsJywgb3IgJ3Nsb3cnXG4gIGFuaW1hdGlvblNwZWVkOiA1MDAsXG4gIC8vU2lkZWJhciBwdXNoIG1lbnUgdG9nZ2xlIGJ1dHRvbiBzZWxlY3RvclxuICBzaWRlYmFyVG9nZ2xlU2VsZWN0b3I6IFwiW2RhdGEtdG9nZ2xlPSdvZmZjYW52YXMnXVwiLFxuICAvL0FjdGl2YXRlIHNpZGViYXIgcHVzaCBtZW51XG4gIHNpZGViYXJQdXNoTWVudTogdHJ1ZSxcbiAgLy9BY3RpdmF0ZSBzaWRlYmFyIHNsaW1zY3JvbGwgaWYgdGhlIGZpeGVkIGxheW91dCBpcyBzZXQgKHJlcXVpcmVzIFNsaW1TY3JvbGwgUGx1Z2luKVxuICBzaWRlYmFyU2xpbVNjcm9sbDogdHJ1ZSxcbiAgLy9FbmFibGUgc2lkZWJhciBleHBhbmQgb24gaG92ZXIgZWZmZWN0IGZvciBzaWRlYmFyIG1pbmlcbiAgLy9UaGlzIG9wdGlvbiBpcyBmb3JjZWQgdG8gdHJ1ZSBpZiBib3RoIHRoZSBmaXhlZCBsYXlvdXQgYW5kIHNpZGViYXIgbWluaVxuICAvL2FyZSB1c2VkIHRvZ2V0aGVyXG4gIHNpZGViYXJFeHBhbmRPbkhvdmVyOiBmYWxzZSxcbiAgLy9Cb3hSZWZyZXNoIFBsdWdpblxuICBlbmFibGVCb3hSZWZyZXNoOiB0cnVlLFxuICAvL0Jvb3RzdHJhcC5qcyB0b29sdGlwXG4gIGVuYWJsZUJTVG9wcGx0aXA6IHRydWUsXG4gIEJTVG9vbHRpcFNlbGVjdG9yOiBcIltkYXRhLXRvZ2dsZT0ndG9vbHRpcCddXCIsXG4gIC8vRW5hYmxlIEZhc3QgQ2xpY2suIEZhc3RjbGljay5qcyBjcmVhdGVzIGEgbW9yZVxuICAvL25hdGl2ZSB0b3VjaCBleHBlcmllbmNlIHdpdGggdG91Y2ggZGV2aWNlcy4gSWYgeW91XG4gIC8vY2hvb3NlIHRvIGVuYWJsZSB0aGUgcGx1Z2luLCBtYWtlIHN1cmUgeW91IGxvYWQgdGhlIHNjcmlwdFxuICAvL2JlZm9yZSBBZG1pbkxURSdzIGFwcC5qc1xuICBlbmFibGVGYXN0Y2xpY2s6IHRydWUsXG4gIC8vQ29udHJvbCBTaWRlYmFyIE9wdGlvbnNcbiAgZW5hYmxlQ29udHJvbFNpZGViYXI6IHRydWUsXG4gIGNvbnRyb2xTaWRlYmFyT3B0aW9uczoge1xuICAgIC8vV2hpY2ggYnV0dG9uIHNob3VsZCB0cmlnZ2VyIHRoZSBvcGVuL2Nsb3NlIGV2ZW50XG4gICAgdG9nZ2xlQnRuU2VsZWN0b3I6IFwiW2RhdGEtdG9nZ2xlPSdjb250cm9sLXNpZGViYXInXVwiLFxuICAgIC8vVGhlIHNpZGViYXIgc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogXCIuY29udHJvbC1zaWRlYmFyXCIsXG4gICAgLy9FbmFibGUgc2xpZGUgb3ZlciBjb250ZW50XG4gICAgc2xpZGU6IHRydWVcbiAgfSxcbiAgLy9Cb3ggV2lkZ2V0IFBsdWdpbi4gRW5hYmxlIHRoaXMgcGx1Z2luXG4gIC8vdG8gYWxsb3cgYm94ZXMgdG8gYmUgY29sbGFwc2VkIGFuZC9vciByZW1vdmVkXG4gIGVuYWJsZUJveFdpZGdldDogdHJ1ZSxcbiAgLy9Cb3ggV2lkZ2V0IHBsdWdpbiBvcHRpb25zXG4gIGJveFdpZGdldE9wdGlvbnM6IHtcbiAgICBib3hXaWRnZXRJY29uczoge1xuICAgICAgLy9Db2xsYXBzZSBpY29uXG4gICAgICBjb2xsYXBzZTogJ2ZhLW1pbnVzJyxcbiAgICAgIC8vT3BlbiBpY29uXG4gICAgICBvcGVuOiAnZmEtcGx1cycsXG4gICAgICAvL1JlbW92ZSBpY29uXG4gICAgICByZW1vdmU6ICdmYS10aW1lcydcbiAgICB9LFxuICAgIGJveFdpZGdldFNlbGVjdG9yczoge1xuICAgICAgLy9SZW1vdmUgYnV0dG9uIHNlbGVjdG9yXG4gICAgICByZW1vdmU6ICdbZGF0YS13aWRnZXQ9XCJyZW1vdmVcIl0nLFxuICAgICAgLy9Db2xsYXBzZSBidXR0b24gc2VsZWN0b3JcbiAgICAgIGNvbGxhcHNlOiAnW2RhdGEtd2lkZ2V0PVwiY29sbGFwc2VcIl0nXG4gICAgfVxuICB9LFxuICAvL0RpcmVjdCBDaGF0IHBsdWdpbiBvcHRpb25zXG4gIGRpcmVjdENoYXQ6IHtcbiAgICAvL0VuYWJsZSBkaXJlY3QgY2hhdCBieSBkZWZhdWx0XG4gICAgZW5hYmxlOiB0cnVlLFxuICAgIC8vVGhlIGJ1dHRvbiB0byBvcGVuIGFuZCBjbG9zZSB0aGUgY2hhdCBjb250YWN0cyBwYW5lXG4gICAgY29udGFjdFRvZ2dsZVNlbGVjdG9yOiAnW2RhdGEtd2lkZ2V0PVwiY2hhdC1wYW5lLXRvZ2dsZVwiXSdcbiAgfSxcbiAgLy9EZWZpbmUgdGhlIHNldCBvZiBjb2xvcnMgdG8gdXNlIGdsb2JhbGx5IGFyb3VuZCB0aGUgd2Vic2l0ZVxuICBjb2xvcnM6IHtcbiAgICBsaWdodEJsdWU6IFwiIzNjOGRiY1wiLFxuICAgIHJlZDogXCIjZjU2OTU0XCIsXG4gICAgZ3JlZW46IFwiIzAwYTY1YVwiLFxuICAgIGFxdWE6IFwiIzAwYzBlZlwiLFxuICAgIHllbGxvdzogXCIjZjM5YzEyXCIsXG4gICAgYmx1ZTogXCIjMDA3M2I3XCIsXG4gICAgbmF2eTogXCIjMDAxRjNGXCIsXG4gICAgdGVhbDogXCIjMzlDQ0NDXCIsXG4gICAgb2xpdmU6IFwiIzNEOTk3MFwiLFxuICAgIGxpbWU6IFwiIzAxRkY3MFwiLFxuICAgIG9yYW5nZTogXCIjRkY4NTFCXCIsXG4gICAgZnVjaHNpYTogXCIjRjAxMkJFXCIsXG4gICAgcHVycGxlOiBcIiM4RTI0QUFcIixcbiAgICBtYXJvb246IFwiI0Q4MUI2MFwiLFxuICAgIGJsYWNrOiBcIiMyMjIyMjJcIixcbiAgICBncmF5OiBcIiNkMmQ2ZGVcIlxuICB9LFxuICAvL1RoZSBzdGFuZGFyZCBzY3JlZW4gc2l6ZXMgdGhhdCBib290c3RyYXAgdXNlcy5cbiAgLy9JZiB5b3UgY2hhbmdlIHRoZXNlIGluIHRoZSB2YXJpYWJsZXMubGVzcyBmaWxlLCBjaGFuZ2VcbiAgLy90aGVtIGhlcmUgdG9vLlxuICBzY3JlZW5TaXplczoge1xuICAgIHhzOiA0ODAsXG4gICAgc206IDc2OCxcbiAgICBtZDogOTkyLFxuICAgIGxnOiAxMjAwXG4gIH1cbn07XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICogLSBJbXBsZW1lbnRhdGlvbiAtXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRoZSBuZXh0IGJsb2NrIG9mIGNvZGUgaW1wbGVtZW50cyBBZG1pbkxURSdzXG4gKiBmdW5jdGlvbnMgYW5kIHBsdWdpbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZVxuICogb3B0aW9ucyBhYm92ZS5cbiAqL1xuJChmdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIC8vRml4IGZvciBJRSBwYWdlIHRyYW5zaXRpb25zXG4gICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaG9sZC10cmFuc2l0aW9uXCIpO1xuXG4gIC8vRXh0ZW5kIG9wdGlvbnMgaWYgZXh0ZXJuYWwgb3B0aW9ucyBleGlzdFxuICBpZiAodHlwZW9mIEFkbWluTFRFT3B0aW9ucyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICQuZXh0ZW5kKHRydWUsXG4gICAgICAgICAgICAkLkFkbWluTFRFLm9wdGlvbnMsXG4gICAgICAgICAgICBBZG1pbkxURU9wdGlvbnMpO1xuICB9XG5cbiAgLy9FYXN5IGFjY2VzcyB0byBvcHRpb25zXG4gIHZhciBvID0gJC5BZG1pbkxURS5vcHRpb25zO1xuXG4gIC8vU2V0IHVwIHRoZSBvYmplY3RcbiAgX2luaXQoKTtcblxuICAvL0FjdGl2YXRlIHRoZSBsYXlvdXQgbWFrZXJcbiAgJC5BZG1pbkxURS5sYXlvdXQuYWN0aXZhdGUoKTtcblxuICAvL0VuYWJsZSBzaWRlYmFyIHRyZWUgdmlldyBjb250cm9sc1xuICAkLkFkbWluTFRFLnRyZWUoJy5zaWRlYmFyJyk7XG5cbiAgLy9FbmFibGUgY29udHJvbCBzaWRlYmFyXG4gIGlmIChvLmVuYWJsZUNvbnRyb2xTaWRlYmFyKSB7XG4gICAgJC5BZG1pbkxURS5jb250cm9sU2lkZWJhci5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgLy9BZGQgc2xpbXNjcm9sbCB0byBuYXZiYXIgZHJvcGRvd25cbiAgaWYgKG8ubmF2YmFyTWVudVNsaW1zY3JvbGwgJiYgdHlwZW9mICQuZm4uc2xpbXNjcm9sbCAhPSAndW5kZWZpbmVkJykge1xuICAgICQoXCIubmF2YmFyIC5tZW51XCIpLnNsaW1zY3JvbGwoe1xuICAgICAgaGVpZ2h0OiBvLm5hdmJhck1lbnVIZWlnaHQsXG4gICAgICBhbHdheXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgIHNpemU6IG8ubmF2YmFyTWVudVNsaW1zY3JvbGxXaWR0aFxuICAgIH0pLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgfVxuXG4gIC8vQWN0aXZhdGUgc2lkZWJhciBwdXNoIG1lbnVcbiAgaWYgKG8uc2lkZWJhclB1c2hNZW51KSB7XG4gICAgJC5BZG1pbkxURS5wdXNoTWVudS5hY3RpdmF0ZShvLnNpZGViYXJUb2dnbGVTZWxlY3Rvcik7XG4gIH1cblxuICAvL0FjdGl2YXRlIEJvb3RzdHJhcCB0b29sdGlwXG4gIGlmIChvLmVuYWJsZUJTVG9wcGx0aXApIHtcbiAgICAkKCdib2R5JykudG9vbHRpcCh7XG4gICAgICBzZWxlY3Rvcjogby5CU1Rvb2x0aXBTZWxlY3RvclxuICAgIH0pO1xuICB9XG5cbiAgLy9BY3RpdmF0ZSBib3ggd2lkZ2V0XG4gIGlmIChvLmVuYWJsZUJveFdpZGdldCkge1xuICAgICQuQWRtaW5MVEUuYm94V2lkZ2V0LmFjdGl2YXRlKCk7XG4gIH1cblxuICAvL0FjdGl2YXRlIGZhc3QgY2xpY2tcbiAgaWYgKG8uZW5hYmxlRmFzdGNsaWNrICYmIHR5cGVvZiBGYXN0Q2xpY2sgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBGYXN0Q2xpY2suYXR0YWNoKGRvY3VtZW50LmJvZHkpO1xuICB9XG5cbiAgLy9BY3RpdmF0ZSBkaXJlY3QgY2hhdCB3aWRnZXRcbiAgaWYgKG8uZGlyZWN0Q2hhdC5lbmFibGUpIHtcbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCBvLmRpcmVjdENoYXQuY29udGFjdFRvZ2dsZVNlbGVjdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYm94ID0gJCh0aGlzKS5wYXJlbnRzKCcuZGlyZWN0LWNoYXQnKS5maXJzdCgpO1xuICAgICAgYm94LnRvZ2dsZUNsYXNzKCdkaXJlY3QtY2hhdC1jb250YWN0cy1vcGVuJyk7XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgKiBJTklUSUFMSVpFIEJVVFRPTiBUT0dHTEVcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICAkKCcuYnRuLWdyb3VwW2RhdGEtdG9nZ2xlPVwiYnRuLXRvZ2dsZVwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIHZhciBncm91cCA9ICQodGhpcyk7XG4gICAgJCh0aGlzKS5maW5kKFwiLmJ0blwiKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZ3JvdXAuZmluZChcIi5idG4uYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgJCh0aGlzKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcblxuICB9KTtcbn0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAtIEluaXRpYWxpemUgdGhlIEFkbWluTFRFIE9iamVjdCAtXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBbGwgQWRtaW5MVEUgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBiZWxvdy5cbiAqL1xuZnVuY3Rpb24gX2luaXQoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLyogTGF5b3V0XG4gICAqID09PT09PVxuICAgKiBGaXhlcyB0aGUgbGF5b3V0IGhlaWdodCBpbiBjYXNlIG1pbi1oZWlnaHQgZmFpbHMuXG4gICAqXG4gICAqIEB0eXBlIE9iamVjdFxuICAgKiBAdXNhZ2UgJC5BZG1pbkxURS5sYXlvdXQuYWN0aXZhdGUoKVxuICAgKiAgICAgICAgJC5BZG1pbkxURS5sYXlvdXQuZml4KClcbiAgICogICAgICAgICQuQWRtaW5MVEUubGF5b3V0LmZpeFNpZGViYXIoKVxuICAgKi9cbiAgJC5BZG1pbkxURS5sYXlvdXQgPSB7XG4gICAgYWN0aXZhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICBfdGhpcy5maXgoKTtcbiAgICAgIF90aGlzLmZpeFNpZGViYXIoKTtcbiAgICAgICQod2luZG93LCBcIi53cmFwcGVyXCIpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmZpeCgpO1xuICAgICAgICBfdGhpcy5maXhTaWRlYmFyKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZpeDogZnVuY3Rpb24gKCkge1xuICAgICAgLy9HZXQgd2luZG93IGhlaWdodCBhbmQgdGhlIHdyYXBwZXIgaGVpZ2h0XG4gICAgICB2YXIgbmVnID0gJCgnLm1haW4taGVhZGVyJykub3V0ZXJIZWlnaHQoKSArICQoJy5tYWluLWZvb3RlcicpLm91dGVySGVpZ2h0KCk7XG4gICAgICB2YXIgd2luZG93X2hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcbiAgICAgIHZhciBzaWRlYmFyX2hlaWdodCA9ICQoXCIuc2lkZWJhclwiKS5oZWlnaHQoKTtcbiAgICAgIC8vU2V0IHRoZSBtaW4taGVpZ2h0IG9mIHRoZSBjb250ZW50IGFuZCBzaWRlYmFyIGJhc2VkIG9uIHRoZVxuICAgICAgLy90aGUgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICgkKFwiYm9keVwiKS5oYXNDbGFzcyhcImZpeGVkXCIpKSB7XG4gICAgICAgICQoXCIuY29udGVudC13cmFwcGVyLCAucmlnaHQtc2lkZVwiKS5jc3MoJ21pbi1oZWlnaHQnLCB3aW5kb3dfaGVpZ2h0IC0gJCgnLm1haW4tZm9vdGVyJykub3V0ZXJIZWlnaHQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcG9zdFNldFdpZHRoO1xuICAgICAgICBpZiAod2luZG93X2hlaWdodCA+PSBzaWRlYmFyX2hlaWdodCkge1xuICAgICAgICAgICQoXCIuY29udGVudC13cmFwcGVyLCAucmlnaHQtc2lkZVwiKS5jc3MoJ21pbi1oZWlnaHQnLCB3aW5kb3dfaGVpZ2h0IC0gbmVnKTtcbiAgICAgICAgICBwb3N0U2V0V2lkdGggPSB3aW5kb3dfaGVpZ2h0IC0gbmVnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoXCIuY29udGVudC13cmFwcGVyLCAucmlnaHQtc2lkZVwiKS5jc3MoJ21pbi1oZWlnaHQnLCBzaWRlYmFyX2hlaWdodCk7XG4gICAgICAgICAgcG9zdFNldFdpZHRoID0gc2lkZWJhcl9oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL0ZpeCBmb3IgdGhlIGNvbnRyb2wgc2lkZWJhciBoZWlnaHRcbiAgICAgICAgdmFyIGNvbnRyb2xTaWRlYmFyID0gJCgkLkFkbWluTFRFLm9wdGlvbnMuY29udHJvbFNpZGViYXJPcHRpb25zLnNlbGVjdG9yKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250cm9sU2lkZWJhciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGlmIChjb250cm9sU2lkZWJhci5oZWlnaHQoKSA+IHBvc3RTZXRXaWR0aClcbiAgICAgICAgICAgICQoXCIuY29udGVudC13cmFwcGVyLCAucmlnaHQtc2lkZVwiKS5jc3MoJ21pbi1oZWlnaHQnLCBjb250cm9sU2lkZWJhci5oZWlnaHQoKSk7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0sXG4gICAgZml4U2lkZWJhcjogZnVuY3Rpb24gKCkge1xuICAgICAgLy9NYWtlIHN1cmUgdGhlIGJvZHkgdGFnIGhhcyB0aGUgLmZpeGVkIGNsYXNzXG4gICAgICBpZiAoISQoXCJib2R5XCIpLmhhc0NsYXNzKFwiZml4ZWRcIikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAkLmZuLnNsaW1TY3JvbGwgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAkKFwiLnNpZGViYXJcIikuc2xpbVNjcm9sbCh7ZGVzdHJveTogdHJ1ZX0pLmhlaWdodChcImF1dG9cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgJC5mbi5zbGltU2Nyb2xsID09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKFwiRXJyb3I6IHRoZSBmaXhlZCBsYXlvdXQgcmVxdWlyZXMgdGhlIHNsaW1zY3JvbGwgcGx1Z2luIVwiKTtcbiAgICAgIH1cbiAgICAgIC8vRW5hYmxlIHNsaW1zY3JvbGwgZm9yIGZpeGVkIGxheW91dFxuICAgICAgaWYgKCQuQWRtaW5MVEUub3B0aW9ucy5zaWRlYmFyU2xpbVNjcm9sbCkge1xuICAgICAgICBpZiAodHlwZW9mICQuZm4uc2xpbVNjcm9sbCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vRGVzdHJveSBpZiBpdCBleGlzdHNcbiAgICAgICAgICAkKFwiLnNpZGViYXJcIikuc2xpbVNjcm9sbCh7ZGVzdHJveTogdHJ1ZX0pLmhlaWdodChcImF1dG9cIik7XG4gICAgICAgICAgLy9BZGQgc2xpbXNjcm9sbFxuICAgICAgICAgICQoXCIuc2lkZWJhclwiKS5zbGltc2Nyb2xsKHtcbiAgICAgICAgICAgIGhlaWdodDogKCQod2luZG93KS5oZWlnaHQoKSAtICQoXCIubWFpbi1oZWFkZXJcIikuaGVpZ2h0KCkpICsgXCJweFwiLFxuICAgICAgICAgICAgY29sb3I6IFwicmdiYSgwLDAsMCwwLjIpXCIsXG4gICAgICAgICAgICBzaXplOiBcIjNweFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyogUHVzaE1lbnUoKVxuICAgKiA9PT09PT09PT09XG4gICAqIEFkZHMgdGhlIHB1c2ggbWVudSBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzaWRlYmFyLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvblxuICAgKiBAdXNhZ2U6ICQuQWRtaW5MVEUucHVzaE1lbnUoXCJbZGF0YS10b2dnbGU9J29mZmNhbnZhcyddXCIpXG4gICAqL1xuICAkLkFkbWluTFRFLnB1c2hNZW51ID0ge1xuICAgIGFjdGl2YXRlOiBmdW5jdGlvbiAodG9nZ2xlQnRuKSB7XG4gICAgICAvL0dldCB0aGUgc2NyZWVuIHNpemVzXG4gICAgICB2YXIgc2NyZWVuU2l6ZXMgPSAkLkFkbWluTFRFLm9wdGlvbnMuc2NyZWVuU2l6ZXM7XG5cbiAgICAgIC8vRW5hYmxlIHNpZGViYXIgdG9nZ2xlXG4gICAgICAkKHRvZ2dsZUJ0bikub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8vRW5hYmxlIHNpZGViYXIgcHVzaCBtZW51XG4gICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+IChzY3JlZW5TaXplcy5zbSAtIDEpKSB7XG4gICAgICAgICAgaWYgKCQoXCJib2R5XCIpLmhhc0NsYXNzKCdzaWRlYmFyLWNvbGxhcHNlJykpIHtcbiAgICAgICAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKCdzaWRlYmFyLWNvbGxhcHNlJykudHJpZ2dlcignZXhwYW5kZWQucHVzaE1lbnUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChcImJvZHlcIikuYWRkQ2xhc3MoJ3NpZGViYXItY29sbGFwc2UnKS50cmlnZ2VyKCdjb2xsYXBzZWQucHVzaE1lbnUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9IYW5kbGUgc2lkZWJhciBwdXNoIG1lbnUgZm9yIHNtYWxsIHNjcmVlbnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKCQoXCJib2R5XCIpLmhhc0NsYXNzKCdzaWRlYmFyLW9wZW4nKSkge1xuICAgICAgICAgICAgJChcImJvZHlcIikucmVtb3ZlQ2xhc3MoJ3NpZGViYXItb3BlbicpLnJlbW92ZUNsYXNzKCdzaWRlYmFyLWNvbGxhcHNlJykudHJpZ2dlcignY29sbGFwc2VkLnB1c2hNZW51Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKCdzaWRlYmFyLW9wZW4nKS50cmlnZ2VyKCdleHBhbmRlZC5wdXNoTWVudScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgICQoXCIuY29udGVudC13cmFwcGVyXCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy9FbmFibGUgaGlkZSBtZW51IHdoZW4gY2xpY2tpbmcgb24gdGhlIGNvbnRlbnQtd3JhcHBlciBvbiBzbWFsbCBzY3JlZW5zXG4gICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8PSAoc2NyZWVuU2l6ZXMuc20gLSAxKSAmJiAkKFwiYm9keVwiKS5oYXNDbGFzcyhcInNpZGViYXItb3BlblwiKSkge1xuICAgICAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKCdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vRW5hYmxlIGV4cGFuZCBvbiBob3ZlciBmb3Igc2lkZWJhciBtaW5pXG4gICAgICBpZiAoJC5BZG1pbkxURS5vcHRpb25zLnNpZGViYXJFeHBhbmRPbkhvdmVyXG4gICAgICAgICAgICAgIHx8ICgkKCdib2R5JykuaGFzQ2xhc3MoJ2ZpeGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAmJiAkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItbWluaScpKSkge1xuICAgICAgICB0aGlzLmV4cGFuZE9uSG92ZXIoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV4cGFuZE9uSG92ZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgc2NyZWVuV2lkdGggPSAkLkFkbWluTFRFLm9wdGlvbnMuc2NyZWVuU2l6ZXMuc20gLSAxO1xuICAgICAgLy9FeHBhbmQgc2lkZWJhciBvbiBob3ZlclxuICAgICAgJCgnLm1haW4tc2lkZWJhcicpLmhvdmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygnc2lkZWJhci1taW5pJylcbiAgICAgICAgICAgICAgICAmJiAkKFwiYm9keVwiKS5oYXNDbGFzcygnc2lkZWJhci1jb2xsYXBzZScpXG4gICAgICAgICAgICAgICAgJiYgJCh3aW5kb3cpLndpZHRoKCkgPiBzY3JlZW5XaWR0aCkge1xuICAgICAgICAgIF90aGlzLmV4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ3NpZGViYXItbWluaScpXG4gICAgICAgICAgICAgICAgJiYgJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJylcbiAgICAgICAgICAgICAgICAmJiAkKHdpbmRvdykud2lkdGgoKSA+IHNjcmVlbldpZHRoKSB7XG4gICAgICAgICAgX3RoaXMuY29sbGFwc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBleHBhbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKCdzaWRlYmFyLWNvbGxhcHNlJykuYWRkQ2xhc3MoJ3NpZGViYXItZXhwYW5kZWQtb24taG92ZXInKTtcbiAgICB9LFxuICAgIGNvbGxhcHNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJykpIHtcbiAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJykuYWRkQ2xhc3MoJ3NpZGViYXItY29sbGFwc2UnKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyogVHJlZSgpXG4gICAqID09PT09PVxuICAgKiBDb252ZXJ0cyB0aGUgc2lkZWJhciBpbnRvIGEgbXVsdGlsZXZlbFxuICAgKiB0cmVlIHZpZXcgbWVudS5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb25cbiAgICogQFVzYWdlOiAkLkFkbWluTFRFLnRyZWUoJy5zaWRlYmFyJylcbiAgICovXG4gICQuQWRtaW5MVEUudHJlZSA9IGZ1bmN0aW9uIChtZW51KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgYW5pbWF0aW9uU3BlZWQgPSAkLkFkbWluTFRFLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQ7XG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgbWVudSArICcgbGkgYScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvL0dldCB0aGUgY2xpY2tlZCBsaW5rIGFuZCB0aGUgbmV4dCBlbGVtZW50XG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgdmFyIGNoZWNrRWxlbWVudCA9ICR0aGlzLm5leHQoKTtcblxuICAgICAgLy9DaGVjayBpZiB0aGUgbmV4dCBlbGVtZW50IGlzIGEgbWVudSBhbmQgaXMgdmlzaWJsZVxuICAgICAgaWYgKChjaGVja0VsZW1lbnQuaXMoJy50cmVldmlldy1tZW51JykpICYmIChjaGVja0VsZW1lbnQuaXMoJzp2aXNpYmxlJykpKSB7XG4gICAgICAgIC8vQ2xvc2UgdGhlIG1lbnVcbiAgICAgICAgY2hlY2tFbGVtZW50LnNsaWRlVXAoYW5pbWF0aW9uU3BlZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjaGVja0VsZW1lbnQucmVtb3ZlQ2xhc3MoJ21lbnUtb3BlbicpO1xuICAgICAgICAgIC8vRml4IHRoZSBsYXlvdXQgaW4gY2FzZSB0aGUgc2lkZWJhciBzdHJldGNoZXMgb3ZlciB0aGUgaGVpZ2h0IG9mIHRoZSB3aW5kb3dcbiAgICAgICAgICAvL190aGlzLmxheW91dC5maXgoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNoZWNrRWxlbWVudC5wYXJlbnQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgIH1cbiAgICAgIC8vSWYgdGhlIG1lbnUgaXMgbm90IHZpc2libGVcbiAgICAgIGVsc2UgaWYgKChjaGVja0VsZW1lbnQuaXMoJy50cmVldmlldy1tZW51JykpICYmICghY2hlY2tFbGVtZW50LmlzKCc6dmlzaWJsZScpKSkge1xuICAgICAgICAvL0dldCB0aGUgcGFyZW50IG1lbnVcbiAgICAgICAgdmFyIHBhcmVudCA9ICR0aGlzLnBhcmVudHMoJ3VsJykuZmlyc3QoKTtcbiAgICAgICAgLy9DbG9zZSBhbGwgb3BlbiBtZW51cyB3aXRoaW4gdGhlIHBhcmVudFxuICAgICAgICB2YXIgdWwgPSBwYXJlbnQuZmluZCgndWw6dmlzaWJsZScpLnNsaWRlVXAoYW5pbWF0aW9uU3BlZWQpO1xuICAgICAgICAvL1JlbW92ZSB0aGUgbWVudS1vcGVuIGNsYXNzIGZyb20gdGhlIHBhcmVudFxuICAgICAgICB1bC5yZW1vdmVDbGFzcygnbWVudS1vcGVuJyk7XG4gICAgICAgIC8vR2V0IHRoZSBwYXJlbnQgbGlcbiAgICAgICAgdmFyIHBhcmVudF9saSA9ICR0aGlzLnBhcmVudChcImxpXCIpO1xuXG4gICAgICAgIC8vT3BlbiB0aGUgdGFyZ2V0IG1lbnUgYW5kIGFkZCB0aGUgbWVudS1vcGVuIGNsYXNzXG4gICAgICAgIGNoZWNrRWxlbWVudC5zbGlkZURvd24oYW5pbWF0aW9uU3BlZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvL0FkZCB0aGUgY2xhc3MgYWN0aXZlIHRvIHRoZSBwYXJlbnQgbGlcbiAgICAgICAgICBjaGVja0VsZW1lbnQuYWRkQ2xhc3MoJ21lbnUtb3BlbicpO1xuICAgICAgICAgIHBhcmVudC5maW5kKCdsaS5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgcGFyZW50X2xpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAvL0ZpeCB0aGUgbGF5b3V0IGluIGNhc2UgdGhlIHNpZGViYXIgc3RyZXRjaGVzIG92ZXIgdGhlIGhlaWdodCBvZiB0aGUgd2luZG93XG4gICAgICAgICAgX3RoaXMubGF5b3V0LmZpeCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vaWYgdGhpcyBpc24ndCBhIGxpbmssIHByZXZlbnQgdGhlIHBhZ2UgZnJvbSBiZWluZyByZWRpcmVjdGVkXG4gICAgICBpZiAoY2hlY2tFbGVtZW50LmlzKCcudHJlZXZpZXctbWVudScpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvKiBDb250cm9sU2lkZWJhclxuICAgKiA9PT09PT09PT09PT09PVxuICAgKiBBZGRzIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHJpZ2h0IHNpZGViYXJcbiAgICpcbiAgICogQHR5cGUgT2JqZWN0XG4gICAqIEB1c2FnZSAkLkFkbWluTFRFLmNvbnRyb2xTaWRlYmFyLmFjdGl2YXRlKG9wdGlvbnMpXG4gICAqL1xuICAkLkFkbWluTFRFLmNvbnRyb2xTaWRlYmFyID0ge1xuICAgIC8vaW5zdGFudGlhdGUgdGhlIG9iamVjdFxuICAgIGFjdGl2YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAvL0dldCB0aGUgb2JqZWN0XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgLy9VcGRhdGUgb3B0aW9uc1xuICAgICAgdmFyIG8gPSAkLkFkbWluTFRFLm9wdGlvbnMuY29udHJvbFNpZGViYXJPcHRpb25zO1xuICAgICAgLy9HZXQgdGhlIHNpZGViYXJcbiAgICAgIHZhciBzaWRlYmFyID0gJChvLnNlbGVjdG9yKTtcbiAgICAgIC8vVGhlIHRvZ2dsZSBidXR0b25cbiAgICAgIHZhciBidG4gPSAkKG8udG9nZ2xlQnRuU2VsZWN0b3IpO1xuXG4gICAgICAvL0xpc3RlbiB0byB0aGUgY2xpY2sgZXZlbnRcbiAgICAgIGJ0bi5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vSWYgdGhlIHNpZGViYXIgaXMgbm90IG9wZW5cbiAgICAgICAgaWYgKCFzaWRlYmFyLmhhc0NsYXNzKCdjb250cm9sLXNpZGViYXItb3BlbicpXG4gICAgICAgICAgICAgICAgJiYgISQoJ2JvZHknKS5oYXNDbGFzcygnY29udHJvbC1zaWRlYmFyLW9wZW4nKSkge1xuICAgICAgICAgIC8vT3BlbiB0aGUgc2lkZWJhclxuICAgICAgICAgIF90aGlzLm9wZW4oc2lkZWJhciwgby5zbGlkZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2Uoc2lkZWJhciwgby5zbGlkZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvL0lmIHRoZSBib2R5IGhhcyBhIGJveGVkIGxheW91dCwgZml4IHRoZSBzaWRlYmFyIGJnIHBvc2l0aW9uXG4gICAgICB2YXIgYmcgPSAkKFwiLmNvbnRyb2wtc2lkZWJhci1iZ1wiKTtcbiAgICAgIF90aGlzLl9maXgoYmcpO1xuXG4gICAgICAvL0lmIHRoZSBib2R5IGhhcyBhIGZpeGVkIGxheW91dCwgbWFrZSB0aGUgY29udHJvbCBzaWRlYmFyIGZpeGVkXG4gICAgICBpZiAoJCgnYm9keScpLmhhc0NsYXNzKCdmaXhlZCcpKSB7XG4gICAgICAgIF90aGlzLl9maXhGb3JGaXhlZChzaWRlYmFyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vSWYgdGhlIGNvbnRlbnQgaGVpZ2h0IGlzIGxlc3MgdGhhbiB0aGUgc2lkZWJhcidzIGhlaWdodCwgZm9yY2UgbWF4IGhlaWdodFxuICAgICAgICBpZiAoJCgnLmNvbnRlbnQtd3JhcHBlciwgLnJpZ2h0LXNpZGUnKS5oZWlnaHQoKSA8IHNpZGViYXIuaGVpZ2h0KCkpIHtcbiAgICAgICAgICBfdGhpcy5fZml4Rm9yQ29udGVudChzaWRlYmFyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgLy9PcGVuIHRoZSBjb250cm9sIHNpZGViYXJcbiAgICBvcGVuOiBmdW5jdGlvbiAoc2lkZWJhciwgc2xpZGUpIHtcbiAgICAgIC8vU2xpZGUgb3ZlciBjb250ZW50XG4gICAgICBpZiAoc2xpZGUpIHtcbiAgICAgICAgc2lkZWJhci5hZGRDbGFzcygnY29udHJvbC1zaWRlYmFyLW9wZW4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vUHVzaCB0aGUgY29udGVudCBieSBhZGRpbmcgdGhlIG9wZW4gY2xhc3MgdG8gdGhlIGJvZHkgaW5zdGVhZFxuICAgICAgICAvL29mIHRoZSBzaWRlYmFyIGl0c2VsZlxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ2NvbnRyb2wtc2lkZWJhci1vcGVuJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvL0Nsb3NlIHRoZSBjb250cm9sIHNpZGViYXJcbiAgICBjbG9zZTogZnVuY3Rpb24gKHNpZGViYXIsIHNsaWRlKSB7XG4gICAgICBpZiAoc2xpZGUpIHtcbiAgICAgICAgc2lkZWJhci5yZW1vdmVDbGFzcygnY29udHJvbC1zaWRlYmFyLW9wZW4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnY29udHJvbC1zaWRlYmFyLW9wZW4nKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9maXg6IGZ1bmN0aW9uIChzaWRlYmFyKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKCQoXCJib2R5XCIpLmhhc0NsYXNzKCdsYXlvdXQtYm94ZWQnKSkge1xuICAgICAgICBzaWRlYmFyLmNzcygncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgc2lkZWJhci5oZWlnaHQoJChcIi53cmFwcGVyXCIpLmhlaWdodCgpKTtcbiAgICAgICAgJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuX2ZpeChzaWRlYmFyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWRlYmFyLmNzcyh7XG4gICAgICAgICAgJ3Bvc2l0aW9uJzogJ2ZpeGVkJyxcbiAgICAgICAgICAnaGVpZ2h0JzogJ2F1dG8nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2ZpeEZvckZpeGVkOiBmdW5jdGlvbiAoc2lkZWJhcikge1xuICAgICAgc2lkZWJhci5jc3Moe1xuICAgICAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxuICAgICAgICAnbWF4LWhlaWdodCc6ICcxMDAlJyxcbiAgICAgICAgJ292ZXJmbG93JzogJ2F1dG8nLFxuICAgICAgICAncGFkZGluZy1ib3R0b20nOiAnNTBweCdcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgX2ZpeEZvckNvbnRlbnQ6IGZ1bmN0aW9uIChzaWRlYmFyKSB7XG4gICAgICAkKFwiLmNvbnRlbnQtd3JhcHBlciwgLnJpZ2h0LXNpZGVcIikuY3NzKCdtaW4taGVpZ2h0Jywgc2lkZWJhci5oZWlnaHQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qIEJveFdpZGdldFxuICAgKiA9PT09PT09PT1cbiAgICogQm94V2lkZ2V0IGlzIGEgcGx1Z2luIHRvIGhhbmRsZSBjb2xsYXBzaW5nIGFuZFxuICAgKiByZW1vdmluZyBib3hlcyBmcm9tIHRoZSBzY3JlZW4uXG4gICAqXG4gICAqIEB0eXBlIE9iamVjdFxuICAgKiBAdXNhZ2UgJC5BZG1pbkxURS5ib3hXaWRnZXQuYWN0aXZhdGUoKVxuICAgKiAgICAgICAgU2V0IGFsbCB5b3VyIG9wdGlvbnMgaW4gdGhlIG1haW4gJC5BZG1pbkxURS5vcHRpb25zIG9iamVjdFxuICAgKi9cbiAgJC5BZG1pbkxURS5ib3hXaWRnZXQgPSB7XG4gICAgc2VsZWN0b3JzOiAkLkFkbWluTFRFLm9wdGlvbnMuYm94V2lkZ2V0T3B0aW9ucy5ib3hXaWRnZXRTZWxlY3RvcnMsXG4gICAgaWNvbnM6ICQuQWRtaW5MVEUub3B0aW9ucy5ib3hXaWRnZXRPcHRpb25zLmJveFdpZGdldEljb25zLFxuICAgIGFuaW1hdGlvblNwZWVkOiAkLkFkbWluTFRFLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsXG4gICAgYWN0aXZhdGU6IGZ1bmN0aW9uIChfYm94KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKCFfYm94KSB7XG4gICAgICAgIF9ib3ggPSBkb2N1bWVudDsgLy8gYWN0aXZhdGUgYWxsIGJveGVzIHBlciBkZWZhdWx0XG4gICAgICB9XG4gICAgICAvL0xpc3RlbiBmb3IgY29sbGFwc2UgZXZlbnQgdHJpZ2dlcnNcbiAgICAgICQoX2JveCkub24oJ2NsaWNrJywgX3RoaXMuc2VsZWN0b3JzLmNvbGxhcHNlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIF90aGlzLmNvbGxhcHNlKCQodGhpcykpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vTGlzdGVuIGZvciByZW1vdmUgZXZlbnQgdHJpZ2dlcnNcbiAgICAgICQoX2JveCkub24oJ2NsaWNrJywgX3RoaXMuc2VsZWN0b3JzLnJlbW92ZSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBfdGhpcy5yZW1vdmUoJCh0aGlzKSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNvbGxhcHNlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIC8vRmluZCB0aGUgYm94IHBhcmVudFxuICAgICAgdmFyIGJveCA9IGVsZW1lbnQucGFyZW50cyhcIi5ib3hcIikuZmlyc3QoKTtcbiAgICAgIC8vRmluZCB0aGUgYm9keSBhbmQgdGhlIGZvb3RlclxuICAgICAgdmFyIGJveF9jb250ZW50ID0gYm94LmZpbmQoXCI+IC5ib3gtYm9keSwgPiAuYm94LWZvb3RlciwgPiBmb3JtICA+LmJveC1ib2R5LCA+IGZvcm0gPiAuYm94LWZvb3RlclwiKTtcbiAgICAgIGlmICghYm94Lmhhc0NsYXNzKFwiY29sbGFwc2VkLWJveFwiKSkge1xuICAgICAgICAvL0NvbnZlcnQgbWludXMgaW50byBwbHVzXG4gICAgICAgIGVsZW1lbnQuY2hpbGRyZW4oXCI6Zmlyc3RcIilcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoX3RoaXMuaWNvbnMuY29sbGFwc2UpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKF90aGlzLmljb25zLm9wZW4pO1xuICAgICAgICAvL0hpZGUgdGhlIGNvbnRlbnRcbiAgICAgICAgYm94X2NvbnRlbnQuc2xpZGVVcChfdGhpcy5hbmltYXRpb25TcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJveC5hZGRDbGFzcyhcImNvbGxhcHNlZC1ib3hcIik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9Db252ZXJ0IHBsdXMgaW50byBtaW51c1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuKFwiOmZpcnN0XCIpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKF90aGlzLmljb25zLm9wZW4pXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKF90aGlzLmljb25zLmNvbGxhcHNlKTtcbiAgICAgICAgLy9TaG93IHRoZSBjb250ZW50XG4gICAgICAgIGJveF9jb250ZW50LnNsaWRlRG93bihfdGhpcy5hbmltYXRpb25TcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJveC5yZW1vdmVDbGFzcyhcImNvbGxhcHNlZC1ib3hcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgLy9GaW5kIHRoZSBib3ggcGFyZW50XG4gICAgICB2YXIgYm94ID0gZWxlbWVudC5wYXJlbnRzKFwiLmJveFwiKS5maXJzdCgpO1xuICAgICAgYm94LnNsaWRlVXAodGhpcy5hbmltYXRpb25TcGVlZCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAqIC0gQ3VzdG9tIFBsdWdpbnMgLVxuICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBbGwgY3VzdG9tIHBsdWdpbnMgYXJlIGRlZmluZWQgYmVsb3cuXG4gKi9cblxuLypcbiAqIEJPWCBSRUZSRVNIIEJVVFRPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUaGlzIGlzIGEgY3VzdG9tIHBsdWdpbiB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50IEJPWC4gSXQgYWxsb3dzIHlvdSB0byBhZGRcbiAqIGEgcmVmcmVzaCBidXR0b24gdG8gdGhlIGJveC4gSXQgY29udmVydHMgdGhlIGJveCdzIHN0YXRlIHRvIGEgbG9hZGluZyBzdGF0ZS5cbiAqXG4gKiBAdHlwZSBwbHVnaW5cbiAqIEB1c2FnZSAkKFwiI2JveC13aWRnZXRcIikuYm94UmVmcmVzaCggb3B0aW9ucyApO1xuICovXG4oZnVuY3Rpb24gKCQpIHtcblxuICBcInVzZSBzdHJpY3RcIjtcblxuICAkLmZuLmJveFJlZnJlc2ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXG4gICAgLy8gUmVuZGVyIG9wdGlvbnNcbiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCh7XG4gICAgICAvL1JlZnJlc2ggYnV0dG9uIHNlbGVjdG9yXG4gICAgICB0cmlnZ2VyOiBcIi5yZWZyZXNoLWJ0blwiLFxuICAgICAgLy9GaWxlIHNvdXJjZSB0byBiZSBsb2FkZWQgKGUuZzogYWpheC9zcmMucGhwKVxuICAgICAgc291cmNlOiBcIlwiLFxuICAgICAgLy9DYWxsYmFja3NcbiAgICAgIG9uTG9hZFN0YXJ0OiBmdW5jdGlvbiAoYm94KSB7XG4gICAgICAgIHJldHVybiBib3g7XG4gICAgICB9LCAvL1JpZ2h0IGFmdGVyIHRoZSBidXR0b24gaGFzIGJlZW4gY2xpY2tlZFxuICAgICAgb25Mb2FkRG9uZTogZnVuY3Rpb24gKGJveCkge1xuICAgICAgICByZXR1cm4gYm94O1xuICAgICAgfSAvL1doZW4gdGhlIHNvdXJjZSBoYXMgYmVlbiBsb2FkZWRcblxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgLy9UaGUgb3ZlcmxheVxuICAgIHZhciBvdmVybGF5ID0gJCgnPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj48ZGl2IGNsYXNzPVwiZmEgZmEtcmVmcmVzaCBmYS1zcGluXCI+PC9kaXY+PC9kaXY+Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vaWYgYSBzb3VyY2UgaXMgc3BlY2lmaWVkXG4gICAgICBpZiAoc2V0dGluZ3Muc291cmNlID09PSBcIlwiKSB7XG4gICAgICAgIGlmICh3aW5kb3cuY29uc29sZSkge1xuICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhcIlBsZWFzZSBzcGVjaWZ5IGEgc291cmNlIGZpcnN0IC0gYm94UmVmcmVzaCgpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vdGhlIGJveFxuICAgICAgdmFyIGJveCA9ICQodGhpcyk7XG4gICAgICAvL3RoZSBidXR0b25cbiAgICAgIHZhciByQnRuID0gYm94LmZpbmQoc2V0dGluZ3MudHJpZ2dlcikuZmlyc3QoKTtcblxuICAgICAgLy9PbiB0cmlnZ2VyIGNsaWNrXG4gICAgICByQnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy9BZGQgbG9hZGluZyBvdmVybGF5XG4gICAgICAgIHN0YXJ0KGJveCk7XG5cbiAgICAgICAgLy9QZXJmb3JtIGFqYXggY2FsbFxuICAgICAgICBib3guZmluZChcIi5ib3gtYm9keVwiKS5sb2FkKHNldHRpbmdzLnNvdXJjZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRvbmUoYm94KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHN0YXJ0KGJveCkge1xuICAgICAgLy9BZGQgb3ZlcmxheSBhbmQgbG9hZGluZyBpbWdcbiAgICAgIGJveC5hcHBlbmQob3ZlcmxheSk7XG5cbiAgICAgIHNldHRpbmdzLm9uTG9hZFN0YXJ0LmNhbGwoYm94KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb25lKGJveCkge1xuICAgICAgLy9SZW1vdmUgb3ZlcmxheSBhbmQgbG9hZGluZyBpbWdcbiAgICAgIGJveC5maW5kKG92ZXJsYXkpLnJlbW92ZSgpO1xuXG4gICAgICBzZXR0aW5ncy5vbkxvYWREb25lLmNhbGwoYm94KTtcbiAgICB9XG5cbiAgfTtcblxufSkoalF1ZXJ5KTtcblxuLypcbiAqIEVYUExJQ0lUIEJPWCBBQ1RJVkFUSU9OXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBpcyBhIGN1c3RvbSBwbHVnaW4gdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudCBCT1guIEl0IGFsbG93cyB5b3UgdG8gYWN0aXZhdGVcbiAqIGEgYm94IGluc2VydGVkIGluIHRoZSBET00gYWZ0ZXIgdGhlIGFwcC5qcyB3YXMgbG9hZGVkLlxuICpcbiAqIEB0eXBlIHBsdWdpblxuICogQHVzYWdlICQoXCIjYm94LXdpZGdldFwiKS5hY3RpdmF0ZUJveCgpO1xuICovXG4oZnVuY3Rpb24gKCQpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgJC5mbi5hY3RpdmF0ZUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLkFkbWluTFRFLmJveFdpZGdldC5hY3RpdmF0ZSh0aGlzKTtcbiAgfTtcblxufSkoalF1ZXJ5KTtcblxuLypcbiAqIFRPRE8gTElTVCBDVVNUT00gUExVR0lOXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBwbHVnaW4gZGVwZW5kcyBvbiBpQ2hlY2sgcGx1Z2luIGZvciBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzXG4gKlxuICogQHR5cGUgcGx1Z2luXG4gKiBAdXNhZ2UgJChcIiN0b2RvLXdpZGdldFwiKS50b2RvbGlzdCggb3B0aW9ucyApO1xuICovXG4oZnVuY3Rpb24gKCQpIHtcblxuICAndXNlIHN0cmljdCc7XG5cbiAgJC5mbi50b2RvbGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgLy8gUmVuZGVyIG9wdGlvbnNcbiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCh7XG4gICAgICAvL1doZW4gdGhlIHVzZXIgY2hlY2tzIHRoZSBpbnB1dFxuICAgICAgb25DaGVjazogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlO1xuICAgICAgfSxcbiAgICAgIC8vV2hlbiB0aGUgdXNlciB1bmNoZWNrcyB0aGUgaW5wdXRcbiAgICAgIG9uVW5jaGVjazogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICByZXR1cm4gZWxlO1xuICAgICAgfVxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG5cbiAgICAgIGlmICh0eXBlb2YgJC5mbi5pQ2hlY2sgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJCgnaW5wdXQnLCB0aGlzKS5vbignaWZDaGVja2VkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBlbGUgPSAkKHRoaXMpLnBhcmVudHMoXCJsaVwiKS5maXJzdCgpO1xuICAgICAgICAgIGVsZS50b2dnbGVDbGFzcyhcImRvbmVcIik7XG4gICAgICAgICAgc2V0dGluZ3Mub25DaGVjay5jYWxsKGVsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJ2lucHV0JywgdGhpcykub24oJ2lmVW5jaGVja2VkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBlbGUgPSAkKHRoaXMpLnBhcmVudHMoXCJsaVwiKS5maXJzdCgpO1xuICAgICAgICAgIGVsZS50b2dnbGVDbGFzcyhcImRvbmVcIik7XG4gICAgICAgICAgc2V0dGluZ3Mub25VbmNoZWNrLmNhbGwoZWxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkKCdpbnB1dCcsIHRoaXMpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGVsZSA9ICQodGhpcykucGFyZW50cyhcImxpXCIpLmZpcnN0KCk7XG4gICAgICAgICAgZWxlLnRvZ2dsZUNsYXNzKFwiZG9uZVwiKTtcbiAgICAgICAgICBpZiAoJCgnaW5wdXQnLCBlbGUpLmlzKFwiOmNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLm9uQ2hlY2suY2FsbChlbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXR0aW5ncy5vblVuY2hlY2suY2FsbChlbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59KGpRdWVyeSkpO1xuXG4vLy0tLS0tLS0tLS0tLS1cbi8vLSBQSUUgQ0hBUlQgLVxuLy8tLS0tLS0tLS0tLS0tXG4vLyBHZXQgY29udGV4dCB3aXRoIGpRdWVyeSAtIHVzaW5nIGpRdWVyeSdzIC5nZXQoKSBtZXRob2QuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gcmVzb3VyY2VzL2Fzc2V0cy9qcy9hcHAuanMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFVQTtBQUNBOzs7Ozs7QUFNQTs7OztBQUlBO0FBQ0E7QUFDQTs7OztBQUlBOztBQUVBOztBQUVBOztBQUVBOzs7O0FBSUE7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7QUFLQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzsiLCJzb3VyY2VSb290IjoiIn0=");
/***/ }
/******/ });