UNPKG

tablefilter

Version:

A Javascript library making HTML tables filterable and a bit more

17,615 lines • 564 kB
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;