{"version":3,"file":"index.js","sources":["../../src/helpers.js","../../src/rows.js","../../src/columns.js","../../src/table.js","../../src/config.js","../../src/datatable.js"],"sourcesContent":["/**\n * Check is item is object\n * @return {Boolean}\n */\nexport const isObject = val => Object.prototype.toString.call(val) === \"[object Object]\"\n\n/**\n * Check for valid JSON string\n * @param {String} str\n * @return {Boolean|Array|Object}\n */\nexport const isJson = str => {\n let t = !1\n try {\n t = JSON.parse(str)\n } catch (e) {\n return !1\n }\n return !(null === t || (!Array.isArray(t) && !isObject(t))) && t\n}\n\n/**\n * Create DOM element node\n * @param {String} nodeName nodeName\n * @param {Object} attrs properties and attributes\n * @return {Object}\n */\nexport const createElement = (nodeName, attrs) => {\n const dom = document.createElement(nodeName)\n if (attrs && \"object\" == typeof attrs) {\n for (const attr in attrs) {\n if (\"html\" === attr) {\n dom.innerHTML = attrs[attr]\n } else {\n dom.setAttribute(attr, attrs[attr])\n }\n }\n }\n return dom\n}\n\nexport const flush = el => {\n if (el instanceof NodeList) {\n el.forEach(e => flush(e))\n } else {\n el.innerHTML = \"\"\n }\n}\n\n/**\n * Create button helper\n * @param {String} class\n * @param {Number} page\n * @param {String} text\n * @return {Object}\n */\nexport const button = (className, page, text) => createElement(\n \"li\",\n {\n class: className,\n html: `${text}`\n }\n)\n\n/**\n * Bubble sort algorithm\n */\nexport const sortItems = (a, b) => {\n let c\n let d\n if (1 === b) {\n c = 0\n d = a.length\n } else {\n if (b === -1) {\n c = a.length - 1\n d = -1\n }\n }\n for (let e = !0; e;) {\n e = !1\n for (let f = c; f != d; f += b) {\n if (a[f + b] && a[f].value > a[f + b].value) {\n const g = a[f]\n const h = a[f + b]\n const i = g\n a[f] = h\n a[f + b] = i\n e = !0\n }\n }\n }\n return a\n}\n\n/**\n * Pager truncation algorithm\n */\nexport const truncate = (a, b, c, d, ellipsis) => {\n d = d || 2\n let j\n const e = 2 * d\n let f = b - d\n let g = b + d\n const h = []\n const i = []\n if (b < 4 - d + e) {\n g = 3 + e\n } else if (b > c - (3 - d + e)) {\n f = c - (2 + e)\n }\n for (let k = 1; k <= c; k++) {\n if (1 == k || k == c || (k >= f && k <= g)) {\n const l = a[k - 1]\n l.classList.remove(\"active\")\n h.push(l)\n }\n }\n h.forEach(c => {\n const d = c.children[0].getAttribute(\"data-page\")\n if (j) {\n const e = j.children[0].getAttribute(\"data-page\")\n if (d - e == 2) i.push(a[e])\n else if (d - e != 1) {\n const f = createElement(\"li\", {\n class: \"ellipsis\",\n html: `${ellipsis}`\n })\n i.push(f)\n }\n }\n i.push(c)\n j = c\n })\n\n return i\n}\n","import {createElement} from \"./helpers\"\n/**\n * Rows API\n * @param {Object} instance DataTable instance\n * @param {Array} rows\n */\nexport class Rows {\n constructor(dt, rows) {\n this.dt = dt\n this.rows = rows\n\n return this\n }\n\n /**\n * Build a new row\n * @param {Array} row\n * @return {HTMLElement}\n */\n build(row) {\n const tr = createElement(\"tr\")\n\n let headings = this.dt.headings\n\n if (!headings.length) {\n headings = row.map(() => \"\")\n }\n\n headings.forEach((h, i) => {\n const td = createElement(\"td\")\n\n // Fixes #29\n if (!row[i] || !row[i].length) {\n row[i] = \"\"\n }\n\n td.innerHTML = row[i]\n\n td.data = row[i]\n\n tr.appendChild(td)\n })\n\n return tr\n }\n\n render(row) {\n return row\n }\n\n /**\n * Add new row\n * @param {Array} select\n */\n add(data) {\n if (Array.isArray(data)) {\n const dt = this.dt\n // Check for multiple rows\n if (Array.isArray(data[0])) {\n data.forEach(row => {\n dt.data.push(this.build(row))\n })\n } else {\n dt.data.push(this.build(data))\n }\n\n // We may have added data to an empty table\n if ( dt.data.length ) {\n dt.hasRows = true\n }\n\n\n this.update()\n\n dt.columns().rebuild()\n }\n\n }\n\n /**\n * Remove row(s)\n * @param {Array|Number} select\n * @return {Void}\n */\n remove(select) {\n const dt = this.dt\n\n if (Array.isArray(select)) {\n // Remove in reverse otherwise the indexes will be incorrect\n select.sort((a, b) => b - a)\n\n select.forEach(row => {\n dt.data.splice(row, 1)\n })\n } else if (select == \"all\") {\n dt.data = [];\n } else {\n dt.data.splice(select, 1)\n }\n\n // We may have emptied the table\n if ( !dt.data.length ) {\n dt.hasRows = false\n }\n\n this.update()\n dt.columns().rebuild()\n }\n\n /**\n * Update row indexes\n * @return {Void}\n */\n update() {\n this.dt.data.forEach((row, i) => {\n row.dataIndex = i\n })\n }\n\n /**\n * Find index of row by searching for a value in a column\n * @param {Number} columnIndex\n * @param {String} value\n * @return {Number}\n */\n findRowIndex(columnIndex, value) {\n // returns row index of first case-insensitive string match\n // inside the td innerText at specific column index\n return this.dt.data.findIndex(\n tr => tr.children[columnIndex].innerText.toLowerCase().includes(String(value).toLowerCase())\n )\n }\n\n /**\n * Find index, row, and column data by searching for a value in a column\n * @param {Number} columnIndex\n * @param {String} value\n * @return {Object}\n */\n findRow(columnIndex, value) {\n // get the row index\n const index = this.findRowIndex(columnIndex, value)\n // exit if not found\n if (index < 0) {\n return {\n index: -1,\n row: null,\n cols: []\n }\n }\n // get the row from data\n const row = this.dt.data[index]\n // return innerHTML of each td\n const cols = [...row.cells].map(r => r.innerHTML)\n // return everything\n return {\n index,\n row,\n cols\n }\n }\n\n /**\n * Update a row with new data\n * @param {Number} select\n * @param {Array} data\n * @return {Void}\n */\n updateRow(select, data) {\n const row = this.build(data)\n this.dt.data.splice(select, 1, row)\n this.update()\n this.dt.columns().rebuild()\n }\n}\n","import {sortItems} from \"./helpers\"\n\n/**\n * Columns API\n * @param {Object} instance DataTable instance\n * @param {Mixed} columns Column index or array of column indexes\n */\nexport class Columns {\n constructor(dt) {\n this.dt = dt\n return this\n }\n\n /**\n * Swap two columns\n * @return {Void}\n */\n swap(columns) {\n if (columns.length && columns.length === 2) {\n const cols = []\n\n // Get the current column indexes\n this.dt.headings.forEach((h, i) => {\n cols.push(i)\n })\n\n const x = columns[0]\n const y = columns[1]\n const b = cols[y]\n cols[y] = cols[x]\n cols[x] = b\n\n this.order(cols)\n }\n }\n\n /**\n * Reorder the columns\n * @return {Array} columns Array of ordered column indexes\n */\n order(columns) {\n let a\n let b\n let c\n let d\n let h\n let s\n let cell\n\n const temp = [\n [],\n [],\n [],\n []\n ]\n\n const dt = this.dt\n\n // Order the headings\n columns.forEach((column, x) => {\n h = dt.headings[column]\n s = h.getAttribute(\"data-sortable\") !== \"false\"\n a = h.cloneNode(true)\n a.originalCellIndex = x\n a.sortable = s\n\n temp[0].push(a)\n\n if (!dt.hiddenColumns.includes(column)) {\n b = h.cloneNode(true)\n b.originalCellIndex = x\n b.sortable = s\n\n temp[1].push(b)\n }\n })\n\n // Order the row cells\n dt.data.forEach((row, i) => {\n c = row.cloneNode(false)\n d = row.cloneNode(false)\n\n c.dataIndex = d.dataIndex = i\n\n if (row.searchIndex !== null && row.searchIndex !== undefined) {\n c.searchIndex = d.searchIndex = row.searchIndex\n }\n\n // Append the cell to the fragment in the correct order\n columns.forEach(column => {\n cell = row.cells[column].cloneNode(true)\n cell.data = row.cells[column].data\n c.appendChild(cell)\n\n if (!dt.hiddenColumns.includes(column)) {\n cell = row.cells[column].cloneNode(true)\n cell.data = row.cells[column].data\n d.appendChild(cell)\n }\n })\n\n temp[2].push(c)\n temp[3].push(d)\n })\n\n dt.headings = temp[0]\n dt.activeHeadings = temp[1]\n\n dt.data = temp[2]\n dt.activeRows = temp[3]\n\n // Update\n dt.update()\n }\n\n /**\n * Hide columns\n * @return {Void}\n */\n hide(columns) {\n if (columns.length) {\n const dt = this.dt\n\n columns.forEach(column => {\n if (!dt.hiddenColumns.includes(column)) {\n dt.hiddenColumns.push(column)\n }\n })\n\n this.rebuild()\n }\n }\n\n /**\n * Show columns\n * @return {Void}\n */\n show(columns) {\n if (columns.length) {\n let index\n const dt = this.dt\n\n columns.forEach(column => {\n index = dt.hiddenColumns.indexOf(column)\n if (index > -1) {\n dt.hiddenColumns.splice(index, 1)\n }\n })\n\n this.rebuild()\n }\n }\n\n /**\n * Check column(s) visibility\n * @return {Boolean}\n */\n visible(columns) {\n let cols\n const dt = this.dt\n\n columns = columns || dt.headings.map(th => th.originalCellIndex)\n\n if (!isNaN(columns)) {\n cols = !dt.hiddenColumns.includes(columns)\n } else if (Array.isArray(columns)) {\n cols = []\n columns.forEach(column => {\n cols.push(!dt.hiddenColumns.includes(column))\n })\n }\n\n return cols\n }\n\n /**\n * Add a new column\n * @param {Object} data\n */\n add(data) {\n let td\n const th = document.createElement(\"th\")\n\n if (!this.dt.headings.length) {\n this.dt.insert({\n headings: [data.heading],\n data: data.data.map(i => [i])\n })\n this.rebuild()\n return\n }\n\n if (!this.dt.hiddenHeader) {\n if (data.heading.nodeName) {\n th.appendChild(data.heading)\n } else {\n th.innerHTML = data.heading\n }\n } else {\n th.innerHTML = \"\"\n }\n\n this.dt.headings.push(th)\n\n this.dt.data.forEach((row, i) => {\n if (data.data[i]) {\n td = document.createElement(\"td\")\n\n if (data.data[i].nodeName) {\n td.appendChild(data.data[i])\n } else {\n td.innerHTML = data.data[i]\n }\n\n td.data = td.innerHTML\n\n if (data.render) {\n td.innerHTML = data.render.call(this, td.data, td, row)\n }\n\n row.appendChild(td)\n }\n })\n\n if (data.type) {\n th.setAttribute(\"data-type\", data.type)\n }\n if (data.format) {\n th.setAttribute(\"data-format\", data.format)\n }\n\n if (data.hasOwnProperty(\"sortable\")) {\n th.sortable = data.sortable\n th.setAttribute(\"data-sortable\", data.sortable === true ? \"true\" : \"false\")\n }\n\n this.rebuild()\n\n this.dt.renderHeader()\n }\n\n /**\n * Remove column(s)\n * @param {Array|Number} select\n * @return {Void}\n */\n remove(select) {\n if (Array.isArray(select)) {\n // Remove in reverse otherwise the indexes will be incorrect\n select.sort((a, b) => b - a)\n select.forEach(column => this.remove(column))\n } else {\n this.dt.headings.splice(select, 1)\n\n this.dt.data.forEach(row => {\n row.removeChild(row.cells[select])\n })\n }\n\n this.rebuild()\n }\n\n /**\n * Filter by column\n * @param {int} column - The column no.\n * @param {string} dir - asc or desc\n * @filter {array} filter - optional parameter with a list of strings\n * @return {void}\n */\n filter(column, dir, init, terms) {\n const dt = this.dt\n\n // Creates a internal state that manages filters if there are none\n if ( !dt.filterState ) {\n dt.filterState = {\n originalData: dt.data\n }\n }\n\n // If that column is was not filtered yet, we need to create its state\n if ( !dt.filterState[column] ) {\n\n // append a filter that selects all rows, 'resetting' the filter\n const filters = [...terms, () => true]\n\n dt.filterState[column] = (\n function() {\n let i = 0;\n return () => filters[i++ % (filters.length)]\n }()\n )\n }\n\n // Apply the filter and rebuild table\n const rowFilter = dt.filterState[column]() // fetches next filter\n const filteredRows = Array.from(dt.filterState.originalData).filter(tr => {\n const cell = tr.cells[column]\n const content = cell.hasAttribute(\"data-content\") ? cell.getAttribute(\"data-content\") : cell.innerText\n\n // If the filter is a function, call it, if it is a string, compare it\n return (typeof rowFilter) === \"function\" ? rowFilter(content) : content === rowFilter;\n })\n\n dt.data = filteredRows\n\n if (!dt.data.length) {\n dt.clear()\n dt.hasRows = false\n dt.setMessage(dt.options.labels.noRows)\n } else {\n this.rebuild()\n dt.update()\n }\n\n if (!init) {\n dt.emit(\"datatable.sort\", column, dir)\n }\n }\n\n /**\n * Sort by column\n * @param {int} column - The column no.\n * @param {string} dir - asc or desc\n * @return {void}\n */\n sort(column, dir, init) {\n const dt = this.dt\n\n // Check column is present\n if (dt.hasHeadings && (column < 0 || column > dt.headings.length)) {\n return false\n }\n\n //If there is a filter for this column, apply it instead of sorting\n const filterTerms = dt.options.filters &&\n dt.options.filters[dt.headings[column].textContent]\n if ( filterTerms && filterTerms.length !== 0 ) {\n this.filter(column, dir, init, filterTerms)\n return;\n }\n\n dt.sorting = true\n\n if (!init) {\n dt.emit(\"datatable.sorting\", column, dir)\n }\n\n let rows = dt.data\n const alpha = []\n const numeric = []\n let a = 0\n let n = 0\n const th = dt.headings[column]\n\n const waitFor = []\n\n // Check for date format\n if (th.getAttribute(\"data-type\") === \"date\") {\n let format = false\n const formatted = th.hasAttribute(\"data-format\")\n\n if (formatted) {\n format = th.getAttribute(\"data-format\")\n }\n waitFor.push(import(\"./date\").then(({parseDate}) => date => parseDate(date, format)))\n }\n\n Promise.all(waitFor).then(importedFunctions => {\n const parseFunction = importedFunctions[0] // only defined if date\n Array.from(rows).forEach(tr => {\n const cell = tr.cells[column]\n const content = cell.hasAttribute(\"data-content\") ? cell.getAttribute(\"data-content\") : cell.innerText\n let num\n if (parseFunction) {\n num = parseFunction(content)\n } else if (typeof content===\"string\") {\n num = content.replace(/(\\$|,|\\s|%)/g, \"\")\n } else {\n num = content\n }\n\n if (parseFloat(num) == num) {\n numeric[n++] = {\n value: Number(num),\n row: tr\n }\n } else {\n alpha[a++] = {\n value: typeof content===\"string\" ? content.toLowerCase() : content,\n row: tr\n }\n }\n })\n\n /* Sort according to direction (ascending or descending) */\n if (!dir) {\n if (th.classList.contains(\"asc\")) {\n dir = \"desc\"\n } else {\n dir = \"asc\"\n }\n }\n let top\n let btm\n if (dir == \"desc\") {\n top = sortItems(alpha, -1)\n btm = sortItems(numeric, -1)\n th.classList.remove(\"asc\")\n th.classList.add(\"desc\")\n } else {\n top = sortItems(numeric, 1)\n btm = sortItems(alpha, 1)\n th.classList.remove(\"desc\")\n th.classList.add(\"asc\")\n }\n\n /* Clear asc/desc class names from the last sorted column's th if it isn't the same as the one that was just clicked */\n if (dt.lastTh && th != dt.lastTh) {\n dt.lastTh.classList.remove(\"desc\")\n dt.lastTh.classList.remove(\"asc\")\n }\n\n dt.lastTh = th\n\n /* Reorder the table */\n rows = top.concat(btm)\n\n dt.data = []\n const indexes = []\n\n rows.forEach((v, i) => {\n dt.data.push(v.row)\n\n if (v.row.searchIndex !== null && v.row.searchIndex !== undefined) {\n indexes.push(i)\n }\n })\n\n dt.searchData = indexes\n\n this.rebuild()\n\n dt.update()\n\n if (!init) {\n dt.emit(\"datatable.sort\", column, dir)\n }\n })\n }\n\n /**\n * Rebuild the columns\n * @return {Void}\n */\n rebuild() {\n let a\n let b\n let c\n let d\n const dt = this.dt\n const temp = []\n\n dt.activeRows = []\n dt.activeHeadings = []\n\n dt.headings.forEach((th, i) => {\n th.originalCellIndex = i\n th.sortable = th.getAttribute(\"data-sortable\") !== \"false\"\n if (!dt.hiddenColumns.includes(i)) {\n dt.activeHeadings.push(th)\n }\n })\n\n // Loop over the rows and reorder the cells\n dt.data.forEach((row, i) => {\n a = row.cloneNode(false)\n b = row.cloneNode(false)\n\n a.dataIndex = b.dataIndex = i\n\n if (row.searchIndex !== null && row.searchIndex !== undefined) {\n a.searchIndex = b.searchIndex = row.searchIndex\n }\n\n // Append the cell to the fragment in the correct order\n Array.from(row.cells).forEach(cell => {\n c = cell.cloneNode(true)\n c.data = cell.data\n a.appendChild(c)\n\n if (!dt.hiddenColumns.includes(c.cellIndex)) {\n d = c.cloneNode(true)\n d.data = c.data\n b.appendChild(d)\n }\n })\n\n // Append the fragment with the ordered cells\n temp.push(a)\n dt.activeRows.push(b)\n })\n\n dt.data = temp\n\n dt.update()\n }\n}\n","import {createElement} from \"./helpers\"\n\n/**\n * Parse data to HTML table\n */\nexport const dataToTable = function (data) {\n let thead = false\n let tbody = false\n\n data = data || this.options.data\n\n if (data.headings) {\n thead = createElement(\"thead\")\n const tr = createElement(\"tr\")\n data.headings.forEach(col => {\n const td = createElement(\"th\", {\n html: col\n })\n tr.appendChild(td)\n })\n\n thead.appendChild(tr)\n }\n\n if (data.data && data.data.length) {\n tbody = createElement(\"tbody\")\n data.data.forEach(rows => {\n if (data.headings) {\n if (data.headings.length !== rows.length) {\n throw new Error(\n \"The number of rows do not match the number of headings.\"\n )\n }\n }\n const tr = createElement(\"tr\")\n rows.forEach(value => {\n const td = createElement(\"td\", {\n html: value\n })\n tr.appendChild(td)\n })\n tbody.appendChild(tr)\n })\n }\n\n if (thead) {\n if (this.dom.tHead !== null) {\n this.dom.removeChild(this.dom.tHead)\n }\n this.dom.appendChild(thead)\n }\n\n if (tbody) {\n if (this.dom.tBodies.length) {\n this.dom.removeChild(this.dom.tBodies[0])\n }\n this.dom.appendChild(tbody)\n }\n}\n","/**\n * Default configuration\n * @typ {Object}\n */\nexport const defaultConfig = {\n sortable: true,\n searchable: true,\n\n // Pagination\n paging: true,\n perPage: 10,\n perPageSelect: [5, 10, 15, 20, 25],\n nextPrev: true,\n firstLast: false,\n prevText: \"‹\",\n nextText: \"›\",\n firstText: \"«\",\n lastText: \"»\",\n ellipsisText: \"…\",\n ascText: \"▴\",\n descText: \"▾\",\n truncatePager: true,\n pagerDelta: 2,\n\n scrollY: \"\",\n\n fixedColumns: true,\n fixedHeight: false,\n\n header: true,\n hiddenHeader: false,\n footer: false,\n\n // Customise the display text\n labels: {\n placeholder: \"Search...\", // The search input placeholder\n perPage: \"{select} entries per page\", // per-page dropdown label\n noRows: \"No entries found\", // Message shown when there are no records to show\n noResults: \"No results match your search query\", // Message shown when there are no search results\n info: \"Showing {start} to {end} of {rows} entries\" //\n },\n\n // Customise the layout\n layout: {\n top: \"{select}{search}\",\n bottom: \"{info}{pager}\"\n }\n}\n","import {Rows} from \"./rows\"\nimport {Columns} from \"./columns\"\nimport {dataToTable} from \"./table\"\nimport {defaultConfig} from \"./config\"\nimport {\n isObject,\n isJson,\n createElement,\n flush,\n button,\n truncate\n} from \"./helpers\"\n\n\nexport class DataTable {\n constructor(table, options = {}) {\n\n const dom = typeof table === \"string\" ? document.querySelector(table) : table\n\n // user options\n this.options = {\n ...defaultConfig,\n ...options,\n layout: {\n ...defaultConfig.layout,\n ...options.layout\n },\n labels: {\n ...defaultConfig.labels,\n ...options.labels\n }\n }\n\n this.initialized = false\n\n this.initialLayout = dom.innerHTML\n this.initialSortable = this.options.sortable\n\n // Disable manual sorting if no header is present (#4)\n if (!this.options.header) {\n this.options.sortable = false\n }\n\n if (dom.tHead === null) {\n if (!this.options.data ||\n (this.options.data && !this.options.data.headings)\n ) {\n this.options.sortable = false\n }\n }\n\n if (dom.tBodies.length && !dom.tBodies[0].rows.length) {\n if (this.options.data) {\n if (!this.options.data.data) {\n throw new Error(\n \"You seem to be using the data option, but you've not defined any rows.\"\n )\n }\n }\n }\n\n this.dom = dom\n\n this.table = this.dom // For compatibility. Remove in version 4\n\n this.listeners = {\n onResize: event => this.onResize(event)\n }\n\n this.init()\n }\n\n /**\n * Add custom property or method to extend DataTable\n * @param {String} prop - Method name or property\n * @param {Mixed} val - Function or property value\n * @return {Void}\n */\n static extend(prop, val) {\n if (typeof val === \"function\") {\n DataTable.prototype[prop] = val\n } else {\n DataTable[prop] = val\n }\n }\n\n /**\n * Initialize the instance\n * @param {Object} options\n * @return {Void}\n */\n init(options) {\n if (this.initialized || this.dom.classList.contains(\"dataTable-table\")) {\n return false\n }\n\n Object.assign(this.options, options || {})\n\n this.currentPage = 1\n this.onFirstPage = true\n\n this.hiddenColumns = []\n this.columnRenderers = []\n this.selectedColumns = []\n\n this.render()\n\n setTimeout(() => {\n this.emit(\"datatable.init\")\n this.initialized = true\n\n if (this.options.plugins) {\n Object.entries(this.options.plugins).forEach(([plugin, options]) => {\n if (this[plugin] && typeof this[plugin] === \"function\") {\n this[plugin] = this[plugin](options, {createElement})\n\n // Init plugin\n if (options.enabled && this[plugin].init && typeof this[plugin].init === \"function\") {\n this[plugin].init()\n }\n }\n })\n }\n }, 10)\n }\n\n /**\n * Render the instance\n * @param {String} type\n * @return {Void}\n */\n render(type) {\n if (type) {\n switch (type) {\n case \"page\":\n this.renderPage()\n break\n case \"pager\":\n this.renderPager()\n break\n case \"header\":\n this.renderHeader()\n break\n }\n\n return false\n }\n\n const options = this.options\n let template = \"\"\n\n // Convert data to HTML\n if (options.data) {\n dataToTable.call(this)\n }\n\n // Store references\n this.body = this.dom.tBodies[0]\n this.head = this.dom.tHead\n this.foot = this.dom.tFoot\n\n if (!this.body) {\n this.body = createElement(\"tbody\")\n\n this.dom.appendChild(this.body)\n }\n\n this.hasRows = this.body.rows.length > 0\n\n // Make a tHead if there isn't one (fixes #8)\n if (!this.head) {\n const h = createElement(\"thead\")\n const t = createElement(\"tr\")\n\n if (this.hasRows) {\n Array.from(this.body.rows[0].cells).forEach(() => {\n t.appendChild(createElement(\"th\"))\n })\n\n h.appendChild(t)\n }\n\n this.head = h\n\n this.dom.insertBefore(this.head, this.body)\n\n this.hiddenHeader = options.hiddenHeader\n }\n\n this.headings = []\n this.hasHeadings = this.head.rows.length > 0\n\n if (this.hasHeadings) {\n this.header = this.head.rows[0]\n this.headings = [].slice.call(this.header.cells)\n }\n\n // Header\n if (!options.header) {\n if (this.head) {\n this.dom.removeChild(this.dom.tHead)\n }\n }\n\n // Footer\n if (options.footer) {\n if (this.head && !this.foot) {\n this.foot = createElement(\"tfoot\", {\n html: this.head.innerHTML\n })\n this.dom.appendChild(this.foot)\n }\n } else {\n if (this.foot) {\n this.dom.removeChild(this.dom.tFoot)\n }\n }\n\n // Build\n this.wrapper = createElement(\"div\", {\n class: \"dataTable-wrapper dataTable-loading\"\n })\n\n // Template for custom layouts\n template += \"
\"\n template += options.layout.top\n template += \"
\"\n if (options.scrollY.length) {\n template += `
`\n } else {\n template += \"
\"\n }\n template += \"
\"\n template += options.layout.bottom\n template += \"
\"\n\n // Info placement\n template = template.replace(\"{info}\", options.paging ? \"
\" : \"\")\n\n // Per Page Select\n if (options.paging && options.perPageSelect) {\n let wrap = \"
\"\n\n // Create the select\n const select = createElement(\"select\", {\n class: \"dataTable-selector\"\n })\n\n // Create the options\n options.perPageSelect.forEach(val => {\n const selected = val === options.perPage\n const option = new Option(val, val, selected, selected)\n select.add(option)\n })\n\n // Custom label\n wrap = wrap.replace(\"{select}\", select.outerHTML)\n\n // Selector placement\n template = template.replace(\"{select}\", wrap)\n } else {\n template = template.replace(\"{select}\", \"\")\n }\n\n // Searchable\n if (options.searchable) {\n const form =\n ``\n\n // Search input placement\n template = template.replace(\"{search}\", form)\n } else {\n template = template.replace(\"{search}\", \"\")\n }\n\n if (this.hasHeadings) {\n // Sortable\n this.render(\"header\")\n }\n\n // Add table class\n this.dom.classList.add(\"dataTable-table\")\n\n // Paginator\n const paginatorWrapper = createElement(\"nav\", {\n class: \"dataTable-pagination\"\n })\n const paginator = createElement(\"ul\", {\n class: \"dataTable-pagination-list\"\n })\n paginatorWrapper.appendChild(paginator)\n\n // Pager(s) placement\n template = template.replace(/\\{pager\\}/g, paginatorWrapper.outerHTML)\n this.wrapper.innerHTML = template\n\n this.container = this.wrapper.querySelector(\".dataTable-container\")\n\n this.pagers = this.wrapper.querySelectorAll(\".dataTable-pagination-list\")\n\n this.label = this.wrapper.querySelector(\".dataTable-info\")\n\n // Insert in to DOM tree\n this.dom.parentNode.replaceChild(this.wrapper, this.dom)\n this.container.appendChild(this.dom)\n\n // Store the table dimensions\n this.rect = this.dom.getBoundingClientRect()\n\n // Convert rows to array for processing\n this.data = Array.from(this.body.rows)\n this.activeRows = this.data.slice()\n this.activeHeadings = this.headings.slice()\n\n // Update\n this.update()\n\n\n this.setColumns()\n\n\n // Fix height\n this.fixHeight()\n\n // Fix columns\n this.fixColumns()\n\n // Class names\n if (!options.header) {\n this.wrapper.classList.add(\"no-header\")\n }\n\n if (!options.footer) {\n this.wrapper.classList.add(\"no-footer\")\n }\n\n if (options.sortable) {\n this.wrapper.classList.add(\"sortable\")\n }\n\n if (options.searchable) {\n this.wrapper.classList.add(\"searchable\")\n }\n\n if (options.fixedHeight) {\n this.wrapper.classList.add(\"fixed-height\")\n }\n\n if (options.fixedColumns) {\n this.wrapper.classList.add(\"fixed-columns\")\n }\n\n this.bindEvents()\n }\n\n /**\n * Render the page\n * @return {Void}\n */\n renderPage() {\n if (this.hasHeadings) {\n flush(this.header)\n\n this.activeHeadings.forEach(th => this.header.appendChild(th))\n }\n\n\n if (this.hasRows && this.totalPages) {\n if (this.currentPage > this.totalPages) {\n this.currentPage = 1\n }\n\n // Use a fragment to limit touching the DOM\n const index = this.currentPage - 1\n\n const frag = document.createDocumentFragment()\n this.pages[index].forEach(row => frag.appendChild(this.rows().render(row)))\n\n this.clear(frag)\n\n this.onFirstPage = this.currentPage === 1\n this.onLastPage = this.currentPage === this.lastPage\n } else {\n this.setMessage(this.options.labels.noRows)\n }\n\n // Update the info\n let current = 0\n\n let f = 0\n let t = 0\n let items\n\n if (this.totalPages) {\n current = this.currentPage - 1\n f = current * this.options.perPage\n t = f + this.pages[current].length\n f = f + 1\n items = this.searching ? this.searchData.length : this.data.length\n }\n\n if (this.label && this.options.labels.info.length) {\n // CUSTOM LABELS\n const string = this.options.labels.info\n .replace(\"{start}\", f)\n .replace(\"{end}\", t)\n .replace(\"{page}\", this.currentPage)\n .replace(\"{pages}\", this.totalPages)\n .replace(\"{rows}\", items)\n\n this.label.innerHTML = items ? string : \"\"\n }\n\n if (this.currentPage == 1) {\n this.fixHeight()\n }\n }\n\n /**\n * Render the pager(s)\n * @return {Void}\n */\n renderPager() {\n flush(this.pagers)\n\n if (this.totalPages > 1) {\n const c = \"pager\"\n const frag = document.createDocumentFragment()\n const prev = this.onFirstPage ? 1 : this.currentPage - 1\n const next = this.onLastPage ? this.totalPages : this.currentPage + 1\n\n // first button\n if (this.options.firstLast) {\n frag.appendChild(button(c, 1, this.options.firstText))\n }\n\n // prev button\n if (this.options.nextPrev && !this.onFirstPage) {\n frag.appendChild(button(c, prev, this.options.prevText))\n }\n\n let pager = this.links\n\n // truncate the links\n if (this.options.truncatePager) {\n pager = truncate(\n this.links,\n this.currentPage,\n this.pages.length,\n this.options.pagerDelta,\n this.options.ellipsisText\n )\n }\n\n // active page link\n this.links[this.currentPage - 1].classList.add(\"active\")\n\n // append the links\n pager.forEach(p => {\n p.classList.remove(\"active\")\n frag.appendChild(p)\n })\n\n this.links[this.currentPage - 1].classList.add(\"active\")\n\n // next button\n if (this.options.nextPrev && !this.onLastPage) {\n frag.appendChild(button(c, next, this.options.nextText))\n }\n\n // first button\n if (this.options.firstLast) {\n frag.appendChild(button(c, this.totalPages, this.options.lastText))\n }\n\n // We may have more than one pager\n this.pagers.forEach(pager => {\n pager.appendChild(frag.cloneNode(true))\n })\n }\n }\n\n /**\n * Render the header\n * @return {Void}\n */\n renderHeader() {\n this.labels = []\n\n if (this.headings && this.headings.length) {\n this.headings.forEach((th, i) => {\n\n this.labels[i] = th.textContent\n\n if (th.firstElementChild && th.firstElementChild.classList.contains(\"dataTable-sorter\")) {\n th.innerHTML = th.firstElementChild.innerHTML\n }\n\n th.sortable = th.getAttribute(\"data-sortable\") !== \"false\"\n\n th.originalCellIndex = i\n if (this.options.sortable && th.sortable) {\n const link = createElement(\"a\", {\n href: \"#\",\n class: \"dataTable-sorter\",\n html: th.innerHTML\n })\n\n th.innerHTML = \"\"\n th.setAttribute(\"data-sortable\", \"\")\n th.appendChild(link)\n }\n })\n }\n\n this.fixColumns()\n }\n\n /**\n * Bind event listeners\n * @return {[type]} [description]\n */\n bindEvents() {\n const options = this.options\n // Per page selector\n if (options.perPageSelect) {\n const selector = this.wrapper.querySelector(\".dataTable-selector\")\n if (selector) {\n // Change per page\n selector.addEventListener(\"change\", () => {\n options.perPage = parseInt(selector.value, 10)\n this.update()\n\n this.fixHeight()\n\n this.emit(\"datatable.perpage\", options.perPage)\n }, false)\n }\n }\n\n // Search input\n if (options.searchable) {\n this.input = this.wrapper.querySelector(\".dataTable-input\")\n if (this.input) {\n this.input.addEventListener(\"keyup\", () => this.search(this.input.value), false)\n }\n }\n\n // Pager(s) / sorting\n this.wrapper.addEventListener(\"click\", e => {\n const t = e.target.closest(\"a\")\n if (t && (t.nodeName.toLowerCase() === \"a\")) {\n if (t.hasAttribute(\"data-page\")) {\n this.page(t.getAttribute(\"data-page\"))\n e.preventDefault()\n } else if (\n options.sortable &&\n t.classList.contains(\"dataTable-sorter\") &&\n t.parentNode.getAttribute(\"data-sortable\") != \"false\"\n ) {\n this.columns().sort(this.headings.indexOf(t.parentNode))\n e.preventDefault()\n }\n }\n }, false)\n\n window.addEventListener(\"resize\", this.listeners.onResize)\n }\n\n /**\n * execute on resize\n */\n onResize() {\n this.rect = this.container.getBoundingClientRect()\n if (!this.rect.width) {\n // No longer shown, likely no longer part of DOM. Give up.\n return\n }\n this.fixColumns()\n }\n\n /**\n * Set up columns\n * @return {[type]} [description]\n */\n setColumns(ajax) {\n\n if (!ajax) {\n this.data.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n cell.data = cell.innerHTML\n })\n })\n }\n\n // Check for the columns option\n if (this.options.columns && this.headings.length) {\n\n this.options.columns.forEach(data => {\n\n // convert single column selection to array\n if (!Array.isArray(data.select)) {\n data.select = [data.select]\n }\n\n if (data.hasOwnProperty(\"render\") && typeof data.render === \"function\") {\n this.selectedColumns = this.selectedColumns.concat(data.select)\n\n this.columnRenderers.push({\n columns: data.select,\n renderer: data.render\n })\n }\n\n // Add the data attributes to the th elements\n data.select.forEach(column => {\n const th = this.headings[column]\n if (!th) {\n return\n }\n if (data.type) {\n th.setAttribute(\"data-type\", data.type)\n }\n if (data.format) {\n th.setAttribute(\"data-format\", data.format)\n }\n if (data.hasOwnProperty(\"sortable\")) {\n th.setAttribute(\"data-sortable\", data.sortable)\n }\n\n if (data.hasOwnProperty(\"hidden\")) {\n if (data.hidden !== false) {\n this.columns().hide([column])\n }\n }\n\n if (data.hasOwnProperty(\"sort\") && data.select.length === 1) {\n this.columns().sort(data.select[0], data.sort, true)\n }\n })\n })\n }\n\n if (this.hasRows) {\n this.data.forEach((row, i) => {\n row.dataIndex = i\n Array.from(row.cells).forEach(cell => {\n cell.data = cell.innerHTML\n })\n })\n\n if (this.selectedColumns.length) {\n this.data.forEach(row => {\n Array.from(row.cells).forEach((cell, i) => {\n if (this.selectedColumns.includes(i)) {\n this.columnRenderers.forEach(options => {\n if (options.columns.includes(i)) {\n cell.innerHTML = options.renderer.call(this, cell.data, cell, row)\n }\n })\n }\n })\n })\n }\n\n this.columns().rebuild()\n }\n\n this.render(\"header\")\n }\n\n /**\n * Destroy the instance\n * @return {void}\n */\n destroy() {\n this.dom.innerHTML = this.initialLayout\n\n // Remove the className\n this.dom.classList.remove(\"dataTable-table\")\n\n // Remove the containers\n this.wrapper.parentNode.replaceChild(this.dom, this.wrapper)\n\n this.initialized = false\n\n window.removeEventListener(\"resize\", this.listeners.onResize)\n }\n\n /**\n * Update the instance\n * @return {Void}\n */\n update() {\n this.wrapper.classList.remove(\"dataTable-empty\")\n\n this.paginate(this)\n this.render(\"page\")\n\n this.links = []\n\n let i = this.pages.length\n while (i--) {\n const num = i + 1\n this.links[i] = button(i === 0 ? \"active\" : \"\", num, num)\n }\n\n this.sorting = false\n\n this.render(\"pager\")\n\n this.rows().update()\n\n this.emit(\"datatable.update\")\n }\n\n /**\n * Sort rows into pages\n * @return {Number}\n */\n paginate() {\n const perPage = this.options.perPage\n let rows = this.activeRows\n\n if (this.searching) {\n rows = []\n\n this.searchData.forEach(index => rows.push(this.activeRows[index]))\n }\n\n if (this.options.paging) {\n // Check for hidden columns\n this.pages = rows\n .map((tr, i) => i % perPage === 0 ? rows.slice(i, i + perPage) : null)\n .filter(page => page)\n } else {\n this.pages = [rows]\n }\n\n this.totalPages = this.lastPage = this.pages.length\n\n return this.totalPages\n }\n\n /**\n * Fix column widths\n * @return {Void}\n */\n fixColumns() {\n\n if ((this.options.scrollY.length || this.options.fixedColumns) && this.activeHeadings && this.activeHeadings.length) {\n let cells\n let hd = false\n this.columnWidths = []\n\n // If we have headings we need only set the widths on them\n // otherwise we need a temp header and the widths need applying to all cells\n if (this.dom.tHead) {\n\n if (this.options.scrollY.length) {\n hd = createElement(\"thead\")\n hd.appendChild(createElement(\"tr\"))\n hd.style.height = \"0px\"\n if (this.headerTable) {\n // move real header back into place\n this.dom.tHead = this.headerTable.tHead\n }\n }\n\n // Reset widths\n this.activeHeadings.forEach(cell => {\n cell.style.width = \"\"\n })\n\n const totalOffsetWidth = this.activeHeadings.reduce(\n (total, cell) => total + cell.offsetWidth,\n 0\n )\n\n this.activeHeadings.forEach((cell, i) => {\n const ow = cell.offsetWidth\n const w = ow / totalOffsetWidth * 100\n cell.style.width = `${w}%`\n this.columnWidths[i] = ow\n if (this.options.scrollY.length) {\n const th = createElement(\"th\")\n hd.firstElementChild.appendChild(th)\n th.style.width = `${w}%`\n th.style.paddingTop = \"0\"\n th.style.paddingBottom = \"0\"\n th.style.border = \"0\"\n }\n })\n\n if (this.options.scrollY.length) {\n const container = this.dom.parentElement\n if (!this.headerTable) {\n this.headerTable = createElement(\"table\", {\n class: \"dataTable-table\"\n })\n const headercontainer = createElement(\"div\", {\n class: \"dataTable-headercontainer\"\n })\n headercontainer.appendChild(this.headerTable)\n container.parentElement.insertBefore(headercontainer, container)\n }\n const thd = this.dom.tHead\n this.dom.replaceChild(hd, thd)\n this.headerTable.tHead = thd\n\n // Compensate for scrollbars.\n this.headerTable.parentElement.style.paddingRight = `${\n this.headerTable.clientWidth -\n this.dom.clientWidth +\n parseInt(\n this.headerTable.parentElement.style.paddingRight ||\n \"0\",\n 10\n )\n }px`\n\n if (container.scrollHeight > container.clientHeight) {\n // scrollbars on one page means scrollbars on all pages.\n container.style.overflowY = \"scroll\"\n }\n }\n\n } else {\n cells = []\n\n // Make temperary headings\n hd = createElement(\"thead\")\n const r = createElement(\"tr\")\n Array.from(this.dom.tBodies[0].rows[0].cells).forEach(() => {\n const th = createElement(\"th\")\n r.appendChild(th)\n cells.push(th)\n })\n\n hd.appendChild(r)\n this.dom.insertBefore(hd, this.body)\n\n const widths = []\n cells.forEach((cell, i) => {\n const ow = cell.offsetWidth\n const w = ow / this.rect.width * 100\n widths.push(w)\n this.columnWidths[i] = ow\n })\n\n this.data.forEach(row => {\n Array.from(row.cells).forEach((cell, i) => {\n if (this.columns(cell.cellIndex).visible())\n cell.style.width = `${widths[i]}%`\n })\n })\n\n // Discard the temp header\n this.dom.removeChild(hd)\n }\n }\n }\n\n /**\n * Fix the container height\n * @return {Void}\n */\n fixHeight() {\n if (this.options.fixedHeight) {\n this.container.style.height = null\n this.rect = this.container.getBoundingClientRect()\n this.container.style.height = `${this.rect.height}px`\n }\n }\n\n /**\n * Perform a search of the data set\n * @param {string} query\n * @return {void}\n */\n search(query) {\n if (!this.hasRows) return false\n\n query = query.toLowerCase()\n\n this.currentPage = 1\n this.searching = true\n this.searchData = []\n\n if (!query.length) {\n this.searching = false\n this.update()\n this.emit(\"datatable.search\", query, this.searchData)\n this.wrapper.classList.remove(\"search-results\")\n return false\n }\n\n this.clear()\n\n this.data.forEach((row, idx) => {\n const inArray = this.searchData.includes(row)\n\n // https://github.com/Mobius1/Vanilla-DataTables/issues/12\n const doesQueryMatch = query.split(\" \").reduce((bool, word) => {\n let includes = false\n let cell = null\n let content = null\n\n for (let x = 0; x < row.cells.length; x++) {\n cell = row.cells[x]\n content = cell.hasAttribute(\"data-content\") ? cell.getAttribute(\"data-content\") : cell.textContent\n\n if (\n content.toLowerCase().includes(word) &&\n this.columns(cell.cellIndex).visible()\n ) {\n includes = true\n break\n }\n }\n\n return bool && includes\n }, true)\n\n if (doesQueryMatch && !inArray) {\n row.searchIndex = idx\n this.searchData.push(idx)\n } else {\n row.searchIndex = null\n }\n })\n\n this.wrapper.classList.add(\"search-results\")\n\n if (!this.searchData.length) {\n this.wrapper.classList.remove(\"search-results\")\n\n this.setMessage(this.options.labels.noResults)\n } else {\n this.update()\n }\n\n this.emit(\"datatable.search\", query, this.searchData)\n }\n\n /**\n * Change page\n * @param {int} page\n * @return {void}\n */\n page(page) {\n // We don't want to load the current page again.\n if (page == this.currentPage) {\n return false\n }\n\n if (!isNaN(page)) {\n this.currentPage = parseInt(page, 10)\n }\n\n if (page > this.pages.length || page < 0) {\n return false\n }\n\n this.render(\"page\")\n this.render(\"pager\")\n\n this.emit(\"datatable.page\", page)\n }\n\n /**\n * Sort by column\n * @param {int} column - The column no.\n * @param {string} direction - asc or desc\n * @return {void}\n */\n sortColumn(column, direction) {\n // Use columns API until sortColumn method is removed\n this.columns().sort(column, direction)\n }\n\n /**\n * Add new row data\n * @param {object} data\n */\n insert(data) {\n let rows = []\n if (isObject(data)) {\n if (data.headings) {\n if (!this.hasHeadings && !this.hasRows) {\n const tr = createElement(\"tr\")\n data.headings.forEach(heading => {\n const th = createElement(\"th\", {\n html: heading\n })\n\n tr.appendChild(th)\n })\n this.head.appendChild(tr)\n\n this.header = tr\n this.headings = [].slice.call(tr.cells)\n this.hasHeadings = true\n\n // Re-enable sorting if it was disabled due\n // to missing header\n this.options.sortable = this.initialSortable\n\n // Allow sorting on new header\n this.render(\"header\")\n\n // Activate newly added headings\n this.activeHeadings = this.headings.slice()\n }\n }\n\n if (data.data && Array.isArray(data.data)) {\n rows = data.data\n }\n } else if (Array.isArray(data)) {\n data.forEach(row => {\n const r = []\n Object.entries(row).forEach(([heading, cell]) => {\n\n const index = this.labels.indexOf(heading)\n\n if (index > -1) {\n r[index] = cell\n }\n })\n rows.push(r)\n })\n }\n\n if (rows.length) {\n this.rows().add(rows)\n\n this.hasRows = true\n }\n\n this.update()\n this.setColumns()\n this.fixColumns()\n }\n\n /**\n * Refresh the instance\n * @return {void}\n */\n refresh() {\n if (this.options.searchable) {\n this.input.value = \"\"\n this.searching = false\n }\n this.currentPage = 1\n this.onFirstPage = true\n this.update()\n\n this.emit(\"datatable.refresh\")\n }\n\n /**\n * Truncate the table\n * @param {mixes} html - HTML string or HTMLElement\n * @return {void}\n */\n clear(html) {\n if (this.body) {\n flush(this.body)\n }\n\n let parent = this.body\n if (!this.body) {\n parent = this.dom\n }\n\n if (html) {\n if (typeof html === \"string\") {\n const frag = document.createDocumentFragment()\n frag.innerHTML = html\n }\n\n parent.appendChild(html)\n }\n }\n\n /**\n * Export table to various formats (csv, txt or sql)\n * @param {Object} userOptions User options\n * @return {Boolean}\n */\n export(userOptions) {\n if (!this.hasHeadings && !this.hasRows) return false\n\n const headers = this.activeHeadings\n let rows = []\n const arr = []\n let i\n let x\n let str\n let link\n\n const defaults = {\n download: true,\n skipColumn: [],\n\n // csv\n lineDelimiter: \"\\n\",\n columnDelimiter: \",\",\n\n // sql\n tableName: \"myTable\",\n\n // json\n replacer: null,\n space: 4\n }\n\n // Check for the options object\n if (!isObject(userOptions)) {\n return false\n }\n\n const options = {\n ...defaults,\n ...userOptions\n }\n\n if (options.type) {\n if (options.type === \"txt\" || options.type === \"csv\") {\n // Include headings\n rows[0] = this.header\n }\n\n // Selection or whole table\n if (options.selection) {\n // Page number\n if (!isNaN(options.selection)) {\n rows = rows.concat(this.pages[options.selection - 1])\n } else if (Array.isArray(options.selection)) {\n // Array of page numbers\n for (i = 0; i < options.selection.length; i++) {\n rows = rows.concat(this.pages[options.selection[i] - 1])\n }\n }\n } else {\n rows = rows.concat(this.activeRows)\n }\n\n // Only proceed if we have data\n if (rows.length) {\n if (options.type === \"txt\" || options.type === \"csv\") {\n str = \"\"\n\n for (i = 0; i < rows.length; i++) {\n for (x = 0; x < rows[i].cells.length; x++) {\n // Check for column skip and visibility\n if (\n !options.skipColumn.includes(headers[x].originalCellIndex) &&\n this.columns(headers[x].originalCellIndex).visible()\n ) {\n let text = rows[i].cells[x].textContent\n text = text.trim()\n text = text.replace(/\\s{2,}/g, \" \")\n text = text.replace(/\\n/g, \" \")\n text = text.replace(/\"/g, \"\\\"\\\"\")\n //have to manually encode \"#\" as encodeURI leaves it as is.\n text = text.replace(/#/g, \"%23\")\n if (text.includes(\",\"))\n text = `\"${text}\"`\n\n\n str += text + options.columnDelimiter\n }\n }\n // Remove trailing column delimiter\n str = str.trim().substring(0, str.length - 1)\n\n // Apply line delimiter\n str += options.lineDelimiter\n }\n\n // Remove trailing line delimiter\n str = str.trim().substring(0, str.length - 1)\n\n if (options.download) {\n str = `data:text/csv;charset=utf-8,${str}`\n }\n } else if (options.type === \"sql\") {\n // Begin INSERT statement\n str = `INSERT INTO \\`${options.tableName}\\` (`\n\n // Convert table headings to column names\n for (i = 0; i < headers.length; i++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[i].originalCellIndex) &&\n this.columns(headers[i].originalCellIndex).visible()\n ) {\n str += `\\`${headers[i].textContent}\\`,`\n }\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // Begin VALUES\n str += \") VALUES \"\n\n // Iterate rows and convert cell data to column values\n for (i = 0; i < rows.length; i++) {\n str += \"(\"\n\n for (x = 0; x < rows[i].cells.length; x++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[x].originalCellIndex) &&\n this.columns(headers[x].originalCellIndex).visible()\n ) {\n str += `\"${rows[i].cells[x].textContent}\",`\n }\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // end VALUES\n str += \"),\"\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // Add trailing colon\n str += \";\"\n\n if (options.download) {\n str = `data:application/sql;charset=utf-8,${str}`\n }\n } else if (options.type === \"json\") {\n // Iterate rows\n for (x = 0; x < rows.length; x++) {\n arr[x] = arr[x] || {}\n // Iterate columns\n for (i = 0; i < headers.length; i++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[i].originalCellIndex) &&\n this.columns(headers[i].originalCellIndex).visible()\n ) {\n arr[x][headers[i].textContent] = rows[x].cells[i].textContent\n }\n }\n }\n\n // Convert the array of objects to JSON string\n str = JSON.stringify(arr, options.replacer, options.space)\n\n if (options.download) {\n str = `data:application/json;charset=utf-8,${str}`\n }\n }\n\n // Download\n if (options.download) {\n // Filename\n options.filename = options.filename || \"datatable_export\"\n options.filename += `.${options.type}`\n\n str = encodeURI(str)\n\n // Create a link to trigger the download\n link = document.createElement(\"a\")\n link.href = str\n link.download = options.filename\n\n // Append the link\n document.body.appendChild(link)\n\n // Trigger the download\n link.click()\n\n // Remove the link\n document.body.removeChild(link)\n }\n\n return str\n }\n }\n\n return false\n }\n\n /**\n * Import data to the table\n * @param {Object} userOptions User options\n * @return {Boolean}\n */\n import(userOptions) {\n let obj = false\n const defaults = {\n // csv\n lineDelimiter: \"\\n\",\n columnDelimiter: \",\",\n removeDoubleQuotes: false\n }\n\n // Check for the options object\n if (!isObject(userOptions)) {\n return false\n }\n\n const options = {\n ...defaults,\n ...userOptions\n }\n\n if (options.data.length || isObject(options.data)) {\n // Import CSV\n if (options.type === \"csv\") {\n obj = {\n data: []\n }\n\n // Split the string into rows\n const rows = options.data.split(options.lineDelimiter)\n\n if (rows.length) {\n\n if (options.headings) {\n obj.headings = rows[0].split(options.columnDelimiter)\n if (options.removeDoubleQuotes) {\n obj.headings = obj.headings.map(e => e.trim().replace(/(^\"|\"$)/g, \"\"))\n }\n rows.shift()\n }\n\n rows.forEach((row, i) => {\n obj.data[i] = []\n\n // Split the rows into values\n const values = row.split(options.columnDelimiter)\n\n if (values.length) {\n values.forEach(value => {\n if (options.removeDoubleQuotes) {\n value = value.trim().replace(/(^\"|\"$)/g, \"\")\n }\n obj.data[i].push(value)\n })\n }\n })\n }\n } else if (options.type === \"json\") {\n const json = isJson(options.data)\n\n // Valid JSON string\n if (json) {\n obj = {\n headings: [],\n data: []\n }\n\n json.forEach((data, i) => {\n obj.data[i] = []\n Object.entries(data).forEach(([column, value]) => {\n if (!obj.headings.includes(column)) {\n obj.headings.push(column)\n }\n\n obj.data[i].push(value)\n })\n })\n } else {\n // console.warn(\"That's not valid JSON!\")\n }\n }\n\n if (isObject(options.data)) {\n obj = options.data\n }\n\n if (obj) {\n // Add the rows\n this.insert(obj)\n }\n }\n\n return false\n }\n\n /**\n * Print the table\n * @return {void}\n */\n print() {\n const headings = this.activeHeadings\n const rows = this.activeRows\n const table = createElement(\"table\")\n const thead = createElement(\"thead\")\n const tbody = createElement(\"tbody\")\n\n const tr = createElement(\"tr\")\n headings.forEach(th => {\n tr.appendChild(\n createElement(\"th\", {\n html: th.textContent\n })\n )\n })\n\n thead.appendChild(tr)\n\n rows.forEach(row => {\n const tr = createElement(\"tr\")\n Array.from(row.cells).forEach(cell => {\n tr.appendChild(\n createElement(\"td\", {\n html: cell.textContent\n })\n )\n })\n tbody.appendChild(tr)\n })\n\n table.appendChild(thead)\n table.appendChild(tbody)\n\n // Open new window\n const w = window.open()\n\n // Append the table to the body\n w.document.body.appendChild(table)\n\n // Print\n w.print()\n }\n\n /**\n * Show a message in the table\n * @param {string} message\n */\n setMessage(message) {\n let colspan = 1\n\n if (this.hasRows) {\n colspan = this.data[0].cells.length\n } else if (this.activeHeadings.length) {\n colspan = this.activeHeadings.length\n }\n\n this.wrapper.classList.add(\"dataTable-empty\")\n\n if (this.label) {\n this.label.innerHTML = \"\"\n }\n this.totalPages = 0\n this.render(\"pager\")\n\n this.clear(\n createElement(\"tr\", {\n html: `${message}`\n })\n )\n }\n\n /**\n * Columns API access\n * @return {Object} new Columns instance\n */\n columns(columns) {\n return new Columns(this, columns)\n }\n\n /**\n * Rows API access\n * @return {Object} new Rows instance\n */\n rows(rows) {\n return new Rows(this, rows)\n }\n\n /**\n * Add custom event listener\n * @param {String} event\n * @param {Function} callback\n * @return {Void}\n */\n on(event, callback) {\n this.events = this.events || {}\n this.events[event] = this.events[event] || []\n this.events[event].push(callback)\n }\n\n /**\n * Remove custom event listener\n * @param {String} event\n * @param {Function} callback\n * @return {Void}\n */\n off(event, callback) {\n this.events = this.events || {}\n if (event in this.events === false) return\n this.events[event].splice(this.events[event].indexOf(callback), 1)\n }\n\n /**\n * Fire custom event\n * @param {String} event\n * @return {Void}\n */\n emit(event) {\n this.events = this.events || {}\n if (event in this.events === false) return\n for (let i = 0; i < this.events[event].length; i++) {\n this.events[event][i].apply(this, Array.prototype.slice.call(arguments, 1))\n }\n }\n}\n"],"names":["isObject","val","Object","prototype","toString","call","createElement","nodeName","attrs","dom","document","attr","innerHTML","setAttribute","flush","el","NodeList","forEach","e","button","className","page","text","class","html","sortItems","a","b","c","d","length","f","value","g","h","i","Rows","constructor","dt","rows","this","build","row","tr","headings","map","td","data","appendChild","render","add","Array","isArray","push","hasRows","update","columns","rebuild","remove","select","sort","splice","dataIndex","findRowIndex","columnIndex","findIndex","children","innerText","toLowerCase","includes","String","findRow","index","cols","cells","r","updateRow","Columns","swap","x","y","order","s","cell","temp","column","getAttribute","cloneNode","originalCellIndex","sortable","hiddenColumns","searchIndex","undefined","activeHeadings","activeRows","hide","show","indexOf","visible","th","isNaN","insert","heading","hiddenHeader","type","format","hasOwnProperty","renderHeader","removeChild","filter","dir","init","terms","filterState","originalData","filters","rowFilter","filteredRows","from","content","hasAttribute","clear","setMessage","options","labels","noRows","emit","hasHeadings","filterTerms","textContent","sorting","alpha","numeric","n","waitFor","import","then","parseDate","date","Promise","all","importedFunctions","parseFunction","top","btm","num","replace","parseFloat","Number","classList","contains","lastTh","concat","indexes","v","searchData","cellIndex","dataToTable","thead","tbody","col","Error","tHead","tBodies","defaultConfig","searchable","paging","perPage","perPageSelect","nextPrev","firstLast","prevText","nextText","firstText","lastText","ellipsisText","ascText","descText","truncatePager","pagerDelta","scrollY","fixedColumns","fixedHeight","header","footer","placeholder","noResults","info","layout","bottom","DataTable","table","querySelector","initialized","initialLayout","initialSortable","listeners","onResize","event","static","prop","assign","currentPage","onFirstPage","columnRenderers","selectedColumns","setTimeout","plugins","entries","plugin","enabled","renderPage","renderPager","template","body","head","foot","tFoot","t","insertBefore","slice","wrapper","wrap","selected","option","Option","outerHTML","form","paginatorWrapper","paginator","container","pagers","querySelectorAll","label","parentNode","replaceChild","rect","getBoundingClientRect","setColumns","fixHeight","fixColumns","bindEvents","totalPages","frag","createDocumentFragment","pages","onLastPage","lastPage","items","current","searching","string","prev","next","pager","links","ellipsis","j","k","l","truncate","p","firstElementChild","link","href","selector","addEventListener","parseInt","input","search","target","closest","preventDefault","window","width","ajax","renderer","hidden","destroy","removeEventListener","paginate","hd","columnWidths","style","height","headerTable","totalOffsetWidth","reduce","total","offsetWidth","ow","w","paddingTop","paddingBottom","border","parentElement","headercontainer","thd","paddingRight","clientWidth","scrollHeight","clientHeight","overflowY","widths","query","idx","inArray","split","bool","word","sortColumn","direction","refresh","parent","export","userOptions","headers","arr","str","download","skipColumn","lineDelimiter","columnDelimiter","tableName","replacer","space","selection","trim","substring","JSON","stringify","filename","encodeURI","click","obj","removeDoubleQuotes","shift","values","json","parse","isJson","print","open","message","colspan","on","callback","events","off","apply","arguments"],"mappings":"AAIO,MAAMA,EAAWC,GAA+C,oBAAxCC,OAAOC,UAAUC,SAASC,KAAKJ,GAuBjDK,EAAgB,CAACC,EAAUC,KACpC,MAAMC,EAAMC,SAASJ,cAAcC,GACnC,GAAIC,GAAS,iBAAmBA,EAC5B,IAAK,MAAMG,KAAQH,EACX,SAAWG,EACXF,EAAIG,UAAYJ,EAAMG,GAEtBF,EAAII,aAAaF,EAAMH,EAAMG,IAIzC,OAAOF,GAGEK,EAAQC,IACbA,aAAcC,SACdD,EAAGE,SAAQC,GAAKJ,EAAMI,KAEtBH,EAAGH,UAAY,IAWVO,EAAS,CAACC,EAAWC,EAAMC,IAAShB,EAC7C,KACA,CACIiB,MAAOH,EACPI,KAAO,0BAAyBH,MAASC,UAOpCG,EAAY,CAACC,EAAGC,KACzB,IAAIC,EACAC,EACA,IAAMF,GACNC,EAAI,EACJC,EAAIH,EAAEI,SAEK,IAAPH,IACAC,EAAIF,EAAEI,OAAS,EACfD,GAAK,GAGb,IAAK,IAAIX,GAAI,EAAIA,GAAI,CACjBA,GAAI,EACJ,IAAK,IAAIa,EAAIH,EAAGG,GAAKF,EAAGE,GAAKJ,EACzB,GAAID,EAAEK,EAAIJ,IAAMD,EAAEK,GAAGC,MAAQN,EAAEK,EAAIJ,GAAGK,MAAO,CACzC,MAAMC,EAAIP,EAAEK,GACNG,EAAIR,EAAEK,EAAIJ,GACVQ,EAAIF,EACVP,EAAEK,GAAKG,EACPR,EAAEK,EAAIJ,GAAKQ,EACXjB,GAAI,GAIhB,OAAOQ,GCtFJ,MAAMU,EACTC,YAAYC,EAAIC,GAIZ,OAHAC,KAAKF,GAAKA,EACVE,KAAKD,KAAOA,EAELC,KAQXC,MAAMC,GACF,MAAMC,EAAKrC,EAAc,MAEzB,IAAIsC,EAAWJ,KAAKF,GAAGM,SAqBvB,OAnBKA,EAASd,SACVc,EAAWF,EAAIG,KAAI,IAAM,MAG7BD,EAAS3B,SAAQ,CAACiB,EAAGC,KACjB,MAAMW,EAAKxC,EAAc,MAGpBoC,EAAIP,IAAOO,EAAIP,GAAGL,SACnBY,EAAIP,GAAK,IAGbW,EAAGlC,UAAY8B,EAAIP,GAEnBW,EAAGC,KAAOL,EAAIP,GAEdQ,EAAGK,YAAYF,MAGZH,EAGXM,OAAOP,GACH,OAAOA,EAOXQ,IAAIH,GACA,GAAII,MAAMC,QAAQL,GAAO,CACrB,MAAMT,EAAKE,KAAKF,GAEZa,MAAMC,QAAQL,EAAK,IACnBA,EAAK9B,SAAQyB,IACTJ,EAAGS,KAAKM,KAAKb,KAAKC,MAAMC,OAG5BJ,EAAGS,KAAKM,KAAKb,KAAKC,MAAMM,IAIvBT,EAAGS,KAAKjB,SACTQ,EAAGgB,SAAU,GAIjBd,KAAKe,SAELjB,EAAGkB,UAAUC,WAUrBC,OAAOC,GACH,MAAMrB,EAAKE,KAAKF,GAEZa,MAAMC,QAAQO,IAEdA,EAAOC,MAAK,CAAClC,EAAGC,IAAMA,EAAID,IAE1BiC,EAAO1C,SAAQyB,IACXJ,EAAGS,KAAKc,OAAOnB,EAAK,OAEP,OAAViB,EACPrB,EAAGS,KAAO,GAEVT,EAAGS,KAAKc,OAAOF,EAAQ,GAIrBrB,EAAGS,KAAKjB,SACVQ,EAAGgB,SAAU,GAGjBd,KAAKe,SACLjB,EAAGkB,UAAUC,UAOjBF,SACIf,KAAKF,GAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KACvBO,EAAIoB,UAAY3B,KAUxB4B,aAAaC,EAAahC,GAGtB,OAAOQ,KAAKF,GAAGS,KAAKkB,WAChBtB,GAAMA,EAAGuB,SAASF,GAAaG,UAAUC,cAAcC,SAASC,OAAOtC,GAAOoC,iBAUtFG,QAAQP,EAAahC,GAEjB,MAAMwC,EAAQhC,KAAKuB,aAAaC,EAAahC,GAE7C,GAAIwC,EAAQ,EACR,MAAO,CACHA,OAAQ,EACR9B,IAAK,KACL+B,KAAM,IAId,MAAM/B,EAAMF,KAAKF,GAAGS,KAAKyB,GAIzB,MAAO,CACHA,MAAAA,EACA9B,IAAAA,EACA+B,KALS,IAAI/B,EAAIgC,OAAO7B,KAAI8B,GAAKA,EAAE/D,aAe3CgE,UAAUjB,EAAQZ,GACd,MAAML,EAAMF,KAAKC,MAAMM,GACvBP,KAAKF,GAAGS,KAAKc,OAAOF,EAAQ,EAAGjB,GAC/BF,KAAKe,SACLf,KAAKF,GAAGkB,UAAUC,WCrKnB,MAAMoB,EACTxC,YAAYC,GAER,OADAE,KAAKF,GAAKA,EACHE,KAOXsC,KAAKtB,GACD,GAAIA,EAAQ1B,QAA6B,IAAnB0B,EAAQ1B,OAAc,CACxC,MAAM2C,EAAO,GAGbjC,KAAKF,GAAGM,SAAS3B,SAAQ,CAACiB,EAAGC,KACzBsC,EAAKpB,KAAKlB,MAGd,MAAM4C,EAAIvB,EAAQ,GACZwB,EAAIxB,EAAQ,GACZ7B,EAAI8C,EAAKO,GACfP,EAAKO,GAAKP,EAAKM,GACfN,EAAKM,GAAKpD,EAEVa,KAAKyC,MAAMR,IAQnBQ,MAAMzB,GACF,IAAI9B,EACAC,EACAC,EACAC,EACAK,EACAgD,EACAC,EAEJ,MAAMC,EAAO,CACT,GACA,GACA,GACA,IAGE9C,EAAKE,KAAKF,GAGhBkB,EAAQvC,SAAQ,CAACoE,EAAQN,KACrB7C,EAAII,EAAGM,SAASyC,GAChBH,EAAwC,UAApChD,EAAEoD,aAAa,iBACnB5D,EAAIQ,EAAEqD,WAAU,GAChB7D,EAAE8D,kBAAoBT,EACtBrD,EAAE+D,SAAWP,EAEbE,EAAK,GAAG/B,KAAK3B,GAERY,EAAGoD,cAAcrB,SAASgB,KAC3B1D,EAAIO,EAAEqD,WAAU,GAChB5D,EAAE6D,kBAAoBT,EACtBpD,EAAE8D,SAAWP,EAEbE,EAAK,GAAG/B,KAAK1B,OAKrBW,EAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KAClBP,EAAIc,EAAI6C,WAAU,GAClB1D,EAAIa,EAAI6C,WAAU,GAElB3D,EAAEkC,UAAYjC,EAAEiC,UAAY3B,EAEJ,OAApBO,EAAIiD,kBAA4CC,IAApBlD,EAAIiD,cAChC/D,EAAE+D,YAAc9D,EAAE8D,YAAcjD,EAAIiD,aAIxCnC,EAAQvC,SAAQoE,IACZF,EAAOzC,EAAIgC,MAAMW,GAAQE,WAAU,GACnCJ,EAAKpC,KAAOL,EAAIgC,MAAMW,GAAQtC,KAC9BnB,EAAEoB,YAAYmC,GAET7C,EAAGoD,cAAcrB,SAASgB,KAC3BF,EAAOzC,EAAIgC,MAAMW,GAAQE,WAAU,GACnCJ,EAAKpC,KAAOL,EAAIgC,MAAMW,GAAQtC,KAC9BlB,EAAEmB,YAAYmC,OAItBC,EAAK,GAAG/B,KAAKzB,GACbwD,EAAK,GAAG/B,KAAKxB,MAGjBS,EAAGM,SAAWwC,EAAK,GACnB9C,EAAGuD,eAAiBT,EAAK,GAEzB9C,EAAGS,KAAOqC,EAAK,GACf9C,EAAGwD,WAAaV,EAAK,GAGrB9C,EAAGiB,SAOPwC,KAAKvC,GACD,GAAIA,EAAQ1B,OAAQ,CAChB,MAAMQ,EAAKE,KAAKF,GAEhBkB,EAAQvC,SAAQoE,IACP/C,EAAGoD,cAAcrB,SAASgB,IAC3B/C,EAAGoD,cAAcrC,KAAKgC,MAI9B7C,KAAKiB,WAQbuC,KAAKxC,GACD,GAAIA,EAAQ1B,OAAQ,CAChB,IAAI0C,EACJ,MAAMlC,EAAKE,KAAKF,GAEhBkB,EAAQvC,SAAQoE,IACZb,EAAQlC,EAAGoD,cAAcO,QAAQZ,GAC7Bb,GAAS,GACTlC,EAAGoD,cAAc7B,OAAOW,EAAO,MAIvChC,KAAKiB,WAQbyC,QAAQ1C,GACJ,IAAIiB,EACJ,MAAMnC,EAAKE,KAAKF,GAahB,OAXAkB,EAAUA,GAAWlB,EAAGM,SAASC,KAAIsD,GAAMA,EAAGX,oBAEzCY,MAAM5C,GAEAL,MAAMC,QAAQI,KACrBiB,EAAO,GACPjB,EAAQvC,SAAQoE,IACZZ,EAAKpB,MAAMf,EAAGoD,cAAcrB,SAASgB,QAJzCZ,GAAQnC,EAAGoD,cAAcrB,SAASb,GAQ/BiB,EAOXvB,IAAIH,GACA,IAAID,EACJ,MAAMqD,EAAKzF,SAASJ,cAAc,MAElC,IAAKkC,KAAKF,GAAGM,SAASd,OAMlB,OALAU,KAAKF,GAAG+D,OAAO,CACXzD,SAAU,CAACG,EAAKuD,SAChBvD,KAAMA,EAAKA,KAAKF,KAAIV,GAAK,CAACA,YAE9BK,KAAKiB,UAIJjB,KAAKF,GAAGiE,aAOTJ,EAAGvF,UAAY,GANXmC,EAAKuD,QAAQ/F,SACb4F,EAAGnD,YAAYD,EAAKuD,SAEpBH,EAAGvF,UAAYmC,EAAKuD,QAM5B9D,KAAKF,GAAGM,SAASS,KAAK8C,GAEtB3D,KAAKF,GAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KACnBY,EAAKA,KAAKZ,KACVW,EAAKpC,SAASJ,cAAc,MAExByC,EAAKA,KAAKZ,GAAG5B,SACbuC,EAAGE,YAAYD,EAAKA,KAAKZ,IAEzBW,EAAGlC,UAAYmC,EAAKA,KAAKZ,GAG7BW,EAAGC,KAAOD,EAAGlC,UAETmC,EAAKE,SACLH,EAAGlC,UAAYmC,EAAKE,OAAO5C,KAAKmC,KAAMM,EAAGC,KAAMD,EAAIJ,IAGvDA,EAAIM,YAAYF,OAIpBC,EAAKyD,MACLL,EAAGtF,aAAa,YAAakC,EAAKyD,MAElCzD,EAAK0D,QACLN,EAAGtF,aAAa,cAAekC,EAAK0D,QAGpC1D,EAAK2D,eAAe,cACpBP,EAAGV,SAAW1C,EAAK0C,SACnBU,EAAGtF,aAAa,iBAAmC,IAAlBkC,EAAK0C,SAAoB,OAAS,UAGvEjD,KAAKiB,UAELjB,KAAKF,GAAGqE,eAQZjD,OAAOC,GACCR,MAAMC,QAAQO,IAEdA,EAAOC,MAAK,CAAClC,EAAGC,IAAMA,EAAID,IAC1BiC,EAAO1C,SAAQoE,GAAU7C,KAAKkB,OAAO2B,OAErC7C,KAAKF,GAAGM,SAASiB,OAAOF,EAAQ,GAEhCnB,KAAKF,GAAGS,KAAK9B,SAAQyB,IACjBA,EAAIkE,YAAYlE,EAAIgC,MAAMf,QAIlCnB,KAAKiB,UAUToD,OAAOxB,EAAQyB,EAAKC,EAAMC,GACtB,MAAM1E,EAAKE,KAAKF,GAUhB,GAPMA,EAAG2E,cACL3E,EAAG2E,YAAc,CACbC,aAAc5E,EAAGS,QAKnBT,EAAG2E,YAAY5B,GAAU,CAG3B,MAAM8B,EAAU,IAAIH,EAAO,KAAM,GAEjC1E,EAAG2E,YAAY5B,GACX,WACI,IAAIlD,EAAI,EACR,MAAO,IAAMgF,EAAQhF,IAAOgF,EAAQrF,QAFxC,GAQR,MAAMsF,EAAY9E,EAAG2E,YAAY5B,KAC3BgC,EAAelE,MAAMmE,KAAKhF,EAAG2E,YAAYC,cAAcL,QAAOlE,IAChE,MAAMwC,EAAOxC,EAAG+B,MAAMW,GAChBkC,EAAUpC,EAAKqC,aAAa,gBAAkBrC,EAAKG,aAAa,gBAAkBH,EAAKhB,UAG7F,MAA8B,mBAAfiD,EAA4BA,EAAUG,GAAWA,IAAYH,KAGhF9E,EAAGS,KAAOsE,EAEL/E,EAAGS,KAAKjB,QAKTU,KAAKiB,UACLnB,EAAGiB,WALHjB,EAAGmF,QACHnF,EAAGgB,SAAU,EACbhB,EAAGoF,WAAWpF,EAAGqF,QAAQC,OAAOC,SAM/Bd,GACDzE,EAAGwF,KAAK,iBAAkBzC,EAAQyB,GAU1ClD,KAAKyB,EAAQyB,EAAKC,GACd,MAAMzE,EAAKE,KAAKF,GAGhB,GAAIA,EAAGyF,cAAgB1C,EAAS,GAAKA,EAAS/C,EAAGM,SAASd,QACtD,OAAO,EAIX,MAAMkG,EAAc1F,EAAGqF,QAAQR,SACzB7E,EAAGqF,QAAQR,QAAQ7E,EAAGM,SAASyC,GAAQ4C,aAC7C,GAAKD,GAAsC,IAAvBA,EAAYlG,OAE5B,YADAU,KAAKqE,OAAOxB,EAAQyB,EAAKC,EAAMiB,GAInC1F,EAAG4F,SAAU,EAERnB,GACDzE,EAAGwF,KAAK,oBAAqBzC,EAAQyB,GAGzC,IAAIvE,EAAOD,EAAGS,KACd,MAAMoF,EAAQ,GACRC,EAAU,GAChB,IAAI1G,EAAI,EACJ2G,EAAI,EACR,MAAMlC,EAAK7D,EAAGM,SAASyC,GAEjBiD,EAAU,GAGhB,GAAqC,SAAjCnC,EAAGb,aAAa,aAAyB,CACzC,IAAImB,GAAS,EACKN,EAAGqB,aAAa,iBAG9Bf,EAASN,EAAGb,aAAa,gBAE7BgD,EAAQjF,KAAKkF,OAAO,sBAAUC,MAAK,EAAEC,UAAAA,KAAeC,GAAQD,EAAUC,EAAMjC,MAGhFkC,QAAQC,IAAIN,GAASE,MAAKK,IACtB,MAAMC,EAAgBD,EAAkB,GAkCxC,IAAIE,EACAC,EAlCJ7F,MAAMmE,KAAK/E,GAAMtB,SAAQ0B,IACrB,MAAMwC,EAAOxC,EAAG+B,MAAMW,GAChBkC,EAAUpC,EAAKqC,aAAa,gBAAkBrC,EAAKG,aAAa,gBAAkBH,EAAKhB,UAC7F,IAAI8E,EAEAA,EADAH,EACMA,EAAcvB,GACI,iBAAVA,EACRA,EAAQ2B,QAAQ,eAAgB,IAEhC3B,EAGN4B,WAAWF,IAAQA,EACnBb,EAAQC,KAAO,CACXrG,MAAOoH,OAAOH,GACdvG,IAAKC,GAGTwF,EAAMzG,KAAO,CACTM,MAAwB,iBAAVuF,EAAqBA,EAAQnD,cAAgBmD,EAC3D7E,IAAKC,MAMZmE,IAEGA,EADAX,EAAGkD,UAAUC,SAAS,OAChB,OAEA,OAKH,QAAPxC,GACAiC,EAAMtH,EAAU0G,GAAQ,GACxBa,EAAMvH,EAAU2G,GAAU,GAC1BjC,EAAGkD,UAAU3F,OAAO,OACpByC,EAAGkD,UAAUnG,IAAI,UAEjB6F,EAAMtH,EAAU2G,EAAS,GACzBY,EAAMvH,EAAU0G,EAAO,GACvBhC,EAAGkD,UAAU3F,OAAO,QACpByC,EAAGkD,UAAUnG,IAAI,QAIjBZ,EAAGiH,QAAUpD,GAAM7D,EAAGiH,SACtBjH,EAAGiH,OAAOF,UAAU3F,OAAO,QAC3BpB,EAAGiH,OAAOF,UAAU3F,OAAO,QAG/BpB,EAAGiH,OAASpD,EAGZ5D,EAAOwG,EAAIS,OAAOR,GAElB1G,EAAGS,KAAO,GACV,MAAM0G,EAAU,GAEhBlH,EAAKtB,SAAQ,CAACyI,EAAGvH,KACbG,EAAGS,KAAKM,KAAKqG,EAAEhH,KAEW,OAAtBgH,EAAEhH,IAAIiD,kBAA8CC,IAAtB8D,EAAEhH,IAAIiD,aACpC8D,EAAQpG,KAAKlB,MAIrBG,EAAGqH,WAAaF,EAEhBjH,KAAKiB,UAELnB,EAAGiB,SAEEwD,GACDzE,EAAGwF,KAAK,iBAAkBzC,EAAQyB,MAS9CrD,UACI,IAAI/B,EACAC,EACAC,EACAC,EACJ,MAAMS,EAAKE,KAAKF,GACV8C,EAAO,GAEb9C,EAAGwD,WAAa,GAChBxD,EAAGuD,eAAiB,GAEpBvD,EAAGM,SAAS3B,SAAQ,CAACkF,EAAIhE,KACrBgE,EAAGX,kBAAoBrD,EACvBgE,EAAGV,SAAgD,UAArCU,EAAGb,aAAa,iBACzBhD,EAAGoD,cAAcrB,SAASlC,IAC3BG,EAAGuD,eAAexC,KAAK8C,MAK/B7D,EAAGS,KAAK9B,SAAQ,CAACyB,EAAKP,KAClBT,EAAIgB,EAAI6C,WAAU,GAClB5D,EAAIe,EAAI6C,WAAU,GAElB7D,EAAEoC,UAAYnC,EAAEmC,UAAY3B,EAEJ,OAApBO,EAAIiD,kBAA4CC,IAApBlD,EAAIiD,cAChCjE,EAAEiE,YAAchE,EAAEgE,YAAcjD,EAAIiD,aAIxCxC,MAAMmE,KAAK5E,EAAIgC,OAAOzD,SAAQkE,IAC1BvD,EAAIuD,EAAKI,WAAU,GACnB3D,EAAEmB,KAAOoC,EAAKpC,KACdrB,EAAEsB,YAAYpB,GAETU,EAAGoD,cAAcrB,SAASzC,EAAEgI,aAC7B/H,EAAID,EAAE2D,WAAU,GAChB1D,EAAEkB,KAAOnB,EAAEmB,KACXpB,EAAEqB,YAAYnB,OAKtBuD,EAAK/B,KAAK3B,GACVY,EAAGwD,WAAWzC,KAAK1B,MAGvBW,EAAGS,KAAOqC,EAEV9C,EAAGiB,UCnfJ,MAAMsG,EAAc,SAAU9G,GACjC,IAAI+G,GAAQ,EACRC,GAAQ,EAIZ,IAFAhH,EAAOA,GAAQP,KAAKmF,QAAQ5E,MAEnBH,SAAU,CACfkH,EAAQxJ,EAAc,SACtB,MAAMqC,EAAKrC,EAAc,MACzByC,EAAKH,SAAS3B,SAAQ+I,IAClB,MAAMlH,EAAKxC,EAAc,KAAM,CAC3BkB,KAAMwI,IAEVrH,EAAGK,YAAYF,MAGnBgH,EAAM9G,YAAYL,GAGlBI,EAAKA,MAAQA,EAAKA,KAAKjB,SACvBiI,EAAQzJ,EAAc,SACtByC,EAAKA,KAAK9B,SAAQsB,IACd,GAAIQ,EAAKH,UACDG,EAAKH,SAASd,SAAWS,EAAKT,OAC9B,MAAM,IAAImI,MACN,2DAIZ,MAAMtH,EAAKrC,EAAc,MACzBiC,EAAKtB,SAAQe,IACT,MAAMc,EAAKxC,EAAc,KAAM,CAC3BkB,KAAMQ,IAEVW,EAAGK,YAAYF,MAEnBiH,EAAM/G,YAAYL,OAItBmH,IACuB,OAAnBtH,KAAK/B,IAAIyJ,OACT1H,KAAK/B,IAAImG,YAAYpE,KAAK/B,IAAIyJ,OAElC1H,KAAK/B,IAAIuC,YAAY8G,IAGrBC,IACIvH,KAAK/B,IAAI0J,QAAQrI,QACjBU,KAAK/B,IAAImG,YAAYpE,KAAK/B,IAAI0J,QAAQ,IAE1C3H,KAAK/B,IAAIuC,YAAY+G,KCpDhBK,EAAgB,CACzB3E,UAAU,EACV4E,YAAY,EAGZC,QAAQ,EACRC,QAAS,GACTC,cAAe,CAAC,EAAG,GAAI,GAAI,GAAI,IAC/BC,UAAU,EACVC,WAAW,EACXC,SAAU,WACVC,SAAU,WACVC,UAAW,UACXC,SAAU,UACVC,aAAc,WACdC,QAAS,IACTC,SAAU,IACVC,eAAe,EACfC,WAAY,EAEZC,QAAS,GAETC,cAAc,EACdC,aAAa,EAEbC,QAAQ,EACRhF,cAAc,EACdiF,QAAQ,EAGR5D,OAAQ,CACJ6D,YAAa,YACblB,QAAS,4BACT1C,OAAQ,mBACR6D,UAAW,qCACXC,KAAM,8CAIVC,OAAQ,CACJ7C,IAAK,mBACL8C,OAAQ,kBC/BT,MAAMC,EACTzJ,YAAY0J,EAAOpE,EAAU,IAEzB,MAAMlH,EAAuB,iBAAVsL,EAAqBrL,SAASsL,cAAcD,GAASA,EAkCxE,GA/BAvJ,KAAKmF,QAAU,IACRyC,KACAzC,EACHiE,OAAQ,IACDxB,EAAcwB,UACdjE,EAAQiE,QAEfhE,OAAQ,IACDwC,EAAcxC,UACdD,EAAQC,SAInBpF,KAAKyJ,aAAc,EAEnBzJ,KAAK0J,cAAgBzL,EAAIG,UACzB4B,KAAK2J,gBAAkB3J,KAAKmF,QAAQlC,SAG/BjD,KAAKmF,QAAQ4D,SACd/I,KAAKmF,QAAQlC,UAAW,GAGV,OAAdhF,EAAIyJ,SACC1H,KAAKmF,QAAQ5E,MACbP,KAAKmF,QAAQ5E,OAASP,KAAKmF,QAAQ5E,KAAKH,YAEzCJ,KAAKmF,QAAQlC,UAAW,GAI5BhF,EAAI0J,QAAQrI,SAAWrB,EAAI0J,QAAQ,GAAG5H,KAAKT,QACvCU,KAAKmF,QAAQ5E,OACRP,KAAKmF,QAAQ5E,KAAKA,KACnB,MAAM,IAAIkH,MACN,0EAMhBzH,KAAK/B,IAAMA,EAEX+B,KAAKuJ,MAAQvJ,KAAK/B,IAElB+B,KAAK4J,UAAY,CACbC,SAAUC,GAAS9J,KAAK6J,SAASC,IAGrC9J,KAAKuE,OASIwF,cAACC,EAAMvM,GACG,mBAARA,EACP6L,EAAU3L,UAAUqM,GAAQvM,EAE5B6L,EAAUU,GAAQvM,EAS1B8G,KAAKY,GACD,GAAInF,KAAKyJ,aAAezJ,KAAK/B,IAAI4I,UAAUC,SAAS,mBAChD,OAAO,EAGXpJ,OAAOuM,OAAOjK,KAAKmF,QAASA,GAAW,IAEvCnF,KAAKkK,YAAc,EACnBlK,KAAKmK,aAAc,EAEnBnK,KAAKkD,cAAgB,GACrBlD,KAAKoK,gBAAkB,GACvBpK,KAAKqK,gBAAkB,GAEvBrK,KAAKS,SAEL6J,YAAW,KACPtK,KAAKsF,KAAK,kBACVtF,KAAKyJ,aAAc,EAEfzJ,KAAKmF,QAAQoF,SACb7M,OAAO8M,QAAQxK,KAAKmF,QAAQoF,SAAS9L,SAAQ,EAAEgM,EAAQtF,MAC/CnF,KAAKyK,IAAmC,mBAAjBzK,KAAKyK,KAC5BzK,KAAKyK,GAAUzK,KAAKyK,GAAQtF,EAAS,CAACrH,cAAAA,IAGlCqH,EAAQuF,SAAW1K,KAAKyK,GAAQlG,MAAqC,mBAAtBvE,KAAKyK,GAAQlG,MAC5DvE,KAAKyK,GAAQlG,aAK9B,IAQP9D,OAAOuD,GACH,GAAIA,EAAM,CACN,OAAQA,GACR,IAAK,OACDhE,KAAK2K,aACL,MACJ,IAAK,QACD3K,KAAK4K,cACL,MACJ,IAAK,SACD5K,KAAKmE,eAIT,OAAO,EAGX,MAAMgB,EAAUnF,KAAKmF,QACrB,IAAI0F,EAAW,GAqBf,GAlBI1F,EAAQ5E,MACR8G,EAAYxJ,KAAKmC,MAIrBA,KAAK8K,KAAO9K,KAAK/B,IAAI0J,QAAQ,GAC7B3H,KAAK+K,KAAO/K,KAAK/B,IAAIyJ,MACrB1H,KAAKgL,KAAOhL,KAAK/B,IAAIgN,MAEhBjL,KAAK8K,OACN9K,KAAK8K,KAAOhN,EAAc,SAE1BkC,KAAK/B,IAAIuC,YAAYR,KAAK8K,OAG9B9K,KAAKc,QAAUd,KAAK8K,KAAK/K,KAAKT,OAAS,GAGlCU,KAAK+K,KAAM,CACZ,MAAMrL,EAAI5B,EAAc,SAClBoN,EAAIpN,EAAc,MAEpBkC,KAAKc,UACLH,MAAMmE,KAAK9E,KAAK8K,KAAK/K,KAAK,GAAGmC,OAAOzD,SAAQ,KACxCyM,EAAE1K,YAAY1C,EAAc,UAGhC4B,EAAEc,YAAY0K,IAGlBlL,KAAK+K,KAAOrL,EAEZM,KAAK/B,IAAIkN,aAAanL,KAAK+K,KAAM/K,KAAK8K,MAEtC9K,KAAK+D,aAAeoB,EAAQpB,aAsDhC,GAnDA/D,KAAKI,SAAW,GAChBJ,KAAKuF,YAAcvF,KAAK+K,KAAKhL,KAAKT,OAAS,EAEvCU,KAAKuF,cACLvF,KAAK+I,OAAS/I,KAAK+K,KAAKhL,KAAK,GAC7BC,KAAKI,SAAW,GAAGgL,MAAMvN,KAAKmC,KAAK+I,OAAO7G,QAIzCiD,EAAQ4D,QACL/I,KAAK+K,MACL/K,KAAK/B,IAAImG,YAAYpE,KAAK/B,IAAIyJ,OAKlCvC,EAAQ6D,OACJhJ,KAAK+K,OAAS/K,KAAKgL,OACnBhL,KAAKgL,KAAOlN,EAAc,QAAS,CAC/BkB,KAAMgB,KAAK+K,KAAK3M,YAEpB4B,KAAK/B,IAAIuC,YAAYR,KAAKgL,OAG1BhL,KAAKgL,MACLhL,KAAK/B,IAAImG,YAAYpE,KAAK/B,IAAIgN,OAKtCjL,KAAKqL,QAAUvN,EAAc,MAAO,CAChCiB,MAAO,wCAIX8L,GAAY,8BACZA,GAAY1F,EAAQiE,OAAO7C,IAC3BsE,GAAY,SACR1F,EAAQyD,QAAQtJ,OAChBuL,GAAa,mDAAkD1F,EAAQyD,qCAEvEiC,GAAY,0CAEhBA,GAAY,iCACZA,GAAY1F,EAAQiE,OAAOC,OAC3BwB,GAAY,SAGZA,EAAWA,EAASnE,QAAQ,SAAUvB,EAAQ2C,OAAS,qCAAuC,IAG1F3C,EAAQ2C,QAAU3C,EAAQ6C,cAAe,CACzC,IAAIsD,EAAO,0CACXA,GAAQnG,EAAQC,OAAO2C,QACvBuD,GAAQ,iBAGR,MAAMnK,EAASrD,EAAc,SAAU,CACnCiB,MAAO,uBAIXoG,EAAQ6C,cAAcvJ,SAAQhB,IAC1B,MAAM8N,EAAW9N,IAAQ0H,EAAQ4C,QAC3ByD,EAAS,IAAIC,OAAOhO,EAAKA,EAAK8N,EAAUA,GAC9CpK,EAAOT,IAAI8K,MAIfF,EAAOA,EAAK5E,QAAQ,WAAYvF,EAAOuK,WAGvCb,EAAWA,EAASnE,QAAQ,WAAY4E,QAExCT,EAAWA,EAASnE,QAAQ,WAAY,IAI5C,GAAIvB,EAAQ0C,WAAY,CACpB,MAAM8D,EACD,6EAA4ExG,EAAQC,OAAO6D,kCAGhG4B,EAAWA,EAASnE,QAAQ,WAAYiF,QAExCd,EAAWA,EAASnE,QAAQ,WAAY,IAGxC1G,KAAKuF,aAELvF,KAAKS,OAAO,UAIhBT,KAAK/B,IAAI4I,UAAUnG,IAAI,mBAGvB,MAAMkL,EAAmB9N,EAAc,MAAO,CAC1CiB,MAAO,yBAEL8M,EAAY/N,EAAc,KAAM,CAClCiB,MAAO,8BAEX6M,EAAiBpL,YAAYqL,GAG7BhB,EAAWA,EAASnE,QAAQ,aAAckF,EAAiBF,WAC3D1L,KAAKqL,QAAQjN,UAAYyM,EAEzB7K,KAAK8L,UAAY9L,KAAKqL,QAAQ7B,cAAc,wBAE5CxJ,KAAK+L,OAAS/L,KAAKqL,QAAQW,iBAAiB,8BAE5ChM,KAAKiM,MAAQjM,KAAKqL,QAAQ7B,cAAc,mBAGxCxJ,KAAK/B,IAAIiO,WAAWC,aAAanM,KAAKqL,QAASrL,KAAK/B,KACpD+B,KAAK8L,UAAUtL,YAAYR,KAAK/B,KAGhC+B,KAAKoM,KAAOpM,KAAK/B,IAAIoO,wBAGrBrM,KAAKO,KAAOI,MAAMmE,KAAK9E,KAAK8K,KAAK/K,MACjCC,KAAKsD,WAAatD,KAAKO,KAAK6K,QAC5BpL,KAAKqD,eAAiBrD,KAAKI,SAASgL,QAGpCpL,KAAKe,SAGLf,KAAKsM,aAILtM,KAAKuM,YAGLvM,KAAKwM,aAGArH,EAAQ4D,QACT/I,KAAKqL,QAAQxE,UAAUnG,IAAI,aAG1ByE,EAAQ6D,QACThJ,KAAKqL,QAAQxE,UAAUnG,IAAI,aAG3ByE,EAAQlC,UACRjD,KAAKqL,QAAQxE,UAAUnG,IAAI,YAG3ByE,EAAQ0C,YACR7H,KAAKqL,QAAQxE,UAAUnG,IAAI,cAG3ByE,EAAQ2D,aACR9I,KAAKqL,QAAQxE,UAAUnG,IAAI,gBAG3ByE,EAAQ0D,cACR7I,KAAKqL,QAAQxE,UAAUnG,IAAI,iBAG/BV,KAAKyM,aAOT9B,aAQI,GAPI3K,KAAKuF,cACLjH,EAAM0B,KAAK+I,QAEX/I,KAAKqD,eAAe5E,SAAQkF,GAAM3D,KAAK+I,OAAOvI,YAAYmD,MAI1D3D,KAAKc,SAAWd,KAAK0M,WAAY,CAC7B1M,KAAKkK,YAAclK,KAAK0M,aACxB1M,KAAKkK,YAAc,GAIvB,MAAMlI,EAAQhC,KAAKkK,YAAc,EAE3ByC,EAAOzO,SAAS0O,yBACtB5M,KAAK6M,MAAM7K,GAAOvD,SAAQyB,GAAOyM,EAAKnM,YAAYR,KAAKD,OAAOU,OAAOP,MAErEF,KAAKiF,MAAM0H,GAEX3M,KAAKmK,YAAmC,IAArBnK,KAAKkK,YACxBlK,KAAK8M,WAAa9M,KAAKkK,cAAgBlK,KAAK+M,cAE5C/M,KAAKkF,WAAWlF,KAAKmF,QAAQC,OAAOC,QAIxC,IAII2H,EAJAC,EAAU,EAEV1N,EAAI,EACJ2L,EAAI,EAWR,GARIlL,KAAK0M,aACLO,EAAUjN,KAAKkK,YAAc,EAC7B3K,EAAI0N,EAAUjN,KAAKmF,QAAQ4C,QAC3BmD,EAAI3L,EAAIS,KAAK6M,MAAMI,GAAS3N,OAC5BC,GAAQ,EACRyN,EAAQhN,KAAKkN,UAAYlN,KAAKmH,WAAW7H,OAASU,KAAKO,KAAKjB,QAG5DU,KAAKiM,OAASjM,KAAKmF,QAAQC,OAAO+D,KAAK7J,OAAQ,CAE/C,MAAM6N,EAASnN,KAAKmF,QAAQC,OAAO+D,KAC9BzC,QAAQ,UAAWnH,GACnBmH,QAAQ,QAASwE,GACjBxE,QAAQ,SAAU1G,KAAKkK,aACvBxD,QAAQ,UAAW1G,KAAK0M,YACxBhG,QAAQ,SAAUsG,GAEvBhN,KAAKiM,MAAM7N,UAAY4O,EAAQG,EAAS,GAGpB,GAApBnN,KAAKkK,aACLlK,KAAKuM,YAQb3B,cAGI,GAFAtM,EAAM0B,KAAK+L,QAEP/L,KAAK0M,WAAa,EAAG,CACrB,MAAMtN,EAAI,QACJuN,EAAOzO,SAAS0O,yBAChBQ,EAAOpN,KAAKmK,YAAc,EAAInK,KAAKkK,YAAc,EACjDmD,EAAOrN,KAAK8M,WAAa9M,KAAK0M,WAAa1M,KAAKkK,YAAc,EAGhElK,KAAKmF,QAAQ+C,WACbyE,EAAKnM,YAAY7B,EAAOS,EAAG,EAAGY,KAAKmF,QAAQkD,YAI3CrI,KAAKmF,QAAQ8C,WAAajI,KAAKmK,aAC/BwC,EAAKnM,YAAY7B,EAAOS,EAAGgO,EAAMpN,KAAKmF,QAAQgD,WAGlD,IAAImF,EAAQtN,KAAKuN,MAGbvN,KAAKmF,QAAQuD,gBACb4E,EL7VQ,EAACpO,EAAGC,EAAGC,EAAGC,EAAGmO,KAEjC,IAAIC,EACJ,MAAM/O,EAAI,GAFVW,EAAIA,GAAK,GAGT,IAAIE,EAAIJ,EAAIE,EACRI,EAAIN,EAAIE,EACZ,MAAMK,EAAI,GACJC,EAAI,GACNR,EAAI,EAAIE,EAAIX,EACZe,EAAI,EAAIf,EACDS,EAAIC,GAAK,EAAIC,EAAIX,KACxBa,EAAIH,GAAK,EAAIV,IAEjB,IAAK,IAAIgP,EAAI,EAAGA,GAAKtO,EAAGsO,IACpB,GAAI,GAAKA,GAAKA,GAAKtO,GAAMsO,GAAKnO,GAAKmO,GAAKjO,EAAI,CACxC,MAAMkO,EAAIzO,EAAEwO,EAAI,GAChBC,EAAE9G,UAAU3F,OAAO,UACnBxB,EAAEmB,KAAK8M,GAoBf,OAjBAjO,EAAEjB,SAAQW,IACN,MAAMC,EAAID,EAAEsC,SAAS,GAAGoB,aAAa,aACrC,GAAI2K,EAAG,CACH,MAAM/O,EAAI+O,EAAE/L,SAAS,GAAGoB,aAAa,aACrC,GAAIzD,EAAIX,GAAK,EAAGiB,EAAEkB,KAAK3B,EAAER,SACpB,GAAIW,EAAIX,GAAK,EAAG,CACjB,MAAMa,EAAIzB,EAAc,KAAM,CAC1BiB,MAAO,WACPC,KAAO,eAAcwO,UAEzB7N,EAAEkB,KAAKtB,IAGfI,EAAEkB,KAAKzB,GACPqO,EAAIrO,KAGDO,GKwTaiO,CACJ5N,KAAKuN,MACLvN,KAAKkK,YACLlK,KAAK6M,MAAMvN,OACXU,KAAKmF,QAAQwD,WACb3I,KAAKmF,QAAQoD,eAKrBvI,KAAKuN,MAAMvN,KAAKkK,YAAc,GAAGrD,UAAUnG,IAAI,UAG/C4M,EAAM7O,SAAQoP,IACVA,EAAEhH,UAAU3F,OAAO,UACnByL,EAAKnM,YAAYqN,MAGrB7N,KAAKuN,MAAMvN,KAAKkK,YAAc,GAAGrD,UAAUnG,IAAI,UAG3CV,KAAKmF,QAAQ8C,WAAajI,KAAK8M,YAC/BH,EAAKnM,YAAY7B,EAAOS,EAAGiO,EAAMrN,KAAKmF,QAAQiD,WAI9CpI,KAAKmF,QAAQ+C,WACbyE,EAAKnM,YAAY7B,EAAOS,EAAGY,KAAK0M,WAAY1M,KAAKmF,QAAQmD,WAI7DtI,KAAK+L,OAAOtN,SAAQ6O,IAChBA,EAAM9M,YAAYmM,EAAK5J,WAAU,QAS7CoB,eACInE,KAAKoF,OAAS,GAEVpF,KAAKI,UAAYJ,KAAKI,SAASd,QAC/BU,KAAKI,SAAS3B,SAAQ,CAACkF,EAAIhE,KAWvB,GATAK,KAAKoF,OAAOzF,GAAKgE,EAAG8B,YAEhB9B,EAAGmK,mBAAqBnK,EAAGmK,kBAAkBjH,UAAUC,SAAS,sBAChEnD,EAAGvF,UAAYuF,EAAGmK,kBAAkB1P,WAGxCuF,EAAGV,SAAgD,UAArCU,EAAGb,aAAa,iBAE9Ba,EAAGX,kBAAoBrD,EACnBK,KAAKmF,QAAQlC,UAAYU,EAAGV,SAAU,CACtC,MAAM8K,EAAOjQ,EAAc,IAAK,CAC5BkQ,KAAM,IACNjP,MAAO,mBACPC,KAAM2E,EAAGvF,YAGbuF,EAAGvF,UAAY,GACfuF,EAAGtF,aAAa,gBAAiB,IACjCsF,EAAGnD,YAAYuN,OAK3B/N,KAAKwM,aAOTC,aACI,MAAMtH,EAAUnF,KAAKmF,QAErB,GAAIA,EAAQ6C,cAAe,CACvB,MAAMiG,EAAWjO,KAAKqL,QAAQ7B,cAAc,uBACxCyE,GAEAA,EAASC,iBAAiB,UAAU,KAChC/I,EAAQ4C,QAAUoG,SAASF,EAASzO,MAAO,IAC3CQ,KAAKe,SAELf,KAAKuM,YAELvM,KAAKsF,KAAK,oBAAqBH,EAAQ4C,YACxC,GAKP5C,EAAQ0C,aACR7H,KAAKoO,MAAQpO,KAAKqL,QAAQ7B,cAAc,oBACpCxJ,KAAKoO,OACLpO,KAAKoO,MAAMF,iBAAiB,SAAS,IAAMlO,KAAKqO,OAAOrO,KAAKoO,MAAM5O,SAAQ,IAKlFQ,KAAKqL,QAAQ6C,iBAAiB,SAASxP,IACnC,MAAMwM,EAAIxM,EAAE4P,OAAOC,QAAQ,KACvBrD,GAAmC,MAA7BA,EAAEnN,SAAS6D,gBACbsJ,EAAElG,aAAa,cACfhF,KAAKnB,KAAKqM,EAAEpI,aAAa,cACzBpE,EAAE8P,kBAEFrJ,EAAQlC,UACRiI,EAAErE,UAAUC,SAAS,qBACyB,SAA9CoE,EAAEgB,WAAWpJ,aAAa,mBAE1B9C,KAAKgB,UAAUI,KAAKpB,KAAKI,SAASqD,QAAQyH,EAAEgB,aAC5CxN,EAAE8P,sBAGX,GAEHC,OAAOP,iBAAiB,SAAUlO,KAAK4J,UAAUC,UAMrDA,WACI7J,KAAKoM,KAAOpM,KAAK8L,UAAUO,wBACtBrM,KAAKoM,KAAKsC,OAIf1O,KAAKwM,aAOTF,WAAWqC,GAEFA,GACD3O,KAAKO,KAAK9B,SAAQyB,IACdS,MAAMmE,KAAK5E,EAAIgC,OAAOzD,SAAQkE,IAC1BA,EAAKpC,KAAOoC,EAAKvE,gBAMzB4B,KAAKmF,QAAQnE,SAAWhB,KAAKI,SAASd,QAEtCU,KAAKmF,QAAQnE,QAAQvC,SAAQ8B,IAGpBI,MAAMC,QAAQL,EAAKY,UACpBZ,EAAKY,OAAS,CAACZ,EAAKY,SAGpBZ,EAAK2D,eAAe,WAAoC,mBAAhB3D,EAAKE,SAC7CT,KAAKqK,gBAAkBrK,KAAKqK,gBAAgBrD,OAAOzG,EAAKY,QAExDnB,KAAKoK,gBAAgBvJ,KAAK,CACtBG,QAAST,EAAKY,OACdyN,SAAUrO,EAAKE,UAKvBF,EAAKY,OAAO1C,SAAQoE,IAChB,MAAMc,EAAK3D,KAAKI,SAASyC,GACpBc,IAGDpD,EAAKyD,MACLL,EAAGtF,aAAa,YAAakC,EAAKyD,MAElCzD,EAAK0D,QACLN,EAAGtF,aAAa,cAAekC,EAAK0D,QAEpC1D,EAAK2D,eAAe,aACpBP,EAAGtF,aAAa,gBAAiBkC,EAAK0C,UAGtC1C,EAAK2D,eAAe,YACA,IAAhB3D,EAAKsO,QACL7O,KAAKgB,UAAUuC,KAAK,CAACV,IAIzBtC,EAAK2D,eAAe,SAAkC,IAAvB3D,EAAKY,OAAO7B,QAC3CU,KAAKgB,UAAUI,KAAKb,EAAKY,OAAO,GAAIZ,EAAKa,MAAM,UAM3DpB,KAAKc,UACLd,KAAKO,KAAK9B,SAAQ,CAACyB,EAAKP,KACpBO,EAAIoB,UAAY3B,EAChBgB,MAAMmE,KAAK5E,EAAIgC,OAAOzD,SAAQkE,IAC1BA,EAAKpC,KAAOoC,EAAKvE,gBAIrB4B,KAAKqK,gBAAgB/K,QACrBU,KAAKO,KAAK9B,SAAQyB,IACdS,MAAMmE,KAAK5E,EAAIgC,OAAOzD,SAAQ,CAACkE,EAAMhD,KAC7BK,KAAKqK,gBAAgBxI,SAASlC,IAC9BK,KAAKoK,gBAAgB3L,SAAQ0G,IACrBA,EAAQnE,QAAQa,SAASlC,KACzBgD,EAAKvE,UAAY+G,EAAQyJ,SAAS/Q,KAAKmC,KAAM2C,EAAKpC,KAAMoC,EAAMzC,aAQtFF,KAAKgB,UAAUC,WAGnBjB,KAAKS,OAAO,UAOhBqO,UACI9O,KAAK/B,IAAIG,UAAY4B,KAAK0J,cAG1B1J,KAAK/B,IAAI4I,UAAU3F,OAAO,mBAG1BlB,KAAKqL,QAAQa,WAAWC,aAAanM,KAAK/B,IAAK+B,KAAKqL,SAEpDrL,KAAKyJ,aAAc,EAEnBgF,OAAOM,oBAAoB,SAAU/O,KAAK4J,UAAUC,UAOxD9I,SACIf,KAAKqL,QAAQxE,UAAU3F,OAAO,mBAE9BlB,KAAKgP,SAAShP,MACdA,KAAKS,OAAO,QAEZT,KAAKuN,MAAQ,GAEb,IAAI5N,EAAIK,KAAK6M,MAAMvN,OACnB,KAAOK,KAAK,CACR,MAAM8G,EAAM9G,EAAI,EAChBK,KAAKuN,MAAM5N,GAAKhB,EAAa,IAANgB,EAAU,SAAW,GAAI8G,EAAKA,GAGzDzG,KAAK0F,SAAU,EAEf1F,KAAKS,OAAO,SAEZT,KAAKD,OAAOgB,SAEZf,KAAKsF,KAAK,oBAOd0J,WACI,MAAMjH,EAAU/H,KAAKmF,QAAQ4C,QAC7B,IAAIhI,EAAOC,KAAKsD,WAmBhB,OAjBItD,KAAKkN,YACLnN,EAAO,GAEPC,KAAKmH,WAAW1I,SAAQuD,GAASjC,EAAKc,KAAKb,KAAKsD,WAAWtB,OAG3DhC,KAAKmF,QAAQ2C,OAEb9H,KAAK6M,MAAQ9M,EACRM,KAAI,CAACF,EAAIR,IAAMA,EAAIoI,GAAY,EAAIhI,EAAKqL,MAAMzL,EAAGA,EAAIoI,GAAW,OAChE1D,QAAOxF,GAAQA,IAEpBmB,KAAK6M,MAAQ,CAAC9M,GAGlBC,KAAK0M,WAAa1M,KAAK+M,SAAW/M,KAAK6M,MAAMvN,OAEtCU,KAAK0M,WAOhBF,aAEI,IAAKxM,KAAKmF,QAAQyD,QAAQtJ,QAAUU,KAAKmF,QAAQ0D,eAAiB7I,KAAKqD,gBAAkBrD,KAAKqD,eAAe/D,OAAQ,CACjH,IAAI4C,EACA+M,GAAK,EAKT,GAJAjP,KAAKkP,aAAe,GAIhBlP,KAAK/B,IAAIyJ,MAAO,CAEZ1H,KAAKmF,QAAQyD,QAAQtJ,SACrB2P,EAAKnR,EAAc,SACnBmR,EAAGzO,YAAY1C,EAAc,OAC7BmR,EAAGE,MAAMC,OAAS,MACdpP,KAAKqP,cAELrP,KAAK/B,IAAIyJ,MAAQ1H,KAAKqP,YAAY3H,QAK1C1H,KAAKqD,eAAe5E,SAAQkE,IACxBA,EAAKwM,MAAMT,MAAQ,MAGvB,MAAMY,EAAmBtP,KAAKqD,eAAekM,QACzC,CAACC,EAAO7M,IAAS6M,EAAQ7M,EAAK8M,aAC9B,GAkBJ,GAfAzP,KAAKqD,eAAe5E,SAAQ,CAACkE,EAAMhD,KAC/B,MAAM+P,EAAK/M,EAAK8M,YACVE,EAAID,EAAKJ,EAAmB,IAGlC,GAFA3M,EAAKwM,MAAMT,MAAS,GAAEiB,KACtB3P,KAAKkP,aAAavP,GAAK+P,EACnB1P,KAAKmF,QAAQyD,QAAQtJ,OAAQ,CAC7B,MAAMqE,EAAK7F,EAAc,MACzBmR,EAAGnB,kBAAkBtN,YAAYmD,GACjCA,EAAGwL,MAAMT,MAAS,GAAEiB,KACpBhM,EAAGwL,MAAMS,WAAa,IACtBjM,EAAGwL,MAAMU,cAAgB,IACzBlM,EAAGwL,MAAMW,OAAS,QAItB9P,KAAKmF,QAAQyD,QAAQtJ,OAAQ,CAC7B,MAAMwM,EAAY9L,KAAK/B,IAAI8R,cAC3B,IAAK/P,KAAKqP,YAAa,CACnBrP,KAAKqP,YAAcvR,EAAc,QAAS,CACtCiB,MAAO,oBAEX,MAAMiR,EAAkBlS,EAAc,MAAO,CACzCiB,MAAO,8BAEXiR,EAAgBxP,YAAYR,KAAKqP,aACjCvD,EAAUiE,cAAc5E,aAAa6E,EAAiBlE,GAE1D,MAAMmE,EAAMjQ,KAAK/B,IAAIyJ,MACrB1H,KAAK/B,IAAIkO,aAAa8C,EAAIgB,GAC1BjQ,KAAKqP,YAAY3H,MAAQuI,EAGzBjQ,KAAKqP,YAAYU,cAAcZ,MAAMe,aAAgB,GACjDlQ,KAAKqP,YAAYc,YACjBnQ,KAAK/B,IAAIkS,YACThC,SACInO,KAAKqP,YAAYU,cAAcZ,MAAMe,cACrC,IACA,QAIJpE,EAAUsE,aAAetE,EAAUuE,eAEnCvE,EAAUqD,MAAMmB,UAAY,eAIjC,CACHpO,EAAQ,GAGR+M,EAAKnR,EAAc,SACnB,MAAMqE,EAAIrE,EAAc,MACxB6C,MAAMmE,KAAK9E,KAAK/B,IAAI0J,QAAQ,GAAG5H,KAAK,GAAGmC,OAAOzD,SAAQ,KAClD,MAAMkF,EAAK7F,EAAc,MACzBqE,EAAE3B,YAAYmD,GACdzB,EAAMrB,KAAK8C,MAGfsL,EAAGzO,YAAY2B,GACfnC,KAAK/B,IAAIkN,aAAa8D,EAAIjP,KAAK8K,MAE/B,MAAMyF,EAAS,GACfrO,EAAMzD,SAAQ,CAACkE,EAAMhD,KACjB,MAAM+P,EAAK/M,EAAK8M,YACVE,EAAID,EAAK1P,KAAKoM,KAAKsC,MAAQ,IACjC6B,EAAO1P,KAAK8O,GACZ3P,KAAKkP,aAAavP,GAAK+P,KAG3B1P,KAAKO,KAAK9B,SAAQyB,IACdS,MAAMmE,KAAK5E,EAAIgC,OAAOzD,SAAQ,CAACkE,EAAMhD,KAC7BK,KAAKgB,QAAQ2B,EAAKyE,WAAW1D,YAC7Bf,EAAKwM,MAAMT,MAAS,GAAE6B,EAAO5Q,aAKzCK,KAAK/B,IAAImG,YAAY6K,KASjC1C,YACQvM,KAAKmF,QAAQ2D,cACb9I,KAAK8L,UAAUqD,MAAMC,OAAS,KAC9BpP,KAAKoM,KAAOpM,KAAK8L,UAAUO,wBAC3BrM,KAAK8L,UAAUqD,MAAMC,OAAU,GAAEpP,KAAKoM,KAAKgD,YASnDf,OAAOmC,GACH,QAAKxQ,KAAKc,UAEV0P,EAAQA,EAAM5O,cAEd5B,KAAKkK,YAAc,EACnBlK,KAAKkN,WAAY,EACjBlN,KAAKmH,WAAa,GAEbqJ,EAAMlR,QAQXU,KAAKiF,QAELjF,KAAKO,KAAK9B,SAAQ,CAACyB,EAAKuQ,KACpB,MAAMC,EAAU1Q,KAAKmH,WAAWtF,SAAS3B,GAGlBsQ,EAAMG,MAAM,KAAKpB,QAAO,CAACqB,EAAMC,KAClD,IAAIhP,GAAW,EACXc,EAAO,KACPoC,EAAU,KAEd,IAAK,IAAIxC,EAAI,EAAGA,EAAIrC,EAAIgC,MAAM5C,OAAQiD,IAIlC,GAHAI,EAAOzC,EAAIgC,MAAMK,GACjBwC,EAAUpC,EAAKqC,aAAa,gBAAkBrC,EAAKG,aAAa,gBAAkBH,EAAK8C,YAGnFV,EAAQnD,cAAcC,SAASgP,IAC/B7Q,KAAKgB,QAAQ2B,EAAKyE,WAAW1D,UAC/B,CACE7B,GAAW,EACX,MAIR,OAAO+O,GAAQ/O,KAChB,KAEoB6O,GACnBxQ,EAAIiD,YAAcsN,EAClBzQ,KAAKmH,WAAWtG,KAAK4P,IAErBvQ,EAAIiD,YAAc,QAI1BnD,KAAKqL,QAAQxE,UAAUnG,IAAI,kBAEtBV,KAAKmH,WAAW7H,OAKjBU,KAAKe,UAJLf,KAAKqL,QAAQxE,UAAU3F,OAAO,kBAE9BlB,KAAKkF,WAAWlF,KAAKmF,QAAQC,OAAO8D,iBAKxClJ,KAAKsF,KAAK,mBAAoBkL,EAAOxQ,KAAKmH,cApDtCnH,KAAKkN,WAAY,EACjBlN,KAAKe,SACLf,KAAKsF,KAAK,mBAAoBkL,EAAOxQ,KAAKmH,YAC1CnH,KAAKqL,QAAQxE,UAAU3F,OAAO,mBACvB,IAwDfrC,KAAKA,GAED,OAAIA,GAAQmB,KAAKkK,cAIZtG,MAAM/E,KACPmB,KAAKkK,YAAciE,SAAStP,EAAM,OAGlCA,EAAOmB,KAAK6M,MAAMvN,QAAUT,EAAO,KAIvCmB,KAAKS,OAAO,QACZT,KAAKS,OAAO,cAEZT,KAAKsF,KAAK,iBAAkBzG,KAShCiS,WAAWjO,EAAQkO,GAEf/Q,KAAKgB,UAAUI,KAAKyB,EAAQkO,GAOhClN,OAAOtD,GACH,IAAIR,EAAO,GACX,GAAIvC,EAAS+C,GAAO,CAChB,GAAIA,EAAKH,WACAJ,KAAKuF,cAAgBvF,KAAKc,QAAS,CACpC,MAAMX,EAAKrC,EAAc,MACzByC,EAAKH,SAAS3B,SAAQqF,IAClB,MAAMH,EAAK7F,EAAc,KAAM,CAC3BkB,KAAM8E,IAGV3D,EAAGK,YAAYmD,MAEnB3D,KAAK+K,KAAKvK,YAAYL,GAEtBH,KAAK+I,OAAS5I,EACdH,KAAKI,SAAW,GAAGgL,MAAMvN,KAAKsC,EAAG+B,OACjClC,KAAKuF,aAAc,EAInBvF,KAAKmF,QAAQlC,SAAWjD,KAAK2J,gBAG7B3J,KAAKS,OAAO,UAGZT,KAAKqD,eAAiBrD,KAAKI,SAASgL,QAIxC7K,EAAKA,MAAQI,MAAMC,QAAQL,EAAKA,QAChCR,EAAOQ,EAAKA,WAETI,MAAMC,QAAQL,IACrBA,EAAK9B,SAAQyB,IACT,MAAMiC,EAAI,GACVzE,OAAO8M,QAAQtK,GAAKzB,SAAQ,EAAEqF,EAASnB,MAEnC,MAAMX,EAAQhC,KAAKoF,OAAO3B,QAAQK,GAE9B9B,GAAS,IACTG,EAAEH,GAASW,MAGnB5C,EAAKc,KAAKsB,MAIdpC,EAAKT,SACLU,KAAKD,OAAOW,IAAIX,GAEhBC,KAAKc,SAAU,GAGnBd,KAAKe,SACLf,KAAKsM,aACLtM,KAAKwM,aAOTwE,UACQhR,KAAKmF,QAAQ0C,aACb7H,KAAKoO,MAAM5O,MAAQ,GACnBQ,KAAKkN,WAAY,GAErBlN,KAAKkK,YAAc,EACnBlK,KAAKmK,aAAc,EACnBnK,KAAKe,SAELf,KAAKsF,KAAK,qBAQdL,MAAMjG,GACEgB,KAAK8K,MACLxM,EAAM0B,KAAK8K,MAGf,IAAImG,EAASjR,KAAK8K,KAKlB,GAJK9K,KAAK8K,OACNmG,EAASjR,KAAK/B,KAGde,EAAM,CACN,GAAoB,iBAATA,EAAmB,CACbd,SAAS0O,yBACjBxO,UAAYY,EAGrBiS,EAAOzQ,YAAYxB,IAS3BkS,OAAOC,GACH,IAAKnR,KAAKuF,cAAgBvF,KAAKc,QAAS,OAAO,EAE/C,MAAMsQ,EAAUpR,KAAKqD,eACrB,IAAItD,EAAO,GACX,MAAMsR,EAAM,GACZ,IAAI1R,EACA4C,EACA+O,EACAvD,EAmBJ,IAAKvQ,EAAS2T,GACV,OAAO,EAGX,MAAMhM,EAAU,CApBZoM,UAAU,EACVC,WAAY,GAGZC,cAAe,KACfC,gBAAiB,IAGjBC,UAAW,UAGXC,SAAU,KACVC,MAAO,KAUJV,GAGP,GAAIhM,EAAQnB,KAAM,CAOd,GANqB,QAAjBmB,EAAQnB,MAAmC,QAAjBmB,EAAQnB,OAElCjE,EAAK,GAAKC,KAAK+I,QAIf5D,EAAQ2M,UAER,GAAKlO,MAAMuB,EAAQ2M,YAEZ,GAAInR,MAAMC,QAAQuE,EAAQ2M,WAE7B,IAAKnS,EAAI,EAAGA,EAAIwF,EAAQ2M,UAAUxS,OAAQK,IACtCI,EAAOA,EAAKiH,OAAOhH,KAAK6M,MAAM1H,EAAQ2M,UAAUnS,GAAK,SAJzDI,EAAOA,EAAKiH,OAAOhH,KAAK6M,MAAM1H,EAAQ2M,UAAY,SAQtD/R,EAAOA,EAAKiH,OAAOhH,KAAKsD,YAI5B,GAAIvD,EAAKT,OAAQ,CACb,GAAqB,QAAjB6F,EAAQnB,MAAmC,QAAjBmB,EAAQnB,KAAgB,CAGlD,IAFAsN,EAAM,GAED3R,EAAI,EAAGA,EAAII,EAAKT,OAAQK,IAAK,CAC9B,IAAK4C,EAAI,EAAGA,EAAIxC,EAAKJ,GAAGuC,MAAM5C,OAAQiD,IAElC,IACK4C,EAAQqM,WAAW3P,SAASuP,EAAQ7O,GAAGS,oBACxChD,KAAKgB,QAAQoQ,EAAQ7O,GAAGS,mBAAmBU,UAC7C,CACE,IAAI5E,EAAOiB,EAAKJ,GAAGuC,MAAMK,GAAGkD,YAC5B3G,EAAOA,EAAKiT,OACZjT,EAAOA,EAAK4H,QAAQ,UAAW,KAC/B5H,EAAOA,EAAK4H,QAAQ,MAAO,MAC3B5H,EAAOA,EAAK4H,QAAQ,KAAM,MAE1B5H,EAAOA,EAAK4H,QAAQ,KAAM,OACtB5H,EAAK+C,SAAS,OACd/C,EAAQ,IAAGA,MAGfwS,GAAOxS,EAAOqG,EAAQuM,gBAI9BJ,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIhS,OAAS,GAG3CgS,GAAOnM,EAAQsM,cAInBH,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIhS,OAAS,GAEvC6F,EAAQoM,WACRD,EAAO,+BAA8BA,UAEtC,GAAqB,QAAjBnM,EAAQnB,KAAgB,CAK/B,IAHAsN,EAAO,iBAAgBnM,EAAQwM,gBAG1BhS,EAAI,EAAGA,EAAIyR,EAAQ9R,OAAQK,KAGvBwF,EAAQqM,WAAW3P,SAASuP,EAAQzR,GAAGqD,oBACxChD,KAAKgB,QAAQoQ,EAAQzR,GAAGqD,mBAAmBU,YAE3C4N,GAAQ,KAAIF,EAAQzR,GAAG8F,kBAW/B,IANA6L,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIhS,OAAS,GAG3CgS,GAAO,YAGF3R,EAAI,EAAGA,EAAII,EAAKT,OAAQK,IAAK,CAG9B,IAFA2R,GAAO,IAEF/O,EAAI,EAAGA,EAAIxC,EAAKJ,GAAGuC,MAAM5C,OAAQiD,KAG7B4C,EAAQqM,WAAW3P,SAASuP,EAAQ7O,GAAGS,oBACxChD,KAAKgB,QAAQoQ,EAAQ7O,GAAGS,mBAAmBU,YAE3C4N,GAAQ,IAAGvR,EAAKJ,GAAGuC,MAAMK,GAAGkD,iBAKpC6L,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIhS,OAAS,GAG3CgS,GAAO,KAIXA,EAAMA,EAAIS,OAAOC,UAAU,EAAGV,EAAIhS,OAAS,GAG3CgS,GAAO,IAEHnM,EAAQoM,WACRD,EAAO,sCAAqCA,UAE7C,GAAqB,SAAjBnM,EAAQnB,KAAiB,CAEhC,IAAKzB,EAAI,EAAGA,EAAIxC,EAAKT,OAAQiD,IAGzB,IAFA8O,EAAI9O,GAAK8O,EAAI9O,IAAM,GAEd5C,EAAI,EAAGA,EAAIyR,EAAQ9R,OAAQK,KAGvBwF,EAAQqM,WAAW3P,SAASuP,EAAQzR,GAAGqD,oBACxChD,KAAKgB,QAAQoQ,EAAQzR,GAAGqD,mBAAmBU,YAE3C2N,EAAI9O,GAAG6O,EAAQzR,GAAG8F,aAAe1F,EAAKwC,GAAGL,MAAMvC,GAAG8F,aAM9D6L,EAAMW,KAAKC,UAAUb,EAAKlM,EAAQyM,SAAUzM,EAAQ0M,OAEhD1M,EAAQoM,WACRD,EAAO,uCAAsCA,KA2BrD,OAtBInM,EAAQoM,WAERpM,EAAQgN,SAAWhN,EAAQgN,UAAY,mBACvChN,EAAQgN,UAAa,IAAGhN,EAAQnB,OAEhCsN,EAAMc,UAAUd,GAGhBvD,EAAO7P,SAASJ,cAAc,KAC9BiQ,EAAKC,KAAOsD,EACZvD,EAAKwD,SAAWpM,EAAQgN,SAGxBjU,SAAS4M,KAAKtK,YAAYuN,GAG1BA,EAAKsE,QAGLnU,SAAS4M,KAAK1G,YAAY2J,IAGvBuD,GAIf,OAAO,EAQXvL,OAAOoL,GACH,IAAImB,GAAM,EASV,IAAK9U,EAAS2T,GACV,OAAO,EAGX,MAAMhM,EAAU,CAVZsM,cAAe,KACfC,gBAAiB,IACjBa,oBAAoB,KAUjBpB,GAGP,GAAIhM,EAAQ5E,KAAKjB,QAAU9B,EAAS2H,EAAQ5E,MAAO,CAE/C,GAAqB,QAAjB4E,EAAQnB,KAAgB,CACxBsO,EAAM,CACF/R,KAAM,IAIV,MAAMR,EAAOoF,EAAQ5E,KAAKoQ,MAAMxL,EAAQsM,eAEpC1R,EAAKT,SAED6F,EAAQ/E,WACRkS,EAAIlS,SAAWL,EAAK,GAAG4Q,MAAMxL,EAAQuM,iBACjCvM,EAAQoN,qBACRD,EAAIlS,SAAWkS,EAAIlS,SAASC,KAAI3B,GAAKA,EAAEqT,OAAOrL,QAAQ,WAAY,OAEtE3G,EAAKyS,SAGTzS,EAAKtB,SAAQ,CAACyB,EAAKP,KACf2S,EAAI/R,KAAKZ,GAAK,GAGd,MAAM8S,EAASvS,EAAIyQ,MAAMxL,EAAQuM,iBAE7Be,EAAOnT,QACPmT,EAAOhU,SAAQe,IACP2F,EAAQoN,qBACR/S,EAAQA,EAAMuS,OAAOrL,QAAQ,WAAY,KAE7C4L,EAAI/R,KAAKZ,GAAGkB,KAAKrB,eAK9B,GAAqB,SAAjB2F,EAAQnB,KAAiB,CAChC,MAAM0O,ELj0CApB,CAAAA,IAClB,IAAIpG,GAAI,EACR,IACIA,EAAI+G,KAAKU,MAAMrB,GACjB,MAAO5S,GACL,OAAO,EAEX,QAAS,OAASwM,IAAOvK,MAAMC,QAAQsK,KAAO1N,EAAS0N,KAAQA,GK0zCtC0H,CAAOzN,EAAQ5E,MAGxBmS,IACAJ,EAAM,CACFlS,SAAU,GACVG,KAAM,IAGVmS,EAAKjU,SAAQ,CAAC8B,EAAMZ,KAChB2S,EAAI/R,KAAKZ,GAAK,GACdjC,OAAO8M,QAAQjK,GAAM9B,SAAQ,EAAEoE,EAAQrD,MAC9B8S,EAAIlS,SAASyB,SAASgB,IACvByP,EAAIlS,SAASS,KAAKgC,GAGtByP,EAAI/R,KAAKZ,GAAGkB,KAAKrB,UAQ7BhC,EAAS2H,EAAQ5E,QACjB+R,EAAMnN,EAAQ5E,MAGd+R,GAEAtS,KAAK6D,OAAOyO,GAIpB,OAAO,EAOXO,QACI,MAAMzS,EAAWJ,KAAKqD,eAChBtD,EAAOC,KAAKsD,WACZiG,EAAQzL,EAAc,SACtBwJ,EAAQxJ,EAAc,SACtByJ,EAAQzJ,EAAc,SAEtBqC,EAAKrC,EAAc,MACzBsC,EAAS3B,SAAQkF,IACbxD,EAAGK,YACC1C,EAAc,KAAM,CAChBkB,KAAM2E,EAAG8B,kBAKrB6B,EAAM9G,YAAYL,GAElBJ,EAAKtB,SAAQyB,IACT,MAAMC,EAAKrC,EAAc,MACzB6C,MAAMmE,KAAK5E,EAAIgC,OAAOzD,SAAQkE,IAC1BxC,EAAGK,YACC1C,EAAc,KAAM,CAChBkB,KAAM2D,EAAK8C,kBAIvB8B,EAAM/G,YAAYL,MAGtBoJ,EAAM/I,YAAY8G,GAClBiC,EAAM/I,YAAY+G,GAGlB,MAAMoI,EAAIlB,OAAOqE,OAGjBnD,EAAEzR,SAAS4M,KAAKtK,YAAY+I,GAG5BoG,EAAEkD,QAON3N,WAAW6N,GACP,IAAIC,EAAU,EAEVhT,KAAKc,QACLkS,EAAUhT,KAAKO,KAAK,GAAG2B,MAAM5C,OACtBU,KAAKqD,eAAe/D,SAC3B0T,EAAUhT,KAAKqD,eAAe/D,QAGlCU,KAAKqL,QAAQxE,UAAUnG,IAAI,mBAEvBV,KAAKiM,QACLjM,KAAKiM,MAAM7N,UAAY,IAE3B4B,KAAK0M,WAAa,EAClB1M,KAAKS,OAAO,SAEZT,KAAKiF,MACDnH,EAAc,KAAM,CAChBkB,KAAO,yCAAwCgU,MAAYD,YASvE/R,QAAQA,GACJ,OAAO,IAAIqB,EAAQrC,KAAMgB,GAO7BjB,KAAKA,GACD,OAAO,IAAIH,EAAKI,KAAMD,GAS1BkT,GAAGnJ,EAAOoJ,GACNlT,KAAKmT,OAASnT,KAAKmT,QAAU,GAC7BnT,KAAKmT,OAAOrJ,GAAS9J,KAAKmT,OAAOrJ,IAAU,GAC3C9J,KAAKmT,OAAOrJ,GAAOjJ,KAAKqS,GAS5BE,IAAItJ,EAAOoJ,GACPlT,KAAKmT,OAASnT,KAAKmT,QAAU,GACzBrJ,KAAS9J,KAAKmT,SAAW,GAC7BnT,KAAKmT,OAAOrJ,GAAOzI,OAAOrB,KAAKmT,OAAOrJ,GAAOrG,QAAQyP,GAAW,GAQpE5N,KAAKwE,GAED,GADA9J,KAAKmT,OAASnT,KAAKmT,QAAU,GACzBrJ,KAAS9J,KAAKmT,SAAW,EAC7B,IAAK,IAAIxT,EAAI,EAAGA,EAAIK,KAAKmT,OAAOrJ,GAAOxK,OAAQK,IAC3CK,KAAKmT,OAAOrJ,GAAOnK,GAAG0T,MAAMrT,KAAMW,MAAMhD,UAAUyN,MAAMvN,KAAKyV,UAAW"}