PATH: /home/hwyuvbry/www/kerbau/assets/vendor/libs/datatables-fixedcolumns
FILE_BARU
CREATE
FOLDER_BARU
MKDIR
UPLOAD_FILE
GO
[ .. KEMBALI ]
📄 datatables.fixedcolumns.js
↓
X
📄 datatables.fixedcolumns.js.LICENSE.txt
↓
X
SAVING...
BERHASIL DIUBAH!
EDITING: datatables.fixedcolumns.js
/* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ /******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./libs/datatables-fixedcolumns/datatables.fixedcolumns.js": /*!*****************************************************************!*\ !*** ./libs/datatables-fixedcolumns/datatables.fixedcolumns.js ***! \*****************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var datatables_net_fixedcolumns_js_dataTables_fixedColumns__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datatables.net-fixedcolumns/js/dataTables.fixedColumns */ "./node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js"); /* harmony import */ var datatables_net_fixedcolumns_js_dataTables_fixedColumns__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datatables_net_fixedcolumns_js_dataTables_fixedColumns__WEBPACK_IMPORTED_MODULE_0__); /***/ }), /***/ "./node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js": /*!********************************************************************************!*\ !*** ./node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js ***! \********************************************************************************/ /***/ (function(module, exports, __webpack_require__) { eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! FixedColumns 4.1.0\n * 2019-2022 SpryMedia Ltd - datatables.net/license\n */\n(function () {\n 'use strict';\n\n var $;\n var dataTable;\n function setJQuery(jq) {\n $ = jq;\n dataTable = $.fn.dataTable;\n }\n var FixedColumns = /** @class */ (function () {\n function FixedColumns(settings, opts) {\n var _this = this;\n // Check that the required version of DataTables is included\n if (!dataTable || !dataTable.versionCheck || !dataTable.versionCheck('1.10.0')) {\n throw new Error('StateRestore requires DataTables 1.10 or newer');\n }\n var table = new dataTable.Api(settings);\n this.classes = $.extend(true, {}, FixedColumns.classes);\n // Get options from user\n this.c = $.extend(true, {}, FixedColumns.defaults, opts);\n // Backwards compatibility for deprecated leftColumns\n if ((!opts || opts.left === undefined) && this.c.leftColumns !== undefined) {\n this.c.left = this.c.leftColumns;\n }\n // Backwards compatibility for deprecated rightColumns\n if ((!opts || opts.right === undefined) && this.c.rightColumns !== undefined) {\n this.c.right = this.c.rightColumns;\n }\n this.s = {\n barWidth: 0,\n dt: table,\n rtl: $('body').css('direction') === 'rtl'\n };\n // Common CSS for all blockers\n var blockerCSS = {\n 'bottom': '0px',\n 'display': 'block',\n 'position': 'absolute',\n 'width': this.s.barWidth + 1 + 'px'\n };\n this.dom = {\n leftBottomBlocker: $('<div>')\n .css(blockerCSS)\n .css('left', 0)\n .addClass(this.classes.leftBottomBlocker),\n leftTopBlocker: $('<div>')\n .css(blockerCSS)\n .css({\n left: 0,\n top: 0\n })\n .addClass(this.classes.leftTopBlocker),\n rightBottomBlocker: $('<div>')\n .css(blockerCSS)\n .css('right', 0)\n .addClass(this.classes.rightBottomBlocker),\n rightTopBlocker: $('<div>')\n .css(blockerCSS)\n .css({\n right: 0,\n top: 0\n })\n .addClass(this.classes.rightTopBlocker)\n };\n if (this.s.dt.settings()[0]._bInitComplete) {\n // Fixed Columns Initialisation\n this._addStyles();\n this._setKeyTableListener();\n }\n else {\n table.one('init.dt', function () {\n // Fixed Columns Initialisation\n _this._addStyles();\n _this._setKeyTableListener();\n });\n }\n table.on('column-sizing.dt', function () { return _this._addStyles(); });\n // Make class available through dt object\n table.settings()[0]._fixedColumns = this;\n return this;\n }\n /**\n * Getter/Setter for the `fixedColumns.left` property\n *\n * @param newVal Optional. If present this will be the new value for the number of left fixed columns\n * @returns The number of left fixed columns\n */\n FixedColumns.prototype.left = function (newVal) {\n // If the value is to change\n if (newVal !== undefined) {\n // Set the new values and redraw the columns\n this.c.left = newVal;\n this._addStyles();\n }\n return this.c.left;\n };\n /**\n * Getter/Setter for the `fixedColumns.left` property\n *\n * @param newVal Optional. If present this will be the new value for the number of right fixed columns\n * @returns The number of right fixed columns\n */\n FixedColumns.prototype.right = function (newVal) {\n // If the value is to change\n if (newVal !== undefined) {\n // Set the new values and redraw the columns\n this.c.right = newVal;\n this._addStyles();\n }\n return this.c.right;\n };\n /**\n * Iterates over the columns, fixing the appropriate ones to the left and right\n */\n FixedColumns.prototype._addStyles = function () {\n // Set the bar width if vertical scrolling is enabled\n if (this.s.dt.settings()[0].oScroll.sY) {\n var scroll_1 = $(this.s.dt.table().node()).closest('div.dataTables_scrollBody')[0];\n var barWidth = this.s.dt.settings()[0].oBrowser.barWidth;\n if (scroll_1.offsetWidth - scroll_1.clientWidth >= barWidth) {\n this.s.barWidth = barWidth;\n }\n else {\n this.s.barWidth = 0;\n }\n this.dom.rightTopBlocker.css('width', this.s.barWidth + 1);\n this.dom.leftTopBlocker.css('width', this.s.barWidth + 1);\n this.dom.rightBottomBlocker.css('width', this.s.barWidth + 1);\n this.dom.leftBottomBlocker.css('width', this.s.barWidth + 1);\n }\n var parentDiv = null;\n // Get the header and it's height\n var header = this.s.dt.column(0).header();\n var headerHeight = null;\n if (header !== null) {\n header = $(header);\n headerHeight = header.outerHeight() + 1;\n parentDiv = $(header.closest('div.dataTables_scroll')).css('position', 'relative');\n }\n // Get the footer and it's height\n var footer = this.s.dt.column(0).footer();\n var footerHeight = null;\n if (footer !== null) {\n footer = $(footer);\n footerHeight = footer.outerHeight();\n // Only attempt to retrieve the parentDiv if it has not been retrieved already\n if (parentDiv === null) {\n parentDiv = $(footer.closest('div.dataTables_scroll')).css('position', 'relative');\n }\n }\n // Get the number of columns in the table - this is used often so better to only make 1 api call\n var numCols = this.s.dt.columns().data().toArray().length;\n // Tracker for the number of pixels should be left to the left of the table\n var distLeft = 0;\n // Sometimes the headers have slightly different widths so need to track them individually\n var headLeft = 0;\n // Get all of the row elements in the table\n var rows = $(this.s.dt.table().node()).children('tbody').children('tr');\n var invisibles = 0;\n // When working from right to left we need to know how many are invisible before a point,\n // without including those that are invisible after\n var prevInvisible = new Map();\n // Iterate over all of the columns\n for (var i = 0; i < numCols; i++) {\n var column = this.s.dt.column(i);\n // Set the map for the previous column\n if (i > 0) {\n prevInvisible.set(i - 1, invisibles);\n }\n if (!column.visible()) {\n invisibles++;\n continue;\n }\n // Get the columns header and footer element\n var colHeader = $(column.header());\n var colFooter = $(column.footer());\n // If i is less than the value of left then this column should be fixed left\n if (i - invisibles < this.c.left) {\n $(this.s.dt.table().node()).addClass(this.classes.tableFixedLeft);\n parentDiv.addClass(this.classes.tableFixedLeft);\n // Add the width of the previous node - only if we are on atleast the second column\n if (i - invisibles > 0) {\n var prevIdx = i;\n // Simply using the number of hidden columns doesn't work here,\n // if the first is hidden then this would be thrown off\n while (prevIdx + 1 < numCols) {\n var prevCol = this.s.dt.column(prevIdx - 1, { page: 'current' });\n if (prevCol.visible()) {\n distLeft += $(prevCol.nodes()[0]).outerWidth();\n headLeft += prevCol.header() ?\n $(prevCol.header()).outerWidth() :\n prevCol.footer() ?\n $(prevCol.header()).outerWidth() :\n 0;\n break;\n }\n prevIdx--;\n }\n }\n // Iterate over all of the rows, fixing the cell to the left\n for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {\n var row = rows_1[_i];\n $($(row).children()[i - invisibles])\n .css(this._getCellCSS(false, distLeft, 'left'))\n .addClass(this.classes.fixedLeft);\n }\n // Add the css for the header and the footer\n colHeader\n .css(this._getCellCSS(true, headLeft, 'left'))\n .addClass(this.classes.fixedLeft);\n colFooter\n .css(this._getCellCSS(true, headLeft, 'left'))\n .addClass(this.classes.fixedLeft);\n }\n else {\n // Iteriate through all of the rows, making sure they aren't currently trying to fix left\n for (var _a = 0, rows_2 = rows; _a < rows_2.length; _a++) {\n var row = rows_2[_a];\n var cell = $($(row).children()[i - invisibles]);\n // If the cell is trying to fix to the left, remove the class and the css\n if (cell.hasClass(this.classes.fixedLeft)) {\n cell\n .css(this._clearCellCSS('left'))\n .removeClass(this.classes.fixedLeft);\n }\n }\n // Make sure the header for this column isn't fixed left\n if (colHeader.hasClass(this.classes.fixedLeft)) {\n colHeader\n .css(this._clearCellCSS('left'))\n .removeClass(this.classes.fixedLeft);\n }\n // Make sure the footer for this column isn't fixed left\n if (colFooter.hasClass(this.classes.fixedLeft)) {\n colFooter\n .css(this._clearCellCSS('left'))\n .removeClass(this.classes.fixedLeft);\n }\n }\n }\n // If there is a header with the index class and reading rtl then add left top blocker\n if (header !== null && !header.hasClass('index')) {\n if (this.s.rtl) {\n this.dom.leftTopBlocker.outerHeight(headerHeight);\n parentDiv.append(this.dom.leftTopBlocker);\n }\n else {\n this.dom.rightTopBlocker.outerHeight(headerHeight);\n parentDiv.append(this.dom.rightTopBlocker);\n }\n }\n // If there is a footer with the index class and reading rtl then add left bottom blocker\n if (footer !== null && !footer.hasClass('index')) {\n if (this.s.rtl) {\n this.dom.leftBottomBlocker.outerHeight(footerHeight);\n parentDiv.append(this.dom.leftBottomBlocker);\n }\n else {\n this.dom.rightBottomBlocker.outerHeight(footerHeight);\n parentDiv.append(this.dom.rightBottomBlocker);\n }\n }\n var distRight = 0;\n var headRight = 0;\n // Counter for the number of invisible columns so far\n var rightInvisibles = 0;\n for (var i = numCols - 1; i >= 0; i--) {\n var column = this.s.dt.column(i);\n // If a column is invisible just skip it\n if (!column.visible()) {\n rightInvisibles++;\n continue;\n }\n // Get the columns header and footer element\n var colHeader = $(column.header());\n var colFooter = $(column.footer());\n // Get the number of visible columns that came before this one\n var prev = prevInvisible.get(i);\n if (prev === undefined) {\n // If it wasn't set then it was the last column so just use the final value\n prev = invisibles;\n }\n if (i + rightInvisibles >= numCols - this.c.right) {\n $(this.s.dt.table().node()).addClass(this.classes.tableFixedRight);\n parentDiv.addClass(this.classes.tableFixedRight);\n // Add the widht of the previous node, only if we are on atleast the second column\n if (i + 1 + rightInvisibles < numCols) {\n var prevIdx = i;\n // Simply using the number of hidden columns doesn't work here,\n // if the first is hidden then this would be thrown off\n while (prevIdx + 1 < numCols) {\n var prevCol = this.s.dt.column(prevIdx + 1, { page: 'current' });\n if (prevCol.visible()) {\n distRight += $(prevCol.nodes()[0]).outerWidth();\n headRight += prevCol.header() ?\n $(prevCol.header()).outerWidth() :\n prevCol.footer() ?\n $(prevCol.header()).outerWidth() :\n 0;\n break;\n }\n prevIdx++;\n }\n }\n // Iterate over all of the rows, fixing the cell to the right\n for (var _b = 0, rows_3 = rows; _b < rows_3.length; _b++) {\n var row = rows_3[_b];\n $($(row).children()[i - prev])\n .css(this._getCellCSS(false, distRight, 'right'))\n .addClass(this.classes.fixedRight);\n }\n // Add the css for the header and the footer\n colHeader\n .css(this._getCellCSS(true, headRight, 'right'))\n .addClass(this.classes.fixedRight);\n colFooter\n .css(this._getCellCSS(true, headRight, 'right'))\n .addClass(this.classes.fixedRight);\n }\n else {\n // Iteriate through all of the rows, making sure they aren't currently trying to fix right\n for (var _c = 0, rows_4 = rows; _c < rows_4.length; _c++) {\n var row = rows_4[_c];\n var cell = $($(row).children()[i - prev]);\n // If the cell is trying to fix to the right, remove the class and the css\n if (cell.hasClass(this.classes.fixedRight)) {\n cell\n .css(this._clearCellCSS('right'))\n .removeClass(this.classes.fixedRight);\n }\n }\n // Make sure the header for this column isn't fixed right\n if (colHeader.hasClass(this.classes.fixedRight)) {\n colHeader\n .css(this._clearCellCSS('right'))\n .removeClass(this.classes.fixedRight);\n }\n // Make sure the footer for this column isn't fixed right\n if (colFooter.hasClass(this.classes.fixedRight)) {\n colFooter\n .css(this._clearCellCSS('right'))\n .removeClass(this.classes.fixedRight);\n }\n }\n }\n // If there is a header with the index class and reading rtl then add right top blocker\n if (header) {\n if (!this.s.rtl) {\n this.dom.rightTopBlocker.outerHeight(headerHeight);\n parentDiv.append(this.dom.rightTopBlocker);\n }\n else {\n this.dom.leftTopBlocker.outerHeight(headerHeight);\n parentDiv.append(this.dom.leftTopBlocker);\n }\n }\n // If there is a footer with the index class and reading rtl then add right bottom blocker\n if (footer) {\n if (!this.s.rtl) {\n this.dom.rightBottomBlocker.outerHeight(footerHeight);\n parentDiv.append(this.dom.rightBottomBlocker);\n }\n else {\n this.dom.leftBottomBlocker.outerHeight(footerHeight);\n parentDiv.append(this.dom.leftBottomBlocker);\n }\n }\n };\n /**\n * Gets the correct CSS for the cell, header or footer based on options provided\n *\n * @param header Whether this cell is a header or a footer\n * @param dist The distance that the cell should be moved away from the edge\n * @param lr Indicator of fixing to the left or the right\n * @returns An object containing the correct css\n */\n FixedColumns.prototype._getCellCSS = function (header, dist, lr) {\n if (lr === 'left') {\n return this.s.rtl\n ? {\n position: 'sticky',\n right: dist + 'px'\n }\n : {\n left: dist + 'px',\n position: 'sticky'\n };\n }\n else {\n return this.s.rtl\n ? {\n left: dist + (header ? this.s.barWidth : 0) + 'px',\n position: 'sticky'\n }\n : {\n position: 'sticky',\n right: dist + (header ? this.s.barWidth : 0) + 'px'\n };\n }\n };\n /**\n * Gets the css that is required to clear the fixing to a side\n *\n * @param lr Indicator of fixing to the left or the right\n * @returns An object containing the correct css\n */\n FixedColumns.prototype._clearCellCSS = function (lr) {\n if (lr === 'left') {\n return !this.s.rtl ?\n {\n left: '',\n position: ''\n } :\n {\n position: '',\n right: ''\n };\n }\n else {\n return !this.s.rtl ?\n {\n position: '',\n right: ''\n } :\n {\n left: '',\n position: ''\n };\n }\n };\n FixedColumns.prototype._setKeyTableListener = function () {\n var _this = this;\n this.s.dt.on('key-focus', function (e, dt, cell) {\n var cellPos = $(cell.node()).offset();\n var scroll = $($(_this.s.dt.table().node()).closest('div.dataTables_scrollBody'));\n // If there are fixed columns to the left\n if (_this.c.left > 0) {\n // Get the rightmost left fixed column header, it's position and it's width\n var rightMost = $(_this.s.dt.column(_this.c.left - 1).header());\n var rightMostPos = rightMost.offset();\n var rightMostWidth = rightMost.outerWidth();\n // If the current highlighted cell is left of the rightmost cell on the screen\n if (cellPos.left < rightMostPos.left + rightMostWidth) {\n // Scroll it into view\n var currScroll = scroll.scrollLeft();\n scroll.scrollLeft(currScroll - (rightMostPos.left + rightMostWidth - cellPos.left));\n }\n }\n // If there are fixed columns to the right\n if (_this.c.right > 0) {\n // Get the number of columns and the width of the cell as doing right side calc\n var numCols = _this.s.dt.columns().data().toArray().length;\n var cellWidth = $(cell.node()).outerWidth();\n // Get the leftmost right fixed column header and it's position\n var leftMost = $(_this.s.dt.column(numCols - _this.c.right).header());\n var leftMostPos = leftMost.offset();\n // If the current highlighted cell is right of the leftmost cell on the screen\n if (cellPos.left + cellWidth > leftMostPos.left) {\n // Scroll it into view\n var currScroll = scroll.scrollLeft();\n scroll.scrollLeft(currScroll - (leftMostPos.left - (cellPos.left + cellWidth)));\n }\n }\n });\n // Whenever a draw occurs there is potential for the data to have changed and therefore also the column widths\n // Therefore it is necessary to recalculate the values for the fixed columns\n this.s.dt.on('draw', function () {\n _this._addStyles();\n });\n this.s.dt.on('column-reorder', function () {\n _this._addStyles();\n });\n this.s.dt.on('column-visibility', function (e, settings, column, state, recalc) {\n if (recalc && !settings.bDestroying) {\n setTimeout(function () {\n _this._addStyles();\n }, 50);\n }\n });\n };\n FixedColumns.version = '4.1.0';\n FixedColumns.classes = {\n fixedLeft: 'dtfc-fixed-left',\n fixedRight: 'dtfc-fixed-right',\n leftBottomBlocker: 'dtfc-left-bottom-blocker',\n leftTopBlocker: 'dtfc-left-top-blocker',\n rightBottomBlocker: 'dtfc-right-bottom-blocker',\n rightTopBlocker: 'dtfc-right-top-blocker',\n tableFixedLeft: 'dtfc-has-left',\n tableFixedRight: 'dtfc-has-right'\n };\n FixedColumns.defaults = {\n i18n: {\n button: 'FixedColumns'\n },\n left: 1,\n right: 0\n };\n return FixedColumns;\n }());\n\n /*! FixedColumns 4.1.0\n * 2019-2022 SpryMedia Ltd - datatables.net/license\n */\n // DataTables extensions common UMD. Note that this allows for AMD, CommonJS\n // (with window and jQuery being allowed as parameters to the returned\n // function) or just default browser loading.\n (function (factory) {\n if (true) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"jquery\"), __webpack_require__(/*! datatables.net */ \"datatables.net\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\n return factory($, window, document);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n else {}\n }(function ($, window, document) {\n setJQuery($);\n var dataTable = $.fn.dataTable;\n $.fn.dataTable.FixedColumns = FixedColumns;\n $.fn.DataTable.FixedColumns = FixedColumns;\n var apiRegister = $.fn.dataTable.Api.register;\n apiRegister('fixedColumns()', function () {\n return this;\n });\n apiRegister('fixedColumns().left()', function (newVal) {\n var ctx = this.context[0];\n if (newVal !== undefined) {\n ctx._fixedColumns.left(newVal);\n return this;\n }\n else {\n return ctx._fixedColumns.left();\n }\n });\n apiRegister('fixedColumns().right()', function (newVal) {\n var ctx = this.context[0];\n if (newVal !== undefined) {\n ctx._fixedColumns.right(newVal);\n return this;\n }\n else {\n return ctx._fixedColumns.right();\n }\n });\n $.fn.dataTable.ext.buttons.fixedColumns = {\n action: function (e, dt, node, config) {\n if ($(node).attr('active')) {\n $(node).removeAttr('active').removeClass('active');\n dt.fixedColumns().left(0);\n dt.fixedColumns().right(0);\n }\n else {\n $(node).attr('active', true).addClass('active');\n dt.fixedColumns().left(config.config.left);\n dt.fixedColumns().right(config.config.right);\n }\n },\n config: {\n left: 1,\n right: 0\n },\n init: function (dt, node, config) {\n if (dt.settings()[0]._fixedColumns === undefined) {\n _init(dt.settings(), config);\n }\n $(node).attr('active', true).addClass('active');\n dt.button(node).text(config.text || dt.i18n('buttons.fixedColumns', dt.settings()[0]._fixedColumns.c.i18n.button));\n },\n text: null\n };\n function _init(settings, options) {\n if (options === void 0) { options = null; }\n var api = new dataTable.Api(settings);\n var opts = options\n ? options\n : api.init().fixedColumns || dataTable.defaults.fixedColumns;\n var fixedColumns = new FixedColumns(api, opts);\n return fixedColumns;\n }\n // Attach a listener to the document which listens for DataTables initialisation\n // events so we can automatically initialise\n $(document).on('plugin-init.dt', function (e, settings) {\n if (e.namespace !== 'dt') {\n return;\n }\n if (settings.oInit.fixedColumns ||\n dataTable.defaults.fixedColumns) {\n if (!settings._fixedColumns) {\n _init(settings, null);\n }\n }\n });\n }));\n\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvZGF0YXRhYmxlcy5uZXQtZml4ZWRjb2x1bW5zL2pzL2RhdGFUYWJsZXMuZml4ZWRDb2x1bW5zLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsdURBQXVELDRCQUE0QjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGFBQWE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsaUJBQWlCO0FBQzNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELG9CQUFvQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Qsb0JBQW9CO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLGlCQUFpQjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxvQkFBb0I7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELG9CQUFvQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBMEM7QUFDdEQ7QUFDQSxZQUFZLGlDQUFPLENBQUMsMkNBQVEsRUFBRSwyREFBZ0IsQ0FBQyxtQ0FBRTtBQUNqRDtBQUNBLGFBQWE7QUFBQSxrR0FBQztBQUNkO0FBQ0EsYUFBYSxFQWdCSjtBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9WdWV4eS8uL25vZGVfbW9kdWxlcy9kYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMvanMvZGF0YVRhYmxlcy5maXhlZENvbHVtbnMuanM/ZWE3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgRml4ZWRDb2x1bW5zIDQuMS4wXG4gKiAyMDE5LTIwMjIgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2VcbiAqL1xuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgJDtcbiAgICB2YXIgZGF0YVRhYmxlO1xuICAgIGZ1bmN0aW9uIHNldEpRdWVyeShqcSkge1xuICAgICAgICAkID0ganE7XG4gICAgICAgIGRhdGFUYWJsZSA9ICQuZm4uZGF0YVRhYmxlO1xuICAgIH1cbiAgICB2YXIgRml4ZWRDb2x1bW5zID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBGaXhlZENvbHVtbnMoc2V0dGluZ3MsIG9wdHMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSByZXF1aXJlZCB2ZXJzaW9uIG9mIERhdGFUYWJsZXMgaXMgaW5jbHVkZWRcbiAgICAgICAgICAgIGlmICghZGF0YVRhYmxlIHx8ICFkYXRhVGFibGUudmVyc2lvbkNoZWNrIHx8ICFkYXRhVGFibGUudmVyc2lvbkNoZWNrKCcxLjEwLjAnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhdGVSZXN0b3JlIHJlcXVpcmVzIERhdGFUYWJsZXMgMS4xMCBvciBuZXdlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRhYmxlID0gbmV3IGRhdGFUYWJsZS5BcGkoc2V0dGluZ3MpO1xuICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gJC5leHRlbmQodHJ1ZSwge30sIEZpeGVkQ29sdW1ucy5jbGFzc2VzKTtcbiAgICAgICAgICAgIC8vIEdldCBvcHRpb25zIGZyb20gdXNlclxuICAgICAgICAgICAgdGhpcy5jID0gJC5leHRlbmQodHJ1ZSwge30sIEZpeGVkQ29sdW1ucy5kZWZhdWx0cywgb3B0cyk7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgZGVwcmVjYXRlZCBsZWZ0Q29sdW1uc1xuICAgICAgICAgICAgaWYgKCghb3B0cyB8fCBvcHRzLmxlZnQgPT09IHVuZGVmaW5lZCkgJiYgdGhpcy5jLmxlZnRDb2x1bW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmMubGVmdCA9IHRoaXMuYy5sZWZ0Q29sdW1ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBkZXByZWNhdGVkIHJpZ2h0Q29sdW1uc1xuICAgICAgICAgICAgaWYgKCghb3B0cyB8fCBvcHRzLnJpZ2h0ID09PSB1bmRlZmluZWQpICYmIHRoaXMuYy5yaWdodENvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYy5yaWdodCA9IHRoaXMuYy5yaWdodENvbHVtbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnMgPSB7XG4gICAgICAgICAgICAgICAgYmFyV2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgZHQ6IHRhYmxlLFxuICAgICAgICAgICAgICAgIHJ0bDogJCgnYm9keScpLmNzcygnZGlyZWN0aW9uJykgPT09ICdydGwnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ29tbW9uIENTUyBmb3IgYWxsIGJsb2NrZXJzXG4gICAgICAgICAgICB2YXIgYmxvY2tlckNTUyA9IHtcbiAgICAgICAgICAgICAgICAnYm90dG9tJzogJzBweCcsXG4gICAgICAgICAgICAgICAgJ2Rpc3BsYXknOiAnYmxvY2snLFxuICAgICAgICAgICAgICAgICdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5zLmJhcldpZHRoICsgMSArICdweCdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmRvbSA9IHtcbiAgICAgICAgICAgICAgICBsZWZ0Qm90dG9tQmxvY2tlcjogJCgnPGRpdj4nKVxuICAgICAgICAgICAgICAgICAgICAuY3NzKGJsb2NrZXJDU1MpXG4gICAgICAgICAgICAgICAgICAgIC5jc3MoJ2xlZnQnLCAwKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmxlZnRCb3R0b21CbG9ja2VyKSxcbiAgICAgICAgICAgICAgICBsZWZ0VG9wQmxvY2tlcjogJCgnPGRpdj4nKVxuICAgICAgICAgICAgICAgICAgICAuY3NzKGJsb2NrZXJDU1MpXG4gICAgICAgICAgICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IDBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmxlZnRUb3BCbG9ja2VyKSxcbiAgICAgICAgICAgICAgICByaWdodEJvdHRvbUJsb2NrZXI6ICQoJzxkaXY+JylcbiAgICAgICAgICAgICAgICAgICAgLmNzcyhibG9ja2VyQ1NTKVxuICAgICAgICAgICAgICAgICAgICAuY3NzKCdyaWdodCcsIDApXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucmlnaHRCb3R0b21CbG9ja2VyKSxcbiAgICAgICAgICAgICAgICByaWdodFRvcEJsb2NrZXI6ICQoJzxkaXY+JylcbiAgICAgICAgICAgICAgICAgICAgLmNzcyhibG9ja2VyQ1NTKVxuICAgICAgICAgICAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogMFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucmlnaHRUb3BCbG9ja2VyKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIC8vIEZpeGVkIENvbHVtbnMgSW5pdGlhbGlzYXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRTdHlsZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRLZXlUYWJsZUxpc3RlbmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWJsZS5vbmUoJ2luaXQuZHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeGVkIENvbHVtbnMgSW5pdGlhbGlzYXRpb25cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2FkZFN0eWxlcygpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2V0S2V5VGFibGVMaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFibGUub24oJ2NvbHVtbi1zaXppbmcuZHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYWRkU3R5bGVzKCk7IH0pO1xuICAgICAgICAgICAgLy8gTWFrZSBjbGFzcyBhdmFpbGFibGUgdGhyb3VnaCBkdCBvYmplY3RcbiAgICAgICAgICAgIHRhYmxlLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0dGVyL1NldHRlciBmb3IgdGhlIGBmaXhlZENvbHVtbnMubGVmdGAgcHJvcGVydHlcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG5ld1ZhbCBPcHRpb25hbC4gSWYgcHJlc2VudCB0aGlzIHdpbGwgYmUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIG51bWJlciBvZiBsZWZ0IGZpeGVkIGNvbHVtbnNcbiAgICAgICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBsZWZ0IGZpeGVkIGNvbHVtbnNcbiAgICAgICAgICovXG4gICAgICAgIEZpeGVkQ29sdW1ucy5wcm90b3R5cGUubGVmdCA9IGZ1bmN0aW9uIChuZXdWYWwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyB0byBjaGFuZ2VcbiAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgbmV3IHZhbHVlcyBhbmQgcmVkcmF3IHRoZSBjb2x1bW5zXG4gICAgICAgICAgICAgICAgdGhpcy5jLmxlZnQgPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkU3R5bGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jLmxlZnQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXR0ZXIvU2V0dGVyIGZvciB0aGUgYGZpeGVkQ29sdW1ucy5sZWZ0YCBwcm9wZXJ0eVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbmV3VmFsIE9wdGlvbmFsLiBJZiBwcmVzZW50IHRoaXMgd2lsbCBiZSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgbnVtYmVyIG9mIHJpZ2h0IGZpeGVkIGNvbHVtbnNcbiAgICAgICAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiByaWdodCBmaXhlZCBjb2x1bW5zXG4gICAgICAgICAqL1xuICAgICAgICBGaXhlZENvbHVtbnMucHJvdG90eXBlLnJpZ2h0ID0gZnVuY3Rpb24gKG5ld1ZhbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIHRvIGNoYW5nZVxuICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBuZXcgdmFsdWVzIGFuZCByZWRyYXcgdGhlIGNvbHVtbnNcbiAgICAgICAgICAgICAgICB0aGlzLmMucmlnaHQgPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkU3R5bGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jLnJpZ2h0O1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogSXRlcmF0ZXMgb3ZlciB0aGUgY29sdW1ucywgZml4aW5nIHRoZSBhcHByb3ByaWF0ZSBvbmVzIHRvIHRoZSBsZWZ0IGFuZCByaWdodFxuICAgICAgICAgKi9cbiAgICAgICAgRml4ZWRDb2x1bW5zLnByb3RvdHlwZS5fYWRkU3R5bGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSBiYXIgd2lkdGggaWYgdmVydGljYWwgc2Nyb2xsaW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICAgIGlmICh0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vU2Nyb2xsLnNZKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbF8xID0gJCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLmNsb3Nlc3QoJ2Rpdi5kYXRhVGFibGVzX3Njcm9sbEJvZHknKVswXTtcbiAgICAgICAgICAgICAgICB2YXIgYmFyV2lkdGggPSB0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5vQnJvd3Nlci5iYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsXzEub2Zmc2V0V2lkdGggLSBzY3JvbGxfMS5jbGllbnRXaWR0aCA+PSBiYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnMuYmFyV2lkdGggPSBiYXJXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucy5iYXJXaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJpZ2h0VG9wQmxvY2tlci5jc3MoJ3dpZHRoJywgdGhpcy5zLmJhcldpZHRoICsgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20ubGVmdFRvcEJsb2NrZXIuY3NzKCd3aWR0aCcsIHRoaXMucy5iYXJXaWR0aCArIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJpZ2h0Qm90dG9tQmxvY2tlci5jc3MoJ3dpZHRoJywgdGhpcy5zLmJhcldpZHRoICsgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20ubGVmdEJvdHRvbUJsb2NrZXIuY3NzKCd3aWR0aCcsIHRoaXMucy5iYXJXaWR0aCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBhcmVudERpdiA9IG51bGw7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhlYWRlciBhbmQgaXQncyBoZWlnaHRcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSB0aGlzLnMuZHQuY29sdW1uKDApLmhlYWRlcigpO1xuICAgICAgICAgICAgdmFyIGhlYWRlckhlaWdodCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyID0gJChoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodCA9IGhlYWRlci5vdXRlckhlaWdodCgpICsgMTtcbiAgICAgICAgICAgICAgICBwYXJlbnREaXYgPSAkKGhlYWRlci5jbG9zZXN0KCdkaXYuZGF0YVRhYmxlc19zY3JvbGwnKSkuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmb290ZXIgYW5kIGl0J3MgaGVpZ2h0XG4gICAgICAgICAgICB2YXIgZm9vdGVyID0gdGhpcy5zLmR0LmNvbHVtbigwKS5mb290ZXIoKTtcbiAgICAgICAgICAgIHZhciBmb290ZXJIZWlnaHQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGZvb3RlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvb3RlciA9ICQoZm9vdGVyKTtcbiAgICAgICAgICAgICAgICBmb290ZXJIZWlnaHQgPSBmb290ZXIub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIHBhcmVudERpdiBpZiBpdCBoYXMgbm90IGJlZW4gcmV0cmlldmVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50RGl2ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudERpdiA9ICQoZm9vdGVyLmNsb3Nlc3QoJ2Rpdi5kYXRhVGFibGVzX3Njcm9sbCcpKS5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUgLSB0aGlzIGlzIHVzZWQgb2Z0ZW4gc28gYmV0dGVyIHRvIG9ubHkgbWFrZSAxIGFwaSBjYWxsXG4gICAgICAgICAgICB2YXIgbnVtQ29scyA9IHRoaXMucy5kdC5jb2x1bW5zKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg7XG4gICAgICAgICAgICAvLyBUcmFja2VyIGZvciB0aGUgbnVtYmVyIG9mIHBpeGVscyBzaG91bGQgYmUgbGVmdCB0byB0aGUgbGVmdCBvZiB0aGUgdGFibGVcbiAgICAgICAgICAgIHZhciBkaXN0TGVmdCA9IDA7XG4gICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGhlYWRlcnMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgd2lkdGhzIHNvIG5lZWQgdG8gdHJhY2sgdGhlbSBpbmRpdmlkdWFsbHlcbiAgICAgICAgICAgIHZhciBoZWFkTGVmdCA9IDA7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSByb3cgZWxlbWVudHMgaW4gdGhlIHRhYmxlXG4gICAgICAgICAgICB2YXIgcm93cyA9ICQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5jaGlsZHJlbigndGJvZHknKS5jaGlsZHJlbigndHInKTtcbiAgICAgICAgICAgIHZhciBpbnZpc2libGVzID0gMDtcbiAgICAgICAgICAgIC8vIFdoZW4gd29ya2luZyBmcm9tIHJpZ2h0IHRvIGxlZnQgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGFyZSBpbnZpc2libGUgYmVmb3JlIGEgcG9pbnQsXG4gICAgICAgICAgICAvLyB3aXRob3V0IGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBpbnZpc2libGUgYWZ0ZXJcbiAgICAgICAgICAgIHZhciBwcmV2SW52aXNpYmxlID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgY29sdW1uc1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5zLmR0LmNvbHVtbihpKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIG1hcCBmb3IgdGhlIHByZXZpb3VzIGNvbHVtblxuICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2SW52aXNpYmxlLnNldChpIC0gMSwgaW52aXNpYmxlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29sdW1uLnZpc2libGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZpc2libGVzKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtbnMgaGVhZGVyIGFuZCBmb290ZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIHZhciBjb2xIZWFkZXIgPSAkKGNvbHVtbi5oZWFkZXIoKSk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbEZvb3RlciA9ICQoY29sdW1uLmZvb3RlcigpKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBpIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgbGVmdCB0aGVuIHRoaXMgY29sdW1uIHNob3VsZCBiZSBmaXhlZCBsZWZ0XG4gICAgICAgICAgICAgICAgaWYgKGkgLSBpbnZpc2libGVzIDwgdGhpcy5jLmxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZUZpeGVkTGVmdCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudERpdi5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVGaXhlZExlZnQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHdpZHRoIG9mIHRoZSBwcmV2aW91cyBub2RlIC0gb25seSBpZiB3ZSBhcmUgb24gYXRsZWFzdCB0aGUgc2Vjb25kIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAtIGludmlzaWJsZXMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldklkeCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbHkgdXNpbmcgdGhlIG51bWJlciBvZiBoaWRkZW4gY29sdW1ucyBkb2Vzbid0IHdvcmsgaGVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCBpcyBoaWRkZW4gdGhlbiB0aGlzIHdvdWxkIGJlIHRocm93biBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2SWR4ICsgMSA8IG51bUNvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldkNvbCA9IHRoaXMucy5kdC5jb2x1bW4ocHJldklkeCAtIDEsIHsgcGFnZTogJ2N1cnJlbnQnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Q29sLnZpc2libGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0TGVmdCArPSAkKHByZXZDb2wubm9kZXMoKVswXSkub3V0ZXJXaWR0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkTGVmdCArPSBwcmV2Q29sLmhlYWRlcigpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQocHJldkNvbC5oZWFkZXIoKSkub3V0ZXJXaWR0aCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDb2wuZm9vdGVyKCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQocHJldkNvbC5oZWFkZXIoKSkub3V0ZXJXaWR0aCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldklkeC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIHJvd3MsIGZpeGluZyB0aGUgY2VsbCB0byB0aGUgbGVmdFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHJvd3NfMSA9IHJvd3M7IF9pIDwgcm93c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHJvd3NfMVtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAkKCQocm93KS5jaGlsZHJlbigpW2kgLSBpbnZpc2libGVzXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKHRoaXMuX2dldENlbGxDU1MoZmFsc2UsIGRpc3RMZWZ0LCAnbGVmdCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRMZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNzcyBmb3IgdGhlIGhlYWRlciBhbmQgdGhlIGZvb3RlclxuICAgICAgICAgICAgICAgICAgICBjb2xIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jc3ModGhpcy5fZ2V0Q2VsbENTUyh0cnVlLCBoZWFkTGVmdCwgJ2xlZnQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRMZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgY29sRm9vdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY3NzKHRoaXMuX2dldENlbGxDU1ModHJ1ZSwgaGVhZExlZnQsICdsZWZ0JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkTGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJdGVyaWF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcm93cywgbWFraW5nIHN1cmUgdGhleSBhcmVuJ3QgY3VycmVudGx5IHRyeWluZyB0byBmaXggbGVmdFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYSA9IDAsIHJvd3NfMiA9IHJvd3M7IF9hIDwgcm93c18yLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHJvd3NfMltfYV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9ICQoJChyb3cpLmNoaWxkcmVuKClbaSAtIGludmlzaWJsZXNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIGlzIHRyeWluZyB0byBmaXggdG8gdGhlIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYW5kIHRoZSBjc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLmhhc0NsYXNzKHRoaXMuY2xhc3Nlcy5maXhlZExlZnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKHRoaXMuX2NsZWFyQ2VsbENTUygnbGVmdCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkTGVmdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBoZWFkZXIgZm9yIHRoaXMgY29sdW1uIGlzbid0IGZpeGVkIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbEhlYWRlci5oYXNDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRMZWZ0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sSGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcyh0aGlzLl9jbGVhckNlbGxDU1MoJ2xlZnQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkTGVmdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmb290ZXIgZm9yIHRoaXMgY29sdW1uIGlzbid0IGZpeGVkIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbEZvb3Rlci5oYXNDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRMZWZ0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sRm9vdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcyh0aGlzLl9jbGVhckNlbGxDU1MoJ2xlZnQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkTGVmdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGhlYWRlciB3aXRoIHRoZSBpbmRleCBjbGFzcyBhbmQgcmVhZGluZyBydGwgdGhlbiBhZGQgbGVmdCB0b3AgYmxvY2tlclxuICAgICAgICAgICAgaWYgKGhlYWRlciAhPT0gbnVsbCAmJiAhaGVhZGVyLmhhc0NsYXNzKCdpbmRleCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucy5ydGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20ubGVmdFRvcEJsb2NrZXIub3V0ZXJIZWlnaHQoaGVhZGVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LmFwcGVuZCh0aGlzLmRvbS5sZWZ0VG9wQmxvY2tlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5yaWdodFRvcEJsb2NrZXIub3V0ZXJIZWlnaHQoaGVhZGVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LmFwcGVuZCh0aGlzLmRvbS5yaWdodFRvcEJsb2NrZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZm9vdGVyIHdpdGggdGhlIGluZGV4IGNsYXNzIGFuZCByZWFkaW5nIHJ0bCB0aGVuIGFkZCBsZWZ0IGJvdHRvbSBibG9ja2VyXG4gICAgICAgICAgICBpZiAoZm9vdGVyICE9PSBudWxsICYmICFmb290ZXIuaGFzQ2xhc3MoJ2luZGV4JykpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zLnJ0bCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5sZWZ0Qm90dG9tQmxvY2tlci5vdXRlckhlaWdodChmb290ZXJIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnREaXYuYXBwZW5kKHRoaXMuZG9tLmxlZnRCb3R0b21CbG9ja2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJpZ2h0Qm90dG9tQmxvY2tlci5vdXRlckhlaWdodChmb290ZXJIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnREaXYuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0Qm90dG9tQmxvY2tlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRpc3RSaWdodCA9IDA7XG4gICAgICAgICAgICB2YXIgaGVhZFJpZ2h0ID0gMDtcbiAgICAgICAgICAgIC8vIENvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgaW52aXNpYmxlIGNvbHVtbnMgc28gZmFyXG4gICAgICAgICAgICB2YXIgcmlnaHRJbnZpc2libGVzID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBudW1Db2xzIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5zLmR0LmNvbHVtbihpKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIGNvbHVtbiBpcyBpbnZpc2libGUganVzdCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFjb2x1bW4udmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SW52aXNpYmxlcysrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjb2x1bW5zIGhlYWRlciBhbmQgZm9vdGVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB2YXIgY29sSGVhZGVyID0gJChjb2x1bW4uaGVhZGVyKCkpO1xuICAgICAgICAgICAgICAgIHZhciBjb2xGb290ZXIgPSAkKGNvbHVtbi5mb290ZXIoKSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjb2x1bW5zIHRoYXQgY2FtZSBiZWZvcmUgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IHByZXZJbnZpc2libGUuZ2V0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgd2Fzbid0IHNldCB0aGVuIGl0IHdhcyB0aGUgbGFzdCBjb2x1bW4gc28ganVzdCB1c2UgdGhlIGZpbmFsIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSBpbnZpc2libGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIHJpZ2h0SW52aXNpYmxlcyA+PSBudW1Db2xzIC0gdGhpcy5jLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVGaXhlZFJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZUZpeGVkUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHdpZGh0IG9mIHRoZSBwcmV2aW91cyBub2RlLCBvbmx5IGlmIHdlIGFyZSBvbiBhdGxlYXN0IHRoZSBzZWNvbmQgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSArIHJpZ2h0SW52aXNpYmxlcyA8IG51bUNvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2SWR4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBseSB1c2luZyB0aGUgbnVtYmVyIG9mIGhpZGRlbiBjb2x1bW5zIGRvZXNuJ3Qgd29yayBoZXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZpcnN0IGlzIGhpZGRlbiB0aGVuIHRoaXMgd291bGQgYmUgdGhyb3duIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHByZXZJZHggKyAxIDwgbnVtQ29scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2Q29sID0gdGhpcy5zLmR0LmNvbHVtbihwcmV2SWR4ICsgMSwgeyBwYWdlOiAnY3VycmVudCcgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDb2wudmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RSaWdodCArPSAkKHByZXZDb2wubm9kZXMoKVswXSkub3V0ZXJXaWR0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUmlnaHQgKz0gcHJldkNvbC5oZWFkZXIoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHByZXZDb2wuaGVhZGVyKCkpLm91dGVyV2lkdGgoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q29sLmZvb3RlcigpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHByZXZDb2wuaGVhZGVyKCkpLm91dGVyV2lkdGgoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZJZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSByb3dzLCBmaXhpbmcgdGhlIGNlbGwgdG8gdGhlIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gMCwgcm93c18zID0gcm93czsgX2IgPCByb3dzXzMubGVuZ3RoOyBfYisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gcm93c18zW19iXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJChyb3cpLmNoaWxkcmVuKClbaSAtIHByZXZdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3ModGhpcy5fZ2V0Q2VsbENTUyhmYWxzZSwgZGlzdFJpZ2h0LCAncmlnaHQnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY3NzIGZvciB0aGUgaGVhZGVyIGFuZCB0aGUgZm9vdGVyXG4gICAgICAgICAgICAgICAgICAgIGNvbEhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNzcyh0aGlzLl9nZXRDZWxsQ1NTKHRydWUsIGhlYWRSaWdodCwgJ3JpZ2h0JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xGb290ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jc3ModGhpcy5fZ2V0Q2VsbENTUyh0cnVlLCBoZWFkUmlnaHQsICdyaWdodCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5maXhlZFJpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJpYXRlIHRocm91Z2ggYWxsIG9mIHRoZSByb3dzLCBtYWtpbmcgc3VyZSB0aGV5IGFyZW4ndCBjdXJyZW50bHkgdHJ5aW5nIHRvIGZpeCByaWdodFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IDAsIHJvd3NfNCA9IHJvd3M7IF9jIDwgcm93c180Lmxlbmd0aDsgX2MrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHJvd3NfNFtfY107XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9ICQoJChyb3cpLmNoaWxkcmVuKClbaSAtIHByZXZdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIGlzIHRyeWluZyB0byBmaXggdG8gdGhlIHJpZ2h0LCByZW1vdmUgdGhlIGNsYXNzIGFuZCB0aGUgY3NzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5oYXNDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3ModGhpcy5fY2xlYXJDZWxsQ1NTKCdyaWdodCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmZpeGVkUmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaGVhZGVyIGZvciB0aGlzIGNvbHVtbiBpc24ndCBmaXhlZCByaWdodFxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sSGVhZGVyLmhhc0NsYXNzKHRoaXMuY2xhc3Nlcy5maXhlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sSGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcyh0aGlzLl9jbGVhckNlbGxDU1MoJ3JpZ2h0JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5maXhlZFJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGZvb3RlciBmb3IgdGhpcyBjb2x1bW4gaXNuJ3QgZml4ZWQgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbEZvb3Rlci5oYXNDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEZvb3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3ModGhpcy5fY2xlYXJDZWxsQ1NTKCdyaWdodCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZml4ZWRSaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGhlYWRlciB3aXRoIHRoZSBpbmRleCBjbGFzcyBhbmQgcmVhZGluZyBydGwgdGhlbiBhZGQgcmlnaHQgdG9wIGJsb2NrZXJcbiAgICAgICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucy5ydGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20ucmlnaHRUb3BCbG9ja2VyLm91dGVySGVpZ2h0KGhlYWRlckhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudERpdi5hcHBlbmQodGhpcy5kb20ucmlnaHRUb3BCbG9ja2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmxlZnRUb3BCbG9ja2VyLm91dGVySGVpZ2h0KGhlYWRlckhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudERpdi5hcHBlbmQodGhpcy5kb20ubGVmdFRvcEJsb2NrZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZm9vdGVyIHdpdGggdGhlIGluZGV4IGNsYXNzIGFuZCByZWFkaW5nIHJ0bCB0aGVuIGFkZCByaWdodCBib3R0b20gYmxvY2tlclxuICAgICAgICAgICAgaWYgKGZvb3Rlcikge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zLnJ0bCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5yaWdodEJvdHRvbUJsb2NrZXIub3V0ZXJIZWlnaHQoZm9vdGVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LmFwcGVuZCh0aGlzLmRvbS5yaWdodEJvdHRvbUJsb2NrZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20ubGVmdEJvdHRvbUJsb2NrZXIub3V0ZXJIZWlnaHQoZm9vdGVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50RGl2LmFwcGVuZCh0aGlzLmRvbS5sZWZ0Qm90dG9tQmxvY2tlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgY29ycmVjdCBDU1MgZm9yIHRoZSBjZWxsLCBoZWFkZXIgb3IgZm9vdGVyIGJhc2VkIG9uIG9wdGlvbnMgcHJvdmlkZWRcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGhlYWRlciBXaGV0aGVyIHRoaXMgY2VsbCBpcyBhIGhlYWRlciBvciBhIGZvb3RlclxuICAgICAgICAgKiBAcGFyYW0gZGlzdCBUaGUgZGlzdGFuY2UgdGhhdCB0aGUgY2VsbCBzaG91bGQgYmUgbW92ZWQgYXdheSBmcm9tIHRoZSBlZGdlXG4gICAgICAgICAqIEBwYXJhbSBsciBJbmRpY2F0b3Igb2YgZml4aW5nIHRvIHRoZSBsZWZ0IG9yIHRoZSByaWdodFxuICAgICAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY29ycmVjdCBjc3NcbiAgICAgICAgICovXG4gICAgICAgIEZpeGVkQ29sdW1ucy5wcm90b3R5cGUuX2dldENlbGxDU1MgPSBmdW5jdGlvbiAoaGVhZGVyLCBkaXN0LCBscikge1xuICAgICAgICAgICAgaWYgKGxyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zLnJ0bFxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBkaXN0ICsgJ3B4J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZGlzdCArICdweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreSdcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnMucnRsXG4gICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZGlzdCArIChoZWFkZXIgPyB0aGlzLnMuYmFyV2lkdGggOiAwKSArICdweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreSdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBkaXN0ICsgKGhlYWRlciA/IHRoaXMucy5iYXJXaWR0aCA6IDApICsgJ3B4J1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgY3NzIHRoYXQgaXMgcmVxdWlyZWQgdG8gY2xlYXIgdGhlIGZpeGluZyB0byBhIHNpZGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGxyIEluZGljYXRvciBvZiBmaXhpbmcgdG8gdGhlIGxlZnQgb3IgdGhlIHJpZ2h0XG4gICAgICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjb3JyZWN0IGNzc1xuICAgICAgICAgKi9cbiAgICAgICAgRml4ZWRDb2x1bW5zLnByb3RvdHlwZS5fY2xlYXJDZWxsQ1NTID0gZnVuY3Rpb24gKGxyKSB7XG4gICAgICAgICAgICBpZiAobHIgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5zLnJ0bCA/XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICcnXG4gICAgICAgICAgICAgICAgICAgIH0gOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogJydcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5zLnJ0bCA/XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAnJ1xuICAgICAgICAgICAgICAgICAgICB9IDpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJydcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgRml4ZWRDb2x1bW5zLnByb3RvdHlwZS5fc2V0S2V5VGFibGVMaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnMuZHQub24oJ2tleS1mb2N1cycsIGZ1bmN0aW9uIChlLCBkdCwgY2VsbCkge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsUG9zID0gJChjZWxsLm5vZGUoKSkub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbCA9ICQoJChfdGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCdkaXYuZGF0YVRhYmxlc19zY3JvbGxCb2R5JykpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBmaXhlZCBjb2x1bW5zIHRvIHRoZSBsZWZ0XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmMubGVmdCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSByaWdodG1vc3QgbGVmdCBmaXhlZCBjb2x1bW4gaGVhZGVyLCBpdCdzIHBvc2l0aW9uIGFuZCBpdCdzIHdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHZhciByaWdodE1vc3QgPSAkKF90aGlzLnMuZHQuY29sdW1uKF90aGlzLmMubGVmdCAtIDEpLmhlYWRlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0TW9zdFBvcyA9IHJpZ2h0TW9zdC5vZmZzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0TW9zdFdpZHRoID0gcmlnaHRNb3N0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0ZWQgY2VsbCBpcyBsZWZ0IG9mIHRoZSByaWdodG1vc3QgY2VsbCBvbiB0aGUgc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsUG9zLmxlZnQgPCByaWdodE1vc3RQb3MubGVmdCArIHJpZ2h0TW9zdFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTY3JvbGwgaXQgaW50byB2aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyclNjcm9sbCA9IHNjcm9sbC5zY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGwuc2Nyb2xsTGVmdChjdXJyU2Nyb2xsIC0gKHJpZ2h0TW9zdFBvcy5sZWZ0ICsgcmlnaHRNb3N0V2lkdGggLSBjZWxsUG9zLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZml4ZWQgY29sdW1ucyB0byB0aGUgcmlnaHRcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuYy5yaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGFzIGRvaW5nIHJpZ2h0IHNpZGUgY2FsY1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtQ29scyA9IF90aGlzLnMuZHQuY29sdW1ucygpLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFdpZHRoID0gJChjZWxsLm5vZGUoKSkub3V0ZXJXaWR0aCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxlZnRtb3N0IHJpZ2h0IGZpeGVkIGNvbHVtbiBoZWFkZXIgYW5kIGl0J3MgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnRNb3N0ID0gJChfdGhpcy5zLmR0LmNvbHVtbihudW1Db2xzIC0gX3RoaXMuYy5yaWdodCkuaGVhZGVyKCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdE1vc3RQb3MgPSBsZWZ0TW9zdC5vZmZzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0ZWQgY2VsbCBpcyByaWdodCBvZiB0aGUgbGVmdG1vc3QgY2VsbCBvbiB0aGUgc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsUG9zLmxlZnQgKyBjZWxsV2lkdGggPiBsZWZ0TW9zdFBvcy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTY3JvbGwgaXQgaW50byB2aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VyclNjcm9sbCA9IHNjcm9sbC5zY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGwuc2Nyb2xsTGVmdChjdXJyU2Nyb2xsIC0gKGxlZnRNb3N0UG9zLmxlZnQgLSAoY2VsbFBvcy5sZWZ0ICsgY2VsbFdpZHRoKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBXaGVuZXZlciBhIGRyYXcgb2NjdXJzIHRoZXJlIGlzIHBvdGVudGlhbCBmb3IgdGhlIGRhdGEgdG8gaGF2ZSBjaGFuZ2VkIGFuZCB0aGVyZWZvcmUgYWxzbyB0aGUgY29sdW1uIHdpZHRoc1xuICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSB0byByZWNhbGN1bGF0ZSB0aGUgdmFsdWVzIGZvciB0aGUgZml4ZWQgY29sdW1uc1xuICAgICAgICAgICAgdGhpcy5zLmR0Lm9uKCdkcmF3JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9hZGRTdHlsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zLmR0Lm9uKCdjb2x1bW4tcmVvcmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fYWRkU3R5bGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucy5kdC5vbignY29sdW1uLXZpc2liaWxpdHknLCBmdW5jdGlvbiAoZSwgc2V0dGluZ3MsIGNvbHVtbiwgc3RhdGUsIHJlY2FsYykge1xuICAgICAgICAgICAgICAgIGlmIChyZWNhbGMgJiYgIXNldHRpbmdzLmJEZXN0cm95aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2FkZFN0eWxlcygpO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIEZpeGVkQ29sdW1ucy52ZXJzaW9uID0gJzQuMS4wJztcbiAgICAgICAgRml4ZWRDb2x1bW5zLmNsYXNzZXMgPSB7XG4gICAgICAgICAgICBmaXhlZExlZnQ6ICdkdGZjLWZpeGVkLWxlZnQnLFxuICAgICAgICAgICAgZml4ZWRSaWdodDogJ2R0ZmMtZml4ZWQtcmlnaHQnLFxuICAgICAgICAgICAgbGVmdEJvdHRvbUJsb2NrZXI6ICdkdGZjLWxlZnQtYm90dG9tLWJsb2NrZXInLFxuICAgICAgICAgICAgbGVmdFRvcEJsb2NrZXI6ICdkdGZjLWxlZnQtdG9wLWJsb2NrZXInLFxuICAgICAgICAgICAgcmlnaHRCb3R0b21CbG9ja2VyOiAnZHRmYy1yaWdodC1ib3R0b20tYmxvY2tlcicsXG4gICAgICAgICAgICByaWdodFRvcEJsb2NrZXI6ICdkdGZjLXJpZ2h0LXRvcC1ibG9ja2VyJyxcbiAgICAgICAgICAgIHRhYmxlRml4ZWRMZWZ0OiAnZHRmYy1oYXMtbGVmdCcsXG4gICAgICAgICAgICB0YWJsZUZpeGVkUmlnaHQ6ICdkdGZjLWhhcy1yaWdodCdcbiAgICAgICAgfTtcbiAgICAgICAgRml4ZWRDb2x1bW5zLmRlZmF1bHRzID0ge1xuICAgICAgICAgICAgaTE4bjoge1xuICAgICAgICAgICAgICAgIGJ1dHRvbjogJ0ZpeGVkQ29sdW1ucydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWZ0OiAxLFxuICAgICAgICAgICAgcmlnaHQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEZpeGVkQ29sdW1ucztcbiAgICB9KCkpO1xuXG4gICAgLyohIEZpeGVkQ29sdW1ucyA0LjEuMFxuICAgICAqIDIwMTktMjAyMiBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZVxuICAgICAqL1xuICAgIC8vIERhdGFUYWJsZXMgZXh0ZW5zaW9ucyBjb21tb24gVU1ELiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MgZm9yIEFNRCwgQ29tbW9uSlNcbiAgICAvLyAod2l0aCB3aW5kb3cgYW5kIGpRdWVyeSBiZWluZyBhbGxvd2VkIGFzIHBhcmFtZXRlcnMgdG8gdGhlIHJldHVybmVkXG4gICAgLy8gZnVuY3Rpb24pIG9yIGp1c3QgZGVmYXVsdCBicm93c2VyIGxvYWRpbmcuXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgICAgIC8vIEFNRFxuICAgICAgICAgICAgZGVmaW5lKFsnanF1ZXJ5JywgJ2RhdGF0YWJsZXMubmV0J10sIGZ1bmN0aW9uICgkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoJCwgd2luZG93LCBkb2N1bWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIENvbW1vbkpTXG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyb290LCAkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyb290KSB7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QgPSB3aW5kb3c7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghJCB8fCAhJC5mbi5kYXRhVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgICAgICAgICAgICAgICAgJCA9IHJlcXVpcmUoJ2RhdGF0YWJsZXMubmV0Jykocm9vdCwgJCkuJDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoJCwgcm9vdCwgcm9vdC5kb2N1bWVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQnJvd3NlciAtIGFzc3VtZSBqUXVlcnkgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG4gICAgICAgIH1cbiAgICB9KGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50KSB7XG4gICAgICAgIHNldEpRdWVyeSgkKTtcbiAgICAgICAgdmFyIGRhdGFUYWJsZSA9ICQuZm4uZGF0YVRhYmxlO1xuICAgICAgICAkLmZuLmRhdGFUYWJsZS5GaXhlZENvbHVtbnMgPSBGaXhlZENvbHVtbnM7XG4gICAgICAgICQuZm4uRGF0YVRhYmxlLkZpeGVkQ29sdW1ucyA9IEZpeGVkQ29sdW1ucztcbiAgICAgICAgdmFyIGFwaVJlZ2lzdGVyID0gJC5mbi5kYXRhVGFibGUuQXBpLnJlZ2lzdGVyO1xuICAgICAgICBhcGlSZWdpc3RlcignZml4ZWRDb2x1bW5zKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICAgIGFwaVJlZ2lzdGVyKCdmaXhlZENvbHVtbnMoKS5sZWZ0KCknLCBmdW5jdGlvbiAobmV3VmFsKSB7XG4gICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jb250ZXh0WzBdO1xuICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY3R4Ll9maXhlZENvbHVtbnMubGVmdChuZXdWYWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5fZml4ZWRDb2x1bW5zLmxlZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFwaVJlZ2lzdGVyKCdmaXhlZENvbHVtbnMoKS5yaWdodCgpJywgZnVuY3Rpb24gKG5ld1ZhbCkge1xuICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuY29udGV4dFswXTtcbiAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGN0eC5fZml4ZWRDb2x1bW5zLnJpZ2h0KG5ld1ZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4Ll9maXhlZENvbHVtbnMucmlnaHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICQuZm4uZGF0YVRhYmxlLmV4dC5idXR0b25zLmZpeGVkQ29sdW1ucyA9IHtcbiAgICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24gKGUsIGR0LCBub2RlLCBjb25maWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoJChub2RlKS5hdHRyKCdhY3RpdmUnKSkge1xuICAgICAgICAgICAgICAgICAgICAkKG5vZGUpLnJlbW92ZUF0dHIoJ2FjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgZHQuZml4ZWRDb2x1bW5zKCkubGVmdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgZHQuZml4ZWRDb2x1bW5zKCkucmlnaHQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKG5vZGUpLmF0dHIoJ2FjdGl2ZScsIHRydWUpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgZHQuZml4ZWRDb2x1bW5zKCkubGVmdChjb25maWcuY29uZmlnLmxlZnQpO1xuICAgICAgICAgICAgICAgICAgICBkdC5maXhlZENvbHVtbnMoKS5yaWdodChjb25maWcuY29uZmlnLnJpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgbGVmdDogMSxcbiAgICAgICAgICAgICAgICByaWdodDogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkdCwgbm9kZSwgY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR0LnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pbml0KGR0LnNldHRpbmdzKCksIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQobm9kZSkuYXR0cignYWN0aXZlJywgdHJ1ZSkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGR0LmJ1dHRvbihub2RlKS50ZXh0KGNvbmZpZy50ZXh0IHx8IGR0LmkxOG4oJ2J1dHRvbnMuZml4ZWRDb2x1bW5zJywgZHQuc2V0dGluZ3MoKVswXS5fZml4ZWRDb2x1bW5zLmMuaTE4bi5idXR0b24pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZXh0OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIF9pbml0KHNldHRpbmdzLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSBudWxsOyB9XG4gICAgICAgICAgICB2YXIgYXBpID0gbmV3IGRhdGFUYWJsZS5BcGkoc2V0dGluZ3MpO1xuICAgICAgICAgICAgdmFyIG9wdHMgPSBvcHRpb25zXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zXG4gICAgICAgICAgICAgICAgOiBhcGkuaW5pdCgpLmZpeGVkQ29sdW1ucyB8fCBkYXRhVGFibGUuZGVmYXVsdHMuZml4ZWRDb2x1bW5zO1xuICAgICAgICAgICAgdmFyIGZpeGVkQ29sdW1ucyA9IG5ldyBGaXhlZENvbHVtbnMoYXBpLCBvcHRzKTtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZENvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50IHdoaWNoIGxpc3RlbnMgZm9yIERhdGFUYWJsZXMgaW5pdGlhbGlzYXRpb25cbiAgICAgICAgLy8gZXZlbnRzIHNvIHdlIGNhbiBhdXRvbWF0aWNhbGx5IGluaXRpYWxpc2VcbiAgICAgICAgJChkb2N1bWVudCkub24oJ3BsdWdpbi1pbml0LmR0JywgZnVuY3Rpb24gKGUsIHNldHRpbmdzKSB7XG4gICAgICAgICAgICBpZiAoZS5uYW1lc3BhY2UgIT09ICdkdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Mub0luaXQuZml4ZWRDb2x1bW5zIHx8XG4gICAgICAgICAgICAgICAgZGF0YVRhYmxlLmRlZmF1bHRzLmZpeGVkQ29sdW1ucykge1xuICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuX2ZpeGVkQ29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICBfaW5pdChzZXR0aW5ncywgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KSk7XG5cbn0oKSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.js\n"); /***/ }), /***/ "datatables.net": /*!*********************************!*\ !*** external "$.fn.dataTable" ***! \*********************************/ /***/ (function(module) { "use strict"; module.exports = window["$.fn.dataTable"]; /***/ }), /***/ "jquery": /*!*************************!*\ !*** external "jQuery" ***! \*************************/ /***/ (function(module) { "use strict"; module.exports = window["jQuery"]; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function() { return module['default']; } : /******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // 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 }); /******/ }; /******/ }(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module can't be inlined because the eval-source-map devtool is used. /******/ var __webpack_exports__ = __webpack_require__("./libs/datatables-fixedcolumns/datatables.fixedcolumns.js"); /******/ var __webpack_export_target__ = window; /******/ for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; /******/ if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); /******/ /******/ })() ;
SIMPAN PERUBAHAN