UNPKG

tablefilter

Version:

A Javascript library making HTML tables filterable and a bit more

17,620 lines • 582 kB
(function(global, factory) {
	typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.TableFilter = {}));
})(this, function(exports) {
	Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
	//#region \0rolldown/runtime.js
	var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
	//#endregion
	//#region libs/sortabletable.js?raw
	var sortabletable_default = "/*----------------------------------------------------------------------------\\\n|                            Sortable Table 1.12                              |\n|-----------------------------------------------------------------------------|\n|                         Created by Erik Arvidsson                           |\n|                  (http://webfx.eae.net/contact.html#erik)                   |\n|                      For WebFX (http://webfx.eae.net/)                      |\n|-----------------------------------------------------------------------------|\n| A DOM 1 based script that allows an ordinary HTML table to be sortable.     |\n|-----------------------------------------------------------------------------|\n|                  Copyright (c) 1998 - 2006 Erik Arvidsson                   |\n|-----------------------------------------------------------------------------|\n| Licensed under the Apache License, Version 2.0 (the \"License\"); you may not |\n| use this file except in compliance with the License.  You may obtain a copy |\n| of the License at http://www.apache.org/licenses/LICENSE-2.0                |\n| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |\n| Unless  required  by  applicable law or  agreed  to  in  writing,  software |\n| distributed under the License is distributed on an  \"AS IS\" BASIS,  WITHOUT |\n| WARRANTIES OR  CONDITIONS OF ANY KIND,  either express or implied.  See the |\n| License  for the  specific language  governing permissions  and limitations |\n| under the License.                                                          |\n|-----------------------------------------------------------------------------|\n| 2003-01-10 | First version                                                  |\n| 2003-01-19 | Minor changes to the date parsing                              |\n| 2003-01-28 | JScript 5.0 fixes (no support for 'in' operator)               |\n| 2003-02-01 | Sloppy typo like error fixed in getInnerText                   |\n| 2003-07-04 | Added workaround for IE cellIndex bug.                         |\n| 2003-11-09 | The bDescending argument to sort was not correctly working     |\n|            | Using onclick DOM0 event if no support for addEventListener    |\n|            | or attachEvent                                                 |\n| 2004-01-13 | Adding addSortType and removeSortType which makes it a lot     |\n|            | easier to add new, custom sort types.                          |\n| 2004-01-27 | Switch to use descending = false as the default sort order.    |\n|            | Change defaultDescending to suit your needs.                   |\n| 2004-03-14 | Improved sort type None look and feel a bit                    |\n| 2004-08-26 | Made the handling of tBody and tHead more flexible. Now you    |\n|            | can use another tHead or no tHead, and you can chose some      |\n|            | other tBody.                                                   |\n| 2006-04-25 | Changed license to Apache Software License 2.0                 |\n|-----------------------------------------------------------------------------|\n| Created 2003-01-10 | All changes are in the log above. | Updated 2006-04-25 |\n\\----------------------------------------------------------------------------*/\n\n\nfunction SortableTable(oTable, oSortTypes) {\n\n	this.sortTypes = oSortTypes || [];\n\n	this.sortColumn = null;\n	this.descending = null;\n\n	var oThis = this;\n	this._headerOnclick = function (e) {\n		oThis.headerOnclick(e);\n	};\n\n	if (oTable) {\n		this.setTable( oTable );\n		this.document = oTable.ownerDocument || oTable.document;\n	}\n	else {\n		this.document = document;\n	}\n\n\n	// only IE needs this\n	var win = this.document.defaultView || this.document.parentWindow;\n	this._onunload = function () {\n		oThis.destroy();\n	};\n	if (win && typeof win.attachEvent != \"undefined\") {\n		win.attachEvent(\"onunload\", this._onunload);\n	}\n}\n\nSortableTable.gecko = navigator.product == \"Gecko\";\nSortableTable.msie = /msie/i.test(navigator.userAgent);\n// Mozilla is faster when doing the DOM manipulations on\n// an orphaned element. MSIE is not\nSortableTable.removeBeforeSort = SortableTable.gecko;\n\nSortableTable.prototype.onsort = function () {};\n\n// default sort order. true -> descending, false -> ascending\nSortableTable.prototype.defaultDescending = false;\n\n// shared between all instances. This is intentional to allow external files\n// to modify the prototype\nSortableTable.prototype._sortTypeInfo = {};\n\nSortableTable.prototype.setTable = function (oTable) {\n	if ( this.tHead )\n		this.uninitHeader();\n	this.element = oTable;\n	this.setTHead( oTable.tHead );\n	this.setTBody( oTable.tBodies[0] );\n};\n\nSortableTable.prototype.setTHead = function (oTHead) {\n	if (this.tHead && this.tHead != oTHead )\n		this.uninitHeader();\n	this.tHead = oTHead;\n	this.initHeader( this.sortTypes );\n};\n\nSortableTable.prototype.setTBody = function (oTBody) {\n	this.tBody = oTBody;\n};\n\nSortableTable.prototype.setSortTypes = function ( oSortTypes ) {\n	if ( this.tHead )\n		this.uninitHeader();\n	this.sortTypes = oSortTypes || [];\n	if ( this.tHead )\n		this.initHeader( this.sortTypes );\n};\n\n// adds arrow containers and events\n// also binds sort type to the header cells so that reordering columns does\n// not break the sort types\nSortableTable.prototype.initHeader = function (oSortTypes) {\n	if (!this.tHead) return;\n	var cells = this.tHead.rows[0].cells;\n	var doc = this.tHead.ownerDocument || this.tHead.document;\n	this.sortTypes = oSortTypes || [];\n	var l = cells.length;\n	var img, c;\n	for (var i = 0; i < l; i++) {\n		c = cells[i];\n		if (this.sortTypes[i] != null && this.sortTypes[i] != \"None\") {\n			img = doc.createElement(\"IMG\");\n			img.src = \"images/blank.png\";\n			c.appendChild(img);\n			if (this.sortTypes[i] != null)\n				c._sortType = this.sortTypes[i];\n			if (typeof c.addEventListener != \"undefined\")\n				c.addEventListener(\"click\", this._headerOnclick, false);\n			else if (typeof c.attachEvent != \"undefined\")\n				c.attachEvent(\"onclick\", this._headerOnclick);\n			else\n				c.onclick = this._headerOnclick;\n		}\n		else\n		{\n			c.setAttribute( \"_sortType\", oSortTypes[i] );\n			c._sortType = \"None\";\n		}\n	}\n	this.updateHeaderArrows();\n};\n\n// remove arrows and events\nSortableTable.prototype.uninitHeader = function () {\n	if (!this.tHead) return;\n	var cells = this.tHead.rows[0].cells;\n	var l = cells.length;\n	var c;\n	for (var i = 0; i < l; i++) {\n		c = cells[i];\n		if (c._sortType != null && c._sortType != \"None\") {\n			c.removeChild(c.lastChild);\n			if (typeof c.removeEventListener != \"undefined\")\n				c.removeEventListener(\"click\", this._headerOnclick, false);\n			else if (typeof c.detachEvent != \"undefined\")\n				c.detachEvent(\"onclick\", this._headerOnclick);\n			c._sortType = null;\n			c.removeAttribute( \"_sortType\" );\n		}\n	}\n};\n\nSortableTable.prototype.updateHeaderArrows = function () {\n	if (!this.tHead) return;\n	var cells = this.tHead.rows[0].cells;\n	var l = cells.length;\n	var img;\n	for (var i = 0; i < l; i++) {\n		if (cells[i]._sortType != null && cells[i]._sortType != \"None\") {\n			img = cells[i].lastChild;\n			if (i == this.sortColumn)\n				img.className = \"sort-arrow \" + (this.descending ? \"descending\" : \"ascending\");\n			else\n				img.className = \"sort-arrow\";\n		}\n	}\n};\n\nSortableTable.prototype.headerOnclick = function (e) {\n	// find TD element\n	var el = e.target || e.srcElement;\n	while (el.tagName != \"TD\")\n		el = el.parentNode;\n\n	this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);\n};\n\n// IE returns wrong cellIndex when columns are hidden\nSortableTable.getCellIndex = function (oTd) {\n	var cells = oTd.parentNode.childNodes\n	var l = cells.length;\n	var i;\n	for (i = 0; cells[i] != oTd && i < l; i++)\n		;\n	return i;\n};\n\nSortableTable.prototype.getSortType = function (nColumn) {\n	return this.sortTypes[nColumn] || \"String\";\n};\n\n// only nColumn is required\n// if bDescending is left out the old value is taken into account\n// if sSortType is left out the sort type is found from the sortTypes array\n\nSortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {\n	if (!this.tBody) return;\n	if (sSortType == null)\n		sSortType = this.getSortType(nColumn);\n\n	// exit if None\n	if (sSortType == \"None\")\n		return;\n\n	if (bDescending == null) {\n		if (this.sortColumn != nColumn)\n			this.descending = this.defaultDescending;\n		else\n			this.descending = !this.descending;\n	}\n	else\n		this.descending = bDescending;\n\n	this.sortColumn = nColumn;\n\n	if (typeof this.onbeforesort == \"function\")\n		this.onbeforesort();\n\n	var f = this.getSortFunction(sSortType, nColumn);\n	var a = this.getCache(sSortType, nColumn);\n	var tBody = this.tBody;\n\n	a.sort(f);\n\n	if (this.descending)\n		a.reverse();\n\n	if (SortableTable.removeBeforeSort) {\n		// remove from doc\n		var nextSibling = tBody.nextSibling;\n		var p = tBody.parentNode;\n		p.removeChild(tBody);\n	}\n\n	// insert in the new order\n	var l = a.length;\n	for (var i = 0; i < l; i++)\n		tBody.appendChild(a[i].element);\n\n	if (SortableTable.removeBeforeSort) {\n		// insert into doc\n		p.insertBefore(tBody, nextSibling);\n	}\n\n	this.updateHeaderArrows();\n\n	this.destroyCache(a);\n\n	if (typeof this.onsort == \"function\")\n		this.onsort();\n};\n\nSortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {\n	var oThis = this;\n	this._asyncsort = function () {\n		oThis.sort(nColumn, bDescending, sSortType);\n	};\n	window.setTimeout(this._asyncsort, 1);\n};\n\nSortableTable.prototype.getCache = function (sType, nColumn) {\n	if (!this.tBody) return [];\n	var rows = this.tBody.rows;\n	var l = rows.length;\n	var a = new Array(l);\n	var r;\n	for (var i = 0; i < l; i++) {\n		r = rows[i];\n		a[i] = {\n			value:		this.getRowValue(r, sType, nColumn),\n			element:	r\n		};\n	};\n	return a;\n};\n\nSortableTable.prototype.destroyCache = function (oArray) {\n	var l = oArray.length;\n	for (var i = 0; i < l; i++) {\n		oArray[i].value = null;\n		oArray[i].element = null;\n		oArray[i] = null;\n	}\n};\n\nSortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {\n	// if we have defined a custom getRowValue use that\n	if (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)\n		return this._sortTypeInfo[sType].getRowValue(oRow, nColumn);\n\n	var s;\n	var c = oRow.cells[nColumn];\n	if (typeof c.innerText != \"undefined\")\n		s = c.innerText;\n	else\n		s = SortableTable.getInnerText(c);\n	return this.getValueFromString(s, sType);\n};\n\nSortableTable.getInnerText = function (oNode) {\n	var s = \"\";\n	var cs = oNode.childNodes;\n	var l = cs.length;\n	for (var i = 0; i < l; i++) {\n		switch (cs[i].nodeType) {\n			case 1: //ELEMENT_NODE\n				s += SortableTable.getInnerText(cs[i]);\n				break;\n			case 3:	//TEXT_NODE\n				s += cs[i].nodeValue;\n				break;\n		}\n	}\n	return s;\n};\n\nSortableTable.prototype.getValueFromString = function (sText, sType) {\n	if (this._sortTypeInfo[sType])\n		return this._sortTypeInfo[sType].getValueFromString( sText );\n	return sText;\n	/*\n	switch (sType) {\n		case \"Number\":\n			return Number(sText);\n		case \"CaseInsensitiveString\":\n			return sText.toUpperCase();\n		case \"Date\":\n			var parts = sText.split(\"-\");\n			var d = new Date(0);\n			d.setFullYear(parts[0]);\n			d.setDate(parts[2]);\n			d.setMonth(parts[1] - 1);\n			return d.valueOf();\n	}\n	return sText;\n	*/\n	};\n\nSortableTable.prototype.getSortFunction = function (sType, nColumn) {\n	if (this._sortTypeInfo[sType])\n		return this._sortTypeInfo[sType].compare;\n	return SortableTable.basicCompare;\n};\n\nSortableTable.prototype.destroy = function () {\n	this.uninitHeader();\n	var win = this.document.parentWindow;\n	if (win && typeof win.detachEvent != \"undefined\") {	// only IE needs this\n		win.detachEvent(\"onunload\", this._onunload);\n	}\n	this._onunload = null;\n	this.element = null;\n	this.tHead = null;\n	this.tBody = null;\n	this.document = null;\n	this._headerOnclick = null;\n	this.sortTypes = null;\n	this._asyncsort = null;\n	this.onsort = null;\n};\n\n// Adds a sort type to all instance of SortableTable\n// sType : String - the identifier of the sort type\n// fGetValueFromString : function ( s : string ) : T - A function that takes a\n//    string and casts it to a desired format. If left out the string is just\n//    returned\n// fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort\n//    compare function. Takes two values and compares them. If left out less than,\n//    <, compare is used\n// fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function\n//    that takes the row and the column index and returns the value used to compare.\n//    If left out then the innerText is first taken for the cell and then the\n//    fGetValueFromString is used to convert that string the desired value and type\n\nSortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {\n	this._sortTypeInfo[sType] = {\n		type:				sType,\n		getValueFromString:	fGetValueFromString || SortableTable.idFunction,\n		compare:			fCompareFunction || SortableTable.basicCompare,\n		getRowValue:		fGetRowValue\n	};\n};\n\n// this removes the sort type from all instances of SortableTable\nSortableTable.prototype.removeSortType = function (sType) {\n	delete this._sortTypeInfo[sType];\n};\n\nSortableTable.basicCompare = function compare(n1, n2) {\n	if (n1.value < n2.value)\n		return -1;\n	if (n2.value < n1.value)\n		return 1;\n	return 0;\n};\n\nSortableTable.idFunction = function (x) {\n	return x;\n};\n\nSortableTable.toUpperCase = function (s) {\n	return s.toUpperCase();\n};\n\nSortableTable.toDate = function (s) {\n	var parts = s.split(\"-\");\n	var d = new Date(0);\n	d.setFullYear(parts[0]);\n	d.setDate(parts[2]);\n	d.setMonth(parts[1] - 1);\n	return d.valueOf();\n};\n\n\n// add sort types\nSortableTable.prototype.addSortType(\"Number\", Number);\nSortableTable.prototype.addSortType(\"CaseInsensitiveString\", SortableTable.toUpperCase);\nSortableTable.prototype.addSortType(\"Date\", SortableTable.toDate);\nSortableTable.prototype.addSortType(\"String\");\n// None is a special case\n";
	//#endregion
	//#region src/string.js
	var import_diacritics = (/* @__PURE__ */ __commonJSMin(((exports) => {
		exports.remove = removeDiacritics;
		var replacementList = [
			{
				base: " ",
				chars: "\xA0"
			},
			{
				base: "0",
				chars: "߀"
			},
			{
				base: "A",
				chars: "ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ"
			},
			{
				base: "AA",
				chars: "Ꜳ"
			},
			{
				base: "AE",
				chars: "ÆǼǢ"
			},
			{
				base: "AO",
				chars: "Ꜵ"
			},
			{
				base: "AU",
				chars: "Ꜷ"
			},
			{
				base: "AV",
				chars: "ꜸꜺ"
			},
			{
				base: "AY",
				chars: "Ꜽ"
			},
			{
				base: "B",
				chars: "ⒷBḂḄḆɃƁ"
			},
			{
				base: "C",
				chars: "ⒸCꜾḈĆCĈĊČÇƇȻ"
			},
			{
				base: "D",
				chars: "ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ"
			},
			{
				base: "Dh",
				chars: "Ð"
			},
			{
				base: "DZ",
				chars: "DZDŽ"
			},
			{
				base: "Dz",
				chars: "DzDž"
			},
			{
				base: "E",
				chars: "ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ"
			},
			{
				base: "F",
				chars: "ꝼⒻFḞƑꝻ"
			},
			{
				base: "G",
				chars: "ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ"
			},
			{
				base: "H",
				chars: "ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ"
			},
			{
				base: "I",
				chars: "ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ"
			},
			{
				base: "J",
				chars: "ⒿJĴɈȷ"
			},
			{
				base: "K",
				chars: "ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ"
			},
			{
				base: "L",
				chars: "ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ"
			},
			{
				base: "LJ",
				chars: "LJ"
			},
			{
				base: "Lj",
				chars: "Lj"
			},
			{
				base: "M",
				chars: "ⓂMḾṀṂⱮƜϻ"
			},
			{
				base: "N",
				chars: "ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ"
			},
			{
				base: "NJ",
				chars: "NJ"
			},
			{
				base: "Nj",
				chars: "Nj"
			},
			{
				base: "O",
				chars: "ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ"
			},
			{
				base: "OE",
				chars: "Œ"
			},
			{
				base: "OI",
				chars: "Ƣ"
			},
			{
				base: "OO",
				chars: "Ꝏ"
			},
			{
				base: "OU",
				chars: "Ȣ"
			},
			{
				base: "P",
				chars: "ⓅPṔṖƤⱣꝐꝒꝔ"
			},
			{
				base: "Q",
				chars: "ⓆQꝖꝘɊ"
			},
			{
				base: "R",
				chars: "ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ"
			},
			{
				base: "S",
				chars: "ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ"
			},
			{
				base: "T",
				chars: "ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ"
			},
			{
				base: "Th",
				chars: "Þ"
			},
			{
				base: "TZ",
				chars: "Ꜩ"
			},
			{
				base: "U",
				chars: "ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ"
			},
			{
				base: "V",
				chars: "ⓋVṼṾƲꝞɅ"
			},
			{
				base: "VY",
				chars: "Ꝡ"
			},
			{
				base: "W",
				chars: "ⓌWẀẂŴẆẄẈⱲ"
			},
			{
				base: "X",
				chars: "ⓍXẊẌ"
			},
			{
				base: "Y",
				chars: "ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ"
			},
			{
				base: "Z",
				chars: "ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ"
			},
			{
				base: "a",
				chars: "ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ"
			},
			{
				base: "aa",
				chars: "ꜳ"
			},
			{
				base: "ae",
				chars: "æǽǣ"
			},
			{
				base: "ao",
				chars: "ꜵ"
			},
			{
				base: "au",
				chars: "ꜷ"
			},
			{
				base: "av",
				chars: "ꜹꜻ"
			},
			{
				base: "ay",
				chars: "ꜽ"
			},
			{
				base: "b",
				chars: "ⓑbḃḅḇƀƃɓƂ"
			},
			{
				base: "c",
				chars: "cⓒćĉċčçḉƈȼꜿↄ"
			},
			{
				base: "d",
				chars: "ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ"
			},
			{
				base: "dh",
				chars: "ð"
			},
			{
				base: "dz",
				chars: "dzdž"
			},
			{
				base: "e",
				chars: "ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ"
			},
			{
				base: "f",
				chars: "ⓕfḟƒ"
			},
			{
				base: "ff",
				chars: "ff"
			},
			{
				base: "fi",
				chars: "fi"
			},
			{
				base: "fl",
				chars: "fl"
			},
			{
				base: "ffi",
				chars: "ffi"
			},
			{
				base: "ffl",
				chars: "ffl"
			},
			{
				base: "g",
				chars: "ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ"
			},
			{
				base: "h",
				chars: "ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ"
			},
			{
				base: "hv",
				chars: "ƕ"
			},
			{
				base: "i",
				chars: "ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı"
			},
			{
				base: "j",
				chars: "ⓙjĵǰɉ"
			},
			{
				base: "k",
				chars: "ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ"
			},
			{
				base: "l",
				chars: "ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ"
			},
			{
				base: "lj",
				chars: "lj"
			},
			{
				base: "m",
				chars: "ⓜmḿṁṃɱɯ"
			},
			{
				base: "n",
				chars: "ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ"
			},
			{
				base: "nj",
				chars: "nj"
			},
			{
				base: "o",
				chars: "ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ"
			},
			{
				base: "oe",
				chars: "œ"
			},
			{
				base: "oi",
				chars: "ƣ"
			},
			{
				base: "oo",
				chars: "ꝏ"
			},
			{
				base: "ou",
				chars: "ȣ"
			},
			{
				base: "p",
				chars: "ⓟpṕṗƥᵽꝑꝓꝕρ"
			},
			{
				base: "q",
				chars: "ⓠqɋꝗꝙ"
			},
			{
				base: "r",
				chars: "ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ"
			},
			{
				base: "s",
				chars: "ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ"
			},
			{
				base: "ss",
				chars: "ß"
			},
			{
				base: "t",
				chars: "ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ"
			},
			{
				base: "th",
				chars: "þ"
			},
			{
				base: "tz",
				chars: "ꜩ"
			},
			{
				base: "u",
				chars: "ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ"
			},
			{
				base: "v",
				chars: "ⓥvṽṿʋꝟʌ"
			},
			{
				base: "vy",
				chars: "ꝡ"
			},
			{
				base: "w",
				chars: "ⓦwẁẃŵẇẅẘẉⱳ"
			},
			{
				base: "x",
				chars: "ⓧxẋẍ"
			},
			{
				base: "y",
				chars: "ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ"
			},
			{
				base: "z",
				chars: "ⓩzźẑżžẓẕƶȥɀⱬꝣ"
			}
		];
		var diacriticsMap = {};
		for (var i = 0; i < replacementList.length; i += 1) {
			var chars = replacementList[i].chars;
			for (var j = 0; j < chars.length; j += 1) diacriticsMap[chars[j]] = replacementList[i].base;
		}
		function removeDiacritics(str) {
			return str.replace(/[^\u0000-\u007e]/g, function(c) {
				return diacriticsMap[c] || c;
			});
		}
	})))();
	/**
	* String utilities
	*/
	/**
	* Removes whitespace from both sides of passed string
	* @param  {String} text
	* @return {String}
	*/
	var trim = (text) => {
		if (text.trim) return text.trim();
		return text.replace(/^\s*|\s*$/g, "");
	};
	/**
	* Checks if passed string is empty
	* @param {String} text
	* @return {Boolean}
	*/
	var isEmpty$1 = (text) => trim(text) === "";
	/**
	* Makes regex safe string by escaping special characters from passed string
	* @param {String} text
	* @return {String} escaped string
	*/
	var rgxEsc = (text) => {
		return String(text).replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
	};
	/**
	* Returns passed string as lowercase if caseSensitive flag set false. By
	* default it returns the string with no casing changes.
	* @param {String} text
	* @return {String} string
	*/
	var matchCase = (text, caseSensitive = false) => {
		if (!caseSensitive) return text.toLowerCase();
		return text;
	};
	/**
	* Checks if passed data contains the searched term
	* @param  {String} term                Searched term
	* @param  {String} data                Data string
	* @param  {Boolean} exactMatch         Exact match
	* @param  {Boolean} caseSensitive      Case sensitive
	* @param  {Boolean} ignoreDiacritics   Ignore diacritics
	* @return {Boolean}
	*/
	var contains = (term, data, exactMatch = false, caseSensitive = false, ignoreDiacritics = false) => {
		let regexp;
		let modifier = caseSensitive ? "g" : "gi";
		if (ignoreDiacritics) {
			term = (0, import_diacritics.remove)(term);
			data = (0, import_diacritics.remove)(data);
		}
		if (exactMatch) regexp = new RegExp("(^\\s*)" + rgxEsc(term) + "(\\s*$)", modifier);
		else regexp = new RegExp(rgxEsc(term), modifier);
		return regexp.test(data);
	};
	/**
	* Camelize a string, cutting the string by multiple separators like
	* hyphens, underscores and spaces.
	* @param  {String} text text to camelize
	* @return {String}      camelized text
	*/
	var toCamelCase = (text = "") => {
		return text.replace(/^([A-Z])|[\s-_]+(\w)/g, (match, p1, p2) => {
			if (p2) return p2.toUpperCase();
			return p1.toLowerCase();
		});
	};
	/**
	* Generate a string in the format of a UUID (Universally Unique IDentifier).
	* NOTE: This format of 8 chars, followed by 3 groups of 4 chars, followed by 12
	* chars is known as a UUID and is defined in RFC4122 and is a standard for
	* generating unique IDs. This function DOES NOT implement this standard.
	* It simply outputs a string that looks similar. The standard is found here:
	* https://www.ietf.org/rfc/rfc4122.txt
	* source: https://gist.github.com/gordonbrander/2230317
	* @return {String}
	*/
	var uuid = () => {
		const chr4 = () => Math.random().toString(16).slice(-4);
		return chr4() + chr4() + "-" + chr4() + "-" + chr4() + "-" + chr4() + "-" + chr4() + chr4() + chr4();
	};
	//#endregion
	//#region src/feature.js
	var NOT_IMPLEMENTED = "Not implemented.";
	/**
	* Base class defining the interface of a TableFilter feature
	*/
	var Feature = class {
		/**
		* Creates an instance of Feature
		* @param {Object} tf TableFilter instance
		* @param {Class} feature Feature class for TableFilter registration
		*/
		constructor(tf, cls) {
			cls.meta = cls.meta || {};
			/**
			* TableFilter instance
			* @type {TableFilter}
			*/
			this.tf = tf;
			/**
			* Feature name is the camelised class name as per TableFilter's
			* convention
			* @type {String}
			*/
			this.feature = cls.meta.altName || cls.meta.name || toCamelCase(cls.name);
			/**
			* TableFilter feature setting
			* @type {Boolean}
			*/
			this.enabled = tf[this.feature];
			/**
			* TableFilter configuration
			* @type {Object}
			*/
			this.config = tf.config();
			/**
			* TableFilter emitter instance
			* @type {Emitter}
			*/
			this.emitter = tf.emitter;
			/**
			* Field indicating whether Feature is initialized
			* @type {Boolean}
			*/
			this.initialized = false;
			/** Subscribe to destroy event */
			this.emitter.on(["destroy"], () => this.destroy());
		}
		/**
		* Initialize the feature
		*/
		init() {
			throw new Error(NOT_IMPLEMENTED);
		}
		/**
		* Reset the feature after being disabled
		*/
		reset() {
			this.enable();
			this.init();
		}
		/**
		* Destroy the feature
		*/
		destroy() {
			throw new Error(NOT_IMPLEMENTED);
		}
		/**
		* Enable the feature
		*/
		enable() {
			this.enabled = true;
		}
		/**
		* Disable the feature
		*/
		disable() {
			this.enabled = false;
		}
		/**
		* Indicate whether the feature is enabled or not
		* @returns {Boolean}
		*/
		isEnabled() {
			return this.enabled === true;
		}
	};
	//#endregion
	//#region src/types.js
	/**
	* Types utilities
	*/
	var UNDEFINED = void 0;
	/**
	* Return an empty function
	* @return {Function}
	*/
	var EMPTY_FN = function() {};
	/**
	* Check passed argument is an object
	* @param  {Object}  obj
	* @return {Boolean}
	*/
	var isObj = (obj) => Object.prototype.toString.call(obj) === "[object Object]";
	/**
	* Check passed argument is a function
	* @param  {Function} obj
	* @return {Boolean}
	*/
	var isFn = (obj) => Object.prototype.toString.call(obj) === "[object Function]";
	/**
	* Check passed argument is an array
	* @param  {Array}  obj
	* @return {Boolean}
	*/
	var isArray = (obj) => Object.prototype.toString.call(obj) === "[object Array]";
	/**
	* Check passed argument is a string
	* @param {String} obj obj
	* @returns {Boolean}
	*/
	var isString = (obj) => Object.prototype.toString.call(obj) === "[object String]";
	/**
	* Check passed argument is a number
	* @param {Number} obj
	* @returns {Boolean}
	*/
	var isNumber = (obj) => Object.prototype.toString.call(obj) === "[object Number]";
	/**
	* Check passed argument is a boolean
	* @param {Boolean} obj
	* @returns {Boolean}
	*/
	var isBoolean = (obj) => Object.prototype.toString.call(obj) === "[object Boolean]";
	/**
	* Check passed argument is undefined
	* @param  {Any}  obj
	* @return {Boolean}
	*/
	var isUndef = (obj) => obj === UNDEFINED;
	/**
	* Check passed argument is null
	* @param  {Any}  obj
	* @return {Boolean}
	*/
	var isNull = (obj) => obj === null;
	/**
	* Check passed argument is empty (undefined, null or empty string)
	* @param  {Any}  obj
	* @return {Boolean}
	*/
	var isEmpty = (obj) => isUndef(obj) || isNull(obj) || obj.length === 0;
	//#endregion
	//#region src/root.js
	/**
	* Export window or global object depending on the environment
	*/
	var root = typeof self === "object" && self.self === self && self || typeof global === "object" && global.global === global && global || void 0;
	//#endregion
	//#region src/dom.js
	/**
	* DOM utilities
	*/
	var doc$2 = root.document;
	/**
	* Returns text + text of children of given node
	* @param  {NodeElement} node
	* @return {String}
	*/
	var getText = (node) => {
		if (isUndef(node.textContent)) return trim(node.innerText);
		return trim(node.textContent);
	};
	/**
	* Returns the first text node contained in the supplied node
	* @param  {NodeElement} node node
	* @return {String}
	*/
	var getFirstTextNode = (node) => {
		for (let i = 0; i < node.childNodes.length; i++) {
			let n = node.childNodes[i];
			if (n.nodeType === 3) return n.data;
		}
	};
	/**
	* Creates an html element with given collection of attributes
	* @param  {String} tag html tag name
	* @param  {Array} an undetermined number of arrays containing the with 2
	*                    items, the attribute name and its value ['id','myId']
	* @return {Object}     created element
	*/
	var createElm = (...args) => {
		let tag = args[0];
		if (!isString(tag)) return null;
		let el = doc$2.createElement(tag);
		for (let i = 0; i < args.length; i++) {
			let arg = args[i];
			if (isArray(arg) && arg.length === 2) el.setAttribute(arg[0], arg[1]);
		}
		return el;
	};
	/**
	* Removes passed node from DOM
	* @param  {DOMElement} node
	* @return {DOMElement} old node reference
	*/
	var removeElm = (node) => node.parentNode.removeChild(node);
	/**
	* Returns a text node with given text
	* @param  {String} txt
	* @return {Object}
	*/
	var createText = (txt) => doc$2.createTextNode(txt);
	/**
	* Determine whether the passed elements is assigned the given class
	* @param {DOMElement} ele DOM element
	* @param {String} cls CSS class name
	* @returns {Boolean}
	*/
	var hasClass = (ele, cls) => {
		if (isUndef(ele)) return false;
		if (supportsClassList()) return ele.classList.contains(cls);
		return ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
	};
	/**
	* Adds the specified class to the passed element
	* @param {DOMElement} ele DOM element
	* @param {String} cls CSS class name
	*/
	var addClass = (ele, cls) => {
		if (isUndef(ele)) return;
		if (supportsClassList()) {
			ele.classList.add(cls);
			return;
		}
		if (ele.className === "") ele.className = cls;
		else if (!hasClass(ele, cls)) ele.className += " " + cls;
	};
	/**
	* Removes the specified class to the passed element
	* @param {DOMElement} ele DOM element
	* @param {String} cls CSS class name
	*/
	var removeClass = (ele, cls) => {
		if (isUndef(ele)) return;
		if (supportsClassList()) {
			ele.classList.remove(cls);
			return;
		}
		let reg = new RegExp("(\\s|^)" + cls + "(\\s|$)", "g");
		ele.className = ele.className.replace(reg, "");
	};
	/**
	* Creates and returns an option element
	* @param  {String}  text  option text
	* @param  {String}  value option value
	* @param  {Boolean} isSel whether option is selected
	* @return {Object}        option element
	*/
	var createOpt = (text, value, isSel) => {
		let opt = (isSel ? true : false) ? createElm("option", ["value", value], ["selected", "true"]) : createElm("option", ["value", value]);
		opt.appendChild(createText(text));
		return opt;
	};
	/**
	* Creates and returns a checklist item
	* @param  {String} id  index of check item
	* @param  {String} chkValue  check item value
	* @param  {String} labelText check item label text
	* @param  {Array} extraAttr  array containing attribute name and its value
	* @return {Object}           li DOM element
	*/
	var createCheckItem = (id, chkValue, labelText, extraAttr = []) => {
		let li = createElm("li");
		let label = createElm("label", ["for", id]);
		let check = createElm("input", ["id", id], ["name", id], ["type", "checkbox"], ["value", chkValue], extraAttr);
		label.appendChild(check);
		label.appendChild(createText(labelText));
		li.appendChild(label);
		li.label = label;
		li.check = check;
		return li;
	};
	/**
	* Returns the element matching the supplied Id
	* @param  {String} id  Element identifier
	* @return {DOMElement}
	*/
	var elm = (id) => doc$2.getElementById(id);
	/**
	* Returns list of element matching the supplied tag name
	* @param  {String} tagname  Tag name
	* @return {NodeList}
	*/
	var tag = (o, tagname) => o.getElementsByTagName(tagname);
	function supportsClassList() {
		return doc$2.documentElement.classList;
	}
	//#endregion
	//#region src/event.js
	/**
	* DOM event utilities
	*/
	/**
	* Add event handler for specified event on passed element
	*
	* @param {DOMElement} obj Element
	* @param {String} type Event type
	* @param {Function} Handler
	* @param {Boolean} capture Specifiy whether the event should be executed in
	* the capturing or in the bubbling phase
	*/
	var addEvt = (obj, type, func, capture) => {
		if (obj.addEventListener) obj.addEventListener(type, func, capture);
		else if (obj.attachEvent) obj.attachEvent("on" + type, func);
		else obj["on" + type] = func;
	};
	/**
	* Remove event handler for specified event on passed element
	*
	* @param {DOMElement} obj Element
	* @param {String} type Event type
	* @param {Function} Handler
	* @param {Boolean} capture Specifiy whether the event should be executed in
	* the capturing or in the bubbling phase
	*/
	var removeEvt = (obj, type, func, capture) => {
		if (obj.removeEventListener) obj.removeEventListener(type, func, capture);
		else if (obj.detachEvent) obj.detachEvent("on" + type, func);
		else obj["on" + type] = null;
	};
	/**
	* Prevents further propagation of the current event in the bubbling phase
	*
	* @param {Event} evt Event on the DOM
	*/
	var stopEvt = (evt) => {
		if (!evt) evt = root.event;
		if (evt.stopPropagation) evt.stopPropagation();
		else evt.cancelBubble = true;
	};
	/**
	* Cancels the event if it is cancelable, without stopping further
	* propagation of the event.
	*
	* @param {Event} evt Event on the DOM
	*/
	var cancelEvt = (evt) => {
		if (!evt) evt = root.event;
		if (evt.preventDefault) evt.preventDefault();
		else evt.returnValue = false;
	};
	/**
	* Reference to the object that dispatched the event
	*
	* @param {Event} evt Event on the DOM
	* @returns {DOMElement}
	*/
	var targetEvt = (evt) => {
		if (!evt) evt = root.event;
		return evt.target || evt.srcElement;
	};
	/**
	* Returns the Unicode value of pressed key
	*
	* @param {Event} evt Event on the DOM
	* @returns {Number}
	*/
	var keyCode = (evt) => {
		return evt.charCode ? evt.charCode : evt.keyCode ? evt.keyCode : evt.which ? evt.which : 0;
	};
	/**
	* Check code of pressed key is one of the expected key codes
	*
	* @param {Event} evt key event
	* @param {Array} keyCodes list of keycodes to check
	*/
	var isKeyPressed = (evt, keyCodes = []) => {
		return keyCodes.indexOf(keyCode(evt)) !== -1;
	};
	/**
	* Bind passed function to passed scope
	* @param {Function} fn function
	* @param {Object} scope object instance
	*/
	function bound(fn, scope) {
		let boundFnName = `${fn.name}_bound`;
		if (!scope[boundFnName]) scope[boundFnName] = fn.bind(scope);
		return scope[boundFnName];
	}
	//#endregion
	//#region src/number.js
	/**
	* Formats a numeric value with configurable separators and affixes.
	* @param {Number|String} value Numeric value
	* @param {Object} [options={}] Formatting options
	* @param {String} [options.locale='en'] Intl locale
	* @param {String} [options.decimal] Decimal separator override
	* @param {String} [options.integerSeparator] Thousands separator override
	* @param {Number} [options.precision] Fixed number of fraction digits
	* @param {Number} [options.round] Maximum number of fraction digits
	* @param {String} [options.prefix=''] Value prefix
	* @param {String} [options.suffix=''] Value suffix
	* @returns {String} Formatted number
	*/
	var formatNumberValue = (value, options = {}) => {
		if (value === null || value === void 0 || typeof value === "string" && value.trim() === "") return "";
		const num = Number(value);
		if (isNaN(num) || !isFinite(num)) return "";
		const locale = options.locale || "en";
		const prefix = options.prefix || "";
		const suffix = options.suffix || "";
		const numericText = typeof value === "string" ? value.trim() : num.toString();
		const coefficient = numericText.toLowerCase().split("e")[0];
		const exponent = Number(numericText.toLowerCase().split("e")[1] || 0);
		const decimalIndex = coefficient.indexOf(".");
		const inputPrecision = Math.max(0, decimalIndex < 0 ? 0 : coefficient.length - decimalIndex - 1 - exponent);
		const maximumPrecision = options.round !== void 0 ? options.round : options.precision !== void 0 ? options.precision : inputPrecision;
		const minimumPrecision = options.precision !== void 0 ? Math.min(options.precision, maximumPrecision) : Math.min(inputPrecision, maximumPrecision);
		const formatter = new Intl.NumberFormat(locale, {
			useGrouping: options.integerSeparator === void 0 || Boolean(options.integerSeparator),
			minimumFractionDigits: minimumPrecision,
			maximumFractionDigits: maximumPrecision
		});
		let sign = "";
		const formatted = formatter.formatToParts(num).map((part) => {
			if (part.type === "group") return options.integerSeparator === void 0 ? part.value : options.integerSeparator;
			if (part.type === "decimal") return options.decimal || part.value;
			if (part.type === "minusSign") {
				sign = part.value;
				return "";
			}
			return part.value;
		}).join("");
		return `${sign}${prefix}${formatted}${suffix}`;
	};
	/**
	* Takes a string, removes all formatting/cruft and returns the raw float value
	* @param {String} Formatted number
	* @param {String} Decimal type '.' or ','
	* @return {Number} Unformatted number
	*
	* https://github.com/openexchangerates/accounting.js/blob/master/accounting.js
	*/
	var parse = (value, decimal = ".") => {
		if (isNumber(value)) return value;
		let regex = new RegExp("[^0-9-" + decimal + "]", ["g"]);
		let unformatted = parseFloat(("" + value).replace(/\((.*)\)/, "-$1").replace(regex, "").replace(decimal, "."));
		return !isNaN(unformatted) ? unformatted : 0;
	};
	//#endregion
	//#region src/const.js
	/**
	* Filter types
	*/
	/**
	* Input filter type
	* @type {String}
	*/
	var INPUT = "input";
	/**
	* Select filter type
	* @type {String}
	*/
	var SELECT = "select";
	/**
	* Multiple select filter type
	* @type {String}
	*/
	var MULTIPLE = "multiple";
	/**
	* Checklist filter type
	* @type {String}
	*/
	var CHECKLIST = "checklist";
	/**
	* None filter type
	* @type {String}
	*/
	var NONE = "none";
	/**
	* Data types
	*/
	/**
	* String
	* @type {String}
	*/
	var STRING = "string";
	/**
	* Formatted number
	* @type {String}
	*/
	var FORMATTED_NUMBER = "formatted-number";
	/**
	* Date
	* @type {String}
	*/
	var DATE = "date";
	/**
	* IP address
	* @type {String}
	*/
	var IP_ADDRESS = "ipaddress";
	//#endregion
	//#region src/settings.js
	/** Configuration settings helpers  */
	/**
	* If passed value is not of boolean type return the default value
	* otherwise return the value itself
	* @param  {Boolean|Any}  value
	* @param  {Boolean} default value
	* @return {Boolean|Any}
	*/
	var defaultsBool = (val, defaultVal) => isBoolean(val) ? val : defaultVal;
	/**
	* If passed value is not of string type return the default value
	* otherwise return the value itself
	* @param  {String|Any}  value
	* @param  {String} default value
	* @return {String|Any}
	*/
	var defaultsStr = (val, defaultVal) => isString(val) ? val : defaultVal;
	/**
	* If passed value is not of number type return the default value
	* otherwise return the value itself
	* @param  {Number|Any}  value
	* @param  {Number} default value
	* @return {Number|Any}
	*/
	var defaultsNb = (val, defaultVal) => isNaN(val) ? defaultVal : val;
	/**
	* If passed value is not of array type return the default value
	* otherwise return the value itself
	* @param  {Array|Any}  value
	* @param  {Array} default value
	* @return {Array|Any}
	*/
	var defaultsArr = (val, defaultVal) => isArray(val) ? val : defaultVal;
	/**
	* If passed value is not of function type return the default value
	* otherwise return the value itself
	* @param  {Function|Any}  value
	* @param  {Function} default value
	* @return {Function|Any}
	*/
	var defaultsFn = (val, defaultVal) => isFn(val) ? val : defaultVal;
	//#endregion
	//#region src/extensions/sort/adapterSortabletable.js
	/**
	* SortableTable Adapter module
	*/
	var AdapterSortableTable = class AdapterSortableTable extends Feature {
		/**
		* Creates an instance of AdapterSortableTable
		* @param {TableFilter} tf TableFilter instance
		* @param {Object} opts Configuration object
		*/
		constructor(tf, opts) {
			super(tf, AdapterSortableTable);
			/**
			* Module name
			* @type {String}
			*/
			this.name = opts.name;
			/**
			* Module description
			* @type {String}
			*/
			this.desc = defaultsStr(opts.description, "Sortable table");
			/**
			* Indicate whether table previously sorted
			* @type {Boolean}
			* @private
			*/
			this.sorted = false;
			/**
			* List of sort type per column basis
			* @type {Array}
			*/
			this.sortTypes = defaultsArr(opts.types, tf.colTypes);
			/**
			* Column to be sorted at initialization, ie:
			* sort_col_at_start: [1, true]
			* @type {Array}
			*/
			this.sortColAtStart = defaultsArr(opts.sort_col_at_start, null);
			/**
			* Enable asynchronous sort, if triggers are external
			* @type {Boolean}
			*/
			this.asyncSort = Boolean(opts.async_sort);
			/**
			* List of element IDs triggering sort on a per column basis
			* @type {Array}
			*/
			this.triggerIds = defaultsArr(opts.trigger_ids, []);
			/**
			* Path to images
			* @type {String}
			*/
			this.imgPath = defaultsStr(opts.images_path, tf.themesPath);
			/**
			* Blank image file name
			* @type {String}
			*/
			this.imgBlank = defaultsStr(opts.image_blank, "blank.png");
			/**
			* Css class for sort indicator image
			* @type {String}
			*/
			this.imgClassName = defaultsStr(opts.image_class_name, "sort-arrow");
			/**
			* Css class for ascending sort indicator image
			* @type {String}
			*/
			this.imgAscClassName = defaultsStr(opts.image_asc_class_name, "ascending");
			/**
			* Css class for descending sort indicator image
			* @type {String}
			*/
			this.imgDescClassName = defaultsStr(opts.image_desc_class_name, "descending");
			/**
			* Cell attribute key storing custom value used for sorting
			* @type {String}
			*/
			this.customKey = defaultsStr(opts.custom_key, "data-tf-sortKey");
			/**
			* Callback fired when sort extension is instanciated
			* @type {Function}
			*/
			this.onSortLoaded = defaultsFn(opts.on_sort_loaded, EMPTY_FN);
			/**
			* Callback fired before a table column is sorted
			* @type {Function}
			*/
			this.onBeforeSort = defaultsFn(opts.on_before_sort, EMPTY_FN);
			/**
			* Callback fired after a table column is sorted
			* @type {Function}
			*/
			this.onAfterSort = defaultsFn(opts.on_after_sort, EMPTY_FN);
			/**
			* SortableTable instance
			* @private
			*/
			this.stt = null;
			this.enable();
		}
		/**
		* Initializes AdapterSortableTable instance
		*/
		init() {
			if (this.initialized) return;
			let tf = this.tf;
			let adpt = this;
			if (isUndef(SortableTable)) throw new Error("SortableTable class not found.");
			this.emitter.emit("add-date-type-formats", this.tf, this.sortTypes);
			this.overrideSortableTable();
			this.setSortTypes();
			this.onSortLoaded(tf, this);
			/*** SortableTable callbacks ***/
			this.stt.onbeforesort = function() {
				adpt.onBeforeSort(tf, adpt.stt.sortColumn);
				/*** sort behaviour for paging ***/
				if (tf.paging) tf.feature("paging").disable();
			};
			this.stt.onsort = function() {
				adpt.sorted = true;
				if (tf.paging) {
					let paginator = tf.feature("paging");
					tf.getValidRows(true);
					paginator.enable();
					paginator.setPage(paginator.getPage());
				}
				adpt.onAfterSort(tf, adpt.stt.sortColumn, adpt.stt.descending);
				adpt.emitter.emit("column-sorted", tf, adpt.stt.sortColumn, adpt.stt.descending);
			};
			let sortColAtStart = adpt.sortColAtStart;
			if (sortColAtStart) this.stt.sort(sortColAtStart[0], sortColAtStart[1]);
			this.emitter.on(["sort"], bound(this.sortByColumnIndexHandler, this));
			/** @inherited */
			this.initialized = true;
			this.emitter.emit("sort-initialized", tf, this);
		}
		/**
		* Sort specified column
		* @param {Number} colIdx Column index
		* @param {Boolean} desc Optional: descending manner
		*/
		sortByColumnIndex(colIdx, desc) {
			this.stt.sort(colIdx, desc);
		}
		/** @private */
		sortByColumnIndexHandler(tf, colIdx, desc) {
			this.sortByColumnIndex(colIdx, desc);
		}
		/**
		* Set SortableTable overrides for TableFilter integration
		*/
		overrideSortableTable() {
			let adpt = this, tf = this.tf;
			/**
			* Overrides headerOnclick method in order to handle th event
			* @param  {Object} e [description]
			*/
			SortableTable.prototype.headerOnclick = function(evt) {
				if (!adpt.initialized) return;
				let el = evt.target || evt.srcElement;
				while (el.tagName !== "TD" && el.tagName !== "TH") el = el.parentNode;
				this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);
			};
			/**
			* Overrides getCellIndex IE returns wrong cellIndex when columns are
			* hidden
			* @param  {Object} oTd TD element
			* @return {Number}     Cell index
			*/
			SortableTable.getCellIndex = function(oTd) {
				let cells = oTd.parentNode.cells, l = cells.length, i = 0;
				for (; cells[i] !== oTd && i < l; i++);
				return i;
			};
			/**
			* Overrides initHeader in order to handle filters row position
			* @param  {Array} oSortTypes
			*/
			SortableTable.prototype.initHeader = function(oSortTypes) {
				let stt = this;
				if (!stt.tHead) {
					if (tf.gridLayout) stt.tHead = tf.feature("gridLayout").headTbl.tHead;
					else return;
				}
				stt.headersRow = tf.headersRow;
				let cells = stt.tHead.rows[stt.headersRow].cells;
				stt.sortTypes = oSortTypes || [];
				let l = cells.length;
				let img, c;
				for (let i = 0; i < l; i++) {
					c = cells[i];
					if (stt.sortTypes[i] !== null && stt.sortTypes[i] !== "None") {
						c.style.cursor = "pointer";
						img = createElm("img", ["src", adpt.imgPath + adpt.imgBlank]);
						c.appendChild(img);
						if (stt.sortTypes[i] !== null) c.setAttribute("_sortType", stt.sortTypes[i]);
						addEvt(c, "click", stt._headerOnclick);
					} else {
						c.setAttribute("_sortType", oSortTypes[i]);
						c._sortType = "None";
					}
				}
				stt.updateHeaderArrows();
			};
			/**
			* Overrides updateHeaderArrows in order to handle arrows indicators
			*/
			SortableTable.prototype.updateHeaderArrows = function() {
				let stt = this;
				let cells, l, img;
				if (adpt.asyncSort && adpt.triggerIds.length > 0) {
					let triggers = adpt.triggerIds;
					cells = [];
					l = triggers.length;
					for (let j = 0; j < l; j++) cells.push(elm(triggers[j]));
				} else {
					if (!this.tHead) return;
					cells = stt.tHead.rows[stt.headersRow].cells;
					l = cells.length;
				}
				for (let i = 0; i < l; i++) {
					let cell = cells[i];
					if (!cell) continue;
					let cellAttr = cell.getAttribute("_sortType");
					if (cellAttr !== null && cellAttr !== "None") {
						img = cell.lastChild || cell;
						if (img.nodeName.toLowerCase() !== "img") {
							img = createElm("img", ["src", adpt.imgPath + adpt.imgBlank]);
							cell.appendChild(img);
						}
						if (i === stt.sortColumn) img.className = adpt.imgClassName + " " + (this.descending ? adpt.imgDescClassName : adpt.imgAscClassName);
						else img.className = adpt.imgClassName;
					}
				}
			};
			/**
			* Overrides getRowValue for custom key value feature
			* @param  {Object} oRow    Row element
			* @param  {String} sType
			* @param  {Number} nColumn
			* @return {String}
			*/
			SortableTable.prototype.getRowValue = function(oRow, sType, nColumn) {
				let stt = this;
				let sortTypeInfo = stt._sortTypeInfo[sType];
				if (sortTypeInfo && sortTypeInfo.getRowValue) return sortTypeInfo.getRowValue(oRow, nColumn);
				let c = oRow.cells[nColumn];
				let s = SortableTable.getInnerText(c);
				return stt.getValueFromString(s, sType);
			};
			/**
			* Overrides getInnerText in order to avoid Firefox unexpected sorting
			* behaviour with untrimmed text elements
			* @param  {Object} cell DOM element
			* @return {String}       DOM element inner text
			*/
			SortableTable.getInnerText = function(cell) {
				if (!cell) return;
				if (cell.getAttribute(adpt.customKey)) return cell.getAttribute(adpt.customKey);
				else return tf.getCellValue(cell);
			};
		}
		/**
		* Adds a sort type
		*/
		addSortType(...args) {
			let [id, caster, sorter, getRowValue] = args;
			SortableTable.prototype.addSortType(id, caster, sorter, getRowValue);
		}
		/**
		* Sets the sort types on a column basis
		* @private
		*/
		setSortTypes() {
			let tf = this.tf, sortTypes = this.sortTypes, _sortTypes = [];
			tf.eachCol((i) => {
				let colType;
				if (sortTypes[i]) {
					colType = sortTypes[i];
					if (isObj(colType)) {
						if (colType.type === "date") colType = this._addDateType(i, sortTypes);
						else if (colType.type === "formatted-number") {
							let decimal = colType.decimal || tf.decimalSeparator;
							colType = this._addNumberType(i, decimal);
						}
					} else {
						colType = colType.toLowerCase();
						if (colType === "date") colType = this._addDateType(i, sortTypes);
						else if (colType === "formatted-number" || colType === "number") colType = this._addNumberType(i, tf.decimalSeparator);
						else if (colType === "none") colType = "None";
					}
				} else colType = STRING;
				_sortTypes.push(colType);
			});
			this.addSortType("caseinsensitivestring", SortableTable.toUpperCase);
			this.addSortType(STRING);
			this.addSortType(IP_ADDRESS, ipAddress, sortIP);
			this.stt = new SortableTable(tf.dom(), _sortTypes);
			/*** external table headers adapter ***/
			if (this.asyncSort && this.triggerIds.length > 0) {
				let triggers = this.triggerIds;
				for (let j = 0; j < triggers.length; j++) {
					if (triggers[j] === null) continue;
					let trigger = elm(triggers[j]);
					if (trigger) {
						trigger.style.cursor = "pointer";
						addEvt(trigger, "click", (evt) => {
							let elm = evt.target;
							if (!this.tf.sort) return;
							this.stt.asyncSort(triggers.indexOf(elm.id));
						});
						trigger.setAttribute("_sortType", _sortTypes[j]);
					}
				}
			}
		}
		_addDateType(colIndex, types) {
			let tf = this.tf;
			let dateType = tf.feature("dateType");
			let locale = dateType.getOptions(colIndex, types).locale || tf.locale;
			let colType = `${DATE}-${locale}`;
			this.addSortType(colType, (value) => {
				let parsedDate = dateType.parse(value, locale);
				return isNaN(+parsedDate) ? /* @__PURE__ */ new Date(-864e11) : parsedDate;
			});
			return colType;
		}
		_addNumberType(colIndex, decimal) {
			let colType = `${FORMATTED_NUMBER}${decimal === "." ? "" : "-custom"}`;
			this.addSortType(colType, (value) => {
				return parse(value, decimal);
			});
			return colType;
		}
		/**
		* Remove extension
		*/
		destroy() {
			if (!this.initialized) return;
			let tf = this.tf;
			this.emitter.off(["sort"], bound(this.sortByColumnIndexHandler, this));
			this.sorted = false;
			this.stt.destroy();
			let ids = tf.getFiltersId();
			for (let idx = 0; idx < ids.length; idx++) {
				let header = tf.getHeaderElement(idx);
				let img = tag(header, "img");
				if (img.length === 1) header.removeChild(img[0]);
			}
			this.initialized = false;
		}
	};
	AdapterSortableTable.meta = { altName: "sort" };
	function ipAddress(value) {
		let vals = value.split(".");
		for (let x in vals) {
			let val = vals[x];
			while (3 > val.length) val = "0" + val;
			vals[x] = val;
		}
		return vals.join(".");
	}
	function sortIP(a, b) {
		let aa = ipAddress(a.value.toLowerCase());
		let bb = ipAddress(b.value.toLowerCase());
		if (aa === bb) return 0;
		else if (aa < bb) return -1;
		else return 1;
	}
	//#endregion
	//#region src/extensions/sort/sort.js
	if (typeof SortableTable === "undefined") (0, eval)(sortabletable_default);
	if (!root.SortableTable) {
		if (typeof require !== "undefined") {}
	}
	var sort_default = AdapterSortableTable;
	//#endregion
	//#region src/modules/toolbar.js
	var EVENTS$2 = ["initializing-feature", "initializing-extension"];
	/** Left position in toolbar */
	var LEFT = "left";
	/** Right position in toolbar */
	var RIGHT = "right";
	/** Center position in toolbar */
	var CENTER = "center";
	/**
	* Toolbar UI component
	* @export
	* @class Toolbar
	* @extends {Feature}
	*/
	var Toolbar = class Toolbar extends Feature {
		/**
		* Create an instance of Toolbar
		* @param {TableFilter} tf TableFilter instance
		* @memberof Toolbar
		*/
		constructor(tf) {
			super(tf, Toolbar);
			let f = this.config.toolbar || {};
			/**
			* Css class for toolbar's container DOM element
			* @type {String}
			*/
			this.contCssClass = defaultsStr(f.container_css_class, "inf");
			/**
			* Css class for left-side inner container DOM element
			* @type {String}
			*/
			this.lContCssClass = defaultsStr(f.left_cont_css_class, "ldiv");
			/**
			* Css class for right-side inner container DOM element
			* @type {String}
			*/
			this.rContCssClass = defaultsStr(f.right_cont_css_class, "rdiv");
			/**
			* Css class for middle inner container DOM element
			* @type {String}
			*/
			this.cContCssClass = defaultsStr(f.center_cont_css_class, "mdiv");
			/**
			* Toolbar's custom container ID
			* @type {String}
			*/
			this.tgtId = defaultsStr(f.target_id, null);
			/**
			* Toolbar's container DOM element
			* @type {DOMElement}
			* @private
			*/
			this.cont = null;
			/**
			* Left-side inner container DOM element (rows counter in toolbar)
			* @type {DOMElement}
			* @private
			*/
			this.lCont = null;
			/**
			* Right-side inner container DOM element (reset button,
			* page length selector in toolbar)
			* @type {DOMElement}
			* @private
			*/
			this.rCont = null;
			/**
			* Middle inner container DOM element (paging elements in toolbar)
			* @type {DOMElement}
			* @private
			*/
			this.cCont = null;
			/**
			* Container elements inside toolbar
			* @private
			*/
			this.innerCont = {
				left: null,
				center: null,
				right: null
			};
			this.emitter.on(EVENTS$2, (feature, isExternal) => this.init(isExternal));
			/** @inherited */
			this.enabled = true;
		}
		/**
		* Initialize toolbar components
		* @param {Boolean} isExternal initialize only if component belongs
		* to toolbar
		*/
		init(isExternal) {
			if (this.initialized || isExternal) return;
			let tf = this.tf;
			let container = createElm("div");
			container.className = this.contCssClass;
			if (this.tgtId) elm(this.tgtId).appendChild(container);
			else if (tf.gridLayout) {
				let gridLayout = tf.Mod.gridLayout;
				gridLayout.tblMainCont.appendChild(container);
				container.className = gridLayout.infDivCssClass;
			} else {
				let cont = createElm("caption");
				cont.appendChild(container);
				tf.dom().insertBefore(cont, tf.dom().firstChild);
			}
			this.cont = container;
			this.lCont = this.createContainer(container, this.lContCssClass);
			this.rCont = this.createContainer(container, this.rContCssClass);
			this.cCont = this.createContainer(container, this.cContCssClass);
			this.innerCont = {
				left: this.lCont,
				center: this.cCont,
				right: this.rCont
			};
			/** @inherited */
			this.initialized = true;
			if (isUndef(tf.help)) {
				tf.Mod.help.enable();
				this.emitter.emit("init-help", tf);
			}
		}
		/**
		* Return the container based on requested position inside the toolbar
		* @param {String} [position=RIGHT] 3 possible positions: 'left', 'center',
		* 'right'
		* @param {DOMElement} el optional DOM element to be inserter in container
		* @returns {DOMElement}
		*/
		container(position = RIGHT, el) {
			let cont = this.innerCont[position];
			if (el) cont.appendChild(el);
			return cont;
		}
		/**
		* Create DOM element inside passed container
		* @param {DOMElement} container
		* @param {String} css
		* @private
		*/
		createContainer(container, css) {
			let div = createElm("div", ["class", css]);
			container.appendChild(div);
			return div;
		}
		/**
		* Destroy Toolbar instance
		*/
		destroy() {
			if (!this.initialized) return;
			let tf = this.tf;
			removeElm(this.cont);
			this.cont = null;
			let captions = tag(tf.dom(), "caption");
			[].forEach.call(captions, (el) => removeElm(el));
			/** @inherited */
			this.initialized = false;
		}
	};
	Toolbar.meta = { alwaysInstantiate: true };
	//#endregion
	//#region src/extensions/colsVisibility/colsVisibility.js
	/**
	* Columns Visibility extension
	*/
	var ColsVisibility = class ColsVisibility extends Feature {
		/**
		* Creates an instance of ColsVisibility
		* @param {TableFilter} tf TableFilter instance
		* @param {Object} Configuration object
		*/
		constructor(tf, f) {
			super(tf, ColsVisibility);
			let cfg = this.config;
			/**
			* Module name
			* @type {String}
			*/
			this.name = f.name;
			/**
			* Module description
			* @type {String}
			*/
			this.desc = defaultsStr(f.description, "Columns visibility manager");
			/**
			* show/hide columns container element
			* @private
			*/
			this.spanEl = null;
			/**
			* show/hide columns button element
			* @private
			*/
			this.btnEl = null;
			/**
			* show/hide columns main container element
			* @private
			*/
			this.contEl = null;
			/**
			* Enable tick to hide a column, defaults to true
			* @type {Boolean}
			*/
			this.tickToHide = defaultsBool(f.tick_to_hide, true);
			/**
			* Enable columns manager UI, defaults to true
			* @type {Boolean}
			*/
			this.manager = defaultsBool(f.manager, true);
			/**
			* Headers HTML table reference only if headers are external
			* @type {DOMElement}
			*/
			this.headersTbl = f.headers_table || null;
			/**
			* Headers row index only if headers are external
			* @type {Number}
			*/
			this.headersIndex = defaultsNb(f.headers_index, 1);
			/**
			* ID of main container element
			* @type {String}
			*/
			this.contElTgtId = defaultsStr(f.container_target_id, null);
			/**
			* Alternative text for column headers in column manager UI
			* @type {Array}
			*/
			this.headersText = defaultsArr(f.headers_text, []);
			/**
			* ID of button's container element
			* @type {String}
			*/
			this.btnTgtId = defaultsStr(f.btn_target_id, null);
			/**
			* Button's text, defaults to Columns&#9660;
			* @type {String}
			*/
			this.btnText = defaultsStr(f.btn_text, "Columns&#9660;");
			/**
			* Button's inner HTML
			* @type {String}
			*/
			this.btnHtml = defaultsStr(f.btn_html, null);
			/**
			* Css class for button
			* @type {String}
			*/
			this.btnCssClass = defaultsStr(f.btn_css_class, "colVis");
			/**
			* Columns manager UI close link text, defaults to 'Close'
			* @type {String}
			*/
			this.btnCloseText = defaultsStr(f.btn_close_text, "Close");
			/**
			* Columns manager UI close link HTML
			* @type {String}
			*/
			this.btnCloseHtml = defaultsStr(f.btn_close_html, null);
			/**
			* Css for columns manager UI close link
			* @type {String}
			*/
			this.btnCloseCssClass = defaultsStr(f.btn_close_css_class, this.btnCssClass);
			/**
			* Extension's stylesheet filename
			* @type {String}
			*/
			this.stylesheet = defaultsStr(f.stylesheet, "colsVisibility.css");
			/**
			* Css for columns manager UI span
			* @type {String}
			*/
			this.spanCssClass = defaultsStr(f.span_css_class, "colVisSpan");
			/**
			* Css for columns manager UI main container
			* @type {String}
			*/
			this.contCssClass = defaultsStr(f.cont_css_class, "colVisCont");
			/**
			* Css for columns manager UI checklist (ul)
			* @type {String}
			*/
			this.listCssClass = defaultsStr(cfg.list_css_class, "cols_checklist");
			/**
			* Css for columns manager UI checklist item (li)
			* @type {String}
			*/
			this.listItemCssClass = defaultsStr(cfg.checklist_item_css_class, "cols_checklist_item");
			/**
			* Css for columns manager UI checklist item selected state (li)
			* @type {String}
			*/
			this.listSlcItemCssClass = defaultsStr(cfg.checklist_selected_item_css_class, "cols_checklist_slc_item");
			/**
			* Text preceding the columns list, defaults to 'Hide' or 'Show'
			* depending on tick mode (tick_to_hide option)
			* @type {String}
			*/
			this.text = defaultsStr(f.text, this.tickToHide ? "Hide: " : "Show: ");
			/**
			* List of columns indexes to be hidden at initialization
			* @type {Array}
			*/
			this.atStart = defaultsArr(f.at_start, []);
			/**
			* Enable hover behaviour on columns manager button/link
			* @type {Boolean}
			*/
			this.enableHover = Boolean(f.enable_hover);
			/**
			* Enable select all option, disabled by default
			* @type {Boolean}
			*/
			this.enableTickAll = Boolean(f.enable_tick_all);
			/**
			* Text for select all option, defaults to 'Select all:'
			* @type {String}
			*/
			this.tickAllText = defaultsStr(f.tick_all_text, "Select all:");
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, RIGHT);
			/**
			* List of indexes of hidden columns
			* @private
			*/
			this.hiddenCols = [];
			/**
			* Bound mouseup wrapper
			* @private
			*/
			this.boundMouseup = null;
			/**
			* Callback fired when the extension is initialized
			* @type {Function}
			*/
			this.onLoaded = defaultsFn(f.on_loaded, EMPTY_FN);
			/**
			* Callback fired before the columns manager is opened
			* @type {Function}
			*/
			this.onBeforeOpen = defaultsFn(f.on_before_open, EMPTY_FN);
			/**
			* Callback fired after the columns manager is opened
			* @type {Function}
			*/
			this.onAfterOpen = defaultsFn(f.on_after_open, EMPTY_FN);
			/**
			* Callback fired before the columns manager is closed
			* @type {Function}
			*/
			this.onBeforeClose = defaultsFn(f.on_before_close, EMPTY_FN);
			/**
			* Callback fired after the columns manager is closed
			* @type {Function}
			*/
			this.onAfterClose = defaultsFn(f.on_after_close, EMPTY_FN);
			/**
			* Callback fired before a column is hidden
			* @type {Function}
			*/
			this.onBeforeColHidden = defaultsFn(f.on_before_col_hidden, EMPTY_FN);
			/**
			* Callback fired after a column is hidden
			* @type {Function}
			*/
			this.onAfterColHidden = defaultsFn(f.on_after_col_hidden, EMPTY_FN);
			/**
			* Callback fired before a column is displayed
			* @type {Function}
			*/
			this.onBeforeColDisplayed = defaultsFn(f.on_before_col_displayed, EMPTY_FN);
			/**
			* Callback fired after a column is displayed
			* @type {Function}
			*/
			this.onAfterColDisplayed = defaultsFn(f.on_after_col_displayed, EMPTY_FN);
			if (tf.gridLayout) {
				this.headersTbl = tf.feature("gridLayout").headTbl;
				this.headersIndex = 0;
			}
			tf.import(f.name + "Style", tf.getStylePath() + this.stylesheet, null, "link");
			this.enable();
		}
		/**
		* Mouse-up event handler handling popup auto-close behaviour
		* @private
		*/
		onMouseup(evt) {
			let targetElm = targetEvt(evt);
			while (targetElm && targetElm !== this.contEl && targetElm !== this.btnEl) targetElm = targetElm.parentNode;
			if (targetElm !== this.contEl && targetElm !== this.btnEl) this.toggle();
		}
		/**
		* Toggle columns manager UI
		*/
		toggle() {
			removeEvt(root, "mouseup", this.boundMouseup);
			let contDisplay = this.contEl.style.display;
			if (contDisplay !== "inline") this.onBeforeOpen(this);
			if (contDisplay === "inline") this.onBeforeClose(this);
			this.contEl.style.display = contDisplay === "inline" ? NONE : "inline";
			if (contDisplay !== "inline") {
				this.onAfterOpen(this);
				addEvt(root, "mouseup", this.boundMouseup);
			}
			if (contDisplay === "inline") this.onAfterClose(this);
		}
		/**
		* Check an item in columns manager UI
		* @private
		*/
		checkItem(lbl) {
			let li = lbl.parentNode;
			if (!li || !lbl) return;
			let isChecked = lbl.firstChild.checked;
			let colIndex = lbl.firstChild.getAttribute("id").split("_")[1];
			colIndex = parseInt(colIndex, 10);
			if (isChecked) addClass(li, this.listSlcItemCssClass);
			else removeClass(li, this.listSlcItemCssClass);
			let hide = false;
			if (this.tickToHide && isChecked || !this.tickToHide && !isChecked) hide = true;
			this.setHidden(colIndex, hide);
		}
		/**
		* Initializes ColsVisibility instance
		*/
		init() {
			if (this.initialized || !this.manager) return;
			this.emitter.emit("initializing-extension", this, !isNull(this.btnTgtId));
			this.emitter.on(["hide-column"], (tf, colIndex) => this.hideCol(colIndex));
			this.buildBtn();
			this.buildManager();
			/** @inherited */
			this.initialized = true;
			this.boundMouseup = this.onMouseup.bind(this);
			this.emitter.emit("columns-visibility-initialized", this.tf, this);
			this.emitter.emit("extension-initialized", this);
			this._hideAtStart();
		}
		/**
		* Build main button UI
		*/
		buildBtn() {
			if (this.btnEl) return;
			let tf = this.tf;
			let span = createElm("span");
			span.className = this.spanCssClass;
			let targetEl = !this.btnTgtId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.btnTgtId);
			if (!this.btnTgtId) {
				let firstChild = targetEl.firstChild;
				firstChild.parentNode.insertBefore(span, firstChild);
			} else targetEl.appendChild(span);
			if (!this.btnHtml) {
				let btn = createElm("a", ["href", "javascript:;"]);
				btn.className = this.btnCssClass;
				btn.title = this.desc;
				btn.innerHTML = this.btnText;
				span.appendChild(btn);
				if (!this.enableHover) addEvt(btn, "click", (evt) => this.toggle(evt));
				else addEvt(btn, "mouseover", (evt) => this.toggle(evt));
			} else {
				span.innerHTML = this.btnHtml;
				let colVisEl = span.firstChild;
				if (!this.enableHover) addEvt(colVisEl, "click", (evt) => this.toggle(evt));
				else addEvt(colVisEl, "mouseover", (evt) => this.toggle(evt));
			}
			this.spanEl = span;
			this.btnEl = this.spanEl.firstChild;
			this.onLoaded(this);
		}
		/**
		* Build columns manager UI
		*/
		buildManager() {
			let tf = this.tf;
			let container = !this.contElTgtId ? createElm("div") : elm(this.contElTgtId);
			container.className = this.contCssClass;
			let extNameLabel = createElm("p");
			extNameLabel.innerHTML = this.text;
			container.appendChild(extNameLabel);
			let ul = createElm("ul");
			ul.className = this.listCssClass;
			let tbl = this.headersTbl || tf.dom();
			let headerIndex = this.headersTbl ? this.headersIndex : tf.getHeadersRowIndex();
			let headerRow = tbl.rows[headerIndex];
			if (this.enableTickAll) {
				let li = createCheckItem("col__" + tf.id, this.tickAllText, this.tickAllText);
				addClass(li, this.listItemCssClass);
				ul.appendChild(li);
				li.check.checked = !this.tickToHide;
				addEvt(li.check, "click", () => {
					for (let h = 0; h < headerRow.cells.length; h++) {
						let itm = elm("col_" + h + "_" + tf.id);
						if (itm && li.check.checked !== itm.checked) {
							itm.click();
							itm.checked = li.check.checked;
						}
					}
				});
			}
			for (let i = 0; i < headerRow.cells.length; i++) {
				let cell = headerRow.cells[i];
				let cellText = this.headersText[i] || this._getHeaderText(cell);
				let liElm = createCheckItem("col_" + i + "_" + tf.id, cellText, cellText);
				addClass(liElm, this.listItemCssClass);
				if (!this.tickToHide) addClass(liElm, this.listSlcItemCssClass);
				ul.appendChild(liElm);
				if (!this.tickToHide) liElm.check.checked = true;
				addEvt(liElm.check, "click", (evt) => {
					let lbl = targetEvt(evt).parentNode;
					this.checkItem(lbl);
				});
			}
			let p = createElm("p", ["align", "center"]);
			let btn;
			if (!this.btnCloseHtml) {
				btn = createElm("a", ["href", "javascript:;"]);
				btn.className = this.btnCloseCssClass;
				btn.innerHTML = this.btnCloseText;
				addEvt(btn, "click", (evt) => this.toggle(evt));
				p.appendChild(btn);
			} else {
				p.innerHTML = this.btnCloseHtml;
				btn = p.firstChild;
				addEvt(btn, "click", (evt) => this.toggle(evt));
			}
			container.appendChild(ul);
			container.appendChild(p);
			this.btnEl.parentNode.insertBefore(container, this.btnEl);
			this.contEl = container;
		}
		/**
		* Hide or show specified columns
		* @param {Number} colIndex Column index
		* @param {Boolean} hide    Hide column if true or show if false
		*/
		setHidden(colIndex, hide) {
			let tf = this.tf;
			let tbl = tf.dom();
			if (hide) this.onBeforeColHidden(this, colIndex);
			else this.onBeforeColDisplayed(this, colIndex);
			this._hideElements(tbl, colIndex, hide);
			if (this.headersTbl) this._hideElements(this.headersTbl, colIndex, hide);
			let itemIndex = this.hiddenCols.indexOf(colIndex);
			if (hide) {
				if (itemIndex === -1) this.hiddenCols.push(colIndex);
			} else if (itemIndex !== -1) this.hiddenCols.splice(itemIndex, 1);
			if (hide) {
				this.onAfterColHidden(this, colIndex);
				this.emitter.emit("column-hidden", tf, this, colIndex, this.hiddenCols);
			} else {
				this.onAfterColDisplayed(this, colIndex);
				this.emitter.emit("column-shown", tf, this, colIndex, this.hiddenCols);
			}
		}
		/**
		* Show specified column
		* @param  {Number} colIndex Column index
		*/
		showCol(colIndex) {
			if (isUndef(colIndex) || !this.isColHidden(colIndex)) return;
			if (this.manager && this.contEl) {
				let itm = elm("col_" + colIndex + "_" + this.tf.id);
				if (itm) itm.click();
			} else this.setHidden(colIndex, false);
		}
		/**
		* Hide specified column
		* @param  {Number} colIndex Column index
		*/
		hideCol(colIndex) {
			if (isUndef(colIndex) || this.isColHidden(colIndex)) return;
			if (this.manager && this.contEl) {
				let itm = elm("col_" + colIndex + "_" + this.tf.id);
				if (itm) itm.click();
			} else this.setHidden(colIndex, true);
		}
		/**
		* Determine if specified column is hidden
		* @param  {Number} colIndex Column index
		*/
		isColHidden(colIndex) {
			if (this.hiddenCols.indexOf(colIndex) !== -1) return true;
			return false;
		}
		/**
		* Toggle visibility of specified column
		* @param  {Number} colIndex Column index
		*/
		toggleCol(colIndex) {
			if (isUndef(colIndex) || this.isColHidden(colIndex)) this.showCol(colIndex);
			else this.hideCol(colIndex);
		}
		/**
		* Return the indexes of the columns currently hidden
		* @return {Array} column indexes
		*/
		getHiddenCols() {
			return this.hiddenCols;
		}
		/**
		* Remove the columns manager
		*/
		destroy() {
			if (!this.initialized) return;
			if (elm(this.contElTgtId)) elm(this.contElTgtId).innerHTML = "";
			else {
				this.contEl.innerHTML = "";
				removeElm(this.contEl);
				this.contEl = null;
			}
			this.btnEl.innerHTML = "";
			removeElm(this.btnEl);
			this.btnEl = null;
			this.emitter.off(["hide-column"], (tf, colIndex) => this.hideCol(colIndex));
			this.boundMouseup = null;
			this.initialized = false;
		}
		_getHeaderText(cell) {
			if (!cell.hasChildNodes) return "";
			for (let i = 0; i < cell.childNodes.length; i++) {
				let n = cell.childNodes[i];
				if (n.nodeType === 3) return n.nodeValue;
				else if (n.nodeType === 1) {
					if (n.id && n.id.indexOf("popUp") !== -1) continue;
					else return getText(n);
				}
			}
			return "";
		}
		_hideElements(tbl, colIdx, hide) {
			this._hideCells(tbl, colIdx, hide);
			this._hideCol(tbl, colIdx, hide);
		}
		_hideCells(tbl, colIdx, hide) {
			for (let i = 0; i < tbl.rows.length; i++) {
				let cell = tbl.rows[i].cells[colIdx];
				if (cell) cell.style.display = hide ? NONE : "";
			}
		}
		_hideCol(tbl, colIdx, hide) {
			let colElms = tag(tbl, "col");
			if (colElms.length === 0) return;
			colElms[colIdx].style.display = hide ? NONE : "";
		}
		_hideAtStart() {
			this.atStart.forEach((colIdx) => {
				this.hideCol(colIdx);
			});
		}
	};
	//#endregion
	//#region node_modules/sugar-core/sugar-core.js
	var require_sugar_core = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		(function() {
			"use strict";
			/***
			* @module Core
			* @description Core functionality including the ability to define methods and
			*              extend onto natives.
			*
			***/
			var Sugar;
			var SUGAR_GLOBAL = "Sugar";
			var NATIVE_NAMES = "Object Number String Array Date RegExp Function";
			var STATIC = 1;
			var INSTANCE = 2;
			var PROPERTY_DESCRIPTOR_SUPPORT = !!(Object.defineProperty && Object.defineProperties);
			var globalContext = getGlobal();
			var allowObjectPrototype = false;
			var namespacesByName = {};
			var namespacesByClassString = {};
			// istanbul ignore next
			var defineProperty = PROPERTY_DESCRIPTOR_SUPPORT ? Object.defineProperty : definePropertyShim;
			var DefaultChainable = getNewChainableClass("Chainable");
			function getGlobal() {
				return testGlobal(typeof global !== "undefined" && global) || testGlobal(typeof window !== "undefined" && window);
			}
			function testGlobal(obj) {
				return obj && obj.Object === Object ? obj : null;
			}
			function setupGlobal() {
				Sugar = globalContext[SUGAR_GLOBAL];
				// istanbul ignore if
				if (Sugar) return;
				Sugar = function(arg) {
					forEachProperty(Sugar, function(sugarNamespace, name) {
						if (hasOwn(namespacesByName, name)) sugarNamespace.extend(arg);
					});
					return Sugar;
				};
				// istanbul ignore else
				if (typeof module !== "undefined" && module.exports) module.exports = Sugar;
				else try {
					globalContext[SUGAR_GLOBAL] = Sugar;
				} catch (e) {}
				forEachProperty(NATIVE_NAMES.split(" "), function(name) {
					createNamespace(name);
				});
				setGlobalProperties();
			}
			/***
			* @method createNamespace(name)
			* @returns SugarNamespace
			* @namespace Sugar
			* @short Creates a new Sugar namespace.
			* @extra This method is for plugin developers who want to define methods to be
			*        used with natives that Sugar does not handle by default. The new
			*        namespace will appear on the `Sugar` global with all the methods of
			*        normal namespaces, including the ability to define new methods. When
			*        extended, any defined methods will be mapped to `name` in the global
			*        context.
			*
			* @example
			*
			*   Sugar.createNamespace('Boolean');
			*
			* @param {string} name - The namespace name.
			*
			***/
			function createNamespace(name) {
				var isObject = name === "Object";
				var sugarNamespace = getNewChainableClass(name, true);
				/***
				* @method extend([opts])
				* @returns Sugar
				* @namespace Sugar
				* @short Extends Sugar defined methods onto natives.
				* @extra This method can be called on individual namespaces like
				*        `Sugar.Array` or on the `Sugar` global itself, in which case
				*        [opts] will be forwarded to each `extend` call. For more,
				*        see `extending`.
				*
				* @options
				*
				*   methods           An array of method names to explicitly extend.
				*
				*   except            An array of method names or global namespaces (`Array`,
				*                     `String`) to explicitly exclude. Namespaces should be the
				*                     actual global objects, not strings.
				*
				*   namespaces        An array of global namespaces (`Array`, `String`) to
				*                     explicitly extend. Namespaces should be the actual
				*                     global objects, not strings.
				*
				*   enhance           A shortcut to disallow all "enhance" flags at once
				*                     (flags listed below). For more, see `enhanced methods`.
				*                     Default is `true`.
				*
				*   enhanceString     A boolean allowing String enhancements. Default is `true`.
				*
				*   enhanceArray      A boolean allowing Array enhancements. Default is `true`.
				*
				*   objectPrototype   A boolean allowing Sugar to extend Object.prototype
				*                     with instance methods. This option is off by default
				*                     and should generally not be used except with caution.
				*                     For more, see `object methods`.
				*
				* @example
				*
				*   Sugar.Array.extend();
				*   Sugar.extend();
				*
				* @option {Array<string>} [methods]
				* @option {Array<string|NativeConstructor>} [except]
				* @option {Array<NativeConstructor>} [namespaces]
				* @option {boolean} [enhance]
				* @option {boolean} [enhanceString]
				* @option {boolean} [enhanceArray]
				* @option {boolean} [objectPrototype]
				* @param {ExtendOptions} [opts]
				*
				***
				* @method extend([opts])
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Extends Sugar defined methods for a specific namespace onto natives.
				* @param {ExtendOptions} [opts]
				*
				***/
				var extend = function(opts) {
					var nativeClass = globalContext[name], nativeProto = nativeClass.prototype;
					var staticMethods = {}, instanceMethods = {}, methodsByName;
					function objectRestricted(name, target) {
						return isObject && target === nativeProto && (!allowObjectPrototype || name === "get" || name === "set");
					}
					function arrayOptionExists(field, val) {
						var arr = opts[field];
						if (arr) {
							for (var i = 0, el; el = arr[i]; i++) if (el === val) return true;
						}
						return false;
					}
					function arrayOptionExcludes(field, val) {
						return opts[field] && !arrayOptionExists(field, val);
					}
					function disallowedByFlags(methodName, target, flags) {
						if (!target[methodName] || !flags) return false;
						for (var i = 0; i < flags.length; i++) if (opts[flags[i]] === false) return true;
					}
					function namespaceIsExcepted() {
						return arrayOptionExists("except", nativeClass) || arrayOptionExcludes("namespaces", nativeClass);
					}
					function methodIsExcepted(methodName) {
						return arrayOptionExists("except", methodName);
					}
					function canExtend(methodName, method, target) {
						return !objectRestricted(methodName, target) && !disallowedByFlags(methodName, target, method.flags) && !methodIsExcepted(methodName);
					}
					opts = opts || {};
					methodsByName = opts.methods;
					if (namespaceIsExcepted()) return;
					else if (isObject && typeof opts.objectPrototype === "boolean") allowObjectPrototype = opts.objectPrototype;
					forEachProperty(methodsByName || sugarNamespace, function(method, methodName) {
						if (methodsByName) {
							methodName = method;
							method = sugarNamespace[methodName];
						}
						if (hasOwn(method, "instance") && canExtend(methodName, method, nativeProto)) instanceMethods[methodName] = method.instance;
						if (hasOwn(method, "static") && canExtend(methodName, method, nativeClass)) staticMethods[methodName] = method;
					});
					extendNative(nativeClass, staticMethods);
					extendNative(nativeProto, instanceMethods);
					if (!methodsByName) setProperty(sugarNamespace, "active", true);
					return sugarNamespace;
				};
				function defineWithOptionCollect(methodName, instance, args) {
					setProperty(sugarNamespace, methodName, function(arg1, arg2, arg3) {
						var opts = collectDefineOptions(arg1, arg2, arg3);
						defineMethods(sugarNamespace, opts.methods, instance, args, opts.last);
						return sugarNamespace;
					});
				}
				/***
				* @method defineStatic(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Defines static methods on the namespace that can later be extended
				*        onto the native globals.
				* @extra Accepts either a single object mapping names to functions, or name
				*        and function as two arguments. If `extend` was previously called
				*        with no arguments, the method will be immediately mapped to its
				*        native when defined.
				*
				* @example
				*
				*   Sugar.Number.defineStatic({
				*     isOdd: function (num) {
				*       return num % 2 === 1;
				*     }
				*   });
				*
				* @signature defineStatic(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				defineWithOptionCollect("defineStatic", STATIC);
				/***
				* @method defineInstance(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Defines methods on the namespace that can later be extended as
				*        instance methods onto the native prototype.
				* @extra Accepts either a single object mapping names to functions, or name
				*        and function as two arguments. All functions should accept the
				*        native for which they are mapped as their first argument, and should
				*        never refer to `this`. If `extend` was previously called with no
				*        arguments, the method will be immediately mapped to its native when
				*        defined.
				*
				*        Methods cannot accept more than 4 arguments in addition to the
				*        native (5 arguments total). Any additional arguments will not be
				*        mapped. If the method needs to accept unlimited arguments, use
				*        `defineInstanceWithArguments`. Otherwise if more options are
				*        required, use an options object instead.
				*
				* @example
				*
				*   Sugar.Number.defineInstance({
				*     square: function (num) {
				*       return num * num;
				*     }
				*   });
				*
				* @signature defineInstance(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				defineWithOptionCollect("defineInstance", INSTANCE);
				/***
				* @method defineInstanceAndStatic(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short A shortcut to define both static and instance methods on the namespace.
				* @extra This method is intended for use with `Object` instance methods. Sugar
				*        will not map any methods to `Object.prototype` by default, so defining
				*        instance methods as static helps facilitate their proper use.
				*
				* @example
				*
				*   Sugar.Object.defineInstanceAndStatic({
				*     isAwesome: function (obj) {
				*       // check if obj is awesome!
				*     }
				*   });
				*
				* @signature defineInstanceAndStatic(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				defineWithOptionCollect("defineInstanceAndStatic", 3);
				/***
				* @method defineStaticWithArguments(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Defines static methods that collect arguments.
				* @extra This method is identical to `defineStatic`, except that when defined
				*        methods are called, they will collect any arguments past `n - 1`,
				*        where `n` is the number of arguments that the method accepts.
				*        Collected arguments will be passed to the method in an array
				*        as the last argument defined on the function.
				*
				* @example
				*
				*   Sugar.Number.defineStaticWithArguments({
				*     addAll: function (num, args) {
				*       for (var i = 0; i < args.length; i++) {
				*         num += args[i];
				*       }
				*       return num;
				*     }
				*   });
				*
				* @signature defineStaticWithArguments(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				defineWithOptionCollect("defineStaticWithArguments", STATIC, true);
				/***
				* @method defineInstanceWithArguments(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Defines instance methods that collect arguments.
				* @extra This method is identical to `defineInstance`, except that when
				*        defined methods are called, they will collect any arguments past
				*        `n - 1`, where `n` is the number of arguments that the method
				*        accepts. Collected arguments will be passed to the method as the
				*        last argument defined on the function.
				*
				* @example
				*
				*   Sugar.Number.defineInstanceWithArguments({
				*     addAll: function (num, args) {
				*       for (var i = 0; i < args.length; i++) {
				*         num += args[i];
				*       }
				*       return num;
				*     }
				*   });
				*
				* @signature defineInstanceWithArguments(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				defineWithOptionCollect("defineInstanceWithArguments", INSTANCE, true);
				/***
				* @method defineStaticPolyfill(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Defines static methods that are mapped onto the native if they do
				*        not already exist.
				* @extra Intended only for use creating polyfills that follow the ECMAScript
				*        spec. Accepts either a single object mapping names to functions, or
				*        name and function as two arguments. Note that polyfill methods will
				*        be immediately mapped onto their native prototype regardless of the
				*        use of `extend`.
				*
				* @example
				*
				*   Sugar.Object.defineStaticPolyfill({
				*     keys: function (obj) {
				*       // get keys!
				*     }
				*   });
				*
				* @signature defineStaticPolyfill(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				setProperty(sugarNamespace, "defineStaticPolyfill", function(arg1, arg2, arg3) {
					var opts = collectDefineOptions(arg1, arg2, arg3);
					extendNative(globalContext[name], opts.methods, true, opts.last);
					return sugarNamespace;
				});
				/***
				* @method defineInstancePolyfill(methods)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Defines instance methods that are mapped onto the native prototype
				*        if they do not already exist.
				* @extra Intended only for use creating polyfills that follow the ECMAScript
				*        spec. Accepts either a single object mapping names to functions, or
				*        name and function as two arguments. This method differs from
				*        `defineInstance` as there is no static signature (as the method
				*        is mapped as-is to the native), so it should refer to its `this`
				*        object. Note that polyfill methods will be immediately mapped onto
				*        their native prototype regardless of the use of `extend`.
				*
				* @example
				*
				*   Sugar.Array.defineInstancePolyfill({
				*     indexOf: function (arr, el) {
				*       // index finding code here!
				*     }
				*   });
				*
				* @signature defineInstancePolyfill(methodName, methodFn)
				* @param {Object} methods - Methods to be defined.
				* @param {string} methodName - Name of a single method to be defined.
				* @param {Function} methodFn - Function body of a single method to be defined.
				***/
				setProperty(sugarNamespace, "defineInstancePolyfill", function(arg1, arg2, arg3) {
					var opts = collectDefineOptions(arg1, arg2, arg3);
					extendNative(globalContext[name].prototype, opts.methods, true, opts.last);
					forEachProperty(opts.methods, function(fn, methodName) {
						defineChainableMethod(sugarNamespace, methodName, fn);
					});
					return sugarNamespace;
				});
				/***
				* @method alias(toName, from)
				* @returns SugarNamespace
				* @namespace SugarNamespace
				* @short Aliases one Sugar method to another.
				*
				* @example
				*
				*   Sugar.Array.alias('all', 'every');
				*
				* @signature alias(toName, fn)
				* @param {string} toName - Name for new method.
				* @param {string|Function} from - Method to alias, or string shortcut.
				***/
				setProperty(sugarNamespace, "alias", function(name, source) {
					setMethod(sugarNamespace, name, typeof source === "string" ? sugarNamespace[source] : source);
					return sugarNamespace;
				});
				setProperty(sugarNamespace, "extend", extend);
				namespacesByName[name] = sugarNamespace;
				namespacesByClassString["[object " + name + "]"] = sugarNamespace;
				mapNativeToChainable(name);
				mapObjectChainablesToNamespace(sugarNamespace);
				return Sugar[name] = sugarNamespace;
			}
			function setGlobalProperties() {
				setProperty(Sugar, "VERSION", "2.0.6");
				setProperty(Sugar, "extend", Sugar);
				setProperty(Sugar, "toString", toString);
				setProperty(Sugar, "createNamespace", createNamespace);
				setProperty(Sugar, "util", {
					"hasOwn": hasOwn,
					"getOwn": getOwn,
					"setProperty": setProperty,
					"classToString": classToString,
					"defineProperty": defineProperty,
					"forEachProperty": forEachProperty,
					"mapNativeToChainable": mapNativeToChainable
				});
			}
			function toString() {
				return SUGAR_GLOBAL;
			}
			function defineMethods(sugarNamespace, methods, type, args, flags) {
				forEachProperty(methods, function(method, methodName) {
					var instanceMethod, staticMethod = method;
					if (args) staticMethod = wrapMethodWithArguments(method);
					if (flags) staticMethod.flags = flags;
					if (type & INSTANCE && !method.instance) {
						instanceMethod = wrapInstanceMethod(method, args);
						setProperty(staticMethod, "instance", instanceMethod);
					}
					if (type & STATIC) setProperty(staticMethod, "static", true);
					setMethod(sugarNamespace, methodName, staticMethod);
					if (sugarNamespace.active) sugarNamespace.extend(methodName);
				});
			}
			function collectDefineOptions(arg1, arg2, arg3) {
				var methods, last;
				if (typeof arg1 === "string") {
					methods = {};
					methods[arg1] = arg2;
					last = arg3;
				} else {
					methods = arg1;
					last = arg2;
				}
				return {
					last,
					methods
				};
			}
			function wrapInstanceMethod(fn, args) {
				return args ? wrapMethodWithArguments(fn, true) : wrapInstanceMethodFixed(fn);
			}
			function wrapMethodWithArguments(fn, instance) {
				var startCollect = fn.length - 1 - (instance ? 1 : 0);
				return function() {
					var args = [], collectedArgs = [], len;
					if (instance) args.push(this);
					len = Math.max(arguments.length, startCollect);
					for (var i = 0; i < len; i++) if (i < startCollect) args.push(arguments[i]);
					else collectedArgs.push(arguments[i]);
					args.push(collectedArgs);
					return fn.apply(this, args);
				};
			}
			function wrapInstanceMethodFixed(fn) {
				switch (fn.length) {
					case 0:
					case 1: return function() {
						return fn(this);
					};
					case 2: return function(a) {
						return fn(this, a);
					};
					case 3: return function(a, b) {
						return fn(this, a, b);
					};
					case 4: return function(a, b, c) {
						return fn(this, a, b, c);
					};
					case 5: return function(a, b, c, d) {
						return fn(this, a, b, c, d);
					};
				}
			}
			function extendNative(target, source, polyfill, override) {
				forEachProperty(source, function(method, name) {
					if (polyfill && !override && target[name]) return;
					setProperty(target, name, method);
				});
			}
			function setMethod(sugarNamespace, methodName, method) {
				sugarNamespace[methodName] = method;
				if (method.instance) defineChainableMethod(sugarNamespace, methodName, method.instance, true);
			}
			function getNewChainableClass(name) {
				var fn = function SugarChainable(obj, arg) {
					if (!(this instanceof fn)) return new fn(obj, arg);
					if (this.constructor !== fn) obj = this.constructor.apply(obj, arguments);
					this.raw = obj;
				};
				setProperty(fn, "toString", function() {
					return SUGAR_GLOBAL + name;
				});
				setProperty(fn.prototype, "valueOf", function() {
					return this.raw;
				});
				return fn;
			}
			function defineChainableMethod(sugarNamespace, methodName, fn) {
				var wrapped = wrapWithChainableResult(fn), existing, collision, dcp = DefaultChainable.prototype;
				existing = dcp[methodName];
				collision = existing && existing !== Object.prototype[methodName];
				if (!existing || !existing.disambiguate) dcp[methodName] = collision ? disambiguateMethod(methodName) : wrapped;
				sugarNamespace.prototype[methodName] = wrapped;
				if (sugarNamespace === Sugar.Object) mapObjectChainableToAllNamespaces(methodName, wrapped);
			}
			function mapObjectChainablesToNamespace(sugarNamespace) {
				forEachProperty(Sugar.Object && Sugar.Object.prototype, function(val, methodName) {
					if (typeof val === "function") setObjectChainableOnNamespace(sugarNamespace, methodName, val);
				});
			}
			function mapObjectChainableToAllNamespaces(methodName, fn) {
				forEachProperty(namespacesByName, function(sugarNamespace) {
					setObjectChainableOnNamespace(sugarNamespace, methodName, fn);
				});
			}
			function setObjectChainableOnNamespace(sugarNamespace, methodName, fn) {
				var proto = sugarNamespace.prototype;
				if (!hasOwn(proto, methodName)) proto[methodName] = fn;
			}
			function wrapWithChainableResult(fn) {
				return function() {
					return new DefaultChainable(fn.apply(this.raw, arguments));
				};
			}
			function disambiguateMethod(methodName) {
				var fn = function() {
					var raw = this.raw, sugarNamespace;
					if (raw != null) sugarNamespace = namespacesByClassString[classToString(raw)];
					if (!sugarNamespace) sugarNamespace = Sugar.Object;
					return new sugarNamespace(raw)[methodName].apply(this, arguments);
				};
				fn.disambiguate = true;
				return fn;
			}
			function mapNativeToChainable(name, methodNames) {
				var sugarNamespace = namespacesByName[name], nativeProto = globalContext[name].prototype;
				if (!methodNames && ownPropertyNames) methodNames = ownPropertyNames(nativeProto);
				forEachProperty(methodNames, function(methodName) {
					if (nativeMethodProhibited(methodName)) return;
					try {
						var fn = nativeProto[methodName];
						if (typeof fn !== "function") return;
					} catch (e) {
						return;
					}
					defineChainableMethod(sugarNamespace, methodName, fn);
				});
			}
			function nativeMethodProhibited(methodName) {
				return methodName === "constructor" || methodName === "valueOf" || methodName === "__proto__";
			}
			var ownPropertyNames = Object.getOwnPropertyNames, internalToString = Object.prototype.toString, internalHasOwnProperty = Object.prototype.hasOwnProperty;
			var forEachProperty = function(obj, fn) {
				for (var key in obj) {
					if (!hasOwn(obj, key)) continue;
					if (fn.call(obj, obj[key], key, obj) === false) break;
				}
			};
			// istanbul ignore next
			function definePropertyShim(obj, prop, descriptor) {
				obj[prop] = descriptor.value;
			}
			function setProperty(target, name, value, enumerable) {
				defineProperty(target, name, {
					value,
					enumerable: !!enumerable,
					configurable: true,
					writable: true
				});
			}
			function classToString(obj) {
				return internalToString.call(obj);
			}
			function hasOwn(obj, prop) {
				return !!obj && internalHasOwnProperty.call(obj, prop);
			}
			function getOwn(obj, prop) {
				if (hasOwn(obj, prop)) return obj[prop];
			}
			setupGlobal();
			var NATIVE_TYPES = "Boolean Number String Date RegExp Function Array Error Set Map";
			var NO_KEYS_IN_STRING_OBJECTS = !("0" in Object("a"));
			var PRIVATE_PROP_PREFIX = "_sugar_";
			var TRIM_CHARS = "	\n\v\f\r \xA0 ᠎             \u2028\u2029 ", HALF_WIDTH_ZERO = 48, FULL_WIDTH_ZERO = 65296, HALF_WIDTH_PERIOD = ".", FULL_WIDTH_PERIOD = ".", HALF_WIDTH_COMMA = ",", sugarObject = Sugar.Object, sugarArray = Sugar.Array, sugarDate = Sugar.Date, sugarString = Sugar.String;
			Sugar.Number;
			var sugarFunction = Sugar.Function;
			Sugar.RegExp;
			var isString, isFunction, isArray;
			function buildClassChecks() {
				var knownTypes = {};
				function addCoreTypes() {
					var names = spaceSplit(NATIVE_TYPES);
					buildPrimitiveClassCheck(names[0]);
					buildPrimitiveClassCheck(names[1]);
					isString = buildPrimitiveClassCheck(names[2]);
					buildClassCheck(names[3]);
					buildClassCheck(names[4]);
					isFunction = buildClassCheck(names[5]);
					// istanbul ignore next
					isArray = Array.isArray || buildClassCheck(names[6]);
					buildClassCheck(names[7]);
					buildClassCheck(names[8], typeof Set !== "undefined" && Set);
					buildClassCheck(names[9], typeof Map !== "undefined" && Map);
					addKnownType("Arguments");
					addKnownType(names[0]);
					addKnownType(names[1]);
					addKnownType(names[2]);
					addKnownType(names[3]);
					addKnownType(names[4]);
					addKnownType(names[6]);
				}
				function addArrayTypes() {
					forEach(spaceSplit("Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64"), function(str) {
						addKnownType(str + "Array");
					});
				}
				function addKnownType(className) {
					var str = "[object " + className + "]";
					knownTypes[str] = true;
				}
				function buildClassCheck(className, globalObject) {
					// istanbul ignore if
					if (globalObject && isClass(new globalObject(), "Object")) return getConstructorClassCheck(globalObject);
					else return getToStringClassCheck(className);
				}
				// istanbul ignore next
				function getConstructorClassCheck(obj) {
					var ctorStr = String(obj);
					return function(obj) {
						return String(obj.constructor) === ctorStr;
					};
				}
				function getToStringClassCheck(className) {
					return function(obj, str) {
						return isClass(obj, className, str);
					};
				}
				function buildPrimitiveClassCheck(className) {
					var type = className.toLowerCase();
					return function(obj) {
						var t = typeof obj;
						return t === type || t === "object" && isClass(obj, className);
					};
				}
				addCoreTypes();
				addArrayTypes();
			}
			function isClass(obj, className, str) {
				if (!str) str = classToString(obj);
				return str === "[object " + className + "]";
			}
			function wrapNamespace(method) {
				return function(sugarNamespace, arg1, arg2) {
					sugarNamespace[method](arg1, arg2);
				};
			}
			var defineStaticPolyfill = wrapNamespace("defineStaticPolyfill"), defineInstancePolyfill = wrapNamespace("defineInstancePolyfill");
			function assertCallable(obj) {
				if (!isFunction(obj)) throw new TypeError("Function is not callable");
			}
			function isDefined(o) {
				return o !== void 0;
			}
			function privatePropertyAccessor(key) {
				var privateKey = PRIVATE_PROP_PREFIX + key;
				return function(obj, val) {
					if (arguments.length > 1) {
						setProperty(obj, privateKey, val);
						return obj;
					}
					return obj[privateKey];
				};
			}
			function isPrimitive(obj, type) {
				type = type || typeof obj;
				return obj == null || type === "string" || type === "number" || type === "boolean";
			}
			function coercePrimitiveToObject(obj) {
				if (isPrimitive(obj)) obj = Object(obj);
				// istanbul ignore next
				if (NO_KEYS_IN_STRING_OBJECTS && isString(obj)) forceStringCoercion(obj);
				return obj;
			}
			// istanbul ignore next
			function forceStringCoercion(obj) {
				var i = 0, chr;
				while (chr = obj.charAt(i)) obj[i++] = chr;
			}
			function isArrayIndex(n) {
				return n >>> 0 == n && n != 4294967295;
			}
			function iterateOverSparseArray(arr, fn, fromIndex, loop) {
				var indexes = getSparseArrayIndexes(arr, fromIndex, loop), index;
				for (var i = 0, len = indexes.length; i < len; i++) {
					index = indexes[i];
					fn.call(arr, arr[index], index, arr);
				}
				return arr;
			}
			function getSparseArrayIndexes(arr, fromIndex, loop, fromRight) {
				var indexes = [], i;
				for (i in arr)
 // istanbul ignore next
				if (isArrayIndex(i) && (loop || (fromRight ? i <= fromIndex : i >= fromIndex))) indexes.push(+i);
				indexes.sort(function(a, b) {
					var aLoop = a > fromIndex;
					// istanbul ignore if
					if (aLoop !== b > fromIndex) return aLoop ? -1 : 1;
					return a - b;
				});
				return indexes;
			}
			function spaceSplit(str) {
				return str.split(" ");
			}
			function forEach(arr, fn) {
				for (var i = 0, len = arr.length; i < len; i++) {
					if (!(i in arr)) return iterateOverSparseArray(arr, fn, i);
					fn(arr[i], i);
				}
			}
			// istanbul ignore next
			var trunc = Math.trunc || function(n) {
				if (n === 0 || !isFinite(n)) return n;
				return n < 0 ? ceil(n) : floor(n);
			};
			function padNumber(num, place, sign, base, replacement) {
				var str = abs(num).toString(base || 10);
				str = repeatString(replacement || "0", place - str.replace(/\.\d+/, "").length) + str;
				if (sign || num < 0) str = (num < 0 ? "-" : "+") + str;
				return str;
			}
			var fullWidthNumberMap;
			function buildFullWidthNumber() {
				var fwp = FULL_WIDTH_PERIOD, hwp = HALF_WIDTH_PERIOD, hwc = HALF_WIDTH_COMMA, fwn = "";
				fullWidthNumberMap = {};
				for (var i = 0, digit; i <= 9; i++) {
					digit = chr(i + FULL_WIDTH_ZERO);
					fwn += digit;
					fullWidthNumberMap[digit] = chr(i + HALF_WIDTH_ZERO);
				}
				fullWidthNumberMap[hwc] = "";
				fullWidthNumberMap[fwp] = hwp;
				fullWidthNumberMap[hwp] = hwp;
				allCharsReg(fwn + fwp + hwc + hwp);
			}
			var abs = Math.abs, ceil = Math.ceil, floor = Math.floor;
			var chr = String.fromCharCode;
			function repeatString(str, num) {
				var result = "";
				str = str.toString();
				while (num > 0) {
					if (num & 1) result += str;
					if (num >>= 1) str += str;
				}
				return result;
			}
			function allCharsReg(src) {
				return RegExp("[" + src + "]", "g");
			}
			privatePropertyAccessor("utc");
			buildClassChecks();
			buildFullWidthNumber();
			/***
			* @module ES5
			* @description Functions and polyfill methods that fix ES5 functionality. This
			*              module is excluded from default builds, and can be included if
			*              you need legacy browser support (IE8 and below).
			*
			***/
			var DONT_ENUM_PROPS = [
				"valueOf",
				"toString",
				"constructor",
				"isPrototypeOf",
				"hasOwnProperty",
				"toLocaleString",
				"propertyIsEnumerable"
			];
			/***
			* @fix
			* @short Fixes DontEnum bug for iteration methods in < IE9.
			***/
			function buildDontEnumFix() {
				if (!{ toString: 1 }.propertyIsEnumerable("toString")) {
					var forEachEnumerableProperty = forEachProperty;
					forEachProperty = function(obj, fn) {
						forEachEnumerableProperty(obj, fn);
						for (var i = 0, key; key = DONT_ENUM_PROPS[i]; i++) if (hasOwn(obj, key)) {
							if (fn.call(obj, obj[key], key, obj) === false) break;
						}
					};
				}
			}
			/***
			* @fix
			* @short Adds native methods to chainables in < IE9.
			***/
			function buildChainableNativeMethodsFix() {
				if (!Object.getOwnPropertyNames) defineNativeMethodsOnChainable();
			}
			function defineNativeMethodsOnChainable() {
				var nativeTokens = {
					"Function": "apply,call",
					"RegExp": "compile,exec,test",
					"Number": "toExponential,toFixed,toLocaleString,toPrecision",
					"Object": "hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString",
					"Array": "concat,join,pop,push,reverse,shift,slice,sort,splice,toLocaleString,unshift",
					"Date": "getTime,getTimezoneOffset,setTime,toDateString,toGMTString,toLocaleDateString,toLocaleString,toLocaleTimeString,toTimeString,toUTCString",
					"String": "anchor,big,blink,bold,charAt,charCodeAt,concat,fixed,fontcolor,fontsize,indexOf,italics,lastIndexOf,link,localeCompare,match,replace,search,slice,small,split,strike,sub,substr,substring,sup,toLocaleLowerCase,toLocaleUpperCase,toLowerCase,toUpperCase"
				};
				var dateTokens = "FullYear,Month,Date,Hours,Minutes,Seconds,Milliseconds".split(",");
				function addDateTokens(prefix, arr) {
					for (var i = 0; i < dateTokens.length; i++) arr.push(prefix + dateTokens[i]);
				}
				forEachProperty(nativeTokens, function(str, name) {
					var tokens = str.split(",");
					if (name === "Date") {
						addDateTokens("get", tokens);
						addDateTokens("set", tokens);
						addDateTokens("getUTC", tokens);
						addDateTokens("setUTC", tokens);
					}
					tokens.push("toString");
					mapNativeToChainable(name, tokens);
				});
			}
			buildDontEnumFix();
			buildChainableNativeMethodsFix();
			/*** @namespace Object ***/
			function assertNonNull(obj) {
				if (obj == null) throw new TypeError("Object required");
			}
			defineStaticPolyfill(sugarObject, { "keys": function(obj) {
				var keys = [];
				assertNonNull(obj);
				forEachProperty(coercePrimitiveToObject(obj), function(val, key) {
					keys.push(key);
				});
				return keys;
			} });
			/*** @namespace Array ***/
			function arrayIndexOf(arr, search, fromIndex, fromRight) {
				var length = arr.length, defaultFromIndex, index, increment = fromRight ? -1 : 1;
				defaultFromIndex = fromRight ? length - 1 : 0;
				fromIndex = trunc(fromIndex);
				if (!fromIndex && fromIndex !== 0) fromIndex = defaultFromIndex;
				if (fromIndex < 0) fromIndex = length + fromIndex;
				if (!fromRight && fromIndex < 0 || fromRight && fromIndex >= length) fromIndex = defaultFromIndex;
				index = fromIndex;
				while (fromRight && index >= 0 || !fromRight && index < length) {
					if (!(index in arr)) return sparseIndexOf(arr, search, fromIndex, fromRight);
					if (isArrayIndex(index) && arr[index] === search) return index;
					index += increment;
				}
				return -1;
			}
			function sparseIndexOf(arr, search, fromIndex, fromRight) {
				var indexes = getSparseArrayIndexes(arr, fromIndex, false, fromRight), index;
				indexes.sort(function(a, b) {
					return fromRight ? b - a : a - b;
				});
				while ((index = indexes.shift()) !== void 0) if (arr[index] === search) return +index;
				return -1;
			}
			function arrayReduce(arr, fn, initialValue, fromRight) {
				var length = arr.length, count = 0, defined = isDefined(initialValue), result, index;
				assertCallable(fn);
				if (length == 0 && !defined) throw new TypeError("Reduce called on empty array with no initial value");
				else if (defined) result = initialValue;
				else {
					result = arr[fromRight ? length - 1 : count];
					count++;
				}
				while (count < length) {
					index = fromRight ? length - count - 1 : count;
					if (index in arr) result = fn(result, arr[index], index, arr);
					count++;
				}
				return result;
			}
			defineStaticPolyfill(sugarArray, { 
			/***
			*
			* @method isArray(obj)
			* @returns Boolean
			* @polyfill ES5
			* @static
			* @short Returns true if `obj` is an Array.
			*
			* @example
			*
			*   Array.isArray(3)        -> false
			*   Array.isArray(true)     -> false
			*   Array.isArray('wasabi') -> false
			*   Array.isArray([1,2,3])  -> true
			*
			***/
"isArray": function(obj) {
				return isArray(obj);
			} });
			defineInstancePolyfill(sugarArray, {
				"every": function(fn) {
					arguments.length;
					var context = arguments[1];
					var length = this.length, index = 0;
					assertCallable(fn);
					while (index < length) {
						if (index in this && !fn.call(context, this[index], index, this)) return false;
						index++;
					}
					return true;
				},
				"some": function(fn) {
					arguments.length;
					var context = arguments[1];
					var length = this.length, index = 0;
					assertCallable(fn);
					while (index < length) {
						if (index in this && fn.call(context, this[index], index, this)) return true;
						index++;
					}
					return false;
				},
				"map": function(fn) {
					arguments.length;
					var context = arguments[1];
					var length = this.length, index = 0, result = new Array(length);
					assertCallable(fn);
					while (index < length) {
						if (index in this) result[index] = fn.call(context, this[index], index, this);
						index++;
					}
					return result;
				},
				"filter": function(fn) {
					arguments.length;
					var context = arguments[1];
					var length = this.length, index = 0, result = [];
					assertCallable(fn);
					while (index < length) {
						if (index in this && fn.call(context, this[index], index, this)) result.push(this[index]);
						index++;
					}
					return result;
				},
				/***
				* @method indexOf(search, [fromIndex] = 0)
				* @returns Number
				* @polyfill ES5
				* @short Searches the array and returns the first index where `search` occurs,
				*        or `-1` if the element is not found.
				* @extra [fromIndex] is the index from which to begin the search. This
				*        method performs a simple strict equality comparison on `search`.
				*        Sugar does not enhance this method to support `enhanced matching`.
				*        For such functionality, use the `findIndex` method instead.
				*
				* @example
				*
				*   [1,2,3].indexOf(3) -> 1
				*   [1,2,3].indexOf(7) -> -1
				*
				***/
				"indexOf": function(search) {
					arguments.length;
					var fromIndex = arguments[1];
					if (isString(this)) return this.indexOf(search, fromIndex);
					return arrayIndexOf(this, search, fromIndex);
				},
				/***
				* @method lastIndexOf(search, [fromIndex] = array.length - 1)
				* @returns Number
				* @polyfill ES5
				* @short Searches the array from the end and returns the first index where
				*        `search` occurs, or `-1` if the element is not found.
				* @extra [fromIndex] is the index from which to begin the search. This method
				*        performs a simple strict equality comparison on `search`.
				*        Sugar does not enhance this method to support `enhanced matching`.
				*
				* @example
				*
				*   [1,2,1].lastIndexOf(1) -> 2
				*   [1,2,1].lastIndexOf(7) -> -1
				*
				***/
				"lastIndexOf": function(search) {
					arguments.length;
					var fromIndex = arguments[1];
					if (isString(this)) return this.lastIndexOf(search, fromIndex);
					return arrayIndexOf(this, search, fromIndex, true);
				},
				/***
				* @method forEach([eachFn], [context])
				* @polyfill ES5
				* @short Iterates over the array, calling [eachFn] on each loop.
				* @extra [context] becomes the `this` object.
				*
				* @callback eachFn
				*
				*   el   The element of the current iteration.
				*   i    The index of the current iteration.
				*   arr  A reference to the array.
				*
				* @example
				*
				*   ['a','b','c'].forEach(function(a) {
				*     // Called 3 times: 'a','b','c'
				*   });
				*
				***/
				"forEach": function(eachFn) {
					arguments.length;
					var context = arguments[1];
					var length = this.length, index = 0;
					assertCallable(eachFn);
					while (index < length) {
						if (index in this) eachFn.call(context, this[index], index, this);
						index++;
					}
				},
				/***
				* @method reduce(reduceFn, [init])
				* @returns Mixed
				* @polyfill ES5
				* @short Reduces the array to a single result.
				* @extra This operation is sometimes called "accumulation", as it takes the
				*        result of the last iteration of `reduceFn` and passes it as the first
				*        argument to the next iteration, "accumulating" that value as it goes.
				*        The return value of this method will be the return value of the final
				*        iteration of `reduceFn`. If [init] is passed, it will be the initial
				*        "accumulator" (the first argument). If [init] is not passed, then it
				*        will take the first element in the array, and `reduceFn` will not be
				*        called for that element.
				*
				* @callback reduceFn
				*
				*   acc  The "accumulator". Either [init], the result of the last iteration
				*        of `reduceFn`, or the first element of the array.
				*   el   The current element for this iteration.
				*   idx  The current index for this iteration.
				*   arr  A reference to the array.
				*
				* @example
				*
				*   [1,2,3].reduce(function(a, b) {
				*     return a - b; // 1 - 2 - 3
				*   });
				*
				*   [1,2,3].reduce(function(a, b) {
				*     return a - b; // 100 - 1 - 2 - 3
				*   }, 100);
				*
				***/
				"reduce": function(reduceFn) {
					arguments.length;
					var context = arguments[1];
					return arrayReduce(this, reduceFn, context);
				},
				/***
				* @method reduceRight([reduceFn], [init])
				* @returns Mixed
				* @polyfill ES5
				* @short Similar to `Array#reduce`, but operates on the elements in reverse.
				*
				* @callback reduceFn
				*
				*   acc  The "accumulator", either [init], the result of the last iteration
				*        of `reduceFn`, or the last element of the array.
				*   el   The current element for this iteration.
				*   idx  The current index for this iteration.
				*   arr  A reference to the array.
				*
				* @example
				*
				*   [1,2,3].reduceRight(function(a, b) {
				*     return a - b; // 3 - 2 - 1
				*   });
				*
				*   [1,2,3].reduceRight(function(a, b) {
				*     return a - b; // 100 - 3 - 2 - 1
				*   }, 100);
				*
				*
				***/
				"reduceRight": function(reduceFn) {
					arguments.length;
					var context = arguments[1];
					return arrayReduce(this, reduceFn, context, true);
				}
			});
			/*** @namespace String ***/
			var TRIM_REG = RegExp("^[" + TRIM_CHARS + "]+|[" + TRIM_CHARS + "]+$", "g");
			defineInstancePolyfill(sugarString, { 
			/***
			* @method trim()
			* @returns String
			* @polyfill ES5
			* @short Removes leading and trailing whitespace from the string.
			* @extra Whitespace is defined as line breaks, tabs, and any character in the
			*        "Space, Separator" Unicode category, conforming to the the ES5 spec.
			*
			* @example
			*
			*   '   wasabi   '.trim()      -> 'wasabi'
			*   '   wasabi   '.trimLeft()  -> 'wasabi   '
			*   '   wasabi   '.trimRight() -> '   wasabi'
			*
			***/
"trim": function() {
				return this.toString().replace(TRIM_REG, "");
			} });
			/*** @namespace Function ***/
			defineInstancePolyfill(sugarFunction, { 
			/***
			* @method bind(context, [arg1], ...)
			* @returns Function
			* @polyfill ES5
			* @short Binds `context` as the `this` object for the function when it is
			*        called. Also allows currying an unlimited number of parameters.
			* @extra "currying" means setting parameters ([arg1], [arg2], etc.) ahead of
			*        time so that they are passed when the function is called later. If
			*        you pass additional parameters when the function is actually called,
			*        they will be added to the end of the curried parameters.
			*
			* @example
			*
			*   logThis.bind('woof')()   -> logs 'woof' as its this object
			*   addArgs.bind(1, 2, 3)()  -> returns 5 with 1 as the this object
			*   addArgs.bind(1)(2, 3, 4) -> returns 9
			*
			***/
"bind": function(context) {
				var boundArgs = [];
				for (var $i = 1, $len = arguments.length; $i < $len; $i++) boundArgs.push(arguments[$i]);
				var fn = this, bound;
				assertCallable(this);
				bound = function() {
					var args = [];
					for (var $i = 0, $len = arguments.length; $i < $len; $i++) args.push(arguments[$i]);
					return fn.apply(fn.prototype && this instanceof fn ? this : context, boundArgs.concat(args));
				};
				bound.prototype = this.prototype;
				return bound;
			} });
			/*** @namespace Date ***/
			defineStaticPolyfill(sugarDate, { 
			/***
			* @method now()
			* @returns String
			* @polyfill ES5
			* @static
			* @short Returns the current time as a Unix timestamp.
			* @extra The number of milliseconds since January 1st, 1970 00:00:00 (UTC).
			*
			* @example
			*
			*   Date.now() -> ex. 1311938296231
			*
			***/
"now": function() {
				return (/* @__PURE__ */ new Date()).getTime();
			} });
			function hasISOSupport() {
				var d = new Date(Date.UTC(2e3, 0));
				return !!d.toISOString && d.toISOString() === "2000-01-01T00:00:00.000Z";
			}
			defineInstancePolyfill(sugarDate, {
				/***
				* @method toISOString()
				* @returns String
				* @polyfill ES5
				* @short Formats the string to ISO8601 format.
				* @extra This will always format as UTC time.
				*
				* @example
				*
				*   Date.create().toISOString() -> ex. 2011-07-05 12:24:55.528Z
				*
				***/
				"toISOString": function() {
					return padNumber(this.getUTCFullYear(), 4) + "-" + padNumber(this.getUTCMonth() + 1, 2) + "-" + padNumber(this.getUTCDate(), 2) + "T" + padNumber(this.getUTCHours(), 2) + ":" + padNumber(this.getUTCMinutes(), 2) + ":" + padNumber(this.getUTCSeconds(), 2) + "." + padNumber(this.getUTCMilliseconds(), 3) + "Z";
				},
				/***
				* @method toJSON([key])
				* @returns String
				* @polyfill ES5
				* @short Returns a JSON representation of the date.
				* @extra This is effectively an alias for `toISOString`. Will always return
				*        the date in UTC time. [key] is ignored.
				*
				* @example
				*
				*   Date.create().toJSON() -> ex. 2011-07-05 12:24:55.528Z
				*
				***/
				"toJSON": function(key) {
					arguments.length;
					return this.toISOString(key);
				}
			}, !hasISOSupport());
		}).call(exports);
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/EnglishLocaleBaseDefinition.js
	var require_EnglishLocaleBaseDefinition = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			"code": "en",
			"plural": true,
			"timeMarkers": "at",
			"ampm": "AM|A.M.|a,PM|P.M.|p",
			"units": "millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s",
			"months": "Jan:uary|,Feb:ruary|,Mar:ch|,Apr:il|,May,Jun:e|,Jul:y|,Aug:ust|,Sep:tember|t|,Oct:ober|,Nov:ember|,Dec:ember|",
			"weekdays": "Sun:day|,Mon:day|,Tue:sday|,Wed:nesday|,Thu:rsday|,Fri:day|,Sat:urday|+weekend",
			"numerals": "zero,one|first,two|second,three|third,four:|th,five|fifth,six:|th,seven:|th,eight:|h,nin:e|th,ten:|th",
			"articles": "a,an,the",
			"tokens": "the,st|nd|rd|th,of|in,a|an,on",
			"time": "{H}:{mm}",
			"past": "{num} {unit} {sign}",
			"future": "{num} {unit} {sign}",
			"duration": "{num} {unit}",
			"modifiers": [
				{
					"name": "half",
					"src": "half",
					"value": .5
				},
				{
					"name": "midday",
					"src": "noon",
					"value": 12
				},
				{
					"name": "midday",
					"src": "midnight",
					"value": 24
				},
				{
					"name": "day",
					"src": "yesterday",
					"value": -1
				},
				{
					"name": "day",
					"src": "today|tonight",
					"value": 0
				},
				{
					"name": "day",
					"src": "tomorrow",
					"value": 1
				},
				{
					"name": "sign",
					"src": "ago|before",
					"value": -1
				},
				{
					"name": "sign",
					"src": "from now|after|from|in|later",
					"value": 1
				},
				{
					"name": "edge",
					"src": "first day|first|beginning",
					"value": -2
				},
				{
					"name": "edge",
					"src": "last day",
					"value": 1
				},
				{
					"name": "edge",
					"src": "end|last",
					"value": 2
				},
				{
					"name": "shift",
					"src": "last",
					"value": -1
				},
				{
					"name": "shift",
					"src": "the|this",
					"value": 0
				},
				{
					"name": "shift",
					"src": "next",
					"value": 1
				}
			],
			"parse": [
				"(?:just)? now",
				"{shift} {unit:5-7}",
				"{months?} {year}",
				"{midday} {4?} {day|weekday}",
				"{months},?[-.\\/\\s]?{year?}",
				"{edge} of (?:day)? {day|weekday}",
				"{0} {num}{1?} {weekday} {2} {months},? {year?}",
				"{shift?} {day?} {weekday?} (?:at)? {midday}",
				"{sign?} {3?} {half} {3?} {unit:3-4|unit:7} {sign?}",
				"{0?} {edge} {weekday?} {2} {shift?} {unit:4-7?} {months?},? {year?}"
			],
			"timeParse": [
				"{day|weekday}",
				"{shift} {unit:5?} {weekday}",
				"{0?} {date}{1?} {2?} {months?}",
				"{weekday} {2?} {shift} {unit:5}",
				"{0?} {num} {2?} {months}\\.?,? {year?}",
				"{num?} {unit:4-5} {sign} {day|weekday}",
				"{0|months} {date?}{1?} of {shift} {unit:6-7}",
				"{0?} {num}{1?} {weekday} of {shift} {unit:6}",
				"{year?}[-.\\/\\s]?{months}[-.\\/\\s]{date}",
				"{date}[-.\\/\\s]{months}(?:[-.\\/\\s]{year|yy})?",
				"{weekday?}\\.?,? {months}\\.?,? {date}{1?},? {year?}",
				"{weekday?}\\.?,? {date} {months} {year}"
			],
			"timeFrontParse": [
				"{sign} {num} {unit}",
				"{num} {unit} {sign}",
				"{4?} {day|weekday}"
			]
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/coreUtilityAliases.js
	var require_coreUtilityAliases = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		module.exports = {
			hasOwn: Sugar.util.hasOwn,
			getOwn: Sugar.util.getOwn,
			setProperty: Sugar.util.setProperty,
			classToString: Sugar.util.classToString,
			defineProperty: Sugar.util.defineProperty,
			forEachProperty: Sugar.util.forEachProperty,
			mapNativeToChainable: Sugar.util.mapNativeToChainable
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/simpleMerge.js
	var require_simpleMerge = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var forEachProperty = require_coreUtilityAliases().forEachProperty;
		function simpleMerge(target, source) {
			forEachProperty(source, function(val, key) {
				target[key] = val;
			});
			return target;
		}
		module.exports = simpleMerge;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/simpleClone.js
	var require_simpleClone = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var simpleMerge = require_simpleMerge();
		function simpleClone(obj) {
			return simpleMerge({}, obj);
		}
		module.exports = simpleClone;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getEnglishVariant.js
	var require_getEnglishVariant = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var EnglishLocaleBaseDefinition = require_EnglishLocaleBaseDefinition();
		var simpleMerge = require_simpleMerge();
		var simpleClone = require_simpleClone();
		function getEnglishVariant(v) {
			return simpleMerge(simpleClone(EnglishLocaleBaseDefinition), v);
		}
		module.exports = getEnglishVariant;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/BritishEnglishDefinition.js
	var require_BritishEnglishDefinition = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = require_getEnglishVariant()({
			"short": "{dd}/{MM}/{yyyy}",
			"medium": "{d} {Month} {yyyy}",
			"long": "{d} {Month} {yyyy} {H}:{mm}",
			"full": "{Weekday}, {d} {Month}, {yyyy} {time}",
			"stamp": "{Dow} {d} {Mon} {yyyy} {time}"
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/AmericanEnglishDefinition.js
	var require_AmericanEnglishDefinition = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = require_getEnglishVariant()({
			"mdy": true,
			"firstDayOfWeek": 0,
			"firstDayOfWeekYear": 1,
			"short": "{MM}/{dd}/{yyyy}",
			"medium": "{Month} {d}, {yyyy}",
			"long": "{Month} {d}, {yyyy} {time}",
			"full": "{Weekday}, {Month} {d}, {yyyy} {time}",
			"stamp": "{Dow} {Mon} {d} {yyyy} {time}",
			"time": "{h}:{mm} {TT}"
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/CanadianEnglishDefinition.js
	var require_CanadianEnglishDefinition = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = require_getEnglishVariant()({
			"short": "{yyyy}-{MM}-{dd}",
			"medium": "{d} {Month}, {yyyy}",
			"long": "{d} {Month}, {yyyy} {H}:{mm}",
			"full": "{Weekday}, {d} {Month}, {yyyy} {time}",
			"stamp": "{Dow} {d} {Mon} {yyyy} {time}"
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/LazyLoadedLocales.js
	var require_LazyLoadedLocales = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var BritishEnglishDefinition = require_BritishEnglishDefinition();
		module.exports = {
			"en-US": require_AmericanEnglishDefinition(),
			"en-GB": BritishEnglishDefinition,
			"en-AU": BritishEnglishDefinition,
			"en-CA": require_CanadianEnglishDefinition()
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/LOCALE_ARRAY_FIELDS.js
	var require_LOCALE_ARRAY_FIELDS = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = [
			"months",
			"weekdays",
			"units",
			"numerals",
			"placeholders",
			"articles",
			"tokens",
			"timeMarkers",
			"ampm",
			"timeSuffixes",
			"parse",
			"timeParse",
			"timeFrontParse",
			"modifiers"
		];
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/ISODefaults.js
	var require_ISODefaults = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			ISO_FIRST_DAY_OF_WEEK: 1,
			ISO_FIRST_DAY_OF_WEEK_YEAR: 4
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/CoreParsingTokens.js
	var require_CoreParsingTokens = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			"yyyy": {
				param: "year",
				src: "[-−+]?\\d{4,6}"
			},
			"yy": {
				param: "year",
				src: "\\d{2}"
			},
			"y": {
				param: "year",
				src: "\\d"
			},
			"ayy": {
				param: "year",
				src: "'\\d{2}"
			},
			"MM": {
				param: "month",
				src: "(?:1[012]|0?[1-9])"
			},
			"dd": {
				param: "date",
				src: "(?:3[01]|[12][0-9]|0?[1-9])"
			},
			"hh": {
				param: "hour",
				src: "(?:2[0-4]|[01]?[0-9])"
			},
			"mm": {
				param: "minute",
				src: "[0-5]\\d"
			},
			"ss": {
				param: "second",
				src: "[0-5]\\d(?:[,.]\\d+)?"
			},
			"tzHour": { src: "[-−+](?:2[0-4]|[01]?[0-9])" },
			"tzMinute": { src: "[0-5]\\d" },
			"iyyyy": {
				param: "year",
				src: "(?:[-−+]?\\d{4}|[-−+]\\d{5,6})"
			},
			"ihh": {
				param: "hour",
				src: "(?:2[0-4]|[01][0-9])(?:[,.]\\d+)?"
			},
			"imm": {
				param: "minute",
				src: "[0-5]\\d(?:[,.]\\d+)?"
			},
			"GMT": {
				param: "utc",
				src: "GMT"
			},
			"Z": {
				param: "utc",
				src: "Z"
			},
			"timestamp": { src: "\\d+" }
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/CoreParsingFormats.js
	var require_CoreParsingFormats = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = [
			{ src: "{MM}[-.\\/]{yyyy}" },
			{
				time: true,
				src: "{dd}[-\\/]{MM}(?:[-\\/]{yyyy|yy|y})?",
				mdy: "{MM}[-\\/]{dd}(?:[-\\/]{yyyy|yy|y})?"
			},
			{
				time: true,
				src: "{dd}\\.{MM}(?:\\.{yyyy|yy|y})?",
				mdy: "{MM}\\.{dd}(?:\\.{yyyy|yy|y})?",
				localeCheck: function(loc) {
					return loc.timeSeparator !== ".";
				}
			},
			{
				time: true,
				src: "{yyyy}[-.\\/]{MM}(?:[-.\\/]{dd})?"
			},
			{ src: "\\\\/Date\\({timestamp}(?:[-+]\\d{4,4})?\\)\\\\/" },
			{ src: "{iyyyy}(?:-?{MM}(?:-?{dd}(?:T{ihh}(?::?{imm}(?::?{ss})?)?)?)?)?{tzOffset?}" }
		];
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/LocalizedParsingTokens.js
	var require_LocalizedParsingTokens = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			"year": {
				base: "yyyy|ayy",
				requiresSuffix: true
			},
			"month": {
				base: "MM",
				requiresSuffix: true
			},
			"date": {
				base: "dd",
				requiresSuffix: true
			},
			"hour": {
				base: "hh",
				requiresSuffixOr: ":"
			},
			"minute": { base: "mm" },
			"second": { base: "ss" },
			"num": {
				src: "\\d+",
				requiresNumerals: true
			}
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/map.js
	var require_map = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function map(arr, fn) {
			var result = [];
			for (var i = 0, len = arr.length; i < len; i++) if (i in arr) result.push(fn(arr[i], i));
			return result;
		}
		module.exports = map;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/filter.js
	var require_filter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function filter(arr, fn) {
			var result = [];
			for (var i = 0, len = arr.length; i < len; i++) {
				var el = arr[i];
				if (i in arr && fn(el, i)) result.push(el);
			}
			return result;
		}
		module.exports = filter;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/isArrayIndex.js
	var require_isArrayIndex = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function isArrayIndex(n) {
			return n >>> 0 == n && n != 4294967295;
		}
		module.exports = isArrayIndex;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/getSparseArrayIndexes.js
	var require_getSparseArrayIndexes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isArrayIndex = require_isArrayIndex();
		function getSparseArrayIndexes(arr, fromIndex, loop, fromRight) {
			var indexes = [], i;
			for (i in arr)
 // istanbul ignore next
			if (isArrayIndex(i) && (loop || (fromRight ? i <= fromIndex : i >= fromIndex))) indexes.push(+i);
			indexes.sort(function(a, b) {
				var aLoop = a > fromIndex;
				// istanbul ignore if
				if (aLoop !== b > fromIndex) return aLoop ? -1 : 1;
				return a - b;
			});
			return indexes;
		}
		module.exports = getSparseArrayIndexes;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/iterateOverSparseArray.js
	var require_iterateOverSparseArray = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getSparseArrayIndexes = require_getSparseArrayIndexes();
		function iterateOverSparseArray(arr, fn, fromIndex, loop) {
			var indexes = getSparseArrayIndexes(arr, fromIndex, loop), index;
			for (var i = 0, len = indexes.length; i < len; i++) {
				index = indexes[i];
				fn.call(arr, arr[index], index, arr);
			}
			return arr;
		}
		module.exports = iterateOverSparseArray;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/forEach.js
	var require_forEach = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var iterateOverSparseArray = require_iterateOverSparseArray();
		function forEach(arr, fn) {
			for (var i = 0, len = arr.length; i < len; i++) {
				if (!(i in arr)) return iterateOverSparseArray(arr, fn, i);
				fn(arr[i], i);
			}
		}
		module.exports = forEach;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/isDefined.js
	var require_isDefined = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function isDefined(o) {
			return o !== void 0;
		}
		module.exports = isDefined;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/CommonChars.js
	var require_CommonChars = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			HALF_WIDTH_ZERO: 48,
			FULL_WIDTH_ZERO: 65296,
			HALF_WIDTH_PERIOD: ".",
			FULL_WIDTH_PERIOD: ".",
			HALF_WIDTH_COMMA: ",",
			OPEN_BRACE: "{",
			CLOSE_BRACE: "}"
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/commaSplit.js
	var require_commaSplit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var HALF_WIDTH_COMMA = require_CommonChars().HALF_WIDTH_COMMA;
		function commaSplit(str) {
			return str.split(HALF_WIDTH_COMMA);
		}
		module.exports = commaSplit;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/NATIVE_TYPES.js
	var require_NATIVE_TYPES = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = "Boolean Number String Date RegExp Function Array Error Set Map";
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/isClass.js
	var require_isClass = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var classToString = require_coreUtilityAliases().classToString;
		function isClass(obj, className, str) {
			if (!str) str = classToString(obj);
			return str === "[object " + className + "]";
		}
		module.exports = isClass;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/spaceSplit.js
	var require_spaceSplit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function spaceSplit(str) {
			return str.split(" ");
		}
		module.exports = spaceSplit;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/isObjectType.js
	var require_isObjectType = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function isObjectType(obj, type) {
			return !!obj && (type || typeof obj) === "object";
		}
		module.exports = isObjectType;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/hasOwnEnumeratedProperties.js
	var require_hasOwnEnumeratedProperties = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var hasOwn = require_coreUtilityAliases().hasOwn;
		function hasOwnEnumeratedProperties(obj) {
			var objectProto = Object.prototype;
			for (var key in obj) {
				var val = obj[key];
				if (!hasOwn(obj, key) && val !== objectProto[key]) return false;
			}
			return true;
		}
		module.exports = hasOwnEnumeratedProperties;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/hasValidPlainObjectPrototype.js
	var require_hasValidPlainObjectPrototype = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var hasOwn = require_coreUtilityAliases().hasOwn;
		function hasValidPlainObjectPrototype(obj) {
			var hasToString = "toString" in obj;
			var hasConstructor = "constructor" in obj;
			return !hasConstructor && !hasToString || hasConstructor && !hasOwn(obj, "constructor") && hasOwn(obj.constructor.prototype, "isPrototypeOf");
		}
		module.exports = hasValidPlainObjectPrototype;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/isPlainObject.js
	var require_isPlainObject = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isClass = require_isClass();
		var isObjectType = require_isObjectType();
		var hasOwnEnumeratedProperties = require_hasOwnEnumeratedProperties();
		var hasValidPlainObjectPrototype = require_hasValidPlainObjectPrototype();
		function isPlainObject(obj, className) {
			return isObjectType(obj) && isClass(obj, "Object", className) && hasValidPlainObjectPrototype(obj) && hasOwnEnumeratedProperties(obj);
		}
		module.exports = isPlainObject;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/classChecks.js
	var require_classChecks = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var NATIVE_TYPES = require_NATIVE_TYPES();
		var forEach = require_forEach();
		var isClass = require_isClass();
		var spaceSplit = require_spaceSplit();
		var isPlainObject = require_isPlainObject();
		var isSerializable;
		var isBoolean;
		var isNumber;
		var isString;
		var isDate;
		var isRegExp;
		var isFunction;
		var isArray;
		var isSet;
		var isMap;
		var isError;
		function buildClassChecks() {
			var knownTypes = {};
			function addCoreTypes() {
				var names = spaceSplit(NATIVE_TYPES);
				isBoolean = buildPrimitiveClassCheck(names[0]);
				isNumber = buildPrimitiveClassCheck(names[1]);
				isString = buildPrimitiveClassCheck(names[2]);
				isDate = buildClassCheck(names[3]);
				isRegExp = buildClassCheck(names[4]);
				isFunction = buildClassCheck(names[5]);
				// istanbul ignore next
				isArray = Array.isArray || buildClassCheck(names[6]);
				isError = buildClassCheck(names[7]);
				isSet = buildClassCheck(names[8], typeof Set !== "undefined" && Set);
				isMap = buildClassCheck(names[9], typeof Map !== "undefined" && Map);
				addKnownType("Arguments");
				addKnownType(names[0]);
				addKnownType(names[1]);
				addKnownType(names[2]);
				addKnownType(names[3]);
				addKnownType(names[4]);
				addKnownType(names[6]);
			}
			function addArrayTypes() {
				forEach(spaceSplit("Int8 Uint8 Uint8Clamped Int16 Uint16 Int32 Uint32 Float32 Float64"), function(str) {
					addKnownType(str + "Array");
				});
			}
			function addKnownType(className) {
				var str = "[object " + className + "]";
				knownTypes[str] = true;
			}
			function isKnownType(className) {
				return knownTypes[className];
			}
			function buildClassCheck(className, globalObject) {
				// istanbul ignore if
				if (globalObject && isClass(new globalObject(), "Object")) return getConstructorClassCheck(globalObject);
				else return getToStringClassCheck(className);
			}
			// istanbul ignore next
			function getConstructorClassCheck(obj) {
				var ctorStr = String(obj);
				return function(obj) {
					return String(obj.constructor) === ctorStr;
				};
			}
			function getToStringClassCheck(className) {
				return function(obj, str) {
					return isClass(obj, className, str);
				};
			}
			function buildPrimitiveClassCheck(className) {
				var type = className.toLowerCase();
				return function(obj) {
					var t = typeof obj;
					return t === type || t === "object" && isClass(obj, className);
				};
			}
			addCoreTypes();
			addArrayTypes();
			isSerializable = function(obj, className) {
				return isKnownType(className) || isPlainObject(obj, className);
			};
		}
		buildClassChecks();
		module.exports = {
			isSerializable,
			isBoolean,
			isNumber,
			isString,
			isDate,
			isRegExp,
			isFunction,
			isArray,
			isSet,
			isMap,
			isError
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/mathAliases.js
	var require_mathAliases = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			abs: Math.abs,
			pow: Math.pow,
			min: Math.min,
			max: Math.max,
			ceil: Math.ceil,
			floor: Math.floor,
			round: Math.round
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/isUndefined.js
	var require_isUndefined = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function isUndefined(o) {
			return o === void 0;
		}
		module.exports = isUndefined;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/getOrdinalSuffix.js
	var require_getOrdinalSuffix = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function getOrdinalSuffix(num) {
			if (num >= 11 && num <= 13) return "th";
			else switch (num % 10) {
				case 1: return "st";
				case 2: return "nd";
				case 3: return "rd";
				default: return "th";
			}
		}
		module.exports = getOrdinalSuffix;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getArrayWithOffset.js
	var require_getArrayWithOffset = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function getArrayWithOffset(arr, n, alternate, offset) {
			var val;
			if (alternate > 1) val = arr[n + (alternate - 1) * offset];
			return val || arr[n];
		}
		module.exports = getArrayWithOffset;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getRegNonCapturing.js
	var require_getRegNonCapturing = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function getRegNonCapturing(src, opt) {
			if (src.length > 1) src = "(?:" + src + ")";
			if (opt) src += "?";
			return src;
		}
		module.exports = getRegNonCapturing;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/PRIVATE_PROP_PREFIX.js
	var require_PRIVATE_PROP_PREFIX = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = "_sugar_";
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/privatePropertyAccessor.js
	var require_privatePropertyAccessor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var PRIVATE_PROP_PREFIX = require_PRIVATE_PROP_PREFIX();
		var setProperty = require_coreUtilityAliases().setProperty;
		function privatePropertyAccessor(key) {
			var privateKey = PRIVATE_PROP_PREFIX + key;
			return function(obj, val) {
				if (arguments.length > 1) {
					setProperty(obj, privateKey, val);
					return obj;
				}
				return obj[privateKey];
			};
		}
		module.exports = privatePropertyAccessor;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/_utc.js
	var require__utc = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = require_privatePropertyAccessor()("utc");
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/callDateGet.js
	var require_callDateGet = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var _utc = require__utc();
		function callDateGet(d, method) {
			return d["get" + (_utc(d) ? "UTC" : "") + method]();
		}
		module.exports = callDateGet;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getYear.js
	var require_getYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateGet = require_callDateGet();
		function getYear(d) {
			return callDateGet(d, "FullYear");
		}
		module.exports = getYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getMonth.js
	var require_getMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateGet = require_callDateGet();
		function getMonth(d) {
			return callDateGet(d, "Month");
		}
		module.exports = getMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getDaysInMonth.js
	var require_getDaysInMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getYear = require_getYear();
		var getMonth = require_getMonth();
		var callDateGet = require_callDateGet();
		function getDaysInMonth(d) {
			return 32 - callDateGet(new Date(getYear(d), getMonth(d), 32), "Date");
		}
		module.exports = getDaysInMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/DateUnits.js
	var require_DateUnits = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getDaysInMonth = require_getDaysInMonth();
		module.exports = [
			{
				name: "millisecond",
				method: "Milliseconds",
				multiplier: 1,
				start: 0,
				end: 999
			},
			{
				name: "second",
				method: "Seconds",
				multiplier: 1e3,
				start: 0,
				end: 59
			},
			{
				name: "minute",
				method: "Minutes",
				multiplier: 6e4,
				start: 0,
				end: 59
			},
			{
				name: "hour",
				method: "Hours",
				multiplier: 36e5,
				start: 0,
				end: 23
			},
			{
				name: "day",
				alias: "date",
				method: "Date",
				ambiguous: true,
				multiplier: 864e5,
				start: 1,
				end: function(d) {
					return getDaysInMonth(d);
				}
			},
			{
				name: "week",
				method: "ISOWeek",
				ambiguous: true,
				multiplier: 6048e5
			},
			{
				name: "month",
				method: "Month",
				ambiguous: true,
				multiplier: 26298e5,
				start: 0,
				end: 11
			},
			{
				name: "year",
				method: "FullYear",
				ambiguous: true,
				multiplier: 315576e5,
				start: 0
			}
		];
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/DateUnitIndexes.js
	var require_DateUnitIndexes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			HOURS_INDEX: 3,
			DAY_INDEX: 4,
			WEEK_INDEX: 5,
			MONTH_INDEX: 6,
			YEAR_INDEX: 7
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/iterateOverDateUnits.js
	var require_iterateOverDateUnits = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnits = require_DateUnits();
		var DateUnitIndexes = require_DateUnitIndexes();
		var isUndefined = require_isUndefined();
		var YEAR_INDEX = DateUnitIndexes.YEAR_INDEX;
		function iterateOverDateUnits(fn, startIndex, endIndex) {
			endIndex = endIndex || 0;
			if (isUndefined(startIndex)) startIndex = YEAR_INDEX;
			for (var index = startIndex; index >= endIndex; index--) if (fn(DateUnits[index], index) === false) break;
		}
		module.exports = iterateOverDateUnits;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/escapeRegExp.js
	var require_escapeRegExp = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isString = require_classChecks().isString;
		function escapeRegExp(str) {
			if (!isString(str)) str = String(str);
			return str.replace(/([\\/'*+?|()[\]{}.^$-])/g, "\\$1");
		}
		module.exports = escapeRegExp;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/arrayToRegAlternates.js
	var require_arrayToRegAlternates = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var map = require_map();
		var escapeRegExp = require_escapeRegExp();
		function arrayToRegAlternates(arr) {
			var joined = arr.join("");
			if (!arr || !arr.length) return "";
			if (joined.length === arr.length) return "[" + joined + "]";
			return map(arr, escapeRegExp).join("|");
		}
		module.exports = arrayToRegAlternates;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/chr.js
	var require_chr = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = String.fromCharCode;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/allCharsReg.js
	var require_allCharsReg = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function allCharsReg(src) {
			return RegExp("[" + src + "]", "g");
		}
		module.exports = allCharsReg;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/fullwidthNumberHelpers.js
	var require_fullwidthNumberHelpers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var CommonChars = require_CommonChars();
		var chr = require_chr();
		var allCharsReg = require_allCharsReg();
		var HALF_WIDTH_ZERO = CommonChars.HALF_WIDTH_ZERO;
		var FULL_WIDTH_ZERO = CommonChars.FULL_WIDTH_ZERO;
		var HALF_WIDTH_PERIOD = CommonChars.HALF_WIDTH_PERIOD;
		var FULL_WIDTH_PERIOD = CommonChars.FULL_WIDTH_PERIOD;
		var HALF_WIDTH_COMMA = CommonChars.HALF_WIDTH_COMMA;
		var fullWidthNumberReg;
		var fullWidthNumberMap;
		var fullWidthNumbers;
		function buildFullWidthNumber() {
			var fwp = FULL_WIDTH_PERIOD, hwp = HALF_WIDTH_PERIOD, hwc = HALF_WIDTH_COMMA, fwn = "";
			fullWidthNumberMap = {};
			for (var i = 0, digit; i <= 9; i++) {
				digit = chr(i + FULL_WIDTH_ZERO);
				fwn += digit;
				fullWidthNumberMap[digit] = chr(i + HALF_WIDTH_ZERO);
			}
			fullWidthNumberMap[hwc] = "";
			fullWidthNumberMap[fwp] = hwp;
			fullWidthNumberMap[hwp] = hwp;
			fullWidthNumberReg = allCharsReg(fwn + fwp + hwc + hwp);
			fullWidthNumbers = fwn;
		}
		buildFullWidthNumber();
		module.exports = {
			fullWidthNumberReg,
			fullWidthNumberMap,
			fullWidthNumbers
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/trunc.js
	var require_trunc = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var mathAliases = require_mathAliases();
		var ceil = mathAliases.ceil;
		var floor = mathAliases.floor;
		module.exports = Math.trunc || function(n) {
			if (n === 0 || !isFinite(n)) return n;
			return n < 0 ? ceil(n) : floor(n);
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/withPrecision.js
	var require_withPrecision = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var mathAliases = require_mathAliases();
		var abs = mathAliases.abs;
		var pow = mathAliases.pow;
		var round = mathAliases.round;
		function withPrecision(val, precision, fn) {
			var multiplier = pow(10, abs(precision || 0));
			fn = fn || round;
			if (precision < 0) multiplier = 1 / multiplier;
			return fn(val * multiplier) / multiplier;
		}
		module.exports = withPrecision;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getAdjustedUnit.js
	var require_getAdjustedUnit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var mathAliases = require_mathAliases();
		var iterateOverDateUnits = require_iterateOverDateUnits();
		var abs = mathAliases.abs;
		function getAdjustedUnit(ms, fn) {
			var unitIndex = 0, value = 0;
			iterateOverDateUnits(function(unit, i) {
				value = abs(fn(unit));
				if (value >= 1) {
					unitIndex = i;
					return false;
				}
			});
			return [
				value,
				unitIndex,
				ms
			];
		}
		module.exports = getAdjustedUnit;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getAdjustedUnitForNumber.js
	var require_getAdjustedUnitForNumber = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var trunc = require_trunc();
		var withPrecision = require_withPrecision();
		var getAdjustedUnit = require_getAdjustedUnit();
		function getAdjustedUnitForNumber(ms) {
			return getAdjustedUnit(ms, function(unit) {
				return trunc(withPrecision(ms / unit.multiplier, 1));
			});
		}
		module.exports = getAdjustedUnitForNumber;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getParsingTokenWithSuffix.js
	var require_getParsingTokenWithSuffix = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocalizedParsingTokens = require_LocalizedParsingTokens();
		var getRegNonCapturing = require_getRegNonCapturing();
		function getParsingTokenWithSuffix(field, src, suffix) {
			var token = LocalizedParsingTokens[field];
			if (token.requiresSuffix) src = getRegNonCapturing(src + getRegNonCapturing(suffix));
			else if (token.requiresSuffixOr) src += getRegNonCapturing(token.requiresSuffixOr + "|" + suffix);
			else src += getRegNonCapturing(suffix, true);
			return src;
		}
		module.exports = getParsingTokenWithSuffix;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getNewLocale.js
	var require_getNewLocale = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LOCALE_ARRAY_FIELDS = require_LOCALE_ARRAY_FIELDS();
		var ISODefaults = require_ISODefaults();
		var CoreParsingTokens = require_CoreParsingTokens();
		var CoreParsingFormats = require_CoreParsingFormats();
		var LocalizedParsingTokens = require_LocalizedParsingTokens();
		var map = require_map();
		var filter = require_filter();
		var forEach = require_forEach();
		var isDefined = require_isDefined();
		var commaSplit = require_commaSplit();
		var classChecks = require_classChecks();
		var mathAliases = require_mathAliases();
		var isUndefined = require_isUndefined();
		var simpleMerge = require_simpleMerge();
		var getOrdinalSuffix = require_getOrdinalSuffix();
		var getArrayWithOffset = require_getArrayWithOffset();
		var getRegNonCapturing = require_getRegNonCapturing();
		var coreUtilityAliases = require_coreUtilityAliases();
		var iterateOverDateUnits = require_iterateOverDateUnits();
		var arrayToRegAlternates = require_arrayToRegAlternates();
		var fullwidthNumberHelpers = require_fullwidthNumberHelpers();
		var getAdjustedUnitForNumber = require_getAdjustedUnitForNumber();
		var getParsingTokenWithSuffix = require_getParsingTokenWithSuffix();
		var hasOwn = coreUtilityAliases.hasOwn;
		var getOwn = coreUtilityAliases.getOwn;
		var forEachProperty = coreUtilityAliases.forEachProperty;
		var fullWidthNumberMap = fullwidthNumberHelpers.fullWidthNumberMap;
		var fullWidthNumbers = fullwidthNumberHelpers.fullWidthNumbers;
		var pow = mathAliases.pow;
		var max = mathAliases.max;
		var ISO_FIRST_DAY_OF_WEEK = ISODefaults.ISO_FIRST_DAY_OF_WEEK;
		var ISO_FIRST_DAY_OF_WEEK_YEAR = ISODefaults.ISO_FIRST_DAY_OF_WEEK_YEAR;
		var isString = classChecks.isString;
		var isFunction = classChecks.isFunction;
		function getNewLocale(def) {
			function Locale(def) {
				this.init(def);
			}
			Locale.prototype = {
				getMonthName: function(n, alternate) {
					if (this.monthSuffix) return n + 1 + this.monthSuffix;
					return getArrayWithOffset(this.months, n, alternate, 12);
				},
				getWeekdayName: function(n, alternate) {
					return getArrayWithOffset(this.weekdays, n, alternate, 7);
				},
				parseValue: function(str, param) {
					var map = this[param + "Map"];
					if (hasOwn(map, str)) return map[str];
					return this.parseNumber(str, param);
				},
				parseNumber: function(str, param) {
					var val;
					if (hasOwn(this.numeralMap, str)) val = this.numeralMap[str];
					if (isNaN(val)) val = this.parseRegularNumerals(str);
					if (isNaN(val)) val = this.parseIrregularNumerals(str);
					if (param === "month") val -= 1;
					return val;
				},
				parseRegularNumerals: function(str) {
					str = str.replace(/^−/, "-").replace(/,/, ".");
					return +str;
				},
				parseIrregularNumerals: function(str) {
					var place = 1, num = 0, lastWasPlace, isPlace, numeral, digit, arr = str.split("");
					for (var i = arr.length - 1; numeral = arr[i]; i--) {
						digit = getOwn(this.numeralMap, numeral);
						if (isUndefined(digit)) digit = getOwn(fullWidthNumberMap, numeral) || 0;
						isPlace = digit > 0 && digit % 10 === 0;
						if (isPlace) {
							if (lastWasPlace) num += place;
							if (i) place = digit;
							else num += digit;
						} else {
							num += digit * place;
							place *= 10;
						}
						lastWasPlace = isPlace;
					}
					return num;
				},
				getOrdinal: function(n) {
					return this.ordinalSuffix || getOrdinalSuffix(n);
				},
				getRelativeFormat: function(adu, type) {
					return this.convertAdjustedToFormat(adu, type);
				},
				getDuration: function(ms) {
					return this.convertAdjustedToFormat(getAdjustedUnitForNumber(max(0, ms)), "duration");
				},
				getFirstDayOfWeek: function() {
					var val = this.firstDayOfWeek;
					return isDefined(val) ? val : ISO_FIRST_DAY_OF_WEEK;
				},
				getFirstDayOfWeekYear: function() {
					return this.firstDayOfWeekYear || ISO_FIRST_DAY_OF_WEEK_YEAR;
				},
				convertAdjustedToFormat: function(adu, type) {
					var sign, unit, mult, num = adu[0], u = adu[1], ms = adu[2], format = this[type] || this.relative;
					if (isFunction(format)) return format.call(this, num, u, ms, type);
					mult = !this.plural || num === 1 ? 0 : 1;
					unit = this.units[mult * 8 + u] || this.units[u];
					sign = this[ms > 0 ? "fromNow" : "ago"];
					return format.replace(/\{(.*?)\}/g, function(full, match) {
						switch (match) {
							case "num": return num;
							case "unit": return unit;
							case "sign": return sign;
						}
					});
				},
				cacheFormat: function(dif, i) {
					this.compiledFormats.splice(i, 1);
					this.compiledFormats.unshift(dif);
				},
				addFormat: function(format) {
					var loc = this, src, to;
					function getTokenSrc(token) {
						var suffix, src, tmp, opt = token.match(/\?$/), nc = token.match(/^(\d+)\??$/), slice = token.match(/(\d)(?:-(\d))?/), param = token.replace(/[^a-z]+$/i, "");
						if (tmp = getOwn(loc.parsingAliases, param)) {
							src = formatToSrc(tmp);
							if (opt) src = getRegNonCapturing(src, true);
							return src;
						}
						if (nc) src = loc.tokens[nc[1]];
						else if (tmp = getOwn(CoreParsingTokens, param)) {
							src = tmp.src;
							param = tmp.param || param;
						} else {
							tmp = getOwn(loc.parsingTokens, param) || getOwn(loc, param);
							param = param.replace(/s$/, "");
							if (!tmp) tmp = getOwn(loc.parsingTokens, param) || getOwn(loc, param + "s");
							if (isString(tmp)) {
								src = tmp;
								suffix = loc[param + "Suffix"];
							} else {
								if (param === "weekday" && loc.code === "ko") tmp = filter(tmp, function(str) {
									return str.length > 1;
								});
								if (slice) tmp = filter(tmp, function(m, i) {
									var mod = i % (loc.units ? 8 : tmp.length);
									return mod >= slice[1] && mod <= (slice[2] || slice[1]);
								});
								src = arrayToRegAlternates(tmp);
							}
						}
						if (!src) return "";
						if (nc) src = getRegNonCapturing(src);
						else {
							to.push(param);
							src = "(" + src + ")";
						}
						if (suffix) src = getParsingTokenWithSuffix(param, src, suffix);
						if (opt) src += "?";
						return src;
					}
					function formatToSrc(str) {
						str = str.replace(/ /g, " ?");
						str = str.replace(/\{([^,]+?)\}/g, function(match, token) {
							var tokens = token.split("|");
							if (tokens.length > 1) return getRegNonCapturing(map(tokens, getTokenSrc).join("|"));
							else return getTokenSrc(token);
						});
						return str;
					}
					function parseInputFormat() {
						to = [];
						src = formatToSrc(format);
					}
					parseInputFormat();
					loc.addRawFormat(src, to);
				},
				addRawFormat: function(format, to) {
					this.compiledFormats.unshift({
						reg: RegExp("^ *" + format + " *$", "i"),
						to
					});
				},
				init: function(def) {
					var loc = this;
					function initFormats() {
						loc.compiledFormats = [];
						loc.parsingAliases = {};
						loc.parsingTokens = {};
					}
					function initDefinition() {
						simpleMerge(loc, def);
					}
					function initArrayFields() {
						forEach(LOCALE_ARRAY_FIELDS, function(name) {
							var val = loc[name];
							if (isString(val)) loc[name] = commaSplit(val);
							else if (!val) loc[name] = [];
						});
					}
					function buildValueArray(name, mod, map, fn) {
						var field = name, all = [], setMap;
						if (!loc[field]) field += "s";
						if (!map) {
							map = {};
							setMap = true;
						}
						forAllAlternates(field, function(alt, j, i) {
							var idx = j * mod + i, val = fn ? fn(i) : i;
							map[alt] = val;
							map[alt.toLowerCase()] = val;
							all[idx] = alt;
						});
						loc[field] = all;
						if (setMap) loc[name + "Map"] = map;
					}
					function forAllAlternates(field, fn) {
						forEach(loc[field], function(str, i) {
							forEachAlternate(str, function(alt, j) {
								fn(alt, j, i);
							});
						});
					}
					function forEachAlternate(str, fn) {
						forEach(map(str.split("+"), function(split) {
							return split.replace(/(.+):(.+)$/, function(full, base, suffixes) {
								return map(suffixes.split("|"), function(suffix) {
									return base + suffix;
								}).join("|");
							});
						}).join("|").split("|"), fn);
					}
					function buildNumerals() {
						var map = {};
						buildValueArray("numeral", 10, map);
						buildValueArray("article", 1, map, function() {
							return 1;
						});
						buildValueArray("placeholder", 4, map, function(n) {
							return pow(10, n + 1);
						});
						loc.numeralMap = map;
					}
					function buildTimeFormats() {
						loc.parsingAliases["time"] = getTimeFormat();
						loc.parsingAliases["tzOffset"] = getTZOffsetFormat();
					}
					function getTimeFormat(standalone) {
						var src, sep = getTimeSeparatorSrc(standalone);
						if (loc.ampmFront) src = "{ampm?} {hour} (?:{minute} (?::?{second})?)?";
						else if (loc.ampm.length) src = "{hour}(?:" + sep + "{minute?}(?:" + sep + "{second?})? {ampm?}| {ampm})";
						else src = "{hour}(?:" + sep + "{minute?}(?:" + sep + "{second?})?)";
						return src;
					}
					function getTimeSeparatorSrc() {
						if (loc.timeSeparator) return "[:" + loc.timeSeparator + "]";
						else return ":";
					}
					function getTZOffsetFormat() {
						return "(?:{Z}|{GMT?}(?:{tzHour}(?::?{tzMinute}(?: \\([\\w\\s]+\\))?)?)?)?";
					}
					function buildParsingTokens() {
						forEachProperty(LocalizedParsingTokens, function(token, name) {
							var src = token.base ? getCoreTokensForBase(token.base) : token.src, arr;
							if (token.requiresNumerals || loc.numeralUnits) src += getNumeralSrc();
							arr = loc[name + "s"];
							if (arr && arr.length) src += "|" + arrayToRegAlternates(arr);
							loc.parsingTokens[name] = src;
						});
					}
					function getCoreTokensForBase(base) {
						return map(base.split("|"), function(key) {
							return CoreParsingTokens[key].src;
						}).join("|");
					}
					function getNumeralSrc() {
						var all, src = "";
						all = loc.numerals.concat(loc.placeholders).concat(loc.articles);
						if (loc.allowsFullWidth) all = all.concat(fullWidthNumbers.split(""));
						if (all.length) src = "|(?:" + arrayToRegAlternates(all) + ")+";
						return src;
					}
					function buildTimeSuffixes() {
						iterateOverDateUnits(function(unit, i) {
							var token = loc.timeSuffixes[i];
							if (token) loc[(unit.alias || unit.name) + "Suffix"] = token;
						});
					}
					function buildModifiers() {
						forEach(loc.modifiers, function(modifier) {
							var name = modifier.name, mapKey = name + "Map", map = loc[mapKey] || {};
							forEachAlternate(modifier.src, function(alt, j) {
								var token = getOwn(loc.parsingTokens, name), val = modifier.value;
								map[alt] = val;
								loc.parsingTokens[name] = token ? token + "|" + alt : alt;
								if (modifier.name === "sign" && j === 0) loc[val === 1 ? "fromNow" : "ago"] = alt;
							});
							loc[mapKey] = map;
						});
					}
					function addCoreFormats() {
						forEach(CoreParsingFormats, function(df) {
							var src = df.src;
							if (df.localeCheck && !df.localeCheck(loc)) return;
							if (df.mdy && loc.mdy) src = df.mdy;
							if (df.time) {
								loc.addFormat(getFormatWithTime(src, true));
								loc.addFormat(getFormatWithTime(src));
							} else loc.addFormat(src);
						});
						loc.addFormat("{time}");
					}
					function addLocaleFormats() {
						addFormatSet("parse");
						addFormatSet("timeParse", true);
						addFormatSet("timeFrontParse", true, true);
					}
					function addFormatSet(field, allowTime, timeFront) {
						forEach(loc[field], function(format) {
							if (allowTime) format = getFormatWithTime(format, timeFront);
							loc.addFormat(format);
						});
					}
					function getFormatWithTime(baseFormat, timeBefore) {
						if (timeBefore) return getTimeBefore() + baseFormat;
						return baseFormat + getTimeAfter();
					}
					function getTimeBefore() {
						return getRegNonCapturing("{time}[,\\s\\u3000]", true);
					}
					function getTimeAfter() {
						var markers = ",?[\\s\\u3000]", localized = arrayToRegAlternates(loc.timeMarkers);
						if (localized) markers += "| (?:" + localized + ") ";
						markers = getRegNonCapturing(markers, loc.timeMarkerOptional);
						return getRegNonCapturing(markers + "{time}{tzOffset}", true);
					}
					initFormats();
					initDefinition();
					initArrayFields();
					buildValueArray("month", 12);
					buildValueArray("weekday", 7);
					buildValueArray("unit", 8);
					buildValueArray("ampm", 2);
					buildNumerals();
					buildTimeFormats();
					buildParsingTokens();
					buildTimeSuffixes();
					buildModifiers();
					addCoreFormats();
					addLocaleFormats();
				}
			};
			return new Locale(def);
		}
		module.exports = getNewLocale;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/LocaleHelpers.js
	var require_LocaleHelpers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LazyLoadedLocales = require_LazyLoadedLocales();
		var AmericanEnglishDefinition = require_AmericanEnglishDefinition();
		var getNewLocale = require_getNewLocale();
		var English;
		var localeManager;
		function buildLocales() {
			function LocaleManager(loc) {
				this.locales = {};
				this.add(loc);
			}
			LocaleManager.prototype = {
				get: function(code, fallback) {
					var loc = this.locales[code];
					if (!loc && LazyLoadedLocales[code]) loc = this.add(code, LazyLoadedLocales[code]);
					else if (!loc && code) loc = this.locales[code.slice(0, 2)];
					return loc || fallback === false ? loc : this.current;
				},
				getAll: function() {
					return this.locales;
				},
				set: function(code) {
					var loc = this.get(code, false);
					if (!loc) throw new TypeError("Invalid Locale: " + code);
					return this.current = loc;
				},
				add: function(code, def) {
					if (!def) {
						def = code;
						code = def.code;
					} else def.code = code;
					var loc = def.compiledFormats ? def : getNewLocale(def);
					this.locales[code] = loc;
					if (!this.current) this.current = loc;
					return loc;
				},
				remove: function(code) {
					if (this.current.code === code) this.current = this.get("en");
					return delete this.locales[code];
				}
			};
			English = getNewLocale(AmericanEnglishDefinition);
			localeManager = new LocaleManager(English);
		}
		buildLocales();
		module.exports = {
			English,
			localeManager
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addLocale.js
	var require_addLocale = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var localeManager = require_LocaleHelpers().localeManager;
		Sugar.Date.defineStatic({ "addLocale": function(code, set) {
			return localeManager.add(code, set);
		} });
		module.exports = Sugar.Date.addLocale;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/MINUTES.js
	var require_MINUTES = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = 6e4;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/ABBREVIATED_YEAR_REG.js
	var require_ABBREVIATED_YEAR_REG = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = /^'?(\d{1,2})$/;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/tzOffset.js
	var require_tzOffset = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function tzOffset(d) {
			return d.getTimezoneOffset();
		}
		module.exports = tzOffset;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/callDateSet.js
	var require_callDateSet = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var _utc = require__utc();
		var callDateGet = require_callDateGet();
		function callDateSet(d, method, value, safe) {
			if (safe && value === callDateGet(d, method, value)) return;
			d["set" + (_utc(d) ? "UTC" : "") + method](value);
		}
		module.exports = callDateSet;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getLowerUnitIndex.js
	var require_getLowerUnitIndex = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var HOURS_INDEX = DateUnitIndexes.HOURS_INDEX;
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		var WEEK_INDEX = DateUnitIndexes.WEEK_INDEX;
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		function getLowerUnitIndex(index) {
			if (index === MONTH_INDEX) return DAY_INDEX;
			else if (index === WEEK_INDEX) return HOURS_INDEX;
			return index - 1;
		}
		module.exports = getLowerUnitIndex;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/walkUnitDown.js
	var require_walkUnitDown = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnits = require_DateUnits();
		var getLowerUnitIndex = require_getLowerUnitIndex();
		function walkUnitDown(unitIndex, fn) {
			while (unitIndex >= 0) {
				if (fn(DateUnits[unitIndex], unitIndex) === false) break;
				unitIndex = getLowerUnitIndex(unitIndex);
			}
		}
		module.exports = walkUnitDown;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setUnitAndLowerToEdge.js
	var require_setUnitAndLowerToEdge = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isDefined = require_isDefined();
		var classChecks = require_classChecks();
		var callDateSet = require_callDateSet();
		var walkUnitDown = require_walkUnitDown();
		var isFunction = classChecks.isFunction;
		function setUnitAndLowerToEdge(d, startIndex, stopIndex, end) {
			walkUnitDown(startIndex, function(unit, i) {
				var val = end ? unit.end : unit.start;
				if (isFunction(val)) val = val(d);
				callDateSet(d, unit.method, val);
				return !isDefined(stopIndex) || i > stopIndex;
			});
			return d;
		}
		module.exports = setUnitAndLowerToEdge;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/resetTime.js
	var require_resetTime = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var setUnitAndLowerToEdge = require_setUnitAndLowerToEdge();
		var HOURS_INDEX = DateUnitIndexes.HOURS_INDEX;
		function resetTime(d) {
			return setUnitAndLowerToEdge(d, HOURS_INDEX);
		}
		module.exports = resetTime;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/defaultNewDate.js
	var require_defaultNewDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function defaultNewDate() {
			return /* @__PURE__ */ new Date();
		}
		module.exports = defaultNewDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/DATE_OPTIONS.js
	var require_DATE_OPTIONS = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = { "newDateInternal": require_defaultNewDate() };
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/namespaceAliases.js
	var require_namespaceAliases = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		module.exports = {
			sugarObject: Sugar.Object,
			sugarArray: Sugar.Array,
			sugarDate: Sugar.Date,
			sugarString: Sugar.String,
			sugarNumber: Sugar.Number,
			sugarFunction: Sugar.Function,
			sugarRegExp: Sugar.RegExp
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/defineAccessor.js
	var require_defineAccessor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var setProperty = require_coreUtilityAliases().setProperty;
		function defineAccessor(namespace, name, fn) {
			setProperty(namespace, name, fn);
		}
		module.exports = defineAccessor;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/defineOptionsAccessor.js
	var require_defineOptionsAccessor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var simpleClone = require_simpleClone();
		var defineAccessor = require_defineAccessor();
		var forEachProperty = require_coreUtilityAliases().forEachProperty;
		function defineOptionsAccessor(namespace, defaults) {
			var obj = simpleClone(defaults);
			function getOption(name) {
				return obj[name];
			}
			function setOption(arg1, arg2) {
				var options;
				if (arguments.length === 1) options = arg1;
				else {
					options = {};
					options[arg1] = arg2;
				}
				forEachProperty(options, function(val, name) {
					if (val === null) val = defaults[name];
					obj[name] = val;
				});
			}
			defineAccessor(namespace, "getOption", getOption);
			defineAccessor(namespace, "setOption", setOption);
			return getOption;
		}
		module.exports = defineOptionsAccessor;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/_dateOptions.js
	var require__dateOptions = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DATE_OPTIONS = require_DATE_OPTIONS();
		var namespaceAliases = require_namespaceAliases();
		var defineOptionsAccessor = require_defineOptionsAccessor();
		var sugarDate = namespaceAliases.sugarDate;
		module.exports = defineOptionsAccessor(sugarDate, DATE_OPTIONS);
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getNewDate.js
	var require_getNewDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var _dateOptions = require__dateOptions();
		function getNewDate() {
			return _dateOptions("newDateInternal")();
		}
		module.exports = getNewDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setDate.js
	var require_setDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateSet = require_callDateSet();
		function setDate(d, val) {
			callDateSet(d, "Date", val);
		}
		module.exports = setDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getDate.js
	var require_getDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateGet = require_callDateGet();
		function getDate(d) {
			return callDateGet(d, "Date");
		}
		module.exports = getDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getWeekday.js
	var require_getWeekday$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateGet = require_callDateGet();
		function getWeekday(d) {
			return callDateGet(d, "Day");
		}
		module.exports = getWeekday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setWeekday.js
	var require_setWeekday$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var setDate = require_setDate();
		var getDate = require_getDate();
		var getWeekday = require_getWeekday$1();
		var classChecks = require_classChecks();
		var mathAliases = require_mathAliases();
		var isNumber = classChecks.isNumber;
		var abs = mathAliases.abs;
		function setWeekday(d, dow, dir) {
			if (!isNumber(dow)) return;
			var currentWeekday = getWeekday(d);
			if (dir) {
				var ndir = dir > 0 ? 1 : -1;
				var offset = dow % 7 - currentWeekday;
				if (offset && offset / abs(offset) !== ndir) dow += 7 * ndir;
			}
			setDate(d, getDate(d) + dow - currentWeekday);
			return d.getTime();
		}
		module.exports = setWeekday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/resetLowerUnits.js
	var require_resetLowerUnits = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getLowerUnitIndex = require_getLowerUnitIndex();
		var setUnitAndLowerToEdge = require_setUnitAndLowerToEdge();
		function resetLowerUnits(d, unitIndex) {
			return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex));
		}
		module.exports = resetLowerUnits;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getHigherUnitIndex.js
	var require_getHigherUnitIndex = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		function getHigherUnitIndex(index) {
			return index === DAY_INDEX ? MONTH_INDEX : index + 1;
		}
		module.exports = getHigherUnitIndex;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setYear.js
	var require_setYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateSet = require_callDateSet();
		function setYear(d, val) {
			callDateSet(d, "FullYear", val);
		}
		module.exports = setYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setMonth.js
	var require_setMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateSet = require_callDateSet();
		function setMonth(d, val) {
			callDateSet(d, "Month", val);
		}
		module.exports = setMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/cloneDate.js
	var require_cloneDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var _utc = require__utc();
		function cloneDate(d) {
			var clone = new Date(d.getTime());
			_utc(clone, !!_utc(d));
			return clone;
		}
		module.exports = cloneDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/moveToBeginningOfWeek.js
	var require_moveToBeginningOfWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var setWeekday = require_setWeekday$1();
		var getWeekday = require_getWeekday$1();
		var floor = require_mathAliases().floor;
		function moveToBeginningOfWeek(d, firstDayOfWeek) {
			setWeekday(d, floor((getWeekday(d) - firstDayOfWeek) / 7) * 7 + firstDayOfWeek);
			return d;
		}
		module.exports = moveToBeginningOfWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/moveToFirstDayOfWeekYear.js
	var require_moveToFirstDayOfWeekYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var setDate = require_setDate();
		var setUnitAndLowerToEdge = require_setUnitAndLowerToEdge();
		var moveToBeginningOfWeek = require_moveToBeginningOfWeek();
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		function moveToFirstDayOfWeekYear(d, firstDayOfWeek, firstDayOfWeekYear) {
			setUnitAndLowerToEdge(d, MONTH_INDEX);
			setDate(d, firstDayOfWeekYear);
			moveToBeginningOfWeek(d, firstDayOfWeek);
		}
		module.exports = moveToFirstDayOfWeekYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setISOWeekNumber.js
	var require_setISOWeekNumber = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var ISODefaults = require_ISODefaults();
		var getDate = require_getDate();
		var setDate = require_setDate();
		var setYear = require_setYear();
		var getYear = require_getYear();
		var getMonth = require_getMonth();
		var setMonth = require_setMonth();
		var cloneDate = require_cloneDate();
		var getWeekday = require_getWeekday$1();
		var setWeekday = require_setWeekday$1();
		var classChecks = require_classChecks();
		var moveToFirstDayOfWeekYear = require_moveToFirstDayOfWeekYear();
		var isNumber = classChecks.isNumber;
		var ISO_FIRST_DAY_OF_WEEK = ISODefaults.ISO_FIRST_DAY_OF_WEEK;
		var ISO_FIRST_DAY_OF_WEEK_YEAR = ISODefaults.ISO_FIRST_DAY_OF_WEEK_YEAR;
		function setISOWeekNumber(d, num) {
			if (isNumber(num)) {
				var isoWeek = cloneDate(d), dow = getWeekday(d);
				moveToFirstDayOfWeekYear(isoWeek, ISO_FIRST_DAY_OF_WEEK, ISO_FIRST_DAY_OF_WEEK_YEAR);
				setDate(isoWeek, getDate(isoWeek) + 7 * (num - 1));
				setYear(d, getYear(isoWeek));
				setMonth(d, getMonth(isoWeek));
				setDate(d, getDate(isoWeek));
				setWeekday(d, dow || 7);
			}
			return d.getTime();
		}
		module.exports = setISOWeekNumber;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/callDateSetWithWeek.js
	var require_callDateSetWithWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateSet = require_callDateSet();
		var setISOWeekNumber = require_setISOWeekNumber();
		function callDateSetWithWeek(d, method, value, safe) {
			if (method === "ISOWeek") setISOWeekNumber(d, value);
			else callDateSet(d, method, value, safe);
		}
		module.exports = callDateSetWithWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/getOwnKey.js
	var require_getOwnKey = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var hasOwn = require_coreUtilityAliases().hasOwn;
		function getOwnKey(obj, key) {
			if (hasOwn(obj, key)) return key;
		}
		module.exports = getOwnKey;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getDateParamKey.js
	var require_getDateParamKey = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getOwnKey = require_getOwnKey();
		function getDateParamKey(params, key) {
			return getOwnKey(params, key) || getOwnKey(params, key + "s") || key === "day" && getOwnKey(params, "date");
		}
		module.exports = getDateParamKey;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getDateParam.js
	var require_getDateParam = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getDateParamKey = require_getDateParamKey();
		var getOwn = require_coreUtilityAliases().getOwn;
		function getDateParam(params, key) {
			return getOwn(params, getDateParamKey(params, key));
		}
		module.exports = getDateParam;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/iterateOverDateParams.js
	var require_iterateOverDateParams = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var isDefined = require_isDefined();
		var getDateParam = require_getDateParam();
		var iterateOverDateUnits = require_iterateOverDateUnits();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		function iterateOverDateParams(params, fn, startIndex, endIndex) {
			function run(name, unit, i) {
				var val = getDateParam(params, name);
				if (isDefined(val)) fn(name, val, unit, i);
			}
			iterateOverDateUnits(function(unit, i) {
				var result = run(unit.name, unit, i);
				if (result !== false && i === DAY_INDEX) result = run("weekday", unit, i);
				return result;
			}, startIndex, endIndex);
		}
		module.exports = iterateOverDateParams;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/updateDate.js
	var require_updateDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnits = require_DateUnits();
		var DateUnitIndexes = require_DateUnitIndexes();
		var trunc = require_trunc();
		var setDate = require_setDate();
		var getDate = require_getDate();
		var getMonth = require_getMonth();
		var getNewDate = require_getNewDate();
		var setWeekday = require_setWeekday$1();
		var mathAliases = require_mathAliases();
		var callDateGet = require_callDateGet();
		var classChecks = require_classChecks();
		var resetLowerUnits = require_resetLowerUnits();
		var getLowerUnitIndex = require_getLowerUnitIndex();
		var getHigherUnitIndex = require_getHigherUnitIndex();
		var callDateSetWithWeek = require_callDateSetWithWeek();
		var iterateOverDateParams = require_iterateOverDateParams();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		var WEEK_INDEX = DateUnitIndexes.WEEK_INDEX;
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		var YEAR_INDEX = DateUnitIndexes.YEAR_INDEX;
		var round = mathAliases.round;
		var isNumber = classChecks.isNumber;
		function updateDate(d, params, reset, advance, prefer, weekdayDir, contextDate) {
			var upperUnitIndex;
			function setUpperUnit(unitName, unitIndex) {
				if (prefer && !upperUnitIndex) {
					if (unitName === "weekday") upperUnitIndex = WEEK_INDEX;
					else upperUnitIndex = getHigherUnitIndex(unitIndex);
				}
			}
			function setSpecificity(unitIndex) {
				if (unitIndex > params.specificity) return;
				params.specificity = unitIndex;
			}
			function canDisambiguate() {
				if (!upperUnitIndex || upperUnitIndex > YEAR_INDEX) return;
				switch (prefer) {
					case -1: return d >= (contextDate || getNewDate());
					case 1: return d <= (contextDate || getNewDate());
				}
			}
			function disambiguateHigherUnit() {
				var unit = DateUnits[upperUnitIndex];
				advance = prefer;
				setUnit(unit.name, 1, unit, upperUnitIndex);
			}
			function handleFraction(unit, unitIndex, fraction) {
				if (unitIndex) {
					var lowerUnit = DateUnits[getLowerUnitIndex(unitIndex)];
					var val = round(unit.multiplier / lowerUnit.multiplier * fraction);
					params[lowerUnit.name] = val;
				}
			}
			function monthHasShifted(d, targetMonth) {
				if (targetMonth < 0) targetMonth = targetMonth % 12 + 12;
				return targetMonth % 12 !== getMonth(d);
			}
			function setUnit(unitName, value, unit, unitIndex) {
				var method = unit.method, checkMonth, fraction;
				setUpperUnit(unitName, unitIndex);
				setSpecificity(unitIndex);
				fraction = value % 1;
				if (fraction) {
					handleFraction(unit, unitIndex, fraction);
					value = trunc(value);
				}
				if (unitName === "weekday") {
					if (!advance) setWeekday(d, value, weekdayDir);
					return;
				}
				checkMonth = unitIndex === MONTH_INDEX && getDate(d) > 28;
				if (advance && !unit.ambiguous) {
					d.setTime(d.getTime() + value * advance * unit.multiplier);
					return;
				} else if (advance) {
					if (unitIndex === WEEK_INDEX) {
						value *= 7;
						method = DateUnits[DAY_INDEX].method;
					}
					value = value * advance + callDateGet(d, method);
				}
				callDateSetWithWeek(d, method, value, advance);
				if (checkMonth && monthHasShifted(d, value)) setDate(d, 0);
			}
			if (isNumber(params) && advance) params = { millisecond: params };
			else if (isNumber(params)) {
				d.setTime(params);
				return d;
			}
			iterateOverDateParams(params, setUnit);
			if (reset && params.specificity) resetLowerUnits(d, params.specificity);
			if (canDisambiguate()) disambiguateHigherUnit();
			return d;
		}
		module.exports = updateDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/advanceDate.js
	var require_advanceDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var updateDate = require_updateDate();
		function advanceDate(d, unit, num, reset) {
			var set = {};
			set[unit] = num;
			return updateDate(d, set, reset, 1);
		}
		module.exports = advanceDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/dateIsValid.js
	var require_dateIsValid = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function dateIsValid(d) {
			return !isNaN(d.getTime());
		}
		module.exports = dateIsValid;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/moveToEndOfWeek.js
	var require_moveToEndOfWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var setWeekday = require_setWeekday$1();
		var getWeekday = require_getWeekday$1();
		var ceil = require_mathAliases().ceil;
		function moveToEndOfWeek(d, firstDayOfWeek) {
			var target = firstDayOfWeek - 1;
			setWeekday(d, ceil((getWeekday(d) - target) / 7) * 7 + target);
			return d;
		}
		module.exports = moveToEndOfWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/moveToEndOfUnit.js
	var require_moveToEndOfUnit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var DateUnitIndexes = require_DateUnitIndexes();
		var moveToEndOfWeek = require_moveToEndOfWeek();
		var getLowerUnitIndex = require_getLowerUnitIndex();
		var setUnitAndLowerToEdge = require_setUnitAndLowerToEdge();
		var WEEK_INDEX = DateUnitIndexes.WEEK_INDEX;
		var localeManager = LocaleHelpers.localeManager;
		function moveToEndOfUnit(d, unitIndex, localeCode, stopIndex) {
			if (unitIndex === WEEK_INDEX) moveToEndOfWeek(d, localeManager.get(localeCode).getFirstDayOfWeek());
			return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex), stopIndex, true);
		}
		module.exports = moveToEndOfUnit;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/deleteDateParam.js
	var require_deleteDateParam = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getDateParamKey = require_getDateParamKey();
		function deleteDateParam(params, key) {
			delete params[getDateParamKey(params, key)];
		}
		module.exports = deleteDateParam;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/moveToBeginningOfUnit.js
	var require_moveToBeginningOfUnit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var DateUnitIndexes = require_DateUnitIndexes();
		var getLowerUnitIndex = require_getLowerUnitIndex();
		var moveToBeginningOfWeek = require_moveToBeginningOfWeek();
		var setUnitAndLowerToEdge = require_setUnitAndLowerToEdge();
		var WEEK_INDEX = DateUnitIndexes.WEEK_INDEX;
		var localeManager = LocaleHelpers.localeManager;
		function moveToBeginningOfUnit(d, unitIndex, localeCode) {
			if (unitIndex === WEEK_INDEX) moveToBeginningOfWeek(d, localeManager.get(localeCode).getFirstDayOfWeek());
			return setUnitAndLowerToEdge(d, getLowerUnitIndex(unitIndex));
		}
		module.exports = moveToBeginningOfUnit;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getYearFromAbbreviation.js
	var require_getYearFromAbbreviation = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getYear = require_getYear();
		var abs = require_mathAliases().abs;
		function getYearFromAbbreviation(str, d, prefer) {
			var val = +str, delta;
			val += val < 50 ? 2e3 : 1900;
			if (prefer) {
				delta = val - getYear(d);
				if (delta / abs(delta) !== prefer) val += prefer * 100;
			}
			return val;
		}
		module.exports = getYearFromAbbreviation;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/iterateOverHigherDateParams.js
	var require_iterateOverHigherDateParams = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var iterateOverDateParams = require_iterateOverDateParams();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		var YEAR_INDEX = DateUnitIndexes.YEAR_INDEX;
		function iterateOverHigherDateParams(params, fn) {
			iterateOverDateParams(params, fn, YEAR_INDEX, DAY_INDEX);
		}
		module.exports = iterateOverHigherDateParams;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getExtendedDate.js
	var require_getExtendedDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var MINUTES = require_MINUTES();
		var ABBREVIATED_YEAR_REG = require_ABBREVIATED_YEAR_REG();
		var LocaleHelpers = require_LocaleHelpers();
		var DateUnitIndexes = require_DateUnitIndexes();
		var _utc = require__utc();
		var trunc = require_trunc();
		var forEach = require_forEach();
		var tzOffset = require_tzOffset();
		var isDefined = require_isDefined();
		var resetTime = require_resetTime();
		var getNewDate = require_getNewDate();
		var updateDate = require_updateDate();
		var setWeekday = require_setWeekday$1();
		var simpleMerge = require_simpleMerge();
		var advanceDate = require_advanceDate();
		var isUndefined = require_isUndefined();
		var classChecks = require_classChecks();
		var dateIsValid = require_dateIsValid();
		var simpleClone = require_simpleClone();
		var isObjectType = require_isObjectType();
		var moveToEndOfUnit = require_moveToEndOfUnit();
		var deleteDateParam = require_deleteDateParam();
		var coreUtilityAliases = require_coreUtilityAliases();
		var moveToBeginningOfUnit = require_moveToBeginningOfUnit();
		var iterateOverDateParams = require_iterateOverDateParams();
		var getYearFromAbbreviation = require_getYearFromAbbreviation();
		var iterateOverHigherDateParams = require_iterateOverHigherDateParams();
		var isNumber = classChecks.isNumber;
		var isString = classChecks.isString;
		var isDate = classChecks.isDate;
		var getOwn = coreUtilityAliases.getOwn;
		var English = LocaleHelpers.English;
		var localeManager = LocaleHelpers.localeManager;
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		var WEEK_INDEX = DateUnitIndexes.WEEK_INDEX;
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		var YEAR_INDEX = DateUnitIndexes.YEAR_INDEX;
		function getExtendedDate(contextDate, d, opt, forceClone) {
			var date, set, loc, afterCallbacks, relative, weekdayDir;
			var optPrefer, optLocale, optFromUTC, optSetUTC, optParams, optClone;
			afterCallbacks = [];
			setupOptions(opt);
			function setupOptions(opt) {
				opt = isString(opt) ? { locale: opt } : opt || {};
				optPrefer = +!!getOwn(opt, "future") - +!!getOwn(opt, "past");
				optLocale = getOwn(opt, "locale");
				optFromUTC = getOwn(opt, "fromUTC");
				optSetUTC = getOwn(opt, "setUTC");
				optParams = getOwn(opt, "params");
				optClone = getOwn(opt, "clone");
			}
			function parseFormatValues(match, dif) {
				var set = optParams || {};
				forEach(dif.to, function(param, i) {
					var str = match[i + 1], val;
					if (!str) return;
					val = parseIrregular(str, param);
					if (isUndefined(val)) val = loc.parseValue(str, param);
					set[param] = val;
				});
				return set;
			}
			function parseIrregular(str, param) {
				if (param === "utc") return 1;
				else if (param === "year") {
					var match = str.match(ABBREVIATED_YEAR_REG);
					if (match) return getYearFromAbbreviation(match[1], date, optPrefer);
				}
			}
			function cloneDateByFlag(d, clone) {
				if (_utc(d) && !isDefined(optFromUTC)) optFromUTC = true;
				if (_utc(d) && !isDefined(optSetUTC)) optSetUTC = true;
				if (clone) d = new Date(d.getTime());
				return d;
			}
			function afterDateSet(fn) {
				afterCallbacks.push(fn);
			}
			function fireCallbacks() {
				forEach(afterCallbacks, function(fn) {
					fn.call();
				});
			}
			function parseStringDate(str) {
				str = str.toLowerCase();
				loc = localeManager.get(optLocale);
				for (var i = 0, dif, match; dif = loc.compiledFormats[i]; i++) {
					match = str.match(dif.reg);
					if (match) {
						loc.cacheFormat(dif, i);
						set = parseFormatValues(match, dif);
						if (isDefined(set.timestamp)) {
							date.setTime(set.timestamp);
							break;
						}
						if (isDefined(set.ampm)) handleAmpm(set.ampm);
						if (set.utc || isDefined(set.tzHour)) handleTimezoneOffset(set.tzHour, set.tzMinute);
						if (isDefined(set.shift) && isUndefined(set.unit)) handleUnitlessShift();
						if (isDefined(set.num) && isUndefined(set.unit)) handleUnitlessNum(set.num);
						if (set.midday) handleMidday(set.midday);
						if (isDefined(set.day)) handleRelativeDay(set.day);
						if (isDefined(set.unit)) handleRelativeUnit(set.unit);
						if (set.edge) handleEdge(set.edge, set);
						break;
					}
				}
				if (!set) {
					date = new Date(str);
					if (optFromUTC && dateIsValid(date)) date.setTime(date.getTime() + tzOffset(date) * MINUTES);
				} else if (relative) updateDate(date, set, false, 1);
				else updateDate(date, set, true, 0, optPrefer, weekdayDir, contextDate);
				fireCallbacks();
				return date;
			}
			function handleAmpm(ampm) {
				if (ampm === 1 && set.hour < 12) set.hour += 12;
				else if (ampm === 0 && set.hour === 12) set.hour = 0;
			}
			function handleTimezoneOffset(tzHour, tzMinute) {
				_utc(date, true);
				if (tzHour < 0) tzMinute *= -1;
				var offset = tzHour * 60 + (tzMinute || 0);
				if (offset) set.minute = (set.minute || 0) - offset;
			}
			function handleUnitlessShift() {
				if (isDefined(set.month)) set.unit = YEAR_INDEX;
				else if (isDefined(set.weekday)) set.unit = WEEK_INDEX;
			}
			function handleUnitlessNum(num) {
				if (isDefined(set.weekday)) setOrdinalWeekday(num);
				else if (isDefined(set.month)) set.date = set.num;
			}
			function handleMidday(hour) {
				set.hour = hour % 24;
				if (hour > 23) afterDateSet(function() {
					advanceDate(date, "date", trunc(hour / 24));
				});
			}
			function handleRelativeDay() {
				resetTime(date);
				if (isUndefined(set.unit)) {
					set.unit = DAY_INDEX;
					set.num = set.day;
					delete set.day;
				}
			}
			function handleRelativeUnit(unitIndex) {
				var num;
				if (isDefined(set.num)) num = set.num;
				else if (isDefined(set.edge) && isUndefined(set.shift)) num = 0;
				else num = 1;
				if (isDefined(set.weekday)) {
					if (unitIndex === MONTH_INDEX) {
						setOrdinalWeekday(num);
						num = 1;
					} else {
						updateDate(date, { weekday: set.weekday }, true);
						delete set.weekday;
					}
				}
				if (set.half) num *= set.half;
				if (isDefined(set.shift)) num *= set.shift;
				else if (set.sign) num *= set.sign;
				if (isDefined(set.day)) {
					num += set.day;
					delete set.day;
				}
				separateAbsoluteUnits(unitIndex);
				set[English.units[unitIndex]] = num;
				relative = true;
			}
			function handleEdge(edge, params) {
				var edgeIndex = params.unit, weekdayOfMonth;
				if (!edgeIndex) iterateOverHigherDateParams(params, function(unitName, val, unit, i) {
					if (unitName === "weekday" && isDefined(params.month)) return;
					edgeIndex = i;
				});
				if (edgeIndex === MONTH_INDEX && isDefined(params.weekday)) {
					weekdayOfMonth = params.weekday;
					delete params.weekday;
				}
				afterDateSet(function() {
					var stopIndex;
					if (edge < 0) moveToBeginningOfUnit(date, edgeIndex, optLocale);
					else if (edge > 0) {
						if (edge === 1) {
							stopIndex = DAY_INDEX;
							moveToBeginningOfUnit(date, DAY_INDEX);
						}
						moveToEndOfUnit(date, edgeIndex, optLocale, stopIndex);
					}
					if (isDefined(weekdayOfMonth)) {
						setWeekday(date, weekdayOfMonth, -edge);
						resetTime(date);
					}
				});
				if (edgeIndex === MONTH_INDEX) params.specificity = DAY_INDEX;
				else params.specificity = edgeIndex - 1;
			}
			function setOrdinalWeekday(num) {
				set.weekday = 7 * (num - 1) + set.weekday;
				set.date = 1;
				weekdayDir = 1;
			}
			function separateAbsoluteUnits(unitIndex) {
				var params;
				iterateOverDateParams(set, function(name, val, unit, i) {
					if (i >= unitIndex) {
						date.setTime(NaN);
						return false;
					} else if (i < unitIndex) {
						params = params || {};
						params[name] = val;
						deleteDateParam(set, name);
					}
				});
				if (params) {
					afterDateSet(function() {
						updateDate(date, params, true, 0, false, weekdayDir);
						if (optParams) simpleMerge(optParams, params);
					});
					if (set.edge) {
						handleEdge(set.edge, params);
						delete set.edge;
					}
				}
			}
			if (contextDate && d) date = cloneDateByFlag(contextDate, true);
			else date = getNewDate();
			_utc(date, optFromUTC);
			if (isString(d)) date = parseStringDate(d);
			else if (isDate(d)) date = cloneDateByFlag(d, optClone || forceClone);
			else if (isObjectType(d)) {
				set = simpleClone(d);
				updateDate(date, set, true);
			} else if (isNumber(d) || d === null) date.setTime(d);
			_utc(date, !!optSetUTC);
			return {
				set,
				date
			};
		}
		module.exports = getExtendedDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/createDate.js
	var require_createDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getExtendedDate = require_getExtendedDate();
		function createDate(d, options, forceClone) {
			return getExtendedDate(null, d, options, forceClone).date;
		}
		module.exports = createDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/setChainableConstructor.js
	var require_setChainableConstructor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function setChainableConstructor(sugarNamespace, createFn) {
			sugarNamespace.prototype.constructor = function() {
				return createFn.apply(this, arguments);
			};
		}
		module.exports = setChainableConstructor;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/setDateChainableConstructor.js
	var require_setDateChainableConstructor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var createDate = require_createDate();
		var namespaceAliases = require_namespaceAliases();
		var setChainableConstructor = require_setChainableConstructor();
		var sugarDate = namespaceAliases.sugarDate;
		function setDateChainableConstructor() {
			setChainableConstructor(sugarDate, createDate);
		}
		module.exports = setDateChainableConstructor;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/build/setDateChainableConstructorCall.js
	var require_setDateChainableConstructorCall = /* @__PURE__ */ __commonJSMin((() => {
		require_setDateChainableConstructor()();
	}));
	//#endregion
	//#region node_modules/sugar-date/date/create.js
	var require_create = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var createDate = require_createDate();
		require_setDateChainableConstructorCall();
		Sugar.Date.defineStatic({ "create": function(d, options) {
			return createDate(d, options);
		} });
		module.exports = Sugar.Date.create;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/getKeys.js
	var require_getKeys = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function getKeys(obj) {
			return Object.keys(obj);
		}
		module.exports = getKeys;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getAllLocaleCodes.js
	var require_getAllLocaleCodes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var LocaleHelpers = require_LocaleHelpers();
		var getKeys = require_getKeys();
		var localeManager = LocaleHelpers.localeManager;
		Sugar.Date.defineStatic({ "getAllLocaleCodes": function() {
			return getKeys(localeManager.getAll());
		} });
		module.exports = Sugar.Date.getAllLocaleCodes;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getAllLocales.js
	var require_getAllLocales = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var localeManager = require_LocaleHelpers().localeManager;
		Sugar.Date.defineStatic({ "getAllLocales": function() {
			return localeManager.getAll();
		} });
		module.exports = Sugar.Date.getAllLocales;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getLocale.js
	var require_getLocale = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var localeManager = require_LocaleHelpers().localeManager;
		Sugar.Date.defineStatic({ "getLocale": function(code) {
			return localeManager.get(code, !code);
		} });
		module.exports = Sugar.Date.getLocale;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/removeLocale.js
	var require_removeLocale = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var localeManager = require_LocaleHelpers().localeManager;
		Sugar.Date.defineStatic({ "removeLocale": function(code) {
			return localeManager.remove(code);
		} });
		module.exports = Sugar.Date.removeLocale;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/setLocale.js
	var require_setLocale = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var localeManager = require_LocaleHelpers().localeManager;
		Sugar.Date.defineStatic({ "setLocale": function(code) {
			return localeManager.set(code);
		} });
		module.exports = Sugar.Date.setLocale;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/wrapNamespace.js
	var require_wrapNamespace = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function wrapNamespace(method) {
			return function(sugarNamespace, arg1, arg2) {
				sugarNamespace[method](arg1, arg2);
			};
		}
		module.exports = wrapNamespace;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/methodDefineAliases.js
	var require_methodDefineAliases = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var wrapNamespace = require_wrapNamespace();
		module.exports = {
			alias: wrapNamespace("alias"),
			defineStatic: wrapNamespace("defineStatic"),
			defineInstance: wrapNamespace("defineInstance"),
			defineStaticPolyfill: wrapNamespace("defineStaticPolyfill"),
			defineInstancePolyfill: wrapNamespace("defineInstancePolyfill"),
			defineInstanceAndStatic: wrapNamespace("defineInstanceAndStatic"),
			defineInstanceWithArguments: wrapNamespace("defineInstanceWithArguments")
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/collectSimilarMethods.js
	var require_collectSimilarMethods = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var forEach = require_forEach();
		var spaceSplit = require_spaceSplit();
		var isString = require_classChecks().isString;
		function collectSimilarMethods(set, fn) {
			var methods = {};
			if (isString(set)) set = spaceSplit(set);
			forEach(set, function(el, i) {
				fn(methods, el, i);
			});
			return methods;
		}
		module.exports = collectSimilarMethods;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/defineInstanceSimilar.js
	var require_defineInstanceSimilar = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var methodDefineAliases = require_methodDefineAliases();
		var collectSimilarMethods = require_collectSimilarMethods();
		var defineInstance = methodDefineAliases.defineInstance;
		function defineInstanceSimilar(sugarNamespace, set, fn, flags) {
			defineInstance(sugarNamespace, collectSimilarMethods(set, fn), flags);
		}
		module.exports = defineInstanceSimilar;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/buildNumberUnitMethods.js
	var require_buildNumberUnitMethods = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnits = require_DateUnits();
		var createDate = require_createDate();
		var mathAliases = require_mathAliases();
		var advanceDate = require_advanceDate();
		var namespaceAliases = require_namespaceAliases();
		var defineInstanceSimilar = require_defineInstanceSimilar();
		var sugarNumber = namespaceAliases.sugarNumber;
		var round = mathAliases.round;
		function buildNumberUnitMethods() {
			defineInstanceSimilar(sugarNumber, DateUnits, function(methods, unit) {
				var name = unit.name, base = function(n) {
					return round(n * unit.multiplier);
				}, after = function(n, d, options) {
					return advanceDate(createDate(d, options, true), name, n);
				}, before = function(n, d, options) {
					return advanceDate(createDate(d, options, true), name, -n);
				};
				methods[name] = base;
				methods[name + "s"] = base;
				methods[name + "Before"] = before;
				methods[name + "sBefore"] = before;
				methods[name + "Ago"] = before;
				methods[name + "sAgo"] = before;
				methods[name + "After"] = after;
				methods[name + "sAfter"] = after;
				methods[name + "FromNow"] = after;
				methods[name + "sFromNow"] = after;
			});
		}
		module.exports = buildNumberUnitMethods;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/build/buildNumberUnitMethodsCall.js
	var require_buildNumberUnitMethodsCall = /* @__PURE__ */ __commonJSMin((() => {
		require_buildNumberUnitMethods()();
	}));
	//#endregion
	//#region node_modules/sugar-date/number/day.js
	var require_day = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.day;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/dayAfter.js
	var require_dayAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.dayAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/dayAgo.js
	var require_dayAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.dayAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/dayBefore.js
	var require_dayBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.dayBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/dayFromNow.js
	var require_dayFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.dayFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/days.js
	var require_days$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.days;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/daysAfter.js
	var require_daysAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.daysAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/daysAgo.js
	var require_daysAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.daysAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/daysBefore.js
	var require_daysBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.daysBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/daysFromNow.js
	var require_daysFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.daysFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/duration.js
	var require_duration = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var localeManager = require_LocaleHelpers().localeManager;
		Sugar.Number.defineInstance({ "duration": function(n, localeCode) {
			return localeManager.get(localeCode).getDuration(n);
		} });
		module.exports = Sugar.Number.duration;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hour.js
	var require_hour = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hour;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hourAfter.js
	var require_hourAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hourAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hourAgo.js
	var require_hourAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hourAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hourBefore.js
	var require_hourBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hourBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hourFromNow.js
	var require_hourFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hourFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hours.js
	var require_hours$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hours;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hoursAfter.js
	var require_hoursAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hoursAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hoursAgo.js
	var require_hoursAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hoursAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hoursBefore.js
	var require_hoursBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hoursBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/hoursFromNow.js
	var require_hoursFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.hoursFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecond.js
	var require_millisecond = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecond;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondAfter.js
	var require_millisecondAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondAgo.js
	var require_millisecondAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondBefore.js
	var require_millisecondBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondFromNow.js
	var require_millisecondFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/milliseconds.js
	var require_milliseconds$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.milliseconds;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondsAfter.js
	var require_millisecondsAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondsAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondsAgo.js
	var require_millisecondsAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondsBefore.js
	var require_millisecondsBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondsBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/millisecondsFromNow.js
	var require_millisecondsFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.millisecondsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minute.js
	var require_minute = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minute;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minuteAfter.js
	var require_minuteAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minuteAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minuteAgo.js
	var require_minuteAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minuteAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minuteBefore.js
	var require_minuteBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minuteBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minuteFromNow.js
	var require_minuteFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minuteFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minutes.js
	var require_minutes$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minutes;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minutesAfter.js
	var require_minutesAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minutesAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minutesAgo.js
	var require_minutesAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minutesAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minutesBefore.js
	var require_minutesBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minutesBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/minutesFromNow.js
	var require_minutesFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.minutesFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/month.js
	var require_month = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.month;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthAfter.js
	var require_monthAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthAgo.js
	var require_monthAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthBefore.js
	var require_monthBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthFromNow.js
	var require_monthFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/months.js
	var require_months$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.months;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthsAfter.js
	var require_monthsAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthsAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthsAgo.js
	var require_monthsAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthsBefore.js
	var require_monthsBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthsBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/monthsFromNow.js
	var require_monthsFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.monthsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/second.js
	var require_second = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.second;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondAfter.js
	var require_secondAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondAgo.js
	var require_secondAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondBefore.js
	var require_secondBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondFromNow.js
	var require_secondFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/seconds.js
	var require_seconds$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.seconds;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondsAfter.js
	var require_secondsAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondsAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondsAgo.js
	var require_secondsAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondsBefore.js
	var require_secondsBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondsBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/secondsFromNow.js
	var require_secondsFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.secondsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/week.js
	var require_week = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.week;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weekAfter.js
	var require_weekAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weekAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weekAgo.js
	var require_weekAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weekAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weekBefore.js
	var require_weekBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weekBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weekFromNow.js
	var require_weekFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weekFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weeks.js
	var require_weeks$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weeks;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weeksAfter.js
	var require_weeksAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weeksAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weeksAgo.js
	var require_weeksAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weeksAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weeksBefore.js
	var require_weeksBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weeksBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/weeksFromNow.js
	var require_weeksFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.weeksFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/year.js
	var require_year = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.year;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearAfter.js
	var require_yearAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearAgo.js
	var require_yearAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearBefore.js
	var require_yearBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearFromNow.js
	var require_yearFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/years.js
	var require_years$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.years;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearsAfter.js
	var require_yearsAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearsAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearsAgo.js
	var require_yearsAgo$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearsBefore.js
	var require_yearsBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearsBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/number/yearsFromNow.js
	var require_yearsFromNow$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildNumberUnitMethodsCall();
		module.exports = Sugar.Number.yearsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/compareDate.js
	var require_compareDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var MINUTES = require_MINUTES();
		var DateUnits = require_DateUnits();
		var DateUnitIndexes = require_DateUnitIndexes();
		var _utc = require__utc();
		var tzOffset = require_tzOffset();
		var cloneDate = require_cloneDate();
		var isDefined = require_isDefined();
		var advanceDate = require_advanceDate();
		var dateIsValid = require_dateIsValid();
		var moveToEndOfUnit = require_moveToEndOfUnit();
		var getExtendedDate = require_getExtendedDate();
		var moveToBeginningOfUnit = require_moveToBeginningOfUnit();
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		function compareDate(date, d, margin, localeCode, options) {
			var loMargin = 0, hiMargin = 0, timezoneShift, compareEdges, override, min, max, p, t;
			function getTimezoneShift() {
				if (p.set && p.set.specificity) return 0;
				return (tzOffset(p.date) - tzOffset(date)) * MINUTES;
			}
			function addSpecificUnit() {
				var unit = DateUnits[p.set.specificity];
				return advanceDate(cloneDate(p.date), unit.name, 1).getTime() - 1;
			}
			if (_utc(date)) {
				options = options || {};
				options.fromUTC = true;
				options.setUTC = true;
			}
			p = getExtendedDate(null, d, options, true);
			if (margin > 0) {
				loMargin = hiMargin = margin;
				override = true;
			}
			if (!dateIsValid(p.date)) return false;
			if (p.set && p.set.specificity) {
				if (isDefined(p.set.edge) || isDefined(p.set.shift)) {
					compareEdges = true;
					moveToBeginningOfUnit(p.date, p.set.specificity, localeCode);
				}
				if (compareEdges || p.set.specificity === MONTH_INDEX) max = moveToEndOfUnit(cloneDate(p.date), p.set.specificity, localeCode).getTime();
				else max = addSpecificUnit();
				if (!override && isDefined(p.set.sign) && p.set.specificity) {
					loMargin = 50;
					hiMargin = -50;
				}
			}
			t = date.getTime();
			min = p.date.getTime();
			max = max || min;
			timezoneShift = getTimezoneShift();
			// istanbul ignore if
			if (timezoneShift) {
				min -= timezoneShift;
				max -= timezoneShift;
			}
			return t >= min - loMargin && t <= max + hiMargin;
		}
		module.exports = compareDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/simpleCapitalize.js
	var require_simpleCapitalize = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function simpleCapitalize(str) {
			return str.charAt(0).toUpperCase() + str.slice(1);
		}
		module.exports = simpleCapitalize;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getTimeDistanceForUnit.js
	var require_getTimeDistanceForUnit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var trunc = require_trunc();
		var cloneDate = require_cloneDate();
		var advanceDate = require_advanceDate();
		function getTimeDistanceForUnit(d1, d2, unit) {
			var fwd = d2 > d1, num, tmp;
			if (!fwd) {
				tmp = d2;
				d2 = d1;
				d1 = tmp;
			}
			num = d2 - d1;
			if (unit.multiplier > 1) num = trunc(num / unit.multiplier);
			if (unit.ambiguous) {
				d1 = cloneDate(d1);
				if (num) {
					num -= 1;
					advanceDate(d1, unit.name, num);
				}
				while (d1 < d2) {
					advanceDate(d1, unit.name, 1);
					if (d1 > d2) break;
					num += 1;
				}
			}
			return fwd ? -num : num;
		}
		module.exports = getTimeDistanceForUnit;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/buildDateUnitMethods.js
	var require_buildDateUnitMethods = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnits = require_DateUnits();
		var DateUnitIndexes = require_DateUnitIndexes();
		var forEach = require_forEach();
		var createDate = require_createDate();
		var compareDate = require_compareDate();
		var advanceDate = require_advanceDate();
		var moveToEndOfUnit = require_moveToEndOfUnit();
		var namespaceAliases = require_namespaceAliases();
		var simpleCapitalize = require_simpleCapitalize();
		var moveToBeginningOfUnit = require_moveToBeginningOfUnit();
		var defineInstanceSimilar = require_defineInstanceSimilar();
		var getTimeDistanceForUnit = require_getTimeDistanceForUnit();
		var sugarDate = namespaceAliases.sugarDate;
		var HOURS_INDEX = DateUnitIndexes.HOURS_INDEX;
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		function buildDateUnitMethods() {
			defineInstanceSimilar(sugarDate, DateUnits, function(methods, unit, index) {
				var name = unit.name, caps = simpleCapitalize(name);
				if (index > DAY_INDEX) forEach([
					"Last",
					"This",
					"Next"
				], function(shift) {
					methods["is" + shift + caps] = function(d, localeCode) {
						return compareDate(d, shift + " " + name, 0, localeCode, { locale: "en" });
					};
				});
				if (index > HOURS_INDEX) {
					methods["beginningOf" + caps] = function(d, localeCode) {
						return moveToBeginningOfUnit(d, index, localeCode);
					};
					methods["endOf" + caps] = function(d, localeCode) {
						return moveToEndOfUnit(d, index, localeCode);
					};
				}
				methods["add" + caps + "s"] = function(d, num, reset) {
					return advanceDate(d, name, num, reset);
				};
				var since = function(date, d, options) {
					return getTimeDistanceForUnit(date, createDate(d, options, true), unit);
				};
				var until = function(date, d, options) {
					return getTimeDistanceForUnit(createDate(d, options, true), date, unit);
				};
				methods[name + "sAgo"] = methods[name + "sUntil"] = until;
				methods[name + "sSince"] = methods[name + "sFromNow"] = since;
			});
		}
		module.exports = buildDateUnitMethods;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/build/buildDateUnitMethodsCall.js
	var require_buildDateUnitMethodsCall = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateUnitMethods()();
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addDays.js
	var require_addDays = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addDays;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addHours.js
	var require_addHours = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addHours;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addMilliseconds.js
	var require_addMilliseconds = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addMilliseconds;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addMinutes.js
	var require_addMinutes = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addMinutes;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addMonths.js
	var require_addMonths = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addMonths;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addSeconds.js
	var require_addSeconds = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addSeconds;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addWeeks.js
	var require_addWeeks = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addWeeks;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/addYears.js
	var require_addYears = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.addYears;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getDateParamsFromString.js
	var require_getDateParamsFromString = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isUndefined = require_isUndefined();
		function getDateParamsFromString(str) {
			var match, num, params = {};
			match = str.match(/^(-?\d*[\d.]\d*)?\s?(\w+?)s?$/i);
			if (match) {
				if (isUndefined(num)) num = match[1] ? +match[1] : 1;
				params[match[2].toLowerCase()] = num;
			}
			return params;
		}
		module.exports = getDateParamsFromString;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/collectDateParamsFromArguments.js
	var require_collectDateParamsFromArguments = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnitIndexes = require_DateUnitIndexes();
		var isDefined = require_isDefined();
		var walkUnitDown = require_walkUnitDown();
		var YEAR_INDEX = DateUnitIndexes.YEAR_INDEX;
		function collectDateParamsFromArguments(args) {
			var params = {}, index = 0;
			walkUnitDown(YEAR_INDEX, function(unit) {
				var arg = args[index++];
				if (isDefined(arg)) params[unit.name] = arg;
			});
			return params;
		}
		module.exports = collectDateParamsFromArguments;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/collectUpdateDateArguments.js
	var require_collectUpdateDateArguments = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var classChecks = require_classChecks();
		var simpleClone = require_simpleClone();
		var isObjectType = require_isObjectType();
		var getDateParamsFromString = require_getDateParamsFromString();
		var collectDateParamsFromArguments = require_collectDateParamsFromArguments();
		var isNumber = classChecks.isNumber;
		var isString = classChecks.isString;
		function collectUpdateDateArguments(args, allowDuration) {
			var arg1 = args[0], arg2 = args[1], params, reset;
			if (allowDuration && isString(arg1)) {
				params = getDateParamsFromString(arg1);
				reset = arg2;
			} else if (isNumber(arg1) && isNumber(arg2)) params = collectDateParamsFromArguments(args);
			else {
				params = isObjectType(arg1) ? simpleClone(arg1) : arg1;
				reset = arg2;
			}
			return [params, reset];
		}
		module.exports = collectUpdateDateArguments;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/advanceDateWithArgs.js
	var require_advanceDateWithArgs = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var updateDate = require_updateDate();
		var collectUpdateDateArguments = require_collectUpdateDateArguments();
		function advanceDateWithArgs(d, args, dir) {
			args = collectUpdateDateArguments(args, true);
			return updateDate(d, args[0], args[1], dir);
		}
		module.exports = advanceDateWithArgs;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/advance.js
	var require_advance = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var advanceDateWithArgs = require_advanceDateWithArgs();
		Sugar.Date.defineInstanceWithArguments({ "advance": function(d, args) {
			return advanceDateWithArgs(d, args, 1);
		} });
		module.exports = Sugar.Date.advance;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/beginningOfDay.js
	var require_beginningOfDay = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.beginningOfDay;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/beginningOfISOWeek.js
	var require_beginningOfISOWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var resetTime = require_resetTime();
		var getWeekday = require_getWeekday$1();
		var setWeekday = require_setWeekday$1();
		Sugar.Date.defineInstance({ "beginningOfISOWeek": function(date) {
			var day = getWeekday(date);
			if (day === 0) day = -6;
			else if (day !== 1) day = 1;
			setWeekday(date, day);
			return resetTime(date);
		} });
		module.exports = Sugar.Date.beginningOfISOWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/beginningOfMonth.js
	var require_beginningOfMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.beginningOfMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/beginningOfWeek.js
	var require_beginningOfWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.beginningOfWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/beginningOfYear.js
	var require_beginningOfYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.beginningOfYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/clone.js
	var require_clone$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var cloneDate = require_cloneDate();
		Sugar.Date.defineInstance({ "clone": function(date) {
			return cloneDate(date);
		} });
		module.exports = Sugar.Date.clone;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/daysAgo.js
	var require_daysAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.daysAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/daysFromNow.js
	var require_daysFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.daysFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/daysInMonth.js
	var require_daysInMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var getDaysInMonth = require_getDaysInMonth();
		Sugar.Date.defineInstance({ "daysInMonth": function(date) {
			return getDaysInMonth(date);
		} });
		module.exports = Sugar.Date.daysInMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/daysSince.js
	var require_daysSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.daysSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/daysUntil.js
	var require_daysUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.daysUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/endOfDay.js
	var require_endOfDay = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.endOfDay;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/endOfISOWeek.js
	var require_endOfISOWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var DateUnitIndexes = require_DateUnitIndexes();
		var getWeekday = require_getWeekday$1();
		var setWeekday = require_setWeekday$1();
		var moveToEndOfUnit = require_moveToEndOfUnit();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		Sugar.Date.defineInstance({ "endOfISOWeek": function(date) {
			if (getWeekday(date) !== 0) setWeekday(date, 7);
			return moveToEndOfUnit(date, DAY_INDEX);
		} });
		module.exports = Sugar.Date.endOfISOWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/endOfMonth.js
	var require_endOfMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.endOfMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/endOfWeek.js
	var require_endOfWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.endOfWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/endOfYear.js
	var require_endOfYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.endOfYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/CoreOutputFormats.js
	var require_CoreOutputFormats = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			"ISO8601": "{yyyy}-{MM}-{dd}T{HH}:{mm}:{ss}.{SSS}{Z}",
			"RFC1123": "{Dow}, {dd} {Mon} {yyyy} {HH}:{mm}:{ss} {ZZ}",
			"RFC1036": "{Weekday}, {dd}-{Mon}-{yy} {HH}:{mm}:{ss} {ZZ}"
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/TIMEZONE_ABBREVIATION_REG.js
	var require_TIMEZONE_ABBREVIATION_REG = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = /\(([-+]\d{2,4}|\w{3,5})\)$/;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getHours.js
	var require_getHours = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var callDateGet = require_callDateGet();
		function getHours(d) {
			return callDateGet(d, "Hours");
		}
		module.exports = getHours;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/repeatString.js
	var require_repeatString = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function repeatString(str, num) {
			var result = "";
			str = str.toString();
			while (num > 0) {
				if (num & 1) result += str;
				if (num >>= 1) str += str;
			}
			return result;
		}
		module.exports = repeatString;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/padNumber.js
	var require_padNumber = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var mathAliases = require_mathAliases();
		var repeatString = require_repeatString();
		var abs = mathAliases.abs;
		function padNumber(num, place, sign, base, replacement) {
			var str = abs(num).toString(base || 10);
			str = repeatString(replacement || "0", place - str.replace(/\.\d+/, "").length) + str;
			if (sign || num < 0) str = (num < 0 ? "-" : "+") + str;
			return str;
		}
		module.exports = padNumber;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getWeekNumber.js
	var require_getWeekNumber = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var ISODefaults = require_ISODefaults();
		var setDate = require_setDate();
		var getDate = require_getDate();
		var cloneDate = require_cloneDate();
		var isUndefined = require_isUndefined();
		var moveToEndOfWeek = require_moveToEndOfWeek();
		var moveToBeginningOfWeek = require_moveToBeginningOfWeek();
		var moveToFirstDayOfWeekYear = require_moveToFirstDayOfWeekYear();
		var ISO_FIRST_DAY_OF_WEEK = ISODefaults.ISO_FIRST_DAY_OF_WEEK;
		var ISO_FIRST_DAY_OF_WEEK_YEAR = ISODefaults.ISO_FIRST_DAY_OF_WEEK_YEAR;
		function getWeekNumber(d, allowPrevious, firstDayOfWeek, firstDayOfWeekYear) {
			var isoWeek, n = 0;
			if (isUndefined(firstDayOfWeek)) firstDayOfWeek = ISO_FIRST_DAY_OF_WEEK;
			if (isUndefined(firstDayOfWeekYear)) firstDayOfWeekYear = ISO_FIRST_DAY_OF_WEEK_YEAR;
			isoWeek = moveToEndOfWeek(cloneDate(d), firstDayOfWeek);
			moveToFirstDayOfWeekYear(isoWeek, firstDayOfWeek, firstDayOfWeekYear);
			if (allowPrevious && d < isoWeek) {
				isoWeek = moveToBeginningOfWeek(cloneDate(d), firstDayOfWeek);
				moveToFirstDayOfWeekYear(isoWeek, firstDayOfWeek, firstDayOfWeekYear);
			}
			while (isoWeek <= d) {
				setDate(isoWeek, getDate(isoWeek) + 7);
				n++;
			}
			return n;
		}
		module.exports = getWeekNumber;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getWeekYear.js
	var require_getWeekYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var getYear = require_getYear();
		var getMonth = require_getMonth();
		var getWeekNumber = require_getWeekNumber();
		var localeManager = LocaleHelpers.localeManager;
		function getWeekYear(d, localeCode, iso) {
			var year = getYear(d), month = getMonth(d), firstDayOfWeek, firstDayOfWeekYear, week, loc;
			if (month === 0 || month === 11) {
				if (!iso) {
					loc = localeManager.get(localeCode);
					firstDayOfWeek = loc.getFirstDayOfWeek(localeCode);
					firstDayOfWeekYear = loc.getFirstDayOfWeekYear(localeCode);
				}
				week = getWeekNumber(d, false, firstDayOfWeek, firstDayOfWeekYear);
				if (month === 0 && week === 0) year -= 1;
				else if (month === 11 && week === 1) year += 1;
			}
			return year;
		}
		module.exports = getWeekYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getUTCOffset.js
	var require_getUTCOffset$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var _utc = require__utc();
		var trunc = require_trunc();
		var tzOffset = require_tzOffset();
		var padNumber = require_padNumber();
		var abs = require_mathAliases().abs;
		function getUTCOffset(d, iso) {
			var offset = _utc(d) ? 0 : tzOffset(d), hours, mins, colon = iso === true ? ":" : "";
			if (!offset && iso) return "Z";
			hours = padNumber(trunc(-offset / 60), 2, true);
			mins = padNumber(abs(offset % 60), 2);
			return hours + colon + mins;
		}
		module.exports = getUTCOffset;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getDaysSince.js
	var require_getDaysSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DateUnits = require_DateUnits();
		var DateUnitIndexes = require_DateUnitIndexes();
		var getTimeDistanceForUnit = require_getTimeDistanceForUnit();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		function getDaysSince(d1, d2) {
			return getTimeDistanceForUnit(d1, d2, DateUnits[DAY_INDEX]);
		}
		module.exports = getDaysSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getMeridiemToken.js
	var require_getMeridiemToken = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var trunc = require_trunc();
		var getHours = require_getHours();
		var localeManager = LocaleHelpers.localeManager;
		function getMeridiemToken(d, localeCode) {
			var hours = getHours(d);
			return localeManager.get(localeCode).ampm[trunc(hours / 12)] || "";
		}
		module.exports = getMeridiemToken;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/FormatTokensBase.js
	var require_FormatTokensBase = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var TIMEZONE_ABBREVIATION_REG = require_TIMEZONE_ABBREVIATION_REG();
		var LocaleHelpers = require_LocaleHelpers();
		var DateUnitIndexes = require_DateUnitIndexes();
		var trunc = require_trunc();
		var getDate = require_getDate();
		var getYear = require_getYear();
		var getHours = require_getHours();
		var getMonth = require_getMonth();
		var cloneDate = require_cloneDate();
		var padNumber = require_padNumber();
		var getWeekday = require_getWeekday$1();
		var callDateGet = require_callDateGet();
		var mathAliases = require_mathAliases();
		var getWeekYear = require_getWeekYear();
		var getUTCOffset = require_getUTCOffset$1();
		var getDaysSince = require_getDaysSince();
		var getWeekNumber = require_getWeekNumber();
		var getMeridiemToken = require_getMeridiemToken();
		var setUnitAndLowerToEdge = require_setUnitAndLowerToEdge();
		var localeManager = LocaleHelpers.localeManager;
		var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX;
		var ceil = mathAliases.ceil;
		module.exports = [
			{
				ldml: "Dow",
				strf: "a",
				lowerToken: "dow",
				get: function(d, localeCode) {
					return localeManager.get(localeCode).getWeekdayName(getWeekday(d), 2);
				}
			},
			{
				ldml: "Weekday",
				strf: "A",
				lowerToken: "weekday",
				allowAlternates: true,
				get: function(d, localeCode, alternate) {
					return localeManager.get(localeCode).getWeekdayName(getWeekday(d), alternate);
				}
			},
			{
				ldml: "Mon",
				strf: "b h",
				lowerToken: "mon",
				get: function(d, localeCode) {
					return localeManager.get(localeCode).getMonthName(getMonth(d), 2);
				}
			},
			{
				ldml: "Month",
				strf: "B",
				lowerToken: "month",
				allowAlternates: true,
				get: function(d, localeCode, alternate) {
					return localeManager.get(localeCode).getMonthName(getMonth(d), alternate);
				}
			},
			{
				strf: "C",
				get: function(d) {
					return getYear(d).toString().slice(0, 2);
				}
			},
			{
				ldml: "d date day",
				strf: "d",
				strfPadding: 2,
				ldmlPaddedToken: "dd",
				ordinalToken: "do",
				get: function(d) {
					return getDate(d);
				}
			},
			{
				strf: "e",
				get: function(d) {
					return padNumber(getDate(d), 2, false, 10, " ");
				}
			},
			{
				ldml: "H 24hr",
				strf: "H",
				strfPadding: 2,
				ldmlPaddedToken: "HH",
				get: function(d) {
					return getHours(d);
				}
			},
			{
				ldml: "h hours 12hr",
				strf: "I",
				strfPadding: 2,
				ldmlPaddedToken: "hh",
				get: function(d) {
					return getHours(d) % 12 || 12;
				}
			},
			{
				ldml: "D",
				strf: "j",
				strfPadding: 3,
				ldmlPaddedToken: "DDD",
				get: function(d) {
					return getDaysSince(d, setUnitAndLowerToEdge(cloneDate(d), MONTH_INDEX)) + 1;
				}
			},
			{
				ldml: "M",
				strf: "m",
				strfPadding: 2,
				ordinalToken: "Mo",
				ldmlPaddedToken: "MM",
				get: function(d) {
					return getMonth(d) + 1;
				}
			},
			{
				ldml: "m minutes",
				strf: "M",
				strfPadding: 2,
				ldmlPaddedToken: "mm",
				get: function(d) {
					return callDateGet(d, "Minutes");
				}
			},
			{
				ldml: "Q",
				get: function(d) {
					return ceil((getMonth(d) + 1) / 3);
				}
			},
			{
				ldml: "TT",
				strf: "p",
				get: function(d, localeCode) {
					return getMeridiemToken(d, localeCode);
				}
			},
			{
				ldml: "tt",
				strf: "P",
				get: function(d, localeCode) {
					return getMeridiemToken(d, localeCode).toLowerCase();
				}
			},
			{
				ldml: "T",
				lowerToken: "t",
				get: function(d, localeCode) {
					return getMeridiemToken(d, localeCode).charAt(0);
				}
			},
			{
				ldml: "s seconds",
				strf: "S",
				strfPadding: 2,
				ldmlPaddedToken: "ss",
				get: function(d) {
					return callDateGet(d, "Seconds");
				}
			},
			{
				ldml: "S ms",
				strfPadding: 3,
				ldmlPaddedToken: "SSS",
				get: function(d) {
					return callDateGet(d, "Milliseconds");
				}
			},
			{
				ldml: "e",
				strf: "u",
				ordinalToken: "eo",
				get: function(d) {
					return getWeekday(d) || 7;
				}
			},
			{
				strf: "U",
				strfPadding: 2,
				get: function(d) {
					return getWeekNumber(d, false, 0);
				}
			},
			{
				ldml: "W",
				strf: "V",
				strfPadding: 2,
				ordinalToken: "Wo",
				ldmlPaddedToken: "WW",
				get: function(d) {
					return getWeekNumber(d, true);
				}
			},
			{
				strf: "w",
				get: function(d) {
					return getWeekday(d);
				}
			},
			{
				ldml: "w",
				ordinalToken: "wo",
				ldmlPaddedToken: "ww",
				get: function(d, localeCode) {
					var loc = localeManager.get(localeCode);
					return getWeekNumber(d, true, loc.getFirstDayOfWeek(localeCode), loc.getFirstDayOfWeekYear(localeCode));
				}
			},
			{
				strf: "W",
				strfPadding: 2,
				get: function(d) {
					return getWeekNumber(d, false);
				}
			},
			{
				ldmlPaddedToken: "gggg",
				ldmlTwoDigitToken: "gg",
				get: function(d, localeCode) {
					return getWeekYear(d, localeCode);
				}
			},
			{
				strf: "G",
				strfPadding: 4,
				strfTwoDigitToken: "g",
				ldmlPaddedToken: "GGGG",
				ldmlTwoDigitToken: "GG",
				get: function(d, localeCode) {
					return getWeekYear(d, localeCode, true);
				}
			},
			{
				ldml: "year",
				ldmlPaddedToken: "yyyy",
				ldmlTwoDigitToken: "yy",
				strf: "Y",
				strfPadding: 4,
				strfTwoDigitToken: "y",
				get: function(d) {
					return getYear(d);
				}
			},
			{
				ldml: "ZZ",
				strf: "z",
				get: function(d) {
					return getUTCOffset(d);
				}
			},
			{
				ldml: "X",
				get: function(d) {
					return trunc(d.getTime() / 1e3);
				}
			},
			{
				ldml: "x",
				get: function(d) {
					return d.getTime();
				}
			},
			{
				ldml: "Z",
				get: function(d) {
					return getUTCOffset(d, true);
				}
			},
			{
				ldml: "z",
				strf: "Z",
				get: function(d) {
					var match = d.toString().match(TIMEZONE_ABBREVIATION_REG);
					// istanbul ignore next
					return match ? match[1] : "";
				}
			},
			{
				strf: "D",
				alias: "%m/%d/%y"
			},
			{
				strf: "F",
				alias: "%Y-%m-%d"
			},
			{
				strf: "r",
				alias: "%I:%M:%S %p"
			},
			{
				strf: "R",
				alias: "%H:%M"
			},
			{
				strf: "T",
				alias: "%H:%M:%S"
			},
			{
				strf: "x",
				alias: "{short}"
			},
			{
				strf: "X",
				alias: "{time}"
			},
			{
				strf: "c",
				alias: "{stamp}"
			}
		];
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/STRING_FORMAT_REG.js
	var require_STRING_FORMAT_REG = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = /([{}])\1|{([^}]*)}|(%)%|(%(\w*))/g;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/var/INTERNAL_MEMOIZE_LIMIT.js
	var require_INTERNAL_MEMOIZE_LIMIT = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = 1e3;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/memoizeFunction.js
	var require_memoizeFunction = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var INTERNAL_MEMOIZE_LIMIT = require_INTERNAL_MEMOIZE_LIMIT();
		var hasOwn = require_coreUtilityAliases().hasOwn;
		function memoizeFunction(fn) {
			var memo = {}, counter = 0;
			return function(key) {
				if (hasOwn(memo, key)) return memo[key];
				// istanbul ignore if
				if (counter === INTERNAL_MEMOIZE_LIMIT) {
					memo = {};
					counter = 0;
				}
				counter++;
				return memo[key] = fn(key);
			};
		}
		module.exports = memoizeFunction;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/createFormatMatcher.js
	var require_createFormatMatcher = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var STRING_FORMAT_REG = require_STRING_FORMAT_REG();
		var CommonChars = require_CommonChars();
		var memoizeFunction = require_memoizeFunction();
		var OPEN_BRACE = CommonChars.OPEN_BRACE;
		var CLOSE_BRACE = CommonChars.CLOSE_BRACE;
		function createFormatMatcher(bracketMatcher, percentMatcher, precheck) {
			var reg = STRING_FORMAT_REG;
			var compileMemoized = memoizeFunction(compile);
			function getToken(format, match) {
				var get, token, literal, fn;
				var bKey = match[2];
				var pLit = match[3];
				var pKey = match[5];
				if (match[4] && percentMatcher) {
					token = pKey;
					get = percentMatcher;
				} else if (bKey) {
					token = bKey;
					get = bracketMatcher;
				} else if (pLit && percentMatcher) literal = pLit;
				else literal = match[1] || match[0];
				if (get) {
					assertPassesPrecheck(precheck, bKey, pKey);
					fn = function(obj, opt) {
						return get(obj, token, opt);
					};
				}
				format.push(fn || getLiteral(literal));
			}
			function getSubstring(format, str, start, end) {
				if (end > start) {
					var sub = str.slice(start, end);
					assertNoUnmatched(sub, OPEN_BRACE);
					assertNoUnmatched(sub, CLOSE_BRACE);
					format.push(function() {
						return sub;
					});
				}
			}
			function getLiteral(str) {
				return function() {
					return str;
				};
			}
			function assertPassesPrecheck(precheck, bt, pt) {
				if (precheck && !precheck(bt, pt)) throw new TypeError("Invalid token " + (bt || pt) + " in format string");
			}
			function assertNoUnmatched(str, chr) {
				if (str.indexOf(chr) !== -1) throw new TypeError("Unmatched " + chr + " in format string");
			}
			function compile(str) {
				var format = [], lastIndex = 0, match;
				reg.lastIndex = 0;
				while (match = reg.exec(str)) {
					getSubstring(format, str, lastIndex, match.index);
					getToken(format, match);
					lastIndex = reg.lastIndex;
				}
				getSubstring(format, str, lastIndex, str.length);
				return format;
			}
			return function(str, obj, opt) {
				var format = compileMemoized(str), result = "";
				for (var i = 0; i < format.length; i++) result += format[i](obj, opt);
				return result;
			};
		}
		module.exports = createFormatMatcher;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/var/formattingTokens.js
	var require_formattingTokens = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var FormatTokensBase = require_FormatTokensBase();
		var CoreOutputFormats = require_CoreOutputFormats();
		var forEach = require_forEach();
		var padNumber = require_padNumber();
		var spaceSplit = require_spaceSplit();
		var namespaceAliases = require_namespaceAliases();
		var coreUtilityAliases = require_coreUtilityAliases();
		var createFormatMatcher = require_createFormatMatcher();
		var defineInstanceSimilar = require_defineInstanceSimilar();
		var localeManager = LocaleHelpers.localeManager;
		var hasOwn = coreUtilityAliases.hasOwn;
		var getOwn = coreUtilityAliases.getOwn;
		var forEachProperty = coreUtilityAliases.forEachProperty;
		var sugarDate = namespaceAliases.sugarDate;
		var ldmlTokens;
		var strfTokens;
		function buildDateFormatTokens() {
			function addFormats(target, tokens, fn) {
				if (tokens) forEach(spaceSplit(tokens), function(token) {
					target[token] = fn;
				});
			}
			function buildLowercase(get) {
				return function(d, localeCode) {
					return get(d, localeCode).toLowerCase();
				};
			}
			function buildOrdinal(get) {
				return function(d, localeCode) {
					var n = get(d, localeCode);
					return n + localeManager.get(localeCode).getOrdinal(n);
				};
			}
			function buildPadded(get, padding) {
				return function(d, localeCode) {
					return padNumber(get(d, localeCode), padding);
				};
			}
			function buildTwoDigits(get) {
				return function(d, localeCode) {
					return get(d, localeCode) % 100;
				};
			}
			function buildAlias(alias) {
				return function(d, localeCode) {
					return dateFormatMatcher(alias, d, localeCode);
				};
			}
			function buildAlternates(f) {
				for (var n = 1; n <= 5; n++) buildAlternate(f, n);
			}
			function buildAlternate(f, n) {
				var alternate = function(d, localeCode) {
					return f.get(d, localeCode, n);
				};
				addFormats(ldmlTokens, f.ldml + n, alternate);
				if (f.lowerToken) ldmlTokens[f.lowerToken + n] = buildLowercase(alternate);
			}
			function getIdentityFormat(name) {
				return function(d, localeCode) {
					var loc = localeManager.get(localeCode);
					return dateFormatMatcher(loc[name], d, localeCode);
				};
			}
			ldmlTokens = {};
			strfTokens = {};
			forEach(FormatTokensBase, function(f) {
				var get = f.get, getPadded;
				if (f.lowerToken) ldmlTokens[f.lowerToken] = buildLowercase(get);
				if (f.ordinalToken) ldmlTokens[f.ordinalToken] = buildOrdinal(get, f);
				if (f.ldmlPaddedToken) ldmlTokens[f.ldmlPaddedToken] = buildPadded(get, f.ldmlPaddedToken.length);
				if (f.ldmlTwoDigitToken) ldmlTokens[f.ldmlTwoDigitToken] = buildPadded(buildTwoDigits(get), 2);
				if (f.strfTwoDigitToken) strfTokens[f.strfTwoDigitToken] = buildPadded(buildTwoDigits(get), 2);
				if (f.strfPadding) getPadded = buildPadded(get, f.strfPadding);
				if (f.alias) get = buildAlias(f.alias);
				if (f.allowAlternates) buildAlternates(f);
				addFormats(ldmlTokens, f.ldml, get);
				addFormats(strfTokens, f.strf, getPadded || get);
			});
			forEachProperty(CoreOutputFormats, function(src, name) {
				addFormats(ldmlTokens, name, buildAlias(src));
			});
			defineInstanceSimilar(sugarDate, "short medium long full", function(methods, name) {
				var fn = getIdentityFormat(name);
				addFormats(ldmlTokens, name, fn);
				methods[name] = fn;
			});
			addFormats(ldmlTokens, "time", getIdentityFormat("time"));
			addFormats(ldmlTokens, "stamp", getIdentityFormat("stamp"));
		}
		var dateFormatMatcher;
		function buildDateFormatMatcher() {
			function getLdml(d, token, localeCode) {
				return getOwn(ldmlTokens, token)(d, localeCode);
			}
			function getStrf(d, token, localeCode) {
				return getOwn(strfTokens, token)(d, localeCode);
			}
			function checkDateToken(ldml, strf) {
				return hasOwn(ldmlTokens, ldml) || hasOwn(strfTokens, strf);
			}
			dateFormatMatcher = createFormatMatcher(getLdml, getStrf, checkDateToken);
		}
		buildDateFormatTokens();
		buildDateFormatMatcher();
		module.exports = {
			ldmlTokens,
			strfTokens,
			dateFormatMatcher
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/assertDateIsValid.js
	var require_assertDateIsValid = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var dateIsValid = require_dateIsValid();
		function assertDateIsValid(d) {
			if (!dateIsValid(d)) throw new TypeError("Date is not valid");
		}
		module.exports = assertDateIsValid;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/dateFormat.js
	var require_dateFormat = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var CoreOutputFormats = require_CoreOutputFormats();
		var formattingTokens = require_formattingTokens();
		var assertDateIsValid = require_assertDateIsValid();
		var dateFormatMatcher = formattingTokens.dateFormatMatcher;
		function dateFormat(d, format, localeCode) {
			assertDateIsValid(d);
			format = CoreOutputFormats[format] || format || "{long}";
			return dateFormatMatcher(format, d, localeCode);
		}
		module.exports = dateFormat;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/format.js
	var require_format = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var dateFormat = require_dateFormat();
		Sugar.Date.defineInstance({ "format": function(date, f, localeCode) {
			return dateFormat(date, f, localeCode);
		} });
		module.exports = Sugar.Date.format;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/createDateWithContext.js
	var require_createDateWithContext = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getExtendedDate = require_getExtendedDate();
		function createDateWithContext(contextDate, d, options, forceClone) {
			return getExtendedDate(contextDate, d, options, forceClone).date;
		}
		module.exports = createDateWithContext;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/get.js
	var require_get = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var createDateWithContext = require_createDateWithContext();
		Sugar.Date.defineInstance({ "get": function(date, d, options) {
			return createDateWithContext(date, d, options);
		} });
		module.exports = Sugar.Date.get;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getISOWeek.js
	var require_getISOWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var getWeekNumber = require_getWeekNumber();
		Sugar.Date.defineInstance({ "getISOWeek": function(date) {
			return getWeekNumber(date, true);
		} });
		module.exports = Sugar.Date.getISOWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getUTCOffset.js
	var require_getUTCOffset = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var getUTCOffset = require_getUTCOffset$1();
		Sugar.Date.defineInstance({ "getUTCOffset": function(date, iso) {
			return getUTCOffset(date, iso);
		} });
		module.exports = Sugar.Date.getUTCOffset;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getUTCWeekday.js
	var require_getUTCWeekday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		Sugar.Date.defineInstance({ "getUTCWeekday": function(date) {
			return date.getUTCDay();
		} });
		module.exports = Sugar.Date.getUTCWeekday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getWeekday.js
	var require_getWeekday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var getWeekday = require_getWeekday$1();
		Sugar.Date.defineInstance({ "getWeekday": function(date) {
			return getWeekday(date);
		} });
		module.exports = Sugar.Date.getWeekday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/hoursAgo.js
	var require_hoursAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.hoursAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/hoursFromNow.js
	var require_hoursFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.hoursFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/hoursSince.js
	var require_hoursSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.hoursSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/hoursUntil.js
	var require_hoursUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.hoursUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/trim.js
	var require_trim = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function trim(str) {
			return str.trim();
		}
		module.exports = trim;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/compareDay.js
	var require_compareDay = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var setDate = require_setDate();
		var getDate = require_getDate();
		var getYear = require_getYear();
		var getMonth = require_getMonth();
		var getNewDate = require_getNewDate();
		function compareDay(d, shift) {
			var comp = getNewDate();
			if (shift) setDate(comp, getDate(comp) + shift);
			return getYear(d) === getYear(comp) && getMonth(d) === getMonth(comp) && getDate(d) === getDate(comp);
		}
		module.exports = compareDay;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/fullCompareDate.js
	var require_fullCompareDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var trim = require_trim();
		var getMonth = require_getMonth();
		var isDefined = require_isDefined();
		var getNewDate = require_getNewDate();
		var compareDay = require_compareDay();
		var getWeekday = require_getWeekday$1();
		var dateIsValid = require_dateIsValid();
		var classChecks = require_classChecks();
		var compareDate = require_compareDate();
		var isString = classChecks.isString;
		var English = LocaleHelpers.English;
		function fullCompareDate(date, d, margin) {
			var tmp;
			if (!dateIsValid(date)) return;
			if (isString(d)) {
				d = trim(d).toLowerCase();
				switch (true) {
					case d === "future": return date.getTime() > getNewDate().getTime();
					case d === "past": return date.getTime() < getNewDate().getTime();
					case d === "today": return compareDay(date);
					case d === "tomorrow": return compareDay(date, 1);
					case d === "yesterday": return compareDay(date, -1);
					case d === "weekday": return getWeekday(date) > 0 && getWeekday(date) < 6;
					case d === "weekend": return getWeekday(date) === 0 || getWeekday(date) === 6;
					case isDefined(tmp = English.weekdayMap[d]): return getWeekday(date) === tmp;
					case isDefined(tmp = English.monthMap[d]): return getMonth(date) === tmp;
				}
			}
			return compareDate(date, d, margin);
		}
		module.exports = fullCompareDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/is.js
	var require_is = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var fullCompareDate = require_fullCompareDate();
		Sugar.Date.defineInstance({ "is": function(date, d, margin) {
			return fullCompareDate(date, d, margin);
		} });
		module.exports = Sugar.Date.is;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isAfter.js
	var require_isAfter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var createDate = require_createDate();
		Sugar.Date.defineInstance({ "isAfter": function(date, d, margin) {
			return date.getTime() > createDate(d).getTime() - (margin || 0);
		} });
		module.exports = Sugar.Date.isAfter;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isBefore.js
	var require_isBefore = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var createDate = require_createDate();
		Sugar.Date.defineInstance({ "isBefore": function(date, d, margin) {
			return date.getTime() < createDate(d).getTime() + (margin || 0);
		} });
		module.exports = Sugar.Date.isBefore;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isBetween.js
	var require_isBetween = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var createDate = require_createDate();
		var mathAliases = require_mathAliases();
		var min = mathAliases.min;
		var max = mathAliases.max;
		Sugar.Date.defineInstance({ "isBetween": function(date, d1, d2, margin) {
			var t = date.getTime();
			var t1 = createDate(d1).getTime();
			var t2 = createDate(d2).getTime();
			var lo = min(t1, t2);
			var hi = max(t1, t2);
			margin = margin || 0;
			return lo - margin <= t && hi + margin >= t;
		} });
		module.exports = Sugar.Date.isBetween;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/buildRelativeAliases.js
	var require_buildRelativeAliases = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var spaceSplit = require_spaceSplit();
		var fullCompareDate = require_fullCompareDate();
		var namespaceAliases = require_namespaceAliases();
		var defineInstanceSimilar = require_defineInstanceSimilar();
		var English = LocaleHelpers.English;
		var sugarDate = namespaceAliases.sugarDate;
		function buildRelativeAliases() {
			var special = spaceSplit("Today Yesterday Tomorrow Weekday Weekend Future Past");
			var weekdays = English.weekdays.slice(0, 7);
			var months = English.months.slice(0, 12);
			defineInstanceSimilar(sugarDate, special.concat(weekdays).concat(months), function(methods, name) {
				methods["is" + name] = function(d) {
					return fullCompareDate(d, name);
				};
			});
		}
		module.exports = buildRelativeAliases;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/build/buildRelativeAliasesCall.js
	var require_buildRelativeAliasesCall = /* @__PURE__ */ __commonJSMin((() => {
		require_buildRelativeAliases()();
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isFriday.js
	var require_isFriday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isFriday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isFuture.js
	var require_isFuture = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isFuture;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isLastMonth.js
	var require_isLastMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isLastMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isLastWeek.js
	var require_isLastWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isLastWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isLastYear.js
	var require_isLastYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isLastYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isLeapYear.js
	var require_isLeapYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var getYear = require_getYear();
		Sugar.Date.defineInstance({ "isLeapYear": function(date) {
			var year = getYear(date);
			return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
		} });
		module.exports = Sugar.Date.isLeapYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isMonday.js
	var require_isMonday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isMonday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isNextMonth.js
	var require_isNextMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isNextMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isNextWeek.js
	var require_isNextWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isNextWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isNextYear.js
	var require_isNextYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isNextYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isPast.js
	var require_isPast = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isPast;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isSaturday.js
	var require_isSaturday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isSaturday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isSunday.js
	var require_isSunday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isSunday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isThisMonth.js
	var require_isThisMonth = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isThisMonth;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isThisWeek.js
	var require_isThisWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isThisWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isThisYear.js
	var require_isThisYear = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.isThisYear;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isThursday.js
	var require_isThursday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isThursday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isToday.js
	var require_isToday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isToday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isTomorrow.js
	var require_isTomorrow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isTomorrow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isTuesday.js
	var require_isTuesday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isTuesday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/isUTC.js
	var require_isUTC$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var _utc = require__utc();
		var tzOffset = require_tzOffset();
		function isUTC(d) {
			return !!_utc(d) || tzOffset(d) === 0;
		}
		module.exports = isUTC;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isUTC.js
	var require_isUTC = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var isUTC = require_isUTC$1();
		Sugar.Date.defineInstance({ "isUTC": function(date) {
			return isUTC(date);
		} });
		module.exports = Sugar.Date.isUTC;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isValid.js
	var require_isValid$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var dateIsValid = require_dateIsValid();
		Sugar.Date.defineInstance({ "isValid": function(date) {
			return dateIsValid(date);
		} });
		module.exports = Sugar.Date.isValid;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isWednesday.js
	var require_isWednesday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isWednesday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isWeekday.js
	var require_isWeekday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isWeekday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isWeekend.js
	var require_isWeekend = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isWeekend;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/isYesterday.js
	var require_isYesterday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildRelativeAliasesCall();
		module.exports = Sugar.Date.isYesterday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/iso.js
	var require_iso = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		Sugar.Date.defineInstance({ "iso": function(date) {
			return date.toISOString();
		} });
		module.exports = Sugar.Date.iso;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/millisecondsAgo.js
	var require_millisecondsAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.millisecondsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/millisecondsFromNow.js
	var require_millisecondsFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.millisecondsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/millisecondsSince.js
	var require_millisecondsSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.millisecondsSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/millisecondsUntil.js
	var require_millisecondsUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.millisecondsUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/minutesAgo.js
	var require_minutesAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.minutesAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/minutesFromNow.js
	var require_minutesFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.minutesFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/minutesSince.js
	var require_minutesSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.minutesSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/minutesUntil.js
	var require_minutesUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.minutesUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/monthsAgo.js
	var require_monthsAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.monthsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/monthsFromNow.js
	var require_monthsFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.monthsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/monthsSince.js
	var require_monthsSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.monthsSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/monthsUntil.js
	var require_monthsUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.monthsUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getAdjustedUnitForDate.js
	var require_getAdjustedUnitForDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var getNewDate = require_getNewDate();
		var mathAliases = require_mathAliases();
		var getAdjustedUnit = require_getAdjustedUnit();
		var getTimeDistanceForUnit = require_getTimeDistanceForUnit();
		var abs = mathAliases.abs;
		function getAdjustedUnitForDate(d, dRelative) {
			var ms;
			if (!dRelative) {
				dRelative = getNewDate();
				if (d > dRelative) dRelative = /* @__PURE__ */ new Date(dRelative.getTime() - 10);
			}
			ms = d - dRelative;
			return getAdjustedUnit(ms, function(u) {
				return abs(getTimeDistanceForUnit(d, dRelative, u));
			});
		}
		module.exports = getAdjustedUnitForDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/dateRelative.js
	var require_dateRelative = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var LocaleHelpers = require_LocaleHelpers();
		var dateFormat = require_dateFormat();
		var classChecks = require_classChecks();
		var assertDateIsValid = require_assertDateIsValid();
		var getAdjustedUnitForDate = require_getAdjustedUnitForDate();
		var isFunction = classChecks.isFunction;
		var localeManager = LocaleHelpers.localeManager;
		function dateRelative(d, dRelative, arg1, arg2) {
			var adu, format, type, localeCode, fn;
			assertDateIsValid(d);
			if (isFunction(arg1)) fn = arg1;
			else {
				localeCode = arg1;
				fn = arg2;
			}
			adu = getAdjustedUnitForDate(d, dRelative);
			if (fn) {
				format = fn.apply(d, adu.concat(localeManager.get(localeCode)));
				if (format) return dateFormat(d, format, localeCode);
			}
			if (adu[1] === 0) {
				adu[1] = 1;
				adu[0] = 1;
			}
			if (dRelative) type = "duration";
			else if (adu[2] > 0) type = "future";
			else type = "past";
			return localeManager.get(localeCode).getRelativeFormat(adu, type);
		}
		module.exports = dateRelative;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/relative.js
	var require_relative = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var dateRelative = require_dateRelative();
		Sugar.Date.defineInstance({ "relative": function(date, localeCode, relativeFn) {
			return dateRelative(date, null, localeCode, relativeFn);
		} });
		module.exports = Sugar.Date.relative;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/relativeTo.js
	var require_relativeTo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var createDate = require_createDate();
		var dateRelative = require_dateRelative();
		Sugar.Date.defineInstance({ "relativeTo": function(date, d, localeCode) {
			return dateRelative(date, createDate(d), localeCode);
		} });
		module.exports = Sugar.Date.relativeTo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/internal/getUnitIndexForParamName.js
	var require_getUnitIndexForParamName = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var iterateOverDateParams = require_iterateOverDateParams();
		function getUnitIndexForParamName(name) {
			var params = {}, unitIndex;
			params[name] = 1;
			iterateOverDateParams(params, function(name, val, unit, i) {
				unitIndex = i;
				return false;
			});
			return unitIndex;
		}
		module.exports = getUnitIndexForParamName;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/reset.js
	var require_reset = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var DateUnitIndexes = require_DateUnitIndexes();
		var moveToBeginningOfUnit = require_moveToBeginningOfUnit();
		var getUnitIndexForParamName = require_getUnitIndexForParamName();
		var DAY_INDEX = DateUnitIndexes.DAY_INDEX;
		Sugar.Date.defineInstance({ "reset": function(date, unit, localeCode) {
			moveToBeginningOfUnit(date, unit ? getUnitIndexForParamName(unit) : DAY_INDEX, localeCode);
			return date;
		} });
		module.exports = Sugar.Date.reset;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/rewind.js
	var require_rewind = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var advanceDateWithArgs = require_advanceDateWithArgs();
		Sugar.Date.defineInstanceWithArguments({ "rewind": function(d, args) {
			return advanceDateWithArgs(d, args, -1);
		} });
		module.exports = Sugar.Date.rewind;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/secondsAgo.js
	var require_secondsAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.secondsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/secondsFromNow.js
	var require_secondsFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.secondsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/secondsSince.js
	var require_secondsSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.secondsSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/secondsUntil.js
	var require_secondsUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.secondsUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/set.js
	var require_set = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var updateDate = require_updateDate();
		var collectUpdateDateArguments = require_collectUpdateDateArguments();
		Sugar.Date.defineInstanceWithArguments({ "set": function(d, args) {
			args = collectUpdateDateArguments(args);
			return updateDate(d, args[0], args[1]);
		} });
		module.exports = Sugar.Date.set;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/setISOWeek.js
	var require_setISOWeek = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var setISOWeekNumber = require_setISOWeekNumber();
		Sugar.Date.defineInstance({ "setISOWeek": function(date, num) {
			return setISOWeekNumber(date, num);
		} });
		module.exports = Sugar.Date.setISOWeek;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/setUTC.js
	var require_setUTC = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var _utc = require__utc();
		Sugar.Date.defineInstance({ "setUTC": function(date, on) {
			return _utc(date, on);
		} });
		module.exports = Sugar.Date.setUTC;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/setWeekday.js
	var require_setWeekday = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var setWeekday = require_setWeekday$1();
		Sugar.Date.defineInstance({ "setWeekday": function(date, dow) {
			return setWeekday(date, dow);
		} });
		module.exports = Sugar.Date.setWeekday;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/weeksAgo.js
	var require_weeksAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.weeksAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/weeksFromNow.js
	var require_weeksFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.weeksFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/weeksSince.js
	var require_weeksSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.weeksSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/weeksUntil.js
	var require_weeksUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.weeksUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/yearsAgo.js
	var require_yearsAgo = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.yearsAgo;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/yearsFromNow.js
	var require_yearsFromNow = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.yearsFromNow;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/yearsSince.js
	var require_yearsSince = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.yearsSince;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/yearsUntil.js
	var require_yearsUntil = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require_buildDateUnitMethodsCall();
		module.exports = Sugar.Date.yearsUntil;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/getOption.js
	var require_getOption = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require__dateOptions();
		module.exports = Sugar.Date.getOption;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/setOption.js
	var require_setOption = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		require__dateOptions();
		module.exports = Sugar.Date.setOption;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/index.js
	var require_date = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		require_addLocale();
		require_create();
		require_getAllLocaleCodes();
		require_getAllLocales();
		require_getLocale();
		require_removeLocale();
		require_setLocale();
		require_day();
		require_dayAfter();
		require_dayAgo();
		require_dayBefore();
		require_dayFromNow();
		require_days$1();
		require_daysAfter();
		require_daysAgo$1();
		require_daysBefore();
		require_daysFromNow$1();
		require_duration();
		require_hour();
		require_hourAfter();
		require_hourAgo();
		require_hourBefore();
		require_hourFromNow();
		require_hours$1();
		require_hoursAfter();
		require_hoursAgo$1();
		require_hoursBefore();
		require_hoursFromNow$1();
		require_millisecond();
		require_millisecondAfter();
		require_millisecondAgo();
		require_millisecondBefore();
		require_millisecondFromNow();
		require_milliseconds$1();
		require_millisecondsAfter();
		require_millisecondsAgo$1();
		require_millisecondsBefore();
		require_millisecondsFromNow$1();
		require_minute();
		require_minuteAfter();
		require_minuteAgo();
		require_minuteBefore();
		require_minuteFromNow();
		require_minutes$1();
		require_minutesAfter();
		require_minutesAgo$1();
		require_minutesBefore();
		require_minutesFromNow$1();
		require_month();
		require_monthAfter();
		require_monthAgo();
		require_monthBefore();
		require_monthFromNow();
		require_months$1();
		require_monthsAfter();
		require_monthsAgo$1();
		require_monthsBefore();
		require_monthsFromNow$1();
		require_second();
		require_secondAfter();
		require_secondAgo();
		require_secondBefore();
		require_secondFromNow();
		require_seconds$1();
		require_secondsAfter();
		require_secondsAgo$1();
		require_secondsBefore();
		require_secondsFromNow$1();
		require_week();
		require_weekAfter();
		require_weekAgo();
		require_weekBefore();
		require_weekFromNow();
		require_weeks$1();
		require_weeksAfter();
		require_weeksAgo$1();
		require_weeksBefore();
		require_weeksFromNow$1();
		require_year();
		require_yearAfter();
		require_yearAgo();
		require_yearBefore();
		require_yearFromNow();
		require_years$1();
		require_yearsAfter();
		require_yearsAgo$1();
		require_yearsBefore();
		require_yearsFromNow$1();
		require_addDays();
		require_addHours();
		require_addMilliseconds();
		require_addMinutes();
		require_addMonths();
		require_addSeconds();
		require_addWeeks();
		require_addYears();
		require_advance();
		require_beginningOfDay();
		require_beginningOfISOWeek();
		require_beginningOfMonth();
		require_beginningOfWeek();
		require_beginningOfYear();
		require_clone$1();
		require_daysAgo();
		require_daysFromNow();
		require_daysInMonth();
		require_daysSince();
		require_daysUntil();
		require_endOfDay();
		require_endOfISOWeek();
		require_endOfMonth();
		require_endOfWeek();
		require_endOfYear();
		require_format();
		require_get();
		require_getISOWeek();
		require_getUTCOffset();
		require_getUTCWeekday();
		require_getWeekday();
		require_hoursAgo();
		require_hoursFromNow();
		require_hoursSince();
		require_hoursUntil();
		require_is();
		require_isAfter();
		require_isBefore();
		require_isBetween();
		require_isFriday();
		require_isFuture();
		require_isLastMonth();
		require_isLastWeek();
		require_isLastYear();
		require_isLeapYear();
		require_isMonday();
		require_isNextMonth();
		require_isNextWeek();
		require_isNextYear();
		require_isPast();
		require_isSaturday();
		require_isSunday();
		require_isThisMonth();
		require_isThisWeek();
		require_isThisYear();
		require_isThursday();
		require_isToday();
		require_isTomorrow();
		require_isTuesday();
		require_isUTC();
		require_isValid$1();
		require_isWednesday();
		require_isWeekday();
		require_isWeekend();
		require_isYesterday();
		require_iso();
		require_millisecondsAgo();
		require_millisecondsFromNow();
		require_millisecondsSince();
		require_millisecondsUntil();
		require_minutesAgo();
		require_minutesFromNow();
		require_minutesSince();
		require_minutesUntil();
		require_monthsAgo();
		require_monthsFromNow();
		require_monthsSince();
		require_monthsUntil();
		require_relative();
		require_relativeTo();
		require_reset();
		require_rewind();
		require_secondsAgo();
		require_secondsFromNow();
		require_secondsSince();
		require_secondsUntil();
		require_set();
		require_setISOWeek();
		require_setUTC();
		require_setWeekday();
		require_weeksAgo();
		require_weeksFromNow();
		require_weeksSince();
		require_weeksUntil();
		require_yearsAgo();
		require_yearsFromNow();
		require_yearsSince();
		require_yearsUntil();
		require_getOption();
		require_setOption();
		module.exports = require_sugar_core();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/getRangeMemberPrimitiveValue.js
	var require_getRangeMemberPrimitiveValue = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isDate = require_classChecks().isDate;
		function getRangeMemberPrimitiveValue(m) {
			if (m == null) return m;
			return isDate(m) ? m.getTime() : m.valueOf();
		}
		module.exports = getRangeMemberPrimitiveValue;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/cloneRangeMember.js
	var require_cloneRangeMember = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var classChecks = require_classChecks();
		var getRangeMemberPrimitiveValue = require_getRangeMemberPrimitiveValue();
		var isDate = classChecks.isDate;
		function cloneRangeMember(m) {
			if (isDate(m)) return new Date(m.getTime());
			else return getRangeMemberPrimitiveValue(m);
		}
		module.exports = cloneRangeMember;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/Range.js
	var require_Range = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var cloneRangeMember = require_cloneRangeMember();
		function Range(start, end) {
			this.start = cloneRangeMember(start);
			this.end = cloneRangeMember(end);
		}
		module.exports = Range;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/getDateForRange.js
	var require_getDateForRange = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var classChecks = require_classChecks();
		var namespaceAliases = require_namespaceAliases();
		var isDate = classChecks.isDate;
		var sugarDate = namespaceAliases.sugarDate;
		function getDateForRange(d) {
			if (isDate(d)) return d;
			else if (d == null) return /* @__PURE__ */ new Date();
			else if (sugarDate.create) return sugarDate.create(d);
			return new Date(d);
		}
		module.exports = getDateForRange;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/var/DURATION_UNITS.js
	var require_DURATION_UNITS = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = "year|month|week|day|hour|minute|second|millisecond";
	}));
	//#endregion
	//#region node_modules/sugar-date/range/var/FULL_CAPTURED_DURATION.js
	var require_FULL_CAPTURED_DURATION = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = "((?:\\d+)?\\s*(?:" + require_DURATION_UNITS() + "))s?";
	}));
	//#endregion
	//#region node_modules/sugar-date/range/var/DurationTextFormats.js
	var require_DurationTextFormats = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var FULL_CAPTURED_DURATION = require_FULL_CAPTURED_DURATION();
		module.exports = {
			RANGE_REG_FROM_TO: /(?:from)?\s*(.+)\s+(?:to|until)\s+(.+)$/i,
			RANGE_REG_REAR_DURATION: RegExp("(.+)\\s*for\\s*" + FULL_CAPTURED_DURATION, "i"),
			RANGE_REG_FRONT_DURATION: RegExp("(?:for)?\\s*" + FULL_CAPTURED_DURATION + "\\s*(?:starting)?\\s(?:at\\s)?(.+)", "i")
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/range/var/MULTIPLIERS.js
	var require_MULTIPLIERS = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		module.exports = {
			"Hours": 36e5,
			"Minutes": 6e4,
			"Seconds": 1e3,
			"Milliseconds": 1
		};
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/incrementDate.js
	var require_incrementDate = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var MULTIPLIERS = require_MULTIPLIERS();
		var callDateSet = require_callDateSet();
		var callDateGet = require_callDateGet();
		function incrementDate(src, amount, unit) {
			var mult = MULTIPLIERS[unit], d;
			if (mult) d = new Date(src.getTime() + amount * mult);
			else {
				d = new Date(src);
				callDateSet(d, unit, callDateGet(src, unit) + amount);
			}
			return d;
		}
		module.exports = incrementDate;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/var/DURATION_REG.js
	var require_DURATION_REG = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DURATION_UNITS = require_DURATION_UNITS();
		module.exports = RegExp("(\\d+)?\\s*(" + DURATION_UNITS + ")s?", "i");
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/getDateIncrementObject.js
	var require_getDateIncrementObject = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var DURATION_REG = require_DURATION_REG();
		var classChecks = require_classChecks();
		var simpleCapitalize = require_simpleCapitalize();
		var isNumber = classChecks.isNumber;
		function getDateIncrementObject(amt) {
			var match, val, unit;
			if (isNumber(amt)) return [amt, "Milliseconds"];
			match = amt.match(DURATION_REG);
			val = +match[1] || 1;
			unit = simpleCapitalize(match[2].toLowerCase());
			if (unit.match(/hour|minute|second/i)) unit += "s";
			else if (unit === "Year") unit = "FullYear";
			else if (unit === "Week") {
				unit = "Date";
				val *= 7;
			} else if (unit === "Day") unit = "Date";
			return [val, unit];
		}
		module.exports = getDateIncrementObject;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/createDateRangeFromString.js
	var require_createDateRangeFromString = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Range = require_Range();
		var DurationTextFormats = require_DurationTextFormats();
		var incrementDate = require_incrementDate();
		var getDateForRange = require_getDateForRange();
		var namespaceAliases = require_namespaceAliases();
		var getDateIncrementObject = require_getDateIncrementObject();
		var sugarDate = namespaceAliases.sugarDate;
		var RANGE_REG_FROM_TO = DurationTextFormats.RANGE_REG_FROM_TO;
		var RANGE_REG_REAR_DURATION = DurationTextFormats.RANGE_REG_REAR_DURATION;
		var RANGE_REG_FRONT_DURATION = DurationTextFormats.RANGE_REG_FRONT_DURATION;
		function createDateRangeFromString(str) {
			var match, datetime, duration, dio, start, end;
			if (sugarDate.get && (match = str.match(RANGE_REG_FROM_TO))) {
				start = getDateForRange(match[1].replace("from", "at"));
				end = sugarDate.get(start, match[2]);
				return new Range(start, end);
			}
			if (match = str.match(RANGE_REG_FRONT_DURATION)) {
				duration = match[1];
				datetime = match[2];
			}
			if (match = str.match(RANGE_REG_REAR_DURATION)) {
				datetime = match[1];
				duration = match[2];
			}
			if (datetime && duration) {
				start = getDateForRange(datetime);
				dio = getDateIncrementObject(duration);
				end = incrementDate(start, dio[0], dio[1]);
			} else start = str;
			return new Range(getDateForRange(start), getDateForRange(end));
		}
		module.exports = createDateRangeFromString;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/var/DateRangeConstructor.js
	var require_DateRangeConstructor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Range = require_Range();
		var classChecks = require_classChecks();
		var getDateForRange = require_getDateForRange();
		var createDateRangeFromString = require_createDateRangeFromString();
		var isString = classChecks.isString;
		var DateRangeConstructor = function(start, end) {
			if (arguments.length === 1 && isString(start)) return createDateRangeFromString(start);
			return new Range(getDateForRange(start), getDateForRange(end));
		};
		module.exports = DateRangeConstructor;
	}));
	//#endregion
	//#region node_modules/sugar-date/date/range.js
	var require_range$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var Sugar = require_sugar_core();
		var DateRangeConstructor = require_DateRangeConstructor();
		Sugar.Date.defineStatic({ "range": DateRangeConstructor });
		module.exports = Sugar.Date.range;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/rangeClamp.js
	var require_rangeClamp = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var cloneRangeMember = require_cloneRangeMember();
		function rangeClamp(range, obj) {
			var clamped, start = range.start, end = range.end, min = end < start ? end : start, max = start > end ? start : end;
			if (obj < min) clamped = min;
			else if (obj > max) clamped = max;
			else clamped = obj;
			return cloneRangeMember(clamped);
		}
		module.exports = rangeClamp;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/defineOnPrototype.js
	var require_defineOnPrototype = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var forEachProperty = require_coreUtilityAliases().forEachProperty;
		function defineOnPrototype(ctor, methods) {
			var proto = ctor.prototype;
			forEachProperty(methods, function(val, key) {
				proto[key] = val;
			});
		}
		module.exports = defineOnPrototype;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/clamp.js
	var require_clamp = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		var rangeClamp = require_rangeClamp();
		require_defineOnPrototype()(Range, { "clamp": function(el) {
			return rangeClamp(this, el);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/clone.js
	var require_clone = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		require_defineOnPrototype()(Range, { "clone": function() {
			return new Range(this.start, this.end);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/contains.js
	var require_contains = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		require_defineOnPrototype()(Range, { "contains": function(el) {
			if (el == null) return false;
			if (el.start && el.end) return el.start >= this.start && el.start <= this.end && el.end >= this.start && el.end <= this.end;
			else return el >= this.start && el <= this.end;
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/valueIsNotInfinite.js
	var require_valueIsNotInfinite = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		function valueIsNotInfinite(m) {
			return m !== -Infinity && m !== Infinity;
		}
		module.exports = valueIsNotInfinite;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/isValidRangeMember.js
	var require_isValidRangeMember = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var valueIsNotInfinite = require_valueIsNotInfinite();
		var getRangeMemberPrimitiveValue = require_getRangeMemberPrimitiveValue();
		function isValidRangeMember(m) {
			var val = getRangeMemberPrimitiveValue(m);
			return (!!val || val === 0) && valueIsNotInfinite(m);
		}
		module.exports = isValidRangeMember;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/rangeIsValid.js
	var require_rangeIsValid = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isValidRangeMember = require_isValidRangeMember();
		function rangeIsValid(range) {
			return isValidRangeMember(range.start) && isValidRangeMember(range.end) && typeof range.start === typeof range.end;
		}
		module.exports = rangeIsValid;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/incrementNumber.js
	var require_incrementNumber = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var withPrecision = require_withPrecision();
		function incrementNumber(current, amount, precision) {
			return withPrecision(current + amount, precision);
		}
		module.exports = incrementNumber;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/incrementString.js
	var require_incrementString = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var chr = require_chr();
		function incrementString(current, amount) {
			return chr(current.charCodeAt(0) + amount);
		}
		module.exports = incrementString;
	}));
	//#endregion
	//#region node_modules/sugar-date/common/internal/periodSplit.js
	var require_periodSplit = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var HALF_WIDTH_PERIOD = require_CommonChars().HALF_WIDTH_PERIOD;
		function periodSplit(str) {
			return str.split(HALF_WIDTH_PERIOD);
		}
		module.exports = periodSplit;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/getPrecision.js
	var require_getPrecision = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var periodSplit = require_periodSplit();
		function getPrecision(n) {
			var split = periodSplit(n.toString());
			return split[1] ? split[1].length : 0;
		}
		module.exports = getPrecision;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/getGreaterPrecision.js
	var require_getGreaterPrecision = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var mathAliases = require_mathAliases();
		var getPrecision = require_getPrecision();
		var max = mathAliases.max;
		function getGreaterPrecision(n1, n2) {
			return max(getPrecision(n1), getPrecision(n2));
		}
		module.exports = getGreaterPrecision;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/rangeEvery.js
	var require_rangeEvery = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var classChecks = require_classChecks();
		var rangeIsValid = require_rangeIsValid();
		var incrementDate = require_incrementDate();
		var incrementNumber = require_incrementNumber();
		var incrementString = require_incrementString();
		var getGreaterPrecision = require_getGreaterPrecision();
		var getDateIncrementObject = require_getDateIncrementObject();
		var isNumber = classChecks.isNumber;
		var isString = classChecks.isString;
		var isDate = classChecks.isDate;
		var isFunction = classChecks.isFunction;
		function rangeEvery(range, step, countOnly, fn) {
			var increment, precision, dio, unit, start = range.start, end = range.end, inverse = end < start, current = start, index = 0, result = [];
			if (!rangeIsValid(range)) return countOnly ? NaN : [];
			if (isFunction(step)) {
				fn = step;
				step = null;
			}
			step = step || 1;
			if (isNumber(start)) {
				precision = getGreaterPrecision(start, step);
				increment = function() {
					return incrementNumber(current, step, precision);
				};
			} else if (isString(start)) increment = function() {
				return incrementString(current, step);
			};
			else if (isDate(start)) {
				dio = getDateIncrementObject(step);
				step = dio[0];
				unit = dio[1];
				increment = function() {
					return incrementDate(current, step, unit);
				};
			}
			if (inverse && step > 0) step *= -1;
			while (inverse ? current >= end : current <= end) {
				if (!countOnly) result.push(current);
				if (fn) fn(current, index, range);
				current = increment();
				index++;
			}
			return countOnly ? index - 1 : result;
		}
		module.exports = rangeEvery;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/buildDateRangeUnits.js
	var require_buildDateRangeUnits = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var MULTIPLIERS = require_MULTIPLIERS();
		var DURATION_UNITS = require_DURATION_UNITS();
		var Range = require_Range();
		var trunc = require_trunc();
		var forEach = require_forEach();
		var rangeEvery = require_rangeEvery();
		var simpleCapitalize = require_simpleCapitalize();
		var defineOnPrototype = require_defineOnPrototype();
		function buildDateRangeUnits() {
			var methods = {};
			forEach(DURATION_UNITS.split("|"), function(unit, i) {
				var name = unit + "s", mult, fn;
				if (i < 4) fn = function() {
					return rangeEvery(this, unit, true);
				};
				else {
					mult = MULTIPLIERS[simpleCapitalize(name)];
					fn = function() {
						return trunc((this.end - this.start) / mult);
					};
				}
				methods[name] = fn;
			});
			defineOnPrototype(Range, methods);
		}
		module.exports = buildDateRangeUnits;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/build/buildDateRangeUnitsCall.js
	var require_buildDateRangeUnitsCall = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnits()();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/days.js
	var require_days = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/every.js
	var require_every = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		var rangeEvery = require_rangeEvery();
		require_defineOnPrototype()(Range, { "every": function(amount, everyFn) {
			return rangeEvery(this, amount, false, everyFn);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/hours.js
	var require_hours = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/intersect.js
	var require_intersect = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		require_defineOnPrototype()(Range, { "intersect": function(range) {
			if (range.start > this.end || range.end < this.start) return new Range(NaN, NaN);
			return new Range(this.start > range.start ? this.start : range.start, this.end < range.end ? this.end : range.end);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/isValid.js
	var require_isValid = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		var rangeIsValid = require_rangeIsValid();
		require_defineOnPrototype()(Range, { "isValid": function() {
			return rangeIsValid(this);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/milliseconds.js
	var require_milliseconds = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/minutes.js
	var require_minutes = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/months.js
	var require_months = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/seconds.js
	var require_seconds = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/internal/getRangeMemberNumericValue.js
	var require_getRangeMemberNumericValue = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		var isString = require_classChecks().isString;
		function getRangeMemberNumericValue(m) {
			return isString(m) ? m.charCodeAt(0) : m;
		}
		module.exports = getRangeMemberNumericValue;
	}));
	//#endregion
	//#region node_modules/sugar-date/range/span.js
	var require_span = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		var mathAliases = require_mathAliases();
		var rangeIsValid = require_rangeIsValid();
		var defineOnPrototype = require_defineOnPrototype();
		var getRangeMemberNumericValue = require_getRangeMemberNumericValue();
		var abs = mathAliases.abs;
		defineOnPrototype(Range, { "span": function() {
			var n = getRangeMemberNumericValue(this.end) - getRangeMemberNumericValue(this.start);
			return rangeIsValid(this) ? abs(n) + 1 : NaN;
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/toArray.js
	var require_toArray = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		var rangeEvery = require_rangeEvery();
		require_defineOnPrototype()(Range, { "toArray": function() {
			return rangeEvery(this);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/toString.js
	var require_toString = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		var rangeIsValid = require_rangeIsValid();
		require_defineOnPrototype()(Range, { "toString": function() {
			return rangeIsValid(this) ? this.start + ".." + this.end : "Invalid Range";
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/union.js
	var require_union = /* @__PURE__ */ __commonJSMin((() => {
		var Range = require_Range();
		require_defineOnPrototype()(Range, { "union": function(range) {
			return new Range(this.start < range.start ? this.start : range.start, this.end > range.end ? this.end : range.end);
		} });
	}));
	//#endregion
	//#region node_modules/sugar-date/range/weeks.js
	var require_weeks = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/years.js
	var require_years = /* @__PURE__ */ __commonJSMin((() => {
		require_buildDateRangeUnitsCall();
	}));
	//#endregion
	//#region node_modules/sugar-date/range/index.js
	var require_range = /* @__PURE__ */ __commonJSMin(((exports, module) => {
		require_range$1();
		require_clamp();
		require_clone();
		require_contains();
		require_days();
		require_every();
		require_hours();
		require_intersect();
		require_isValid();
		require_milliseconds();
		require_minutes();
		require_months();
		require_seconds();
		require_span();
		require_toArray();
		require_toString();
		require_union();
		require_weeks();
		require_years();
		module.exports = require_sugar_core();
	}));
	//#endregion
	//#region src/sort.js
	var import_sugar_date = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
		require_date();
		require_range();
		module.exports = require_sugar_core();
	})))();
	/** Sorting utilities */
	/**
	* Case insensitive compare function for passed strings
	* @param  {String} First string
	* @param  {String} Second string
	* @return {Number} -1 if first string lower than second one
	*                  0 if first string same order as second one
	*                  1 if first string greater than second one
	*/
	var ignoreCase = (a, b) => {
		let x = a.toLowerCase();
		let y = b.toLowerCase();
		return x < y ? -1 : x > y ? 1 : 0;
	};
	/**
	* Compare function for sorting passed numbers in ascending manner
	* @param {Number} First number
	* @param {Number} Second number
	* @return {Number} Negative, zero or positive number
	*/
	var numSortAsc = (a, b) => a - b;
	/**
	* Compare function for sorting passed numbers in descending manner
	* @param {Number} First number
	* @param {Number} Second number
	* @return {Number} Negative, zero or positive number
	*/
	var numSortDesc = (a, b) => b - a;
	/**
	* Compare function for sorting passed dates in ascending manner according to
	* the corresponding UTC numeric value (returned by getTime)
	* @param {Date} First date object
	* @param {Date} Second date object
	* @return {Number} Negative, zero or positive number
	*/
	var dateSortAsc = (date1, date2) => date1.getTime() - date2.getTime();
	/**
	* Compare function for sorting passed dates in descending manner according to
	* the corresponding UTC numeric value (returned by getTime)
	* @param {Date} First date object
	* @param {Date} Second date object
	* @return {Number} Negative, zero or positive number
	*/
	var dateSortDesc = (date1, date2) => date2.getTime() - date1.getTime();
	/**
	* Curried compare function for sorting passed formatted numbers in desired
	* fashion according to supplied compare function and decimal separator
	* @param {Function} Compare function
	* @param {String} [decimal=','] Decimal separator
	* @return {Function} Compare function receiving parsed numeric arguments
	*/
	var sortNumberStr = (compareFn, decimal = ",") => {
		return (numStr1, numStr2) => {
			return compareFn(parse(numStr1, decimal), parse(numStr2, decimal));
		};
	};
	/**
	* Curried compare function for sorting passed formatted dates in desired
	* fashion according to supplied compare function and locale
	* @param {Function} Compare function
	* @param {String} [locale='en-us'] Locale code
	* @return {Function} Compare function receiving parsed date arguments
	*/
	var sortDateStr = (compareFn, locale = "en-us") => {
		return (dateStr1, dateStr2) => {
			return compareFn(import_sugar_date.Date.create(dateStr1, locale), import_sugar_date.Date.create(dateStr2, locale));
		};
	};
	//#endregion
	//#region src/extensions/colOps/colOps.js
	var EVENTS$1 = [
		"after-filtering",
		"after-page-change",
		"after-page-length-change"
	];
	var SUM = "sum";
	var MEAN = "mean";
	var MIN = "min";
	var MAX = "max";
	var MEDIAN = "median";
	var Q1 = "q1";
	var Q3 = "q3";
	/**
	* Column calculations extension
	*/
	var ColOps = class ColOps extends Feature {
		/**
		* Creates an instance of ColOps
		*
		* @param {TableFilter} tf TableFilter instance
		* @param {Object} opts Configuration object
		*/
		constructor(tf, opts) {
			super(tf, ColOps);
			/**
			* Callback fired before columns operations start
			* @type {Function}
			*/
			this.onBeforeOperation = defaultsFn(opts.on_before_operation, EMPTY_FN);
			/**
			* Callback fired after columns operations are completed
			* @type {Function}
			*/
			this.onAfterOperation = defaultsFn(opts.on_after_operation, EMPTY_FN);
			/**
			* Configuration options
			* @type {Object}
			*/
			this.opts = opts;
			/**
			* List of DOM element IDs containing column's calculation result
			* @type {Array}
			*/
			this.labelIds = defaultsArr(opts.id, []);
			/**
			* List of columns' indexes for calculations
			* @type {Array}
			*/
			this.colIndexes = defaultsArr(opts.col, []);
			/**
			* List of operations - possible values: 'sum', 'mean', 'min', 'max',
			* 'median', 'q1', 'q3'
			* @type {Array}
			*/
			this.operations = defaultsArr(opts.operation, []);
			/**
			* List of write methods used to write the result - possible values:
			* 'innerHTML', 'setValue', 'createTextNode'
			* @type {Array}
			*/
			this.outputTypes = defaultsArr(opts.write_method, []);
			/**
			* List of format objects used for formatting the result - see
			* formatNumberValue in number.js for the supported options
			* @type {Array}
			*/
			this.formatResults = defaultsArr(opts.format_result, []);
			/**
			* List of row indexes displaying the results
			* @type {Array}
			*/
			this.totRowIndexes = defaultsArr(opts.tot_row_index, []);
			/**
			* List of row indexes excluded from calculations
			* @type {Array}
			*/
			this.excludeRows = defaultsArr(opts.exclude_row, []);
			/**
			* List of decimal precision for calculation results
			* @type {Array}
			*/
			this.decimalPrecisions = defaultsArr(opts.decimal_precision, 2);
			this.enable();
		}
		/**
		* Initializes ColOps instance
		*/
		init() {
			if (this.initialized) return;
			this.emitter.on(EVENTS$1, bound(this.calcAll, this));
			this.calcAll();
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Calculates columns' values
		* Configuration options are stored in 'opts' property
		* - 'id' contains ids of elements showing result (array)
		* - 'col' contains the columns' indexes (array)
		* - 'operation' contains operation type (array, values: 'sum', 'mean',
		*   'min', 'max', 'median', 'q1', 'q3')
		* - 'write_method' array defines which method to use for displaying the
		*    result (innerHTML, setValue, createTextNode) - default: 'innerHTML'
		* - 'tot_row_index' defines in which row results are displayed
		*   (integers array)
		*
		* - changes made by Nuovella:
		* (1) optimized the routine (now it will only process each column once),
		* (2) added calculations for the median, lower and upper quartile.
		*/
		calcAll() {
			let tf = this.tf;
			if (!tf.isInitialized()) return;
			this.onBeforeOperation(tf, this);
			this.emitter.emit("before-column-operation", tf, this);
			let { colIndexes, operations: colOperations, outputTypes, totRowIndexes, excludeRows, formatResults, decimalPrecisions } = this;
			let uIndexes = [];
			colIndexes.forEach((val) => {
				if (uIndexes.indexOf(val) === -1) uIndexes.push(val);
			});
			let nbCols = uIndexes.length, rows = tf.dom().rows, colValues = [];
			for (let u = 0; u < nbCols; u++) {
				colValues.push(tf.getVisibleColumnData(uIndexes[u], false, excludeRows));
				let curValues = colValues[u];
				let result = 0, operations = [], precisions = [], labels = [], writeType, formatResult = [], idx = 0;
				for (let k = 0; k < colIndexes.length; k++) {
					if (colIndexes[k] !== uIndexes[u]) continue;
					operations[idx] = (colOperations[k] || "sum").toLowerCase();
					precisions[idx] = decimalPrecisions[k];
					labels[idx] = this.labelIds[k];
					writeType = isArray(outputTypes) ? outputTypes[k] : null;
					formatResult[idx] = this.configureFormat(uIndexes[u], formatResults[k]);
					idx++;
				}
				for (let i = 0; i < idx; i++) {
					this.emitter.emit("before-column-calc", tf, this, uIndexes[u], curValues, operations[i], precisions[i]);
					result = Number(this.calc(curValues, operations[i], null));
					this.emitter.emit("column-calc", tf, this, uIndexes[u], result, operations[i], precisions[i]);
					this.writeResult(result, labels[i], writeType, precisions[i], formatResult[i]);
				}
				let totRow = totRowIndexes && totRowIndexes[u] ? rows[totRowIndexes[u]] : null;
				if (totRow) totRow.style.display = "";
			}
			this.onAfterOperation(tf, this);
			this.emitter.emit("after-column-operation", tf, this);
		}
		/**
		* Make desired calculation on specified column.
		* @param {Number} colIndex Column index
		* @param {String} [operation=SUM] Operation type
		* @param {Number} precision Decimal precision
		* @returns {Number}
		*/
		columnCalc(colIndex, operation = SUM, precision) {
			let excludeRows = this.excludeRows || [];
			let colValues = tf.getVisibleColumnData(colIndex, false, excludeRows);
			return Number(this.calc(colValues, operation, precision));
		}
		/**
		* Make calculation on passed values.
		* @param {Array} values List of values
		* @param {String} [operation=SUM] Optional operation type
		* @param {Number} precision Optional result precision
		* @returns {Number}
		* @private
		*/
		calc(colValues, operation = SUM, precision) {
			let result = 0;
			if (operation === Q1 || operation === Q3 || operation === MEDIAN) colValues = this.sortColumnValues(colValues, numSortAsc);
			switch (operation) {
				case MEAN:
					result = this.calcMean(colValues);
					break;
				case SUM:
					result = this.calcSum(colValues);
					break;
				case MIN:
					result = this.calcMin(colValues);
					break;
				case MAX:
					result = this.calcMax(colValues);
					break;
				case MEDIAN:
					result = this.calcMedian(colValues);
					break;
				case Q1:
					result = this.calcQ1(colValues);
					break;
				case Q3: result = this.calcQ3(colValues);
			}
			return isEmpty(precision) ? result : result.toFixed(precision);
		}
		/**
		* Calculate the sum of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcSum(values = []) {
			if (isEmpty(values)) return 0;
			return values.reduce((x, y) => Number(x) + Number(y));
		}
		/**
		* Calculate the mean of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcMean(values = []) {
			let result = this.calcSum(values) / values.length;
			return Number(result);
		}
		/**
		* Calculate the max value of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcMax(values = []) {
			return Math.max.apply(null, values);
		}
		/**
		* Calculate the min value of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcMin(values = []) {
			return Math.min.apply(null, values);
		}
		/**
		* Calculate the median of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcMedian(values = []) {
			let nbValues = values.length;
			let aux = 0;
			if (nbValues % 2 === 1) {
				aux = Math.floor(nbValues / 2);
				return Number(values[aux]);
			}
			return (Number(values[nbValues / 2]) + Number(values[nbValues / 2 - 1])) / 2;
		}
		/**
		* Calculate the lower quartile of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcQ1(values = []) {
			let nbValues = values.length;
			let posa = 0;
			posa = Math.floor(nbValues / 4);
			if (4 * posa === nbValues) return (Number(values[posa - 1]) + Number(values[posa])) / 2;
			return Number(values[posa]);
		}
		/**
		* Calculate the upper quartile of passed values.
		* @param {Array} [values=[]] List of values
		* @returns {Number}
		*/
		calcQ3(values = []) {
			let nbValues = values.length;
			let posa = 0;
			let posb = 0;
			posa = Math.floor(nbValues / 4);
			if (4 * posa === nbValues) {
				posb = 3 * posa;
				return (Number(values[posb]) + Number(values[posb - 1])) / 2;
			}
			return Number(values[nbValues - posa - 1]);
		}
		/**
		* Sort passed values with supplied sorter function.
		* @param {Array} [values=[]] List of values to be sorted
		* @param {Function} sorter Sorter function
		* @returns {Array}
		*/
		sortColumnValues(values = [], sorter) {
			return values.sort(sorter);
		}
		/**
		* Write calculation result in passed DOM element with supplied write method
		* and decimal precision.
		* @param {Number} [result=0] Calculation result
		* @param {DOMElement} label DOM element
		* @param {String} [writeType='innerhtml'] Write method
		* @param {Number} [precision=2] Applied decimal precision
		* @private
		*/
		writeResult(result = 0, label, writeType = "innerhtml", precision = 2, format = {}) {
			let labelElm = elm(label);
			if (!labelElm) return;
			result = formatNumberValue(result.toFixed(precision), format);
			switch (writeType.toLowerCase()) {
				case "innerhtml":
					labelElm.innerHTML = result;
					break;
				case "setvalue":
					labelElm.value = result;
					break;
				case "createtextnode":
					let oldNode = labelElm.firstChild;
					let txtNode = createText(result);
					labelElm.replaceChild(txtNode, oldNode);
			}
		}
		/**
		* Configure the format options used to format the operation result based
		* on column type.
		* @param {Number} colIndex Column index
		* @param {Object} [format={}] Format object
		* @returns {Object}
		* @private
		*/
		configureFormat(colIndex, format = {}) {
			let tf = this.tf;
			if (tf.hasType(colIndex, ["formatted-number"])) {
				let colType = tf.colTypes[colIndex];
				if (colType.decimal && !format.decimal) format.decimal = colType.decimal;
				if (colType.thousands && !format.integerSeparator) format.integerSeparator = colType.thousands;
			} else {
				format.decimal = format.decimal || "";
				format.integerSeparator = format.integerSeparator || "";
			}
			return format;
		}
		/** Remove extension */
		destroy() {
			if (!this.initialized) return;
			this.emitter.off(EVENTS$1, bound(this.calcAll, this));
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/extensions/advancedGrid/adapterEzEditTable.js
	var INSTANTIATION_ERROR = `Failed to instantiate EditTable object.
    \n"ezEditTable" dependency not found.`;
	/**
	* Adapter module for ezEditTable, an external library providing advanced
	* grid features (selection and edition):
	* http://codecanyon.net/item/ezedittable-enhance-html-tables/2425123?ref=koalyptus
	*/
	var AdapterEzEditTable = class AdapterEzEditTable extends Feature {
		/**
		* Creates an instance of AdapterEzEditTable
		*
		* @param {TableFilter} tf TableFilter instance
		* @param {Object} cfg Configuration options for ezEditTable library
		*/
		constructor(tf, cfg) {
			super(tf, AdapterEzEditTable);
			/**
			* Module description
			* @type {String}
			*/
			this.desc = defaultsStr(cfg.description, "ezEditTable adapter");
			/**
			* Filename of ezEditTable library
			* @type {String}
			*/
			this.filename = defaultsStr(cfg.filename, "ezEditTable.js");
			/**
			* Path to ezEditTable library
			* @type {String}
			*/
			this.vendorPath = cfg.vendor_path;
			/**
			* Load ezEditTable stylesheet
			* @type {Boolean}
			*/
			this.loadStylesheet = Boolean(cfg.load_stylesheet);
			/**
			* Path to ezEditTable stylesheet
			* @type {String}
			*/
			this.stylesheet = defaultsStr(cfg.stylesheet, this.vendorPath + "ezEditTable.css");
			/**
			* Name of ezEditTable stylesheet
			* @type {String}
			*/
			this.stylesheetName = defaultsStr(cfg.stylesheet_name, "ezEditTableCss");
			cfg.scroll_into_view = cfg.scroll_into_view === false ? false : tf.gridLayout;
			/**
			* ezEditTable instance
			* @type {EditTable}
			* @private
			*/
			this._ezEditTable = null;
			/**
			* ezEditTable configuration
			* @private
			*/
			this.cfg = cfg;
			this.enable();
		}
		/**
		* Conditionally load ezEditTable library and set advanced grid
		*/
		init() {
			if (this.initialized) return;
			let tf = this.tf;
			if (root.EditTable) this._setAdvancedGrid();
			else {
				let path = this.vendorPath + this.filename;
				tf.import(this.filename, path, () => this._setAdvancedGrid());
			}
			if (this.loadStylesheet && !tf.isImported(this.stylesheet, "link")) tf.import(this.stylesheetName, this.stylesheet, null, "link");
			this.emitter.on(["filter-focus", "filter-blur"], () => this._toggleForInputFilter());
			/**
			* @inherited
			*/
			this.initialized = true;
		}
		/**
		* Instantiate ezEditTable component for advanced grid features
		* @private
		*/
		_setAdvancedGrid() {
			let tf = this.tf;
			let startRow, cfg = this.cfg;
			if (tag(tf.dom(), "thead").length > 0 && !cfg.startRow) startRow = void 0;
			else startRow = cfg.startRow || tf.refRow;
			cfg.base_path = cfg.base_path || tf.basePath + "ezEditTable/";
			let editable = cfg.editable;
			let selectable = cfg.selection;
			if (selectable) cfg.default_selection = cfg.default_selection || "row";
			cfg.active_cell_css = cfg.active_cell_css || "ezETSelectedCell";
			let _lastValidRowIndex = 0;
			let _lastRowIndex = 0;
			if (selectable) {
				let onAfterSelection = function(et, selectedElm, e) {
					let slc = et.Selection;
					let doSelect = function(nextRowIndex) {
						if (et.defaultSelection === "row") slc.SelectRowByIndex(nextRowIndex);
						else {
							et.ClearSelections();
							let cellIndex = selectedElm.cellIndex, row = tf.dom().rows[nextRowIndex];
							if (et.defaultSelection === "both") slc.SelectRowByIndex(nextRowIndex);
							if (row) slc.SelectCell(row.cells[cellIndex]);
						}
						if (tf.validRowsIndex.length !== tf.getRowsNb()) {
							let r = tf.dom().rows[nextRowIndex];
							if (r) r.scrollIntoView(false);
							if (cell) {
								if (cell.cellIndex === tf.getCellsNb() - 1 && tf.gridLayout) tf.tblCont.scrollLeft = 1e8;
								else if (cell.cellIndex === 0 && tf.gridLayout) tf.tblCont.scrollLeft = 0;
								else cell.scrollIntoView(false);
							}
						}
					};
					if (!tf.validRowsIndex) return;
					let validIndexes = tf.validRowsIndex, validIdxLen = validIndexes.length, row = et.defaultSelection !== "row" ? selectedElm.parentNode : selectedElm, cell = selectedElm.nodeName === "TD" ? selectedElm : null, keyCode = e !== void 0 ? et.Event.GetKey(e) : 0, isRowValid = validIndexes.indexOf(row.rowIndex) !== -1, nextRowIndex, paging = tf.feature("paging"), d = keyCode === 34 || keyCode === 33 ? paging && paging.pageLength || et.nbRowsPerPage : 1;
					if (!isRowValid) {
						if (row.rowIndex > _lastRowIndex) {
							if (row.rowIndex >= validIndexes[validIdxLen - 1]) nextRowIndex = validIndexes[validIdxLen - 1];
							else {
								let calcRowIndex = _lastValidRowIndex + d;
								if (calcRowIndex > validIdxLen - 1) nextRowIndex = validIndexes[validIdxLen - 1];
								else nextRowIndex = validIndexes[calcRowIndex];
							}
						} else if (row.rowIndex <= validIndexes[0]) nextRowIndex = validIndexes[0];
						else {
							let v = validIndexes[_lastValidRowIndex - d];
							nextRowIndex = v ? v : validIndexes[0];
						}
						_lastRowIndex = row.rowIndex;
						doSelect(nextRowIndex);
					} else if (keyCode !== 34 && keyCode !== 33) {
						_lastValidRowIndex = validIndexes.indexOf(row.rowIndex);
						_lastRowIndex = row.rowIndex;
					} else {
						if (keyCode === 34) {
							if (_lastValidRowIndex + d <= validIdxLen - 1) nextRowIndex = validIndexes[_lastValidRowIndex + d];
							else nextRowIndex = [validIdxLen - 1];
						} else if (_lastValidRowIndex - d <= validIndexes[0]) nextRowIndex = validIndexes[0];
						else nextRowIndex = validIndexes[_lastValidRowIndex - d];
						_lastRowIndex = nextRowIndex;
						_lastValidRowIndex = validIndexes.indexOf(nextRowIndex);
						doSelect(nextRowIndex);
					}
				};
				let onBeforeSelection = function(et, selectedElm) {
					let row = et.defaultSelection !== "row" ? selectedElm.parentNode : selectedElm;
					if (tf.paging) {
						if (tf.feature("paging").nbPages > 1) {
							let paging = tf.feature("paging");
							et.nbRowsPerPage = paging.pageLength;
							let validIndexes = tf.validRowsIndex, validIdxLen = validIndexes.length, pagingEndRow = parseInt(paging.startPagingRow, 10) + parseInt(paging.pageLength, 10);
							let rowIndex = row.rowIndex;
							if (rowIndex === validIndexes[validIdxLen - 1] && paging.currentPageNb !== paging.nbPages) paging.setPage("last");
							else if (rowIndex === validIndexes[0] && paging.currentPageNb !== 1) paging.setPage("first");
							else if (rowIndex > validIndexes[pagingEndRow - 1] && rowIndex < validIndexes[validIdxLen - 1]) paging.setPage("next");
							else if (rowIndex < validIndexes[paging.startPagingRow] && rowIndex > validIndexes[0]) paging.setPage("previous");
						}
					}
				};
				if (tf.paging) tf.feature("paging").onAfterChangePage = function(paging) {
					let slc = paging.tf.extension("advancedGrid")._ezEditTable.Selection;
					let row = slc.GetActiveRow();
					if (row) row.scrollIntoView(false);
					let cell = slc.GetActiveCell();
					if (cell) cell.scrollIntoView(false);
				};
				if (cfg.default_selection === "row") {
					let fnB = cfg.on_before_selected_row;
					cfg.on_before_selected_row = function() {
						var args = arguments;
						onBeforeSelection(args[0], args[1], args[2]);
						if (fnB) fnB.call(null, args[0], args[1], args[2]);
					};
					let fnA = cfg.on_after_selected_row;
					cfg.on_after_selected_row = function() {
						var args = arguments;
						onAfterSelection(args[0], args[1], args[2]);
						if (fnA) fnA.call(null, args[0], args[1], args[2]);
					};
				} else {
					let fnD = cfg.on_before_selected_cell;
					cfg.on_before_selected_cell = function() {
						var args = arguments;
						onBeforeSelection(args[0], args[1], args[2]);
						if (fnD) fnD.call(null, args[0], args[1], args[2]);
					};
					let fnC = cfg.on_after_selected_cell;
					cfg.on_after_selected_cell = function() {
						var args = arguments;
						onAfterSelection(args[0], args[1], args[2]);
						if (fnC) fnC.call(null, args[0], args[1], args[2]);
					};
				}
			}
			if (editable) {
				let fnE = cfg.on_added_dom_row;
				cfg.on_added_dom_row = function() {
					var args = arguments;
					tf.nbFilterableRows++;
					if (!tf.paging) tf.emitter.emit("rows-changed", tf, this);
					else {
						tf.nbFilterableRows++;
						tf.paging = false;
						tf.feature("paging").destroy();
						tf.feature("paging").reset();
					}
					if (tf.alternateRows) tf.feature("alternateRows").init();
					if (fnE) fnE.call(null, args[0], args[1], args[2]);
				};
				if (cfg.actions && cfg.actions["delete"]) {
					let fnF = cfg.actions["delete"].on_after_submit;
					cfg.actions["delete"].on_after_submit = function() {
						var args = arguments;
						tf.nbFilterableRows--;
						if (!tf.paging) tf.emitter.emit("rows-changed", tf, this);
						else {
							tf.nbFilterableRows--;
							tf.paging = false;
							tf.feature("paging").destroy();
							tf.feature("paging").reset(false);
						}
						if (tf.alternateRows) tf.feature("alternateRows").init();
						if (fnF) fnF.call(null, args[0], args[1]);
					};
				}
			}
			try {
				this._ezEditTable = new EditTable(tf.id, cfg, startRow);
				this._ezEditTable.Init();
			} catch (e) {
				throw new Error(INSTANTIATION_ERROR);
			}
			this.initialized = true;
		}
		/**
		* Reset advanced grid when previously removed
		*/
		reset() {
			let ezEditTable = this._ezEditTable;
			if (ezEditTable) {
				if (this.cfg.selection) ezEditTable.Selection.Set();
				if (this.cfg.editable) ezEditTable.Editable.Set();
			}
		}
		/**
		* Toggle behaviour
		*/
		toggle() {
			let ezEditTable = this._ezEditTable;
			if (ezEditTable.editable) ezEditTable.Editable.Remove();
			else ezEditTable.Editable.Set();
			if (ezEditTable.selection) ezEditTable.Selection.Remove();
			else ezEditTable.Selection.Set();
		}
		_toggleForInputFilter() {
			let tf = this.tf;
			if (!tf.getActiveFilterId()) return;
			let colIndex = tf.getColumnIndexFromFilterId(tf.getActiveFilterId());
			if (tf.getFilterType(colIndex) === "input") this.toggle();
		}
		/**
		* Remove advanced grid
		*/
		destroy() {
			if (!this.initialized) return;
			let ezEditTable = this._ezEditTable;
			if (ezEditTable) {
				if (this.cfg.selection) {
					ezEditTable.Selection.ClearSelections();
					ezEditTable.Selection.Remove();
				}
				if (this.cfg.editable) ezEditTable.Editable.Remove();
			}
			this.emitter.off(["filter-focus", "filter-blur"], () => this._toggleForInputFilter());
			this.initialized = false;
		}
	};
	AdapterEzEditTable.meta = { altName: "advancedGrid" };
	//#endregion
	//#region src/extensions/advancedGrid/advancedGrid.js
	var advancedGrid_default = AdapterEzEditTable;
	//#endregion
	//#region src/extensions/filtersVisibility/filtersVisibility.js
	/**
	* Filters Visibility extension
	*/
	var FiltersVisibility = class FiltersVisibility extends Feature {
		/**
		* Creates an instance of FiltersVisibility
		* @param {TableFilter} tf TableFilter instance
		* @param {Object} Configuration object
		*/
		constructor(tf, f) {
			super(tf, FiltersVisibility);
			/**
			* Module name
			* @type {String}
			*/
			this.name = f.name;
			/**
			* Module description
			* @type {String}
			*/
			this.desc = defaultsStr(f.description, "Filters row visibility manager");
			/**
			* Extension's stylesheet filename
			* @type {String}
			*/
			this.stylesheet = defaultsStr(f.stylesheet, "filtersVisibility.css");
			/**
			* Expand icon filename
			* @type {String}
			*/
			this.icnExpand = defaultsStr(f.expand_icon_name, "icn_exp.png");
			/**
			* Collapse icon filename
			* @type {String}
			*/
			this.icnCollapse = defaultsStr(f.collapse_icon_name, "icn_clp.png");
			/**
			* Main container element
			* @private
			*/
			this.contEl = null;
			/**
			* Button element
			* @private
			*/
			this.btnEl = null;
			/**
			* Expand icon HTML
			* @private
			*/
			this.icnExpandHtml = "<img src=\"" + tf.themesPath + this.icnExpand + "\" alt=\"Expand filters\" >";
			/**
			* Collapse icon HTML
			* @private
			*/
			this.icnCollapseHtml = "<img src=\"" + tf.themesPath + this.icnCollapse + "\" alt=\"Collapse filters\" >";
			/**
			* Default text
			* @private
			*/
			this.defaultText = "Toggle filters";
			/**
			* ID of main container element
			* @type {String}
			*/
			this.targetId = f.target_id || null;
			/**
			* Enable expand/collapse icon, defaults to true
			* @type {Boolean}
			*/
			this.enableIcon = defaultsBool(f.enable_icon, true);
			/**
			* Custom text for button
			* @type {String}
			*/
			this.btnText = defaultsStr(f.btn_text, "");
			/**
			* Collapse button HTML
			* @private
			*/
			this.collapseBtnHtml = this.enableIcon ? this.icnCollapseHtml + this.btnText : this.btnText || this.defaultText;
			/**
			* Expand button HTML
			* @private
			*/
			this.expandBtnHtml = this.enableIcon ? this.icnExpandHtml + this.btnText : this.btnText || this.defaultText;
			/**
			* Button's custom HTML
			* @type {String}
			*/
			this.btnHtml = defaultsStr(f.btn_html, null);
			/**
			* Css class for expand/collapse filters button
			* @type {String}
			*/
			this.btnCssClass = defaultsStr(f.btn_css_class, "btnExpClpFlt");
			/**
			* Css class for main container
			* @type {String}
			*/
			this.contCssClass = defaultsStr(f.cont_css_class, "expClpFlt");
			/**
			* Filters row index
			* @type {Number}
			*/
			this.filtersRowIndex = defaultsNb(f.filters_row_index, tf.getFiltersRowIndex());
			/**
			* Make filters visible at initialization, defaults to true
			* @type {Boolean}
			*/
			this.visibleAtStart = defaultsNb(f.visible_at_start, true);
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, RIGHT);
			/**
			* Callback fired before filters row is shown
			* @type {Function}
			*/
			this.onBeforeShow = defaultsFn(f.on_before_show, EMPTY_FN);
			/**
			* Callback fired after filters row is shown
			* @type {Function}
			*/
			this.onAfterShow = defaultsFn(f.on_after_show, EMPTY_FN);
			/**
			* Callback fired before filters row is hidden
			* @type {Function}
			*/
			this.onBeforeHide = defaultsFn(f.on_before_hide, EMPTY_FN);
			/**
			* Callback fired after filters row is hidden
			* @type {Function}
			*/
			this.onAfterHide = defaultsFn(f.on_after_hide, EMPTY_FN);
			tf.import(f.name + "Style", tf.getStylePath() + this.stylesheet, null, "link");
			this.enable();
		}
		/**
		* Initialise extension
		*/
		init() {
			if (this.initialized) return;
			this.emitter.emit("initializing-extension", this, !isNull(this.targetId));
			this.buildUI();
			/** @inherited */
			this.initialized = true;
			this.emitter.on(["show-filters"], (tf, visible) => this.show(visible));
			this.emitter.emit("filters-visibility-initialized", this.tf, this);
			this.emitter.emit("extension-initialized", this);
		}
		/**
		* Build UI elements
		*/
		buildUI() {
			let tf = this.tf;
			let span = createElm("span");
			span.className = this.contCssClass;
			let targetEl = !this.targetId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.targetId);
			if (!this.targetId) {
				let firstChild = targetEl.firstChild;
				firstChild.parentNode.insertBefore(span, firstChild);
			} else targetEl.appendChild(span);
			let btn;
			if (!this.btnHtml) {
				btn = createElm("a", ["href", "javascript:void(0);"]);
				btn.className = this.btnCssClass;
				btn.title = this.btnText || this.defaultText;
				btn.innerHTML = this.collapseBtnHtml;
				span.appendChild(btn);
			} else {
				span.innerHTML = this.btnHtml;
				btn = span.firstChild;
			}
			addEvt(btn, "click", () => this.toggle());
			this.contEl = span;
			this.btnEl = btn;
			if (!this.visibleAtStart) this.toggle();
		}
		/**
		* Toggle filters visibility
		*/
		toggle() {
			let tf = this.tf;
			let isDisplayed = (tf.gridLayout ? tf.feature("gridLayout").headTbl : tf.dom()).rows[this.filtersRowIndex].style.display === "";
			this.show(!isDisplayed);
		}
		/**
		* Show or hide filters
		*
		* @param {boolean} [visible=true] Visibility flag
		*/
		show(visible = true) {
			let tf = this.tf;
			let fltRow = (tf.gridLayout ? tf.feature("gridLayout").headTbl : tf.dom()).rows[this.filtersRowIndex];
			if (visible) this.onBeforeShow(this);
			if (!visible) this.onBeforeHide(this);
			fltRow.style.display = visible ? "" : "none";
			if (this.enableIcon && !this.btnHtml) this.btnEl.innerHTML = visible ? this.collapseBtnHtml : this.expandBtnHtml;
			if (visible) this.onAfterShow(this);
			if (!visible) this.onAfterHide(this);
			this.emitter.emit("filters-toggled", tf, this, visible);
		}
		/**
		* Destroy the UI
		*/
		destroy() {
			if (!this.initialized) return;
			this.emitter.off(["show-filters"], (tf, visible) => this.show(visible));
			this.btnEl.innerHTML = "";
			removeElm(this.btnEl);
			this.btnEl = null;
			this.contEl.innerHTML = "";
			removeElm(this.contEl);
			this.contEl = null;
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/emitter.js
	/**
	* Event emitter class
	*/
	var Emitter = class {
		/**
		* Creates an instance of Emitter.
		*/
		constructor() {
			/**
			* Events object
			* @type {Object}
			*/
			this.events = {};
		}
		/**
		* Subscribe to an event
		* @param  {Array}   evts Collection of event names
		* @param  {Function} fn  Function invoked when event is emitted
		*/
		on(evts, fn) {
			evts.forEach((evt) => {
				this.events[evt] = this.events[evt] || [];
				this.events[evt].push(fn);
			});
		}
		/**
		* Unsubscribe to an event
		* @param  {Array}   evts Collection of event names
		* @param  {Function} fn  Function invoked when event is emitted
		*/
		off(evts, fn) {
			evts.forEach((evt) => {
				if (evt in this.events) this.events[evt].splice(this.events[evt].indexOf(fn), 1);
			});
		}
		/**
		* Emit an event
		* @param  {String} evt Event name followed by any other argument passed to
		* the invoked function
		*/
		emit(evt) {
			if (evt in this.events) for (let i = 0; i < this.events[evt].length; i++) this.events[evt][i].apply(this, [].slice.call(arguments, 1));
		}
	};
	//#endregion
	//#region src/modules/baseDropdown.js
	/**
	* Base class for Dropdown and CheckList UI components
	* @export
	* @class BaseDropdown
	* @extends {Feature}
	*/
	var BaseDropdown = class extends Feature {
		/**
		* Creates an instance of BaseDropdown
		* @param {TableFilter} tf
		*/
		constructor(tf, cls) {
			super(tf, cls);
			let f = this.config;
			/**
			* Filter options custom sorter on a column basis
			* @type {Object}
			*/
			this.customSorter = isObj(f.filter_options_sorter) && isArray(f.filter_options_sorter.col) && isArray(f.filter_options_sorter.comparer) ? f.filter_options_sorter : null;
			/**
			* Has custom options
			* @type {Boolean}
			* @private
			*/
			this.isCustom = false;
			/**
			* List of options values
			* @type {Array}
			* @private
			*/
			this.opts = [];
			/**
			* List of options texts for custom values
			* @type {Array}
			* @private
			*/
			this.optsTxt = [];
			/**
			* List of options to be excluded from the checklist filter
			* @type {Array}
			* @private
			*/
			this.excludedOpts = [];
		}
		/**
		* Sort passed options based on the type of the specified column
		* @param {Number} colIndex Column index
		* @param {Array} [options=[]] Collection of values
		* @return {Array} Sorted values
		* @private
		*/
		sortOptions(colIndex, options = []) {
			let { tf } = this;
			if (tf.isCustomOptions(colIndex) || !tf.sortSlc || isArray(tf.sortSlc) && tf.sortSlc.indexOf(colIndex) === -1) return options;
			let { caseSensitive, sortFilterOptionsDesc } = tf;
			let isSortDesc = sortFilterOptionsDesc.indexOf(colIndex) !== -1;
			let compareFn;
			if (this.customSorter && this.customSorter.col.indexOf(colIndex) !== -1) {
				var idx = this.customSorter.col.indexOf(colIndex);
				compareFn = this.customSorter.comparer[idx];
			} else if (tf.hasType(colIndex, ["number", "formatted-number"])) {
				let decimal = tf.getDecimal(colIndex);
				compareFn = sortNumberStr(isSortDesc ? numSortDesc : numSortAsc, decimal);
			} else if (tf.hasType(colIndex, ["date"])) {
				let locale = tf.feature("dateType").getLocale(colIndex);
				compareFn = sortDateStr(isSortDesc ? dateSortDesc : dateSortAsc, locale);
			} else {
				compareFn = caseSensitive ? void 0 : ignoreCase;
				if (isSortDesc) return options.sort(compareFn).reverse();
			}
			return options.sort(compareFn);
		}
		/**
		* Regenerate filters of specified columns and maintain selection if any
		* @param {Array} colIndexes Collection of column indexes
		* @private
		*/
		refreshFilters(colIndexes) {
			colIndexes.forEach((colIdx) => {
				let values = this.getValues(colIdx);
				this.build(colIdx, this.tf.linkedFilters);
				this.selectOptions(colIdx, values);
			});
		}
		/**
		* Check passed row contains a valid linked value
		* @param {Number} rowIdx Row index
		* @param {Number} activeFilterIdx Current active filter index
		* @returns {Boolean}
		*/
		isValidLinkedValue(rowIdx, activeFilterIdx) {
			let tf = this.tf;
			if (tf.disableExcludedOptions) return true;
			if (tf.paging) {
				if (!isEmpty(activeFilterIdx) && tf.isRowValid(rowIdx)) return true;
			} else if (tf.isRowDisplayed(rowIdx)) return true;
			return false;
		}
		/**
		* Refresh linked filters to offer only selected options
		*/
		linkFilters() {
			let tf = this.tf;
			if (!tf.linkedFilters || !tf.activeFilterId) return;
			this.refreshAll();
		}
	};
	//#endregion
	//#region src/array.js
	/**
	* Array utilities
	*/
	/**
	* Checks if given item can be found in the passed collection
	* @param  {Array} arr  collection
	* @param  {Any} val  item to search
	* @param  {Boolean} caseSensitive respects case if true
	* @return {Boolean}
	*/
	var has = (arr, val, caseSensitive) => {
		let sCase = Boolean(caseSensitive);
		for (var i = 0, l = arr.length; i < l; i++) if (matchCase(arr[i].toString(), sCase) === val) return true;
		return false;
	};
	//#endregion
	//#region src/modules/dropdown.js
	/**
	* Dropdown filter UI component
	* @export
	* @class Dropdown
	* @extends {BaseDropdown}
	*/
	var Dropdown = class Dropdown extends BaseDropdown {
		/**
		* Creates an instance of Dropdown
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, Dropdown);
			let f = this.config;
			/**
			* Enable the reset filter option as first item
			* @type {Boolean}
			*/
			this.enableSlcResetFilter = defaultsBool(f.enable_slc_reset_filter, true);
			/**
			* Non empty option text
			* @type {String}
			*/
			this.nonEmptyText = defaultsStr(f.non_empty_text, "(Non empty)");
			/**
			* Tooltip text appearing on multiple select
			* @type {String}
			*/
			this.multipleSlcTooltip = defaultsStr(f.multiple_slc_tooltip, "Use Ctrl/Cmd key for multiple selections");
		}
		/**
		* Drop-down filter focus event handler
		* @param {Event} e DOM Event
		* @private
		*/
		onSlcFocus(e) {
			let elm = targetEvt(e);
			let tf = this.tf;
			if (tf.loadFltOnDemand && elm.getAttribute("filled") === "0") {
				let ct = elm.getAttribute("ct");
				this.build(ct);
			}
			this.emitter.emit("filter-focus", tf, elm);
		}
		/**
		* Drop-down filter change event handler
		* @private
		*/
		onSlcChange() {
			if (this.tf.onSlcChange) this.tf.filter();
		}
		/**
		* Refresh all drop-down filters
		*/
		refreshAll() {
			let selectFlts = this.tf.getFiltersByType(SELECT, true);
			let multipleFlts = this.tf.getFiltersByType(MULTIPLE, true);
			let colIdxs = selectFlts.concat(multipleFlts);
			this.refreshFilters(colIdxs);
		}
		/**
		* Initialize drop-down filter
		* @param  {Number}     colIndex   Column index
		* @param  {Boolean}    isExternal External filter flag
		* @param  {DOMElement} container  Dom element containing the filter
		*/
		init(colIndex, isExternal, container) {
			let tf = this.tf;
			let col = tf.getFilterType(colIndex);
			let externalFltTgtId = isExternal ? tf.externalFltIds[colIndex] : null;
			let slc = createElm(SELECT, ["id", tf.buildFilterId(colIndex)], ["ct", colIndex], ["filled", "0"]);
			if (col === "multiple") {
				slc.multiple = MULTIPLE;
				slc.title = this.multipleSlcTooltip;
			}
			slc.className = col.toLowerCase() === "select" ? tf.fltCssClass : tf.fltMultiCssClass;
			if (externalFltTgtId) elm(externalFltTgtId).appendChild(slc);
			else container.appendChild(slc);
			tf.fltIds.push(slc.id);
			if (!tf.loadFltOnDemand) this.build(colIndex);
			else {
				let opt0 = createOpt(tf.getClearFilterText(colIndex), "");
				slc.appendChild(opt0);
			}
			addEvt(slc, "change", () => this.onSlcChange());
			addEvt(slc, "focus", (e) => this.onSlcFocus(e));
			this.emitter.on(["build-select-filter"], (tf, colIndex, isLinked, isExternal) => this.build(colIndex, isLinked, isExternal));
			this.emitter.on(["select-options"], (tf, colIndex, values) => this.selectOptions(colIndex, values));
			this.emitter.on(["rows-changed"], () => this.refreshAll());
			this.emitter.on(["after-filtering"], () => this.linkFilters());
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Build drop-down filter UI
		* @param  {Number}  colIndex    Column index
		* @param  {Boolean} isLinked    Enable linked filters behaviour
		*/
		build(colIndex, isLinked = false) {
			let tf = this.tf;
			colIndex = Number(colIndex);
			this.emitter.emit("before-populating-filter", tf, colIndex);
			/** @inherited */
			this.opts = [];
			/** @inherited */
			this.optsTxt = [];
			let slc = tf.getFilterElement(colIndex);
			/** @inherited */
			this.isCustom = tf.isCustomOptions(colIndex);
			if (this.isCustom) {
				let customValues = tf.getCustomOptions(colIndex);
				this.opts = customValues[0];
				this.optsTxt = customValues[1];
			}
			let activeIdx;
			let activeFilterId = tf.getActiveFilterId();
			if (isLinked && activeFilterId) activeIdx = tf.getColumnIndexFromFilterId(activeFilterId);
			let excludedOpts = null, filteredDataCol = null;
			if (isLinked && tf.disableExcludedOptions) {
				excludedOpts = [];
				filteredDataCol = [];
			}
			tf.eachRow()((row) => {
				let cellValue = tf.getCellValue(row.cells[colIndex]);
				let cellString = matchCase(cellValue, tf.caseSensitive);
				if (!has(this.opts, cellString, tf.caseSensitive)) this.opts.push(cellValue);
				if (isLinked && tf.disableExcludedOptions) {
					let filteredCol = filteredDataCol[colIndex];
					if (!filteredCol) filteredCol = tf.getVisibleColumnValues(colIndex);
					if (!has(filteredCol, cellString, tf.caseSensitive) && !has(excludedOpts, cellString, tf.caseSensitive)) excludedOpts.push(cellValue);
				}
			}, (row, k) => {
				if (tf.excludeRows.indexOf(k) !== -1) return true;
				if (row.cells.length !== tf.nbCells || this.isCustom) return true;
				if (isLinked && !this.isValidLinkedValue(k, activeIdx)) return true;
			});
			this.opts = this.sortOptions(colIndex, this.opts);
			if (excludedOpts) excludedOpts = this.sortOptions(colIndex, excludedOpts);
			this.addOptions(colIndex, slc, isLinked, excludedOpts);
			this.emitter.emit("after-populating-filter", tf, colIndex, slc);
		}
		/**
		* Add drop-down options
		* @param {Number} colIndex     Column index
		* @param {Object} slc          Select Dom element
		* @param {Boolean} isLinked    Enable linked refresh behaviour
		* @param {Array} excludedOpts  Array of excluded options
		*/
		addOptions(colIndex, slc, isLinked, excludedOpts) {
			let tf = this.tf, slcValue = slc.value;
			slc.innerHTML = "";
			slc = this.addFirstOption(slc);
			for (let y = 0; y < this.opts.length; y++) {
				if (this.opts[y] === "") continue;
				let val = this.opts[y];
				let lbl = this.isCustom ? this.optsTxt[y] : val;
				let isDisabled = false;
				if (isLinked && tf.disableExcludedOptions && has(excludedOpts, matchCase(val, tf.caseSensitive), tf.caseSensitive)) isDisabled = true;
				let opt;
				if (tf.loadFltOnDemand && slcValue === this.opts[y] && tf.getFilterType(colIndex) === "select") opt = createOpt(lbl, val, true);
				else opt = createOpt(lbl, val, false);
				if (isDisabled) opt.disabled = true;
				slc.appendChild(opt);
			}
			slc.setAttribute("filled", "1");
		}
		/**
		* Add drop-down header option
		* @param {Object} slc Select DOM element
		*/
		addFirstOption(slc) {
			let tf = this.tf;
			let colIdx = tf.getColumnIndexFromFilterId(slc.id);
			let opt0 = createOpt(!this.enableSlcResetFilter ? "" : tf.getClearFilterText(colIdx), "");
			if (!this.enableSlcResetFilter) opt0.style.display = NONE;
			slc.appendChild(opt0);
			if (tf.enableEmptyOption) {
				let opt1 = createOpt(tf.emptyText, tf.emOperator);
				slc.appendChild(opt1);
			}
			if (tf.enableNonEmptyOption) {
				let opt2 = createOpt(tf.nonEmptyText, tf.nmOperator);
				slc.appendChild(opt2);
			}
			return slc;
		}
		/**
		* Select filter options programmatically
		* @param  {Number} colIndex Column index
		* @param  {Array}  values   Array of option values to select
		*/
		selectOptions(colIndex, values = []) {
			let tf = this.tf;
			if (values.length === 0) return;
			let slc = tf.getFilterElement(colIndex);
			[].forEach.call(slc.options, (option) => {
				if (values[0] === "" || option.value === "") option.selected = false;
				if (option.value !== "" && has(values, option.value, true)) option.selected = true;
			});
		}
		/**
		* Get filter values for a given column index
		* @param {Number} colIndex Column index
		* @returns {Array}  values  Array of selected values
		*/
		getValues(colIndex) {
			let slc = this.tf.getFilterElement(colIndex);
			let values = [];
			if (slc.selectedOptions) [].forEach.call(slc.selectedOptions, (option) => values.push(option.value));
			else [].forEach.call(slc.options, (option) => {
				if (option.selected) values.push(option.value);
			});
			return values;
		}
		/**
		* Destroy Dropdown instance
		*/
		destroy() {
			this.emitter.off(["build-select-filter"], (colIndex, isLinked, isExternal) => this.build(colIndex, isLinked, isExternal));
			this.emitter.off(["select-options"], (tf, colIndex, values) => this.selectOptions(colIndex, values));
			this.emitter.off(["rows-changed"], () => this.refreshAll());
			this.emitter.off(["after-filtering"], () => this.linkFilters());
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/checkList.js
	/**
	* Checklist filter UI component
	* @export
	* @class CheckList
	* @extends {BaseDropdown}
	*/
	var CheckList = class CheckList extends BaseDropdown {
		/**
		* Creates an instance of CheckList
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, CheckList);
			let f = this.config;
			/**
			* List of container DOM elements
			* @type {Array}
			*/
			this.containers = [];
			/**
			* Css class for the container of the checklist filter (div)
			* @type {String}
			*/
			this.containerCssClass = defaultsStr(f.div_checklist_css_class, "div_checklist");
			/**
			* Css class for the checklist filter element (ul)
			* @type {String}
			*/
			this.filterCssClass = defaultsStr(f.checklist_css_class, "flt_checklist");
			/**
			* Css class for the item of a checklist (li)
			* @type {String}
			*/
			this.itemCssClass = defaultsStr(f.checklist_item_css_class, "flt_checklist_item");
			/**
			* Css class for a selected item of a checklist (li)
			* @type {String}
			*/
			this.selectedItemCssClass = defaultsStr(f.checklist_selected_item_css_class, "flt_checklist_slc_item");
			/**
			* Text placed in the filter's container when load filter on demand
			* feature is enabled
			* @type {String}
			*/
			this.activateText = defaultsStr(f.activate_checklist_text, "Click to load filter data");
			/**
			* Css class for a disabled item of a checklist (li)
			* @type {String}
			*/
			this.disabledItemCssClass = defaultsStr(f.checklist_item_disabled_css_class, "flt_checklist_item_disabled");
			/**
			* Enable the reset filter option as first item
			* @type {Boolean}
			*/
			this.enableResetOption = defaultsBool(f.enable_checklist_reset_filter, true);
			/**
			* Prefix for container element ID
			* @type {String}
			* @private
			*/
			this.prfx = "chkdiv_";
		}
		/**
		* Checklist option click event handler
		* @param {Event} evt
		* @private
		*/
		optionClick(evt) {
			let elm = targetEvt(evt);
			let tf = this.tf;
			this.emitter.emit("filter-focus", tf, elm);
			this.setItemOption(elm);
			tf.filter();
		}
		/**
		* Checklist container click event handler for load-on-demand feature
		* @param {Event} evt
		* @private
		*/
		onCheckListClick(evt) {
			let elm = targetEvt(evt);
			if (this.tf.loadFltOnDemand && elm.getAttribute("filled") === "0") {
				let ct = elm.getAttribute("ct");
				let div = this.containers[ct];
				this.build(ct);
				removeEvt(div, "click", (evt) => this.onCheckListClick(evt));
			}
		}
		/**
		* Refresh all checklist filters
		*/
		refreshAll() {
			let colIdxs = this.tf.getFiltersByType(CHECKLIST, true);
			this.refreshFilters(colIdxs);
		}
		/**
		* Initialize checklist filter
		* @param  {Number}     colIndex   Column index
		* @param  {Boolean}    isExternal External filter flag
		* @param  {DOMElement} container  Dom element containing the filter
		*/
		init(colIndex, isExternal, container) {
			let tf = this.tf;
			let externalFltTgtId = isExternal ? tf.externalFltIds[colIndex] : null;
			let divCont = createElm("div", ["id", `${this.prfx}${colIndex}_${tf.id}`], ["ct", colIndex], ["filled", "0"]);
			divCont.className = this.containerCssClass;
			if (externalFltTgtId) elm(externalFltTgtId).appendChild(divCont);
			else container.appendChild(divCont);
			this.containers[colIndex] = divCont;
			tf.fltIds.push(tf.buildFilterId(colIndex));
			if (!tf.loadFltOnDemand) this.build(colIndex);
			else {
				addEvt(divCont, "click", (evt) => this.onCheckListClick(evt));
				divCont.appendChild(createText(this.activateText));
			}
			this.emitter.on(["build-checklist-filter"], (tf, colIndex, isLinked) => this.build(colIndex, isLinked));
			this.emitter.on(["select-checklist-options"], (tf, colIndex, values) => this.selectOptions(colIndex, values));
			this.emitter.on(["rows-changed"], () => this.refreshAll());
			this.emitter.on(["after-filtering"], () => this.linkFilters());
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Build checklist UI
		* @param  {Number}  colIndex   Column index
		* @param  {Boolean} isLinked    Enable linked filters behaviour
		*/
		build(colIndex, isLinked = false) {
			let tf = this.tf;
			colIndex = Number(colIndex);
			this.emitter.emit("before-populating-filter", tf, colIndex);
			/** @inherited */
			this.opts = [];
			/** @inherited */
			this.optsTxt = [];
			let flt = this.containers[colIndex];
			let ul = createElm("ul", ["id", tf.fltIds[colIndex]], ["colIndex", colIndex]);
			ul.className = this.filterCssClass;
			let caseSensitive = tf.caseSensitive;
			/** @inherited */
			this.isCustom = tf.isCustomOptions(colIndex);
			if (this.isCustom) {
				let customValues = tf.getCustomOptions(colIndex);
				this.opts = customValues[0];
				this.optsTxt = customValues[1];
			}
			let activeIdx;
			let activeFilterId = tf.getActiveFilterId();
			if (isLinked && activeFilterId) activeIdx = tf.getColumnIndexFromFilterId(activeFilterId);
			let filteredDataCol = [];
			if (isLinked && tf.disableExcludedOptions)
 /** @inherited */
			this.excludedOpts = [];
			flt.innerHTML = "";
			tf.eachRow()((row) => {
				let cellValue = tf.getCellValue(row.cells[colIndex]);
				let cellString = matchCase(cellValue, caseSensitive);
				if (!has(this.opts, cellString, caseSensitive)) this.opts.push(cellValue);
				let filteredCol = filteredDataCol[colIndex];
				if (isLinked && tf.disableExcludedOptions) {
					if (!filteredCol) filteredCol = tf.getVisibleColumnValues(colIndex);
					if (!has(filteredCol, cellString, caseSensitive) && !has(this.excludedOpts, cellString, caseSensitive)) this.excludedOpts.push(cellValue);
				}
			}, (row, k) => {
				if (tf.excludeRows.indexOf(k) !== -1) return true;
				if (row.cells.length !== tf.nbCells || this.isCustom) return true;
				if (isLinked && !this.isValidLinkedValue(k, activeIdx)) return true;
			});
			this.opts = this.sortOptions(colIndex, this.opts);
			if (this.excludedOpts) this.excludedOpts = this.sortOptions(colIndex, this.excludedOpts);
			this.addChecks(colIndex, ul);
			if (tf.loadFltOnDemand) flt.innerHTML = "";
			flt.appendChild(ul);
			flt.setAttribute("filled", "1");
			this.emitter.emit("after-populating-filter", tf, colIndex, flt);
		}
		/**
		* Add checklist options
		* @param {Number} colIndex  Column index
		* @param {Object} ul        Ul element
		* @private
		*/
		addChecks(colIndex, ul) {
			let tf = this.tf;
			let chkCt = this.addTChecks(colIndex, ul);
			for (let y = 0; y < this.opts.length; y++) {
				let val = this.opts[y];
				let lbl = this.isCustom ? this.optsTxt[y] : val;
				let fltId = tf.fltIds[colIndex];
				let lblIdx = y + chkCt;
				let li = createCheckItem(`${fltId}_${lblIdx}`, val, lbl, ["data-idx", lblIdx]);
				li.className = this.itemCssClass;
				if (tf.linkedFilters && tf.disableExcludedOptions && has(this.excludedOpts, matchCase(val, tf.caseSensitive), tf.caseSensitive)) {
					addClass(li, this.disabledItemCssClass);
					li.check.disabled = true;
					li.disabled = true;
				} else addEvt(li.check, "click", (evt) => this.optionClick(evt));
				ul.appendChild(li);
				if (val === "") li.style.display = NONE;
			}
		}
		/**
		* Add checklist header option
		* @param {Number} colIndex Column index
		* @param {Object} ul       Ul element
		* @private
		*/
		addTChecks(colIndex, ul) {
			let tf = this.tf;
			let chkCt = 1;
			let fltId = tf.fltIds[colIndex];
			let li0 = createCheckItem(`${fltId}_0`, "", tf.getClearFilterText(colIndex), ["data-idx", 0]);
			li0.className = this.itemCssClass;
			ul.appendChild(li0);
			addEvt(li0.check, "click", (evt) => this.optionClick(evt));
			if (!this.enableResetOption) li0.style.display = NONE;
			if (tf.enableEmptyOption) {
				let li1 = createCheckItem(`${fltId}_1`, tf.emOperator, tf.emptyText, ["data-idx", 1]);
				li1.className = this.itemCssClass;
				ul.appendChild(li1);
				addEvt(li1.check, "click", (evt) => this.optionClick(evt));
				chkCt++;
			}
			if (tf.enableNonEmptyOption) {
				let li2 = createCheckItem(`${fltId}_2`, tf.nmOperator, tf.nonEmptyText, ["data-idx", 2]);
				li2.className = this.itemCssClass;
				ul.appendChild(li2);
				addEvt(li2.check, "click", (evt) => this.optionClick(evt));
				chkCt++;
			}
			return chkCt;
		}
		/**
		* Set/unset value of passed item option in filter's DOM element attribute
		* @param {Object} o checklist option DOM element
		* @private
		*/
		setItemOption(o) {
			if (!o) return;
			let tf = this.tf;
			let chkValue = o.value;
			let chkIndex = o.dataset.idx;
			let colIdx = tf.getColumnIndexFromFilterId(o.id);
			let n = tf.getFilterElement(parseInt(colIdx, 10));
			let items = n.childNodes;
			let li = items[chkIndex];
			let slcValues = n.getAttribute("value") || "";
			let slcIndexes = n.getAttribute("indexes") || "";
			if (o.checked) {
				if (chkValue === "") {
					slcIndexes.split(tf.separator).forEach((idx) => {
						idx = Number(idx);
						let li = items[idx];
						let chx = tag(li, "input")[0];
						if (chx && idx > 0) {
							chx.checked = false;
							removeClass(li, this.selectedItemCssClass);
						}
					});
					n.setAttribute("value", "");
					n.setAttribute("indexes", "");
				} else {
					let indexes = slcIndexes + chkIndex + tf.separator;
					let values = trim(slcValues + " " + chkValue + " " + tf.orOperator);
					n.setAttribute("value", values);
					n.setAttribute("indexes", indexes);
					let chx0 = tag(items[0], "input")[0];
					if (chx0) chx0.checked = false;
				}
				removeClass(items[0], this.selectedItemCssClass);
				addClass(li, this.selectedItemCssClass);
			} else {
				let replaceValue = new RegExp(rgxEsc(chkValue + " " + tf.orOperator));
				let values = slcValues.replace(replaceValue, "");
				let replaceIndex = new RegExp(rgxEsc(chkIndex + tf.separator));
				let indexes = slcIndexes.replace(replaceIndex, "");
				n.setAttribute("value", trim(values));
				n.setAttribute("indexes", indexes);
				removeClass(li, this.selectedItemCssClass);
			}
		}
		/**
		* Select filter options programmatically
		* @param  {Number} colIndex Column index
		* @param  {Array}  values   Array of option values to select
		*/
		selectOptions(colIndex, values = []) {
			let tf = this.tf;
			let flt = tf.getFilterElement(colIndex);
			if (!flt || values.length === 0) return;
			let lis = tag(flt, "li");
			flt.setAttribute("value", "");
			flt.setAttribute("indexes", "");
			[].forEach.call(lis, (li) => {
				let chk = tag(li, "input")[0];
				let chkVal = matchCase(chk.value, tf.caseSensitive);
				if (chkVal !== "" && has(values, chkVal, tf.caseSensitive)) chk.checked = true;
				else if (values.indexOf(tf.nmOperator) !== -1 && chkVal === matchCase(tf.nonEmptyText, tf.caseSensitive)) chk.checked = true;
				else if (values.indexOf(tf.emOperator) !== -1 && chkVal === matchCase(tf.emptyText, tf.caseSensitive)) chk.checked = true;
				else chk.checked = false;
				this.setItemOption(chk);
			});
		}
		/**
		* Get filter values for a given column index
		* @param {Number} colIndex Column index
		* @returns {Array} values Collection of selected values
		*/
		getValues(colIndex) {
			let tf = this.tf;
			let flt = tf.getFilterElement(colIndex);
			if (!flt) return [];
			let fltAttr = flt.getAttribute("value");
			let values = isEmpty(fltAttr) ? "" : fltAttr;
			values = values.substr(0, values.length - 3);
			values = values.split(" " + tf.orOperator + " ");
			return values;
		}
		/**
		* Destroy CheckList instance
		*/
		destroy() {
			this.emitter.off(["build-checklist-filter"], (tf, colIndex, isLinked) => this.build(colIndex, isLinked));
			this.emitter.off(["select-checklist-options"], (tf, colIndex, values) => this.selectOptions(colIndex, values));
			this.emitter.off(["rows-changed"], () => this.refreshAll());
			this.emitter.off(["after-filtering"], () => this.linkFilters());
			this.initialized = false;
		}
	};
	//#endregion
	//#region node_modules/sugar-date/locales/ca.js
	var require_ca = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("ca", {
			"plural": true,
			"units": "milisegon:|s,segon:|s,minut:|s,hor:a|es,di:a|es,setman:a|es,mes:|os,any:|s",
			"months": "gen:er|,febr:er|,mar:ç|,abr:il|,mai:g|,jun:y|,jul:iol|,ag:ost|,set:embre|,oct:ubre|,nov:embre|,des:embre|",
			"weekdays": "diumenge|dg,dilluns|dl,dimarts|dt,dimecres|dc,dijous|dj,divendres|dv,dissabte|ds",
			"numerals": "zero,un,dos,tres,quatre,cinc,sis,set,vuit,nou,deu",
			"tokens": "el,la,de",
			"short": "{dd}/{MM}/{yyyy}",
			"medium": "{d} {month} {yyyy}",
			"long": "{d} {month} {yyyy} {time}",
			"full": "{weekday} {d} {month} {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{sign} {num} {unit}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"timeMarkers": "a las",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "abans d'ahir",
					"value": -2
				},
				{
					"name": "day",
					"src": "ahir",
					"value": -1
				},
				{
					"name": "day",
					"src": "avui",
					"value": 0
				},
				{
					"name": "day",
					"src": "demà|dema",
					"value": 1
				},
				{
					"name": "sign",
					"src": "fa",
					"value": -1
				},
				{
					"name": "sign",
					"src": "en",
					"value": 1
				},
				{
					"name": "shift",
					"src": "passat",
					"value": -1
				},
				{
					"name": "shift",
					"src": "el proper|la propera",
					"value": 1
				}
			],
			"parse": [
				"{sign} {num} {unit}",
				"{num} {unit} {sign}",
				"{0?}{1?} {unit:5-7} {shift}",
				"{0?}{1?} {shift} {unit:5-7}"
			],
			"timeParse": [
				"{shift} {weekday}",
				"{weekday} {shift}",
				"{date?} {2?} {months}\\.? {2?} {year?}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/da.js
	var require_da = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("da", {
			"plural": true,
			"units": "millisekund:|er,sekund:|er,minut:|ter,tim:e|er,dag:|e,ug:e|er|en,måned:|er|en+maaned:|er|en,år:||et+aar:||et",
			"months": "jan:uar|,feb:ruar|,mar:ts|,apr:il|,maj,jun:i|,jul:i|,aug:ust|,sep:tember|,okt:ober|,nov:ember|,dec:ember|",
			"weekdays": "søn:dag|+son:dag|,man:dag|,tir:sdag|,ons:dag|,tor:sdag|,fre:dag|,lør:dag|+lor:dag|",
			"numerals": "nul,en|et,to,tre,fire,fem,seks,syv,otte,ni,ti",
			"tokens": "den,for",
			"articles": "den",
			"short": "{dd}-{MM}-{yyyy}",
			"medium": "{d}. {month} {yyyy}",
			"long": "{d}. {month} {yyyy} {time}",
			"full": "{weekday} d. {d}. {month} {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{num} {unit} {sign}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "forgårs|i forgårs|forgaars|i forgaars",
					"value": -2
				},
				{
					"name": "day",
					"src": "i går|igår|i gaar|igaar",
					"value": -1
				},
				{
					"name": "day",
					"src": "i dag|idag",
					"value": 0
				},
				{
					"name": "day",
					"src": "i morgen|imorgen",
					"value": 1
				},
				{
					"name": "day",
					"src": "over morgon|overmorgen|i over morgen|i overmorgen|iovermorgen",
					"value": 2
				},
				{
					"name": "sign",
					"src": "siden",
					"value": -1
				},
				{
					"name": "sign",
					"src": "om",
					"value": 1
				},
				{
					"name": "shift",
					"src": "i sidste|sidste",
					"value": -1
				},
				{
					"name": "shift",
					"src": "denne",
					"value": 0
				},
				{
					"name": "shift",
					"src": "næste|naeste",
					"value": 1
				}
			],
			"parse": [
				"{months} {year?}",
				"{num} {unit} {sign}",
				"{sign} {num} {unit}",
				"{1?} {num} {unit} {sign}",
				"{shift} {unit:5-7}"
			],
			"timeParse": ["{day|weekday}", "{date} {months?}\\.? {year?}"],
			"timeFrontParse": ["{shift} {weekday}", "{0?} {weekday?},? {date}\\.? {months?}\\.? {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/de.js
	var require_de = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("de", {
			"plural": true,
			"units": "Millisekunde:|n,Sekunde:|n,Minute:|n,Stunde:|n,Tag:|en,Woche:|n,Monat:|en,Jahr:|en|e",
			"months": "Jan:uar|,Feb:ruar|,M:är|ärz|ar|arz,Apr:il|,Mai,Juni,Juli,Aug:ust|,Sept:ember|,Okt:ober|,Nov:ember|,Dez:ember|",
			"weekdays": "So:nntag|,Mo:ntag|,Di:enstag|,Mi:ttwoch|,Do:nnerstag|,Fr:eitag|,Sa:mstag|",
			"numerals": "null,ein:|e|er|en|em,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,zehn",
			"tokens": "der",
			"short": "{dd}.{MM}.{yyyy}",
			"medium": "{d}. {Month} {yyyy}",
			"long": "{d}. {Month} {yyyy} {time}",
			"full": "{Weekday}, {d}. {Month} {yyyy} {time}",
			"stamp": "{Dow} {d} {Mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{sign} {num} {unit}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"timeMarkers": "um",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "vorgestern",
					"value": -2
				},
				{
					"name": "day",
					"src": "gestern",
					"value": -1
				},
				{
					"name": "day",
					"src": "heute",
					"value": 0
				},
				{
					"name": "day",
					"src": "morgen",
					"value": 1
				},
				{
					"name": "day",
					"src": "übermorgen|ubermorgen|uebermorgen",
					"value": 2
				},
				{
					"name": "sign",
					"src": "vor:|her",
					"value": -1
				},
				{
					"name": "sign",
					"src": "in",
					"value": 1
				},
				{
					"name": "shift",
					"src": "letzte:|r|n|s",
					"value": -1
				},
				{
					"name": "shift",
					"src": "nächste:|r|n|s+nachste:|r|n|s+naechste:|r|n|s+kommende:n|r",
					"value": 1
				}
			],
			"parse": [
				"{months} {year?}",
				"{sign} {num} {unit}",
				"{num} {unit} {sign}",
				"{shift} {unit:5-7}"
			],
			"timeParse": ["{shift?} {day|weekday}", "{weekday?},? {date}\\.? {months?}\\.? {year?}"],
			"timeFrontParse": ["{shift} {weekday}", "{weekday?},? {date}\\.? {months?}\\.? {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/es.js
	var require_es = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("es", {
			"plural": true,
			"units": "milisegundo:|s,segundo:|s,minuto:|s,hora:|s,día|días|dia|dias,semana:|s,mes:|es,año|años|ano|anos",
			"months": "ene:ro|,feb:rero|,mar:zo|,abr:il|,may:o|,jun:io|,jul:io|,ago:sto|,sep:tiembre|,oct:ubre|,nov:iembre|,dic:iembre|",
			"weekdays": "dom:ingo|,lun:es|,mar:tes|,mié:rcoles|+mie:rcoles|,jue:ves|,vie:rnes|,sáb:ado|+sab:ado|",
			"numerals": "cero,uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve,diez",
			"tokens": "el,la,de",
			"short": "{dd}/{MM}/{yyyy}",
			"medium": "{d} de {Month} de {yyyy}",
			"long": "{d} de {Month} de {yyyy} {time}",
			"full": "{weekday}, {d} de {month} de {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{sign} {num} {unit}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"timeMarkers": "a las",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "anteayer",
					"value": -2
				},
				{
					"name": "day",
					"src": "ayer",
					"value": -1
				},
				{
					"name": "day",
					"src": "hoy",
					"value": 0
				},
				{
					"name": "day",
					"src": "mañana|manana",
					"value": 1
				},
				{
					"name": "sign",
					"src": "hace",
					"value": -1
				},
				{
					"name": "sign",
					"src": "dentro de",
					"value": 1
				},
				{
					"name": "shift",
					"src": "pasad:o|a",
					"value": -1
				},
				{
					"name": "shift",
					"src": "próximo|próxima|proximo|proxima",
					"value": 1
				}
			],
			"parse": [
				"{months} {2?} {year?}",
				"{sign} {num} {unit}",
				"{num} {unit} {sign}",
				"{0?}{1?} {unit:5-7} {shift}",
				"{0?}{1?} {shift} {unit:5-7}"
			],
			"timeParse": ["{shift?} {day|weekday} {shift?}", "{date} {2?} {months?}\\.? {2?} {year?}"],
			"timeFrontParse": ["{shift?} {weekday} {shift?}", "{date} {2?} {months?}\\.? {2?} {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/fi.js
	var require_fi = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("fi", {
			"plural": true,
			"units": "millisekun:ti|tia|nin|teja|tina,sekun:ti|tia|nin|teja|tina,minuut:ti|tia|in|teja|tina,tun:ti|tia|nin|teja|tina,päiv:ä|ää|än|iä|änä,viik:ko|koa|on|olla|koja|kona,kuukau:si|tta|den+kuussa,vuo:si|tta|den|sia|tena|nna",
			"months": "tammi:kuuta||kuu,helmi:kuuta||kuu,maalis:kuuta||kuu,huhti:kuuta||kuu,touko:kuuta||kuu,kesä:kuuta||kuu,heinä:kuuta||kuu,elo:kuuta||kuu,syys:kuuta||kuu,loka:kuuta||kuu,marras:kuuta||kuu,joulu:kuuta||kuu",
			"weekdays": "su:nnuntai||nnuntaina,ma:anantai||anantaina,ti:istai||istaina,ke:skiviikko||skiviikkona,to:rstai||rstaina,pe:rjantai||rjantaina,la:uantai||uantaina",
			"numerals": "nolla,yksi|ensimmäinen,kaksi|toinen,kolm:e|as,neljä:|s,vii:si|des,kuu:si|des,seitsemä:n|s,kahdeksa:n|s,yhdeksä:n|s,kymmene:n|s",
			"short": "{d}.{M}.{yyyy}",
			"medium": "{d}. {month} {yyyy}",
			"long": "{d}. {month} {yyyy} klo {time}",
			"full": "{weekday} {d}. {month} {yyyy} klo {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}.{mm}",
			"timeMarkers": "klo,kello",
			"timeSeparator": ".",
			"ordinalSuffix": ".",
			"relative": function(num, unit, ms, format) {
				var units = this["units"];
				function numberWithUnit(mult) {
					return num + " " + units[8 * mult + unit];
				}
				function baseUnit() {
					return numberWithUnit(num === 1 ? 0 : 1);
				}
				switch (format) {
					case "duration": return baseUnit();
					case "past": return baseUnit() + " sitten";
					case "future": return numberWithUnit(2) + " kuluttua";
				}
			},
			"modifiers": [
				{
					"name": "day",
					"src": "toissa päivänä",
					"value": -2
				},
				{
					"name": "day",
					"src": "eilen|eilistä",
					"value": -1
				},
				{
					"name": "day",
					"src": "tänään",
					"value": 0
				},
				{
					"name": "day",
					"src": "huomenna|huomista",
					"value": 1
				},
				{
					"name": "day",
					"src": "ylihuomenna|ylihuomista",
					"value": 2
				},
				{
					"name": "sign",
					"src": "sitten|aiemmin",
					"value": -1
				},
				{
					"name": "sign",
					"src": "päästä|kuluttua|myöhemmin",
					"value": 1
				},
				{
					"name": "edge",
					"src": "lopussa",
					"value": 2
				},
				{
					"name": "edge",
					"src": "ensimmäinen|ensimmäisenä",
					"value": -2
				},
				{
					"name": "shift",
					"src": "edel:linen|lisenä",
					"value": -1
				},
				{
					"name": "shift",
					"src": "viime",
					"value": -1
				},
				{
					"name": "shift",
					"src": "tä:llä|ssä|nä|mä",
					"value": 0
				},
				{
					"name": "shift",
					"src": "seuraava|seuraavana|tuleva|tulevana|ensi",
					"value": 1
				}
			],
			"parse": ["{months} {year?}", "{shift} {unit:5-7}"],
			"timeParse": ["{shift?} {day|weekday}", "{weekday?},? {date}\\.? {months?}\\.? {year?}"],
			"timeFrontParse": [
				"{shift?} {day|weekday}",
				"{num?} {unit} {sign}",
				"{weekday?},? {date}\\.? {months?}\\.? {year?}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/fr.js
	var require_fr = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("fr", {
			"plural": true,
			"units": "milliseconde:|s,seconde:|s,minute:|s,heure:|s,jour:|s,semaine:|s,mois,an:|s|née|nee",
			"months": "janv:ier|,févr:ier|+fevr:ier|,mars,avr:il|,mai,juin,juil:let|,août,sept:embre|,oct:obre|,nov:embre|,déc:embre|+dec:embre|",
			"weekdays": "dim:anche|,lun:di|,mar:di|,mer:credi|,jeu:di|,ven:dredi|,sam:edi|",
			"numerals": "zéro,un:|e,deux,trois,quatre,cinq,six,sept,huit,neuf,dix",
			"tokens": "l'|la|le,er",
			"short": "{dd}/{MM}/{yyyy}",
			"medium": "{d} {month} {yyyy}",
			"long": "{d} {month} {yyyy} {time}",
			"full": "{weekday} {d} {month} {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{sign} {num} {unit}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"timeMarkers": "à",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "hier",
					"value": -1
				},
				{
					"name": "day",
					"src": "aujourd'hui",
					"value": 0
				},
				{
					"name": "day",
					"src": "demain",
					"value": 1
				},
				{
					"name": "sign",
					"src": "il y a",
					"value": -1
				},
				{
					"name": "sign",
					"src": "dans|d'ici",
					"value": 1
				},
				{
					"name": "shift",
					"src": "derni:èr|er|ère|ere",
					"value": -1
				},
				{
					"name": "shift",
					"src": "prochain:|e",
					"value": 1
				}
			],
			"parse": [
				"{months} {year?}",
				"{sign} {num} {unit}",
				"{0?} {unit:5-7} {shift}"
			],
			"timeParse": ["{day|weekday} {shift?}", "{weekday?},? {0?} {date}{1?} {months}\\.? {year?}"],
			"timeFrontParse": ["{0?} {weekday} {shift}", "{weekday?},? {0?} {date}{1?} {months}\\.? {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/it.js
	var require_it = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("it", {
			"plural": true,
			"units": "millisecond:o|i,second:o|i,minut:o|i,or:a|e,giorn:o|i,settiman:a|e,mes:e|i,ann:o|i",
			"months": "gen:naio|,feb:braio|,mar:zo|,apr:ile|,mag:gio|,giu:gno|,lug:lio|,ago:sto|,set:tembre|,ott:obre|,nov:embre|,dic:embre|",
			"weekdays": "dom:enica|,lun:edì||edi,mar:tedì||tedi,mer:coledì||coledi,gio:vedì||vedi,ven:erdì||erdi,sab:ato|",
			"numerals": "zero,un:|a|o|',due,tre,quattro,cinque,sei,sette,otto,nove,dieci",
			"tokens": "l'|la|il",
			"short": "{dd}/{MM}/{yyyy}",
			"medium": "{d} {month} {yyyy}",
			"long": "{d} {month} {yyyy} {time}",
			"full": "{weekday}, {d} {month} {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{num} {unit} {sign}",
			"future": "{num} {unit} {sign}",
			"duration": "{num} {unit}",
			"timeMarkers": "alle",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "ieri",
					"value": -1
				},
				{
					"name": "day",
					"src": "oggi",
					"value": 0
				},
				{
					"name": "day",
					"src": "domani",
					"value": 1
				},
				{
					"name": "day",
					"src": "dopodomani",
					"value": 2
				},
				{
					"name": "sign",
					"src": "fa",
					"value": -1
				},
				{
					"name": "sign",
					"src": "da adesso",
					"value": 1
				},
				{
					"name": "shift",
					"src": "scors:o|a",
					"value": -1
				},
				{
					"name": "shift",
					"src": "prossim:o|a",
					"value": 1
				}
			],
			"parse": [
				"{months} {year?}",
				"{num} {unit} {sign}",
				"{0?} {unit:5-7} {shift}",
				"{0?} {shift} {unit:5-7}"
			],
			"timeParse": ["{day|weekday} {shift?}", "{weekday?},? {date} {months?}\\.? {year?}"],
			"timeFrontParse": ["{day|weekday} {shift?}", "{weekday?},? {date} {months?}\\.? {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/ja.js
	var require_ja = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("ja", {
			"ampmFront": true,
			"numeralUnits": true,
			"allowsFullWidth": true,
			"timeMarkerOptional": true,
			"firstDayOfWeek": 0,
			"firstDayOfWeekYear": 1,
			"units": "ミリ秒,秒,分,時間,日,週間|週,ヶ月|ヵ月|月,年|年度",
			"weekdays": "日:曜日||曜,月:曜日||曜,火:曜日||曜,水:曜日||曜,木:曜日||曜,金:曜日||曜,土:曜日||曜",
			"numerals": "〇,一,二,三,四,五,六,七,八,九",
			"placeholders": "十,百,千,万",
			"timeSuffixes": ",秒,分,時,日,,月,年度?",
			"short": "{yyyy}/{MM}/{dd}",
			"medium": "{yyyy}年{M}月{d}日",
			"long": "{yyyy}年{M}月{d}日{time}",
			"full": "{yyyy}年{M}月{d}日{time} {weekday}",
			"stamp": "{yyyy}年{M}月{d}日 {H}:{mm} {dow}",
			"time": "{tt}{h}時{mm}分",
			"past": "{num}{unit}{sign}",
			"future": "{num}{unit}{sign}",
			"duration": "{num}{unit}",
			"ampm": "午前,午後",
			"modifiers": [
				{
					"name": "day",
					"src": "一昨々日|前々々日",
					"value": -3
				},
				{
					"name": "day",
					"src": "一昨日|おととい|前々日",
					"value": -2
				},
				{
					"name": "day",
					"src": "昨日|前日",
					"value": -1
				},
				{
					"name": "day",
					"src": "今日|当日|本日",
					"value": 0
				},
				{
					"name": "day",
					"src": "明日|翌日|次日",
					"value": 1
				},
				{
					"name": "day",
					"src": "明後日|翌々日",
					"value": 2
				},
				{
					"name": "day",
					"src": "明々後日|翌々々日",
					"value": 3
				},
				{
					"name": "sign",
					"src": "前",
					"value": -1
				},
				{
					"name": "sign",
					"src": "後",
					"value": 1
				},
				{
					"name": "edge",
					"src": "始|初日|頭",
					"value": -2
				},
				{
					"name": "edge",
					"src": "末|尻",
					"value": 2
				},
				{
					"name": "edge",
					"src": "末日",
					"value": 1
				},
				{
					"name": "shift",
					"src": "一昨々|前々々",
					"value": -3
				},
				{
					"name": "shift",
					"src": "一昨|前々|先々",
					"value": -2
				},
				{
					"name": "shift",
					"src": "先|昨|去|前",
					"value": -1
				},
				{
					"name": "shift",
					"src": "今|本|当",
					"value": 0
				},
				{
					"name": "shift",
					"src": "来|明|翌|次",
					"value": 1
				},
				{
					"name": "shift",
					"src": "明後|翌々|次々|再来|さ来",
					"value": 2
				},
				{
					"name": "shift",
					"src": "明々後|翌々々",
					"value": 3
				}
			],
			"parse": [
				"{month}{edge}",
				"{num}{unit}{sign}",
				"{year?}{month}",
				"{year}"
			],
			"timeParse": [
				"{day|weekday}",
				"{shift}{unit:5}{weekday?}",
				"{shift}{unit:7}{month}{edge}",
				"{shift}{unit:7}{month?}{date?}",
				"{shift}{unit:6}{edge?}{date?}",
				"{year?}{month?}{date}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/ko.js
	var require_ko = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("ko", {
			"ampmFront": true,
			"numeralUnits": true,
			"units": "밀리초,초,분,시간,일,주,개월|달,년|해",
			"weekdays": "일:요일|,월:요일|,화:요일|,수:요일|,목:요일|,금:요일|,토:요일|",
			"numerals": "영|제로,일|한,이,삼,사,오,육,칠,팔,구,십",
			"short": "{yyyy}.{MM}.{dd}",
			"medium": "{yyyy}년 {M}월 {d}일",
			"long": "{yyyy}년 {M}월 {d}일 {time}",
			"full": "{yyyy}년 {M}월 {d}일 {weekday} {time}",
			"stamp": "{yyyy}년 {M}월 {d}일 {H}:{mm} {dow}",
			"time": "{tt} {h}시 {mm}분",
			"past": "{num}{unit} {sign}",
			"future": "{num}{unit} {sign}",
			"duration": "{num}{unit}",
			"timeSuffixes": ",초,분,시,일,,월,년",
			"ampm": "오전,오후",
			"modifiers": [
				{
					"name": "day",
					"src": "그저께",
					"value": -2
				},
				{
					"name": "day",
					"src": "어제",
					"value": -1
				},
				{
					"name": "day",
					"src": "오늘",
					"value": 0
				},
				{
					"name": "day",
					"src": "내일",
					"value": 1
				},
				{
					"name": "day",
					"src": "모레",
					"value": 2
				},
				{
					"name": "sign",
					"src": "전",
					"value": -1
				},
				{
					"name": "sign",
					"src": "후",
					"value": 1
				},
				{
					"name": "shift",
					"src": "지난|작",
					"value": -1
				},
				{
					"name": "shift",
					"src": "이번|올",
					"value": 0
				},
				{
					"name": "shift",
					"src": "다음|내",
					"value": 1
				}
			],
			"parse": [
				"{num}{unit} {sign}",
				"{shift?} {unit:5-7}",
				"{year?} {month}",
				"{year}"
			],
			"timeParse": [
				"{day|weekday}",
				"{shift} {unit:5?} {weekday}",
				"{year?} {month?} {date} {weekday?}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/nl.js
	var require_nl = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("nl", {
			"plural": true,
			"units": "milliseconde:|n,seconde:|n,minu:ut|ten,uur,dag:|en,we:ek|ken,maand:|en,jaar",
			"months": "jan:uari|,feb:ruari|,maart|mrt,apr:il|,mei,jun:i|,jul:i|,aug:ustus|,sep:tember|,okt:ober|,nov:ember|,dec:ember|",
			"weekdays": "zondag|zo,maandag|ma,dinsdag|di,woensdag|wo|woe,donderdag|do,vrijdag|vr|vrij,zaterdag|za",
			"numerals": "nul,een,twee,drie,vier,vijf,zes,zeven,acht,negen,tien",
			"short": "{dd}-{MM}-{yyyy}",
			"medium": "{d} {month} {yyyy}",
			"long": "{d} {Month} {yyyy} {time}",
			"full": "{weekday} {d} {Month} {yyyy} {time}",
			"stamp": "{dow} {d} {Mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{num} {unit} {sign}",
			"future": "{num} {unit} {sign}",
			"duration": "{num} {unit}",
			"timeMarkers": "'s,om",
			"modifiers": [
				{
					"name": "day",
					"src": "gisteren",
					"value": -1
				},
				{
					"name": "day",
					"src": "vandaag",
					"value": 0
				},
				{
					"name": "day",
					"src": "morgen",
					"value": 1
				},
				{
					"name": "day",
					"src": "overmorgen",
					"value": 2
				},
				{
					"name": "sign",
					"src": "geleden",
					"value": -1
				},
				{
					"name": "sign",
					"src": "vanaf nu",
					"value": 1
				},
				{
					"name": "shift",
					"src": "laatste|vorige|afgelopen",
					"value": -1
				},
				{
					"name": "shift",
					"src": "volgend:|e",
					"value": 1
				}
			],
			"parse": [
				"{months} {year?}",
				"{num} {unit} {sign}",
				"{0?} {unit:5-7} {shift}",
				"{0?} {shift} {unit:5-7}"
			],
			"timeParse": ["{shift?} {day|weekday}", "{weekday?},? {date} {months?}\\.? {year?}"],
			"timeFrontParse": ["{shift?} {day|weekday}", "{weekday?},? {date} {months?}\\.? {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/no.js
	var require_no = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("no", {
			"plural": true,
			"units": "millisekund:|er,sekund:|er,minutt:|er,tim:e|er,dag:|er,uk:e|er|en,måned:|er|en+maaned:|er|en,år:||et+aar:||et",
			"months": "januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember",
			"weekdays": "søndag|sondag,mandag,tirsdag,onsdag,torsdag,fredag,lørdag|lordag",
			"numerals": "en|et,to,tre,fire,fem,seks,sju|syv,åtte,ni,ti",
			"tokens": "den,for",
			"articles": "den",
			"short": "d. {d}. {month} {yyyy}",
			"long": "den {d}. {month} {yyyy} {H}:{mm}",
			"full": "{Weekday} den {d}. {month} {yyyy} {H}:{mm}:{ss}",
			"past": "{num} {unit} {sign}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "forgårs|i forgårs|forgaars|i forgaars",
					"value": -2
				},
				{
					"name": "day",
					"src": "i går|igår|i gaar|igaar",
					"value": -1
				},
				{
					"name": "day",
					"src": "i dag|idag",
					"value": 0
				},
				{
					"name": "day",
					"src": "i morgen|imorgen",
					"value": 1
				},
				{
					"name": "day",
					"src": "overimorgen|overmorgen|over i morgen",
					"value": 2
				},
				{
					"name": "sign",
					"src": "siden",
					"value": -1
				},
				{
					"name": "sign",
					"src": "om",
					"value": 1
				},
				{
					"name": "shift",
					"src": "i siste|siste",
					"value": -1
				},
				{
					"name": "shift",
					"src": "denne",
					"value": 0
				},
				{
					"name": "shift",
					"src": "neste",
					"value": 1
				}
			],
			"parse": [
				"{num} {unit} {sign}",
				"{sign} {num} {unit}",
				"{1?} {num} {unit} {sign}",
				"{shift} {unit:5-7}"
			],
			"timeParse": [
				"{date} {month}",
				"{shift} {weekday}",
				"{0?} {weekday?},? {date?} {month}\\.? {year}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/pl.js
	var require_pl = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("pl", {
			"plural": true,
			"units": "milisekund:a|y|,sekund:a|y|,minut:a|y|,godzin:a|y|,dzień|dni|dni,tydzień|tygodnie|tygodni,miesiąc|miesiące|miesięcy,rok|lata|lat",
			"months": "sty:cznia||czeń,lut:ego||y,mar:ca||zec,kwi:etnia||ecień,maj:a|,cze:rwca||rwiec,lip:ca||iec,sie:rpnia||rpień,wrz:eśnia||esień,paź:dziernika||dziernik,lis:topada||topad,gru:dnia||dzień",
			"weekdays": "nie:dziela||dzielę,pon:iedziałek|,wt:orek|,śr:oda||odę,czw:artek|,piątek|pt,sobota|sb|sobotę",
			"numerals": "zero,jeden|jedną,dwa|dwie,trzy,cztery,pięć,sześć,siedem,osiem,dziewięć,dziesięć",
			"tokens": "w|we,roku",
			"short": "{dd}.{MM}.{yyyy}",
			"medium": "{d} {month} {yyyy}",
			"long": "{d} {month} {yyyy} {time}",
			"full": "{weekday}, {d} {month} {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"timeMarkers": "o",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "przedwczoraj",
					"value": -2
				},
				{
					"name": "day",
					"src": "wczoraj",
					"value": -1
				},
				{
					"name": "day",
					"src": "dzisiaj|dziś",
					"value": 0
				},
				{
					"name": "day",
					"src": "jutro",
					"value": 1
				},
				{
					"name": "day",
					"src": "pojutrze",
					"value": 2
				},
				{
					"name": "sign",
					"src": "temu|przed",
					"value": -1
				},
				{
					"name": "sign",
					"src": "za",
					"value": 1
				},
				{
					"name": "shift",
					"src": "zeszły|zeszła|ostatni|ostatnia",
					"value": -1
				},
				{
					"name": "shift",
					"src": "następny|następna|następnego|przyszły|przyszła|przyszłego",
					"value": 1
				}
			],
			"relative": function(num, unit, ms, format) {
				if (unit === 4) {
					if (num === 1 && format === "past") return "wczoraj";
					if (num === 1 && format === "future") return "jutro";
					if (num === 2 && format === "past") return "przedwczoraj";
					if (num === 2 && format === "future") return "pojutrze";
				}
				var mult;
				var last = +num.toFixed(0).slice(-1);
				var last2 = +num.toFixed(0).slice(-2);
				switch (true) {
					case num === 1:
						mult = 0;
						break;
					case last2 >= 12 && last2 <= 14:
						mult = 2;
						break;
					case last >= 2 && last <= 4:
						mult = 1;
						break;
					default: mult = 2;
				}
				var text = this["units"][mult * 8 + unit];
				var prefix = num + " ";
				if ((format === "past" || format === "future") && num === 1) text = text.replace(/a$/, "ę");
				text = prefix + text;
				switch (format) {
					case "duration": return text;
					case "past": return text + " temu";
					case "future": return "za " + text;
				}
			},
			"parse": [
				"{num} {unit} {sign}",
				"{sign} {num} {unit}",
				"{months} {year?}",
				"{shift} {unit:5-7}",
				"{0} {shift?} {weekday}"
			],
			"timeFrontParse": [
				"{day|weekday}",
				"{date} {months} {year?} {1?}",
				"{0?} {shift?} {weekday}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/pt.js
	var require_pt = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("pt", {
			"plural": true,
			"units": "milisegundo:|s,segundo:|s,minuto:|s,hora:|s,dia:|s,semana:|s,mês|mêses|mes|meses,ano:|s",
			"months": "jan:eiro|,fev:ereiro|,mar:ço|,abr:il|,mai:o|,jun:ho|,jul:ho|,ago:sto|,set:embro|,out:ubro|,nov:embro|,dez:embro|",
			"weekdays": "dom:ingo|,seg:unda-feira|,ter:ça-feira|,qua:rta-feira|,qui:nta-feira|,sex:ta-feira|,sáb:ado||ado",
			"numerals": "zero,um:|a,dois|duas,três|tres,quatro,cinco,seis,sete,oito,nove,dez",
			"tokens": "a,de",
			"short": "{dd}/{MM}/{yyyy}",
			"medium": "{d} de {Month} de {yyyy}",
			"long": "{d} de {Month} de {yyyy} {time}",
			"full": "{Weekday}, {d} de {Month} de {yyyy} {time}",
			"stamp": "{Dow} {d} {Mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{num} {unit} {sign}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"timeMarkers": "às",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "anteontem",
					"value": -2
				},
				{
					"name": "day",
					"src": "ontem",
					"value": -1
				},
				{
					"name": "day",
					"src": "hoje",
					"value": 0
				},
				{
					"name": "day",
					"src": "amanh:ã|a",
					"value": 1
				},
				{
					"name": "sign",
					"src": "atrás|atras|há|ha",
					"value": -1
				},
				{
					"name": "sign",
					"src": "daqui a",
					"value": 1
				},
				{
					"name": "shift",
					"src": "passad:o|a",
					"value": -1
				},
				{
					"name": "shift",
					"src": "próximo|próxima|proximo|proxima",
					"value": 1
				}
			],
			"parse": [
				"{months} {1?} {year?}",
				"{num} {unit} {sign}",
				"{sign} {num} {unit}",
				"{0?} {unit:5-7} {shift}",
				"{0?} {shift} {unit:5-7}"
			],
			"timeParse": [
				"{shift?} {day|weekday}",
				"{0?} {shift} {weekday}",
				"{date} {1?} {months?} {1?} {year?}"
			],
			"timeFrontParse": ["{shift?} {day|weekday}", "{date} {1?} {months?} {1?} {year?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/ru.js
	var require_ru = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("ru", {
			"firstDayOfWeekYear": 1,
			"units": "миллисекунд:а|у|ы|,секунд:а|у|ы|,минут:а|у|ы|,час:||а|ов,день|день|дня|дней,недел:я|ю|и|ь|е,месяц:||а|ев|е,год|год|года|лет|году",
			"months": "янв:аря||.|арь,фев:раля||р.|раль,мар:та||т,апр:еля||.|ель,мая|май,июн:я||ь,июл:я||ь,авг:уста||.|уст,сен:тября||т.|тябрь,окт:ября||.|ябрь,ноя:бря||брь,дек:абря||.|абрь",
			"weekdays": "воскресенье|вс,понедельник|пн,вторник|вт,среда|ср,четверг|чт,пятница|пт,суббота|сб",
			"numerals": "ноль,од:ин|ну,дв:а|е,три,четыре,пять,шесть,семь,восемь,девять,десять",
			"tokens": "в|на,г\\.?(?:ода)?",
			"short": "{dd}.{MM}.{yyyy}",
			"medium": "{d} {month} {yyyy} г.",
			"long": "{d} {month} {yyyy} г., {time}",
			"full": "{weekday}, {d} {month} {yyyy} г., {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"timeMarkers": "в",
			"ampm": " утра, вечера",
			"modifiers": [
				{
					"name": "day",
					"src": "позавчера",
					"value": -2
				},
				{
					"name": "day",
					"src": "вчера",
					"value": -1
				},
				{
					"name": "day",
					"src": "сегодня",
					"value": 0
				},
				{
					"name": "day",
					"src": "завтра",
					"value": 1
				},
				{
					"name": "day",
					"src": "послезавтра",
					"value": 2
				},
				{
					"name": "sign",
					"src": "назад",
					"value": -1
				},
				{
					"name": "sign",
					"src": "через",
					"value": 1
				},
				{
					"name": "shift",
					"src": "прошл:ый|ой|ом",
					"value": -1
				},
				{
					"name": "shift",
					"src": "следующ:ий|ей|ем",
					"value": 1
				}
			],
			"relative": function(num, unit, ms, format) {
				var numberWithUnit, last = num.toString().slice(-1), mult;
				switch (true) {
					case num >= 11 && num <= 15:
						mult = 3;
						break;
					case last == 1:
						mult = 1;
						break;
					case last >= 2 && last <= 4:
						mult = 2;
						break;
					default: mult = 3;
				}
				numberWithUnit = num + " " + this["units"][mult * 8 + unit];
				switch (format) {
					case "duration": return numberWithUnit;
					case "past": return numberWithUnit + " назад";
					case "future": return "через " + numberWithUnit;
				}
			},
			"parse": [
				"{num} {unit} {sign}",
				"{sign} {num} {unit}",
				"{months} {year?}",
				"{0?} {shift} {unit:5-7}"
			],
			"timeParse": [
				"{day|weekday}",
				"{0?} {shift} {weekday}",
				"{date} {months?} {year?} {1?}"
			],
			"timeFrontParse": ["{0?} {shift} {weekday}", "{date} {months?} {year?} {1?}"]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/sv.js
	var require_sv = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("sv", {
			"plural": true,
			"units": "millisekund:|er,sekund:|er,minut:|er,timm:e|ar,dag:|ar,veck:a|or|an,månad:|er|en+manad:|er|en,år:||et+ar:||et",
			"months": "jan:uari|,feb:ruari|,mar:s|,apr:il|,maj,jun:i|,jul:i|,aug:usti|,sep:tember|,okt:ober|,nov:ember|,dec:ember|",
			"weekdays": "sön:dag|+son:dag|,mån:dag||dagen+man:dag||dagen,tis:dag|,ons:dag|,tor:sdag|,fre:dag|,lör:dag||dag",
			"numerals": "noll,en|ett,två|tva,tre,fyra,fem,sex,sju,åtta|atta,nio,tio",
			"tokens": "den,för|for",
			"articles": "den",
			"short": "{yyyy}-{MM}-{dd}",
			"medium": "{d} {month} {yyyy}",
			"long": "{d} {month} {yyyy} {time}",
			"full": "{weekday} {d} {month} {yyyy} {time}",
			"stamp": "{dow} {d} {mon} {yyyy} {time}",
			"time": "{H}:{mm}",
			"past": "{num} {unit} {sign}",
			"future": "{sign} {num} {unit}",
			"duration": "{num} {unit}",
			"ampm": "am,pm",
			"modifiers": [
				{
					"name": "day",
					"src": "förrgår|i förrgår|iförrgår|forrgar|i forrgar|iforrgar",
					"value": -2
				},
				{
					"name": "day",
					"src": "går|i går|igår|gar|i gar|igar",
					"value": -1
				},
				{
					"name": "day",
					"src": "dag|i dag|idag",
					"value": 0
				},
				{
					"name": "day",
					"src": "morgon|i morgon|imorgon",
					"value": 1
				},
				{
					"name": "day",
					"src": "över morgon|övermorgon|i över morgon|i övermorgon|iövermorgon|over morgon|overmorgon|i over morgon|i overmorgon|iovermorgon",
					"value": 2
				},
				{
					"name": "sign",
					"src": "sedan|sen",
					"value": -1
				},
				{
					"name": "sign",
					"src": "om",
					"value": 1
				},
				{
					"name": "shift",
					"src": "i förra|förra|i forra|forra",
					"value": -1
				},
				{
					"name": "shift",
					"src": "denna",
					"value": 0
				},
				{
					"name": "shift",
					"src": "nästa|nasta",
					"value": 1
				}
			],
			"parse": [
				"{months} {year?}",
				"{num} {unit} {sign}",
				"{sign} {num} {unit}",
				"{1?} {num} {unit} {sign}",
				"{shift} {unit:5-7}"
			],
			"timeParse": [
				"{day|weekday}",
				"{shift} {weekday}",
				"{0?} {weekday?},? {date} {months?}\\.? {year?}"
			],
			"timeFrontParse": [
				"{day|weekday}",
				"{shift} {weekday}",
				"{0?} {weekday?},? {date} {months?}\\.? {year?}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/zh-CN.js
	var require_zh_CN = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("zh-CN", {
			"ampmFront": true,
			"numeralUnits": true,
			"allowsFullWidth": true,
			"timeMarkerOptional": true,
			"units": "毫秒,秒钟,分钟,小时,天,个星期|周,个月,年",
			"weekdays": "星期日|日|周日|星期天,星期一|一|周一,星期二|二|周二,星期三|三|周三,星期四|四|周四,星期五|五|周五,星期六|六|周六",
			"numerals": "〇,一,二,三,四,五,六,七,八,九",
			"placeholders": "十,百,千,万",
			"short": "{yyyy}-{MM}-{dd}",
			"medium": "{yyyy}年{M}月{d}日",
			"long": "{yyyy}年{M}月{d}日{time}",
			"full": "{yyyy}年{M}月{d}日{weekday}{time}",
			"stamp": "{yyyy}年{M}月{d}日{H}:{mm}{dow}",
			"time": "{tt}{h}点{mm}分",
			"past": "{num}{unit}{sign}",
			"future": "{num}{unit}{sign}",
			"duration": "{num}{unit}",
			"timeSuffixes": ",秒,分钟?,点|时,日|号,,月,年",
			"ampm": "上午,下午",
			"modifiers": [
				{
					"name": "day",
					"src": "大前天",
					"value": -3
				},
				{
					"name": "day",
					"src": "前天",
					"value": -2
				},
				{
					"name": "day",
					"src": "昨天",
					"value": -1
				},
				{
					"name": "day",
					"src": "今天",
					"value": 0
				},
				{
					"name": "day",
					"src": "明天",
					"value": 1
				},
				{
					"name": "day",
					"src": "后天",
					"value": 2
				},
				{
					"name": "day",
					"src": "大后天",
					"value": 3
				},
				{
					"name": "sign",
					"src": "前",
					"value": -1
				},
				{
					"name": "sign",
					"src": "后",
					"value": 1
				},
				{
					"name": "shift",
					"src": "上|去",
					"value": -1
				},
				{
					"name": "shift",
					"src": "这",
					"value": 0
				},
				{
					"name": "shift",
					"src": "下|明",
					"value": 1
				}
			],
			"parse": [
				"{num}{unit}{sign}",
				"{shift}{unit:5-7}",
				"{year?}{month}",
				"{year}"
			],
			"timeParse": [
				"{day|weekday}",
				"{shift}{weekday}",
				"{year?}{month?}{date}"
			]
		});
	}));
	//#endregion
	//#region node_modules/sugar-date/locales/zh-TW.js
	var require_zh_TW = /* @__PURE__ */ __commonJSMin((() => {
		require_addLocale()("zh-TW", {
			"ampmFront": true,
			"numeralUnits": true,
			"allowsFullWidth": true,
			"timeMarkerOptional": true,
			"units": "毫秒,秒鐘,分鐘,小時,天,個星期|週,個月,年",
			"weekdays": "星期日|日|週日|星期天,星期一|一|週一,星期二|二|週二,星期三|三|週三,星期四|四|週四,星期五|五|週五,星期六|六|週六",
			"numerals": "〇,一,二,三,四,五,六,七,八,九",
			"placeholders": "十,百,千,万",
			"short": "{yyyy}/{MM}/{dd}",
			"medium": "{yyyy}年{M}月{d}日",
			"long": "{yyyy}年{M}月{d}日{time}",
			"full": "{yyyy}年{M}月{d}日{weekday}{time}",
			"stamp": "{yyyy}年{M}月{d}日{H}:{mm}{dow}",
			"time": "{tt}{h}點{mm}分",
			"past": "{num}{unit}{sign}",
			"future": "{num}{unit}{sign}",
			"duration": "{num}{unit}",
			"timeSuffixes": ",秒,分鐘?,點|時,日|號,,月,年",
			"ampm": "上午,下午",
			"modifiers": [
				{
					"name": "day",
					"src": "大前天",
					"value": -3
				},
				{
					"name": "day",
					"src": "前天",
					"value": -2
				},
				{
					"name": "day",
					"src": "昨天",
					"value": -1
				},
				{
					"name": "day",
					"src": "今天",
					"value": 0
				},
				{
					"name": "day",
					"src": "明天",
					"value": 1
				},
				{
					"name": "day",
					"src": "後天",
					"value": 2
				},
				{
					"name": "day",
					"src": "大後天",
					"value": 3
				},
				{
					"name": "sign",
					"src": "前",
					"value": -1
				},
				{
					"name": "sign",
					"src": "後",
					"value": 1
				},
				{
					"name": "shift",
					"src": "上|去",
					"value": -1
				},
				{
					"name": "shift",
					"src": "這",
					"value": 0
				},
				{
					"name": "shift",
					"src": "下|明",
					"value": 1
				}
			],
			"parse": [
				"{num}{unit}{sign}",
				"{shift}{unit:5-7}",
				"{year?}{month}",
				"{year}"
			],
			"timeParse": [
				"{day|weekday}",
				"{shift}{weekday}",
				"{year?}{month?}{date}"
			]
		});
	}));
	(/* @__PURE__ */ __commonJSMin(((exports, module) => {
		require_ca();
		require_da();
		require_de();
		require_es();
		require_fi();
		require_fr();
		require_it();
		require_ja();
		require_ko();
		require_nl();
		require_no();
		require_pl();
		require_pt();
		require_ru();
		require_sv();
		require_zh_CN();
		require_zh_TW();
		module.exports = require_sugar_core();
	})))();
	/**
	* Wrapper for Sugar Date module providing datetime helpers and locales
	* @export
	* @class DateType
	*/
	var DateType = class DateType extends Feature {
		/**
		* Creates an instance of DateType
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, DateType);
			/**
			* Global locale
			* @type {String}
			*/
			this.locale = tf.locale;
			/**
			* Sugar Date instance
			* @type {Object}
			*/
			this.datetime = import_sugar_date.Date;
			this.enable();
		}
		/**
		* Initialize DateType instance
		*/
		init() {
			if (this.initialized) return;
			this.datetime.setLocale(this.locale);
			this.addConfigFormats(this.tf.colTypes);
			this.emitter.on(["add-date-type-formats"], (tf, types) => this.addConfigFormats(types));
			this.emitter.emit("date-type-initialized", this.tf, this);
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Parse a string representation of a date for a specified locale and return
		* a date object
		* @param {String} dateStr String representation of a date
		* @param {String} localeCode Locale code (ie 'en-us')
		* @returns {Date}
		*/
		parse(dateStr, localeCode) {
			return this.datetime.create(dateStr, localeCode);
		}
		/**
		* Check string representation of a date for a specified locale is valid
		* @param {any} dateStr String representation of a date
		* @param {any} localeCode Locale code (ie 'en-us')
		* @returns {Boolean}
		*/
		isValid(dateStr, localeCode) {
			return this.datetime.isValid(this.parse(dateStr, localeCode));
		}
		/**
		* Return the type object of a specified column as per configuration or
		* passed collection
		* @param {Number} colIndex Column index
		* @param {Array} types Collection of column types, optional
		* @returns {Object}
		*/
		getOptions(colIndex, types) {
			types = types || this.tf.colTypes;
			let colType = types[colIndex];
			return isObj(colType) ? colType : {};
		}
		/**
		* Return the locale code for supplied column index as per configuration
		* or global setting
		* @param {Number} colIndex Column index
		* @returns {String} Locale code (ie: 'en-us')
		*/
		getLocale(colIndex) {
			return this.getOptions(colIndex).locale || this.locale;
		}
		/**
		* Add date time format(s) to a locale as specified by the passed
		* collection of column types, ie:
		*  [
		*      'string',
		*      'number',
		*      { type: 'date', locale: 'en', format: ['{dd}/{MM}/{yyyy}']}
		* ]
		*
		* @param {Array} [types=[]] Collection of column types
		*/
		addConfigFormats(types = []) {
			types.forEach((type, idx) => {
				let options = this.getOptions(idx, types);
				if (options.type === "date" && options.hasOwnProperty("format")) {
					let locale = this.datetime.getLocale(options.locale || this.locale);
					let formats = isArray(options.format) ? options.format : [options.format];
					try {
						formats.forEach((format) => {
							locale.addFormat(format);
						});
					} catch (ex) {
						root.console.error(ex);
					}
				}
			});
		}
		/**
		* Remove DateType instance
		*/
		destroy() {
			if (!this.initialized) return;
			this.emitter.off(["add-date-type-formats"], (tf, types) => this.addConfigFormats(types));
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/help.js
	/**
	* Help UI component
	*/
	var Help = class Help extends Feature {
		/**
		* Creates an instance of Help
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, Help);
			let f = this.config.help_instructions || {};
			/**
			* ID of main custom container element
			* @type {String}
			*/
			this.tgtId = defaultsStr(f.target_id, null);
			/**
			* ID of custom container element for instructions
			* @type {String}
			*/
			this.contTgtId = defaultsStr(f.container_target_id, null);
			/**
			* Instructions text (accepts HTML)
			* @type {String}
			*/
			this.instrText = !isEmpty(f.text) ? f.text : "Use the filters above each column to filter and limit table data. Advanced searches can be performed by using the following operators: <br /><b>&lt;</b>, <b>&lt;=</b>, <b>&gt;</b>, <b>&gt;=</b>, <b>=</b>, <b>*</b>, <b>!</b>, <b>{</b>, <b>}</b>, <b>||</b>,<b>&amp;&amp;</b>, <b>[empty]</b>, <b>[nonempty]</b>, <b>rgx:</b><br/><a href=\"https://github.com/koalyptus/TableFilter/wiki/4.-Filter-operators\" target=\"_blank\">Learn more</a><hr/>";
			/**
			* Instructions HTML
			* @type {String}
			*/
			this.instrHtml = defaultsStr(f.html, null);
			/**
			* Help button text ('?')
			* @type {String}
			*/
			this.btnText = defaultsStr(f.btn_text, "?");
			/**
			* Custom help button HTML
			* @type {String}
			*/
			this.btnHtml = defaultsStr(f.btn_html, null);
			/**
			* Css class for help button
			* @type {String}
			*/
			this.btnCssClass = defaultsStr(f.btn_css_class, "helpBtn");
			/**
			* Css class for help container element
			* @type {String}
			*/
			this.contCssClass = defaultsStr(f.container_css_class, "helpCont");
			/**
			* Button DOM element
			* @type {DOMElement}
			*/
			this.btn = null;
			/**
			* Help container DOM element
			* @type {DOMElement}
			*/
			this.cont = null;
			/**
			* Adjust container left position when table's horizontal scroll is
			* on, typically when `responsive` option is enabled.
			* @type {Number}
			* @defaultValue 25
			*/
			this.contAdjustLeftPosition = defaultsNb(f.container_adjust_left_position, 25);
			/**
			* Bound mouseup wrapper
			* @private
			*/
			this.boundMouseup = null;
			/**
			* Default HTML appended to instructions text
			* @type {String}
			*/
			this.defaultHtml = "<div class=\"helpFooter\"><h4>TableFilter v" + tf.version + "</h4><a href=\"https://www.tablefilter.com/\" target=\"_blank\">https://www.tablefilter.com/</a><br/><span>&copy;2015-" + tf.year + " Max Guglielmi</span><div align=\"center\" style=\"margin-top:8px;\"><a href=\"javascript:void(0);\" class=\"close\">Close</a></div></div>";
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, RIGHT);
			this.emitter.on(["init-help"], () => this.init());
		}
		/**
		* Mouse-up event handler handling popup auto-close behaviour
		* @private
		*/
		onMouseup(evt) {
			let targetElm = targetEvt(evt);
			while (targetElm && targetElm !== this.cont && targetElm !== this.btn) targetElm = targetElm.parentNode;
			if (targetElm !== this.cont && targetElm !== this.btn) this.toggle();
		}
		/**
		* Initialise Help instance
		*/
		init() {
			if (this.initialized) return;
			this.emitter.emit("initializing-feature", this, !isNull(this.tgtId));
			let tf = this.tf;
			let btn = createElm("span");
			let cont = createElm("div");
			this.boundMouseup = this.onMouseup.bind(this);
			(!this.tgtId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.tgtId)).appendChild(btn);
			let divContainer = !this.contTgtId ? btn : elm(this.contTgtId);
			if (!this.btnHtml) {
				divContainer.appendChild(cont);
				let helplink = createElm("a", ["href", "javascript:void(0);"]);
				helplink.className = this.btnCssClass;
				helplink.appendChild(createText(this.btnText));
				btn.appendChild(helplink);
				addEvt(helplink, "click", () => this.toggle());
			} else {
				btn.innerHTML = this.btnHtml;
				let helpEl = btn.firstChild;
				addEvt(helpEl, "click", () => this.toggle());
				divContainer.appendChild(cont);
			}
			if (!this.instrHtml) {
				cont.innerHTML = this.instrText;
				cont.className = this.contCssClass;
			} else {
				if (this.contTgtId) divContainer.appendChild(cont);
				cont.innerHTML = this.instrHtml;
				if (!this.contTgtId) cont.className = this.contCssClass;
			}
			cont.innerHTML += this.defaultHtml;
			addEvt(cont, "click", () => this.toggle());
			this.cont = cont;
			this.btn = btn;
			/** @inherited */
			this.initialized = true;
			this.emitter.emit("feature-initialized", this);
		}
		/**
		* Toggle help pop-up
		*/
		toggle() {
			if (!this.isEnabled()) return;
			removeEvt(root, "mouseup", this.boundMouseup);
			let divDisplay = this.cont.style.display;
			if (divDisplay === "" || divDisplay === "none") {
				this.cont.style.display = "inline";
				if (this.tf.dom().scrollLeft > 0) this.cont.style.left = `${this.btn.offsetLeft - this.tf.dom().scrollLeft + this.contAdjustLeftPosition}px`;
				addEvt(root, "mouseup", this.boundMouseup);
			} else {
				this.cont.style.display = NONE;
				this.cont.style.left = "";
			}
		}
		/**
		* Remove help UI
		*/
		destroy() {
			if (!this.initialized) return;
			removeElm(this.btn);
			this.btn = null;
			removeElm(this.cont);
			this.cont = null;
			this.boundMouseup = null;
			this.initialized = false;
		}
	};
	Help.meta = { alwaysInstantiate: true };
	//#endregion
	//#region src/modules/hash.js
	var JSON$1 = root.JSON;
	var location$1 = root.location;
	var decodeURIComponent = root.decodeURIComponent;
	var encodeURIComponent = root.encodeURIComponent;
	/**
	* Checks if browser has onhashchange event
	*/
	var hasHashChange = () => {
		let docMode = root.documentMode;
		return "onhashchange" in root && (docMode === void 0 || docMode > 7);
	};
	/**
	* Manages state via URL hash changes
	*
	* @export
	* @class Hash
	*/
	var Hash = class {
		/**
		* Creates an instance of Hash
		*
		* @param {State} state Instance of State
		*/
		constructor(state) {
			/**
			* State object
			* @type {State}
			*/
			this.state = state;
			/**
			* Cached URL hash
			* @type {String} Hash string
			* @private
			*/
			this.lastHash = null;
			/**
			* Application event emitter instance
			* @type {Emitter}
			*/
			this.emitter = state.emitter;
			/**
			* Bound sync wrapper for future use
			* @private
			*/
			this.boundSync = null;
		}
		/**
		* Initializes the Hash object
		*/
		init() {
			if (!hasHashChange()) return;
			this.lastHash = location$1.hash;
			this.boundSync = this.sync.bind(this);
			this.emitter.on(["state-changed"], (tf, state) => this.update(state));
			this.emitter.on(["initialized"], this.boundSync);
			addEvt(root, "hashchange", this.boundSync);
		}
		/**
		* Updates the URL hash based on a state change
		*
		* @param {State} state Instance of State
		*/
		update(state) {
			let hash = `#${encodeURIComponent(JSON$1.stringify(state))}`;
			if (this.lastHash === hash) return;
			location$1.hash = hash;
			this.lastHash = hash;
		}
		/**
		* Converts a URL hash into a JSON object
		*
		* @param {String} hash URL hash fragment
		* @returns {Object} JSON object
		*/
		parse(hash) {
			if (hash.indexOf("#") === -1) return null;
			hash = hash.substr(1);
			return JSON$1.parse(decodeURIComponent(hash));
		}
		/**
		* Applies current hash state to features
		*/
		sync() {
			let state = this.parse(location$1.hash);
			if (!state) return;
			this.state.overrideAndSync(state);
		}
		/**
		* Release Hash event subscriptions and clear fields
		*/
		destroy() {
			this.emitter.off(["state-changed"], (tf, state) => this.update(state));
			this.emitter.off(["initialized"], this.boundSync);
			removeEvt(root, "hashchange", this.boundSync);
			this.state = null;
			this.lastHash = null;
			this.emitter = null;
		}
	};
	//#endregion
	//#region src/cookie.js
	/**
	* Cookie utilities
	*/
	var doc$1 = root.document;
	var cookie_default = {
		/**
		* Write a cookie
		* @param {String} name Name of the cookie
		* @param {String} value Value of the cookie
		* @param {Number} hours Cookie duration in hours
		*/
		write(name, value, hours) {
			let expire = "";
			if (hours) {
				expire = new Date((/* @__PURE__ */ new Date()).getTime() + hours * 36e5);
				expire = "; expires=" + expire.toGMTString();
			}
			doc$1.cookie = name + "=" + escape(value) + expire;
		},
		/**
		* Read a cookie
		* @param {String} name Name of the cookie
		* @returns {String} Value of the cookie
		*/
		read(name) {
			let cookieValue = "", search = name + "=";
			if (doc$1.cookie.length > 0) {
				let cookie = doc$1.cookie, offset = cookie.indexOf(search);
				if (offset !== -1) {
					offset += search.length;
					let end = cookie.indexOf(";", offset);
					if (end === -1) end = cookie.length;
					cookieValue = unescape(cookie.substring(offset, end));
				}
			}
			return cookieValue;
		},
		/**
		* Remove a cookie
		* @param {String} name Name of the cookie
		*/
		remove(name) {
			this.write(name, "", -1);
		}
	};
	//#endregion
	//#region src/modules/storage.js
	var JSON = root.JSON;
	var localStorage = root.localStorage;
	var location = root.location;
	/**
	* Checks if browser has Storage feature
	*/
	var hasStorage = () => {
		return "Storage" in root;
	};
	/**
	* Stores the features state in browser's local storage or cookie
	*
	* @export
	* @class Storage
	*/
	var Storage = class {
		/**
		* Creates an instance of Storage
		*
		* @param {State} state Instance of State
		*/
		constructor(state) {
			/**
			* State object
			* @type {State}
			* @private
			*/
			this.state = state;
			/**
			* TableFilter object
			* @type {TableFilter}
			* @private
			*/
			this.tf = state.tf;
			/**
			* Persist with local storage
			* @type {Boolean}
			* @private
			*/
			this.enableLocalStorage = state.enableLocalStorage && hasStorage();
			/**
			* Persist with cookie
			* @type {Boolean}
			* @private
			*/
			this.enableCookie = state.enableCookie && !this.enableLocalStorage;
			/**
			* Emitter object
			* @type {Emitter}
			* @private
			*/
			this.emitter = state.emitter;
			/**
			* Cookie duration in hours from state object
			* @type {Number}
			* @private
			*/
			this.duration = state.cookieDuration;
		}
		/**
		* Initializes the Storage object
		*/
		init() {
			this.emitter.on(["state-changed"], (tf, state) => this.save(state));
			this.emitter.on(["initialized"], () => this.sync());
		}
		/**
		* Persists the features state on state changes
		*
		* @param {State} state Instance of State
		*/
		save(state) {
			if (this.enableLocalStorage) localStorage[this.getKey()] = JSON.stringify(state);
			else cookie_default.write(this.getKey(), JSON.stringify(state), this.duration);
		}
		/**
		* Turns stored string into a State JSON object
		*
		*  @returns {Object} JSON object
		*/
		retrieve() {
			let state = null;
			if (this.enableLocalStorage) state = localStorage[this.getKey()];
			else state = cookie_default.read(this.getKey());
			if (!state) return null;
			return JSON.parse(state);
		}
		/**
		* Removes persisted state from storage
		*/
		remove() {
			if (this.enableLocalStorage) localStorage.removeItem(this.getKey());
			else cookie_default.remove(this.getKey());
		}
		/**
		* Applies persisted state to features
		*/
		sync() {
			let state = this.retrieve();
			if (!state) return;
			this.state.overrideAndSync(state);
		}
		/**
		* Returns the storage key
		*
		* @returns {String} Key
		*/
		getKey() {
			return JSON.stringify({
				key: `${this.tf.prfxTf}_${this.tf.id}`,
				path: location.pathname
			});
		}
		/**
		* Release Storage event subscriptions and clear fields
		*/
		destroy() {
			this.emitter.off(["state-changed"], (tf, state) => this.save(state));
			this.emitter.off(["initialized"], () => this.sync());
			this.remove();
			this.state = null;
			this.emitter = null;
		}
	};
	//#endregion
	//#region src/modules/state.js
	/**
	* Features state object persistable with localStorage, cookie or URL hash
	*
	* @export
	* @class State
	* @extends {Feature}
	*/
	var State = class State extends Feature {
		/**
		* Creates an instance of State
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, State);
			let cfg = this.config.state || {};
			/**
			* Determines whether state is persisted with URL hash
			* @type {Boolean}
			*/
			this.enableHash = cfg === true || isArray(cfg.types) && cfg.types.indexOf("hash") !== -1;
			/**
			* Determines whether state is persisted with localStorage
			* @type {Boolean}
			*/
			this.enableLocalStorage = isArray(cfg.types) && cfg.types.indexOf("local_storage") !== -1;
			/**
			* Determines whether state is persisted with localStorage
			* @type {Boolean}
			*/
			this.enableCookie = isArray(cfg.types) && cfg.types.indexOf("cookie") !== -1;
			/**
			* Persist filters values, enabled by default
			* @type {Boolean}
			*/
			this.persistFilters = defaultsBool(cfg.filters, true);
			/**
			* Persist current page number when paging is enabled
			* @type {Boolean}
			*/
			this.persistPageNumber = Boolean(cfg.page_number);
			/**
			* Persist page length when paging is enabled
			* @type {Boolean}
			*/
			this.persistPageLength = Boolean(cfg.page_length);
			/**
			* Persist column sorting
			* @type {Boolean}
			*/
			this.persistSort = Boolean(cfg.sort);
			/**
			* Persist columns visibility
			* @type {Boolean}
			*/
			this.persistColsVisibility = Boolean(cfg.columns_visibility);
			/**
			* Persist filters row visibility
			* @type {Boolean}
			*/
			this.persistFiltersVisibility = Boolean(cfg.filters_visibility);
			/**
			* Cookie duration in hours
			* @type {Boolean}
			*/
			this.cookieDuration = defaultsNb(parseInt(cfg.cookie_duration, 10), 87600);
			/**
			* Enable Storage if localStorage or cookie is required
			* @type {Boolean}
			* @private
			*/
			this.enableStorage = this.enableLocalStorage || this.enableCookie;
			/**
			* Storage instance if storage is required
			* @type {Storage}
			* @private
			*/
			this.storage = null;
			/**
			* Hash instance if URL hash is required
			* @type {Boolean}
			* @private
			*/
			this.hash = null;
			/**
			* Current page number
			* @type {Number}
			* @private
			*/
			this.pageNb = null;
			/**
			* Current page length
			* @type {Number}
			* @private
			*/
			this.pageLength = null;
			/**
			* Current column sorting
			* @type {Object}
			* @private
			*/
			this.sort = null;
			/**
			* Current hidden columns
			* @type {Object}
			* @private
			*/
			this.hiddenCols = null;
			/**
			* Filters row visibility
			* @type {Boolean}
			* @private
			*/
			this.filtersVisibility = null;
			/**
			* State object
			* @type {Object}
			* @private
			*/
			this.state = {};
			/**
			* Prefix for column ID
			* @type {String}
			* @private
			*/
			this.prfxCol = "col_";
			/**
			* Prefix for page number ID
			* @type {String}
			* @private
			*/
			this.pageNbKey = "page";
			/**
			* Prefix for page length ID
			* @type {String}
			* @private
			*/
			this.pageLengthKey = "page_length";
			/**
			* Prefix for filters visibility ID
			* @type {String}
			* @private
			*/
			this.filtersVisKey = "filters_visibility";
		}
		/**
		* Initializes State instance
		*/
		init() {
			if (this.initialized) return;
			this.emitter.on(["after-filtering"], () => this.update());
			this.emitter.on(["after-page-change", "after-clearing-filters"], (tf, pageNb) => this.updatePage(pageNb));
			this.emitter.on(["after-page-length-change"], (tf, pageLength) => this.updatePageLength(pageLength));
			this.emitter.on(["column-sorted"], (tf, index, descending) => this.updateSort(index, descending));
			this.emitter.on(["sort-initialized"], () => this._syncSort());
			this.emitter.on(["columns-visibility-initialized"], () => this._syncColsVisibility());
			this.emitter.on(["column-shown", "column-hidden"], (tf, feature, colIndex, hiddenCols) => this.updateColsVisibility(hiddenCols));
			this.emitter.on(["filters-visibility-initialized"], () => this._syncFiltersVisibility());
			this.emitter.on(["filters-toggled"], (tf, extension, visible) => this.updateFiltersVisibility(visible));
			if (this.enableHash) {
				this.hash = new Hash(this);
				this.hash.init();
			}
			if (this.enableStorage) {
				this.storage = new Storage(this);
				this.storage.init();
			}
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Update state object based on current features state
		*/
		update() {
			if (!this.isEnabled()) return;
			let state = this.state;
			let tf = this.tf;
			if (this.persistFilters) tf.getFiltersValue().forEach((val, idx) => {
				let key = `${this.prfxCol}${idx}`;
				if (isString(val) && isEmpty$1(val)) {
					if (state.hasOwnProperty(key)) state[key].flt = void 0;
				} else {
					state[key] = state[key] || {};
					state[key].flt = val;
				}
			});
			if (this.persistPageNumber) {
				if (isNull(this.pageNb)) state[this.pageNbKey] = void 0;
				else state[this.pageNbKey] = this.pageNb;
			}
			if (this.persistPageLength) {
				if (isNull(this.pageLength)) state[this.pageLengthKey] = void 0;
				else state[this.pageLengthKey] = this.pageLength;
			}
			if (this.persistSort) {
				if (!isNull(this.sort)) {
					Object.keys(state).forEach((key) => {
						if (key.indexOf(this.prfxCol) !== -1 && state[key]) state[key].sort = void 0;
					});
					let key = `${this.prfxCol}${this.sort.column}`;
					state[key] = state[key] || {};
					state[key].sort = { descending: this.sort.descending };
				}
			}
			if (this.persistColsVisibility) {
				if (!isNull(this.hiddenCols)) {
					Object.keys(state).forEach((key) => {
						if (key.indexOf(this.prfxCol) !== -1 && state[key]) state[key].hidden = void 0;
					});
					this.hiddenCols.forEach((colIdx) => {
						let key = `${this.prfxCol}${colIdx}`;
						state[key] = state[key] || {};
						state[key].hidden = true;
					});
				}
			}
			if (this.persistFiltersVisibility) {
				if (isNull(this.filtersVisibility)) state[this.filtersVisKey] = void 0;
				else state[this.filtersVisKey] = this.filtersVisibility;
			}
			this.emitter.emit("state-changed", tf, state);
		}
		/**
		* Refresh page number field on page number changes
		*
		* @param {Number} pageNb Current page number
		*/
		updatePage(pageNb) {
			this.pageNb = pageNb;
			this.update();
		}
		/**
		* Refresh page length field on page length changes
		*
		* @param {Number} pageLength Current page length value
		*/
		updatePageLength(pageLength) {
			this.pageLength = pageLength;
			this.update();
		}
		/**
		* Refresh column sorting information on sort changes
		*
		* @param index {Number} Column index
		* @param {Boolean} descending Descending manner
		*/
		updateSort(index, descending) {
			this.sort = {
				column: index,
				descending
			};
			this.update();
		}
		/**
		* Refresh hidden columns information on columns visibility changes
		*
		* @param {Array} hiddenCols Columns indexes
		*/
		updateColsVisibility(hiddenCols) {
			this.hiddenCols = hiddenCols;
			this.update();
		}
		/**
		* Refresh filters visibility on filters visibility change
		*
		* @param {Boolean} visible Visibility flad
		*/
		updateFiltersVisibility(visible) {
			this.filtersVisibility = visible;
			this.update();
		}
		/**
		* Override state field
		*
		* @param state State object
		*/
		override(state) {
			this.state = state;
			this.emitter.emit("state-changed", this.tf, state);
		}
		/**
		* Sync stored features state
		*/
		sync() {
			let state = this.state;
			let tf = this.tf;
			this._syncFilters();
			if (this.persistPageNumber) {
				let pageNumber = state[this.pageNbKey];
				this.emitter.emit("change-page", tf, pageNumber);
			}
			if (this.persistPageLength) {
				let pageLength = state[this.pageLengthKey];
				this.emitter.emit("change-page-results", tf, pageLength);
			}
			this._syncSort();
			this._syncColsVisibility();
			this._syncFiltersVisibility();
		}
		/**
		* Override current state with passed one and sync features
		*
		* @param {Object} state State object
		*/
		overrideAndSync(state) {
			this.disable();
			this.override(state);
			this.sync();
			this.enable();
		}
		/**
		* Sync filters with stored values and filter table
		*
		* @private
		*/
		_syncFilters() {
			if (!this.persistFilters) return;
			let state = this.state;
			let tf = this.tf;
			tf.eachCol((colIdx) => tf.setFilterValue(colIdx, ""));
			Object.keys(state).forEach((key) => {
				if (key.indexOf(this.prfxCol) !== -1) {
					let colIdx = parseInt(key.replace(this.prfxCol, ""), 10);
					let val = state[key].flt;
					tf.setFilterValue(colIdx, val);
				}
			});
			tf.filter();
		}
		/**
		* Sync sorted column with stored sorting information and sort table
		*
		* @private
		*/
		_syncSort() {
			if (!this.persistSort) return;
			let state = this.state;
			let tf = this.tf;
			Object.keys(state).forEach((key) => {
				if (key.indexOf(this.prfxCol) !== -1) {
					let colIdx = parseInt(key.replace(this.prfxCol, ""), 10);
					if (!isUndef(state[key].sort)) {
						let sort = state[key].sort;
						this.emitter.emit("sort", tf, colIdx, sort.descending);
					}
				}
			});
		}
		/**
		* Sync hidden columns with stored information
		*
		* @private
		*/
		_syncColsVisibility() {
			if (!this.persistColsVisibility) return;
			let state = this.state;
			let tf = this.tf;
			let hiddenCols = [];
			Object.keys(state).forEach((key) => {
				if (key.indexOf(this.prfxCol) !== -1) {
					let colIdx = parseInt(key.replace(this.prfxCol, ""), 10);
					if (!isUndef(state[key].hidden)) hiddenCols.push(colIdx);
				}
			});
			hiddenCols.forEach((colIdx) => {
				this.emitter.emit("hide-column", tf, colIdx);
			});
		}
		/**
		* Sync filters visibility with stored information
		*
		* @private
		*/
		_syncFiltersVisibility() {
			if (!this.persistFiltersVisibility) return;
			let state = this.state;
			let tf = this.tf;
			let filtersVisibility = state[this.filtersVisKey];
			this.filtersVisibility = filtersVisibility;
			this.emitter.emit("show-filters", tf, filtersVisibility);
		}
		/**
		* Destroy State instance
		*/
		destroy() {
			if (!this.initialized) return;
			this.state = {};
			this.emitter.off(["after-filtering"], () => this.update());
			this.emitter.off(["after-page-change", "after-clearing-filters"], (tf, pageNb) => this.updatePage(pageNb));
			this.emitter.off(["after-page-length-change"], (tf, index) => this.updatePageLength(index));
			this.emitter.off(["column-sorted"], (tf, index, descending) => this.updateSort(index, descending));
			this.emitter.off(["sort-initialized"], () => this._syncSort());
			this.emitter.off(["columns-visibility-initialized"], () => this._syncColsVisibility());
			this.emitter.off(["column-shown", "column-hidden"], (tf, feature, colIndex, hiddenCols) => this.updateColsVisibility(hiddenCols));
			this.emitter.off(["filters-visibility-initialized"], () => this._syncFiltersVisibility());
			this.emitter.off(["filters-toggled"], (tf, extension, visible) => this.updateFiltersVisibility(visible));
			if (this.enableHash) {
				this.hash.destroy();
				this.hash = null;
			}
			if (this.enableStorage) {
				this.storage.destroy();
				this.storage = null;
			}
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/gridLayout.js
	/**
	* Grid layout, table with fixed headers
	*/
	var GridLayout = class GridLayout extends Feature {
		/**
		* Creates an instance of GridLayout
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, GridLayout);
			let f = this.config.grid_layout || {};
			/**
			* Grid-layout container width as CSS string
			* @type {String}
			*/
			this.width = defaultsStr(f.width, null);
			/**
			* Grid-layout container height as CSS string
			* @type {String}
			*/
			this.height = defaultsStr(f.height, null);
			/**
			* Css class for main container element
			* @type {String}
			*/
			this.mainContCssClass = defaultsStr(f.cont_css_class, "grd_Cont");
			/**
			* Css class for body table container element
			* @type {String}
			*/
			this.contCssClass = defaultsStr(f.tbl_cont_css_class, "grd_tblCont");
			/**
			* Css class for headers table container element
			* @type {String}
			*/
			this.headContCssClass = defaultsStr(f.tbl_head_css_class, "grd_headTblCont");
			/**
			* Css class for toolbar container element (rows counter, paging etc.)
			* @type {String}
			*/
			this.infDivCssClass = defaultsStr(f.inf_grid_css_class, "grd_inf");
			/**
			* Index of the headers row, default: 0
			* @type {Number}
			*/
			this.headRowIndex = defaultsNb(f.headers_row_index, 0);
			/**
			* Collection of the header row indexes to be moved into headers table
			* @type {Array}
			*/
			this.headRows = defaultsArr(f.headers_rows, [0]);
			/**
			* Enable or disable column filters generation, default: true
			* @type {Boolean}
			*/
			this.filters = defaultsBool(f.filters, true);
			/**
			* Enable or disable column headers, default: false
			* @type {Boolean}
			*/
			this.noHeaders = Boolean(f.no_headers);
			/**
			* Grid-layout default column widht as CSS string
			* @type {String}
			*/
			this.defaultColWidth = defaultsStr(f.default_col_width, "100px");
			/**
			* List of column elements
			* @type {Array}
			* @private
			*/
			this.colElms = [];
			/**
			* Prefix for grid-layout filter's cell ID
			* @type {String}
			* @private
			*/
			this.prfxGridFltTd = "_td_";
			/**
			* Prefix for grid-layout header's cell ID
			* @type {String}
			* @private
			*/
			this.prfxGridTh = "tblHeadTh_";
			/**
			* Mark-up of original HTML table
			* @type {String}
			* @private
			*/
			this.sourceTblHtml = tf.dom().outerHTML;
			/**
			* Indicates if working table has column elements
			* @type {Boolean}
			* @private
			*/
			this.tblHasColTag = tag(tf.dom(), "col").length > 0 ? true : false;
			/**
			* Main container element
			* @private
			*/
			this.tblMainCont = null;
			/**
			* Table container element
			* @private
			*/
			this.tblCont = null;
			/**
			* Headers' table container element
			* @private
			*/
			this.headTblCont = null;
			/**
			* Headers' table element
			* @private
			*/
			this.headTbl = null;
			tf.fltGrid = this.filters;
		}
		/**
		* Generates a grid with fixed headers
		* TODO: reduce size of init by extracting single purposed methods
		*/
		init() {
			let tf = this.tf;
			let tbl = tf.dom();
			if (this.initialized) return;
			this.setOverrides();
			this.setDefaultColWidths();
			this.tblMainCont = this.createContainer("div", this.mainContCssClass);
			if (this.width) this.tblMainCont.style.width = this.width;
			tbl.parentNode.insertBefore(this.tblMainCont, tbl);
			this.tblCont = this.createContainer("div", this.contCssClass);
			this.setConfigWidth(this.tblCont);
			if (this.height) this.tblCont.style.height = this.height;
			tbl.parentNode.insertBefore(this.tblCont, tbl);
			let t = removeElm(tbl);
			this.tblCont.appendChild(t);
			if (tbl.style.width === "") {
				let tblW = this.initialTableWidth();
				tbl.style.width = (contains("%", tblW) ? tbl.clientWidth : tblW) + "px";
			}
			let d = removeElm(this.tblCont);
			this.tblMainCont.appendChild(d);
			this.headTblCont = this.createContainer("div", this.headContCssClass);
			this.headTbl = createElm("table");
			let tH = createElm("tHead");
			let hRow = tbl.rows[this.headRowIndex];
			let sortTriggers = this.getSortTriggerIds(hRow);
			let filtersRow = this.createFiltersRow();
			this.setHeadersRow(tH);
			this.headTbl.appendChild(tH);
			if (tf.filtersRowIndex === 0) tH.insertBefore(filtersRow, hRow);
			else tH.appendChild(filtersRow);
			this.headTblCont.appendChild(this.headTbl);
			this.tblCont.parentNode.insertBefore(this.headTblCont, this.tblCont);
			let thead = tag(tbl, "thead");
			if (thead.length > 0) tbl.removeChild(thead[0]);
			this.headTbl.style.tableLayout = "fixed";
			tbl.style.tableLayout = "fixed";
			tf.setColWidths(this.headTbl);
			this.headTbl.style.width = tbl.style.width;
			addEvt(this.tblCont, "scroll", (evt) => {
				let scrollLeft = targetEvt(evt).scrollLeft;
				this.headTblCont.scrollLeft = scrollLeft;
			});
			let sort = tf.extension("sort");
			if (sort) {
				sort.asyncSort = true;
				sort.triggerIds = sortTriggers;
			}
			this.setColumnElements();
			if (tf.popupFilters) filtersRow.style.display = NONE;
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Overrides TableFilter instance properties to adjust to grid layout mode
		* @private
		*/
		setOverrides() {
			let tf = this.tf;
			tf.refRow = 0;
			tf.headersRow = 0;
			tf.filtersRowIndex = 1;
		}
		/**
		* Set grid-layout default column widths if column widths are not defined
		* @private
		*/
		setDefaultColWidths() {
			let tf = this.tf;
			if (tf.colWidths.length > 0) return;
			tf.eachCol((k) => {
				let colW;
				let cell = tf.dom().rows[tf.getHeadersRowIndex()].cells[k];
				if (cell.width !== "") colW = cell.width;
				else if (cell.style.width !== "") colW = parseInt(cell.style.width, 10);
				else colW = this.defaultColWidth;
				tf.colWidths[k] = colW;
			});
			tf.setColWidths();
		}
		/**
		* Initial table width
		* @returns {Number}
		* @private
		*/
		initialTableWidth() {
			let tbl = this.tf.dom();
			let width;
			if (tbl.width !== "") width = tbl.width;
			else if (tbl.style.width !== "") width = tbl.style.width;
			else width = tbl.clientWidth;
			return parseInt(width, 10);
		}
		/**
		* Creates container element
		* @param {String} tag Tag name
		* @param {String} className Css class to assign to element
		* @returns {DOMElement}
		* @private
		*/
		createContainer(tag, className) {
			let element = createElm(tag);
			element.className = className;
			return element;
		}
		/**
		* Creates filters row with cells
		* @returns {HTMLTableRowElement}
		* @private
		*/
		createFiltersRow() {
			let tf = this.tf;
			let filtersRow = createElm("tr");
			if (this.filters && tf.fltGrid) {
				tf.externalFltIds = [];
				tf.eachCol((j) => {
					let fltTdId = `${tf.prfxFlt + j + this.prfxGridFltTd + tf.id}`;
					let cl = createElm(tf.fltCellTag, ["id", fltTdId]);
					filtersRow.appendChild(cl);
					tf.externalFltIds[j] = fltTdId;
				});
			}
			return filtersRow;
		}
		/**
		* Generates column elements if necessary and assigns their widths
		* @private
		*/
		setColumnElements() {
			let tf = this.tf;
			let cols = tag(tf.dom(), "col");
			this.tblHasColTag = cols.length > 0;
			for (let k = tf.getCellsNb() - 1; k >= 0; k--) {
				let col;
				if (!this.tblHasColTag) {
					col = createElm("col");
					tf.dom().insertBefore(col, tf.dom().firstChild);
				} else col = cols[k];
				col.style.width = tf.colWidths[k];
				this.colElms[k] = col;
			}
			this.tblHasColTag = true;
		}
		/**
		* Sets headers row in headers table
		* @param {HTMLHeadElement} tableHead Table head element
		* @private
		*/
		setHeadersRow(tableHead) {
			if (this.noHeaders) tableHead.appendChild(createElm("tr"));
			else for (let i = 0; i < this.headRows.length; i++) {
				let row = this.tf.dom().rows[this.headRows[i]];
				tableHead.appendChild(row);
			}
		}
		/**
		* Sets width defined in configuration to passed element
		* @param {DOMElement} element DOM element
		* @private
		*/
		setConfigWidth(element) {
			if (!this.width) return;
			if (this.width.indexOf("%") !== -1) element.style.width = "100%";
			else element.style.width = this.width;
		}
		/**
		* Returns a list of header IDs used for specifing external sort triggers
		* @param {HTMLTableRowElement} row DOM row element
		* @returns {Array} List of IDs
		* @private
		*/
		getSortTriggerIds(row) {
			let tf = this.tf;
			let sortTriggers = [];
			tf.eachCol((n) => {
				let c = row.cells[n];
				let thId = c.getAttribute("id");
				if (!thId || thId === "") {
					thId = `${this.prfxGridTh + n}_${tf.id}`;
					c.setAttribute("id", thId);
				}
				sortTriggers.push(thId);
			});
			return sortTriggers;
		}
		/**
		* Removes the grid layout
		*/
		destroy() {
			let tf = this.tf;
			let tbl = tf.dom();
			if (!this.initialized) return;
			let t = removeElm(tbl);
			this.tblMainCont.parentNode.insertBefore(t, this.tblMainCont);
			removeElm(this.tblMainCont);
			this.tblMainCont = null;
			this.headTblCont = null;
			this.headTbl = null;
			this.tblCont = null;
			tbl.outerHTML = this.sourceTblHtml;
			this.tf.tbl = elm(tf.id);
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/loader.js
	var BEFORE_ACTION_EVENTS = [
		"before-filtering",
		"before-populating-filter",
		"before-page-change",
		"before-clearing-filters",
		"before-page-length-change",
		"before-reset-page",
		"before-reset-page-length",
		"before-loading-extensions",
		"before-loading-themes"
	];
	var AFTER_ACTION_EVENTS = [
		"after-filtering",
		"after-populating-filter",
		"after-page-change",
		"after-clearing-filters",
		"after-page-length-change",
		"after-reset-page",
		"after-reset-page-length",
		"after-loading-extensions",
		"after-loading-themes"
	];
	/**
	* Activity indicator
	*
	* @export
	* @class Loader
	* @extends {Feature}
	*/
	var Loader = class Loader extends Feature {
		/**
		* Creates an instance of Loader.
		*
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, Loader);
			let f = this.config.loader || {};
			/**
			* ID of custom container element
			* @type {String}
			*/
			this.targetId = defaultsStr(f.target_id, null);
			/**
			* Loader container DOM element
			* @type {DOMElement}
			*/
			this.cont = null;
			/**
			* Text displayed when indicator is visible
			* @type {String}
			*/
			this.text = defaultsStr(f.text, "Loading...");
			/**
			* Custom HTML injected in Loader's container element
			* @type {String}
			*/
			this.html = defaultsStr(f.html, null);
			/**
			* Css class for Loader's container element
			* @type {String}
			*/
			this.cssClass = defaultsStr(f.css_class, "loader");
			/**
			* Close delay in milliseconds
			* @type {Number}
			*/
			this.closeDelay = 250;
			/**
			* Callback fired when loader is displayed
			* @type {Function}
			*/
			this.onShow = defaultsFn(f.on_show_loader, EMPTY_FN);
			/**
			* Callback fired when loader is closed
			* @type {Function}
			*/
			this.onHide = defaultsFn(f.on_hide_loader, EMPTY_FN);
		}
		/**
		* Initializes Loader instance
		*/
		init() {
			if (this.initialized) return;
			let tf = this.tf;
			let emitter = this.emitter;
			let containerDiv = createElm("div");
			containerDiv.className = this.cssClass;
			let targetEl = !this.targetId ? tf.dom().parentNode : elm(this.targetId);
			if (!this.targetId) targetEl.insertBefore(containerDiv, tf.dom());
			else targetEl.appendChild(containerDiv);
			this.cont = containerDiv;
			if (!this.html) this.cont.appendChild(createText(this.text));
			else this.cont.innerHTML = this.html;
			this.show(NONE);
			emitter.on(BEFORE_ACTION_EVENTS, () => this.show(""));
			emitter.on(AFTER_ACTION_EVENTS, () => this.show(NONE));
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Shows or hides activity indicator
		* @param {String} Two possible values: '' or 'none'
		*/
		show(p) {
			if (!this.isEnabled()) return;
			function displayLoader() {
				if (!this.cont) return;
				if (p !== "none") this.onShow(this);
				this.cont.style.display = p;
				if (p === "none") this.onHide(this);
			}
			let t = p === "none" ? this.closeDelay : 1;
			root.setTimeout(displayLoader.bind(this), t);
		}
		/**
		* Removes feature
		*/
		destroy() {
			if (!this.initialized) return;
			let emitter = this.emitter;
			removeElm(this.cont);
			this.cont = null;
			emitter.off(BEFORE_ACTION_EVENTS, () => this.show(""));
			emitter.off(AFTER_ACTION_EVENTS, () => this.show(NONE));
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/highlightKeywords.js
	/**
	* Highlight matched keywords upon filtering
	*
	* @export
	* @class HighlightKeyword
	*/
	var HighlightKeyword = class {
		/**
		* Creates an instance of HighlightKeyword
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			let f = tf.config();
			/**
			* Css class for highlighted term
			* @type {String}
			*/
			this.highlightCssClass = defaultsStr(f.highlight_css_class, "keyword");
			/**
			* TableFilter instance
			* @type {TableFilter}
			*/
			this.tf = tf;
			/**
			* TableFilter's emitter instance
			* @type {Emitter}
			*/
			this.emitter = tf.emitter;
		}
		/**
		* Initializes HighlightKeyword instance
		*/
		init() {
			this.emitter.on(["before-filtering", "destroy"], () => this.unhighlightAll());
			this.emitter.on(["highlight-keyword"], (tf, cell, term) => this._processTerm(cell, term));
		}
		/**
		* Highlight occurences of searched term in passed node
		* @param  {Node} node
		* @param  {String} term     Searched term
		* @param  {String} cssClass Css class name
		*
		* TODO: refactor this method
		*/
		highlight(node, term, cssClass) {
			if (node.hasChildNodes) {
				let children = node.childNodes;
				for (let i = 0; i < children.length; i++) this.highlight(children[i], term, cssClass);
			}
			if (node.nodeType === 3) {
				let termIdx = node.nodeValue.toLowerCase().indexOf(term.toLowerCase());
				if (termIdx !== -1) {
					let pn = node.parentNode;
					if (pn && pn.className !== cssClass) {
						let nv = node.nodeValue, before = createText(nv.substr(0, termIdx)), value = nv.substr(termIdx, term.length), after = createText(nv.substr(termIdx + term.length)), text = createText(value), container = createElm("span");
						container.className = cssClass;
						container.appendChild(text);
						pn.insertBefore(before, node);
						pn.insertBefore(container, node);
						pn.insertBefore(after, node);
						pn.removeChild(node);
					}
				}
			}
		}
		/**
		* Removes highlight to nodes matching passed string
		* @param  {String} term
		* @param  {String} cssClass Css class to remove
		*/
		unhighlight(term, cssClass) {
			let highlightedNodes = this.tf.dom().querySelectorAll(`.${cssClass}`);
			for (let i = 0; i < highlightedNodes.length; i++) {
				let n = highlightedNodes[i];
				let nodeVal = getText(n);
				if (isNull(term) || nodeVal.toLowerCase().indexOf(term.toLowerCase()) !== -1) {
					let parentNode = n.parentNode;
					parentNode.replaceChild(createText(nodeVal), n);
					parentNode.normalize();
				}
			}
		}
		/**
		* Clear all occurrences of highlighted nodes
		*/
		unhighlightAll() {
			if (!this.tf.highlightKeywords) return;
			this.unhighlight(null, this.highlightCssClass);
		}
		/**  Remove feature */
		destroy() {
			this.emitter.off(["before-filtering", "destroy"], () => this.unhighlightAll());
			this.emitter.off(["highlight-keyword"], (tf, cell, term) => this._processTerm(cell, term));
		}
		/**
		* Ensure filtering operators are handled before highlighting any match
		* @param {any} Table cell to look searched term into
		* @param {any} Searched termIdx
		*/
		_processTerm(cell, term) {
			let tf = this.tf;
			let reLk = new RegExp(rgxEsc(tf.lkOperator));
			let reEq = new RegExp(tf.eqOperator);
			let reSt = new RegExp(tf.stOperator);
			let reEn = new RegExp(tf.enOperator);
			let reLe = new RegExp(tf.leOperator);
			let reGe = new RegExp(tf.geOperator);
			let reL = new RegExp(tf.lwOperator);
			let reG = new RegExp(tf.grOperator);
			let reD = new RegExp(tf.dfOperator);
			term = term.replace(reLk, "").replace(reEq, "").replace(reSt, "").replace(reEn, "");
			if (reLe.test(term) || reGe.test(term) || reL.test(term) || reG.test(term) || reD.test(term)) term = getText(cell);
			if (term === "") return;
			this.highlight(cell, term, this.highlightCssClass);
		}
	};
	HighlightKeyword.meta = {
		name: "highlightKeyword",
		altName: "highlightKeywords"
	};
	//#endregion
	//#region src/modules/popupFilter.js
	/**
	* Pop-up filter component
	* @export
	* @class PopupFilter
	* @extends {Feature}
	*/
	var PopupFilter = class PopupFilter extends Feature {
		/**
		* Creates an instance of PopupFilter
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, PopupFilter);
			let f = this.config.popup_filters || {};
			/**
			* Close active popup filter upon filtering, enabled by default
			* @type {Boolean}
			*/
			this.closeOnFiltering = defaultsBool(f.close_on_filtering, true);
			/**
			* Filter icon path
			* @type {String}
			*/
			this.iconPath = defaultsStr(f.image, tf.themesPath + "icn_filter.gif");
			/**
			* Active filter icon path
			* @type {string}
			*/
			this.activeIconPath = defaultsStr(f.image_active, tf.themesPath + "icn_filterActive.gif");
			/**
			* HTML for the filter icon
			* @type {string}
			*/
			this.iconHtml = defaultsStr(f.image_html, "<img src=\"" + this.iconPath + "\" alt=\"Column filter\" />");
			/**
			* Css class assigned to the popup container element
			* @type {String}
			*/
			this.placeholderCssClass = defaultsStr(f.placeholder_css_class, "popUpPlaceholder");
			/**
			* Css class assigned to filter container element
			* @type {String}
			*/
			this.containerCssClass = defaultsStr(f.div_css_class, "popUpFilter");
			/**
			* Ensure filter's container element width matches column width, enabled
			* by default
			* @type {Boolean}
			*/
			this.adjustToContainer = defaultsBool(f.adjust_to_container, true);
			/**
			* Callback fired before a popup filter is opened
			* @type {Function}
			*/
			this.onBeforeOpen = defaultsFn(f.on_before_popup_filter_open, EMPTY_FN);
			/**
			* Callback fired after a popup filter is opened
			* @type {Function}
			*/
			this.onAfterOpen = defaultsFn(f.on_after_popup_filter_open, EMPTY_FN);
			/**
			* Callback fired before a popup filter is closed
			* @type {Function}
			*/
			this.onBeforeClose = defaultsFn(f.on_before_popup_filter_close, EMPTY_FN);
			/**
			* Callback fired after a popup filter is closed
			* @type {Function}
			*/
			this.onAfterClose = defaultsFn(f.on_after_popup_filter_close, EMPTY_FN);
			/**
			* Collection of filters spans
			* @type {Array}
			* @private
			*/
			this.fltSpans = [];
			/**
			* Collection of filters icons
			* @type {Array}
			* @private
			*/
			this.fltIcons = [];
			/**
			* Collection of filters icons cached after pop-up filters are removed
			* @type {Array}
			* @private
			*/
			this.filtersCache = null;
			/**
			* Collection of filters containers
			* @type {Array}
			* @private
			*/
			this.fltElms = defaultsArr(this.filtersCache, []);
			/**
			* Prefix for pop-up filter container ID
			* @type {String}
			* @private
			*/
			this.prfxDiv = "popup_";
			/**
			* Column index of popup filter currently active
			* @type {Number}
			* @private
			*/
			this.activeFilterIdx = -1;
		}
		/**
		* Click event handler for pop-up filter icon
		* @private
		*/
		onClick(evt) {
			let elm = targetEvt(evt).parentNode;
			let colIndex = parseInt(elm.getAttribute("ci"), 10);
			this.closeAll(colIndex);
			this.toggle(colIndex);
			if (this.adjustToContainer) {
				let cont = this.fltElms[colIndex], headerWidth = this.tf.getHeaderElement(colIndex).clientWidth * .95;
				cont.style.width = parseInt(headerWidth, 10) + "px";
			}
			cancelEvt(evt);
			stopEvt(evt);
		}
		/**
		* Mouse-up event handler handling popup filter auto-close behaviour
		* @private
		*/
		onMouseup(evt) {
			if (this.activeFilterIdx === -1) return;
			let targetElm = targetEvt(evt);
			let activeFlt = this.fltElms[this.activeFilterIdx];
			if (this.fltIcons[this.activeFilterIdx] === targetElm) return;
			while (targetElm && targetElm !== activeFlt) targetElm = targetElm.parentNode;
			if (targetElm !== activeFlt) this.close(this.activeFilterIdx);
		}
		/**
		* Initialize DOM elements
		*/
		init() {
			if (this.initialized) return;
			let tf = this.tf;
			tf.externalFltIds = [""];
			tf.filtersRowIndex = 0;
			if (tf.headersRow <= 1 && isNaN(tf.config().headers_row_index)) tf.headersRow = 0;
			if (tf.gridLayout) {
				tf.headersRow--;
				this.buildIcons();
			}
			this.emitter.on(["before-filtering"], () => this.setIconsState());
			this.emitter.on(["after-filtering"], () => this.closeAll());
			this.emitter.on(["cell-processed"], (tf, cellIndex) => this.changeState(cellIndex, true));
			this.emitter.on(["filters-row-inserted"], () => this.buildIcons());
			this.emitter.on(["before-filter-init"], (tf, colIndex) => this.build(colIndex));
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Reset previously destroyed feature
		*/
		reset() {
			this.enable();
			this.init();
			this.buildIcons();
			this.buildAll();
		}
		/**
		* Build all filters icons
		*/
		buildIcons() {
			let tf = this.tf;
			tf.headersRow++;
			tf.eachCol((i) => {
				let icon = createElm("span", ["ci", i]);
				icon.innerHTML = this.iconHtml;
				tf.getHeaderElement(i).appendChild(icon);
				addEvt(icon, "click", (evt) => this.onClick(evt));
				this.fltSpans[i] = icon;
				this.fltIcons[i] = icon.firstChild;
			}, (i) => tf.getFilterType(i) === NONE);
		}
		/**
		* Build all pop-up filters elements
		*/
		buildAll() {
			for (let i = 0; i < this.filtersCache.length; i++) this.build(i, this.filtersCache[i]);
		}
		/**
		* Build a specified pop-up filter elements
		* @param  {Number} colIndex Column index
		* @param  {Object} div      Optional container DOM element
		*/
		build(colIndex, div) {
			let tf = this.tf;
			let contId = `${this.prfxDiv}${tf.id}_${colIndex}`;
			let placeholder = createElm("div", ["class", this.placeholderCssClass]);
			let cont = div || createElm("div", ["id", contId], ["class", this.containerCssClass]);
			tf.externalFltIds[colIndex] = cont.id;
			placeholder.appendChild(cont);
			let header = tf.getHeaderElement(colIndex);
			header.insertBefore(placeholder, header.firstChild);
			addEvt(cont, "click", (evt) => stopEvt(evt));
			this.fltElms[colIndex] = cont;
		}
		/**
		* Toggle visibility of specified filter
		* @param  {Number} colIndex Column index
		*/
		toggle(colIndex) {
			if (!this.isOpen(colIndex)) this.open(colIndex);
			else this.close(colIndex);
		}
		/**
		* Open popup filter of specified column
		* @param {Number} colIndex Column index
		*/
		open(colIndex) {
			let tf = this.tf, container = this.fltElms[colIndex];
			this.onBeforeOpen(this, container, colIndex);
			container.style.display = "block";
			this.activeFilterIdx = colIndex;
			addEvt(root, "mouseup", (evt) => this.onMouseup(evt));
			if (tf.getFilterType(colIndex) === "input") {
				let flt = tf.getFilterElement(colIndex);
				if (flt) flt.focus();
			}
			this.onAfterOpen(this, container, colIndex);
		}
		/**
		* Close popup filter of specified column
		* @param {Number} colIndex Column index
		*/
		close(colIndex) {
			let container = this.fltElms[colIndex];
			this.onBeforeClose(this, container, colIndex);
			container.style.display = NONE;
			if (this.activeFilterIdx === colIndex) this.activeFilterIdx = -1;
			removeEvt(root, "mouseup", (evt) => this.onMouseup(evt));
			this.onAfterClose(this, container, colIndex);
		}
		/**
		* Check if popup filter for specified column is open
		* @param {Number} colIndex Column index
		* @returns {Boolean}
		*/
		isOpen(colIndex) {
			return this.fltElms[colIndex].style.display === "block";
		}
		/**
		* Close all filters excepted for the specified one if any
		* @param  {Number} exceptIdx Column index of the filter to not close
		*/
		closeAll(exceptIdx) {
			if (isUndef(exceptIdx) && !this.closeOnFiltering) return;
			for (let i = 0; i < this.fltElms.length; i++) {
				if (i === exceptIdx) continue;
				let fltType = this.tf.getFilterType(i);
				if (!(fltType === "checklist" || fltType === "multiple") || !isUndef(exceptIdx)) this.close(i);
			}
		}
		/**
		* Build all the icons representing the pop-up filters
		*/
		setIconsState() {
			for (let i = 0; i < this.fltIcons.length; i++) this.changeState(i, false);
		}
		/**
		* Apply specified icon state
		* @param  {Number} colIndex Column index
		* @param  {Boolean} active   Apply active state
		*/
		changeState(colIndex, active) {
			let icon = this.fltIcons[colIndex];
			if (icon) icon.src = active ? this.activeIconPath : this.iconPath;
		}
		/**
		* Remove pop-up filters
		*/
		destroy() {
			if (!this.initialized) return;
			this.filtersCache = [];
			for (let i = 0; i < this.fltElms.length; i++) {
				let container = this.fltElms[i], placeholder = container.parentNode, icon = this.fltSpans[i], iconImg = this.fltIcons[i];
				if (container) {
					removeElm(container);
					this.filtersCache[i] = container;
				}
				container = null;
				if (placeholder) removeElm(placeholder);
				placeholder = null;
				if (icon) removeElm(icon);
				icon = null;
				if (iconImg) removeElm(iconImg);
				iconImg = null;
			}
			this.fltElms = [];
			this.fltSpans = [];
			this.fltIcons = [];
			this.tf.externalFltIds = [];
			this.emitter.off(["before-filtering"], () => this.setIconsState());
			this.emitter.off(["after-filtering"], () => this.closeAll());
			this.emitter.off(["cell-processed"], (tf, cellIndex) => this.changeState(cellIndex, true));
			this.emitter.off(["filters-row-inserted"], () => this.buildIcons());
			this.emitter.off(["before-filter-init"], (tf, colIndex) => this.build(colIndex));
			this.initialized = false;
		}
	};
	PopupFilter.meta = { altName: "popupFilters" };
	//#endregion
	//#region src/modules/markActiveColumns.js
	/**
	* Visual indicator for filtered columns
	* @export
	* @class MarkActiveColumns
	* @extends {Feature}
	*/
	var MarkActiveColumns = class MarkActiveColumns extends Feature {
		/**
		* Create an instance of MarkActiveColumns
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, MarkActiveColumns);
			let config = this.config.mark_active_columns || {};
			/**
			* Css class for filtered (active) columns
			* @type {String}
			*/
			this.headerCssClass = defaultsStr(config.header_css_class, "activeHeader");
			/**
			* Css class for filtered (active) column cells
			* @type {String}
			*/
			this.cellCssClass = defaultsStr(config.cell_css_class, "activeCell");
			/**
			* Enable/disable column highlighting
			* @type {Boolean}
			*/
			this.highlightColumn = Boolean(config.highlight_column);
			/**
			* Callback fired before a column is marked as filtered
			* @type {Function}
			*/
			this.onBeforeActiveColumn = defaultsFn(config.on_before_active_column, EMPTY_FN);
			/**
			* Callback fired after a column is marked as filtered
			* @type {Function}
			*/
			this.onAfterActiveColumn = defaultsFn(config.on_after_active_column, EMPTY_FN);
		}
		/**
		* Initialise MarkActiveColumns instance
		*/
		init() {
			if (this.initialized) return;
			this.emitter.on(["before-filtering"], () => this.clearActiveColumns());
			this.emitter.on(["cell-processed"], (tf, colIndex) => this.markActiveColumn(colIndex));
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Clear filtered columns visual indicator (background color)
		*/
		clearActiveColumns() {
			let tf = this.tf;
			tf.eachCol((idx) => {
				removeClass(tf.getHeaderElement(idx), this.headerCssClass);
				if (this.highlightColumn) this.eachColumnCell(idx, (cell) => removeClass(cell, this.cellCssClass));
			});
		}
		/**
		* Mark currently filtered column
		* @param  {Number} colIndex Column index
		*/
		markActiveColumn(colIndex) {
			let header = this.tf.getHeaderElement(colIndex);
			if (hasClass(header, this.headerCssClass)) return;
			this.onBeforeActiveColumn(this, colIndex);
			addClass(header, this.headerCssClass);
			if (this.highlightColumn) this.eachColumnCell(colIndex, (cell) => addClass(cell, this.cellCssClass));
			this.onAfterActiveColumn(this, colIndex);
		}
		/**
		* Column cells iterator
		* TODO: make public and move into TableFilter if used elsewhere
		* @param {Number} colIndex
		* @param {Function} fn
		* @param {DOMElement} tbl
		* @private
		*/
		eachColumnCell(colIndex, fn = EMPTY_FN, tbl = this.tf.dom()) {
			[].forEach.call(tbl.querySelectorAll(`tbody td:nth-child(${colIndex + 1})`), fn);
		}
		/**
		* Remove feature
		*/
		destroy() {
			if (!this.initialized) return;
			this.clearActiveColumns();
			this.emitter.off(["before-filtering"], () => this.clearActiveColumns());
			this.emitter.off(["cell-processed"], (tf, colIndex) => this.markActiveColumn(colIndex));
			/** @inherited */
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/rowsCounter.js
	/**
	* Rows counter UI component
	* @export
	* @class RowsCounter
	* @extends {Feature}
	*/
	var RowsCounter = class RowsCounter extends Feature {
		/**
		* Creates an instance of RowsCounter
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, RowsCounter);
			let f = this.config.rows_counter || {};
			/**
			* ID of custom container element
			* @type {String}
			*/
			this.targetId = defaultsStr(f.target_id, null);
			/**
			* Container DOM element
			* @type {DOMElement}
			* @private
			*/
			this.container = null;
			/**
			* Container DOM element for label displaying the total number of rows
			* @type {DOMElement}
			* @private
			*/
			this.label = null;
			/**
			* Text preceding the total number of rows
			* @type {String}
			*/
			this.text = defaultsStr(f.text, "Rows: ");
			/**
			* Separator symbol appearing between the first and last visible rows of
			* current page when paging is enabled. ie: Rows: 31-40 / 70
			* @type {String}
			*/
			this.fromToTextSeparator = defaultsStr(f.separator, "-");
			/**
			* Separator symbol appearing between the first and last visible rows of
			* current page and the total number of filterable rows when paging is
			* enabled. ie: Rows: 31-40 / 70
			* @type {String}
			*/
			this.overText = defaultsStr(f.over_text, " / ");
			/**
			* Css class for container element
			* @type {String}
			*/
			this.cssClass = defaultsStr(f.css_class, "tot");
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, LEFT);
			/**
			* Callback fired before the counter is refreshed
			* @type {Function}
			*/
			this.onBeforeRefreshCounter = defaultsFn(f.on_before_refresh_counter, EMPTY_FN);
			/**
			* Callback fired after the counter is refreshed
			* @type {Function}
			*/
			this.onAfterRefreshCounter = defaultsFn(f.on_after_refresh_counter, EMPTY_FN);
		}
		/**
		* Initializes RowsCounter instance
		*/
		init() {
			if (this.initialized) return;
			this.emitter.emit("initializing-feature", this, !isNull(this.targetId));
			let tf = this.tf;
			const targetEl = !this.targetId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.targetId);
			if (typeof customElements !== "undefined" && customElements.get("tf-rows-counter")) this.initCE(targetEl);
			else this.initLegacy(targetEl);
			this.emitter.on(["after-filtering", "grouped-by-page"], () => this.refresh(tf.getValidRowsNb()));
			this.emitter.on(["rows-changed"], () => this.refresh());
			/** @inherited */
			this.initialized = true;
			this.refresh();
			this.emitter.emit("feature-initialized", this);
		}
		/**
		* Initialize using the <tf-rows-counter> custom element
		* @param {DOMElement} targetEl Target container element
		* @private
		*/
		initCE(targetEl) {
			const countEl = document.createElement("tf-rows-counter");
			countEl.className = this.cssClass;
			if (this.text) countEl.setAttribute("text", this.text);
			targetEl.appendChild(countEl);
			this.container = countEl;
			this.label = countEl.shadowRoot.querySelector("[part=count]");
		}
		/**
		* Initialize using the legacy div/span structure
		* @param {DOMElement} targetEl Target container element
		* @private
		*/
		initLegacy(targetEl) {
			const countDiv = createElm("div");
			countDiv.className = this.cssClass;
			const countText = createElm("span");
			countText.appendChild(createText(this.text));
			const countSpan = createElm("span");
			countDiv.appendChild(countText);
			countDiv.appendChild(countSpan);
			targetEl.appendChild(countDiv);
			this.container = countDiv;
			this.label = countSpan;
		}
		/**
		* Refreshes the rows counter
		* @param {Number} p Optional parameter the total number of rows to display
		*/
		refresh(p) {
			if (!this.initialized || !this.isEnabled()) return;
			let tf = this.tf;
			this.onBeforeRefreshCounter(tf, this.label);
			let totTxt;
			if (!tf.paging) {
				if (p && p !== "") totTxt = p;
				else totTxt = tf.getFilterableRowsNb() - tf.nbHiddenRows;
			} else {
				let paging = tf.feature("paging");
				if (paging) {
					let nbValidRows = tf.getValidRowsNb();
					let pagingStartRow = parseInt(paging.startPagingRow, 10) + (nbValidRows > 0 ? 1 : 0);
					let pagingEndRow = pagingStartRow + paging.pageLength - 1 <= nbValidRows ? pagingStartRow + paging.pageLength - 1 : nbValidRows;
					totTxt = pagingStartRow + this.fromToTextSeparator + pagingEndRow + this.overText + nbValidRows;
				}
			}
			this.label.innerHTML = totTxt;
			this.onAfterRefreshCounter(tf, this.label, totTxt);
		}
		/**
		* Remove feature
		*/
		destroy() {
			if (!this.initialized) return;
			removeElm(this.container);
			this.label = null;
			this.container = null;
			this.emitter.off(["after-filtering", "grouped-by-page"], () => this.refresh(tf.getValidRowsNb()));
			this.emitter.off(["rows-changed"], () => this.refresh());
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/statusBar.js
	var EVENTS = [
		"after-filtering",
		"after-populating-filter",
		"after-page-change",
		"after-clearing-filters",
		"after-page-length-change",
		"after-reset-page",
		"after-reset-page-length",
		"after-loading-extensions",
		"after-loading-themes"
	];
	/**
	* Status bar UI component
	* @export
	* @class StatusBar
	* @extends {Feature}
	*/
	var StatusBar = class StatusBar extends Feature {
		/**
		* Creates an instance of StatusBar
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, StatusBar);
			let f = this.config.status_bar || {};
			/**
			* ID of custom container element
			* @type {String}
			*/
			this.targetId = defaultsStr(f.target_id, null);
			/**
			* Container DOM element
			* @type {DOMElement}
			* @private
			*/
			this.container = null;
			/**
			* Message container DOM element
			* @type {DOMElement}
			* @private
			*/
			this.msgContainer = null;
			/**
			* Label container DOM element
			* @type {DOMElement}
			* @private
			*/
			this.labelContainer = null;
			/**
			* Text preceding status message
			* @type {String}
			*/
			this.text = defaultsStr(f.text, "");
			/**
			* Css class for container element
			* @type {String}
			*/
			this.cssClass = defaultsStr(f.css_class, "status");
			/**
			* Message visibility duration in milliseconds
			* @type {Number}
			* @private
			*/
			this.delay = 250;
			/**
			* Callback fired before the message is displayed
			* @type {Function}
			*/
			this.onBeforeShowMsg = defaultsFn(f.on_before_show_msg, EMPTY_FN);
			/**
			* Callback fired after the message is displayed
			* @type {Function}
			*/
			this.onAfterShowMsg = defaultsFn(f.on_after_show_msg, EMPTY_FN);
			/**
			* Message appearing upon filtering
			* @type {String}
			*/
			this.msgFilter = defaultsStr(f.msg_filter, "Filtering data...");
			/**
			* Message appearing when a drop-down filter is populated
			* @type {String}
			*/
			this.msgPopulate = defaultsStr(f.msg_populate, "Populating filter...");
			/**
			* Message appearing when a checklist filter is populated
			* @type {String}
			*/
			this.msgPopulateCheckList = defaultsStr(f.msg_populate_checklist, "Populating list...");
			/**
			* Message appearing when a pagination page is changed
			* @type {String}
			*/
			this.msgChangePage = defaultsStr(f.msg_change_page, "Collecting paging data...");
			/**
			* Message appearing when filters are cleared
			* @type {String}
			*/
			this.msgClear = defaultsStr(f.msg_clear, "Clearing filters...");
			/**
			* Message appearing when the page length is changed
			* @type {String}
			*/
			this.msgChangeResults = defaultsStr(f.msg_change_results, "Changing results per page...");
			/**
			* Message appearing when the page is re-set
			* @type {String}
			*/
			this.msgResetPage = defaultsStr(f.msg_reset_page, "Re-setting page...");
			/**
			* Message appearing when the page length is re-set
			* @type {String}
			*/
			this.msgResetPageLength = defaultsStr(f.msg_reset_page_length, "Re-setting page length...");
			/**
			* Message appearing upon column sorting
			* @type {String}
			*/
			this.msgSort = defaultsStr(f.msg_sort, "Sorting data...");
			/**
			* Message appearing when extensions are loading
			* @type {String}
			*/
			this.msgLoadExtensions = defaultsStr(f.msg_load_extensions, "Loading extensions...");
			/**
			* Message appearing when themes are loading
			* @type {String}
			*/
			this.msgLoadThemes = defaultsStr(f.msg_load_themes, "Loading theme(s)...");
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, LEFT);
		}
		/**
		* Initializes StatusBar instance
		*/
		init() {
			if (this.initialized) return;
			let tf = this.tf;
			let emitter = this.emitter;
			emitter.emit("initializing-feature", this, !isNull(this.targetId));
			const targetEl = !this.targetId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.targetId);
			if (typeof customElements !== "undefined" && customElements.get("tf-status")) this.initCE(targetEl);
			else this.initLegacy(targetEl);
			emitter.on(["before-filtering"], () => this.message(this.msgFilter));
			emitter.on(["before-populating-filter"], () => this.message(this.msgPopulate));
			emitter.on(["before-page-change"], () => this.message(this.msgChangePage));
			emitter.on(["before-clearing-filters"], () => this.message(this.msgClear));
			emitter.on(["before-page-length-change"], () => this.message(this.msgChangeResults));
			emitter.on(["before-reset-page"], () => this.message(this.msgResetPage));
			emitter.on(["before-reset-page-length"], () => this.message(this.msgResetPageLength));
			emitter.on(["before-loading-extensions"], () => this.message(this.msgLoadExtensions));
			emitter.on(["before-loading-themes"], () => this.message(this.msgLoadThemes));
			emitter.on(EVENTS, () => this.message(""));
			/** @inherited */
			this.initialized = true;
			emitter.emit("feature-initialized", this);
		}
		/**
		* Initialize using the <tf-status> custom element
		* @param {DOMElement} targetEl Target container element
		* @private
		*/
		initCE(targetEl) {
			const statusEl = document.createElement("tf-status");
			statusEl.className = this.cssClass;
			if (this.text) statusEl.setAttribute("text", this.text);
			targetEl.appendChild(statusEl);
			this.container = statusEl;
			this.statusEl = statusEl;
			this.msgContainer = statusEl.shadowRoot.querySelector("[part=message]");
			this.labelContainer = statusEl.shadowRoot.querySelector("[part=label]");
		}
		/**
		* Initialize using the legacy div/span structure
		* @param {DOMElement} targetEl Target container element
		* @private
		*/
		initLegacy(targetEl) {
			const statusDiv = createElm("div");
			statusDiv.className = this.cssClass;
			const msgSpan = createElm("span");
			const labelSpan = createElm("span");
			labelSpan.appendChild(createText(this.text));
			statusDiv.appendChild(labelSpan);
			statusDiv.appendChild(msgSpan);
			targetEl.appendChild(statusDiv);
			this.container = statusDiv;
			this.statusEl = statusDiv;
			this.msgContainer = msgSpan;
			this.labelContainer = labelSpan;
		}
		/**
		* Display status message
		* @param {String} [t=''] Message to be displayed
		*/
		message(t = "") {
			if (!this.isEnabled()) return;
			this.onBeforeShowMsg(this.tf, t);
			let d = t === "" ? this.delay : 1;
			root.setTimeout(() => {
				if (!this.initialized) return;
				if (this.statusEl.setMessage) this.statusEl.setMessage(t);
				else this.msgContainer.innerHTML = t;
				this.onAfterShowMsg(this.tf, t);
			}, d);
		}
		/**
		* Destroy StatusBar instance
		*/
		destroy() {
			if (!this.initialized) return;
			let emitter = this.emitter;
			removeElm(this.container);
			this.statusEl = null;
			this.msgContainer = null;
			this.labelContainer = null;
			this.container = null;
			emitter.off(["before-filtering"], () => this.message(this.msgFilter));
			emitter.off(["before-populating-filter"], () => this.message(this.msgPopulate));
			emitter.off(["before-page-change"], () => this.message(this.msgChangePage));
			emitter.off(["before-clearing-filters"], () => this.message(this.msgClear));
			emitter.off(["before-page-length-change"], () => this.message(this.msgChangeResults));
			emitter.off(["before-reset-page"], () => this.message(this.msgResetPage));
			emitter.off(["before-reset-page-length"], () => this.message(this.msgResetPageLength));
			emitter.off(["before-loading-extensions"], () => this.message(this.msgLoadExtensions));
			emitter.off(["before-loading-themes"], () => this.message(this.msgLoadThemes));
			emitter.off(EVENTS, () => this.message(""));
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/clearButton.js
	/**
	* Clear button UI component
	*/
	var ClearButton = class ClearButton extends Feature {
		/**
		* Creates an instance of ClearButton
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, ClearButton);
			let f = this.config.btn_reset || {};
			/**
			* Container element ID
			* @type {String}
			*/
			this.targetId = defaultsStr(f.target_id, null);
			/**
			* Text for the clear button
			* @type {String}
			*/
			this.text = defaultsStr(f.text, null);
			/**
			* Css class for reset button
			* @type {String}
			*/
			this.cssClass = defaultsStr(f.css_class, "reset");
			/**
			* Tooltip text for the clear button
			* @type {String}
			*/
			this.tooltip = f.tooltip || "Clear filters";
			/**
			* Custom Html string for the clear button
			* @type {String}
			*/
			this.html = defaultsStr(f.html, !tf.enableIcons || this.text ? null : "<input type=\"button\" value=\"\" class=\"" + this.cssClass + "\" title=\"" + this.tooltip + "\" />");
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, RIGHT);
			/**
			* Clear button container element
			* @type {DOMElement}
			* @private
			*/
			this.container = null;
			/**
			* Clear button element
			* @type {DOMElement}
			* @private
			*/
			this.element = null;
		}
		/**
		* Click event handler for clear button
		* @private
		*/
		onClick() {
			if (!this.isEnabled()) return;
			this.tf.clearFilters();
		}
		/**
		* Initialize clear button component
		*/
		init() {
			let tf = this.tf;
			if (this.initialized) return;
			this.emitter.emit("initializing-feature", this, !isNull(this.targetId));
			const targetEl = !this.targetId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.targetId);
			if (typeof customElements !== "undefined" && customElements.get("tf-clear-button") && !this.html) this.initCE(targetEl);
			else this.initLegacy(targetEl);
			/** @inherited */
			this.initialized = true;
			this.emitter.emit("feature-initialized", this);
		}
		/**
		* Initialize using the <tf-clear-button> custom element
		* @param {DOMElement} targetEl Target container element
		* @private
		*/
		initCE(targetEl) {
			let cont = document.createElement("tf-clear-button");
			cont.className = this.cssClass;
			if (this.text) cont.setAttribute("text", this.text);
			if (this.tooltip) {
				cont.setAttribute("label", this.tooltip);
				cont.setAttribute("title", this.tooltip);
			}
			targetEl.appendChild(cont);
			let resetEl = cont.shadowRoot ? cont.shadowRoot.querySelector("button") : null;
			if (!resetEl) resetEl = cont;
			if (resetEl) addEvt(resetEl, "click", () => this.onClick());
			this.element = resetEl;
			this.container = cont;
		}
		/**
		* Initialize using the legacy span/input|a structure
		* @param {DOMElement} targetEl Target container element
		* @private
		*/
		initLegacy(targetEl) {
			let cont = createElm("span");
			targetEl.appendChild(cont);
			if (!this.html) {
				let fltReset = createElm("a", ["href", "javascript:void(0);"]);
				fltReset.className = this.cssClass;
				fltReset.appendChild(createText(this.text));
				cont.appendChild(fltReset);
				addEvt(fltReset, "click", () => this.onClick());
			} else {
				cont.innerHTML = this.html;
				let resetElLegacy = cont.firstChild;
				addEvt(resetElLegacy, "click", () => this.onClick());
			}
			this.element = cont.firstChild;
			this.container = cont;
		}
		/**
		* Destroy ClearButton instance
		*/
		destroy() {
			if (!this.initialized) return;
			removeElm(this.container);
			this.element = null;
			this.container = null;
			this.initialized = false;
		}
	};
	ClearButton.meta = { altName: "btnReset" };
	//#endregion
	//#region src/modules/alternateRows.js
	/**
	* Rows with alternating background color for improved readability
	*/
	var AlternateRows = class AlternateRows extends Feature {
		/**
		* Creates an instance of AlternateRows.
		*
		* @param {Object} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, AlternateRows);
			let config = this.config;
			/**
			* Css class for even rows (default: 'even')
			* @type {String}
			*/
			this.evenCss = defaultsStr(config.even_row_css_class, "even");
			/**
			* Css class for odd rows (default: 'odd')
			* @type {String}
			*/
			this.oddCss = defaultsStr(config.odd_row_css_class, "odd");
		}
		/**
		* Sets alternating rows color
		*/
		init() {
			if (this.initialized) return;
			this.processAll();
			this.emitter.on(["row-processed", "row-paged"], bound(this.processRowHandler, this));
			this.emitter.on(["column-sorted", "rows-changed"], bound(this.processAll, this));
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Apply background to all valid rows
		*/
		processAll() {
			if (!this.isEnabled()) return;
			let validRowsIndex = this.tf.getValidRows(true);
			let indexLen = validRowsIndex.length;
			let idx = 0;
			for (let j = 0; j < indexLen; j++) {
				let rowIdx = validRowsIndex[j];
				this.setRowBg(rowIdx, idx);
				idx++;
			}
		}
		/**
		* Set/remove row background based on row validation
		* @param  {Number}  rowIdx  Row index
		* @param  {Number}  arrIdx  Array index
		* @param  {Boolean} isValid Valid row flag
		*/
		processRow(rowIdx, arrIdx, isValid) {
			if (isValid) this.setRowBg(rowIdx, arrIdx);
			else this.removeRowBg(rowIdx);
		}
		/**
		* Sets row background color
		* @param {Number} rowIdx Row index
		* @param {Number} idx    Valid rows collection index needed to calculate bg
		* color
		* @private
		*/
		setRowBg(rowIdx, idx) {
			if (!this.isEnabled() || isNaN(rowIdx)) return;
			let rows = this.tf.dom().rows;
			let i = isNaN(idx) ? rowIdx : idx;
			this.removeRowBg(rowIdx);
			addClass(rows[rowIdx], i % 2 ? this.evenCss : this.oddCss);
		}
		/**
		* Removes row background color
		* @param  {Number} idx Row index
		* @private
		*/
		removeRowBg(idx) {
			if (isNaN(idx)) return;
			let rows = this.tf.dom().rows;
			removeClass(rows[idx], this.oddCss);
			removeClass(rows[idx], this.evenCss);
		}
		/** @private */
		processRowHandler(tf, rowIndex, arrIndex, isValid) {
			this.processRow(rowIndex, arrIndex, isValid);
		}
		/**
		* Removes all alternating backgrounds
		*/
		destroy() {
			if (!this.initialized) return;
			this.tf.eachRow(0)((row, i) => this.removeRowBg(i));
			this.emitter.off(["row-processed", "row-paged"], bound(this.processRowHandler, this));
			this.emitter.off(["column-sorted", "rows-changed"], bound(this.processAll, this));
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/noResults.js
	/**
	* UI when filtering yields no matches
	* @export
	* @class NoResults
	* @extends {Feature}
	*/
	var NoResults = class NoResults extends Feature {
		/**
		* Creates an instance of NoResults
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, NoResults);
			let f = this.config.no_results_message || {};
			/**
			* Text (accepts HTML)
			* @type {String}
			*/
			this.content = defaultsStr(f.content, "No results");
			/**
			* Custom container DOM element
			* @type {DOMElement}
			*/
			this.customContainer = defaultsStr(f.custom_container, null);
			/**
			* ID of custom container element
			* @type {String}
			*/
			this.customContainerId = defaultsStr(f.custom_container_id, null);
			/**
			* Indicates if UI is contained in a external element
			* @type {Boolean}
			* @private
			*/
			this.isExternal = !isEmpty(this.customContainer) || !isEmpty(this.customContainerId);
			/**
			* Css class assigned to container element
			* @type {String}
			*/
			this.cssClass = defaultsStr(f.css_class, "no-results");
			/**
			* Stores container DOM element
			* @type {DOMElement}
			*/
			this.cont = null;
			/**
			* Callback fired before the message is displayed
			* @type {Function}
			*/
			this.onBeforeShow = defaultsFn(f.on_before_show_msg, EMPTY_FN);
			/**
			* Callback fired after the message is displayed
			* @type {Function}
			*/
			this.onAfterShow = defaultsFn(f.on_after_show_msg, EMPTY_FN);
			/**
			* Callback fired before the message is hidden
			* @type {Function}
			*/
			this.onBeforeHide = defaultsFn(f.on_before_hide_msg, EMPTY_FN);
			/**
			* Callback fired after the message is hidden
			* @type {Function}
			*/
			this.onAfterHide = defaultsFn(f.on_after_hide_msg, EMPTY_FN);
		}
		/**
		* Initializes NoResults instance
		*/
		init() {
			if (this.initialized) return;
			let tf = this.tf;
			let target = this.customContainer || elm(this.customContainerId) || tf.dom();
			let cont = createElm("div");
			cont.className = this.cssClass;
			cont.innerHTML = this.content;
			if (this.isExternal) target.appendChild(cont);
			else target.parentNode.insertBefore(cont, target.nextSibling);
			this.cont = cont;
			this.emitter.on(["initialized", "after-filtering"], () => this.toggle());
			/** @inherited */
			this.initialized = true;
		}
		/**
		* Toggle no results message
		*/
		toggle() {
			if (this.tf.getValidRowsNb() > 0) this.hide();
			else this.show();
		}
		/**
		* Show no results message
		*/
		show() {
			if (!this.initialized || !this.isEnabled()) return;
			this.onBeforeShow(this.tf, this);
			this.setWidth();
			this.cont.style.display = "block";
			this.onAfterShow(this.tf, this);
		}
		/**
		* Hide no results message
		*/
		hide() {
			if (!this.initialized || !this.isEnabled()) return;
			this.onBeforeHide(this.tf, this);
			this.cont.style.display = NONE;
			this.onAfterHide(this.tf, this);
		}
		/**
		* Sets no results container width
		* @private
		*/
		setWidth() {
			if (!this.initialized || this.isExternal || !this.isEnabled()) return;
			let tf = this.tf;
			if (tf.gridLayout) {
				let gridLayout = tf.feature("gridLayout");
				this.cont.style.width = gridLayout.headTbl.clientWidth + "px";
			} else this.cont.style.width = (tf.dom().tHead ? tf.dom().tHead.clientWidth : tf.dom().tBodies[0].clientWidth) + "px";
		}
		/** Remove feature */
		destroy() {
			if (!this.initialized) return;
			removeElm(this.cont);
			this.cont = null;
			this.emitter.off(["after-filtering"], () => this.toggle());
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/modules/paging.js
	/**
	* Paging UI component
	* @export
	* @class Paging
	* @extends {Feature}
	*/
	var Paging = class Paging extends Feature {
		/**
		* Creates an instance of Paging
		* @param {TableFilter} tf TableFilter instance
		*/
		constructor(tf) {
			super(tf, Paging);
			let f = this.config.paging || {};
			/**
			* Css class for the paging buttons (previous, next, etc.)
			* @type {String}
			*/
			this.btnCssClass = defaultsStr(f.btn_css_class, "pgInp");
			/**
			* Main select DOM element
			* @type {DOMElement}
			*/
			this.pageSlc = null;
			/**
			* Results per page select DOM element
			* @type {DOMElement}
			*/
			this.pageLengthSlc = null;
			/**
			* ID of custom container element
			* @type {String}
			*/
			this.tgtId = defaultsStr(f.target_id, null);
			/**
			* Number of rows contained in a page
			* @type {Number}
			*/
			this.pageLength = defaultsNb(f.length, 10);
			/**
			* ID of custom container element for the results per page selector
			* @type {String}
			*/
			this.pageLengthTgtId = defaultsStr(f.results_per_page_target_id, null);
			/**
			* Css class for the paging select element
			* @type {String}
			*/
			this.pgSlcCssClass = defaultsStr(f.slc_css_class, "pgSlc");
			/**
			* Css class for the paging input element
			* @type {String}
			*/
			this.pgInpCssClass = defaultsStr(f.inp_css_class, "pgNbInp");
			/**
			* Label and values for the results per page select, example of usage:
			* ['Records: ', [10,25,50,100]]
			* @type {Array}
			*/
			this.resultsPerPage = defaultsArr(f.results_per_page, null);
			/**
			* Determines if results per page is configured
			* @type {Boolean}
			*/
			this.hasResultsPerPage = isArray(this.resultsPerPage);
			/**
			* Css class for the results per page select
			* @type {String}
			*/
			this.resultsSlcCssClass = defaultsStr(f.results_slc_css_class, "rspg");
			/**
			* Css class for the label preceding results per page select
			* @type {String}
			*/
			this.resultsSpanCssClass = defaultsStr(f.results_span_css_class, "rspgSpan");
			/**
			* Index of the first row of current page
			* @type {Number}
			* @private
			*/
			this.startPagingRow = 0;
			/**
			* Total number of pages
			* @type {Number}
			* @private
			*/
			this.nbPages = 0;
			/**
			* Current page number
			* @type {Number}
			* @private
			*/
			this.currentPageNb = 1;
			/**
			* Next page button text
			* @type {String}
			*/
			this.btnNextPageText = defaultsStr(f.btn_next_page_text, ">");
			/**
			* Previous page button text
			* @type {String}
			*/
			this.btnPrevPageText = defaultsStr(f.btn_prev_page_text, "<");
			/**
			* Last page button text
			* @type {String}
			*/
			this.btnLastPageText = defaultsStr(f.btn_last_page_text, ">|");
			/**
			* First page button text
			* @type {String}
			*/
			this.btnFirstPageText = defaultsStr(f.btn_first_page_text, "|<");
			/**
			* Next page button HTML
			* @type {String}
			*/
			this.btnNextPageHtml = defaultsStr(f.btn_next_page_html, !tf.enableIcons ? null : "<input type=\"button\" value=\"\" class=\"" + this.btnCssClass + " nextPage\" title=\"Next page\" />");
			/**
			* Previous page button HTML
			* @type {String}
			*/
			this.btnPrevPageHtml = defaultsStr(f.btn_prev_page_html, !tf.enableIcons ? null : "<input type=\"button\" value=\"\" class=\"" + this.btnCssClass + " previousPage\" title=\"Previous page\" />");
			/**
			* First page button HTML
			* @type {String}
			*/
			this.btnFirstPageHtml = defaultsStr(f.btn_first_page_html, !tf.enableIcons ? null : "<input type=\"button\" value=\"\" class=\"" + this.btnCssClass + " firstPage\" title=\"First page\" />");
			/**
			* Last page button HTML
			* @type {String}
			*/
			this.btnLastPageHtml = defaultsStr(f.btn_last_page_html, !tf.enableIcons ? null : "<input type=\"button\" value=\"\" class=\"" + this.btnCssClass + " lastPage\" title=\"Last page\" />");
			/**
			* Text preceeding page selector drop-down
			* @type {String}
			*/
			this.pageText = defaultsStr(f.page_text, " Page ");
			/**
			* Text after page selector drop-down
			* @type {String}
			*/
			this.ofText = defaultsStr(f.of_text, " of ");
			/**
			* Css class for the span containing total number of pages
			* @type {String}
			*/
			this.nbPgSpanCssClass = defaultsStr(f.nb_pages_css_class, "nbpg");
			/**
			* Determines if paging buttons are enabled (default: true)
			* @type {Boolean}
			*/
			this.hasBtns = defaultsBool(f.btns, true);
			/**
			* Defines page selector type, two possible values: 'select', 'input'
			* @type {String}
			*/
			this.pageSelectorType = defaultsStr(f.page_selector_type, SELECT);
			/**
			* Default position in toolbar ('left'|'center'|'right')
			* @type {String}
			*/
			this.toolbarPosition = defaultsStr(f.toolbar_position, CENTER);
			/**
			* Callback fired before the page is changed
			* @type {Function}
			*/
			this.onBeforeChangePage = defaultsFn(f.on_before_change_page, EMPTY_FN);
			/**
			* Callback fired after the page is changed
			* @type {Function}
			*/
			this.onAfterChangePage = defaultsFn(f.on_after_change_page, EMPTY_FN);
			/**
			* Label preciding results per page select
			* @type {DOMElement}
			* @private
			*/
			this.slcResultsTxt = null;
			/**
			* Span containing next page button
			* @type {DOMElement}
			* @private
			*/
			this.btnNextCont = null;
			/**
			* Span containing previous page button
			* @type {DOMElement}
			* @private
			*/
			this.btnPrevCont = null;
			/**
			* Span containing last page button
			* @type {DOMElement}
			* @private
			*/
			this.btnLastCont = null;
			/**
			* Span containing first page button
			* @type {DOMElement}
			* @private
			*/
			this.btnFirstCont = null;
			/**
			* Span for tot nb pages
			* @type {DOMElement}
			* @private
			*/
			this.pgCont = null;
			/**
			* Span preceding pages select (contains 'Page')
			* @type {DOMElement}
			* @private
			*/
			this.pgBefore = null;
			/**
			* Span following pages select (contains ' of ')
			* @type {DOMElement}
			* @private
			*/
			this.pgAfter = null;
			let startRow = tf.refRow;
			let nrows = tf.getRowsNb(true);
			this.nbPages = Math.ceil((nrows - startRow) / this.pageLength);
			let o = this;
			/**
			* Paging DOM events handlers
			* @type {String}
			* @private
			*/
			this.evt = {
				slcIndex() {
					return o.pageSelectorType === "select" ? o.pageSlc.options.selectedIndex : parseInt(o.pageSlc.value, 10) - 1;
				},
				nbOpts() {
					return o.pageSelectorType === "select" ? parseInt(o.pageSlc.options.length, 10) - 1 : o.nbPages - 1;
				},
				next() {
					let nextIndex = o.evt.slcIndex() < o.evt.nbOpts() ? o.evt.slcIndex() + 1 : 0;
					o.changePage(nextIndex);
				},
				prev() {
					let prevIndex = o.evt.slcIndex() > 0 ? o.evt.slcIndex() - 1 : o.evt.nbOpts();
					o.changePage(prevIndex);
				},
				last() {
					o.changePage(o.evt.nbOpts());
				},
				first() {
					o.changePage(0);
				},
				_detectKey(e) {
					if (isKeyPressed(e, [13])) {
						if (tf.sorted) {
							tf.filter();
							o.changePage(o.evt.slcIndex());
						} else o.changePage();
						this.blur();
					}
				},
				slcPagesChange: null,
				nextEvt: null,
				prevEvt: null,
				lastEvt: null,
				firstEvt: null
			};
		}
		/**
		* Initialize DOM elements
		*/
		init() {
			let slcPages;
			let tf = this.tf;
			let evt = this.evt;
			if (this.initialized) return;
			this.emitter.emit("initializing-feature", this, !isNull(this.tgtId));
			if (this.hasResultsPerPage) {
				if (this.resultsPerPage.length < 2) this.hasResultsPerPage = false;
				else {
					this.pageLength = this.resultsPerPage[1][0];
					this.setResultsPerPage();
				}
			}
			evt.slcPagesChange = (event) => {
				let slc = event.target;
				this.changePage(slc.selectedIndex);
			};
			if (this.pageSelectorType === "select") {
				slcPages = createElm(SELECT);
				slcPages.className = this.pgSlcCssClass;
				addEvt(slcPages, "change", evt.slcPagesChange);
			}
			if (this.pageSelectorType === "input") {
				slcPages = createElm(INPUT, ["value", this.currentPageNb]);
				slcPages.className = this.pgInpCssClass;
				addEvt(slcPages, "keypress", evt._detectKey);
			}
			let btnNextSpan = createElm("span");
			let btnPrevSpan = createElm("span");
			let btnLastSpan = createElm("span");
			let btnFirstSpan = createElm("span");
			if (this.hasBtns) {
				if (!this.btnNextPageHtml) {
					let btnNext = createElm(INPUT, ["type", "button"], ["value", this.btnNextPageText], ["title", "Next"]);
					btnNext.className = this.btnCssClass;
					addEvt(btnNext, "click", evt.next);
					btnNextSpan.appendChild(btnNext);
				} else {
					btnNextSpan.innerHTML = this.btnNextPageHtml;
					addEvt(btnNextSpan, "click", evt.next);
				}
				if (!this.btnPrevPageHtml) {
					let btnPrev = createElm(INPUT, ["type", "button"], ["value", this.btnPrevPageText], ["title", "Previous"]);
					btnPrev.className = this.btnCssClass;
					addEvt(btnPrev, "click", evt.prev);
					btnPrevSpan.appendChild(btnPrev);
				} else {
					btnPrevSpan.innerHTML = this.btnPrevPageHtml;
					addEvt(btnPrevSpan, "click", evt.prev);
				}
				if (!this.btnLastPageHtml) {
					let btnLast = createElm(INPUT, ["type", "button"], ["value", this.btnLastPageText], ["title", "Last"]);
					btnLast.className = this.btnCssClass;
					addEvt(btnLast, "click", evt.last);
					btnLastSpan.appendChild(btnLast);
				} else {
					btnLastSpan.innerHTML = this.btnLastPageHtml;
					addEvt(btnLastSpan, "click", evt.last);
				}
				if (!this.btnFirstPageHtml) {
					let btnFirst = createElm(INPUT, ["type", "button"], ["value", this.btnFirstPageText], ["title", "First"]);
					btnFirst.className = this.btnCssClass;
					addEvt(btnFirst, "click", evt.first);
					btnFirstSpan.appendChild(btnFirst);
				} else {
					btnFirstSpan.innerHTML = this.btnFirstPageHtml;
					addEvt(btnFirstSpan, "click", evt.first);
				}
			}
			let targetEl = !this.tgtId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.tgtId);
			targetEl.appendChild(btnFirstSpan);
			targetEl.appendChild(btnPrevSpan);
			let pgBeforeSpan = createElm("span");
			pgBeforeSpan.appendChild(createText(this.pageText));
			pgBeforeSpan.className = this.nbPgSpanCssClass;
			targetEl.appendChild(pgBeforeSpan);
			targetEl.appendChild(slcPages);
			let pgAfterSpan = createElm("span");
			pgAfterSpan.appendChild(createText(this.ofText));
			pgAfterSpan.className = this.nbPgSpanCssClass;
			targetEl.appendChild(pgAfterSpan);
			let pgSpan = createElm("span");
			pgSpan.className = this.nbPgSpanCssClass;
			pgSpan.appendChild(createText(" " + this.nbPages + " "));
			targetEl.appendChild(pgSpan);
			targetEl.appendChild(btnNextSpan);
			targetEl.appendChild(btnLastSpan);
			this.btnNextCont = btnNextSpan;
			this.btnPrevCont = btnPrevSpan;
			this.btnLastCont = btnLastSpan;
			this.btnFirstCont = btnFirstSpan;
			this.pgCont = pgSpan;
			this.pgBefore = pgBeforeSpan;
			this.pgAfter = pgAfterSpan;
			this.pageSlc = slcPages;
			this.setPagingInfo();
			if (!tf.fltGrid) {
				tf.validateAllRows();
				this.setPagingInfo(tf.validRowsIndex);
			}
			this.emitter.on(["after-filtering"], bound(this.resetPagingInfo, this));
			this.emitter.on(["change-page"], bound(this.changePageHandler, this));
			this.emitter.on(["change-page-results"], bound(this.changePageResultsHandler, this));
			/** @inherited */
			this.initialized = true;
			this.emitter.emit("feature-initialized", this);
		}
		/**
		* Reset paging when filters are already instantiated
		* @param {Boolean} filterTable Execute filtering once paging instanciated
		*/
		reset(filterTable = false) {
			this.enable();
			this.init();
			if (filterTable) this.tf.filter();
		}
		/**
		* Reset paging info from scratch after a filtering process
		*/
		resetPagingInfo() {
			this.startPagingRow = 0;
			this.currentPageNb = 1;
			this.setPagingInfo(this.tf.validRowsIndex);
		}
		/**
		* Calculate number of pages based on valid rows
		* Refresh paging select according to number of pages
		* @param {Array} validRows Collection of valid rows
		*/
		setPagingInfo(validRows) {
			let tf = this.tf;
			let cont = !this.tgtId ? tf.feature("toolbar").container(this.toolbarPosition) : elm(this.tgtId);
			tf.validRowsIndex = validRows || tf.getValidRows(true);
			this.nbPages = Math.ceil(tf.validRowsIndex.length / this.pageLength);
			this.pgCont.innerHTML = this.nbPages;
			if (this.pageSelectorType === "select") this.pageSlc.innerHTML = "";
			if (this.nbPages > 0) {
				cont.style.visibility = "visible";
				if (this.pageSelectorType === "select") for (let z = 0; z < this.nbPages; z++) {
					let opt = createOpt(z + 1, z * this.pageLength, false);
					this.pageSlc.options[z] = opt;
				}
				else this.pageSlc.value = this.currentPageNb;
			} else
 /*** if no results paging select and buttons are hidden ***/
			cont.style.visibility = "hidden";
			this.groupByPage(tf.validRowsIndex);
		}
		/**
		* Group table rows by page and display valid rows
		* @param  {Array} validRows Collection of valid rows
		*/
		groupByPage(validRows) {
			let tf = this.tf;
			let rows = tf.dom().rows;
			let startPagingRow = parseInt(this.startPagingRow, 10);
			let endPagingRow = startPagingRow + parseInt(this.pageLength, 10);
			if (validRows) tf.validRowsIndex = validRows;
			for (let h = 0, len = tf.getValidRowsNb(true); h < len; h++) {
				let validRowIdx = tf.validRowsIndex[h];
				let r = rows[validRowIdx];
				let isRowValid = r.getAttribute("validRow");
				let rowDisplayed = false;
				if (h >= startPagingRow && h < endPagingRow) {
					if (isNull(isRowValid) || Boolean(isRowValid === "true")) {
						r.style.display = "";
						rowDisplayed = true;
					}
				} else r.style.display = NONE;
				this.emitter.emit("row-paged", tf, validRowIdx, h, rowDisplayed);
			}
			this.emitter.emit("grouped-by-page", tf, this);
		}
		/**
		* Return the current page number
		* @return {Number} Page number
		*/
		getPage() {
			return this.currentPageNb;
		}
		/**
		* Show page defined by passed argument (string or number):
		* @param {String}/{Number} cmd possible string values: 'next',
		*   'previous', 'last', 'first' or page number as per param
		*/
		setPage(cmd) {
			if (!this.tf.isInitialized() || !this.isEnabled()) return;
			let btnEvt = this.evt, cmdtype = typeof cmd;
			if (cmdtype === "string") switch (cmd.toLowerCase()) {
				case "next":
					btnEvt.next();
					break;
				case "previous":
					btnEvt.prev();
					break;
				case "last":
					btnEvt.last();
					break;
				case "first":
					btnEvt.first();
					break;
				default: btnEvt.next();
			}
			else if (cmdtype === "number") this.changePage(cmd - 1);
		}
		/**
		* Generates UI elements for the number of results per page drop-down
		*/
		setResultsPerPage() {
			let tf = this.tf;
			let evt = this.evt;
			if (this.pageLengthSlc || !this.resultsPerPage) return;
			evt.slcResultsChange = (ev) => {
				this.onChangeResultsPerPage();
				ev.target.blur();
			};
			let slcR = createElm(SELECT);
			slcR.className = this.resultsSlcCssClass;
			let slcRText = this.resultsPerPage[0], slcROpts = this.resultsPerPage[1];
			let slcRSpan = createElm("span");
			slcRSpan.className = this.resultsSpanCssClass;
			let targetEl = !this.pageLengthTgtId ? tf.feature("toolbar").container(RIGHT) : elm(this.pageLengthTgtId);
			slcRSpan.appendChild(createText(slcRText));
			let help = tf.feature("help");
			if (help && help.btn) {
				help.btn.parentNode.insertBefore(slcRSpan, help.btn);
				help.btn.parentNode.insertBefore(slcR, help.btn);
			} else {
				targetEl.appendChild(slcRSpan);
				targetEl.appendChild(slcR);
			}
			for (let r = 0; r < slcROpts.length; r++) {
				let currOpt = new Option(slcROpts[r], slcROpts[r], false, false);
				slcR.options[r] = currOpt;
			}
			addEvt(slcR, "change", evt.slcResultsChange);
			this.slcResultsTxt = slcRSpan;
			this.pageLengthSlc = slcR;
		}
		/**
		* Remove number of results per page UI elements
		*/
		removeResultsPerPage() {
			if (!this.tf.isInitialized() || !this.pageLengthSlc || !this.resultsPerPage) return;
			if (this.pageLengthSlc) removeElm(this.pageLengthSlc);
			if (this.slcResultsTxt) removeElm(this.slcResultsTxt);
			this.pageLengthSlc = null;
			this.slcResultsTxt = null;
		}
		/**
		* Change the page based on passed index
		* @param {Number} index Index of the page (0-n)
		*/
		changePage(index) {
			let tf = this.tf;
			if (!this.isEnabled()) return;
			this.emitter.emit("before-page-change", tf, index + 1);
			if (index === null) index = this.pageSelectorType === "select" ? this.pageSlc.options.selectedIndex : this.pageSlc.value - 1;
			if (index >= 0 && index <= this.nbPages - 1) {
				this.onBeforeChangePage(this, index + 1);
				this.currentPageNb = parseInt(index, 10) + 1;
				if (this.pageSelectorType === "select") this.pageSlc.options[index].selected = true;
				else this.pageSlc.value = this.currentPageNb;
				this.startPagingRow = this.pageSelectorType === "select" ? this.pageSlc.value : index * this.pageLength;
				this.groupByPage();
				this.onAfterChangePage(this, index + 1);
			}
			this.emitter.emit("after-page-change", tf, index + 1);
		}
		/**
		* Change the number of results per page based on passed value
		* @param {String} val The number of results per page
		*/
		changeResultsPerPage(val) {
			if (!this.isEnabled() || isNaN(val)) return;
			this.pageLengthSlc.value = val;
			this.onChangeResultsPerPage();
		}
		/**
		* Change rows according to page results drop-down
		*/
		onChangeResultsPerPage() {
			let tf = this.tf;
			if (!this.isEnabled() || tf.getValidRowsNb() === 0) return;
			let { pageLengthSlc: slcR, pageSelectorType, pageSlc, emitter } = this;
			emitter.emit("before-page-length-change", tf);
			let slcIndex = slcR.selectedIndex;
			let slcPagesSelIndex = pageSelectorType === "select" ? pageSlc.selectedIndex : parseInt(pageSlc.value - 1, 10);
			this.pageLength = parseInt(slcR.options[slcIndex].value, 10);
			this.startPagingRow = this.pageLength * slcPagesSelIndex;
			if (!isNaN(this.pageLength)) {
				if (this.startPagingRow >= tf.nbFilterableRows) this.startPagingRow = tf.nbFilterableRows - this.pageLength;
				this.setPagingInfo();
				if (pageSelectorType === "select") {
					let slcIdx = pageSlc.options.length - 1 <= slcPagesSelIndex ? pageSlc.options.length - 1 : slcPagesSelIndex;
					pageSlc.options[slcIdx].selected = true;
				}
			}
			emitter.emit("after-page-length-change", tf, this.pageLength);
		}
		/**
		* Re-set page nb at page re-load
		*/
		resetPage() {
			let tf = this.tf;
			if (!this.isEnabled()) return;
			this.emitter.emit("before-reset-page", tf);
			let pgNb = tf.feature("store").getPageNb();
			if (pgNb !== "") this.changePage(pgNb - 1);
			this.emitter.emit("after-reset-page", tf, pgNb);
		}
		/**
		* Re-set page length value at page re-load
		*/
		resetPageLength() {
			let tf = this.tf;
			if (!this.isEnabled()) return;
			this.emitter.emit("before-reset-page-length", tf);
			let pglenIndex = tf.feature("store").getPageLength();
			if (pglenIndex !== "") {
				this.pageLengthSlc.options[pglenIndex].selected = true;
				this.changeResultsPerPage();
			}
			this.emitter.emit("after-reset-page-length", tf, pglenIndex);
		}
		/** @private */
		changePageHandler(tf, pageNumber) {
			this.setPage(pageNumber);
		}
		/** @private */
		changePageResultsHandler(tf, pageLength) {
			this.changeResultsPerPage(pageLength);
		}
		/**
		* Remove paging feature
		*/
		destroy() {
			if (!this.initialized) return;
			let evt = this.evt;
			if (this.pageSlc) {
				if (this.pageSelectorType === "select") removeEvt(this.pageSlc, "change", evt.slcPagesChange);
				else if (this.pageSelectorType === "input") removeEvt(this.pageSlc, "keypress", evt._detectKey);
				removeElm(this.pageSlc);
			}
			if (this.btnNextCont) {
				removeEvt(this.btnNextCont, "click", evt.next);
				removeElm(this.btnNextCont);
				this.btnNextCont = null;
			}
			if (this.btnPrevCont) {
				removeEvt(this.btnPrevCont, "click", evt.prev);
				removeElm(this.btnPrevCont);
				this.btnPrevCont = null;
			}
			if (this.btnLastCont) {
				removeEvt(this.btnLastCont, "click", evt.last);
				removeElm(this.btnLastCont);
				this.btnLastCont = null;
			}
			if (this.btnFirstCont) {
				removeEvt(this.btnFirstCont, "click", evt.first);
				removeElm(this.btnFirstCont);
				this.btnFirstCont = null;
			}
			if (this.pgBefore) {
				removeElm(this.pgBefore);
				this.pgBefore = null;
			}
			if (this.pgAfter) {
				removeElm(this.pgAfter);
				this.pgAfter = null;
			}
			if (this.pgCont) {
				removeElm(this.pgCont);
				this.pgCont = null;
			}
			if (this.hasResultsPerPage) this.removeResultsPerPage();
			this.emitter.off(["after-filtering"], bound(this.resetPagingInfo, this));
			this.emitter.off(["change-page"], bound(this.changePageHandler, this));
			this.emitter.off(["change-page-results"], bound(this.changePageResultsHandler, this));
			this.pageSlc = null;
			this.nbPages = 0;
			this.initialized = false;
		}
	};
	//#endregion
	//#region src/tablefilter.js
	var __deferInit = (Ctor) => class extends Ctor {
		init() {
			const args = arguments;
			if (this.tf && this.tf.initialized) return Ctor.prototype.init.apply(this, args);
			Promise.resolve().then(() => Ctor.prototype.init.apply(this, args));
		}
	};
	var EXTENSIONS = {
		sort: __deferInit(sort_default),
		colsVisibility: __deferInit(ColsVisibility),
		colOps: __deferInit(ColOps),
		advancedGrid: __deferInit(advancedGrid_default),
		filtersVisibility: __deferInit(FiltersVisibility)
	};
	var doc = root.document;
	var FEATURES = [
		DateType,
		Help,
		State,
		MarkActiveColumns,
		GridLayout,
		Loader,
		HighlightKeyword,
		PopupFilter,
		RowsCounter,
		StatusBar,
		ClearButton,
		AlternateRows,
		NoResults,
		Paging,
		Toolbar
	];
	/**
	* Makes HTML tables filterable and a bit more :)
	*
	* @export
	* @class TableFilter
	*/
	var TableFilter = class {
		/**
		* Creates an instance of TableFilter
		* requires `table` or `id` arguments, `row` and `configuration` optional
		* @param {HTMLTableElement} table Table DOM element
		* @param {String} id Table id
		* @param {Number} row index indicating the 1st row
		* @param {Object} configuration object
		*/
		constructor(...args) {
			/**
			* ID of current instance
			* @type {String}
			* @private
			*/
			this.id = null;
			/**
			* Current version
			* @type {String}
			*/
			this.version = "0.7.6";
			/**
			* Current year
			* @type {Number}
			* @private
			*/
			this.year = (/* @__PURE__ */ new Date()).getFullYear();
			/**
			* HTML Table DOM element
			* @type {DOMElement}
			* @private
			*/
			this.tbl = null;
			/**
			* Calculated row's index from which starts filtering once filters
			* are generated
			* @type {Number}
			*/
			this.refRow = null;
			/**
			* Index of the headers row
			* @type {Number}
			* @private
			*/
			this.headersRow = null;
			/**
			* Configuration object
			* @type {Object}
			* @private
			*/
			this.cfg = {};
			/**
			* Number of rows that can be filtered
			* @type {Number}
			* @private
			*/
			this.nbFilterableRows = 0;
			/**
			* Number of cells in the reference row
			* @type {Number}
			* @private
			*/
			this.nbCells = null;
			/**
			* Has a configuration object
			* @type {Object}
			* @private
			*/
			this.hasConfig = false;
			/** @private */
			this.initialized = false;
			let startRow;
			args.forEach((arg) => {
				if (typeof arg === "object" && arg.nodeName === "TABLE") {
					this.tbl = arg;
					this.id = arg.id || `tf_${uuid()}`;
					this.tbl.id = this.id;
				} else if (isString(arg)) {
					this.id = arg;
					this.tbl = elm(arg);
				} else if (isNumber(arg)) startRow = arg;
				else if (isObj(arg)) {
					this.cfg = arg;
					this.hasConfig = true;
				}
			});
			if (!this.tbl || this.tbl.nodeName !== "TABLE") throw new Error(`Could not instantiate TableFilter: HTML table
                DOM element not found.`);
			if (this.getRowsNb(true) === 0) throw new Error(`Could not instantiate TableFilter: HTML table
                requires at least 1 row.`);
			let f = this.cfg;
			/**
			* Event emitter instance
			* @type {Emitter}
			*/
			this.emitter = new Emitter();
			this.refRow = isUndef(startRow) ? 2 : startRow + 1;
			/**
			* Collection of filter type by column
			* @type {Array}
			* @private
			*/
			this.filterTypes = [].map.call((this.dom().rows[this.refRow] || this.dom().rows[0]).cells, (cell, idx) => {
				let colType = this.cfg[`col_${idx}`];
				return !colType ? INPUT : colType.toLowerCase();
			});
			/**
			* Base path for static assets
			* @type {String}
			*/
			this.basePath = defaultsStr(f.base_path, "tablefilter/");
			/*** filters' grid properties ***/
			/**
			* Enable/disable filters
			* @type {Boolean}
			*/
			this.fltGrid = defaultsBool(f.grid, true);
			/**
			* Enable/disable grid layout (fixed headers)
			* @type {Object|Boolean}
			*/
			this.gridLayout = isObj(f.grid_layout) || Boolean(f.grid_layout);
			/**
			* Filters row index
			* @type {Number}
			*/
			this.filtersRowIndex = defaultsNb(f.filters_row_index, 0);
			/**
			* Headers row index
			* @type {Number}
			*/
			this.headersRow = defaultsNb(f.headers_row_index, this.filtersRowIndex === 0 ? 1 : 0);
			/**
			* Define the type of cell containing a filter (td/th)
			* @type {String}
			*/
			this.fltCellTag = defaultsStr(f.filters_cell_tag, "TD");
			/**
			* List of filters IDs
			* @type {Array}
			* @private
			*/
			this.fltIds = [];
			/**
			* List of valid rows indexes (rows visible upon filtering)
			* @type {Array}
			* @private
			*/
			this.validRowsIndex = [];
			/*** filters' grid appearance ***/
			/**
			* Path for stylesheets
			* @type {String}
			*/
			this.stylePath = this.getStylePath();
			/**
			* Main stylesheet path
			* @type {String}
			*/
			this.stylesheet = this.getStylesheetPath();
			/**
			* Main stylesheet ID
			* @type {String}
			* @private
			*/
			this.stylesheetId = this.id + "_style";
			/**
			* Css class for the filters row
			* @type {String}
			*/
			this.fltsRowCssClass = defaultsStr(f.flts_row_css_class, "fltrow");
			/**
			* Enable/disable icons (paging, reset button)
			* @type {Boolean}
			*/
			this.enableIcons = defaultsBool(f.enable_icons, true);
			/**
			* Enable/disable alternating rows
			* @type {Boolean}
			*/
			this.alternateRows = Boolean(f.alternate_rows);
			/**
			* Columns widths array
			* @type {Array}
			*/
			this.colWidths = defaultsArr(f.col_widths, []);
			/**
			* Default column width when column widths are defined
			*/
			this.defaultColWidth = defaultsNb(f.default_col_width, 100);
			/**
			* Css class for a filter element
			* @type {String}
			*/
			this.fltCssClass = defaultsStr(f.flt_css_class, "flt");
			/**
			* Css class for multiple select filters
			* @type {String}
			*/
			this.fltMultiCssClass = defaultsStr(f.flt_multi_css_class, "flt_multi");
			/**
			* Css class for small filter (when submit button is active)
			* @type {String}
			*/
			this.fltSmallCssClass = defaultsStr(f.flt_small_css_class, "flt_s");
			/**
			* Css class for single filter type
			* @type {String}
			*/
			this.singleFltCssClass = defaultsStr((f.single_filter || {}).css_class, "single_flt");
			/*** filters' grid behaviours ***/
			/**
			* Enable/disable enter key for input type filters
			* @type {Boolean}
			*/
			this.enterKey = defaultsBool(f.enter_key, true);
			/**
			* Callback fired before filtering process starts
			* @type {Function}
			*/
			this.onBeforeFilter = defaultsFn(f.on_before_filter, EMPTY_FN);
			/**
			* Callback fired after filtering process is completed
			* @type {Function}
			*/
			this.onAfterFilter = defaultsFn(f.on_after_filter, EMPTY_FN);
			/**
			* Enable/disable case sensitivity for filtering, default false
			* @type {Boolean}
			*/
			this.caseSensitive = Boolean(f.case_sensitive);
			/**
			* Indicate whether exact match filtering is enabled on a per column
			* basis
			* @type {Boolean}
			* @private
			*/
			this.hasExactMatchByCol = isArray(f.columns_exact_match);
			/**
			* Exact match filtering per column array
			* @type {Array}
			*/
			this.exactMatchByCol = this.hasExactMatchByCol ? f.columns_exact_match : [];
			/**
			* Globally enable/disable exact match filtering
			* @type {Boolean}
			*/
			this.exactMatch = Boolean(f.exact_match);
			/**
			* Ignore diacritics globally or on a column basis
			* @type {Boolean|Array}
			*/
			this.ignoreDiacritics = f.ignore_diacritics;
			/**
			* Enable/disable linked filters filtering mode
			* @type {Boolean}
			*/
			this.linkedFilters = Boolean(f.linked_filters);
			/**
			* Enable/disable readonly state for excluded options when
			* linked filters filtering mode is on
			* @type {Boolean}
			*/
			this.disableExcludedOptions = Boolean(f.disable_excluded_options);
			/**
			* Active filter ID
			* @type {String}
			* @private
			*/
			this.activeFilterId = null;
			/**
			* Determine if there are excluded rows from filtering
			* @type {Boolean}
			* @private
			*/
			this.hasExcludedRows = Boolean(isArray(f.exclude_rows) && f.exclude_rows.length > 0);
			/**
			* List of row indexes to be excluded from filtering
			* @type {Array}
			*/
			this.excludeRows = defaultsArr(f.exclude_rows, []);
			/**
			* List of containers IDs where external filters will be generated
			* @type {Array}
			*/
			this.externalFltIds = defaultsArr(f.external_flt_ids, []);
			/**
			* Callback fired after filters are generated
			* @type {Function}
			*/
			this.onFiltersLoaded = defaultsFn(f.on_filters_loaded, EMPTY_FN);
			/**
			* Enable/disable single filter mode
			* @type {Boolean|Object}
			*/
			this.singleFlt = isObj(f.single_filter) || Boolean(f.single_filter);
			/**
			* Specify columns to be excluded from single filter search, by default
			* searching in all columns:
			* single_filter: {
			*      exclude_cols: [2, 7]
			* }
			*/
			this.singleFltExcludeCols = isObj(f.single_filter) && isArray(f.single_filter.exclude_cols) ? f.single_filter.exclude_cols : [];
			/**
			* Callback fired after a row is validated during filtering
			* @type {Function}
			*/
			this.onRowValidated = defaultsFn(f.on_row_validated, EMPTY_FN);
			/**
			* Specify which column implements a custom cell parser to retrieve the
			* cell value:
			* cell_parser: {
			*     cols: [0, 2],
			*     parse: function(tf, cell, colIndex) {
			*         // custom cell parser logic here
			*         return cellValue;
			*     }
			* }
			* @type {Object}
			*/
			this.cellParser = isObj(f.cell_parser) && isFn(f.cell_parser.parse) && isArray(f.cell_parser.cols) ? f.cell_parser : {
				cols: [],
				parse: EMPTY_FN
			};
			/**
			* Global watermark text for input filter type or watermark for each
			* filter if an array is supplied
			* @type {String|Array}
			*/
			this.watermark = f.watermark || "";
			/**
			* Indicate whether watermark is on a per column basis
			* @type {Boolean}
			* @private
			*/
			this.isWatermarkArray = isArray(this.watermark);
			/**
			* Indicate whether help UI component is disabled
			* @type {Boolean}
			*/
			this.help = isUndef(f.help_instructions) ? void 0 : isObj(f.help_instructions) || Boolean(f.help_instructions);
			/**
			* Indicate whether pop-up filters UI is enabled
			* @type {Boolean|Object}
			*/
			this.popupFilters = isObj(f.popup_filters) || Boolean(f.popup_filters);
			/**
			* Indicate whether filtered (active) columns indicator is enabled
			* @type {Boolean}
			*/
			this.markActiveColumns = isObj(f.mark_active_columns) || Boolean(f.mark_active_columns);
			/*** select filter's customisation and behaviours ***/
			/**
			* Text for clear option in drop-down filter types (1st option)
			* @type {String|Array}
			*/
			this.clearFilterText = isArray(f.clear_filter_text) ? f.clear_filter_text : defaultsStr(f.clear_filter_text, "Clear");
			/**
			* Indicate whether empty option is enabled in drop-down filter types
			* @type {Boolean}
			*/
			this.enableEmptyOption = Boolean(f.enable_empty_option);
			/**
			* Text for empty option in drop-down filter types
			* @type {String}
			*/
			this.emptyText = defaultsStr(f.empty_text, "(Empty)");
			/**
			* Indicate whether non-empty option is enabled in drop-down filter
			* types
			* @type {Boolean}
			*/
			this.enableNonEmptyOption = Boolean(f.enable_non_empty_option);
			/**
			* Text for non-empty option in drop-down filter types
			* @type {String}
			*/
			this.nonEmptyText = defaultsStr(f.non_empty_text, "(Non empty)");
			/**
			* Indicate whether drop-down filter types filter the table by default
			* on change event
			* @type {Boolean}
			*/
			this.onSlcChange = defaultsBool(f.on_change, true);
			/**
			* Make drop-down filter types options sorted in alpha-numeric manner
			* by default globally or on a column basis
			* @type {Boolean|Array}
			*/
			this.sortSlc = isUndef(f.sort_select) ? true : defaultsArr(f.sort_select, Boolean(f.sort_select));
			/**
			* List of columns implementing filter options sorting in ascending
			* manner based on column data type
			* @type {Array}
			*/
			this.sortFilterOptionsAsc = defaultsArr(f.sort_filter_options_asc, []);
			/**
			* List of columns implementing filter options sorting in descending
			* manner based on column data type
			* @type {Array}
			*/
			this.sortFilterOptionsDesc = defaultsArr(f.sort_filter_options_desc, []);
			/**
			* Indicate whether drop-down filter types are populated on demand at
			* first usage
			* @type {Boolean}
			*/
			this.loadFltOnDemand = Boolean(f.load_filters_on_demand);
			/**
			* Indicate whether custom drop-down filter options are implemented
			* @type {Boolean}
			*/
			this.hasCustomOptions = isObj(f.custom_options);
			/**
			* Custom options definition of a per column basis, ie:
			*	custom_options: {
			*      cols:[0, 1],
			*      texts: [
			*          ['a0', 'b0', 'c0'],
			*          ['a1', 'b1', 'c1']
			*      ],
			*      values: [
			*          ['a0', 'b0', 'c0'],
			*          ['a1', 'b1', 'c1']
			*      ],
			*      sorts: [false, true]
			*  }
			*
			* @type {Object}
			*/
			this.customOptions = f.custom_options;
			/*** Filter operators ***/
			/**
			* Regular expression operator for input filter. Defaults to 'rgx:'
			* @type {String}
			*/
			this.rgxOperator = defaultsStr(f.regexp_operator, "rgx:");
			/**
			* Empty cells operator for input filter. Defaults to '[empty]'
			* @type {String}
			*/
			this.emOperator = defaultsStr(f.empty_operator, "[empty]");
			/**
			* Non-empty cells operator for input filter. Defaults to '[nonempty]'
			* @type {String}
			*/
			this.nmOperator = defaultsStr(f.nonempty_operator, "[nonempty]");
			/**
			* Logical OR operator for input filter. Defaults to '||'
			* @type {String}
			*/
			this.orOperator = defaultsStr(f.or_operator, "||");
			/**
			* Logical AND operator for input filter. Defaults to '&&'
			* @type {String}
			*/
			this.anOperator = defaultsStr(f.and_operator, "&&");
			/**
			* Greater than operator for input filter. Defaults to '>'
			* @type {String}
			*/
			this.grOperator = defaultsStr(f.greater_operator, ">");
			/**
			* Lower than operator for input filter. Defaults to '<'
			* @type {String}
			*/
			this.lwOperator = defaultsStr(f.lower_operator, "<");
			/**
			* Lower than or equal operator for input filter. Defaults to '<='
			* @type {String}
			*/
			this.leOperator = defaultsStr(f.lower_equal_operator, "<=");
			/**
			* Greater than or equal operator for input filter. Defaults to '>='
			* @type {String}
			*/
			this.geOperator = defaultsStr(f.greater_equal_operator, ">=");
			/**
			* Inequality operator for input filter. Defaults to '!'
			* @type {String}
			*/
			this.dfOperator = defaultsStr(f.different_operator, "!");
			/**
			* Like operator for input filter. Defaults to '*'
			* @type {String}
			*/
			this.lkOperator = defaultsStr(f.like_operator, "*");
			/**
			* Strict equality operator for input filter. Defaults to '='
			* @type {String}
			*/
			this.eqOperator = defaultsStr(f.equal_operator, "=");
			/**
			* Starts with operator for input filter. Defaults to '='
			* @type {String}
			*/
			this.stOperator = defaultsStr(f.start_with_operator, "{");
			/**
			* Ends with operator for input filter. Defaults to '='
			* @type {String}
			*/
			this.enOperator = defaultsStr(f.end_with_operator, "}");
			/**
			* Stored values separator
			* @type {String}
			*/
			this.separator = defaultsStr(f.separator, ",");
			/**
			* Enable rows counter UI component
			* @type {Boolean|Object}
			*/
			this.rowsCounter = isObj(f.rows_counter) || Boolean(f.rows_counter);
			/**
			* Enable status bar UI component
			* @type {Boolean|Object}
			*/
			this.statusBar = isObj(f.status_bar) || Boolean(f.status_bar);
			/**
			* Enable activity/spinner indicator UI component
			* @type {Boolean|Object}
			*/
			this.loader = isObj(f.loader) || Boolean(f.loader);
			/*** validation - reset buttons/links ***/
			/**
			* Enable filters submission button
			* @type {Boolean}
			*/
			this.displayBtn = Boolean(f.btn);
			/**
			* Define filters submission button text
			* @type {String}
			*/
			this.btnText = defaultsStr(f.btn_text, !this.enableIcons ? "Go" : "");
			/**
			* Css class for filters submission button
			* @type {String}
			*/
			this.btnCssClass = defaultsStr(f.btn_css_class, !this.enableIcons ? "btnflt" : "btnflt_icon");
			/**
			* Enable clear button
			* @type {Object|Boolean}
			*/
			this.btnReset = isObj(f.btn_reset) || Boolean(f.btn_reset);
			/**
			* Callback fired before filters are cleared
			* @type {Function}
			*/
			this.onBeforeReset = defaultsFn(f.on_before_reset, EMPTY_FN);
			/**
			* Callback fired after filters are cleared
			* @type {Function}
			*/
			this.onAfterReset = defaultsFn(f.on_after_reset, EMPTY_FN);
			/**
			* Enable paging component
			* @type {Object|Boolean}
			*/
			this.paging = isObj(f.paging) || Boolean(f.paging);
			/**
			* Number of hidden rows
			* @type {Number}
			* @private
			*/
			this.nbHiddenRows = 0;
			/**
			* Enable auto-filter behaviour, table is filtered when a user
			* stops typing
			* @type {Object|Boolean}
			*/
			this.autoFilter = isObj(f.auto_filter) || Boolean(f.auto_filter);
			/**
			* Auto-filter delay in milliseconds
			* @type {Number}
			*/
			this.autoFilterDelay = isObj(f.auto_filter) && isNumber(f.auto_filter.delay) ? f.auto_filter.delay : 750;
			/**
			* Indicate whether user is typing
			* @type {Boolean}
			* @private
			*/
			this.isUserTyping = null;
			/**
			* Auto-filter interval ID
			* @type {String}
			* @private
			*/
			this.autoFilterTimer = null;
			/**
			* Enable keyword highlighting behaviour
			* @type {Boolean}
			*/
			this.highlightKeywords = Boolean(f.highlight_keywords);
			/**
			* Enable no results message UI component
			* @type {Object|Boolean}
			*/
			this.noResults = isObj(f.no_results_message) || Boolean(f.no_results_message);
			/**
			* Enable state persistence
			* @type {Object|Boolean}
			*/
			this.state = isObj(f.state) || Boolean(f.state);
			/*** data types ***/
			/**
			* Enable date type module
			* @type {Boolean}
			* @private
			*/
			this.dateType = true;
			/**
			* Define default locale, default to 'en' as per Sugar Date module:
			* https://sugarjs.com/docs/#/DateLocales
			* @type {String}
			*/
			this.locale = defaultsStr(f.locale, "en");
			/**
			* Define thousands separator ',' or '.', defaults to ','
			* @type {String}
			*/
			this.thousandsSeparator = defaultsStr(f.thousands_separator, ",");
			/**
			* Define decimal separator ',' or '.', defaults to '.'
			* @type {String}
			*/
			this.decimalSeparator = defaultsStr(f.decimal_separator, ".");
			/**
			* Define data types on a column basis, possible values 'string',
			* 'number', 'formatted-number', 'date', 'ipaddress' ie:
			* col_types : [
			*  'string', 'date', 'number',
			*  { type: 'formatted-number', decimal: ',', thousands: '.' },
			*  { type: 'date', locale: 'en-gb' },
			*  { type: 'date', format: ['{dd}-{months}-{yyyy|yy}'] }
			* ]
			*
			* Refer to https://sugarjs.com/docs/#/DateParsing for exhaustive
			* information on date parsing formats supported by Sugar Date
			* @type {Array}
			*/
			this.colTypes = isArray(f.col_types) ? f.col_types : [];
			/*** ids prefixes ***/
			/**
			* Main prefix
			* @private
			*/
			this.prfxTf = "TF";
			/**
			* Filter's ID prefix (inputs - selects)
			* @private
			*/
			this.prfxFlt = "flt";
			/**
			* Button's ID prefix
			* @private
			*/
			this.prfxValButton = "btn";
			/**
			* Responsive Css class
			* @private
			*/
			this.prfxResponsive = "resp";
			/** @private */
			this.stickyCssClass = "sticky";
			/*** extensions ***/
			/**
			* List of loaded extensions
			* @type {Array}
			*/
			this.extensions = defaultsArr(f.extensions, []);
			/*** themes ***/
			/**
			* Enable default theme
			* @type {Boolean}
			*/
			this.enableDefaultTheme = Boolean(f.enable_default_theme);
			/**
			* Determine whether themes are enables
			* @type {Boolean}
			* @private
			*/
			this.hasThemes = this.enableDefaultTheme || isArray(f.themes);
			/**
			* List of themes, ie:
			* themes: [{ name: 'skyblue' }]
			* @type {Array}
			*/
			this.themes = defaultsArr(f.themes, []);
			/**
			* Define path to themes assets, defaults to
			* 'tablefilter/style/themes/'. Usage:
			* themes: [{ name: 'skyblue' }]
			* @type {Array}
			*/
			this.themesPath = this.getThemesPath();
			/**
			* Enable responsive layout
			* @type {Boolean}
			*/
			this.responsive = Boolean(f.responsive);
			/**
			* Enable toolbar component
			* @type {Object|Boolean}
			*/
			this.toolbar = isObj(f.toolbar) || Boolean(f.toolbar);
			/**
			* Enable sticky headers
			* @type {Boolean}
			*/
			this.stickyHeaders = Boolean(f.sticky_headers);
			/**
			* Features registry
			* @private
			*/
			this.Mod = {};
			/**
			* Extensions registry
			* @private
			*/
			this.ExtRegistry = {};
			this.instantiateFeatures(FEATURES);
		}
		/**
		* Initialise features and layout
		*/
		init() {
			if (this.initialized) return;
			this.import(this.stylesheetId, this.getStylesheetPath(), null, "link");
			let Mod = this.Mod;
			let inpclass;
			this.loadThemes();
			this.initFeatures([
				DateType,
				Help,
				State,
				MarkActiveColumns,
				GridLayout,
				Loader,
				HighlightKeyword,
				PopupFilter
			]);
			if (!this.fltGrid) this._initNoFilters();
			else {
				let fltrow = this._insertFiltersRow();
				this.nbCells = this.getCellsNb(this.refRow);
				this.nbFilterableRows = this.getRowsNb();
				let n = this.singleFlt ? 1 : this.nbCells;
				for (let i = 0; i < n; i++) {
					this.emitter.emit("before-filter-init", this, i);
					let fltCell = createElm(this.fltCellTag), col = this.getFilterType(i);
					if (this.singleFlt) fltCell.colSpan = this.nbCells;
					if (!this.gridLayout) fltrow.appendChild(fltCell);
					inpclass = i === n - 1 && this.displayBtn ? this.fltSmallCssClass : this.fltCssClass;
					if (this.singleFlt) {
						col = INPUT;
						inpclass = this.singleFltCssClass;
					}
					if (col === "select" || col === "multiple") {
						Mod.dropdown = Mod.dropdown || new Dropdown(this);
						Mod.dropdown.init(i, this.isExternalFlt(), fltCell);
					} else if (col === "checklist") {
						Mod.checkList = Mod.checkList || new CheckList(this);
						Mod.checkList.init(i, this.isExternalFlt(), fltCell);
					} else this._buildInputFilter(i, inpclass, fltCell);
					if (i === n - 1 && this.displayBtn) this._buildSubmitButton(this.isExternalFlt() ? elm(this.externalFltIds[i]) : fltCell);
					this.emitter.emit("after-filter-init", this, i);
				}
				this.emitter.on(["filter-focus"], (tf, filter) => this.setActiveFilterId(filter.id));
			}
			if (this.hasExcludedRows) {
				this.emitter.on(["after-filtering"], () => this.setExcludeRows());
				this.setExcludeRows();
			}
			this.initFeatures([
				RowsCounter,
				StatusBar,
				ClearButton,
				AlternateRows,
				NoResults,
				Paging,
				Toolbar
			]);
			this.setColWidths();
			if (!this.gridLayout) {
				addClass(this.dom(), this.prfxTf);
				if (this.responsive) addClass(this.dom(), this.prfxResponsive);
				if (this.colWidths.length > 0) this.setFixedLayout();
				if (this.stickyHeaders && this.dom().tHead) addClass(this.dom(), this.stickyCssClass);
			}
			this.initExtensions();
			this.initialized = true;
			this.onFiltersLoaded(this);
			this.emitter.emit("initialized", this);
		}
		/**
		* Detect <enter> key
		* @param {Event} evt
		*/
		detectKey(evt) {
			if (!this.enterKey) return;
			if (isKeyPressed(evt, [13])) {
				this.filter();
				cancelEvt(evt);
				stopEvt(evt);
			} else {
				this.isUserTyping = true;
				root.clearInterval(this.autoFilterTimer);
				this.autoFilterTimer = null;
			}
		}
		/**
		* Filter's keyup event: if auto-filter on, detect user is typing and filter
		* columns
		* @param {Event} evt
		*/
		onKeyUp(evt) {
			if (!this.autoFilter) return;
			this.isUserTyping = false;
			function filter() {
				root.clearInterval(this.autoFilterTimer);
				this.autoFilterTimer = null;
				if (!this.isUserTyping) {
					this.filter();
					this.isUserTyping = null;
				}
			}
			if (isKeyPressed(evt, [
				13,
				9,
				27,
				38,
				40
			])) {
				root.clearInterval(this.autoFilterTimer);
				this.autoFilterTimer = null;
			} else {
				if (this.autoFilterTimer !== null) return;
				this.autoFilterTimer = root.setInterval(filter.bind(this), this.autoFilterDelay);
			}
		}
		/**
		* Filter's keydown event: if auto-filter on, detect user is typing
		*/
		onKeyDown() {
			if (this.autoFilter) this.isUserTyping = true;
		}
		/**
		* Filter's focus event
		* @param {Event} evt
		*/
		onInpFocus(evt) {
			let elm = targetEvt(evt);
			this.emitter.emit("filter-focus", this, elm);
		}
		/**
		* Filter's blur event: if auto-filter on, clear interval on filter blur
		*/
		onInpBlur() {
			if (this.autoFilter) {
				this.isUserTyping = false;
				root.clearInterval(this.autoFilterTimer);
			}
			this.emitter.emit("filter-blur", this);
		}
		/**
		* Insert filters row at initialization
		*/
		_insertFiltersRow() {
			if (this.gridLayout) return;
			let fltrow;
			let thead = tag(this.dom(), "thead");
			if (thead.length > 0) fltrow = thead[0].insertRow(this.filtersRowIndex);
			else fltrow = this.dom().insertRow(this.filtersRowIndex);
			fltrow.className = this.fltsRowCssClass;
			if (this.isExternalFlt()) fltrow.style.display = NONE;
			this.emitter.emit("filters-row-inserted", this, fltrow);
			return fltrow;
		}
		/**
		* Initialize filtersless table
		*/
		_initNoFilters() {
			if (this.fltGrid) return;
			this.refRow = this.refRow > 0 ? this.refRow - 1 : 0;
			this.nbFilterableRows = this.getRowsNb();
		}
		/**
		* Build input filter type
		* @param  {Number} colIndex      Column index
		* @param  {String} cssClass      Css class applied to filter
		* @param  {DOMElement} container Container DOM element
		*/
		_buildInputFilter(colIndex, cssClass, container) {
			let col = this.getFilterType(colIndex);
			let externalFltTgtId = this.isExternalFlt() ? this.externalFltIds[colIndex] : null;
			let inpType = col === "input" ? "text" : "hidden";
			let inp = createElm(INPUT, ["id", this.buildFilterId(colIndex)], ["type", inpType], ["ct", colIndex]);
			if (inpType !== "hidden" && this.watermark) inp.setAttribute("placeholder", this.isWatermarkArray ? this.watermark[colIndex] || "" : this.watermark);
			inp.className = cssClass || this.fltCssClass;
			addEvt(inp, "focus", (evt) => this.onInpFocus(evt));
			if (externalFltTgtId) elm(externalFltTgtId).appendChild(inp);
			else container.appendChild(inp);
			this.fltIds.push(inp.id);
			addEvt(inp, "keypress", (evt) => this.detectKey(evt));
			addEvt(inp, "keydown", () => this.onKeyDown());
			addEvt(inp, "keyup", (evt) => this.onKeyUp(evt));
			addEvt(inp, "blur", () => this.onInpBlur());
		}
		/**
		* Build submit button
		* @param  {DOMElement} container Container DOM element
		*/
		_buildSubmitButton(container) {
			let btn = createElm(INPUT, ["type", "button"], ["value", this.btnText]);
			btn.className = this.btnCssClass;
			container.appendChild(btn);
			addEvt(btn, "click", () => this.filter());
		}
		/**
		* Conditionally istantiate each feature class in passed collection if
		* required by configuration and add it to the features registry. A feature
		* class meta information contains a `name` field and optional `altName` and
		* `alwaysInstantiate` fields
		* @param {Array} [features=[]]
		* @private
		*/
		instantiateFeatures(features = []) {
			features.forEach((featureCls) => {
				let Cls = featureCls;
				Cls.meta = Cls.meta || {
					name: null,
					altName: null
				};
				Cls.meta.name = toCamelCase(Cls.name);
				let { name, altName, alwaysInstantiate } = Cls.meta;
				let prop = altName || name;
				if (!this.hasConfig || this[prop] === true || Boolean(alwaysInstantiate)) this.Mod[name] = this.Mod[name] || new Cls(this);
			});
		}
		/**
		* Initialise each feature class in passed collection.
		* @param {Array} [features=[]]
		* @private
		*/
		initFeatures(features = []) {
			features.forEach((featureCls) => {
				let { name, altName } = featureCls.meta;
				let prop = altName || name;
				if (this[prop] === true && this.Mod[name]) this.Mod[name].init();
			});
		}
		/**
		* Return a feature instance for a given name
		* @param  {String} name Name of the feature
		* @return {Object}
		*/
		feature(name) {
			return this.Mod[name];
		}
		/**
		* Initialise all the extensions defined in the configuration object
		*/
		initExtensions() {
			let exts = this.extensions;
			if (exts.length === 0) return;
			if (typeof __webpack_public_path__ !== "undefined") __webpack_public_path__ = this.basePath;
			this.emitter.emit("before-loading-extensions", this);
			exts.forEach((ext) => {
				this.loadExtension(ext);
			});
			this.emitter.emit("after-loading-extensions", this);
		}
		/**
		* Load an extension module
		* @param  {Object} ext Extension config object
		*/
		loadExtension(ext) {
			if (!ext || !ext.name || this.hasExtension(ext.name)) return;
			let { name, path } = ext;
			let modulePath;
			if (name && path) modulePath = ext.path + name;
			else {
				name = name.replace(".js", "");
				modulePath = "extensions/{}/{}".replace(/{}/g, name);
			}
			if (typeof EXTENSIONS !== "undefined" && EXTENSIONS[name]) {
				let inst = new EXTENSIONS[name](this, ext);
				inst.init();
				this.ExtRegistry[name] = inst;
				return;
			}
			if (typeof require !== "undefined") try {
				require(["./" + modulePath], (mod) => {
					let inst = new mod.default(this, ext);
					inst.init();
					this.ExtRegistry[name] = inst;
				});
			} catch (e) {
				console.warn("TableFilter: extension \"" + name + "\" could not be loaded outside a webpack bundle.");
			}
		}
		/**
		* Get an extension instance
		* @param  {String} name Name of the extension
		* @return {Object}      Extension instance
		*/
		extension(name) {
			return this.ExtRegistry[name];
		}
		/**
		* Check passed extension name exists
		* @param  {String}  name Name of the extension
		* @return {Boolean}
		*/
		hasExtension(name) {
			return !isEmpty(this.ExtRegistry[name]);
		}
		/**
		* Register the passed extension instance with associated name
		* @param {Object} inst Extension instance
		* @param {String} name Name of the extension
		*/
		registerExtension(inst, name) {
			this.ExtRegistry[name] = inst;
		}
		/**
		* Destroy all the extensions store in extensions registry
		*/
		destroyExtensions() {
			let reg = this.ExtRegistry;
			Object.keys(reg).forEach((key) => {
				reg[key].destroy();
				reg[key] = void 0;
			});
		}
		/**
		* Load themes defined in the configuration object
		*/
		loadThemes() {
			if (!this.hasThemes) return;
			let themes = this.themes;
			this.emitter.emit("before-loading-themes", this);
			if (this.enableDefaultTheme) this.themes.push({ name: "default" });
			themes.forEach((theme, i) => {
				let { name, path } = theme;
				let styleId = this.prfxTf + name;
				if (name && !path) path = this.themesPath + name + "/" + name + ".css";
				else if (!name && theme.path) name = "theme{0}".replace("{0}", i);
				if (!this.isImported(path, "link")) this.import(styleId, path, null, "link");
			});
			this.loader = true;
			this.emitter.emit("after-loading-themes", this);
		}
		/**
		* Return stylesheet DOM element for a given theme name
		* @return {DOMElement} stylesheet element
		*/
		getStylesheet(name = "default") {
			return elm(this.prfxTf + name);
		}
		/**
		* Destroy filter grid
		*/
		destroy() {
			if (!this.initialized) return;
			let emitter = this.emitter;
			if (this.isExternalFlt() && !this.popupFilters) this.removeExternalFlts();
			this.destroyExtensions();
			this.validateAllRows();
			emitter.emit("destroy", this);
			if (this.fltGrid && !this.gridLayout) this.dom().deleteRow(this.filtersRowIndex);
			if (this.hasExcludedRows) emitter.off(["after-filtering"], () => this.setExcludeRows());
			this.emitter.off(["filter-focus"], (tf, filter) => this.setActiveFilterId(filter.id));
			removeClass(this.dom(), this.prfxTf);
			removeClass(this.dom(), this.prfxResponsive);
			if (this.dom().tHead) removeClass(this.dom().tHead, this.stickyCssClass);
			this.nbHiddenRows = 0;
			this.validRowsIndex = [];
			this.fltIds = [];
			this.initialized = false;
		}
		/**
		* Remove all the external column filters
		*/
		removeExternalFlts() {
			if (!this.isExternalFlt()) return;
			this.externalFltIds.forEach((id) => {
				let externalFlt = elm(id);
				if (externalFlt) externalFlt.innerHTML = "";
			});
		}
		/**
		* Check if given column implements a filter with custom options
		* @param  {Number}  colIndex Column's index
		* @return {Boolean}
		*/
		isCustomOptions(colIndex) {
			return this.hasCustomOptions && this.customOptions.cols.indexOf(colIndex) !== -1;
		}
		/**
		* Returns an array [[value0, value1 ...],[text0, text1 ...]] with the
		* custom options values and texts
		* @param  {Number} colIndex Column's index
		* @return {Array}
		*/
		getCustomOptions(colIndex) {
			if (isEmpty(colIndex) || !this.isCustomOptions(colIndex)) return;
			let customOptions = this.customOptions;
			let cols = customOptions.cols;
			let optTxt = [], optArray = [];
			let index = cols.indexOf(colIndex);
			let slcValues = customOptions.values[index];
			let slcTexts = customOptions.texts[index];
			let slcSort = customOptions.sorts[index];
			for (let r = 0, len = slcValues.length; r < len; r++) {
				optArray.push(slcValues[r]);
				if (slcTexts[r]) optTxt.push(slcTexts[r]);
				else optTxt.push(slcValues[r]);
			}
			if (slcSort) {
				optArray.sort();
				optTxt.sort();
			}
			return [optArray, optTxt];
		}
		/**
		* Filter the table by retrieving the data from each cell in every single
		* row and comparing it to the search term for current column. A row is
		* hidden when all the search terms are not found in inspected row.
		*/
		filter() {
			if (!this.fltGrid || !this.initialized) return;
			let emitter = this.emitter;
			this.onBeforeFilter(this);
			emitter.emit("before-filtering", this);
			let hiddenRows = 0;
			this.validRowsIndex = [];
			let searchArgs = this.getFiltersValue();
			this.eachRow()((row, k) => {
				row.style.display = "";
				let cells = row.cells;
				let nbCells = cells.length;
				let occurence = [], isMatch = true, isSingleFltMatch = false;
				for (let j = 0; j < nbCells; j++) {
					let sA = searchArgs[this.singleFlt ? 0 : j];
					if (sA === "") continue;
					let cellValue = matchCase(this.getCellValue(cells[j]), this.caseSensitive);
					let sAOrSplit = sA.toString().split(this.orOperator), hasMultiOrSA = sAOrSplit.length > 1, sAAndSplit = sA.toString().split(this.anOperator), hasMultiAndSA = sAAndSplit.length > 1;
					if (isArray(sA) || hasMultiOrSA || hasMultiAndSA) {
						let cS, s;
						let found = false;
						if (isArray(sA)) s = sA;
						else s = hasMultiOrSA ? sAOrSplit : sAAndSplit;
						for (let w = 0, len = s.length; w < len; w++) {
							cS = trim(s[w]);
							found = this._match(cS, cellValue, cells[j]);
							if (found) emitter.emit("highlight-keyword", this, cells[j], cS);
							if (hasMultiOrSA && found || hasMultiAndSA && !found) break;
							if (isArray(sA) && found) break;
						}
						occurence[j] = found;
					} else {
						occurence[j] = this._match(trim(sA), cellValue, cells[j]);
						if (occurence[j]) emitter.emit("highlight-keyword", this, cells[j], sA);
					}
					if (!occurence[j]) isMatch = false;
					if (this.singleFlt && this.singleFltExcludeCols.indexOf(j) === -1 && occurence[j]) isSingleFltMatch = true;
					emitter.emit("cell-processed", this, j, cells[j]);
				}
				if (isSingleFltMatch) isMatch = true;
				this.validateRow(k, isMatch);
				if (!isMatch) hiddenRows++;
				emitter.emit("row-processed", this, k, this.validRowsIndex.length - 1, isMatch);
			}, (row) => row.cells.length !== this.nbCells);
			this.nbHiddenRows = hiddenRows;
			this.onAfterFilter(this);
			emitter.emit("after-filtering", this, searchArgs);
		}
		/**
		* Match search term in cell data
		* @param {String} term       Search term
		* @param {String} cellValue  Cell data
		* @param {DOMElement} cell   Current cell
		* @return {Boolean}
		* @private
		*/
		_match(term, cellValue, cell) {
			let numData;
			let colIdx = cell.cellIndex;
			let decimal = this.getDecimal(colIdx);
			let reLe = new RegExp(this.leOperator), reGe = new RegExp(this.geOperator), reL = new RegExp(this.lwOperator), reG = new RegExp(this.grOperator), reD = new RegExp(this.dfOperator), reLk = new RegExp(rgxEsc(this.lkOperator)), reEq = new RegExp(this.eqOperator), reSt = new RegExp(this.stOperator), reEn = new RegExp(this.enOperator), reEm = this.emOperator, reNm = this.nmOperator, reRe = new RegExp(rgxEsc(this.rgxOperator));
			term = matchCase(term, this.caseSensitive);
			let occurence = false;
			let hasLO = reL.test(term), hasLE = reLe.test(term), hasGR = reG.test(term), hasGE = reGe.test(term), hasDF = reD.test(term), hasEQ = reEq.test(term), hasLK = reLk.test(term), hasST = reSt.test(term), hasEN = reEn.test(term), hasEM = reEm === term, hasNM = reNm === term, hasRE = reRe.test(term);
			if (this.hasType(colIdx, ["date"])) {
				let dte1, dte2;
				let dateType = this.Mod.dateType;
				let isValidDate = dateType.isValid.bind(dateType);
				let parseDate = dateType.parse.bind(dateType);
				let locale = dateType.getLocale(colIdx);
				let isLDate = hasLO && isValidDate(term.replace(reL, ""), locale);
				let isLEDate = hasLE && isValidDate(term.replace(reLe, ""), locale);
				let isGDate = hasGR && isValidDate(term.replace(reG, ""), locale);
				let isGEDate = hasGE && isValidDate(term.replace(reGe, ""), locale);
				let isDFDate = hasDF && isValidDate(term.replace(reD, ""), locale);
				let isEQDate = hasEQ && isValidDate(term.replace(reEq, ""), locale);
				dte1 = parseDate(cellValue, locale);
				if (isLEDate) {
					dte2 = parseDate(term.replace(reLe, ""), locale);
					occurence = dte1 <= dte2;
				} else if (isLDate) {
					dte2 = parseDate(term.replace(reL, ""), locale);
					occurence = dte1 < dte2;
				} else if (isGEDate) {
					dte2 = parseDate(term.replace(reGe, ""), locale);
					occurence = dte1 >= dte2;
				} else if (isGDate) {
					dte2 = parseDate(term.replace(reG, ""), locale);
					occurence = dte1 > dte2;
				} else if (isDFDate) {
					dte2 = parseDate(term.replace(reD, ""), locale);
					occurence = dte1.toString() !== dte2.toString();
				} else if (isEQDate) {
					dte2 = parseDate(term.replace(reEq, ""), locale);
					occurence = dte1.toString() === dte2.toString();
				} else if (reLk.test(term)) occurence = contains(term.replace(reLk, ""), cellValue, false, this.caseSensitive);
				else if (isValidDate(term)) {
					dte2 = parseDate(term, locale);
					occurence = dte1.toString() === dte2.toString();
				} else if (hasEM) occurence = !cell.hasChildNodes() || isEmpty(cellValue);
				else if (hasNM) occurence = cell.hasChildNodes() && !isEmpty(cellValue);
				else occurence = contains(term, cellValue, this.isExactMatch(colIdx), this.caseSensitive);
			} else {
				numData = parse(cellValue, decimal) || Number(cellValue);
				if (hasRE) try {
					let srchArg = term.replace(reRe, "");
					occurence = new RegExp(srchArg).test(cellValue);
				} catch (ex) {
					occurence = false;
				}
				else if (hasLE) occurence = numData <= parse(term.replace(reLe, ""), decimal);
				else if (hasGE) occurence = numData >= parse(term.replace(reGe, ""), decimal);
				else if (hasLO) occurence = numData < parse(term.replace(reL, ""), decimal);
				else if (hasGR) occurence = numData > parse(term.replace(reG, ""), decimal);
				else if (hasDF) occurence = contains(term.replace(reD, ""), cellValue, false, this.caseSensitive) ? false : true;
				else if (hasLK) occurence = contains(term.replace(reLk, ""), cellValue, false, this.caseSensitive);
				else if (hasEQ) occurence = contains(term.replace(reEq, ""), cellValue, true, this.caseSensitive);
				else if (hasST) occurence = cellValue.indexOf(term.replace(reSt, "")) === 0 ? true : false;
				else if (hasEN) {
					let searchArg = term.replace(reEn, "");
					occurence = cellValue.lastIndexOf(searchArg, cellValue.length - 1) === cellValue.length - 1 - (searchArg.length - 1) && cellValue.lastIndexOf(searchArg, cellValue.length - 1) > -1 ? true : false;
				} else if (hasEM) occurence = !cell.hasChildNodes() || isEmpty(cellValue);
				else if (hasNM) occurence = cell.hasChildNodes() && !isEmpty(cellValue);
				else if (numData && this.hasType(colIdx, ["number", "formatted-number"]) && !this.singleFlt) {
					term = parse(term, decimal) || term;
					occurence = numData === term || contains(term.toString(), numData.toString(), this.isExactMatch(colIdx), this.caseSensitive);
				} else occurence = contains(term, cellValue, this.isExactMatch(colIdx), this.caseSensitive, this.ignoresDiacritics(colIdx));
			}
			return occurence;
		}
		/**
		* Return the data of a specified column
		* @param {Number} colIndex Column index
		* @param {Boolean} [includeHeaders=false] Include headers row
		* @param {Array} [exclude=[]] List of row indexes to be excluded
		* @return Flat list of data for a column
		*/
		getColumnData(colIndex, includeHeaders = false, exclude = []) {
			return this.getColValues(colIndex, includeHeaders, true, exclude);
		}
		/**
		* Return the values of a specified column
		* @param {Number} colIndex Column index
		* @param {Boolean} [includeHeaders=false] Include headers row
		* @param {Array} [exclude=[]] List of row indexes to be excluded
		* @return Flat list of values for a column
		*/
		getColumnValues(colIndex, includeHeaders = false, exclude = []) {
			return this.getColValues(colIndex, includeHeaders, false, exclude);
		}
		/**
		* Return the data of a specified column
		* @param  {Number} colIndex Column index
		* @param  {Boolean} [includeHeaders=false] Include headers row
		* @param  {Boolean} [typed=false] Return a typed value
		* @param  {Array} [exclude=[]] List of row indexes to be excluded
		* @return {Array}           Flat list of data for a column
		* @private
		*/
		getColValues(colIndex, includeHeaders = false, typed = false, exclude = []) {
			let colValues = [];
			let getContent = typed ? this.getCellData.bind(this) : this.getCellValue.bind(this);
			if (includeHeaders) colValues.push(this.getHeadersText()[colIndex]);
			this.eachRow()((row, i) => {
				let isExludedRow = exclude.indexOf(i) !== -1;
				let cells = row.cells;
				if (cells.length === this.nbCells && !isExludedRow) {
					let data = getContent(cells[colIndex]);
					colValues.push(data);
				}
			});
			return colValues;
		}
		/**
		* Return the filter's value of a specified column
		* @param  {Number} index Column index
		* @return {String}       Filter value
		*/
		getFilterValue(index) {
			if (!this.fltGrid) return;
			let fltValue = "";
			let flt = this.getFilterElement(index);
			if (!flt) return fltValue;
			let fltColType = this.getFilterType(index);
			if (fltColType !== "multiple" && fltColType !== "checklist") fltValue = flt.value;
			else if (fltColType === "multiple") fltValue = this.feature("dropdown").getValues(index);
			else if (fltColType === "checklist") fltValue = this.feature("checkList").getValues(index);
			if (isArray(fltValue) && fltValue.length === 0 || fltValue.length === 1 && fltValue[0] === "") fltValue = "";
			return fltValue;
		}
		/**
		* Return the filters' values
		* @return {Array} List of filters' values
		*/
		getFiltersValue() {
			if (!this.fltGrid) return;
			let searchArgs = [];
			this.fltIds.forEach((id, i) => {
				let fltValue = this.getFilterValue(i);
				if (isArray(fltValue)) searchArgs.push(fltValue);
				else searchArgs.push(trim(fltValue));
			});
			return searchArgs;
		}
		/**
		* Return the ID of a specified column's filter
		* @param  {Number} index Column's index
		* @return {String}       ID of the filter element
		*/
		getFilterId(index) {
			if (!this.fltGrid) return;
			return this.fltIds[index];
		}
		/**
		* Return the list of ids of filters matching a specified type.
		* Note: hidden filters are also returned
		*
		* @param  {String} type  Filter type string ('input', 'select', 'multiple',
		*                        'checklist')
		* @param  {Boolean} bool If true returns columns indexes instead of IDs
		* @return {[type]}       List of element IDs or column indexes
		*/
		getFiltersByType(type, bool) {
			if (!this.fltGrid) return;
			let arr = [];
			for (let i = 0, len = this.fltIds.length; i < len; i++) if (this.getFilterType(i) === type.toLowerCase()) {
				let a = bool ? i : this.fltIds[i];
				arr.push(a);
			}
			return arr;
		}
		/**
		* Return the filter's DOM element for a given column
		* @param  {Number} index     Column's index
		* @return {DOMElement}
		*/
		getFilterElement(index) {
			return elm(this.fltIds[index]);
		}
		/**
		* Return the number of cells for a given row index
		* @param  {Number} rowIndex Index of the row
		* @return {Number}          Number of cells
		*/
		getCellsNb(rowIndex = 0) {
			let tr = this.dom().rows[rowIndex >= 0 ? rowIndex : 0];
			return tr ? tr.cells.length : 0;
		}
		/**
		* Return the number of working rows starting from reference row if
		* defined
		* @param  {Boolean} includeHeaders Include the headers row(s)
		* @return {Number}                 Number of working rows
		*/
		getRowsNb(includeHeaders) {
			let nbRows = this.getWorkingRows().length;
			if (this.dom().tHead) return includeHeaders ? nbRows + this.dom().querySelectorAll("thead > tr").length : nbRows;
			return includeHeaders ? nbRows : nbRows - this.refRow;
		}
		/**
		* Return the collection of the working rows, that is, the rows belonging
		* to the tbody section(s)
		* @returns {Array}
		*/
		getWorkingRows() {
			return doc.querySelectorAll(`table#${this.id} > tbody > tr`);
		}
		/**
		* Return the text content of a given cell
		* @param {DOMElement} Cell's DOM element
		* @return {String}
		*/
		getCellValue(cell) {
			let idx = cell.cellIndex;
			let cellParser = this.cellParser;
			if (cellParser.cols.indexOf(idx) !== -1) return cellParser.parse(this, cell, idx);
			else return getText(cell);
		}
		/**
		* Return the typed data of a given cell based on the column type definition
		* @param  {DOMElement} cell Cell's DOM element
		* @return {String|Number|Date}
		*/
		getCellData(cell) {
			let colIndex = cell.cellIndex;
			let value = this.getCellValue(cell);
			if (this.hasType(colIndex, ["formatted-number"])) return parse(value, this.getDecimal(colIndex));
			else if (this.hasType(colIndex, ["number"])) return Number(value);
			else if (this.hasType(colIndex, ["date"])) {
				let dateType = this.Mod.dateType;
				return dateType.parse(value, dateType.getLocale(colIndex));
			}
			return value;
		}
		/**
		* Return the table data based on its columns data type definitions
		* with following structure:
		* [
		*     [rowIndex, [data0, data1...]],
		*     [rowIndex, [data0, data1...]]
		* ]
		* @param {Boolean} [includeHeaders=false] Include headers row
		* @param {Boolean} [excludeHiddenCols=false] Exclude hidden columns
		* @return {Array}
		*/
		getData(includeHeaders = false, excludeHiddenCols = false) {
			return this.getTableData(includeHeaders, excludeHiddenCols, true);
		}
		/**
		* Return the table values with following structure:
		* [
		*     [rowIndex, [value0, value1...]],
		*     [rowIndex, [value0, value1...]]
		* ]
		* @param {Boolean} [includeHeaders=false] Include headers row
		* @param {Boolean} [excludeHiddenCols=false] Exclude hidden columns
		* @return {Array}
		*/
		getValues(includeHeaders = false, excludeHiddenCols = false) {
			return this.getTableData(includeHeaders, excludeHiddenCols, false);
		}
		/**
		* Return the table data with following structure:
		* [
		*     [rowIndex, [value0, value1...]],
		*     [rowIndex, [value0, value1...]]
		* ]
		* @param  {Boolean} [includeHeaders=false] Include headers row
		* @param  {Boolean} [excludeHiddenCols=false] Exclude hidden columns
		* @param  {Boolean} [typed=false] Return typed value
		* @return {Array}
		* @private
		*
		* TODO: provide an API returning data in JSON format
		*/
		getTableData(includeHeaders = false, excludeHiddenCols = false, typed = false) {
			let tblData = [];
			let getContent = typed ? this.getCellData.bind(this) : this.getCellValue.bind(this);
			if (includeHeaders) {
				let headers = this.getHeadersText(excludeHiddenCols);
				tblData.push([this.getHeadersRowIndex(), headers]);
			}
			this.eachRow()((row, k) => {
				let rowData = [k, []];
				let cells = row.cells;
				for (let j = 0, len = cells.length; j < len; j++) {
					if (excludeHiddenCols && this.hasExtension("colsVisibility")) {
						if (this.extension("colsVisibility").isColHidden(j)) continue;
					}
					let cellContent = getContent(cells[j]);
					rowData[1].push(cellContent);
				}
				tblData.push(rowData);
			});
			return tblData;
		}
		/**
		* Return the filtered table data based on its columns data type definitions
		* with following structure:
		* [
		*     [rowIndex, [data0, data1...]],
		*     [rowIndex, [data0, data1...]]
		* ]
		* @param  {Boolean} [includeHeaders=false] Include headers row
		* @param  {Boolean} [excludeHiddenCols=false] Exclude hidden columns
		* @return {Array}
		*
		* TODO: provide an API returning data in JSON format
		*/
		getFilteredData(includeHeaders = false, excludeHiddenCols = false) {
			return this.filteredData(includeHeaders, excludeHiddenCols, true);
		}
		/**
		* Return the filtered table values with following structure:
		* [
		*     [rowIndex, [value0, value1...]],
		*     [rowIndex, [value0, value1...]]
		* ]
		* @param  {Boolean} [includeHeaders=false] Include headers row
		* @param  {Boolean} [excludeHiddenCols=false] Exclude hidden columns
		* @return {Array}
		*
		* TODO: provide an API returning data in JSON format
		*/
		getFilteredValues(includeHeaders = false, excludeHiddenCols = false) {
			return this.filteredData(includeHeaders, excludeHiddenCols, false);
		}
		/**
		* Return the filtered data with following structure:
		* [
		*     [rowIndex, [value0, value1...]],
		*     [rowIndex, [value0, value1...]]
		* ]
		* @param  {Boolean} [includeHeaders=false] Include headers row
		* @param  {Boolean} [excludeHiddenCols=false] Exclude hidden columns
		* @param  {Boolean} [typed=false] Return typed value
		* @return {Array}
		* @private
		*
		* TODO: provide an API returning data in JSON format
		*/
		filteredData(includeHeaders = false, excludeHiddenCols = false, typed = false) {
			if (this.validRowsIndex.length === 0) return [];
			let rows = this.dom().rows, filteredData = [];
			let getContent = typed ? this.getCellData.bind(this) : this.getCellValue.bind(this);
			if (includeHeaders) {
				let headers = this.getHeadersText(excludeHiddenCols);
				filteredData.push([this.getHeadersRowIndex(), headers]);
			}
			let validRows = this.getValidRows(true);
			for (let i = 0; i < validRows.length; i++) {
				let rData = [this.validRowsIndex[i], []], cells = rows[this.validRowsIndex[i]].cells;
				for (let k = 0; k < cells.length; k++) {
					if (excludeHiddenCols && this.hasExtension("colsVisibility")) {
						if (this.extension("colsVisibility").isColHidden(k)) continue;
					}
					let cellValue = getContent(cells[k]);
					rData[1].push(cellValue);
				}
				filteredData.push(rData);
			}
			return filteredData;
		}
		/**
		* Return the filtered data for a given column index
		* @param {any} colIndex Colmun's index
		* @param {boolean} [includeHeaders=false] Optional Include headers row
		* @param {any} [exclude=[]] Optional List of row indexes to be excluded
		* @return {Array} Flat list of typed values [data0, data1, data2...]
		*
		* TODO: provide an API returning data in JSON format
		*/
		getFilteredColumnData(colIndex, includeHeaders = false, exclude = []) {
			return this.getFilteredDataCol(colIndex, includeHeaders, true, exclude, false);
		}
		/**
		* Return the filtered and visible data for a given column index
		* @param {any} colIndex Colmun's index
		* @param {boolean} [includeHeaders=false] Optional Include headers row
		* @param {any} [exclude=[]] Optional List of row indexes to be excluded
		* @return {Array} Flat list of typed values [data0, data1, data2...]
		*
		* TODO: provide an API returning data in JSON format
		*/
		getVisibleColumnData(colIndex, includeHeaders = false, exclude = []) {
			return this.getFilteredDataCol(colIndex, includeHeaders, true, exclude, true);
		}
		/**
		* Return the filtered values for a given column index
		* @param {any} colIndex Colmun's index
		* @param {boolean} [includeHeaders=false] Optional Include headers row
		* @param {any} [exclude=[]] Optional List of row indexes to be excluded
		* @return {Array} Flat list of values ['value0', 'value1', 'value2'...]
		*
		* TODO: provide an API returning data in JSON format
		*/
		getFilteredColumnValues(colIndex, includeHeaders = false, exclude = []) {
			return this.getFilteredDataCol(colIndex, includeHeaders, false, exclude, false);
		}
		/**
		* Return the filtered and visible values for a given column index
		* @param {any} colIndex Colmun's index
		* @param {boolean} [includeHeaders=false] Optional Include headers row
		* @param {any} [exclude=[]] Optional List of row indexes to be excluded
		* @return {Array} Flat list of values ['value0', 'value1', 'value2'...]
		*
		* TODO: provide an API returning data in JSON format
		*/
		getVisibleColumnValues(colIndex, includeHeaders = false, exclude = []) {
			return this.getFilteredDataCol(colIndex, includeHeaders, false, exclude, true);
		}
		/**
		* Return the filtered data for a given column index
		* @param  {Number} colIndex Colmun's index
		* @param  {Boolean} [includeHeaders=false] Include headers row
		* @param  {Boolean} [typed=false] Return typed value
		* @param  {Array} [exclude=[]] List of row indexes to be excluded
		* @param  {Boolean} [visible=true] Return only filtered and visible data
		*                           (relevant for paging)
		* @return {Array}           Flat list of values ['val0','val1','val2'...]
		* @private
		*
		* TODO: provide an API returning data in JSON format
		*/
		getFilteredDataCol(colIndex, includeHeaders = false, typed = false, exclude = [], visible = true) {
			if (isUndef(colIndex)) return [];
			let rows = this.dom().rows;
			let getContent = typed ? this.getCellData.bind(this) : this.getCellValue.bind(this);
			let validColValues = this.getValidRows(true).filter((rowIdx) => {
				return exclude.indexOf(rowIdx) === -1 && (visible ? this.getRowDisplay(rows[rowIdx]) !== "none" : true);
			}).map((rowIdx) => {
				return getContent(rows[rowIdx].cells[colIndex]);
			});
			if (includeHeaders) validColValues.unshift(this.getHeadersText()[colIndex]);
			return validColValues;
		}
		/**
		* Get the display value of a row
		* @param  {HTMLTableRowElement} row DOM element of the row
		* @return {String}     Usually 'none' or ''
		*/
		getRowDisplay(row) {
			return row.style.display;
		}
		/**
		* Validate/invalidate row by setting the 'validRow' attribute on the row
		* @param  {Number}  rowIndex Index of the row
		* @param  {Boolean} isValid
		*/
		validateRow(rowIndex, isValid) {
			let row = this.dom().rows[rowIndex];
			if (!row || !isBoolean(isValid)) return;
			if (this.excludeRows.indexOf(rowIndex) !== -1) isValid = true;
			let displayFlag = isValid ? "" : NONE, validFlag = isValid ? "true" : "false";
			row.style.display = displayFlag;
			if (this.paging) row.setAttribute("validRow", validFlag);
			if (isValid) {
				if (this.validRowsIndex.indexOf(rowIndex) === -1) this.validRowsIndex.push(rowIndex);
				this.onRowValidated(this, rowIndex);
				this.emitter.emit("row-validated", this, rowIndex);
			}
		}
		/**
		* Validate all filterable rows
		*/
		validateAllRows() {
			if (!this.initialized) return;
			this.validRowsIndex = [];
			for (let k = this.refRow; k < this.nbFilterableRows; k++) this.validateRow(k, true);
		}
		/**
		* Set search value to a given filter
		* @param {Number} index     Column's index
		* @param {String or Array} query  searcharg Search term
		*/
		setFilterValue(index, query = "") {
			if (!this.fltGrid) return;
			let slc = this.getFilterElement(index), fltColType = this.getFilterType(index);
			if (!slc) return;
			if (fltColType === "multiple") {
				let values = isArray(query) ? query : query.split(" " + this.orOperator + " ");
				if (this.loadFltOnDemand && !this.initialized) this.emitter.emit("build-select-filter", this, index, this.linkedFilters, this.isExternalFlt());
				this.emitter.emit("select-options", this, index, values);
			} else if (fltColType === "checklist") {
				let values = [];
				if (this.loadFltOnDemand && !this.initialized) this.emitter.emit("build-checklist-filter", this, index, this.linkedFilters);
				if (isArray(query)) values = query;
				else {
					query = matchCase(query, this.caseSensitive);
					values = query.split(" " + this.orOperator + " ");
				}
				this.emitter.emit("select-checklist-options", this, index, values);
			} else {
				if (this.loadFltOnDemand && !this.initialized) this.emitter.emit("build-select-filter", this, index, this.linkedFilters, this.isExternalFlt());
				slc.value = query;
			}
		}
		/**
		* Make passed or default working table element width fixed
		* @param {TableElement} tbl optional table DOM element
		*/
		setFixedLayout(tbl = this.dom()) {
			let colWidths = this.colWidths;
			let tableWidth = tbl.clientWidth;
			if (colWidths.length > 0) {
				let defaultWidth = this.defaultColWidth;
				tableWidth = colWidths.reduce((x, y) => parseInt(x || defaultWidth, 10) + parseInt(y || defaultWidth, 10));
			}
			tbl.style.width = `${tableWidth}px`;
			tbl.style.tableLayout = "fixed";
		}
		/**
		* Set passed or default working table columns' widths with configuration
		* values
		* @param {TableElement} tbl optional table DOM element
		*/
		setColWidths(tbl = this.dom()) {
			let colWidths = this.colWidths;
			if (colWidths.length === 0) return;
			let colTags = tag(tbl, "col");
			let tblHasColTag = colTags.length > 0;
			let frag = !tblHasColTag ? doc.createDocumentFragment() : null;
			this.eachCol((k) => {
				let col;
				if (tblHasColTag) col = colTags[k];
				else {
					col = createElm("col");
					frag.appendChild(col);
				}
				col.style.width = colWidths[k];
			});
			if (!tblHasColTag) tbl.insertBefore(frag, tbl.firstChild);
		}
		/**
		* Exclude rows from actions
		*/
		setExcludeRows() {
			if (!this.hasExcludedRows) return;
			this.excludeRows.forEach((rowIdx) => this.validateRow(rowIdx, true));
		}
		/**
		* Clear all the filters' values
		*/
		clearFilters() {
			if (!this.fltGrid) return;
			this.emitter.emit("before-clearing-filters", this);
			this.onBeforeReset(this, this.getFiltersValue());
			for (let i = 0, len = this.fltIds.length; i < len; i++) this.setFilterValue(i, "");
			this.filter();
			this.onAfterReset(this);
			this.emitter.emit("after-clearing-filters", this);
		}
		/**
		* Return the ID of the current active filter
		* @return {String}
		*/
		getActiveFilterId() {
			return this.activeFilterId;
		}
		/**
		* Set the ID of the current active filter
		* @param {String} filterId Element ID
		*/
		setActiveFilterId(filterId) {
			this.activeFilterId = filterId;
		}
		/**
		* Return the column index for a given filter ID
		* @param {string} [filterId=''] Filter ID
		* @return {Number} Column index
		*/
		getColumnIndexFromFilterId(filterId = "") {
			let idx = filterId.split("_")[0];
			idx = idx.split(this.prfxFlt)[1];
			return parseInt(idx, 10);
		}
		/**
		* Build filter element ID for a given column index
		* @param {any} colIndex
		* @return {String} Filter element ID string
		* @private
		*/
		buildFilterId(colIndex) {
			return `${this.prfxFlt}${colIndex}_${this.id}`;
		}
		/**
		* Check if has external filters
		* @returns {Boolean}
		* @private
		*/
		isExternalFlt() {
			return this.externalFltIds.length > 0;
		}
		/**
		* Returns styles path
		* @returns {String}
		* @private
		*/
		getStylePath() {
			return defaultsStr(this.config.style_path, this.basePath + "style/");
		}
		/**
		* Returns main stylesheet path
		* @returns {String}
		* @private
		*/
		getStylesheetPath() {
			return defaultsStr(this.config.stylesheet, this.getStylePath() + "tablefilter.css");
		}
		/**
		* Returns themes path
		* @returns {String}
		* @private
		*/
		getThemesPath() {
			return defaultsStr(this.config.themes_path, this.getStylePath() + "themes/");
		}
		/**
		* Make specified column's filter active
		* @param colIndex Index of a column
		*/
		activateFilter(colIndex) {
			if (isUndef(colIndex)) return;
			this.setActiveFilterId(this.getFilterId(colIndex));
		}
		/**
		* Determine if passed filter column implements exact query match
		* @param  {Number}  colIndex   Column index
		* @return {Boolean}
		*/
		isExactMatch(colIndex) {
			let fltType = this.getFilterType(colIndex);
			return this.exactMatchByCol[colIndex] || this.exactMatch || fltType !== "input";
		}
		/**
		* Check if passed row is valid
		* @param {Number} rowIndex Row index
		* @return {Boolean}
		*/
		isRowValid(rowIndex) {
			return this.getValidRows().indexOf(rowIndex) !== -1;
		}
		/**
		* Check if passed row is visible
		* @param {Number} rowIndex Row index
		* @return {Boolean}
		*/
		isRowDisplayed(rowIndex) {
			let row = this.dom().rows[rowIndex];
			return this.getRowDisplay(row) === "";
		}
		/**
		* Check if specified column filter ignores diacritics.
		* Note this is only applicable to input filter types.
		* @param {Number} colIndex    Column index
		* @return {Boolean}
		*/
		ignoresDiacritics(colIndex) {
			let ignoreDiac = this.ignoreDiacritics;
			if (isArray(ignoreDiac)) return ignoreDiac[colIndex];
			return Boolean(ignoreDiac);
		}
		/**
		* Return clear all text for specified filter column
		* @param {Number} colIndex    Column index
		* @return {String}
		*/
		getClearFilterText(colIndex) {
			let clearText = this.clearFilterText;
			if (isArray(clearText)) return clearText[colIndex];
			return clearText;
		}
		/**
		* Column iterator invoking continue and break condition callbacks if any
		* then calling supplied callback for each item
		* @param {Function} [fn=EMPTY_FN] callback
		* @param {Function} [continueFn=EMPTY_FN] continue condition callback
		* @param {Function} [breakFn=EMPTY_FN] break condition callback
		*/
		eachCol(fn = EMPTY_FN, continueFn = EMPTY_FN, breakFn = EMPTY_FN) {
			let len = this.getCellsNb(this.refRow);
			for (let i = 0; i < len; i++) {
				if (continueFn(i) === true) continue;
				if (breakFn(i) === true) break;
				fn(i);
			}
		}
		/**
		* Rows iterator starting from supplied row index or defaulting to reference
		* row index. Closure function accepts a callback function and optional
		* continue and break callbacks.
		* @param {Number} startIdx Row index from which filtering starts
		*/
		eachRow(startIdx = this.refRow) {
			return (fn = EMPTY_FN, continueFn = EMPTY_FN, breakFn = EMPTY_FN) => {
				let rows = this.dom().rows;
				let len = this.getRowsNb(true);
				for (let i = startIdx; i < len; i++) {
					if (continueFn(rows[i], i) === true) continue;
					if (breakFn(rows[i], i) === true) break;
					fn(rows[i], i);
				}
			};
		}
		/**
		* Check if passed script or stylesheet is already imported
		* @param  {String}  filePath Ressource path
		* @param  {String}  type     Possible values: 'script' or 'link'
		* @return {Boolean}
		*/
		isImported(filePath, type = "script") {
			let imported = false, attr = type === "script" ? "src" : "href", files = tag(doc, type);
			for (let i = 0, len = files.length; i < len; i++) {
				if (isUndef(files[i][attr])) continue;
				if (files[i][attr].match(filePath)) {
					imported = true;
					break;
				}
			}
			return imported;
		}
		/**
		* Import script or stylesheet
		* @param  {String}   fileId   Ressource ID
		* @param  {String}   filePath Ressource path
		* @param  {Function} callback Callback
		* @param  {String}   type     Possible values: 'script' or 'link'
		*/
		import(fileId, filePath, callback, type = "script") {
			if (this.isImported(filePath, type)) return;
			let o = this, isLoaded = false, file, head = tag(doc, "head")[0];
			if (type.toLowerCase() === "link") file = createElm("link", ["id", fileId], ["type", "text/css"], ["rel", "stylesheet"], ["href", filePath]);
			else file = createElm("script", ["id", fileId], ["type", "text/javascript"], ["src", filePath]);
			file.onload = file.onreadystatechange = () => {
				if (!isLoaded && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
					isLoaded = true;
					if (typeof callback === "function") callback.call(null, o);
				}
			};
			file.onerror = () => {
				throw new Error(`TableFilter could not load: ${filePath}`);
			};
			head.appendChild(file);
		}
		/**
		* Check if table has filters grid
		* @return {Boolean}
		*/
		isInitialized() {
			return this.initialized;
		}
		/**
		* Get list of filter IDs
		* @return {Array} List of filters ids
		*/
		getFiltersId() {
			return this.fltIds || [];
		}
		/**
		* Get filtered (valid) rows indexes
		* @param  {Boolean} reCalc Force calculation of filtered rows list
		* @return {Array}          List of row indexes
		*/
		getValidRows(reCalc) {
			if (!reCalc) return this.validRowsIndex;
			this.validRowsIndex = [];
			this.eachRow()((row) => {
				if (!this.paging) {
					if (this.getRowDisplay(row) !== "none") this.validRowsIndex.push(row.rowIndex);
				} else if (row.getAttribute("validRow") === "true" || row.getAttribute("validRow") === null) this.validRowsIndex.push(row.rowIndex);
			});
			return this.validRowsIndex;
		}
		/**
		* Get the index of the row containing the filters
		* @return {Number}
		*/
		getFiltersRowIndex() {
			return this.filtersRowIndex;
		}
		/**
		* Get the index of the headers row
		* @return {Number}
		*/
		getHeadersRowIndex() {
			return this.headersRow;
		}
		/**
		* Get the row index from where the filtering process start (1st filterable
		* row)
		* @return {Number}
		*/
		getStartRowIndex() {
			return this.refRow;
		}
		/**
		* Get the index of the last row
		* @return {Number}
		*/
		getLastRowIndex() {
			return this.getRowsNb(true) - 1;
		}
		/**
		* Determine whether the specified column has one of the passed types
		* @param {Number} colIndex Column index
		* @param {Array} [types=[]] List of column types
		* @return {Boolean}
		*/
		hasType(colIndex, types = []) {
			if (this.colTypes.length === 0) return false;
			let colType = this.colTypes[colIndex];
			if (isObj(colType)) colType = colType.type;
			return types.indexOf(colType) !== -1;
		}
		/**
		* Get the header DOM element for a given column index
		* @param  {Number} colIndex Column index
		* @return {Element}
		*/
		getHeaderElement(colIndex) {
			let table = this.gridLayout ? this.Mod.gridLayout.headTbl : this.dom();
			let tHead = tag(table, "thead");
			let rowIdx = this.getHeadersRowIndex();
			let header;
			if (tHead.length === 0) header = table.rows[rowIdx].cells[colIndex];
			if (tHead.length === 1) header = tHead[0].rows[rowIdx].cells[colIndex];
			return header;
		}
		/**
		* Return the list of headers' text
		* @param  {Boolean} excludeHiddenCols  Optional: exclude hidden columns
		* @return {Array} list of headers' text
		*/
		getHeadersText(excludeHiddenCols = false) {
			let headers = [];
			this.eachCol((j) => {
				let headerText = getFirstTextNode(this.getHeaderElement(j));
				headers.push(headerText);
			}, (j) => {
				if (excludeHiddenCols && this.hasExtension("colsVisibility")) return this.extension("colsVisibility").isColHidden(j);
				return false;
			});
			return headers;
		}
		/**
		* Return the filter type for a specified column
		* @param  {Number} colIndex Column's index
		* @return {String}
		*/
		getFilterType(colIndex) {
			return this.filterTypes[colIndex];
		}
		/**
		* Get the total number of filterable rows
		* @return {Number}
		*/
		getFilterableRowsNb() {
			return this.getRowsNb(false);
		}
		/**
		* Return the total number of valid rows
		* @param {Boolean} [reCalc=false] Forces calculation of filtered rows
		* @return {Number}
		*/
		getValidRowsNb(reCalc = false) {
			return this.getValidRows(reCalc).length;
		}
		/**
		* Return the working DOM element
		* @return {HTMLTableElement}
		*/
		dom() {
			return this.tbl;
		}
		/**
		* Return the decimal separator for supplied column as per column type
		* configuration or global setting
		* @param {Number} colIndex Column index
		* @returns {String} '.' or ','
		*/
		getDecimal(colIndex) {
			let decimal = this.decimalSeparator;
			if (this.hasType(colIndex, ["formatted-number"])) {
				let colType = this.colTypes[colIndex];
				if (colType.hasOwnProperty("decimal")) decimal = colType.decimal;
			}
			return decimal;
		}
		/**
		* Get the configuration object (literal object)
		* @return {Object}
		*/
		config() {
			return this.cfg;
		}
	};
	//#endregion
	exports.TableFilter = TableFilter;
});

if(typeof globalThis !== "undefined" && globalThis.TableFilter && globalThis.TableFilter.TableFilter) { globalThis.TableFilter = globalThis.TableFilter.TableFilter; }