{
  "version": 3,
  "sources": ["../../../../../node_modules/tom-select/src/contrib/microevent.ts", "../../../../../node_modules/tom-select/src/contrib/microplugin.ts", "../../../../../node_modules/@orchidjs/unicode-variants/lib/regex.ts", "../../../../../node_modules/@orchidjs/unicode-variants/lib/strings.ts", "../../../../../node_modules/@orchidjs/unicode-variants/lib/index.ts", "../../../../../node_modules/@orchidjs/sifter/lib/utils.ts", "../../../../../node_modules/@orchidjs/sifter/lib/sifter.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/contrib/highlight.ts", "../../../../../node_modules/tom-select/src/constants.ts", "../../../../../node_modules/tom-select/src/defaults.ts", "../../../../../node_modules/tom-select/src/getSettings.ts", "../../../../../node_modules/tom-select/src/tom-select.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/plugins/change_listener/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/checkbox_options/plugin.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/clear_button/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/drag_drop/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/dropdown_header/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/caret_position/plugin.ts", "../../../../../node_modules/tom-select/src/constants.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/dropdown_input/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/plugins/input_autogrow/plugin.ts", "../../../../../node_modules/tom-select/src/plugins/no_backspace_delete/plugin.ts", "../../../../../node_modules/tom-select/src/plugins/no_active_items/plugin.ts", "../../../../../node_modules/tom-select/src/constants.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/optgroup_columns/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/remove_button/plugin.ts", "../../../../../node_modules/tom-select/src/plugins/restore_on_backspace/plugin.ts", "../../../../../node_modules/tom-select/src/utils.ts", "../../../../../node_modules/tom-select/src/vanilla.ts", "../../../../../node_modules/tom-select/src/plugins/virtual_scroll/plugin.ts", "../../../../../node_modules/tom-select/src/tom-select.complete.ts", "../../../../../client/plugins/remove_button_accessible/plugin.js", "../../../../../client/plugins/dropdown_footer/plugin.ts", "../../../../../client/plugins/token/parser.js", "../../../../../client/plugins/token/index.js", "../../../../../client/django-tomselect.js"],
  "sourcesContent": ["/**\n * MicroEvent - to make any js object an event emitter\n *\n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * @author Jerome Etienne (https://github.com/jeromeetienne)\n */\n\ntype TCallback = (...args:any) => any;\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events:string,callback:(event:string)=>any){\n\tevents.split(/\\s+/).forEach((event) =>{\n\t\tcallback(event);\n\t});\n}\n\nexport default class MicroEvent{\n\n\tpublic _events: {[key:string]:TCallback[]};\n\n\tconstructor(){\n\t\tthis._events = {};\n\t}\n\n\ton(events:string, fct:TCallback){\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = this._events[event] || [];\n\t\t\tevent_array.push(fct);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\toff(events:string, fct:TCallback){\n\t\tvar n = arguments.length;\n\t\tif( n === 0 ){\n\t\t\tthis._events = {};\n\t\t\treturn;\n\t\t}\n\n\t\tforEvents(events,(event) => {\n\n\t\t\tif (n === 1){\n\t\t\t\tdelete this._events[event];\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst event_array = this._events[event];\n\t\t\tif( event_array === undefined ) return;\n\n\t\t\tevent_array.splice(event_array.indexOf(fct), 1);\n\t\t\tthis._events[event] = event_array;\n\t\t});\n\t}\n\n\ttrigger(events:string, ...args:any){\n\t\tvar self = this;\n\n\t\tforEvents(events,(event) => {\n\t\t\tconst event_array = self._events[event];\n\t\t\tif( event_array === undefined ) return;\n\t\t\tevent_array.forEach(fct => {\n\t\t\t\tfct.apply(self, args );\n\t\t\t});\n\n\t\t});\n\t}\n};\n", "/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\ntype TSettings = {\n\t[key:string]:any\n}\n\ntype TPlugins = {\n\tnames: string[],\n\tsettings: TSettings,\n\trequested: {[key:string]:boolean},\n\tloaded: {[key:string]:any}\n};\n\nexport type TPluginItem = {name:string,options:{}};\nexport type TPluginHash = {[key:string]:{}};\n\n\n\n\nexport default function MicroPlugin(Interface: any ){\n\n\tInterface.plugins = {};\n\n\treturn class extends Interface{\n\n\t\tpublic plugins:TPlugins = {\n\t\t\tnames     : [],\n\t\t\tsettings  : {},\n\t\t\trequested : {},\n\t\t\tloaded    : {}\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tstatic define(name:string, fn:(this:any,settings:TSettings)=>any){\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn'   : fn\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t *   ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {array|object} plugins\n\t\t */\n\t\tinitializePlugins(plugins:string[]|TPluginItem[]|TPluginHash) {\n\t\t\tvar key, name;\n\t\t\tconst self  = this;\n\t\t\tconst queue:string[] = [];\n\n\t\t\tif (Array.isArray(plugins)) {\n\t\t\t\tplugins.forEach((plugin:string|TPluginItem)=>{\n\t\t\t\t\tif (typeof plugin === 'string') {\n\t\t\t\t\t\tqueue.push(plugin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugin.name] = plugin.options;\n\t\t\t\t\t\tqueue.push(plugin.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile( name = queue.shift() ){\n\t\t\t\tself.require(name);\n\t\t\t}\n\t\t}\n\n\t\tloadPlugin(name:string) {\n\t\t\tvar self    = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin  = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' +  name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t */\n\t\trequire(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t}\n\n\t};\n\n}\n", "/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n */\nexport const arrayToPattern = (chars: string[]): string => {\n\n\tchars = chars.filter( Boolean );\n\n\tif( chars.length < 2 ){\n\t\treturn chars[0] || '';\n\t}\n\n\treturn (maxValueLength(chars) == 1) ? '['+chars.join('')+']' : '(?:'+chars.join('|')+')';\n};\n\nexport const sequencePattern = (array: string[]): string => {\n\n\tif( !hasDuplicates(array) ){\n\t\treturn array.join('');\n\t}\n\n\tlet pattern = '';\n\tlet prev_char_count = 0;\n\n\tconst prev_pattern = ()=>{\n\t\tif( prev_char_count > 1 ){\n\t\t\tpattern += '{'+prev_char_count+'}';\n\t\t}\n\t}\n\n\tarray.forEach((char,i)=>{\n\n\t\tif( char === array[i-1] ){\n\t\t\tprev_char_count++;\n\t\t\treturn;\n\t\t}\n\n\t\tprev_pattern();\n\n\t\tpattern += char;\n\t\tprev_char_count = 1;\n\t});\n\n\tprev_pattern();\n\n\treturn pattern;\n\n}\n\n\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n */\nexport const setToPattern = (chars: Set<string>): string => {\n\tlet array = Array.from(chars);\n\treturn arrayToPattern(array);\n}\n\n\n\n/**\n * https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values\n */\nexport const hasDuplicates = (array: any[]) => {\n    return (new Set(array)).size !== array.length;\n}\n\n\n/**\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str: string): string => {\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n/**\n * Return the max length of array values\n */\nexport const maxValueLength = (array: string[]) => {\n\treturn array.reduce( (longest, value) => Math.max(longest,unicodeLength(value)),0);\n}\n\n\nexport const unicodeLength = (str: string) => {\n\treturn Array.from(str).length;\n}\n", "/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n */\nexport const allSubstrings = (input: string): string[][] => {\n\n    if( input.length === 1) return [[input]];\n\n    let result: string[][] = [];\n\n\tconst start = input.substring(1);\n    const suba = allSubstrings(start);\n\n\tsuba.forEach(function(subresult) {\n        let tmp = subresult.slice(0);\n        tmp[0] = input.charAt(0) + tmp[0];\n        result.push(tmp);\n\n        tmp = subresult.slice(0);\n        tmp.unshift(input.charAt(0));\n        result.push(tmp);\n    });\n\n    return result;\n}\n", "import { setToPattern, arrayToPattern, escape_regex, sequencePattern } from './regex.ts';\nimport { allSubstrings } from './strings.ts';\n\nexport type TUnicodeMap = {[key:string]:string};\nexport type TUnicodeSets = {[key:string]:Set<string>};\nexport type TCodePoints = [[number,number]];\nexport type TCodePointObj = {folded:string,composed:string,code_point:number}\nexport type TSequencePart = {start:number,end:number,length:number,substr:string}\n\nexport const code_points: TCodePoints = [[ 0, 65535 ]];\n\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\n\nexport let unicode_map: TUnicodeMap;\n\nlet multi_char_reg: RegExp;\n\nconst max_char_length = 3;\n\nconst latin_convert: TUnicodeMap = {}\n\nconst latin_condensed: TUnicodeMap = {\n\t'/': '\u2044\u2215',\n\t'0': '\u07C0',\n\t\"a\": \"\u2C65\u0250\u0251\",\n\t\"aa\": \"\uA733\",\n\t\"ae\": \"\u00E6\u01FD\u01E3\",\n\t\"ao\": \"\uA735\",\n\t\"au\": \"\uA737\",\n\t\"av\": \"\uA739\uA73B\",\n\t\"ay\": \"\uA73D\",\n\t\"b\": \"\u0180\u0253\u0183\",\n\t\"c\": \"\uA73F\u0188\u023C\u2184\",\n\t\"d\": \"\u0111\u0257\u0256\u1D05\u018C\uABB7\u0501\u0266\",\n\t\"e\": \"\u025B\u01DD\u1D07\u0247\",\n\t\"f\": \"\uA77C\u0192\",\n\t\"g\": \"\u01E5\u0260\uA7A1\u1D79\uA77F\u0262\",\n\t\"h\": \"\u0127\u2C68\u2C76\u0265\",\n\t\"i\": \"\u0268\u0131\",\n\t\"j\": \"\u0249\u0237\",\n\t\"k\": \"\u0199\u2C6A\uA741\uA743\uA745\uA7A3\",\n\t\"l\": \"\u0142\u019A\u026B\u2C61\uA749\uA747\uA781\u026D\",\n\t\"m\": \"\u0271\u026F\u03FB\",\n\t\"n\": \"\uA7A5\u019E\u0272\uA791\u1D0E\u043B\u0509\",\n\t\"o\": \"\u00F8\u01FF\u0254\u0275\uA74B\uA74D\u1D11\",\n\t\"oe\": \"\u0153\",\n\t\"oi\": \"\u01A3\",\n\t\"oo\": \"\uA74F\",\n\t\"ou\": \"\u0223\",\n\t\"p\": \"\u01A5\u1D7D\uA751\uA753\uA755\u03C1\",\n\t\"q\": \"\uA757\uA759\u024B\",\n\t\"r\": \"\u024D\u027D\uA75B\uA7A7\uA783\",\n\t\"s\": \"\u00DF\u023F\uA7A9\uA785\u0282\",\n\t\"t\": \"\u0167\u01AD\u0288\u2C66\uA787\",\n\t\"th\": \"\u00FE\",\n\t\"tz\": \"\uA729\",\n\t\"u\": \"\u0289\",\n\t\"v\": \"\u028B\uA75F\u028C\",\n\t\"vy\": \"\uA761\",\n\t\"w\": \"\u2C73\",\n\t\"y\": \"\u01B4\u024F\u1EFF\",\n\t\"z\": \"\u01B6\u0225\u0240\u2C6C\uA763\",\n\t\"hv\": \"\u0195\"\n}\n\n\nfor( let latin in latin_condensed ){\n\tlet unicode = latin_condensed[latin] || '';\n\tfor( let i = 0; i < unicode.length; i++){\n\t\tlet char\t= unicode.substring(i,i+1);\n\t\tlatin_convert[char] = latin;\n\t}\n}\n\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|')+'|'+accent_pat,'gu');\n\n\n\n/**\n * Initialize the unicode_map from the give code point ranges\n */\nexport const initialize = (_code_points?: TCodePoints) => {\n\tif( unicode_map !== undefined ) return;\n\tunicode_map = generateMap(_code_points || code_points );\n}\n\n\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n */\nexport const normalize = (str: string, form: string = 'NFKD') => str.normalize(form);\n\n\n\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n */\nexport const asciifold = (str: string): string => {\n\n\treturn Array.from(str).reduce(\n\t\t/**\n\t\t * @param {string} result\n\t\t * @param {string} char\n\t\t */\n\t\t(result, char) =>{\n\t\t\treturn result + _asciifold(char)\n\t\t},\n\t\t''\n\t);\n};\n\nexport const _asciifold = (str: string): string => {\n\tstr = normalize(str)\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,(/** @type {string} */ char) => {\n\t\t\treturn latin_convert[char] || '';\n\t\t})\n\n\t//return str;\n\treturn normalize(str,'NFC')\n};\n\n/**\n * Generate a list of unicode variants from the list of code points\n */\nexport function* generator(code_points: TCodePoints): Generator<TCodePointObj> {\n\n\tfor(const [code_point_min, code_point_max] of code_points){\n\t\tfor(let i = code_point_min; i <= code_point_max; i++){\n\n\t\t\tlet composed\t\t= String.fromCharCode(i);\n\t\t\tlet folded\t\t\t= asciifold(composed);\n\n\n\t\t\tif( folded == composed.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// skip when folded is a string longer than 3 characters long\n\t\t\t// bc the resulting regex patterns will be long\n\t\t\t// eg:\n\t\t\t// folded \u0635\u0644\u0649 \u0627\u0644\u0644\u0647 \u0639\u0644\u064A\u0647 \u0648\u0633\u0644\u0645 length 18 code point 65018\n\t\t\t// folded \u062C\u0644 \u062C\u0644\u0627\u0644\u0647 length 8 code point 65019\n\t\t\tif( folded.length > max_char_length ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( folded.length == 0 ){\n\t\t\t\tcontinue\n\t\t\t}\n\n\n\t\t\tyield {folded:folded,composed:composed,code_point:i};\n\t\t}\n\t}\n}\n\n\n/**\n * Generate a unicode map from the list of code points\n */\nexport const generateSets = (code_points: TCodePoints): TUnicodeSets => {\n\n\tconst unicode_sets: {[key: string]: Set<string>} = {};\n\n\tconst addMatching = (folded: string, to_add: string) => {\n\n\t\t/** @type {Set<string>} */\n\t\tconst folded_set = unicode_sets[folded] || new Set();\n\n\t\tconst patt = new RegExp( '^'+setToPattern(folded_set)+'$','iu');\n\t\tif( to_add.match(patt) ){\n\t\t\treturn;\n\t\t}\n\n\t\tfolded_set.add(escape_regex(to_add));\n\t\tunicode_sets[folded] = folded_set;\n\t}\n\n\n\tfor( let value of generator(code_points) ){\n\t\taddMatching(value.folded,value.folded);\n\t\taddMatching(value.folded,value.composed);\n\t}\n\n\treturn unicode_sets;\n}\n\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|\u00C6|\u01FC|\u01E2)|(?:A|\u24B6|\uFF21...)(?:E|\u025B|\u24BA...))\n */\nexport const generateMap = (code_points: TCodePoints): TUnicodeMap => {\n\tconst unicode_sets = generateSets(code_points);\n\n\tconst unicode_map: TUnicodeMap = {};\n\n\tlet multi_char: string[] = [];\n\n\tfor( let folded in unicode_sets ){\n\n\t\tlet set = unicode_sets[folded];\n\t\tif( set ){\n\t\t\tunicode_map[folded] = setToPattern(set);\n\t\t}\n\n\t\tif( folded.length > 1 ){\n\t\t\tmulti_char.push(escape_regex(folded));\n\t\t}\n\t}\n\n\tmulti_char.sort((a, b) => b.length - a.length );\n\tconst multi_char_patt = arrayToPattern(multi_char);\n\tmulti_char_reg = new RegExp('^'+multi_char_patt,'u');\n\n\treturn unicode_map;\n}\n\n\n/**\n * Map each element of an array from its folded value to all possible unicode matches\n */\nexport const mapSequence = (strings: string[], min_replacement: number = 1): string =>{\n\tlet chars_replaced = 0;\n\n\tstrings = strings.map((str)=>{\n\t\tif( unicode_map[str] ){\n\t\t\tchars_replaced += str.length;\n\t\t}\n\t\treturn unicode_map[str] || str;\n\t});\n\n\tif( chars_replaced >= min_replacement ){\n\t\treturn sequencePattern(strings);\n\t}\n\n\treturn '';\n}\n\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n */\nexport const substringsToPattern = (str: string, min_replacement: number = 1): string => {\n\n\tmin_replacement = Math.max(min_replacement,str.length-1);\n\n\treturn arrayToPattern(\n\t\tallSubstrings(str).map( (sub_pat) =>{\n\t\t\treturn mapSequence(sub_pat,min_replacement)\n\t\t})\n\t);\n}\n\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n */\nconst sequencesToPattern = (sequences: Sequence[], all: boolean = true) => {\n\n\tlet min_replacement = sequences.length > 1 ? 1 : 0;\n\treturn arrayToPattern(\n\t\tsequences.map( (sequence) =>{\n\t\t\tlet seq: string[] = [];\n\t\t\tconst len = all ? sequence.length() : sequence.length() - 1;\n\t\t\tfor( let j = 0; j < len; j++){\n\t\t\t\tseq.push(substringsToPattern(sequence.substrs[j]||'',min_replacement));\n\t\t\t}\n\n\t\t\treturn sequencePattern(seq);\n\t\t})\n\t);\n}\n\n/**\n * Return true if the sequence is already in the sequences\n */\nconst inSequences = (needle_seq: Sequence, sequences: Sequence[]) => {\n\n\tfor(const seq of sequences){\n\n\t\tif( seq.start != needle_seq.start || seq.end != needle_seq.end ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( seq.substrs.join('') !== needle_seq.substrs.join('') ){\n\t\t\tcontinue;\n\t\t}\n\n\n\t\tlet needle_parts\t= needle_seq.parts;\n\n\t\tconst filter = (part: TSequencePart) =>{\n\n\t\t\tfor(const needle_part of needle_parts){\n\n\t\t\t\tif( needle_part.start === part.start && needle_part.substr === part.substr ){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif( part.length == 1 || needle_part.length == 1 ){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\n\t\t\t\t// check for overlapping parts\n\t\t\t\t// a = ['::=','==']\n\t\t\t\t// b = ['::','===']\n\t\t\t\t// a = ['r','sm']\n\t\t\t\t// b = ['rs','m']\n\t\t\t\tif( part.start < needle_part.start && part.end > needle_part.start ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif( needle_part.start < part.start && needle_part.end > part.start ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tlet filtered = seq.parts.filter(filter);\n\n\t\tif( filtered.length > 0 ){\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nclass Sequence{\n\tparts: TSequencePart[];\n\tsubstrs: string[];\n\tstart: number;\n\tend: number;\n\n\tconstructor(){\n\t\tthis.parts\t\t= [];\n\t\tthis.substrs\t= [];\n\t\tthis.start\t\t= 0;\n\t\tthis.end\t\t= 0;\n\t}\n\n\tadd(part: TSequencePart|undefined){\n\t\tif( part ){\n\t\t\tthis.parts.push(part);\n\t\t\tthis.substrs.push(part.substr);\n\t\t\tthis.start\t= Math.min(part.start,this.start);\n\t\t\tthis.end\t= Math.max(part.end,this.end);\n\t\t}\n\t}\n\n\tlast(){\n\t\treturn this.parts[this.parts.length-1];\n\t}\n\n\tlength(){\n\t\treturn this.parts.length;\n\t}\n\n\tclone(position: number, last_piece: TSequencePart){\n\t\tlet clone = new Sequence();\n\n\t\tlet parts = JSON.parse(JSON.stringify(this.parts));\n\t\tlet last_part = parts.pop();\n\t\tfor( const part of parts ){\n\t\t\tclone.add(part);\n\t\t}\n\n\t\tlet last_substr = last_piece.substr.substring(0,position-last_part.start);\n\t\tlet clone_last_len = last_substr.length;\n\t\tclone.add({start:last_part.start,end:last_part.start+clone_last_len,length:clone_last_len,substr:last_substr});\n\n\t\treturn clone;\n\t}\n\n}\n\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /a\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251A\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F/\n *\n * Issue:\n *  \uFE8A\uFE8B [ '\uFE8A = \\\\u{fe8a}', '\uFE8B = \\\\u{fe8b}' ]\n *\tbecomes:\t\u064A\u0654\u064A\u0654 [ '\u064A = \\\\u{64a}', '\u0654 = \\\\u{654}', '\u064A = \\\\u{64a}', '\u0654 = \\\\u{654}' ]\n *\n *\t\u0130\u0132 = IIJ = \u2161J\n *\n * \t1/2/4\n */\nexport const getPattern = (str: string): string | undefined => {\n\tinitialize();\n\n\tstr\t\t\t\t\t= asciifold(str);\n\n\tlet pattern\t\t\t= '';\n\tlet sequences\t\t= [new Sequence()];\n\n\tfor( let i = 0; i < str.length; i++ ){\n\n\t\tlet substr\t= str.substring(i);\n\t\tlet match\t= substr.match(multi_char_reg);\n\t\tconst char\t= str.substring(i,i+1);\n\t\tconst match_str = match ? match[0] : null;\n\n\n\t\t// loop through sequences\n\t\t// add either the char or multi_match\n\t\tlet overlapping: Sequence[]\t= [];\n\t\tlet added_types\t\t\t\t\t\t\t= new Set();\n\t\tfor(const sequence of sequences){\n\n\t\t\tconst last_piece\t= sequence.last();\n\n\n\t\t\tif( !last_piece || last_piece.length == 1 || last_piece.end <= i ){\n\n\t\t\t\t// if we have a multi match\n\t\t\t\tif( match_str ){\n\t\t\t\t\tconst len = match_str.length;\n\t\t\t\t\tsequence.add({start:i,end:i+len,length:len,substr:match_str});\n\t\t\t\t\tadded_types.add('1');\n\t\t\t\t}else{\n\t\t\t\t\tsequence.add({start:i,end:i+1,length:1,substr:char});\n\t\t\t\t\tadded_types.add('2');\n\t\t\t\t}\n\n\t\t\t}else if( match_str ){\n\n\t\t\t\tlet clone = sequence.clone(i,last_piece);\n\n\t\t\t\tconst len = match_str.length;\n\t\t\t\tclone.add({start:i,end:i+len,length:len,substr:match_str});\n\n\t\t\t\toverlapping.push(clone);\n\n\t\t\t}else{\n\t\t\t\t// don't add char\n\t\t\t\t// adding would create invalid patterns: 234 => [2,34,4]\n\t\t\t\tadded_types.add('3');\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if we have overlapping\n\t\tif( overlapping.length > 0 ){\n\n\t\t\t// ['ii','iii'] before ['i','i','iii']\n\t\t\toverlapping = overlapping.sort((a,b)=>{\n\t\t\t\treturn a.length() - b.length();\n\t\t\t});\n\n\t\t\tfor( let clone of overlapping){\n\n\t\t\t\t// don't add if we already have an equivalent sequence\n\t\t\t\tif( inSequences(clone, sequences) ){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tsequences.push(clone);\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\n\t\t// if we haven't done anything unique\n\t\t// clean up the patterns\n\t\t// helps keep patterns smaller\n\t\t// if str = 'r\u20A8\u33A7aarss', pattern will be 446 instead of 655\n\t\tif( i > 0 && added_types.size == 1 && !added_types.has('3') ){\n\t\t\tpattern += sequencesToPattern(sequences,false);\n\t\t\tlet new_seq = new Sequence();\n\t\t\tconst old_seq = sequences[0];\n\t\t\tif( old_seq ){\n\t\t\t\tnew_seq.add(old_seq.last());\n\t\t\t}\n\t\t\tsequences = [new_seq];\n\t\t}\n\n\t}\n\n\tpattern += sequencesToPattern(sequences,true);\n\n\treturn pattern;\n}\n\n\nexport { escape_regex };\n", "\nimport { asciifold } from '@orchidjs/unicode-variants';\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n    if (!obj ) return;\n    return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n    if (!obj ) return;\n    var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n    return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tif( token.regex == null ) return 0;\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\n\tif( typeof value == 'function' ) return value;\n\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n", "/**\n * sifter.js\n * Copyright (c) 2013\u20132020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\nimport { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils.ts';\nimport { getPattern, escape_regex } from '@orchidjs/unicode-variants';\nimport * as T from './types.ts';\n\nclass Sifter{\n\n\tpublic items: any; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1]!;\n\t\t\t\tword\t= field_match[2]!;\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = getPattern(word) || null;\n\t\t\t\t}else{\n\t\t\t\t\tregex = escape_regex(word);\n\t\t\t\t}\n\t\t\t\tif( regex && respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex  : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield  : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {T.ScoreFn}\n\t */\n\tgetScoreFunction(query:string, options:T.UserOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t/**\n\t * @returns {T.ScoreFn}\n\t *\n\t */\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0]!.field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]||1);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0]!, data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar score, sum = 0;\n\t\t\t\tfor( let token of tokens){\n\t\t\t\t\tscore = scoreObject(token, data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.UserOptions) {\n\t\tvar search  = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar implicit_score,\n\t\tsort_flds:T.Sort[]\t= [];\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort;\n\n\n\t\tif( typeof sort == 'function' ){\n\t\t\treturn sort.bind(this);\n\t\t}\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor( let s of sort ){\n\t\t\t\tif (search.query || s.field !== '$score') {\n\t\t\t\t\tsort_flds.push(s);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor( let fld of sort_flds ){\n\t\t\t\tif( fld.field === '$score' ){\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\n\t\t// without a search.query, all items will have the same score\n\t\t} else {\n\t\t\tsort_flds = sort_flds.filter((fld) => fld.field !== '$score' );\n\t\t}\n\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\tvar result, field;\n\t\t\tfor( let sort_fld of sort_flds ){\n\t\t\t\tfield = sort_fld.field;\n\n\t\t\t\tlet\tmultiplier = sort_fld.direction === 'desc' ? -1 : 1;\n\n\t\t\t\tresult = multiplier * cmp(\n\t\t\t\t\tget_field(field, a),\n\t\t\t\t\tget_field(field, b)\n\t\t\t\t);\n\t\t\t\tif (result) return result;\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.UserOptions):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser) as T.Options;\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options as T.Options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.UserOptions) : T.PrepareObj {\n\t\tvar self = this, score, search: T.PrepareObj;\n\n\t\tsearch  = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery   = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score:T.ScoreFn = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (_:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n\nexport { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern }\nexport * from './types.ts';\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * highlight v3 | MIT license | Johann Burkard <jb@eaio.com>\n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal <beatgates@gmail.com> 2011-6-24 (added regex)\n * - Modified by Brian Reavis <brian@thirdroute.com> 2012-8-27 (cleanup)\n */\n\nimport {replaceNode} from '../vanilla.ts';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t// Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0]!.length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\tconst highlightChildren = ( node:Element ):void => {\n\t\tif( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' ) ){\n\t\t\tArray.from(node.childNodes).forEach(element => {\n\t\t\t\thighlightRecursive(element);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tconst highlightRecursive = ( node:Node|Element ):number => {\n\n\t\tif( node.nodeType === 3 ){\n\t\t\treturn highlightText(node as Text);\n\t\t}\n\n\t\thighlightChildren(node as Element);\n\n\t\treturn 0;\n\t};\n\n\thighlightRecursive( element );\n};\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el:HTMLElement) => {\n\tvar elements = el.querySelectorAll(\"span.highlight\");\n\tArray.prototype.forEach.call(elements, function(el:HTMLElement){\n\t\tvar parent = el.parentNode as Node;\n\t\tparent.replaceChild(el.firstChild as Node, el);\n\t\tparent.normalize();\n\t});\n};\n", "export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC      \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n", "\nexport default {\n\toptions: [],\n\toptgroups: [],\n\n\tplugins: [],\n\tdelimiter: ',',\n\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\tpersist: true,\n\tdiacritics: true,\n\tcreate: null,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\tclearAfterSelect: false,\n\thighlight: true,\n\topenOnFocus: true,\n\tshouldOpen: null,\n\tmaxOptions: 50,\n\tmaxItems: null,\n\thideSelected: null,\n\tduplicates: false,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: null,\n\tallowEmptyOption: false,\n\t//closeAfterSelect: false,\n\trefreshThrottle: 300,\n\n\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: null, //'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\tdisabledField: 'disabled',\n\toptgroupLabelField: 'label',\n\toptgroupValueField: 'value',\n\tlockOptgroupOrder: false,\n\n\tsortField: '$order',\n\tsearchField: ['text'],\n\tsearchConjunction: 'and',\n\n\tmode: null,\n\twrapperClass: 'ts-wrapper',\n\tcontrolClass: 'ts-control',\n\tdropdownClass: 'ts-dropdown',\n\tdropdownContentClass: 'ts-dropdown-content',\n\titemClass: 'item',\n\toptionClass: 'option',\n\n\tdropdownParent: null,\n\tcontrolInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n\n\tcopyClassesToDropdown: false,\n\n\tplaceholder: null,\n\thidePlaceholder: null,\n\n\tshouldLoad: function(query:string):boolean{\n\t\treturn query.length > 0;\n\t},\n\n\t/*\n\tload                 : null, // function(query, callback) { ... }\n\tscore                : null, // function(search) { ... }\n\tonInitialize         : null, // function() { ... }\n\tonChange             : null, // function(value) { ... }\n\tonItemAdd            : null, // function(value, $item) { ... }\n\tonItemRemove         : null, // function(value) { ... }\n\tonClear              : null, // function() { ... }\n\tonOptionAdd          : null, // function(value, data) { ... }\n\tonOptionRemove       : null, // function(value) { ... }\n\tonOptionClear        : null, // function() { ... }\n\tonOptionGroupAdd     : null, // function(id, data) { ... }\n\tonOptionGroupRemove  : null, // function(id) { ... }\n\tonOptionGroupClear   : null, // function() { ... }\n\tonDropdownOpen       : null, // function(dropdown) { ... }\n\tonDropdownClose      : null, // function(dropdown) { ... }\n\tonType               : null, // function(str) { ... }\n\tonDelete             : null, // function(values) { ... }\n\t*/\n\n\trender: {\n\t\t/*\n\t\titem: null,\n\t\toptgroup: null,\n\t\toptgroup_header: null,\n\t\toption: null,\n\t\toption_create: null\n\t\t*/\n\t}\n};\n", "import defaults from './defaults.ts';\nimport { hash_key, iterate } from './utils.ts';\nimport { TomOption, TomSettings, RecursivePartial } from './types/index.ts';\nimport { TomInput } from './types/index.ts';\n\n\nexport default function getSettings( input:TomInput, settings_user:RecursivePartial<TomSettings>):TomSettings{\n\tvar settings:TomSettings\t= Object.assign({}, defaults, settings_user);\n\n\tvar attr_data\t\t\t\t= settings.dataAttr;\n\tvar field_label\t\t\t\t= settings.labelField;\n\tvar field_value\t\t\t\t= settings.valueField;\n\tvar field_disabled\t\t\t= settings.disabledField;\n\tvar field_optgroup\t\t\t= settings.optgroupField;\n\tvar field_optgroup_label\t= settings.optgroupLabelField;\n\tvar field_optgroup_value\t= settings.optgroupValueField;\n\n\tvar tag_name\t\t\t\t= input.tagName.toLowerCase();\n\tvar placeholder\t\t\t\t= input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n\tif (!placeholder && !settings.allowEmptyOption) {\n\t\tlet option\t\t= input.querySelector('option[value=\"\"]');\n\t\tif( option ){\n\t\t\tplaceholder = option.textContent;\n\t\t}\n\n\t}\n\n\tvar settings_element:{\n\t\tplaceholder\t: null|string,\n\t\toptions\t\t: TomOption[],\n\t\toptgroups\t: TomOption[],\n\t\titems\t\t: string[],\n\t\tmaxItems\t: null|number,\n\t} = {\n\t\tplaceholder\t: placeholder,\n\t\toptions\t\t: [],\n\t\toptgroups\t: [],\n\t\titems\t\t: [],\n\t\tmaxItems\t: null,\n\t};\n\n\n\t/**\n\t * Initialize from a <select> element.\n\t *\n\t */\n\tvar init_select = () => {\n\t\tvar tagName;\n\t\tvar options = settings_element.options;\n\t\tvar optionsMap:{[key:string]:any} = {};\n\t\tvar group_count = 1;\n\t\tlet $order = 0;\n\n\t\tvar readData = (el:HTMLElement):TomOption => {\n\n\t\t\tvar data\t= Object.assign({},el.dataset); // get plain object from DOMStringMap\n\t\t\tvar json\t= attr_data && data[attr_data];\n\n\t\t\tif( typeof json === 'string' && json.length ){\n\t\t\t\tdata = Object.assign(data,JSON.parse(json));\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\t\tvar addOption = (option:HTMLOptionElement, group?:string) => {\n\n\t\t\tvar value = hash_key(option.value);\n\t\t\tif ( value == null ) return;\n\t\t\tif ( !value && !settings.allowEmptyOption) return;\n\n\t\t\t// if the option already exists, it's probably been\n\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t// existing option so that it's rendered in both places.\n\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\tif (group) {\n\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t} else if (!Array.isArray(arr)) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tvar option_data             = readData(option);\n\t\t\t\toption_data[field_label]    = option_data[field_label] || option.textContent;\n\t\t\t\toption_data[field_value]    = option_data[field_value] || value;\n\t\t\t\toption_data[field_disabled] = option_data[field_disabled] || option.disabled;\n\t\t\t\toption_data[field_optgroup] = option_data[field_optgroup] || group;\n\t\t\t\toption_data.$option\t\t\t= option;\n\t\t\t\toption_data.$order\t\t\t= option_data.$order || ++$order;\n\n\t\t\t\toptionsMap[value] = option_data;\n\t\t\t\toptions.push(option_data);\n\t\t\t}\n\n\t\t\tif( option.selected ){\n\t\t\t\tsettings_element.items.push(value);\n\t\t\t}\n\t\t};\n\n\t\tvar addGroup = ( optgroup:HTMLOptGroupElement ) => {\n\t\t\tvar id:string, optgroup_data\n\n\t\t\toptgroup_data\t\t\t\t\t\t\t= readData(optgroup);\n\t\t\toptgroup_data[field_optgroup_label]\t\t= optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n\t\t\toptgroup_data[field_optgroup_value]\t\t= optgroup_data[field_optgroup_value] || group_count++;\n\t\t\toptgroup_data[field_disabled]\t\t\t= optgroup_data[field_disabled] || optgroup.disabled;\n\t\t\toptgroup_data.$order\t\t\t\t\t= optgroup_data.$order || ++$order;\n\n\t\t\tsettings_element.optgroups.push(optgroup_data);\n\n\t\t\tid = optgroup_data[field_optgroup_value];\n\n\t\t\titerate(optgroup.children, (option)=>{\n\t\t\t\taddOption(option as HTMLOptionElement, id);\n\t\t\t});\n\n\t\t};\n\n\t\tsettings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n\n\t\titerate(input.children,(child)=>{\n\t\t\ttagName = child.tagName.toLowerCase();\n\t\t\tif (tagName === 'optgroup') {\n\t\t\t\taddGroup(child as HTMLOptGroupElement);\n\t\t\t} else if (tagName === 'option') {\n\t\t\t\taddOption(child as HTMLOptionElement);\n\t\t\t}\n\t\t});\n\n\t};\n\n\n\t/**\n\t * Initialize from a <input type=\"text\"> element.\n\t *\n\t */\n\tvar init_textbox = () => {\n\t\tconst data_raw = input.getAttribute(attr_data);\n\n\t\tif (!data_raw) {\n\t\t\tvar value = input.value.trim() || '';\n\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\tconst values = value.split(settings.delimiter);\n\n\t\t\titerate( values, (value) => {\n\t\t\t\tconst option:TomOption = {};\n\t\t\t\toption[field_label] = value;\n\t\t\t\toption[field_value] = value;\n\t\t\t\tsettings_element.options.push(option);\n\t\t\t});\n\t\t\tsettings_element.items = values;\n\t\t} else {\n\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\titerate( settings_element.options, (opt) => {\n\t\t\t\tsettings_element.items.push(opt[field_value]);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tif (tag_name === 'select') {\n\t\tinit_select();\n\t} else {\n\t\tinit_textbox();\n\t}\n\n\treturn Object.assign( {}, defaults, settings_element, settings_user) as TomSettings;\n};\n", "\nimport MicroEvent from './contrib/microevent.ts';\nimport MicroPlugin from './contrib/microplugin.ts';\nimport { Sifter } from '@orchidjs/sifter';\nimport { escape_regex } from '@orchidjs/unicode-variants';\nimport { TomInput, TomArgObject, TomOption, TomOptions, TomCreateFilter, TomCreateCallback, TomItem, TomSettings, TomTemplateNames, TomClearFilter, RecursivePartial } from './types/index.ts';\nimport {highlight, removeHighlight} from './contrib/highlight.ts';\nimport * as constants from './constants.ts';\nimport getSettings from './getSettings.ts';\nimport {\n\thash_key,\n\tget_hash,\n\tescape_html,\n\tdebounce_events,\n\tgetSelection,\n\tpreventDefault,\n\taddEvent,\n\tloadDebounce,\n\ttimeout,\n\tisKeyDown,\n\tgetId,\n\taddSlashes,\n\tappend,\n\titerate\n} from './utils.ts';\n\nimport {\n\tgetDom,\n\tisHtmlString,\n\tescapeQuery,\n\ttriggerEvent,\n\tapplyCSS,\n\taddClasses,\n\tremoveClasses,\n\tparentMatch,\n\tgetTail,\n\tisEmptyObject,\n\tnodeIndex,\n\tsetAttr,\n\treplaceNode\n} from './vanilla.ts';\n\nvar instance_i = 0;\n\nexport default class TomSelect extends MicroPlugin(MicroEvent){\n\n\tpublic control_input\t\t\t: HTMLInputElement;\n\tpublic wrapper\t\t\t\t\t: HTMLElement;\n\tpublic dropdown\t\t\t\t\t: HTMLElement;\n\tpublic control\t\t\t\t\t: HTMLElement;\n\tpublic dropdown_content\t\t\t: HTMLElement;\n\tpublic focus_node\t\t\t\t: HTMLElement;\n\n\tpublic order\t\t\t\t\t: number = 0;\n\tpublic settings\t\t\t\t\t: TomSettings;\n\tpublic input\t\t\t\t\t: TomInput;\n\tpublic tabIndex\t\t\t\t\t: number;\n\tpublic is_select_tag\t\t\t: boolean;\n\tpublic rtl\t\t\t\t\t\t: boolean;\n\tprivate inputId\t\t\t\t\t: string;\n\n\tprivate _destroy\t\t\t\t!: () => void;\n\tpublic sifter\t\t\t\t\t: Sifter;\n\n\n\tpublic isOpen\t\t\t\t\t: boolean = false;\n\tpublic isDisabled\t\t\t\t: boolean = false;\n\tpublic isReadOnly\t\t\t\t: boolean = false;\n\tpublic isRequired\t\t\t\t: boolean;\n\tpublic isInvalid\t\t\t\t: boolean = false; // @deprecated 1.8\n\tpublic isValid\t\t\t\t\t: boolean = true;\n\tpublic isLocked\t\t\t\t\t: boolean = false;\n\tpublic isFocused\t\t\t\t: boolean = false;\n\tpublic isInputHidden\t\t\t: boolean = false;\n\tpublic isSetup\t\t\t\t\t: boolean = false;\n\tpublic ignoreFocus\t\t\t\t: boolean = false;\n\tpublic ignoreHover\t\t\t\t: boolean = false;\n\tpublic hasOptions\t\t\t\t: boolean = false;\n\tpublic currentResults\t\t\t?: ReturnType<Sifter['search']>;\n\tpublic lastValue\t\t\t\t: string = '';\n\tpublic caretPos\t\t\t\t\t: number = 0;\n\tpublic loading\t\t\t\t\t: number = 0;\n\tpublic loadedSearches\t\t\t: { [key: string]: boolean } = {};\n\n\tpublic activeOption\t\t\t\t: null|HTMLElement = null;\n\tpublic activeItems\t\t\t\t: TomItem[] = [];\n\n\tpublic optgroups\t\t\t\t: TomOptions = {};\n\tpublic options\t\t\t\t\t: TomOptions = {};\n\tpublic userOptions\t\t\t\t: {[key:string]:boolean} = {};\n\tpublic items\t\t\t\t\t: string[] = [];\n\n\tprivate refreshTimeout\t\t\t: null|number = null;\n\n\n\tconstructor( input_arg: string|TomInput, user_settings:RecursivePartial<TomSettings> ){\n\t\tsuper();\n\n\t\tinstance_i++;\n\n\t\tvar dir;\n\t\tvar input\t\t\t\t= getDom( input_arg ) as TomInput;\n\n\t\tif( input.tomselect ){\n\t\t\tthrow new Error('Tom Select already initialized on this element');\n\t\t}\n\n\t\tinput.tomselect\t\t\t= this;\n\n\t\t// detect rtl environment\n\t\tvar computedStyle\t\t= window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir\t\t\t\t\t\t= computedStyle.getPropertyValue('direction');\n\n\t\t// setup default state\n\t\tconst settings\t\t\t= getSettings( input, user_settings );\n\t\tthis.settings\t\t\t= settings;\n\t\tthis.input\t\t\t\t= input;\n\t\tthis.tabIndex\t\t\t= input.tabIndex || 0;\n\t\tthis.is_select_tag\t\t= input.tagName.toLowerCase() === 'select';\n\t\tthis.rtl\t\t\t\t= /rtl/i.test(dir);\n\t\tthis.inputId\t\t\t= getId(input, 'tomselect-'+instance_i);\n\t\tthis.isRequired\t\t\t= input.required;\n\n\n\t\t// search system\n\t\tthis.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t\t// option-dependent defaults\n\t\tsettings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof settings.hideSelected !== 'boolean') {\n\t\t\tsettings.hideSelected = settings.mode === 'multi';\n\t\t}\n\n\t\tif( typeof settings.hidePlaceholder !== 'boolean' ){\n\t\t\tsettings.hidePlaceholder = settings.mode !== 'multi';\n\t\t}\n\n\t\t// set up createFilter callback\n\t\tvar filter = settings.createFilter;\n\t\tif( typeof filter !== 'function' ){\n\n\t\t\tif( typeof filter === 'string' ){\n\t\t\t\tfilter = new RegExp(filter);\n\t\t\t}\n\n\t\t\tif( filter instanceof RegExp ){\n\t\t\t\tsettings.createFilter = (input: string) => (filter as RegExp).test(input);\n\t\t\t}else{\n\t\t\t\tsettings.createFilter = (value: string) => {\n\t\t\t\t\treturn this.settings.duplicates || !this.options[value];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\n\t\tthis.initializePlugins(settings.plugins);\n\t\tthis.setupCallbacks();\n\t\tthis.setupTemplates();\n\n\n\t\t// Create all elements\n\t\tconst wrapper\t\t\t= getDom('<div>');\n\t\tconst control\t\t\t= getDom('<div>');\n\t\tconst dropdown\t\t\t= this._render('dropdown');\n\t\tconst dropdown_content\t= getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n\n\t\tconst classes\t\t\t= this.input.getAttribute('class') || '';\n\t\tconst inputMode\t\t\t= settings.mode;\n\n\t\tvar control_input: HTMLInputElement;\n\n\n\t\taddClasses( wrapper, settings.wrapperClass, classes, inputMode);\n\n\n\t\taddClasses(control,settings.controlClass);\n\t\tappend( wrapper, control );\n\n\n\t\taddClasses(dropdown, settings.dropdownClass, inputMode);\n\t\tif( settings.copyClassesToDropdown ){\n\t\t\taddClasses( dropdown, classes);\n\t\t}\n\n\n\t\taddClasses(dropdown_content, settings.dropdownContentClass);\n\t\tappend( dropdown, dropdown_content );\n\n\t\tgetDom( settings.dropdownParent || wrapper ).appendChild( dropdown );\n\n\n\t\t// default controlInput\n\t\tif( isHtmlString(settings.controlInput) ){\n\t\t\tcontrol_input\t\t= getDom(settings.controlInput ) as HTMLInputElement;\n\n\t\t\t// set attributes\n\t\t\tvar attrs = ['autocorrect','autocapitalize','autocomplete','spellcheck','aria-label'];\n\t\t\titerate(attrs,(attr:string) => {\n\t\t\t\tif( input.getAttribute(attr) ){\n\t\t\t\t\tsetAttr(control_input,{[attr]:input.getAttribute(attr)});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol_input.tabIndex = -1;\n\t\t\tcontrol.appendChild( control_input );\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t// dom element\n\t\t}else if( settings.controlInput ){\n\t\t\tcontrol_input\t\t= getDom( settings.controlInput ) as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t}else{\n\t\t\tcontrol_input\t\t= getDom('<input/>') as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control;\n\t\t}\n\n\t\tthis.wrapper\t\t\t= wrapper;\n\t\tthis.dropdown\t\t\t= dropdown;\n\t\tthis.dropdown_content\t= dropdown_content;\n\t\tthis.control \t\t\t= control;\n\t\tthis.control_input\t\t= control_input;\n\n\t\tthis.setup();\n\t}\n\n\t/**\n\t * set up event bindings.\n\t *\n\t */\n\tsetup(){\n\n\t\tconst self = this;\n\t\tconst settings\t\t\t\t= self.settings;\n\t\tconst control_input\t\t\t= self.control_input;\n\t\tconst dropdown\t\t\t\t= self.dropdown;\n\t\tconst dropdown_content\t\t= self.dropdown_content;\n\t\tconst wrapper\t\t\t\t= self.wrapper;\n\t\tconst control\t\t\t\t= self.control;\n\t\tconst input\t\t\t\t\t= self.input;\n\t\tconst focus_node\t\t\t= self.focus_node;\n\t\tconst passive_event\t\t\t= { passive: true };\n\t\tconst listboxId\t\t\t\t= self.inputId +'-ts-dropdown';\n\n\n\t\tsetAttr(dropdown_content,{\n\t\t\tid: listboxId\n\t\t});\n\n\t\tsetAttr(focus_node,{\n\t\t\trole:'combobox',\n\t\t\t'aria-haspopup':'listbox',\n\t\t\t'aria-expanded':'false',\n\t\t\t'aria-controls':listboxId\n\t\t});\n\n\t\tconst control_id\t= getId(focus_node,self.inputId + '-ts-control');\n\t\tconst query\t\t\t= \"label[for='\"+escapeQuery(self.inputId)+\"']\";\n\t\tconst label\t\t\t= document.querySelector(query);\n\t\tconst label_click\t= self.focus.bind(self);\n\t\tif( label ){\n\t\t\taddEvent(label,'click', label_click );\n\t\t\tsetAttr(label,{for:control_id});\n\t\t\tconst label_id = getId(label,self.inputId+'-ts-label');\n\t\t\tsetAttr(focus_node,{'aria-labelledby':label_id});\n\t\t\tsetAttr(dropdown_content,{'aria-labelledby':label_id});\n\t\t}\n\n\t\twrapper.style.width = input.style.width;\n        wrapper.style.minWidth = input.style.minWidth;\n        wrapper.style.maxWidth = input.style.maxWidth;\n\n\t\tif (self.plugins.names.length) {\n\t\t\tconst classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\taddClasses( [wrapper,dropdown], classes_plugins);\n\t\t}\n\n\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag ){\n\t\t\tsetAttr(input,{multiple:'multiple'});\n\t\t}\n\n\t\tif (settings.placeholder) {\n\t\t\tsetAttr(control_input,{placeholder:settings.placeholder});\n\t\t}\n\n\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\tif (!settings.splitOn && settings.delimiter) {\n\t\t\tsettings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n\t\t}\n\n\t\t// debounce user defined load() if loadThrottle > 0\n\t\t// after initializePlugins() so plugins can create/modify user defined loaders\n\t\tif( settings.load && settings.loadThrottle ){\n\t\t\tsettings.load = loadDebounce(settings.load,settings.loadThrottle)\n\t\t}\n\n\t\taddEvent(dropdown,'mousemove', () => {\n\t\t\tself.ignoreHover = false;\n\t\t});\n\n\t\taddEvent(dropdown,'mouseenter', (e) => {\n\n\t\t\tvar target_match = parentMatch(e.target as HTMLElement, '[data-selectable]', dropdown);\n\t\t\tif( target_match ) self.onOptionHover( e as MouseEvent, target_match );\n\n\t\t}, {capture:true});\n\n\t\t// clicking on an option should select it\n\t\taddEvent(dropdown,'click',(evt) => {\n\t\t\tconst option = parentMatch(evt.target as HTMLElement, '[data-selectable]');\n\t\t\tif( option ){\n\t\t\t\tself.onOptionSelect( evt as MouseEvent, option );\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\t\t});\n\n\t\taddEvent(control,'click', (evt) => {\n\n\t\t\tvar target_match = parentMatch( evt.target as HTMLElement, '[data-ts-item]', control);\n\t\t\tif( target_match && self.onItemSelect(evt as MouseEvent, target_match as TomItem) ){\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// retain focus (see control_input mousedown)\n\t\t\tif( control_input.value != '' ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.onClick();\n\t\t\tpreventDefault(evt,true);\n\t\t});\n\n\n\t\t// keydown on focus_node for arrow_down/arrow_up\n\t\taddEvent(focus_node,'keydown',\t\t(e) => self.onKeyDown(e as KeyboardEvent) );\n\n\t\t// keypress and input/keyup\n\t\taddEvent(control_input,'keypress',\t(e) => self.onKeyPress(e as KeyboardEvent) );\n\t\taddEvent(control_input,'input',\t\t(e) => self.onInput(e as KeyboardEvent) );\n\t\taddEvent(focus_node,'blur', \t\t(e) => self.onBlur(e as FocusEvent) );\n\t\taddEvent(focus_node,'focus',\t\t(e) => self.onFocus(e as MouseEvent) );\n\t\taddEvent(control_input,'paste',\t\t(e) => self.onPaste(e as MouseEvent) );\n\n\n\t\tconst doc_mousedown = (evt:Event) => {\n\n\t\t\t// blur if target is outside of this instance\n\t\t\t// dropdown is not always inside wrapper\n\t\t\tconst target = evt.composedPath()[0];\n\t\t\tif( !wrapper.contains(target as HTMLElement) && !dropdown.contains(target as HTMLElement) ){\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.blur();\n\t\t\t\t}\n\t\t\t\tself.inputState();\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t// retain focus by preventing native handling. if the\n\t\t\t// event target is the input it should not be modified.\n\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t// Fixes bug #212 which is no covered by tests\n\t\t\tif( target == control_input && self.isOpen ){\n\t\t\t\tevt.stopPropagation();\n\n\t\t\t// clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n\t\t\t}else{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\n\t\t};\n\n\t\tconst win_scroll = () => {\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.positionDropdown();\n\t\t\t}\n\t\t};\n\n\t\tconst input_invalid = () => {\n\t\t\tif( self.isValid ){\n\t\t\t\tself.isValid = false;\n\t\t\t\tself.isInvalid = true;\n\t\t\t\tself.refreshState();\n\t\t\t}\n\t\t}\n\n\t\taddEvent(input,'invalid', input_invalid);\n\t\taddEvent(document,'mousedown', doc_mousedown);\n\t\taddEvent(window,'scroll', win_scroll, passive_event);\n\t\taddEvent(window,'resize', win_scroll, passive_event);\n\n\t\tthis._destroy = () => {\n\t\t\tinput.removeEventListener('invalid',input_invalid);\n\t\t\tdocument.removeEventListener('mousedown',doc_mousedown);\n\t\t\twindow.removeEventListener('scroll',win_scroll);\n\t\t\twindow.removeEventListener('resize',win_scroll);\n\t\t\tif( label ) label.removeEventListener('click',label_click);\n\t\t};\n\n\t\t// store original html and tab index so that they can be\n\t\t// restored when the destroy() method is called.\n\t\tthis.revertSettings = {\n\t\t\tinnerHTML : input.innerHTML,\n\t\t\ttabIndex : input.tabIndex\n\t\t};\n\n\n\t\tinput.tabIndex = -1;\n\t\tinput.insertAdjacentElement('afterend', self.wrapper);\n\n\t\tself.sync(false);\n\t\tsettings.items = [];\n\t\tdelete settings.optgroups;\n\t\tdelete settings.options;\n\n\t\tself.refreshItems();\n\t\tself.close(false);\n\t\tself.inputState();\n\t\tself.isSetup = true;\n\n\t\tif( input.disabled ){\n\t\t\tself.disable();\n\t\t}else if( input.readOnly ){\n\t\t\tself.setReadOnly(true);\n\t\t}else{\n\t\t\tself.enable(); //sets tabIndex\n\t\t}\n\n\t\tself.on('change', this.onChange);\n\n\t\taddClasses(input,'tomselected','ts-hidden-accessible');\n\t\tself.trigger('initialize');\n\n\t\t// preload options\n\t\tif (settings.preload === true) {\n\t\t\tself.preload();\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Register options and optgroups\n\t *\n\t */\n\tsetupOptions(options:TomOption[] = [], optgroups:TomOption[] = []){\n\n\t\t// build options table\n\t\tthis.addOptions(options);\n\n\n\t\t// build optgroup table\n\t\titerate( optgroups, (optgroup:TomOption) => {\n\t\t\tthis.registerOptionGroup(optgroup);\n\t\t});\n\t}\n\n\t/**\n\t * Sets up default rendering functions.\n\t */\n\tsetupTemplates() {\n\t\tvar self = this;\n\t\tvar field_label = self.settings.labelField;\n\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\n\t\tvar templates = {\n\t\t\t'optgroup': (data:TomOption) => {\n\t\t\t\tlet optgroup = document.createElement('div');\n\t\t\t\toptgroup.className = 'optgroup';\n\t\t\t\toptgroup.appendChild(data.options);\n\t\t\t\treturn optgroup;\n\n\t\t\t},\n\t\t\t'optgroup_header': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t},\n\t\t\t'option': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'item': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'option_create': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t},\n\t\t\t'no_results':() => {\n\t\t\t\treturn '<div class=\"no-results\">No results found</div>';\n\t\t\t},\n\t\t\t'loading':() => {\n\t\t\t\treturn '<div class=\"spinner\"></div>';\n\t\t\t},\n\t\t\t'not_loading':() => {},\n\t\t\t'dropdown':() => {\n\t\t\t\treturn '<div></div>';\n\t\t\t}\n\t\t};\n\n\n\t\tself.settings.render = Object.assign({}, templates, self.settings.render);\n\t}\n\n\t/**\n\t * Maps fired events to callbacks provided\n\t * in the settings used when creating the control.\n\t */\n\tsetupCallbacks() {\n\t\tvar key, fn;\n\t\tvar callbacks:{[key:string]:string} = {\n\t\t\t'initialize'      : 'onInitialize',\n\t\t\t'change'          : 'onChange',\n\t\t\t'item_add'        : 'onItemAdd',\n\t\t\t'item_remove'     : 'onItemRemove',\n\t\t\t'item_select'     : 'onItemSelect',\n\t\t\t'clear'           : 'onClear',\n\t\t\t'option_add'      : 'onOptionAdd',\n\t\t\t'option_remove'   : 'onOptionRemove',\n\t\t\t'option_clear'    : 'onOptionClear',\n\t\t\t'optgroup_add'    : 'onOptionGroupAdd',\n\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t'optgroup_clear'  : 'onOptionGroupClear',\n\t\t\t'dropdown_open'   : 'onDropdownOpen',\n\t\t\t'dropdown_close'  : 'onDropdownClose',\n\t\t\t'type'            : 'onType',\n\t\t\t'load'            : 'onLoad',\n\t\t\t'focus'           : 'onFocus',\n\t\t\t'blur'            : 'onBlur'\n\t\t};\n\n\t\tfor (key in callbacks) {\n\n\t\t\tfn = this.settings[callbacks[key] as (keyof TomSettings)];\n\t\t\tif (fn) this.on(key, fn);\n\n\t\t}\n\t}\n\n\t/**\n\t * Sync the Tom Select instance with the original input or select\n\t *\n\t */\n\tsync(get_settings:boolean=true):void{\n\t\tconst self\t\t= this;\n\t\tconst settings\t= get_settings ? getSettings( self.input, {delimiter:self.settings.delimiter,allowEmptyOption:self.settings.allowEmptyOption} as RecursivePartial<TomSettings> ) : self.settings;\n\n\t\tself.setupOptions(settings.options,settings.optgroups);\n\n\t\tself.setValue(settings.items||[],true); // silent prevents recursion\n\n\t\tself.lastQuery = null; // so updated options will be displayed in dropdown\n\t}\n\n\t/**\n\t * Triggered when the main control element\n\t * has a click event.\n\t *\n\t */\n\tonClick():void {\n\t\tvar self = this;\n\n\t\tif( self.activeItems.length > 0 ){\n\t\t\tself.clearActiveItems();\n\t\t\tself.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.isFocused && self.isOpen ){\n\t\t\tself.blur();\n\t\t} else {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated v1.7\n\t *\n\t */\n\tonMouseDown():void {}\n\n\t/**\n\t * Triggered when the value of the control has been changed.\n\t * This should propagate the event to the original DOM\n\t * input / select element.\n\t */\n\tonChange() {\n\t\ttriggerEvent(this.input, 'input');\n\t\ttriggerEvent(this.input, 'change');\n\t}\n\n\t/**\n\t * Triggered on <input> paste.\n\t *\n\t */\n\tonPaste(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isInputHidden || self.isLocked ){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a regex or string is included, this will split the pasted\n\t\t// input and create Items for each separate value\n\t\tif( !self.settings.splitOn ){\n\t\t\treturn;\n\t\t}\n\n\t\t// Wait for pasted text to be recognized in value\n\t\tsetTimeout(() => {\n\t\t\tvar pastedText = self.inputValue();\n\t\t\tif( !pastedText.match(self.settings.splitOn)){\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar splitInput = pastedText.trim().split(self.settings.splitOn);\n\t\t\titerate( splitInput, (piece:string) => {\n\n\t\t\t\tconst hash = hash_key(piece);\n\t\t\t\tif( hash ){\n\t\t\t\t\tif( this.options[piece] ){\n\t\t\t\t\t\tself.addItem(piece);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tself.createItem(piece);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\n\t}\n\n\t/**\n\t * Triggered on <input> keypress.\n\t *\n\t */\n\tonKeyPress(e:KeyboardEvent):void {\n\t\tvar self = this;\n\t\tif(self.isLocked){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\tif (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n\t\t\tself.createItem();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keydown.\n\t *\n\t */\n\tonKeyDown(e:KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tself.ignoreHover = true;\n\n\t\tif (self.isLocked) {\n\t\t\tif (e.keyCode !== constants.KEY_TAB) {\n\t\t\t\tpreventDefault(e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.keyCode) {\n\n\t\t\t// ctrl+A: select all\n\t\t\tcase constants.KEY_A:\n\t\t\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\t\t\tif( self.control_input.value == '' ){\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// esc: close dropdown\n\t\t\tcase constants.KEY_ESC:\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tpreventDefault(e,true);\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\n\t\t\t// down: open dropdown or move selection down\n\t\t\tcase constants.KEY_DOWN:\n\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\tself.open();\n\t\t\t\t} else if (self.activeOption) {\n\t\t\t\t\tlet next = self.getAdjacent(self.activeOption, 1);\n\t\t\t\t\tif (next) self.setActiveOption(next);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// up: move selection up\n\t\t\tcase constants.KEY_UP:\n\t\t\t\tif (self.activeOption) {\n\t\t\t\t\tlet prev = self.getAdjacent(self.activeOption, -1);\n\t\t\t\t\tif (prev) self.setActiveOption(prev);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// return: select active option\n\t\t\tcase constants.KEY_RETURN:\n\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// if the option_create=null, the dropdown might be closed\n\t\t\t\t}else if (self.settings.create && self.createItem()) {\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// don't submit form when searching for a value\n\t\t\t\t}else if( document.activeElement == self.control_input && self.isOpen ){\n\t\t\t\t\tpreventDefault(e);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t// left: modifiy item selection to the left\n\t\t\tcase constants.KEY_LEFT:\n\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\treturn;\n\n\t\t\t// right: modifiy item selection to the right\n\t\t\tcase constants.KEY_RIGHT:\n\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\treturn;\n\n\t\t\t// tab: select active option and/or create item\n\t\t\tcase constants.KEY_TAB:\n\n\t\t\t\tif( self.settings.selectOnTab ){\n\t\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\n\t\t\t\t\t\t// prevent default [tab] behaviour of jump to the next field\n\t\t\t\t\t\t// if select isFull, then the dropdown won't be open and [tab] will work normally\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t\telse if(self.settings.create && self.createItem()) {\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// delete|backspace: delete items\n\t\t\tcase constants.KEY_BACKSPACE:\n\t\t\tcase constants.KEY_DELETE:\n\t\t\t\tself.deleteSelection(e);\n\t\t\t\treturn;\n\t\t}\n\n\t\t// don't enter text in the control_input when active items are selected\n\t\tif( self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\tpreventDefault(e);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keyup.\n\t *\n\t */\n\tonInput(e:MouseEvent|KeyboardEvent):void {\n\n\t\tif( this.isLocked ){\n\t\t\treturn;\n\t\t}\n\n\t\tconst value = this.inputValue();\n\t\tif( this.lastValue === value ) return;\n\t\tthis.lastValue = value;\n\n\t\tif( value == '' ){\n\t\t\tthis._onInput();\n\t\t\treturn;\n\t\t}\n\n\t\tif( this.refreshTimeout ){\n\t\t\twindow.clearTimeout(this.refreshTimeout);\n\t\t}\n\n\t\tthis.refreshTimeout = timeout(()=> {\n\t\t\tthis.refreshTimeout = null;\n\t\t\tthis._onInput();\n\t\t}, this.settings.refreshThrottle);\n\t}\n\n\t_onInput():void {\n\t\tconst value = this.lastValue;\n\n\t\tif( this.settings.shouldLoad.call(this,value) ){\n\t\t\tthis.load(value);\n\t\t}\n\n\t\tthis.refreshOptions();\n\t\tthis.trigger('type', value);\n\t}\n\n\t/**\n\t * Triggered when the user rolls over\n\t * an option in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionHover( evt:MouseEvent|KeyboardEvent, option:HTMLElement ):void{\n\t\tif( this.ignoreHover ) return;\n\t\tthis.setActiveOption(option, false);\n\t}\n\n\t/**\n\t * Triggered on <input> focus.\n\t *\n\t */\n\tonFocus(e?:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\t\tvar wasFocused = self.isFocused;\n\n\t\tif( self.isDisabled || self.isReadOnly ){\n\t\t\tself.blur();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (self.ignoreFocus) return;\n\t\tself.isFocused = true;\n\t\tif( self.settings.preload === 'focus' ) self.preload();\n\n\t\tif (!wasFocused) self.trigger('focus');\n\n\t\tif (!self.activeItems.length) {\n\t\t\tself.inputState();\n\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t}\n\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Triggered on <input> blur.\n\t *\n\t */\n\tonBlur(e?:FocusEvent):void {\n\n\t\tif( document.hasFocus() === false ) return;\n\n\t\tvar self = this;\n\t\tif (!self.isFocused) return;\n\t\tself.isFocused = false;\n\t\tself.ignoreFocus = false;\n\n\t\tvar deactivate = () => {\n\t\t\tself.close();\n\t\t\tself.setActiveItem();\n\t\t\tself.setCaret(self.items.length);\n\t\t\tself.trigger('blur');\n\t\t};\n\n\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\tself.createItem(null, deactivate);\n\t\t} else {\n\t\t\tdeactivate();\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered when the user clicks on an option\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionSelect( evt:MouseEvent|KeyboardEvent, option:HTMLElement ){\n\t\tvar value, self = this;\n\n\n\t\t// should not be possible to trigger a option under a disabled optgroup\n\t\tif( option.parentElement && option.parentElement.matches('[data-disabled]') ){\n\t\t\treturn;\n\t\t}\n\n\n\t\tif( option.classList.contains('create') ){\n\t\t\tself.createItem(null, () => {\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t} else if(self.settings.clearAfterSelect) {\n\t\t\t\t\tself.setTextboxValue();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = option.dataset.value;\n\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.addItem(value);\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t} else if(self.settings.clearAfterSelect) {\n\t\t\t\t\tself.setTextboxValue();\n\t\t\t\t}\n\n\t\t\t\tif( !self.settings.hideSelected && evt.type && /click/.test(evt.type) ){\n\t\t\t\t\tself.setActiveOption(option);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return true if the given option can be selected\n\t *\n\t */\n\tcanSelect(option:HTMLElement|null):boolean{\n\n\t\tif( this.isOpen && option && this.dropdown_content.contains(option) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Triggered when the user clicks on an item\n\t * that has been selected.\n\t *\n\t */\n\tonItemSelect( evt?:MouseEvent, item?:TomItem ):boolean{\n\t\tvar self = this;\n\n\t\tif( !self.isLocked && self.settings.mode === 'multi' ){\n\t\t\tpreventDefault(evt);\n\t\t\tself.setActiveItem(item, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines whether or not to invoke\n\t * the user-provided option provider / loader\n\t *\n\t * Note, there is a subtle difference between\n\t * this.canLoad() and this.settings.shouldLoad();\n\t *\n\t *\t- settings.shouldLoad() is a user-input validator.\n\t *\tWhen false is returned, the not_loading template\n\t *\twill be added to the dropdown\n\t *\n\t *\t- canLoad() is lower level validator that checks\n\t * \tthe Tom Select instance. There is no inherent user\n\t *\tfeedback when canLoad returns false\n\t *\n\t */\n\tcanLoad(value:string):boolean{\n\n\t\tif( !this.settings.load ) return false;\n\t\tif( this.loadedSearches.hasOwnProperty(value) ) return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Invokes the user-provided option provider / loader.\n\t *\n\t */\n\tload(value:string):void {\n\t\tconst self = this;\n\n\t\tif( !self.canLoad(value) ) return;\n\n\t\taddClasses(self.wrapper,self.settings.loadingClass);\n\t\tself.loading++;\n\n\t\tconst callback = self.loadCallback.bind(self);\n\t\tself.settings.load.call(self, value, callback);\n\t}\n\n\t/**\n\t * Invoked by the user-provided option provider\n\t *\n\t */\n\tloadCallback( options:TomOption[], optgroups:TomOption[] ):void{\n\t\tconst self = this;\n\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\tself.lastQuery = null;\n\n\t\tself.clearActiveOption(); // when new results load, focus should be on first option\n\t\tself.setupOptions(options,optgroups);\n\n\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\n\t\tif (!self.loading) {\n\t\t\tremoveClasses(self.wrapper,self.settings.loadingClass);\n\t\t}\n\n\t\tself.trigger('load', options, optgroups);\n\t}\n\n\tpreload():void{\n\t\tvar classList = this.wrapper.classList;\n\t\tif( classList.contains('preloaded') ) return;\n\t\tclassList.add('preloaded');\n\t\tthis.load('');\n\t}\n\n\n\t/**\n\t * Sets the input field of the control to the specified value.\n\t *\n\t */\n\tsetTextboxValue(value:string = '') {\n\t\tvar input = this.control_input;\n\t\tvar changed = input.value !== value;\n\t\tif (changed) {\n\t\t\tinput.value = value;\n\t\t\ttriggerEvent(input,'update');\n\t\t\tthis.lastValue = value;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the value of the control. If multiple items\n\t * can be selected (e.g. <select multiple>), this returns\n\t * an array. If only one item can be selected, this\n\t * returns a string.\n\t *\n\t */\n\tgetValue():string|string[] {\n\n\t\tif( this.is_select_tag && this.input.hasAttribute('multiple')) {\n\t\t\treturn this.items;\n\t\t}\n\n\t\treturn this.items.join(this.settings.delimiter);\n\t}\n\n\t/**\n\t * Resets the selected items to the given value.\n\t *\n\t */\n\tsetValue( value:string|string[], silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change'];\n\n\t\tdebounce_events(this, events,() => {\n\t\t\tthis.clear(silent);\n\t\t\tthis.addItems(value, silent);\n\t\t});\n\t}\n\n\n\t/**\n\t * Resets the number of max items to the given value\n\t *\n\t */\n\tsetMaxItems(value:null|number){\n\t\tif(value === 0) value = null; //reset to unlimited items.\n\t\tthis.settings.maxItems = value;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Sets the selected item.\n\t *\n\t */\n\tsetActiveItem( item?:TomItem, e?:MouseEvent|KeyboardEvent ){\n\t\tvar self = this;\n\t\tvar eventName;\n\t\tvar i, begin, end, swap;\n\t\tvar last;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\t// clear the active selection\n\t\tif( !item ){\n\t\t\tself.clearActiveItems();\n\t\t\tif (self.isFocused) {\n\t\t\t\tself.inputState();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// modify selection\n\t\teventName = e && e.type.toLowerCase();\n\n\t\tif (eventName === 'click' && isKeyDown('shiftKey',e) && self.activeItems.length) {\n\t\t\tlast\t= self.getLastActive();\n\t\t\tbegin\t= Array.prototype.indexOf.call(self.control.children, last);\n\t\t\tend\t\t= Array.prototype.indexOf.call(self.control.children, item);\n\n\t\t\tif (begin > end) {\n\t\t\t\tswap  = begin;\n\t\t\t\tbegin = end;\n\t\t\t\tend   = swap;\n\t\t\t}\n\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\titem = self.control.children[i] as TomItem;\n\t\t\t\tif (self.activeItems.indexOf(item) === -1) {\n\t\t\t\t\tself.setActiveItemClass(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpreventDefault(e);\n\t\t} else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT,e) ) || (eventName === 'keydown' && isKeyDown('shiftKey',e))) {\n\t\t\tif( item.classList.contains('active') ){\n\t\t\t\tself.removeActiveItem( item );\n\t\t\t} else {\n\t\t\t\tself.setActiveItemClass(item);\n\t\t\t}\n\t\t} else {\n\t\t\tself.clearActiveItems();\n\t\t\tself.setActiveItemClass(item);\n\t\t}\n\n\t\t// ensure control has focus\n\t\tself.inputState();\n\t\tif (!self.isFocused) {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Set the active and last-active classes\n\t *\n\t */\n\tsetActiveItemClass( item:TomItem ){\n\t\tconst self = this;\n\t\tconst last_active = self.control.querySelector('.last-active');\n\t\tif( last_active ) removeClasses(last_active as HTMLElement,'last-active');\n\n\t\taddClasses(item,'active last-active');\n\t\tself.trigger('item_select', item);\n\t\tif( self.activeItems.indexOf(item) == -1 ){\n\t\t\tself.activeItems.push( item );\n\t\t}\n\t}\n\n\t/**\n\t * Remove active item\n\t *\n\t */\n\tremoveActiveItem( item:TomItem ){\n\t\tvar idx = this.activeItems.indexOf(item);\n\t\tthis.activeItems.splice(idx, 1);\n\t\tremoveClasses(item,'active');\n\t}\n\n\t/**\n\t * Clears all the active items\n\t *\n\t */\n\tclearActiveItems(){\n\t\tremoveClasses(this.activeItems,'active');\n\t\tthis.activeItems = [];\n\t}\n\n\t/**\n\t * Sets the selected item in the dropdown menu\n\t * of available options.\n\t *\n\t */\n\tsetActiveOption( option:null|HTMLElement,scroll:boolean=true ):void{\n\n\t\tif( option === this.activeOption ){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearActiveOption();\n\t\tif( !option ) return;\n\n\t\tthis.activeOption = option;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':option.getAttribute('id')});\n\t\tsetAttr(option,{'aria-selected':'true'});\n\t\taddClasses(option,'active');\n\t\tif( scroll ) this.scrollToOption(option);\n\t}\n\n\t/**\n\t * Sets the dropdown_content scrollTop to display the option\n\t *\n\t */\n\tscrollToOption( option:null|HTMLElement, behavior?:string ):void{\n\n\t\tif( !option ) return;\n\n\t\tconst content\t\t= this.dropdown_content;\n\t\tconst height_menu\t= content.clientHeight;\n\t\tconst scrollTop\t\t= content.scrollTop || 0;\n\t\tconst height_item\t= option.offsetHeight;\n\t\tconst y\t\t\t\t= option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n\t\tif (y + height_item > height_menu + scrollTop) {\n\t\t\tthis.scroll(y - height_menu + height_item, behavior);\n\n\t\t} else if (y < scrollTop) {\n\t\t\tthis.scroll(y, behavior);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll the dropdown to the given position\n\t *\n\t */\n\tscroll( scrollTop:number, behavior?:string ):void{\n\t\tconst content = this.dropdown_content;\n\t\tif( behavior ){\n\t\t\tcontent.style.scrollBehavior = behavior;\n\t\t}\n\t\tcontent.scrollTop = scrollTop;\n\t\tcontent.style.scrollBehavior = '';\n\t}\n\n\t/**\n\t * Clears the active option\n\t *\n\t */\n\tclearActiveOption(){\n\t\tif( this.activeOption ){\n\t\t\tremoveClasses(this.activeOption,'active');\n\t\t\tsetAttr(this.activeOption,{'aria-selected':null});\n\t\t}\n\t\tthis.activeOption = null;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':null});\n\t}\n\n\n\t/**\n\t * Selects all items (CTRL + A).\n\t */\n\tselectAll() {\n\t\tconst self = this;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\tconst activeItems = self.controlChildren();\n\n\t\tif( !activeItems.length ) return;\n\n\t\tself.inputState();\n\t\tself.close();\n\n\t\tself.activeItems = activeItems;\n\t\titerate( activeItems, (item:TomItem) => {\n\t\t\tself.setActiveItemClass(item);\n\t\t});\n\n\t}\n\n\t/**\n\t * Determines if the control_input should be in a hidden or visible state\n\t *\n\t */\n\tinputState(){\n\t\tvar self = this;\n\n\t\tif( !self.control.contains(self.control_input) ) return;\n\n\t\tsetAttr(self.control_input,{placeholder:self.settings.placeholder});\n\n\t\tif( self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) ){\n\t\t\tself.setTextboxValue();\n\t\t\tself.isInputHidden = true;\n\n\t\t}else{\n\n\t\t\tif( self.settings.hidePlaceholder && self.items.length > 0 ){\n\t\t\t\tsetAttr(self.control_input,{placeholder:''});\n\t\t\t}\n\t\t\tself.isInputHidden = false;\n\t\t}\n\n\t\tself.wrapper.classList.toggle('input-hidden', self.isInputHidden );\n\t}\n\n\t/**\n\t * Get the input value\n\t */\n\tinputValue(){\n\t\treturn this.control_input.value.trim();\n\t}\n\n\t/**\n\t * Gives the control focus.\n\t */\n\tfocus() {\n\t\tvar self = this;\n\t\tif( self.isDisabled || self.isReadOnly) return;\n\n\t\tself.ignoreFocus = true;\n\n\t\tif( self.control_input.offsetWidth ){\n\t\t\tself.control_input.focus();\n\t\t}else{\n\t\t\tself.focus_node.focus();\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tself.ignoreFocus = false;\n\t\t\tself.onFocus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Forces the control out of focus.\n\t *\n\t */\n\tblur():void {\n\t\tthis.focus_node.blur();\n\t\tthis.onBlur();\n\t}\n\n\t/**\n\t * Returns a function that scores an object\n\t * to show how good of a match it is to the\n\t * provided query.\n\t *\n\t * @return {function}\n\t */\n\tgetScoreFunction(query:string) {\n\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t}\n\n\t/**\n\t * Returns search options for sifter (the system\n\t * for scoring and sorting results).\n\t *\n\t * @see https://github.com/orchidjs/sifter.js\n\t * @return {object}\n\t */\n\tgetSearchOptions() {\n\t\tvar settings = this.settings;\n\t\tvar sort = settings.sortField;\n\t\tif (typeof settings.sortField === 'string') {\n\t\t\tsort = [{field: settings.sortField}];\n\t\t}\n\n\t\treturn {\n\t\t\tfields      : settings.searchField,\n\t\t\tconjunction : settings.searchConjunction,\n\t\t\tsort        : sort,\n\t\t\tnesting     : settings.nesting\n\t\t};\n\t}\n\n\t/**\n\t * Searches through available options and returns\n\t * a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string) : ReturnType<Sifter['search']>{\n\t\tvar result, calculateScore;\n\t\tvar self     = this;\n\t\tvar options  = this.getSearchOptions();\n\n\t\t// validate user-provided result scoring function\n\t\tif ( self.settings.score ){\n\t\t\tcalculateScore = self.settings.score.call(self,query);\n\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\tthrow new Error('Tom Select \"score\" setting must be a function that returns a function');\n\t\t\t}\n\t\t}\n\n\t\t// perform search\n\t\tif (query !== self.lastQuery) {\n\t\t\tself.lastQuery\t\t\t= query;\n\t\t\t// temp fix for https://github.com/orchidjs/tom-select/issues/987\n\t\t\t// UI crashed when more than 30 same chars in a row, prevent search and return empt result\n\t\t\tif (/(.)\\1{15,}/.test(query)) {\n\t\t\t\tquery \t\t\t\t= '';\n\t\t\t}\n\t\t\tresult \t\t\t\t\t= self.sifter.search(query, Object.assign(options, { score: calculateScore }));\n\t\t\tself.currentResults\t\t= result;\n\t\t} else {\n\t\t\tresult\t\t\t\t\t= Object.assign( {}, self.currentResults);\n\t\t}\n\n\t\t// filter out selected items\n\t\tif( self.settings.hideSelected ){\n\t\t\tresult.items = result.items.filter((item) => {\n\t\t\t\tlet hashed = hash_key(item.id);\n\t\t\t\treturn !(hashed !== null && self.items.indexOf(hashed) !== -1 );\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Refreshes the list of available options shown\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\trefreshOptions( triggerDropdown:boolean = true ){\n\t\tvar i, j, k, n, optgroup, optgroups, html:DocumentFragment, has_create_option, active_group;\n\t\tvar create;\n\n\t\ttype Group = {fragment:DocumentFragment,order:number,optgroup:string}\n\t\tconst groups: {[key:string]:number} = {};\n\t\tconst groups_order:Group[]\t= [];\n\n\t\tvar self\t\t\t\t\t= this;\n\t\tvar query\t\t\t\t\t= self.inputValue();\n\t\tconst same_query\t\t\t= query === self.lastQuery || (query == '' && self.lastQuery == null);\n\t\tvar results\t\t\t\t\t= self.search(query);\n\t\tvar active_option:HTMLElement|null = null;\n\t\tvar show_dropdown\t\t\t= self.settings.shouldOpen || false;\n\t\tvar dropdown_content\t\t= self.dropdown_content;\n\n\n\t\tif( same_query ){\n\t\t\tactive_option\t\t\t= self.activeOption;\n\n\t\t\tif( active_option ){\n\t\t\t\tactive_group = active_option.closest('[data-group]') as HTMLElement;\n\t\t\t}\n\t\t}\n\n\t\t// build markup\n\t\tn = results.items.length;\n\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t}\n\n\t\tif( n > 0 ){\n\t\t\tshow_dropdown = true;\n\t\t}\n\n\t\t// get fragment for group and the position of the group in group_order\n\t\tconst getGroupFragment = (optgroup:string,order:number):[number,DocumentFragment] => {\n\n\t\t\tlet group_order_i = groups[optgroup];\n\n\t\t\tif( group_order_i !== undefined ){\n\t\t\t\tlet order_group = groups_order[group_order_i];\n\t\t\t\tif( order_group !== undefined ){\n\t\t\t\t\treturn [group_order_i,order_group.fragment];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet group_fragment = document.createDocumentFragment();\n\t\t\tgroup_order_i = groups_order.length;\n\t\t\tgroups_order.push({fragment:group_fragment,order,optgroup});\n\n\t\t\treturn [group_order_i,group_fragment]\n\t\t}\n\n\t\t// render and group available options individually\n\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t// get option dom element\n\t\t\tlet item\t\t\t= results.items[i];\n\t\t\tif( !item ) continue;\n\n\t\t\tlet opt_value\t\t= item.id;\n\t\t\tlet option\t\t\t= self.options[opt_value];\n\n\t\t\tif( option === undefined ) continue;\n\n\t\t\tlet opt_hash\t\t= get_hash(opt_value);\n\t\t\tlet option_el\t\t= self.getOption(opt_hash,true) as HTMLElement;\n\n\t\t\t// toggle 'selected' class\n\t\t\tif( !self.settings.hideSelected ){\n\t\t\t\toption_el.classList.toggle('selected', self.items.includes(opt_hash) );\n\t\t\t}\n\n\t\t\toptgroup    = option[self.settings.optgroupField] || '';\n\t\t\toptgroups   = Array.isArray(optgroup) ? optgroup : [optgroup];\n\n\n\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\toptgroup = optgroups[j];\n\n\t\t\t\tlet order = option.$order;\n\t\t\t\tlet self_optgroup = self.optgroups[optgroup];\n\t\t\t\tif (self_optgroup === undefined && typeof self.settings.optionGroupRegister === 'function') {\n\t          \t\tvar regGroup;\n\t\t\t\t\tif (regGroup = self.settings.optionGroupRegister.apply(self, [optgroup])) {\n\t\t\t\t\t\tself.registerOptionGroup(regGroup);\n\t\t\t\t\t}\n\t        \t}\n\t\t\t\tself_optgroup = self.optgroups[optgroup];\n\t\t\t\tif( self_optgroup === undefined ){\t\t\t\t\t\n\t\t\t\t\toptgroup = '';\n\t\t\t\t}else{\n\t\t\t\t\torder = self_optgroup.$order;\n\t\t\t\t}\n\n\t\t\t\tconst [group_order_i,group_fragment] = getGroupFragment(optgroup,order);\n\n\n\t\t\t\t// nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\t\t\t\tif( j > 0 ){\n\t\t\t\t\toption_el = option_el.cloneNode(true) as HTMLElement;\n\t\t\t\t\tsetAttr(option_el,{id: option.$id+'-clone-'+j,'aria-selected':null});\n\t\t\t\t\toption_el.classList.add('ts-cloned');\n\t\t\t\t\tremoveClasses(option_el,'active');\n\n\n\t\t\t\t\t// make sure we keep the activeOption in the same group\n\t\t\t\t\tif( self.activeOption && self.activeOption.dataset.value == opt_value ){\n\t\t\t\t\t\tif( active_group && active_group.dataset.group === optgroup.toString() ){\n\t\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgroup_fragment.appendChild(option_el);\n\t\t\t\tif( optgroup != '' ){\n\t\t\t\t\tgroups[optgroup] = group_order_i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sort optgroups\n\t\tif( self.settings.lockOptgroupOrder ){\n\t\t\tgroups_order.sort((a, b) => {\n\t\t\t\treturn a.order - b.order;\n\t\t\t});\n\t\t}\n\n\t\t// render optgroup headers & join groups\n\t\thtml = document.createDocumentFragment();\n\t\titerate( groups_order, (group_order:Group) => {\n\n\t\t\tlet group_fragment = group_order.fragment;\n\t\t\tlet optgroup = group_order.optgroup\n\n\t\t\tif( !group_fragment || !group_fragment.children.length ) return;\n\n\t\t\tlet group_heading = self.optgroups[optgroup];\n\n\t\t\tif( group_heading !== undefined ){\n\n\t\t\t\tlet group_options = document.createDocumentFragment();\n\t\t\t\tlet header = self.render('optgroup_header', group_heading);\n\t\t\t\tappend( group_options, header );\n\t\t\t\tappend( group_options, group_fragment );\n\n\t\t\t\tlet group_html = self.render('optgroup', {group:group_heading,options:group_options} );\n\n\t\t\t\tappend( html, group_html );\n\n\t\t\t} else {\n\t\t\t\tappend( html, group_fragment );\n\t\t\t}\n\t\t});\n\n\t\tdropdown_content.innerHTML = '';\n\t\tappend( dropdown_content, html );\n\n\t\t// highlight matching terms inline\n\t\tif (self.settings.highlight) {\n\t\t\tremoveHighlight( dropdown_content );\n\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\titerate( results.tokens, (tok) => {\n\t\t\t\t\thighlight( dropdown_content, tok.regex);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// helper method for adding templates to dropdown\n\t\tvar add_template = (template:TomTemplateNames) => {\n\t\t\tlet content = self.render(template,{input:query});\n\t\t\tif( content ){\n\t\t\t\tshow_dropdown = true;\n\t\t\t\tdropdown_content.insertBefore(content, dropdown_content.firstChild);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\n\t\t// add loading message\n\t\tif( self.loading ){\n\t\t\tadd_template('loading');\n\n\t\t// invalid query\n\t\t}else if( !self.settings.shouldLoad.call(self,query) ){\n\t\t\tadd_template('not_loading');\n\n\t\t// add no_results message\n\t\t}else if( results.items.length === 0 ){\n\t\t\tadd_template('no_results');\n\n\t\t}\n\n\n\n\t\t// add create option\n\t\thas_create_option = self.canCreate(query);\n\t\tif (has_create_option) {\n\t\t\tcreate = add_template('option_create');\n\t\t}\n\n\n\t\t// activate\n\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\tif( show_dropdown ){\n\n\t\t\tif (results.items.length > 0) {\n\n\t\t\t\tif( !active_option && self.settings.mode === 'single' && self.items[0] != undefined ){\n\t\t\t\t\tactive_option = self.getOption(self.items[0]);\n\t\t\t\t}\n\n\t\t\t\tif( !dropdown_content.contains(active_option)  ){\n\n\t\t\t\t\tlet active_index = 0;\n\t\t\t\t\tif( create && !self.settings.addPrecedence ){\n\t\t\t\t\t\tactive_index = 1;\n\t\t\t\t\t}\n\t\t\t\t\tactive_option = self.selectable()[active_index] as HTMLElement;\n\t\t\t\t}\n\n\t\t\t}else if( create ){\n\t\t\t\tactive_option = create;\n\t\t\t}\n\n\t\t\tif( triggerDropdown && !self.isOpen ){\n\t\t\t\tself.open();\n\t\t\t\tself.scrollToOption(active_option,'auto');\n\t\t\t}\n\t\t\tself.setActiveOption(active_option);\n\n\t\t}else{\n\t\t\tself.clearActiveOption();\n\t\t\tif( triggerDropdown && self.isOpen ){\n\t\t\t\tself.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return list of selectable options\n\t *\n\t */\n\tselectable():NodeList{\n\t\treturn this.dropdown_content.querySelectorAll('[data-selectable]');\n\t}\n\n\n\n\t/**\n\t * Adds an available option. If it already exists,\n\t * nothing will happen. Note: this does not refresh\n\t * the options list dropdown (use `refreshOptions`\n\t * for that).\n\t *\n\t * Usage:\n\t *\n\t *   this.addOption(data)\n\t *\n\t */\n\taddOption( data:TomOption, user_created = false ):false|string {\n\t\tconst self = this;\n\n\t\t// @deprecated 1.7.7\n\t\t// use addOptions( array, user_created ) for adding multiple options\n\t\tif( Array.isArray(data) ){\n\t\t\tself.addOptions( data, user_created);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst key = hash_key(data[self.settings.valueField]);\n\t\tif( key === null || self.options.hasOwnProperty(key) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tdata.$order\t\t\t= data.$order || ++self.order;\n\t\tdata.$id\t\t\t= self.inputId + '-opt-' + data.$order;\n\t\tself.options[key]\t= data;\n\t\tself.lastQuery\t\t= null;\n\n\t\tif( user_created ){\n\t\t\tself.userOptions[key] = user_created;\n\t\t\tself.trigger('option_add', key, data);\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Add multiple options\n\t *\n\t */\n\taddOptions( data:TomOption[], user_created = false ):void{\n\t\titerate( data, (dat:TomOption) => {\n\t\t\tthis.addOption(dat, user_created);\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated 1.7.7\n\t */\n\tregisterOption( data:TomOption ):false|string {\n\t\treturn this.addOption(data);\n\t}\n\n\t/**\n\t * Registers an option group to the pool of option groups.\n\t *\n\t * @return {boolean|string}\n\t */\n\tregisterOptionGroup(data:TomOption) {\n\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\n\t\tif ( key === null ) return false;\n\n\t\tdata.$order = data.$order || ++this.order;\n\t\tthis.optgroups[key] = data;\n\t\treturn key;\n\t}\n\n\t/**\n\t * Registers a new optgroup for options\n\t * to be bucketed into.\n\t *\n\t */\n\taddOptionGroup(id:string, data:TomOption) {\n\t\tvar hashed_id;\n\t\tdata[this.settings.optgroupValueField] = id;\n\n\t\tif( hashed_id = this.registerOptionGroup(data) ){\n\t\t\tthis.trigger('optgroup_add', hashed_id, data);\n\t\t}\n\t}\n\n\t/**\n\t * Removes an existing option group.\n\t *\n\t */\n\tremoveOptionGroup(id:string) {\n\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\tdelete this.optgroups[id];\n\t\t\tthis.clearCache();\n\t\t\tthis.trigger('optgroup_remove', id);\n\t\t}\n\t}\n\n\t/**\n\t * Clears all existing option groups.\n\t */\n\tclearOptionGroups() {\n\t\tthis.optgroups = {};\n\t\tthis.clearCache();\n\t\tthis.trigger('optgroup_clear');\n\t}\n\n\t/**\n\t * Updates an option available for selection. If\n\t * it is visible in the selected items or options\n\t * dropdown, it will be re-rendered automatically.\n\t *\n\t */\n\tupdateOption(value:string, data:TomOption) {\n\t\tconst self = this;\n\t\tvar item_new;\n\t\tvar index_item;\n\n\t\tconst value_old\t\t= hash_key(value);\n\t\tconst value_new\t\t= hash_key(data[self.settings.valueField]);\n\n\t\t// sanity checks\n\t\tif( value_old === null ) return;\n\n\t\tconst data_old\t\t= self.options[value_old];\n\n\t\tif( data_old == undefined ) return;\n\t\tif( typeof value_new !== 'string' ) throw new Error('Value must be set in option data');\n\n\n\t\tconst option\t\t= self.getOption(value_old);\n\t\tconst item\t\t\t= self.getItem(value_old);\n\n\n\t\tdata.$order = data.$order || data_old.$order;\n\t\tdelete self.options[value_old];\n\n\t\t// invalidate render cache\n\t\t// don't remove existing node yet, we'll remove it after replacing it\n\t\tself.uncacheValue(value_new);\n\n\t\tself.options[value_new] = data;\n\n\t\t// update the option if it's in the dropdown\n\t\tif( option ){\n\t\t\tif( self.dropdown_content.contains(option) ){\n\n\t\t\t\tconst option_new\t= self._render('option', data);\n\t\t\t\treplaceNode(option, option_new);\n\n\t\t\t\tif( self.activeOption === option ){\n\t\t\t\t\tself.setActiveOption(option_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\toption.remove();\n\t\t}\n\n\t\t// update the item if we have one\n\t\tif( item ){\n\t\t\tindex_item = self.items.indexOf(value_old);\n\t\t\tif (index_item !== -1) {\n\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t}\n\n\t\t\titem_new\t= self._render('item', data);\n\n\t\t\tif( item.classList.contains('active') ) addClasses(item_new,'active');\n\n\t\t\treplaceNode( item, item_new);\n\t\t}\n\n\t\t// invalidate last query because we might have updated the sortField\n\t\tself.lastQuery = null;\n\t}\n\n\t/**\n\t * Removes a single option.\n\t *\n\t */\n\tremoveOption(value:string, silent?:boolean):void {\n\t\tconst self = this;\n\t\tvalue = get_hash(value);\n\n\t\tself.uncacheValue(value);\n\n\t\tdelete self.userOptions[value];\n\t\tdelete self.options[value];\n\t\tself.lastQuery = null;\n\t\tself.trigger('option_remove', value);\n\t\tself.removeItem(value, silent);\n\t}\n\n\t/**\n\t * Clears all options.\n\t */\n\tclearOptions(filter?:TomClearFilter ) {\n\n\t\tconst boundFilter = (filter || this.clearFilter).bind(this);\n\n\t\tthis.loadedSearches\t\t= {};\n\t\tthis.userOptions\t\t= {};\n\t\tthis.clearCache();\n\n\t\tconst selected:TomOptions\t= {};\n\t\titerate(this.options,(option:TomOption,key:string)=>{\n\t\t\tif( boundFilter(option,key as string) ){\n\t\t\t\tselected[key] = option;\n\t\t\t}\n\t\t});\n\n\t\tthis.options = this.sifter.items = selected;\n\t\tthis.lastQuery = null;\n\t\tthis.trigger('option_clear');\n\t}\n\n\t/**\n\t * Used by clearOptions() to decide whether or not an option should be removed\n\t * Return true to keep an option, false to remove\n\t *\n\t */\n\tclearFilter(option:TomOption,value:string){\n\t\tif( this.items.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns the dom element of the option\n\t * matching the given value.\n\t *\n\t */\n\tgetOption(value:undefined|null|boolean|string|number, create:boolean=false):null|HTMLElement {\n\n\t\tconst hashed = hash_key(value);\n\t\tif( hashed === null ) return null;\n\n\t\tconst option = this.options[hashed];\n\t\tif( option != undefined ){\n\n\t\t\tif( option.$div ){\n\t\t\t\treturn option.$div;\n\t\t\t}\n\n\t\t\tif( create ){\n\t\t\t\treturn this._render('option', option);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the dom element of the next or previous dom element of the same type\n\t * Note: adjacent options may not be adjacent DOM elements (optgroups)\n\t *\n\t */\n\tgetAdjacent( option:null|HTMLElement, direction:number, type:string = 'option' ) : HTMLElement|null{\n\t\tvar self = this, all;\n\n\t\tif( !option ){\n\t\t\treturn null;\n\t\t}\n\n\t\tif( type == 'item' ){\n\t\t\tall\t\t\t= self.controlChildren();\n\t\t}else{\n\t\t\tall\t\t\t= self.dropdown_content.querySelectorAll('[data-selectable]');\n\t\t}\n\n\t\tfor( let i = 0; i < all.length; i++ ){\n\t\t\tif( all[i] != option ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( direction > 0 ){\n\t\t\t\treturn all[i+1] as HTMLElement;\n\t\t\t}\n\n\t\t\treturn all[i-1] as HTMLElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Returns the dom element of the item\n\t * matching the given value.\n\t *\n\t */\n\tgetItem(item:string|TomItem|null):null|TomItem {\n\n\t\tif( typeof item == 'object' ){\n\t\t\treturn item;\n\t\t}\n\n\t\tvar value = hash_key(item);\n\t\treturn value !== null\n\t\t\t? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * \"Selects\" multiple items at once. Adds them to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItems( values:string|string[], silent?:boolean ):void{\n\t\tvar self = this;\n\n\t\tvar items = Array.isArray(values) ? values : [values];\n\t\titems = items.filter(x => self.items.indexOf(x) === -1);\n\t\tconst last_item = items[items.length - 1];\n\t\titems.forEach(item => {\n\t\t\tself.isPending = (item !== last_item);\n\t\t\tself.addItem(item, silent);\n\t\t});\n\t}\n\n\t/**\n\t * \"Selects\" an item. Adds it to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItem( value:string, silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change','dropdown_close'];\n\n\t\tdebounce_events(this, events, () => {\n\t\t\tvar item, wasFull;\n\t\t\tconst self = this;\n\t\t \tconst inputMode = self.settings.mode;\n\t\t\tconst hashed = hash_key(value);\n\n\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\n\t\t\t\tif( inputMode === 'single' ){\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( inputMode === 'single' || !self.settings.duplicates ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\n\t\t\titem = self._render('item', self.options[hashed]);\n\n\t\t\tif( self.control.contains(item) ){ // duplicates\n\t\t\t\titem = item.cloneNode(true) as HTMLElement;\n\t\t\t}\n\n\t\t\twasFull = self.isFull();\n\t\t\tself.items.splice(self.caretPos, 0, hashed);\n\t\t\tself.insertAtCaret(item);\n\n\t\t\tif (self.isSetup) {\n\n\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\tif( !self.isPending && self.settings.hideSelected ){\n\t\t\t\t\tlet option = self.getOption(hashed);\n\t\t\t\t\tlet next = self.getAdjacent(option, 1);\n\t\t\t\t\tif( next ){\n\t\t\t\t\t\tself.setActiveOption(next);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//remove input value when enabled\n\t\t\t\tif(self.settings.clearAfterSelect) {\n\t\t\t\t\tself.setTextboxValue();\n\t\t\t\t}\n\n\t\t\t\t// refreshOptions after setActiveOption(),\n\t\t\t\t// otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\t\t\t\tif( !self.isPending && !self.settings.closeAfterSelect ){\n\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t}\n\n\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\tif( self.settings.closeAfterSelect != false && self.isFull() ){\n\t\t\t\t\tself.close();\n\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\tself.positionDropdown();\n\t\t\t\t}\n\n\t\t\t\tself.trigger('item_add', hashed, item);\n\n\t\t\t\tif (!self.isPending) {\n\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\tself.inputState();\n\t\t\t\tself.refreshState();\n\t\t\t}\n\n\t\t});\n\t}\n\n\t/**\n\t * Removes the selected item matching\n\t * the provided value.\n\t *\n\t */\n\tremoveItem( item:string|TomItem|null=null, silent?:boolean ){\n\t\tconst self\t\t= this;\n\t\titem\t\t\t= self.getItem(item);\n\n\t\tif( !item ) return;\n\n\t\tvar i,idx;\n\t\tconst value\t= item.dataset.value;\n\t\ti = nodeIndex(item);\n\n\t\titem.remove();\n\t\tif( item.classList.contains('active') ){\n\t\t\tidx = self.activeItems.indexOf(item);\n\t\t\tself.activeItems.splice(idx, 1);\n\t\t\tremoveClasses(item,'active');\n\t\t}\n\n\t\tself.items.splice(i, 1);\n\t\tself.lastQuery = null;\n\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\tself.removeOption(value, silent);\n\t\t}\n\n\t\tif (i < self.caretPos) {\n\t\t\tself.setCaret(self.caretPos - 1);\n\t\t}\n\n\t\tself.updateOriginalInput({silent: silent});\n\t\tself.refreshState();\n\t\tself.positionDropdown();\n\t\tself.trigger('item_remove', value, item);\n\n\t}\n\n\t/**\n\t * Invokes the `create` method provided in the\n\t * TomSelect options that should provide the data\n\t * for the new item, given the user input.\n\t *\n\t * Once this completes, it will be added\n\t * to the item list.\n\t *\n\t */\n\tcreateItem( input:null|string=null, callback:TomCreateCallback = ()=>{} ):boolean{\n\n\t\t// triggerDropdown parameter @deprecated 2.1.1\n\t\tif( arguments.length === 3 ){\n\t\t\tcallback = arguments[2];\n\t\t}\n\t\tif( typeof callback != 'function' ){\n\t\t\tcallback = () => {};\n\t\t}\n\n\t\tvar self  = this;\n\t\tvar caret = self.caretPos;\n\t\tvar output;\n\t\tinput = input || self.inputValue();\n\n\t\tif (!self.canCreate(input)) {\n\t\t\tconst hash = hash_key(input);\n\t\t\t\tif( hash ){\n\t\t\t\t\tif( this.options[input] ){\n\t\t\t\t\t\tself.addItem(input);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcallback();\n\t\t\treturn false;\n\t\t}\n\n\t\tself.lock();\n\n\t\tvar created = false;\n\t\tvar create = (data?:boolean|TomOption) => {\n\t\t\tself.unlock();\n\n\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\tif( typeof value !== 'string' ){\n\t\t\t\treturn callback();\n\t\t\t}\n\n\t\t\tself.setTextboxValue();\n\t\t\tself.addOption(data,true);\n\t\t\tself.setCaret(caret);\n\t\t\tself.addItem(value);\n\t\t\tcallback(data);\n\t\t\tcreated = true;\n\t\t};\n\n\t\tif( typeof self.settings.create === 'function' ){\n\t\t\toutput = self.settings.create.call(this, input, create);\n\t\t}else{\n\t\t\toutput = {\n\t\t\t\t[self.settings.labelField]: input,\n\t\t\t\t[self.settings.valueField]: input,\n\t\t\t};\n\t\t}\n\n\t\tif( !created ){\n\t\t\tcreate(output);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Re-renders the selected item lists.\n\t */\n\trefreshItems() {\n\t\tvar self = this;\n\t\tself.lastQuery = null;\n\n\t\tif (self.isSetup) {\n\t\t\tself.addItems(self.items);\n\t\t}\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Updates all state-dependent attributes\n\t * and CSS classes.\n\t */\n\trefreshState() {\n\t\tconst self     = this;\n\n\t\tself.refreshValidityState();\n\n\t\tconst isFull\t= self.isFull();\n\t\tconst isLocked\t= self.isLocked;\n\n\t\tself.wrapper.classList.toggle('rtl',self.rtl);\n\n\n\t\tconst wrap_classList = self.wrapper.classList;\n\n\t\twrap_classList.toggle('focus', self.isFocused)\n\t\twrap_classList.toggle('disabled', self.isDisabled)\n\t\twrap_classList.toggle('readonly', self.isReadOnly)\n\t\twrap_classList.toggle('required', self.isRequired)\n\t\twrap_classList.toggle('invalid', !self.isValid)\n\t\twrap_classList.toggle('locked', isLocked)\n\t\twrap_classList.toggle('full', isFull)\n\t\twrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden)\n\t\twrap_classList.toggle('dropdown-active', self.isOpen)\n\t\twrap_classList.toggle('has-options', isEmptyObject(self.options) )\n\t\twrap_classList.toggle('has-items', self.items.length > 0);\n\t}\n\n\t/**\n\t * Update the `required` attribute of both input and control input.\n\t *\n\t * The `required` property needs to be activated on the control input\n\t * for the error to be displayed at the right place. `required` also\n\t * needs to be temporarily deactivated on the input since the input is\n\t * hidden and can't show errors.\n\t */\n\trefreshValidityState() {\n\t\tvar self = this;\n\n\t\tif( !self.input.validity ){\n\t\t\treturn;\n\t\t}\n\n\t\tself.isValid = self.input.validity.valid;\n\t\tself.isInvalid = !self.isValid;\n\t}\n\n\t/**\n\t * Determines whether or not more items can be added\n\t * to the control without exceeding the user-defined maximum.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFull() {\n\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t}\n\n\t/**\n\t * Refreshes the original <select> or <input>\n\t * element to reflect the current state.\n\t *\n\t */\n\tupdateOriginalInput( opts:TomArgObject = {} ){\n\t\tconst self = this;\n\t\tvar option, label;\n\n\t\tconst empty_option = self.input.querySelector('option[value=\"\"]') as HTMLOptionElement;\n\n\t\tif( self.is_select_tag ){\n\n\t\t\tconst selected:HTMLOptionElement[]\t\t= [];\n\t\t\tconst has_selected:number\t\t\t\t= self.input.querySelectorAll('option:checked').length;\n\n\t\t\tfunction AddSelected(option_el:HTMLOptionElement|null, value:string, label:string):HTMLOptionElement{\n\n\t\t\t\tif( !option_el ){\n\t\t\t\t\toption_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>') as HTMLOptionElement;\n\t\t\t\t}\n\n\t\t\t\t// don't move empty option from top of list\n\t\t\t\t// fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\t\t\t\tif( option_el != empty_option ){\n\t\t\t\t\tself.input.append(option_el);\n\t\t\t\t}\n\n\t\t\t\tselected.push(option_el);\n\n\t\t\t\t// marking empty option as selected can break validation\n\t\t\t\t// fixes https://github.com/orchidjs/tom-select/issues/303\n\t\t\t\tif( option_el != empty_option || has_selected > 0 ){\n\t\t\t\t\toption_el.selected = true;\n\t\t\t\t}\n\n\t\t\t\treturn option_el;\n\t\t\t}\n\n\t\t\t// unselect all selected options\n\t\t\tself.input.querySelectorAll('option:checked').forEach((option_el:Element) => {\n\t\t\t\t(<HTMLOptionElement>option_el).selected = false;\n\t\t\t});\n\n\n\t\t\t// nothing selected?\n\t\t\tif( self.items.length == 0 && self.settings.mode == 'single' ){\n\n\t\t\t\tAddSelected(empty_option, \"\", \"\");\n\n\t\t\t// order selected <option> tags for values in self.items\n\t\t\t}else{\n\n\t\t\t\tself.items.forEach((value)=>{\n\t\t\t\t\toption\t\t\t= self.options[value]!;\n\t\t\t\t\tlabel\t\t\t= option[self.settings.labelField] || '';\n\n\t\t\t\t\tif( selected.includes(option.$option) ){\n\t\t\t\t\t\tconst reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`) as HTMLOptionElement;\n\t\t\t\t\t\tAddSelected(reuse_opt, value, label);\n\t\t\t\t\t}else{\n\t\t\t\t\t\toption.$option\t= AddSelected(option.$option, value, label);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tself.input.value = self.getValue() as string;\n\t\t}\n\n\t\tif (self.isSetup) {\n\t\t\tif (!opts.silent) {\n\t\t\t\tself.trigger('change', self.getValue() );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shows the autocomplete dropdown containing\n\t * the available options.\n\t */\n\topen() {\n\t\tvar self = this;\n\n\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\tself.isOpen = true;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'true'});\n\t\tself.refreshState();\n\t\tapplyCSS(self.dropdown,{visibility: 'hidden', display: 'block'});\n\t\tself.positionDropdown();\n\t\tapplyCSS(self.dropdown,{visibility: 'visible', display: 'block'});\n\t\tself.focus();\n\t\tself.trigger('dropdown_open', self.dropdown);\n\t}\n\n\t/**\n\t * Closes the autocomplete dropdown menu.\n\t */\n\tclose(setTextboxValue=true) {\n\t\tvar self = this;\n\t\tvar trigger = self.isOpen;\n\n\t\tif( setTextboxValue ){\n\n\t\t\t// before blur() to prevent form onchange event\n\t\t\tself.setTextboxValue();\n\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.inputState();\n\t\t\t}\n\t\t}\n\n\t\tself.isOpen = false;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'false'});\n\t\tapplyCSS(self.dropdown,{display: 'none'});\n\t\tif( self.settings.hideSelected ){\n\t\t\tself.clearActiveOption();\n\t\t}\n\t\tself.refreshState();\n\n\t\tif (trigger) self.trigger('dropdown_close', self.dropdown);\n\t}\n\n\t/**\n\t * Calculates and applies the appropriate\n\t * position of the dropdown if dropdownParent = 'body'.\n\t * Otherwise, position is determined by css\n\t */\n\tpositionDropdown(){\n\n\t\tif( this.settings.dropdownParent !== 'body' ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar context\t\t\t= this.control;\n\t\tvar rect\t\t\t= context.getBoundingClientRect();\n\t\tvar top\t\t\t\t= context.offsetHeight + rect.top  + window.scrollY;\n\t\tvar left\t\t\t= rect.left + window.scrollX;\n\n\n\t\tapplyCSS(this.dropdown,{\n\t\t\twidth : rect.width + 'px',\n\t\t\ttop   : top + 'px',\n\t\t\tleft  : left + 'px'\n\t\t});\n\n\t}\n\n\t/**\n\t * Resets / clears all selected items\n\t * from the control.\n\t *\n\t */\n\tclear(silent?:boolean) {\n\t\tvar self = this;\n\n\t\tif (!self.items.length) return;\n\n\t\tvar items = self.controlChildren();\n\t\titerate(items,(item:TomItem)=>{\n\t\t\tself.removeItem(item,true);\n\t\t});\n\n\t\tself.inputState();\n\t\tif( !silent ) self.updateOriginalInput();\n\t\tself.trigger('clear');\n\t}\n\n\t/**\n\t * A helper method for inserting an element\n\t * at the current caret position.\n\t *\n\t */\n\tinsertAtCaret(el:HTMLElement) {\n\t\tconst self\t\t= this;\n\t\tconst caret\t\t= self.caretPos;\n\t\tconst target\t= self.control;\n\n\t\ttarget.insertBefore(el, target.children[caret] || null);\n\t\tself.setCaret(caret + 1);\n\t}\n\n\t/**\n\t * Removes the current selected item(s).\n\t *\n\t */\n\tdeleteSelection(e:KeyboardEvent):boolean {\n\t\tvar direction, selection, caret, tail;\n\t\tvar self = this;\n\n\t\tdirection = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n\t\tselection = getSelection(self.control_input);\n\n\n\t\t// determine items that will be removed\n\t\tconst rm_items:TomItem[]\t= [];\n\n\t\tif (self.activeItems.length) {\n\n\t\t\ttail = getTail(self.activeItems, direction);\n\t\t\tcaret = nodeIndex(tail);\n\n\t\t\tif (direction > 0) { caret++; }\n\n\t\t\titerate(self.activeItems, (item:TomItem) => rm_items.push(item) );\n\n\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\tconst items = self.controlChildren();\n\t\t\tlet rm_item;\n\t\t\tif( direction < 0 && selection.start === 0 && selection.length === 0 ){\n\t\t\t\trm_item = items[self.caretPos - 1];\n\n\t\t\t}else if( direction > 0 && selection.start === self.inputValue().length ){\n\t\t\t\trm_item = items[self.caretPos];\n\t\t\t}\n\n\t\t\tif( rm_item !== undefined ){\n\t\t\t\trm_items.push( rm_item );\n\t\t\t}\n\t\t}\n\n\t\tif( !self.shouldDelete(rm_items,e) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tpreventDefault(e,true);\n\n\t\t// perform removal\n\t\tif (typeof caret !== 'undefined') {\n\t\t\tself.setCaret(caret);\n\t\t}\n\n\t\twhile( rm_items.length ){\n\t\t\tself.removeItem(rm_items.pop());\n\t\t}\n\n\t\tself.inputState();\n\t\tself.positionDropdown();\n\t\tself.refreshOptions(false);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if the items should be deleted\n\t */\n\tshouldDelete(items:TomItem[],evt:MouseEvent|KeyboardEvent){\n\n\t\tconst values = items.map(item => item.dataset.value);\n\n\t\t// allow the callback to abort\n\t\tif( !values.length || (typeof this.settings.onDelete === 'function' && this.settings.onDelete.call(this,values,evt) === false) ){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Selects the previous / next item (depending on the `direction` argument).\n\t *\n\t * > 0 - right\n\t * < 0 - left\n\t *\n\t */\n\tadvanceSelection(direction:number, e?:MouseEvent|KeyboardEvent) {\n\t\tvar last_active, adjacent, self = this;\n\n\t\tif (self.rtl) direction *= -1;\n\t\tif( self.inputValue().length ) return;\n\n\n\t\t// add or remove to active items\n\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) || isKeyDown('shiftKey',e) ){\n\n\t\t\tlast_active\t\t\t= self.getLastActive(direction);\n\t\t\tif( last_active ){\n\n\t\t\t\tif( !last_active.classList.contains('active') ){\n\t\t\t\t\tadjacent\t\t\t= last_active;\n\t\t\t\t}else{\n\t\t\t\t\tadjacent\t\t\t= self.getAdjacent(last_active,direction,'item');\n\t\t\t\t}\n\n\t\t\t// if no active item, get items adjacent to the control input\n\t\t\t}else if( direction > 0 ){\n\t\t\t\tadjacent\t\t\t= self.control_input.nextElementSibling;\n\t\t\t}else{\n\t\t\t\tadjacent\t\t\t= self.control_input.previousElementSibling;\n\t\t\t}\n\n\n\t\t\tif( adjacent ){\n\t\t\t\tif( adjacent.classList.contains('active') ){\n\t\t\t\t\tself.removeActiveItem(last_active);\n\t\t\t\t}\n\t\t\t\tself.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n\t\t\t}\n\n\t\t// move caret to the left or right\n\t\t}else{\n\t\t\tself.moveCaret(direction);\n\t\t}\n\t}\n\n\tmoveCaret(direction:number){}\n\n\t/**\n\t * Get the last active item\n\t *\n\t */\n\tgetLastActive(direction?:number){\n\n\t\tlet last_active = this.control.querySelector('.last-active');\n\t\tif( last_active ){\n\t\t\treturn last_active;\n\t\t}\n\n\n\t\tvar result = this.control.querySelectorAll('.active');\n\t\tif( result ){\n\t\t\treturn getTail(result,direction);\n\t\t}\n\t}\n\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tsetCaret(new_pos:number) {\n\t\tthis.caretPos = this.items.length;\n\t}\n\n\t/**\n\t * Return list of item dom elements\n\t *\n\t */\n\tcontrolChildren():TomItem[]{\n\t\treturn Array.from( this.control.querySelectorAll('[data-ts-item]') ) as TomItem[];\n\t}\n\n\t/**\n\t * Disables user input on the control. Used while\n\t * items are being asynchronously created.\n\t */\n\tlock() {\n\t\tthis.setLocked(true);\n\t}\n\n\t/**\n\t * Re-enables user input on the control.\n\t */\n\tunlock() {\n\t\tthis.setLocked(false);\n\t}\n\n\t/**\n\t * Disable or enable user input on the control\n\t */\n\tsetLocked( lock:boolean = this.isReadOnly || this.isDisabled ){\n\t\tthis.isLocked = lock;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Disables user input on the control completely.\n\t * While disabled, it cannot receive focus.\n\t */\n\tdisable() {\n\t\tthis.setDisabled(true);\n\t\tthis.close();\n\t}\n\n\t/**\n\t * Enables the control so that it can respond\n\t * to focus and user input.\n\t */\n\tenable() {\n\t\tthis.setDisabled(false);\n\t}\n\n\tsetDisabled(disabled:boolean){\n\t\tthis.focus_node.tabIndex\t\t= disabled ? -1 : this.tabIndex;\n\t\tthis.isDisabled\t\t\t\t\t= disabled;\n\t\tthis.input.disabled\t\t\t\t= disabled;\n\t\tthis.control_input.disabled\t\t= disabled;\n\t\tthis.setLocked();\n\t}\n\n\tsetReadOnly(isReadOnly:boolean){\n\t\tthis.isReadOnly\t\t\t\t\t= isReadOnly;\n\t\tthis.input.readOnly\t\t\t\t= isReadOnly;\n\t\tthis.control_input.readOnly\t\t= isReadOnly;\n\t\tthis.setLocked();\n\t}\n\n\t/**\n\t * Completely destroys the control and\n\t * unbinds all event listeners so that it can\n\t * be garbage collected.\n\t */\n\tdestroy() {\n\t\tvar self = this;\n\t\tvar revertSettings = self.revertSettings;\n\n\t\tself.trigger('destroy');\n\t\tself.off();\n\t\tself.wrapper.remove();\n\t\tself.dropdown.remove();\n\n\t\tself.input.innerHTML = revertSettings.innerHTML;\n\t\tself.input.tabIndex = revertSettings.tabIndex;\n\n\t\tremoveClasses(self.input,'tomselected','ts-hidden-accessible');\n\n\t\tself._destroy();\n\n\t\tdelete self.input.tomselect;\n\t}\n\n\t/**\n\t * A helper method for rendering \"item\" and\n\t * \"option\" templates, given the data.\n\t *\n\t */\n\trender( templateName:TomTemplateNames, data?:any ):null|HTMLElement{\n\t\tvar id, html;\n\t\tconst self = this;\n\n\t\tif( typeof this.settings.render[templateName] !== 'function' ){\n\t\t\treturn null;\n\t\t}\n\n\t\t// render markup\n\t\thtml = self.settings.render[templateName].call(this, data, escape_html);\n\n\t\tif( !html ){\n\t\t\treturn null;\n\t\t}\n\n\t\thtml = getDom( html );\n\n\t\t// add mandatory attributes\n\t\tif (templateName === 'option' || templateName === 'option_create') {\n\n\t\t\tif( data[self.settings.disabledField] ){\n\t\t\t\tsetAttr(html,{'aria-disabled':'true'});\n\t\t\t}else{\n\t\t\t\tsetAttr(html,{'data-selectable': ''});\n\t\t\t}\n\n\t\t}else if (templateName === 'optgroup') {\n\t\t\tid = data.group[self.settings.optgroupValueField];\n\t\t\tsetAttr(html,{'data-group': id});\n\t\t\tif(data.group[self.settings.disabledField]) {\n\t\t\t\tsetAttr(html,{'data-disabled': ''});\n\t\t\t}\n\t\t}\n\n\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\tconst value\t= get_hash(data[self.settings.valueField]);\n\t\t\tsetAttr(html,{'data-value': value });\n\n\n\t\t\t// make sure we have some classes if a template is overwritten\n\t\t\tif( templateName === 'item' ){\n\t\t\t\taddClasses(html,self.settings.itemClass);\n\t\t\t\tsetAttr(html,{'data-ts-item':''});\n\t\t\t}else{\n\t\t\t\taddClasses(html,self.settings.optionClass);\n\t\t\t\tsetAttr(html,{\n\t\t\t\t\trole:'option',\n\t\t\t\t\tid:data.$id\n\t\t\t\t});\n\n\t\t\t\t// update cache\n\t\t\t\tdata.$div = html;\n\t\t\t\tself.options[value] = data;\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn html;\n\n\t}\n\n\n\t/**\n\t * Type guarded rendering\n\t *\n\t */\n\t_render( templateName:TomTemplateNames, data?:any ):HTMLElement{\n\t\tconst html = this.render(templateName, data);\n\n\t\tif( html == null ){\n\t\t\tthrow 'HTMLElement expected';\n\t\t}\n\t\treturn html;\n\t}\n\n\n\t/**\n\t * Clears the render cache for a template. If\n\t * no template is given, clears all render\n\t * caches.\n\t *\n\t */\n\tclearCache():void{\n\n\t\titerate(this.options, (option:TomOption)=>{\n\t\t\tif( option.$div ){\n\t\t\t\toption.$div.remove();\n\t\t\t\tdelete option.$div;\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Removes a value from item and option caches\n\t *\n\t */\n\tuncacheValue(value:string){\n\n\t\tconst option_el\t\t\t= this.getOption(value);\n\t\tif( option_el ) option_el.remove();\n\n\t}\n\n\t/**\n\t * Determines whether or not to display the\n\t * create item prompt, given a user input.\n\t *\n\t */\n\tcanCreate( input:string ):boolean {\n\t\treturn this.settings.create && (input.length > 0) && (this.settings.createFilter as TomCreateFilter ).call(this, input);\n\t}\n\n\n\t/**\n\t * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n\t *\n\t * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n\t *\n\t * });\n\t */\n\thook( when:string, method:string, new_fn:any ){\n\t\tvar self = this;\n\t\tvar orig_method = self[method];\n\n\n\t\tself[method] = function(){\n\t\t\tvar result, result_new;\n\n\t\t\tif( when === 'after' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\tresult_new = new_fn.apply(self, arguments );\n\n\t\t\tif( when === 'instead' ){\n\t\t\t\treturn result_new;\n\t\t\t}\n\n\t\t\tif( when === 'before' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t}\n\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { addEvent } from '../../utils.ts';\n\nexport default function(this:TomSelect) {\n\taddEvent(this.input,'change',()=>{\n\t\tthis.sync();\n\t});\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"checkbox_options\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { TomTemplate } from '../../types/index.ts';\nimport { preventDefault, hash_key } from '../../utils.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { CBOptions } from './types.ts';\n\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tvar self = this;\n\tvar orig_onOptionSelect = self.onOptionSelect;\n\n\tself.settings.hideSelected = false;\n\n\tconst cbOptions : CBOptions = Object.assign({\n\t\t// so that the user may add different ones as well\n\t\tclassName             : \"tomselect-checkbox\",\n\n\t\t// the following default to the historic plugin's values\n\t\tcheckedClassNames     : undefined,\n\t\tuncheckedClassNames   : undefined,\n\t}, userOptions);\n\n\n\tvar UpdateChecked = function(checkbox:HTMLInputElement, toCheck : boolean) {\n\t\tif( toCheck ){\n\t\t\tcheckbox.checked = true;\n\t\t\tif (cbOptions.uncheckedClassNames) {\n\t\t\t\tcheckbox.classList.remove(...cbOptions.uncheckedClassNames);\n\t\t\t}\n\t\t\tif (cbOptions.checkedClassNames) {\n\t\t\t\tcheckbox.classList.add(...cbOptions.checkedClassNames);\n\t\t\t}\n\t\t}else{\n\t\t\tcheckbox.checked = false;\n\t\t\tif (cbOptions.checkedClassNames) {\n\t\t\t\tcheckbox.classList.remove(...cbOptions.checkedClassNames);\n\t\t\t}\n\t\t\tif (cbOptions.uncheckedClassNames) {\n\t\t\t\tcheckbox.classList.add(...cbOptions.uncheckedClassNames);\n\t\t\t}\n\t\t}\n\t}\n\n\t// update the checkbox for an option\n\tvar UpdateCheckbox = function(option:HTMLElement){\n\t\tsetTimeout(()=>{\n\t\t\tvar checkbox = option.querySelector('input.' + cbOptions.className);\n\t\t\tif( checkbox instanceof HTMLInputElement ){\n\t\t\t\tUpdateChecked(checkbox, option.classList.contains('selected'));\n\t\t\t}\n\t\t},1);\n\t};\n\n\t// add checkbox to option template\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_option = self.settings.render.option;\n\n\t\tself.settings.render.option = ((data, escape_html) => {\n\t\t\tvar rendered = getDom(orig_render_option.call(self, data, escape_html));\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tif (cbOptions.className) {\n\t\t\t\tcheckbox.classList.add(cbOptions.className);\n\t\t\t}\n\t\t\tcheckbox.addEventListener('click',function(evt){\n\t\t\t\tpreventDefault(evt);\n\t\t\t});\n\n\t\t\tcheckbox.type = 'checkbox';\n\t\t\tconst hashed = hash_key(data[self.settings.valueField]);\n\n\t\t\tUpdateChecked(checkbox, !!(hashed && self.items.indexOf(hashed) > -1) );\n\n\t\t\trendered.prepend(checkbox);\n\t\t\treturn rendered;\n\t\t}) satisfies TomTemplate;\n\t});\n\n\t// uncheck when item removed\n\tself.on('item_remove',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\toption.classList.remove('selected'); // selected class won't be removed yet\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\t// check when item added\n\tself.on('item_add',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\n\t// remove items when selected option is clicked\n\tself.hook('instead','onOptionSelect',( evt:KeyboardEvent, option:HTMLElement )=>{\n\n\t\tif( option.classList.contains('selected') ){\n\t\t\toption.classList.remove('selected')\n\t\t\tself.removeItem(option.dataset.value);\n\t\t\tself.refreshOptions();\n\t\t\tpreventDefault(evt,true);\n\t\t\treturn;\n        }\n\n\t\torig_onOptionSelect.call(self, evt, option);\n\n\t\tUpdateCheckbox(option);\n\t});\n\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { CBOptions } from './types.ts';\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\tclassName: 'clear-button',\n\t\ttitle: 'Clear All',\n\t\trole: 'button',\n\t\ttabindex: 0,\n\t\thtml: (data:CBOptions) => {\n\n\t\treturn `<div class=\"${data.className}\" title=\"${data.title}\" role=\"${data.role}\" tabindex=\"${data.tabindex}\">&times;</div>`;\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar button = getDom(options.html(options));\n\t\tbutton.addEventListener('click',(evt)=>{\n\n\t\t\tif( self.isLocked ) return;\n\n\t\t\tself.clear();\n\n\t\t\tif( self.settings.mode === 'single' && self.settings.allowEmptyOption ){\n\t\t\t\tself.addItem('');\n\t\t\t}\n\t\t\t\n\t\t\tself.refreshOptions(false);\n\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t});\n\t\tself.control.appendChild(button);\n\t});\n\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { TomOption, TomItem } from '../../types/index.ts';\nimport { escape_html, preventDefault, addEvent } from '../../utils.ts';\nimport { getDom, setAttr } from '../../vanilla.ts';\n\n\nconst insertAfter = (referenceNode:Element, newNode:Element) => {\n\treferenceNode.parentNode?.insertBefore(newNode, referenceNode.nextSibling);\n}\n\nconst insertBefore = (referenceNode:Element, newNode:Element) => {\n\treferenceNode.parentNode?.insertBefore(newNode, referenceNode);\n}\n\nconst isBefore = (referenceNode:Element|undefined|null, newNode:Element|undefined|null) =>{\n\t\n\tdo{\n\t\tnewNode = newNode?.previousElementSibling;\n\n\t\tif( referenceNode == newNode ){\n\t\t\treturn true;\n\t\t}\n\n\t}while( newNode && newNode.previousElementSibling );\n\n\treturn false;\n}\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tif (self.settings.mode !== 'multi') return;\n\n\tvar orig_lock\t\t= self.lock;\n\tvar orig_unlock\t\t= self.unlock;\n\tlet sortable = true;\n\t\tlet drag_item:TomItem|undefined;\n\n\n\t/**\n\t * Add draggable attribute to item\n\t */\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\t\t\tconst item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\t\t\tsetAttr(item,{'draggable':'true'});\n\n\n\t\t\t// prevent doc_mousedown (see tom-select.ts)\n\t\t\tconst mousedown = (evt:Event) => {\n\t\t\t\tif( !sortable ) preventDefault(evt);\n\t\t\t\tevt.stopPropagation();\n\t\t\t}\n\n\t\t\tconst dragStart = (evt:Event) => {\n\t\t\t\tdrag_item = item;\n\t\t\t\t\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\titem.classList.add('ts-dragging');\n\t\t\t\t}, 0);\n\t\t\t\t\n\t\t\t}\n\n\t\t\tconst dragOver = (evt:Event) =>{\n\t\t\t\tevt.preventDefault();\n\t\t\t\titem.classList.add('ts-drag-over');\n\t\t\t\tmoveitem(item,drag_item);\n\t\t\t}\n\n\t\t\tconst dragLeave = () => {\n\t\t\t\titem.classList.remove('ts-drag-over');\n\t\t\t}\n\n\t\t\tconst moveitem = (targetitem:TomItem, dragitem:TomItem|undefined) => {\n\t\t\t\tif( dragitem === undefined ) return;\n\t\t\t\t\n\t\t\t\tif( isBefore(dragitem,item) ){\n\t\t\t\t\tinsertAfter(targetitem,dragitem);\n\t\t\t\t}else{\n\t\t\t\t\tinsertBefore(targetitem,dragitem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst dragend = () => {\n\t\t\t\tdocument.querySelectorAll('.ts-drag-over').forEach(el=> el.classList.remove('ts-drag-over'));\n\t\t\t\tdrag_item?.classList.remove('ts-dragging');\n\t\t\t\tdrag_item = undefined;\n\n\t\t\t\tvar values:string[] = [];\n\t\t\t\tself.control.querySelectorAll(`[data-value]`).forEach((el:Element)=> {\n\t\t\t\t\tif( (<HTMLOptionElement>el).dataset.value ){\n\t\t\t\t\t\tlet value = (<HTMLOptionElement>el).dataset.value;\n\t\t\t\t\t\tif( value ){\n\t\t\t\t\t\t\tvalues.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tself.setValue(values);\n\t\t\t}\t\n\n\n\t\t\taddEvent(item,'mousedown', mousedown);\n\t\t\taddEvent(item,'dragstart', dragStart);\n\t\t\taddEvent(item,'dragenter', dragOver)\n\t\t\taddEvent(item,'dragover', dragOver);\n\t\t\taddEvent(item,'dragleave', dragLeave);\n\t\t\taddEvent(item,'dragend', dragend);\n\t\t\t\t\n\t\t\treturn item;\n\t\t}\t\n\t});\n\n\n\n\tself.hook('instead','lock',()=>{\n\t\tsortable = false;\n\t\treturn orig_lock.call(self);\n\t});\n\n\tself.hook('instead','unlock',()=>{\n\t\tsortable = true;\n\t\treturn orig_unlock.call(self);\n\t});\n\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { preventDefault } from '../../utils.ts';\nimport { DHOptions } from './types.ts';\n\nexport default function(this:TomSelect, userOptions:DHOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttitle         : 'Untitled',\n\t\theaderClass   : 'dropdown-header',\n\t\ttitleRowClass : 'dropdown-header-title',\n\t\tlabelClass    : 'dropdown-header-label',\n\t\tcloseClass    : 'dropdown-header-close',\n\n\t\thtml: (data:DHOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t'<a class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar header = getDom(options.html(options));\n\n\t\tvar close_link = header.querySelector('.'+options.closeClass);\n\t\tif( close_link ){\n\t\t\tclose_link.addEventListener('click',(evt)=>{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\tself.close();\n\t\t\t});\n\t\t}\n\n\t\tself.dropdown.insertBefore(header, self.dropdown.firstChild);\n\t});\n\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { nodeIndex, removeClasses } from '../../vanilla.ts';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n", "export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC      \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport * as constants from '../../constants.ts';\nimport { getDom, addClasses } from '../../vanilla.ts';\nimport { addEvent, preventDefault } from '../../utils.ts';\n\n\nexport default function(this:TomSelect) {\n\tconst self = this;\n\n\tself.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n\tself.hook('before','setup',()=>{\n\t\tself.focus_node\t\t= self.control;\n\n\t\taddClasses( self.control_input, 'dropdown-input');\n\n\t \tconst div = getDom('<div class=\"dropdown-input-wrap\">');\n\t\tdiv.append(self.control_input);\n\t\tself.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n\t\t// set a placeholder in the select control\n\t\tconst placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />') as HTMLInputElement;\n\t\tplaceholder.placeholder = self.settings.placeholder ||'';\n\t\tself.control.append(placeholder);\n\t\t/**\n\t\t * TomSelect renders a custom control with a focusable <input class=\"items-placeholder\">.\n\t\t * The source <select>'s aria-label is not automatically propagated to that input,\n\t\t * which triggers \"Missing form label\" accessibility warnings.\n\t\t * This helper copies the label from the <select> onto the generated input.\n\t\t */\n\t\tconst label = self.input?.getAttribute('aria-label');\n\t\tif (!label) return;\n\t\tplaceholder.setAttribute('aria-label', label);\n\t});\n\n\tself.on('initialize',()=>{\n\t\t// set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n\t\tself.control_input.addEventListener('keydown',(evt:KeyboardEvent) =>{\n\t\t//addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n\t\t\tswitch( evt.keyCode ){\n\t\t\t\tcase constants.KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\tpreventDefault(evt,true);\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\t\t\t\tcase constants.KEY_TAB:\n\t\t\t\t\tself.focus_node.tabIndex = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn self.onKeyDown.call(self,evt);\n\t\t});\n\n\t\tself.on('blur',()=>{\n\t\t\tself.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n\t\t});\n\n\n\t\t// give the control_input focus when the dropdown is open\n\t\tself.on('dropdown_open',() =>{\n\t\t\tself.control_input.focus();\n\t\t});\n\n\t\t// prevent onBlur from closing when focus is on the control_input\n\t\tconst orig_onBlur = self.onBlur;\n\t\tself.hook('instead','onBlur',(evt?:FocusEvent)=>{\n\t\t\tif( evt && evt.relatedTarget == self.control_input ) return;\n\t\t\treturn orig_onBlur.call(self);\n\t\t});\n\n\t\taddEvent(self.control_input,'blur', () => self.onBlur() );\n\n\t\t// return focus to control to allow further keyboard input\n\t\tself.hook('before','close',() =>{\n\n\t\t\tif( !self.isOpen ) return;\n\t\t\tself.focus_node.focus({preventScroll: true});\n\t\t});\n\n\t});\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { addEvent } from '../../utils.ts';\n\nexport default function(this:TomSelect) {\n\tvar self\t\t\t\t\t= this;\n\n\tself.on('initialize',()=>{\n\n\n\t\tvar test_input\t\t\t\t= document.createElement('span');\n\t\tvar control\t\t\t\t\t= self.control_input;\n\t\ttest_input.style.cssText\t= 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n\n\t\tself.wrapper.appendChild(test_input);\n\n\n\t\tvar transfer_styles\t\t\t= [ 'letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform' ];\n\n\t\tfor( const style_name of transfer_styles ){\n\t\t\t// @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n\t\t\ttest_input.style[style_name] = control.style[style_name];\n\t\t}\n\n\n\t\t/**\n\t\t * Set the control width\n\t\t *\n\t\t */\n\t\tvar resize = ()=>{\n\t\t\ttest_input.textContent\t= control.value;\n\t\t\tcontrol.style.width\t\t= test_input.clientWidth+'px';\n\t\t};\n\n\t\tresize();\n\t\tself.on('update item_add item_remove',resize);\n\t\taddEvent(control,'input', resize );\n\t\taddEvent(control,'keyup', resize );\n\t\taddEvent(control,'blur', resize );\n\t\taddEvent(control,'update', resize );\n\t});\n\n};\n", "/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_deleteSelection = self.deleteSelection;\n\n\tthis.hook('instead','deleteSelection',(evt:KeyboardEvent) => {\n\n\t\tif( self.activeItems.length ){\n\t\t\treturn orig_deleteSelection.call(self, evt);\n\t\t}\n\n\t\treturn false;\n\t});\n\n};\n", "/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\n\nexport default function(this:TomSelect) {\n\tthis.hook('instead','setActiveItem',() => {});\n\tthis.hook('instead','selectAll',() => {});\n};\n", "export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC      \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport * as constants from '../../constants.ts';\nimport { parentMatch, nodeIndex } from '../../vanilla.ts';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\tvar orig_keydown = self.onKeyDown;\n\n\tself.hook('instead','onKeyDown',(evt:KeyboardEvent)=>{\n\t\tvar index, option, options, optgroup;\n\n\t\tif( !self.isOpen || !(evt.keyCode === constants.KEY_LEFT || evt.keyCode === constants.KEY_RIGHT)) {\n\t\t\treturn orig_keydown.call(self,evt);\n\t\t}\n\n\t\tself.ignoreHover\t= true;\n\t\toptgroup\t\t\t= parentMatch(self.activeOption,'[data-group]');\n\t\tindex\t\t\t\t= nodeIndex(self.activeOption,'[data-selectable]');\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( evt.keyCode === constants.KEY_LEFT ){\n\t\t\toptgroup = optgroup.previousSibling;\n\t\t} else {\n\t\t\toptgroup = optgroup.nextSibling;\n\t\t}\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\toptions\t\t\t\t= (<HTMLOptGroupElement>optgroup).querySelectorAll('[data-selectable]');\n\t\toption\t\t\t\t= options[ Math.min(options.length - 1, index) ] as HTMLElement;\n\n\t\tif( option ){\n\t\t\tself.setActiveOption(option);\n\t\t}\n\n\t});\n\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { getDom } from '../../vanilla.ts';\nimport { escape_html, preventDefault, addEvent } from '../../utils.ts';\nimport { TomOption, TomItem } from '../../types/index.ts';\nimport { RBOptions } from './types.ts';\n\nexport default function(this:TomSelect, userOptions:RBOptions) {\n\n\tconst options = Object.assign({\n\t\t\tlabel     : '&times;',\n\t\t\ttitle     : 'Remove',\n\t\t\tclassName : 'remove',\n\t\t\tappend    : true\n\t\t}, userOptions);\n\n\n\t//options.className = 'remove-single';\n\tvar self\t\t\t= this;\n\n\t// override the render method to add remove button to each item\n\tif( !options.append ){\n\t\treturn;\n\t}\n\n\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\n\t\t\tvar item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\n\t\t\tvar close_button = getDom(html);\n\t\t\titem.appendChild(close_button);\n\n\t\t\taddEvent(close_button,'mousedown',(evt) => {\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t});\n\n\t\t\taddEvent(close_button,'click',(evt) => {\n\n\t\t\t\tif( self.isLocked ) return;\n\n\t\t\t\t// propagating will trigger the dropdown to show for single mode\n\t\t\t\tpreventDefault(evt,true);\n\n\t\t\t\tif( self.isLocked ) return;\n\t\t\t\tif( !self.shouldDelete([item],evt as MouseEvent) ) return;\n\n\t\t\t\tself.removeItem(item);\n\t\t\t\tself.refreshOptions(false);\n\t\t\t\tself.inputState();\n\t\t\t});\n\n\t\t\treturn item;\n\t\t};\n\n\t});\n\n\n};\n", "/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nimport type TomSelect from '../../tom-select.ts';\nimport { TomOption } from '../../types/index.ts';\n\ntype TPluginOptions = {\n\ttext?:(option:TomOption)=>string,\n};\n\nexport default function(this:TomSelect, userOptions:TPluginOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttext: (option:TomOption) => {\n\t\t\treturn option[self.settings.labelField];\n\t\t}\n\t},userOptions);\n\n\tself.on('item_remove',function(value:string){\n\t\tif( !self.isFocused ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.control_input.value.trim() === '' ){\n\t\t\tvar option = self.options[value];\n\t\t\tif( option ){\n\t\t\t\tself.setTextboxValue(options.text.call(self, option));\n\t\t\t}\n\t\t}\n\t});\n\n};\n", "\nimport type TomSelect from './tom-select.ts';\nimport { TomLoadCallback } from './types/index.ts';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport type TomSelect from '../../tom-select.ts';\nimport { TomOption } from '../../types/index.ts';\nimport { addClasses } from '../../vanilla.ts';\n\nexport default function(this:TomSelect) {\n\tconst self\t\t\t\t\t\t\t= this;\n\tconst orig_canLoad\t\t\t\t\t= self.canLoad;\n\tconst orig_clearActiveOption\t\t= self.clearActiveOption;\n\tconst orig_loadCallback\t\t\t\t= self.loadCallback;\n\n\tvar pagination:{[key:string]:any}\t= {};\n\tvar dropdown_content:HTMLElement;\n\tvar loading_more\t\t\t\t\t= false;\n\tvar load_more_opt:HTMLElement;\n\tvar default_values: string[]\t\t= [];\n\n\tif( !self.settings.shouldLoadMore ){\n\n\t\t// return true if additional results should be loaded\n\t\tself.settings.shouldLoadMore = ():boolean=>{\n\n\t\t\tconst scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\t\t\tif( scroll_percent > 0.9 ){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif( self.activeOption ){\n\t\t\t\tvar selectable\t= self.selectable();\n\t\t\t\tvar index\t\t= Array.from(selectable).indexOf(self.activeOption);\n\t\t\t\tif( index >= (selectable.length-2) ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\tif( !self.settings.firstUrl ){\n\t\tthrow 'virtual_scroll plugin requires a firstUrl() method';\n\t}\n\n\n\t// in order for virtual scrolling to work,\n\t// options need to be ordered the same way they're returned from the remote data source\n\tself.settings.sortField\t\t\t= [{field:'$order'},{field:'$score'}];\n\n\n\t// can we load more results for given query?\n\tconst canLoadMore = (query:string):boolean => {\n\n\t\tif( typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions ){\n\t\t\treturn false;\n\t\t}\n\n\t\tif( (query in pagination) && pagination[query] ){\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tconst clearFilter = (option:TomOption, value:string):boolean => {\n\t\tif( self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\n\t// set the next url that will be\n\tself.setNextUrl = (value:string,next_url:any):void => {\n\t\tpagination[value] = next_url;\n\t};\n\n\t// getUrl() to be used in settings.load()\n\tself.getUrl = (query:string):any =>{\n\n\t\tif( query in pagination ){\n\t\t\tconst next_url = pagination[query];\n\t\t\tpagination[query] = false;\n\t\t\treturn next_url;\n\t\t}\n\n\t\t// if the user goes back to a previous query\n\t\t// we need to load the first page again\n\t\tself.clearPagination();\n\n\t\treturn self.settings.firstUrl.call(self,query);\n\t};\n\n\t// clear pagination\n\tself.clearPagination = ():void =>{\n\t\tpagination = {};\n\t};\n\n\t// don't clear the active option (and cause unwanted dropdown scroll)\n\t// while loading more results\n\tself.hook('instead','clearActiveOption',()=>{\n\n\t\tif( loading_more ){\n\t\t\treturn;\n\t\t}\n\n\t\treturn orig_clearActiveOption.call(self);\n\t});\n\n\t// override the canLoad method\n\tself.hook('instead','canLoad',(query:string)=>{\n\n\t\t// first time the query has been seen\n\t\tif( !(query in pagination) ){\n\t\t\treturn orig_canLoad.call(self,query);\n\t\t}\n\n\t\treturn canLoadMore(query);\n\t});\n\n\n\t// wrap the load\n\tself.hook('instead','loadCallback',( options:TomOption[], optgroups:TomOption[])=>{\n\n\t\tif( !loading_more ){\n\t\t\tself.clearOptions(clearFilter);\n\t\t}else if( load_more_opt ){\n\t\t\tconst first_option = options[0];\n\t\t\tif( first_option !== undefined ){\n\t\t\t\tload_more_opt.dataset.value\t\t= first_option[self.settings.valueField];\n\t\t\t}\n\t\t}\n\n\t\torig_loadCallback.call( self, options, optgroups);\n\n\t\tloading_more = false;\n\t});\n\n\n\t// add templates to dropdown\n\t//\tloading_more if we have another url in the queue\n\t//\tno_more_results if we don't have another url in the queue\n\tself.hook('after','refreshOptions',()=>{\n\n\t\tconst query\t\t= self.lastValue;\n\t\tvar option;\n\n\t\tif( canLoadMore(query) ){\n\n\t\t\toption = self.render('loading_more',{query:query});\n\t\t\tif( option ){\n\t\t\t\toption.setAttribute('data-selectable',''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\t\t\t\tload_more_opt = option;\n\t\t\t}\n\n\t\t}else if( (query in pagination) && !dropdown_content.querySelector('.no-results') ){\n\t\t\toption = self.render('no_more_results',{query:query});\n\t\t}\n\n\t\tif( option ){\n\t\t\taddClasses(option,self.settings.optionClass);\n\t\t\tdropdown_content.append( option );\n\t\t}\n\n\t});\n\n\n\t// add scroll listener and default templates\n\tself.on('initialize',()=>{\n\t\tdefault_values = Object.keys(self.options);\n\t\tdropdown_content = self.dropdown_content;\n\n\t\t// default templates\n\t\tself.settings.render = Object.assign({}, {\n\t\t\tloading_more:() => {\n\t\t\t\treturn `<div class=\"loading-more-results\">Loading more results ... </div>`;\n\t\t\t},\n\t\t\tno_more_results:() =>{\n\t\t\t\treturn `<div class=\"no-more-results\">No more results</div>`;\n\t\t\t}\n\t\t},self.settings.render);\n\n\n\t\t// watch dropdown content scroll position\n\t\tdropdown_content.addEventListener('scroll',()=>{\n\n\t\t\tif( !self.settings.shouldLoadMore.call(self) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\t\t\tif( !canLoadMore(self.lastValue) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// don't call load() too much\n\t\t\tif( loading_more ) return;\n\n\n\t\t\tloading_more = true;\n\t\t\tself.load.call(self,self.lastValue);\n\t\t});\n\t});\n\n};\n", "import TomSelect from './tom-select.ts';\n\nimport change_listener from './plugins/change_listener/plugin.ts';\nimport checkbox_options from './plugins/checkbox_options/plugin.ts';\nimport clear_button from './plugins/clear_button/plugin.ts';\nimport drag_drop from './plugins/drag_drop/plugin.ts';\nimport dropdown_header from './plugins/dropdown_header/plugin.ts';\nimport caret_position from './plugins/caret_position/plugin.ts';\nimport dropdown_input from './plugins/dropdown_input/plugin.ts';\nimport input_autogrow from './plugins/input_autogrow/plugin.ts';\nimport no_backspace_delete from './plugins/no_backspace_delete/plugin.ts';\nimport no_active_items from './plugins/no_active_items/plugin.ts';\nimport optgroup_columns from './plugins/optgroup_columns/plugin.ts';\nimport remove_button from './plugins/remove_button/plugin.ts';\nimport restore_on_backspace from './plugins/restore_on_backspace/plugin.ts';\nimport virtual_scroll from './plugins/virtual_scroll/plugin.ts';\n\nTomSelect.define('change_listener', change_listener);\nTomSelect.define('checkbox_options', checkbox_options);\nTomSelect.define('clear_button', clear_button);\nTomSelect.define('drag_drop', drag_drop);\nTomSelect.define('dropdown_header', dropdown_header);\nTomSelect.define('caret_position', caret_position);\nTomSelect.define('dropdown_input', dropdown_input);\nTomSelect.define('input_autogrow', input_autogrow);\nTomSelect.define('no_backspace_delete', no_backspace_delete);\nTomSelect.define('no_active_items', no_active_items);\nTomSelect.define('optgroup_columns', optgroup_columns);\nTomSelect.define('remove_button', remove_button);\nTomSelect.define('restore_on_backspace', restore_on_backspace);\nTomSelect.define('virtual_scroll', virtual_scroll);\n\nexport default TomSelect;\n", "// django-tomselect - accessible \"remove_button\" plugin.\n//\n// Drop-in replacement for Tom Select's bundled `remove_button` plugin. The\n// bundled one renders `<a href=\"javascript:void(0)\" tabindex=\"-1\">`, which is\n// excluded from the tab order - keyboard users cannot remove a selected item\n// (only Backspace on the last one). This renders a real, tab-reachable\n// `<button type=\"button\">` (Enter/Space activate it natively) with an\n// item-specific `aria-label` so screen-reader users know what each button\n// removes.\n//\n// Registered under the same `remove_button` name in client/django-tomselect.js,\n// so every existing `plugin_remove_button=` config inherits the accessible\n// markup with no per-form change.\n//\n// Based on Tom Select's bundled remove_button plugin (Apache-2.0).\n\n/* eslint-disable camelcase */\n\n// Normalize the original render output (Tom Select item renderers may return\n// an HTML string or a DOM node) into a DOM element. Mirrors Tom Select's\n// internal getDom for the cases this plugin encounters.\nfunction getDom (query) {\n  if (query && query.jquery) return query[0]\n  if (query instanceof window.HTMLElement) return query\n  if (typeof query === 'string' && query.indexOf('<') > -1) {\n    const tpl = document.createElement('template')\n    tpl.innerHTML = query.trim()\n    return tpl.content.firstChild\n  }\n  return document.querySelector(query)\n}\n\n// Decode a decorative label (default '&times;') to its plain-text glyph\n// without injecting live HTML. The button's accessible name is the aria-label,\n// so the visible content only needs to be the rendered character - extracting\n// textContent via DOMParser keeps this XSS-safe.\nfunction decodeLabel (raw) {\n  return new window.DOMParser().parseFromString(String(raw), 'text/html').documentElement.textContent || ''\n}\n\nfunction preventDefault (evt, stop) {\n  if (evt) {\n    evt.preventDefault()\n    if (stop) evt.stopPropagation()\n  }\n}\n\nexport default function (userOptions) {\n  const options = Object.assign({\n    label: '&times;',\n    title: 'Remove',\n    className: 'remove',\n    append: true\n  }, userOptions)\n\n  const self = this\n\n  // Match the bundled plugin's opt-out: nothing to append, nothing to wrap.\n  if (!options.append) return\n\n  self.hook('after', 'setupTemplates', () => {\n    const orig_render_item = self.settings.render.item\n\n    self.settings.render.item = (data, escape) => {\n      const item = getDom(orig_render_item.call(self, data, escape))\n\n      // Name the button after the item it removes. Prefer the configured\n      // label field; fall back to the value field when no label is present.\n      const labelField = self.settings.labelField\n      const valueField = self.settings.valueField\n      let itemLabel = (data && labelField != null && data[labelField] != null)\n        ? data[labelField]\n        : (data && valueField != null ? data[valueField] : '')\n      itemLabel = (itemLabel == null) ? '' : String(itemLabel)\n\n      const close_button = document.createElement('button')\n      close_button.type = 'button'\n      close_button.className = options.className\n      if (options.title) close_button.title = options.title\n      close_button.setAttribute('aria-label', ('Remove ' + itemLabel).trim())\n      close_button.textContent = decodeLabel(options.label)\n      item.appendChild(close_button)\n\n      // Keep mousedown from stealing focus / blurring the control, matching\n      // the bundled plugin's behavior.\n      close_button.addEventListener('mousedown', (evt) => {\n        preventDefault(evt, true)\n      })\n\n      close_button.addEventListener('click', (evt) => {\n        if (self.isLocked) return\n        // Stop propagation so single-mode doesn't reopen the dropdown.\n        preventDefault(evt, true)\n        if (self.isLocked) return\n        if (!self.shouldDelete([item], evt)) return\n        self.removeItem(item)\n        self.refreshOptions(false)\n        self.inputState()\n        // removeItem() destroys the focused button without moving focus, so a\n        // keyboard user would be dropped onto <body>. Return focus to the\n        // control input (Tom Select's text entry) instead.\n        if (self.control_input && typeof self.control_input.focus === 'function') {\n          self.control_input.focus()\n        }\n      })\n\n      return item\n    }\n  })\n}\n", "/**\n * Plugin: \"dropdown_footer\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport { getDom } from 'tom-select/dist/esm/vanilla.js';\n\ntype DFOptions = {\n\ttitle\t    ?: string,\n\tfooterClass\t?: string,\n\thtml\t \t?: (data:DFOptions) => string,\n};\n\nexport default function(this:TomSelect, userOptions:DFOptions) {\n    const self = this;\n\n\tconst options = Object.assign({\n\t\ttitle         : 'Autocomplete Footer',\n\t\tfooterClass   : 'container-fluid mt-1 px-2 border-top dropdown-footer',\n\n\t\thtml: (data:DFOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div title=\"' + data.title + '\" class=\"' + data.footerClass + '\"></div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.hook('after', 'setup', () => {\n\t\tvar footer = getDom(options.html(options));\n\n        self.dropdown.appendChild(footer);\n\t});\n\n};\n", "// Token parser - pure JS mirror of the Python parser in\n// src/django_tomselect/_tokenize.py and query.py.\n// Drift between this and the Python implementation is caught in CI by running\n// the shared JSON corpus at tests/fixtures/parser_corpus.json against both.\n\n/* eslint-disable no-multi-spaces */\n\nexport const PARSE_ERRORS = {\n  UNKNOWN_OPERATOR: 'UNKNOWN_OPERATOR',\n  UNTERMINATED_QUOTE: 'UNTERMINATED_QUOTE',\n  MAX_RAW_LENGTH_EXCEEDED: 'MAX_RAW_LENGTH_EXCEEDED',\n  MAX_TOKENS_EXCEEDED: 'MAX_TOKENS_EXCEEDED',\n  MAX_VALUES_PER_OPERATOR_EXCEEDED: 'MAX_VALUES_PER_OPERATOR_EXCEEDED',\n  EMPTY_VALUE: 'EMPTY_VALUE'\n}\n\nconst OPERATOR_KEY_RE = /^([A-Za-z][A-Za-z0-9_]*):([\\s\\S]*)$/\n\nconst DEFAULT_CAPS = {\n  max_raw_length: 4096,\n  max_tokens: 32,\n  max_values_per_operator: 16\n}\n\n// ---------------------------------------------------------------------------\n// Tokenizer - returns [{text, was_quoted}, ...] or throws on unterminated quote.\n// ---------------------------------------------------------------------------\n\nexport function tokenize (raw, opts = {}) {\n  const maxBytes = opts.max_raw_length_bytes ?? DEFAULT_CAPS.max_raw_length\n  if (raw == null) return []\n\n  // Byte-length cap - utf-8 encoded.\n  const utf8Len = new TextEncoder().encode(raw).length\n  if (utf8Len > maxBytes) {\n    const e = new Error('Raw query exceeds maximum byte length (' + maxBytes + ').')\n    e.code = 'MAX_RAW_LENGTH'\n    throw e\n  }\n\n  const segments = []\n  let i = 0\n  const n = raw.length\n  let buf = []\n  let inQuote = null\n  let quotedSegment = false\n\n  function flush () {\n    if (buf.length || quotedSegment) {\n      segments.push({ text: buf.join(''), was_quoted: quotedSegment })\n      buf = []\n    }\n    quotedSegment = false\n  }\n\n  while (i < n) {\n    const ch = raw[i]\n    if (inQuote !== null) {\n      if (ch === '\\\\' && i + 1 < n) {\n        const nxt = raw[i + 1]\n        if (nxt === '\"' || nxt === \"'\" || nxt === '\\\\') {\n          buf.push(nxt)\n          i += 2\n          continue\n        }\n        buf.push(ch)\n        i += 1\n        continue\n      }\n      if (ch === inQuote) {\n        inQuote = null\n        quotedSegment = true\n        i += 1\n        continue\n      }\n      buf.push(ch)\n      i += 1\n      continue\n    }\n    if (/\\s/.test(ch)) {\n      flush()\n      i += 1\n      continue\n    }\n    if (ch === '\"' || ch === \"'\") {\n      inQuote = ch\n      i += 1\n      continue\n    }\n    buf.push(ch)\n    i += 1\n  }\n\n  if (inQuote !== null) {\n    const e = new Error('Unterminated quote starting with ' + JSON.stringify(inQuote) + '.')\n    e.code = 'UNTERMINATED_QUOTE'\n    throw e\n  }\n\n  flush()\n  return segments\n}\n\n// ---------------------------------------------------------------------------\n// Parser - given an operator registry, produces tokens / free_text / errors.\n//\n// operators: { key: { multi: bool } }\n// caps: { max_raw_length, max_tokens, max_values_per_operator }\n// ---------------------------------------------------------------------------\n\nexport function parseQuery (raw, operators, caps = {}) {\n  const merged = Object.assign({}, DEFAULT_CAPS, caps)\n  const result = { tokens: [], free_text: [], errors: [] }\n\n  if (raw == null || raw === '') return result\n\n  let segments\n  try {\n    segments = tokenize(raw, { max_raw_length_bytes: merged.max_raw_length })\n  } catch (e) {\n    if (e.code === 'MAX_RAW_LENGTH') {\n      result.errors.push({ code: PARSE_ERRORS.MAX_RAW_LENGTH_EXCEEDED, message: e.message })\n    } else {\n      result.errors.push({ code: PARSE_ERRORS.UNTERMINATED_QUOTE, message: e.message })\n    }\n    return result\n  }\n\n  if (segments.length > merged.max_tokens) {\n    result.errors.push({\n      code: PARSE_ERRORS.MAX_TOKENS_EXCEEDED,\n      message: 'Too many tokens (' + segments.length + ' > ' + merged.max_tokens + ').'\n    })\n    return result\n  }\n\n  for (let s = 0; s < segments.length; s++) {\n    const seg = segments[s]\n    const m = seg.text.match(OPERATOR_KEY_RE)\n    if (m === null) {\n      result.free_text.push(seg.text)\n      continue\n    }\n    const key = m[1]\n    const value = m[2]\n    const opSpec = operators[key]\n    if (opSpec == null) {\n      result.errors.push({\n        code: PARSE_ERRORS.UNKNOWN_OPERATOR,\n        message: 'Unknown operator ' + JSON.stringify(key) + '.',\n        operator_key: key\n      })\n      continue\n    }\n\n    let values\n    if (opSpec.multi) {\n      values = value === '' ? [''] : value.split(',')\n      if (values.length > merged.max_values_per_operator) {\n        result.errors.push({\n          code: PARSE_ERRORS.MAX_VALUES_PER_OPERATOR_EXCEEDED,\n          message: 'Operator ' + JSON.stringify(key) + ' has ' + values.length +\n                   ' values (maximum ' + merged.max_values_per_operator + ').',\n          operator_key: key\n        })\n        continue\n      }\n      // Mirror the Python parser: reject \"status:draft,\" / \"category:1,,2\".\n      if (values.length > 1 && values.some(v => v.trim() === '')) {\n        result.errors.push({\n          code: PARSE_ERRORS.EMPTY_VALUE,\n          message: 'Operator ' + JSON.stringify(key) + ' has an empty value in ' +\n                   JSON.stringify(seg.text) + '.',\n          operator_key: key\n        })\n        continue\n      }\n    } else {\n      values = [value]\n    }\n\n    result.tokens.push({ key, values, was_quoted: seg.was_quoted })\n  }\n\n  return result\n}\n", "// django-tomselect - token widget client plugin.\n//\n// Exposed via window.djangoTomSelectToken.init(rootEl). The Django template\n// (templates/django_tomselect/tomselect_token.html) emits an inline init\n// script per widget; that pattern matches the existing tomselect.html.\n//\n// All DOM construction uses createElement + textContent (no innerHTML) so\n// rendered chip/dropdown content is XSS-safe by construction.\n\n/* eslint-disable no-multi-spaces */\n\nimport { parseQuery, PARSE_ERRORS } from './parser.js'\n\nconst HYDRATION_CACHE_KEY = '__djangoTomSelectTokenHydrationCache'\n\n// ---------------------------------------------------------------------------\n// Networking\n// ---------------------------------------------------------------------------\n\nasync function fetchOperators (compositeUrl) {\n  const url = new URL(compositeUrl, window.location.origin)\n  url.searchParams.set('mode', 'operators')\n  const resp = await window.fetch(url.toString(), { credentials: 'same-origin' })\n  if (!resp.ok) throw new Error('operators fetch failed: ' + resp.status)\n  return resp.json()\n}\n\nasync function fetchValueResults (compositeUrl, opKey, query, page, signal) {\n  const url = new URL(compositeUrl, window.location.origin)\n  url.searchParams.set('mode', 'value')\n  url.searchParams.set('op', opKey)\n  url.searchParams.set('q', query || '')\n  if (page) url.searchParams.set('p', String(page))\n  const opts = { credentials: 'same-origin' }\n  if (signal) opts.signal = signal\n  const resp = await window.fetch(url.toString(), opts)\n  if (!resp.ok) throw new Error('value fetch failed: ' + resp.status)\n  return resp.json()\n}\n\nasync function fetchResolveBatch (compositeUrl, pairs) {\n  const url = new URL(compositeUrl, window.location.origin)\n  url.searchParams.set('mode', 'resolve')\n  for (const [op, id] of pairs) {\n    url.searchParams.append('op', op)\n    url.searchParams.append('id', id)\n  }\n  const resp = await window.fetch(url.toString(), { credentials: 'same-origin' })\n  if (!resp.ok) throw new Error('resolve fetch failed: ' + resp.status)\n  return resp.json()\n}\n\n// ---------------------------------------------------------------------------\n// DOM construction helpers (createElement + textContent - no innerHTML).\n// ---------------------------------------------------------------------------\n\nfunction el (tag, attrs, children) {\n  const node = document.createElement(tag)\n  if (attrs) {\n    for (const k of Object.keys(attrs)) {\n      const v = attrs[k]\n      if (v == null) continue\n      if (k === 'class') node.className = v\n      else if (k === 'text') node.textContent = v\n      else if (k.startsWith('data-') || k === 'aria-label' || k === 'type' || k === 'hidden') {\n        node.setAttribute(k, v === true ? '' : String(v))\n      } else node.setAttribute(k, String(v))\n    }\n  }\n  if (children) {\n    for (const c of children) {\n      if (c == null) continue\n      if (typeof c === 'string') node.appendChild(document.createTextNode(c))\n      else node.appendChild(c)\n    }\n  }\n  return node\n}\n\nfunction buildTokenChip (token, label) {\n  const valueText = token.values.join(',')\n  const isMissing = label === null\n  const labelMarkup = isMissing\n    ? el('span', { class: 'tw-tok-label', text: '(missing)' })\n    : (label != null ? el('span', { class: 'tw-tok-label', text: label }) : null)\n  return el(\n    'span',\n    {\n      class: 'tw-tok' + (isMissing ? ' tw-tok-missing' : ''),\n      'data-op': token.key,\n      'data-value': valueText\n    },\n    [\n      el('span', { class: 'tw-tok-k', text: token.key + ':' }),\n      el('span', { class: 'tw-tok-v' }, [\n        el('span', { class: 'tw-tok-id', text: valueText }),\n        labelMarkup ? document.createTextNode(' ') : null,\n        labelMarkup\n      ]),\n      el('button', {\n        type: 'button',\n        class: 'tw-tok-x',\n        'aria-label': 'Remove ' + token.key + ':' + valueText,\n        text: '\u00D7'\n      })\n    ]\n  )\n}\n\nfunction buildFreeTextChip (text) {\n  return el('span', { class: 'tw-tok tw-tok-freetext', 'data-freetext': text }, [\n    el('span', { class: 'tw-tok-k', text: '\"' }),\n    el('span', { class: 'tw-tok-v' }, [el('span', { class: 'tw-tok-label', text })]),\n    el('button', { type: 'button', class: 'tw-tok-x', 'aria-label': 'Remove \"' + text + '\"', text: '\u00D7' })\n  ])\n}\n\nfunction buildErrorChip (text) {\n  return el('span', { class: 'tw-tok tw-tok-error' }, [\n    el('span', { class: 'tw-tok-k', text: '!' }),\n    el('span', { class: 'tw-tok-v' }, [el('span', { class: 'tw-tok-label', text })]),\n    el('button', { type: 'button', class: 'tw-tok-x', 'aria-label': 'Remove error: ' + text, text: '\u00D7' })\n  ])\n}\n\nfunction buildOperatorMenu (operators, draft, listboxId) {\n  const filtered = operators.filter(o =>\n    !draft || o.key.toLowerCase().startsWith(draft.toLowerCase())\n  )\n  const wrapper = document.createDocumentFragment()\n  if (filtered.length === 0) {\n    wrapper.appendChild(el('div', { class: 'tw-dropdown-heading', text: 'No operators match.' }))\n    return wrapper\n  }\n  const section = el('div', { class: 'tw-dropdown-section' }, [\n    el('div', { class: 'tw-dropdown-heading', text: 'Operators' })\n  ])\n  const listbox = el('div', {\n    class: 'tw-listbox',\n    role: 'listbox',\n    id: listboxId,\n    'aria-label': 'Filter operators'\n  })\n  filtered.forEach((op, i) => {\n    const opt = el('div', {\n      class: 'tw-opt' + (i === 0 ? ' active' : ''),\n      role: 'option',\n      id: listboxId + '-op-' + i,\n      'aria-selected': i === 0 ? 'true' : 'false',\n      'data-action': 'select-operator',\n      'data-key': op.key\n    }, [\n      el('span', { class: 'tw-opt-k', text: op.key + ':' }),\n      el('span', { class: 'tw-opt-text', text: op.label || op.key }),\n      op.multi ? el('span', { class: 'tw-opt-hint', text: 'multi' }) : null\n    ])\n    listbox.appendChild(opt)\n  })\n  section.appendChild(listbox)\n  wrapper.appendChild(section)\n  wrapper.appendChild(buildFooter())\n  return wrapper\n}\n\nfunction buildValueDropdown (opKey, results, opMeta, listboxId) {\n  const wrapper = document.createDocumentFragment()\n  if (!results || results.length === 0) {\n    wrapper.appendChild(el('div', { class: 'tw-dropdown-heading', text: 'No matches.' }))\n    wrapper.appendChild(buildFooter('close'))\n    return wrapper\n  }\n  const section = el('div', { class: 'tw-dropdown-section' }, [\n    el('div', { class: 'tw-dropdown-heading', text: opMeta.label || opKey })\n  ])\n  const listbox = el('div', {\n    class: 'tw-listbox',\n    role: 'listbox',\n    id: listboxId,\n    'aria-label': (opMeta.label || opKey) + ' values'\n  })\n  results.forEach((row, i) => {\n    const id = row[opMeta.value_field]\n    const label = row[opMeta.label_field]\n    listbox.appendChild(el('div', {\n      class: 'tw-opt' + (i === 0 ? ' active' : ''),\n      role: 'option',\n      id: listboxId + '-val-' + i,\n      'aria-selected': i === 0 ? 'true' : 'false',\n      'data-action': 'select-value',\n      'data-id': id,\n      'data-label': label\n    }, [\n      el('span', { class: 'tw-opt-id', text: String(id) }),\n      el('span', { class: 'tw-opt-text', text: String(label) })\n    ]))\n  })\n  section.appendChild(listbox)\n  wrapper.appendChild(section)\n  wrapper.appendChild(buildFooter())\n  return wrapper\n}\n\nfunction buildFreeFormHint (opMeta, draft) {\n  // Free-form operators (q_translator-backed) accept arbitrary typed values.\n  // Show the user what they're about to commit instead of \"No matches.\"\n  const wrapper = document.createDocumentFragment()\n  const heading = opMeta.label || opMeta.key\n  wrapper.appendChild(el('div', { class: 'tw-dropdown-heading', text: heading }))\n  const hintText = draft\n    ? 'Press Enter to add ' + opMeta.key + ':' + draft\n    : 'Type a value and press Enter.'\n  wrapper.appendChild(el('div', { class: 'tw-dropdown-hint', text: hintText }))\n  wrapper.appendChild(buildFooter('close'))\n  return wrapper\n}\n\nfunction buildFooter (variant) {\n  const footer = el('div', { class: 'tw-dropdown-footer' })\n  if (variant === 'close') {\n    footer.appendChild(el('kbd', { text: 'esc' }))\n    footer.appendChild(document.createTextNode(' close'))\n    return footer\n  }\n  const items = [\n    [el('kbd', { text: '\u2191\u2193' }), document.createTextNode(' navigate')],\n    [el('kbd', { text: '\u21B5' }), document.createTextNode(' insert')],\n    [el('kbd', { text: 'tab' }), document.createTextNode(' complete')]\n  ]\n  items.forEach((parts, i) => {\n    if (i > 0) footer.appendChild(document.createTextNode(' \u00B7 '))\n    parts.forEach(p => footer.appendChild(p))\n  })\n  return footer\n}\n\n// ---------------------------------------------------------------------------\n// Widget controller\n// ---------------------------------------------------------------------------\n\nfunction init (root) {\n  if (!root || root.dataset.djangoTomselectTokenInitialized === '1') return\n  root.dataset.djangoTomselectTokenInitialized = '1'\n\n  const targetName = root.dataset.targetName\n  const compositeUrl = root.dataset.composite || root.dataset.compositeUrl\n  if (!compositeUrl) {\n    console.warn('[django-tomselect-token] no composite URL on', root)\n    return\n  }\n\n  let config = {}\n  try {\n    config = JSON.parse(root.dataset.config || '{}')\n  } catch (e) {\n    console.warn('[django-tomselect-token] invalid config JSON on', root)\n  }\n\n  // CSS.escape() - guards against form-field names with CSS-meaningful chars\n  // (e.g. dotted formset names) that would break a naive attribute selector.\n  const hiddenInput = document.querySelector(\n    'input[data-django-tomselect-token-input][name=\"' + (window.CSS && window.CSS.escape ? window.CSS.escape(targetName) : targetName) + '\"]'\n  )\n  if (!hiddenInput) {\n    console.warn('[django-tomselect-token] hidden input not found for', targetName)\n    return\n  }\n\n  // State\n  let operatorList = []\n  let operatorMap = {}\n  const hydration = (window[HYDRATION_CACHE_KEY] = window[HYDRATION_CACHE_KEY] || new Map())\n  let mode = 'operator-menu'\n  let activeOpKey = null\n  // Set transiently when we programmatically restore focus to the draft input\n  // after removing a chip, so the focus handler doesn't pop the operator menu\n  // open (keyboard Backspace removal leaves the dropdown state untouched; the\n  // click-removal path should match it).\n  let suppressFocusOpen = false\n  // AbortController for the in-flight value-mode fetch. Each new keystroke\n  // aborts the prior request so a slow response can't overwrite a faster\n  // newer one (race condition).\n  let valueFetchController = null\n\n  // DOM construction\n  while (root.firstChild) root.removeChild(root.firstChild)\n  const chipsEl = el('div', { class: 'tw-chips' })\n  chipsEl.style.display = 'contents'\n  root.appendChild(chipsEl)\n\n  const dropdownId = 'tw-dropdown-' + targetName\n  const draftEl = el('input', {\n    class: 'tw-input',\n    type: 'text',\n    role: 'combobox',\n    'aria-autocomplete': 'list',\n    'aria-expanded': 'false',\n    'aria-controls': dropdownId,\n    'aria-label': (config.placeholder || hiddenInput.placeholder || 'Search')\n  })\n  draftEl.placeholder = (hiddenInput.placeholder || '')\n  root.appendChild(draftEl)\n\n  // The dropdown is a plain popup container; the listbox role lives on an inner\n  // element (built per render) that owns *only* option elements, so headings,\n  // hints, and the keyboard-legend footer are not mis-owned by the listbox.\n  // aria-controls references this container (always present once init runs), so\n  // the relationship never dangles in the loading/empty/error states where the\n  // inner listbox isn't rendered.\n  const dropdownEl = el('div', { class: 'tw-dropdown', id: dropdownId, hidden: true })\n  root.appendChild(dropdownEl)\n\n  const errorEl = el('div', { class: 'tw-error-msg' })\n  errorEl.style.display = 'none'\n  root.parentNode.insertBefore(errorEl, root.nextSibling)\n\n  // Visually-hidden polite live region. Token add/remove are DOM-only\n  // mutations a screen reader would otherwise miss; announce() narrates them.\n  const statusEl = el('span', {\n    class: 'tw-sr-status',\n    'data-tw-status': '',\n    role: 'status',\n    'aria-live': 'polite'\n  })\n  statusEl.style.position = 'absolute'\n  statusEl.style.width = '1px'\n  statusEl.style.height = '1px'\n  statusEl.style.overflow = 'hidden'\n  statusEl.style.clip = 'rect(0 0 0 0)'\n  statusEl.style.clipPath = 'inset(50%)'\n  statusEl.style.whiteSpace = 'nowrap'\n  root.parentNode.insertBefore(statusEl, root.nextSibling)\n\n  function announce (message) { statusEl.textContent = message }\n\n  function operatorRegistryForParser () {\n    const out = {}\n    for (const op of operatorList) out[op.key] = { multi: !!op.multi }\n    return out\n  }\n\n  function serializedValue () { return hiddenInput.value || '' }\n\n  // Serialize one `key:value` segment for the hidden input. Quote the segment\n  // when it contains whitespace OR a quote character; the tokenizer treats\n  // both `'` and `\"` as quote openers, so an unquoted apostrophe inside a\n  // value would yield UNTERMINATED_QUOTE. Inside the quoted form, escape\n  // backslashes first (so `\\\\` survives round-tripping) and then `\"`.\n  function serializeTokenSegment (key, value) {\n    const raw = key + ':' + value\n    if (/[\\s'\"]/.test(raw)) {\n      const escaped = raw.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n      return '\"' + escaped + '\"'\n    }\n    return raw\n  }\n\n  function setSerialized (s) {\n    hiddenInput.value = s\n    hiddenInput.dispatchEvent(new Event('change', { bubbles: true }))\n  }\n\n  function clearChildren (node) {\n    while (node.firstChild) node.removeChild(node.firstChild)\n  }\n\n  // Single source of truth for the active option: keep the `.active` CSS\n  // class, `aria-selected`, and the input's `aria-activedescendant` in sync so\n  // screen readers track keyboard navigation through the listbox.\n  function setActiveOption (opt) {\n    // No option (empty/loading/hint/error states): drop the stale pointer so\n    // a screen reader never announces a removed element.\n    if (!opt) {\n      draftEl.removeAttribute('aria-activedescendant')\n      return\n    }\n    for (const other of dropdownEl.querySelectorAll('.tw-opt')) {\n      other.classList.remove('active')\n      other.setAttribute('aria-selected', 'false')\n    }\n    opt.classList.add('active')\n    opt.setAttribute('aria-selected', 'true')\n    draftEl.setAttribute('aria-activedescendant', opt.id)\n  }\n\n  function renderChips () {\n    const parsed = parseQuery(serializedValue(), operatorRegistryForParser(), {\n      max_raw_length: config.max_query_length || 4096,\n      max_tokens: config.max_tokens || 32\n    })\n\n    clearChildren(chipsEl)\n    let hasError = false\n\n    for (const err of parsed.errors) {\n      hasError = true\n      chipsEl.appendChild(buildErrorChip(err.message))\n    }\n\n    for (const t of parsed.tokens) {\n      const valueText = t.values.join(',')\n      const cacheKey = t.key + ':' + valueText\n      const cached = hydration.has(cacheKey) ? hydration.get(cacheKey) : undefined\n      chipsEl.appendChild(buildTokenChip(t, cached))\n      // Free-form operators (q_translator) have no resolvable label - the\n      // typed string IS the value. Skip the resolve round-trip so the chip\n      // doesn't flicker into \"(missing)\" when the server has no row for it.\n      const opMeta = operatorMap[t.key]\n      const isFreeForm = !!(opMeta && opMeta.free_form)\n      if (cached === undefined && t.values.length === 1 && !isFreeForm) {\n        scheduleResolve([[t.key, t.values[0]]])\n      }\n    }\n\n    for (const ft of parsed.free_text) {\n      chipsEl.appendChild(buildFreeTextChip(ft))\n    }\n\n    if (hasError) root.classList.add('error')\n    else root.classList.remove('error')\n  }\n\n  let resolveQueue = []\n  let resolveScheduled = false\n  function scheduleResolve (pairs) {\n    for (const p of pairs) resolveQueue.push(p)\n    if (resolveScheduled) return\n    resolveScheduled = true\n    Promise.resolve().then(async () => {\n      resolveScheduled = false\n      const pending = resolveQueue.slice()\n      resolveQueue = []\n      try {\n        const data = await fetchResolveBatch(compositeUrl, pending)\n        for (const r of data.results || []) {\n          const cacheKey = r.op + ':' + (r.value != null ? r.value : r.id)\n          hydration.set(cacheKey, r.missing ? null : r.label)\n        }\n        renderChips()\n      } catch (e) {\n        console.warn('[django-tomselect-token] resolve failed:', e)\n      }\n    })\n  }\n\n  function showOperatorMenu (draft) {\n    mode = 'operator-menu'\n    clearChildren(dropdownEl)\n    draftEl.removeAttribute('aria-activedescendant')\n    dropdownEl.appendChild(buildOperatorMenu(operatorList, draft, dropdownId + '-listbox'))\n    dropdownEl.hidden = false\n    draftEl.setAttribute('aria-expanded', 'true')\n    setActiveOption(dropdownEl.querySelector('.tw-opt.active'))\n  }\n\n  async function showValueDropdown (opKey, draft) {\n    mode = 'value-mode'\n    activeOpKey = opKey\n    // Entering value-mode clears any prior active option until results render;\n    // the loading/free-form states below have no options to point at.\n    draftEl.removeAttribute('aria-activedescendant')\n    const opMeta = operatorMap[opKey] || { key: opKey }\n    // Free-form operators don't have a server-backed suggestion list; the\n    // bound view returns an empty queryset by design. Skip the round-trip\n    // and show a typed-value hint that doubles as a commit affordance.\n    if (opMeta.free_form) {\n      clearChildren(dropdownEl)\n      dropdownEl.appendChild(buildFreeFormHint(opMeta, draft))\n      dropdownEl.hidden = false\n      draftEl.setAttribute('aria-expanded', 'true')\n      return\n    }\n    clearChildren(dropdownEl)\n    dropdownEl.appendChild(el('div', { class: 'tw-dropdown-heading', text: 'Loading\u2026' }))\n    dropdownEl.hidden = false\n    draftEl.setAttribute('aria-expanded', 'true')\n\n    // Abort any prior in-flight fetch. The new keystroke supersedes it; we\n    // never want a slow stale response to overwrite a fresh one.\n    if (valueFetchController) valueFetchController.abort()\n    const controller = (typeof AbortController !== 'undefined') ? new AbortController() : null\n    valueFetchController = controller\n\n    try {\n      const data = await fetchValueResults(\n        compositeUrl, opKey, draft, 1, controller ? controller.signal : null\n      )\n      // If we've been superseded between fetch and resolve, drop the response.\n      if (controller && controller.signal.aborted) return\n      // Mode might have changed (user pressed Esc / committed); only render\n      // if we are still in value-mode for the same operator.\n      if (mode !== 'value-mode' || activeOpKey !== opKey) return\n      clearChildren(dropdownEl)\n      dropdownEl.appendChild(buildValueDropdown(opKey, data.results || [], opMeta, dropdownId + '-listbox'))\n      setActiveOption(dropdownEl.querySelector('.tw-opt.active'))\n    } catch (e) {\n      // AbortError fires when we superseded; silent drop.\n      if (e && e.name === 'AbortError') return\n      // Don't render the error if mode/op changed under us.\n      if (mode !== 'value-mode' || activeOpKey !== opKey) return\n      clearChildren(dropdownEl)\n      dropdownEl.appendChild(el('div', { class: 'tw-dropdown-heading', text: 'Error loading results.' }))\n    }\n  }\n\n  function closeDropdown () {\n    mode = 'closed'\n    dropdownEl.hidden = true\n    draftEl.setAttribute('aria-expanded', 'false')\n    draftEl.removeAttribute('aria-activedescendant')\n  }\n\n  function commitOperatorAndEnterValueMode (opKey) {\n    draftEl.value = ''\n    showValueDropdown(opKey, '')\n  }\n\n  function commitValueSelection (opKey, id, label) {\n    const cacheKey = opKey + ':' + id\n    if (label != null) hydration.set(cacheKey, label)\n    const existing = serializedValue()\n    const newPart = serializeTokenSegment(opKey, String(id))\n    const next = existing ? existing + ' ' + newPart : newPart\n    setSerialized(next)\n    draftEl.value = ''\n    closeDropdown()\n    activeOpKey = null\n    renderChips()\n    announce(opKey + ' filter added')\n  }\n\n  // Commit the current draft as a free-form `opKey:value` token. Used when\n  // the user types a value for a q_translator-backed operator (e.g.\n  // `published_after:2024-01-01`) where no dropdown row exists to select.\n  function commitFreeFormValue () {\n    if (mode !== 'value-mode' || !activeOpKey) return false\n    const value = draftEl.value\n    if (!value) return false\n    const opMeta = operatorMap[activeOpKey]\n    if (!opMeta || !opMeta.free_form) return false\n    commitValueSelection(activeOpKey, value, null)\n    return true\n  }\n\n  function commitFreeText (text) {\n    if (!text) return\n    if (config.allow_free_text === false) return\n    const existing = serializedValue()\n    const part = /\\s/.test(text) ? '\"' + text.replace(/\"/g, '\\\\\"') + '\"' : text\n    setSerialized(existing ? existing + ' ' + part : part)\n    draftEl.value = ''\n    closeDropdown()\n    renderChips()\n    announce('Text filter added')\n  }\n\n  function removeChipByIndex (index) {\n    const parsed = parseQuery(serializedValue(), operatorRegistryForParser(), {\n      max_raw_length: config.max_query_length || 4096,\n      max_tokens: config.max_tokens || 32\n    })\n    const flat = []\n    for (const t of parsed.tokens) flat.push({ kind: 'token', token: t })\n    for (const ft of parsed.free_text) flat.push({ kind: 'freetext', text: ft })\n    flat.splice(index, 1)\n    const parts = flat.map(item => {\n      if (item.kind === 'token') {\n        return serializeTokenSegment(item.token.key, item.token.values.join(','))\n      }\n      return /\\s/.test(item.text) ? '\"' + item.text.replace(/\"/g, '\\\\\"') + '\"' : item.text\n    })\n    setSerialized(parts.join(' '))\n    renderChips()\n    announce('Filter removed')\n  }\n\n  draftEl.addEventListener('input', () => {\n    const draft = draftEl.value\n    if (mode === 'value-mode' && activeOpKey) {\n      showValueDropdown(activeOpKey, draft)\n      return\n    }\n    const colonIdx = draft.indexOf(':')\n    if (colonIdx >= 0) {\n      const candidate = draft.slice(0, colonIdx)\n      if (operatorMap[candidate]) {\n        const remainder = draft.slice(colonIdx + 1)\n        commitOperatorAndEnterValueMode(candidate)\n        if (remainder) {\n          draftEl.value = remainder\n          showValueDropdown(candidate, remainder)\n        }\n        return\n      }\n    }\n    showOperatorMenu(draft)\n  })\n\n  draftEl.addEventListener('focus', () => {\n    root.classList.add('focused')\n    if (suppressFocusOpen) return\n    if (mode === 'closed') showOperatorMenu(draftEl.value)\n  })\n\n  draftEl.addEventListener('blur', () => {\n    setTimeout(() => { root.classList.remove('focused') }, 150)\n  })\n\n  draftEl.addEventListener('keydown', (ev) => {\n    if (ev.key === 'Escape') {\n      ev.preventDefault()\n      closeDropdown()\n    } else if (ev.key === 'Enter' || ev.key === 'Tab') {\n      const active = dropdownEl.querySelector('.tw-opt.active')\n      if (active) {\n        ev.preventDefault()\n        active.click()\n      } else if (commitFreeFormValue()) {\n        // value-mode + free-form operator: commit `opKey:draft` as a token.\n        ev.preventDefault()\n      } else if (ev.key === 'Enter' && draftEl.value) {\n        ev.preventDefault()\n        commitFreeText(draftEl.value)\n      }\n    } else if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\n      const opts = Array.from(dropdownEl.querySelectorAll('.tw-opt'))\n      if (opts.length === 0) return\n      ev.preventDefault()\n      const cur = opts.findIndex(elt => elt.classList.contains('active'))\n      let next = ev.key === 'ArrowDown' ? cur + 1 : cur - 1\n      if (next < 0) next = opts.length - 1\n      if (next >= opts.length) next = 0\n      setActiveOption(opts[next])\n    } else if (ev.key === 'Backspace' && draftEl.value === '') {\n      const chips = chipsEl.querySelectorAll('.tw-tok')\n      if (chips.length > 0) {\n        ev.preventDefault()\n        removeChipByIndex(chips.length - 1)\n      }\n    } else if (ev.key === ' ' && draftEl.value) {\n      // In value-mode for a free-form operator the user may need whitespace\n      // in the value itself (e.g. `published_after:2024 01 01` typo, or an\n      // exact phrase). Let Space type normally and require Enter/Tab to\n      // commit. Outside value-mode, Space still commits free text.\n      if (mode === 'value-mode' && activeOpKey) {\n        const opMeta = operatorMap[activeOpKey]\n        if (opMeta && opMeta.free_form) return\n      }\n      const text = draftEl.value\n      if (config.allow_free_text !== false && !text.includes(':')) {\n        ev.preventDefault()\n        commitFreeText(text)\n      }\n    }\n  })\n\n  dropdownEl.addEventListener('mousedown', (ev) => {\n    const opt = ev.target.closest('.tw-opt')\n    if (!opt) return\n    ev.preventDefault()\n    const action = opt.dataset.action\n    if (action === 'select-operator') {\n      commitOperatorAndEnterValueMode(opt.dataset.key)\n    } else if (action === 'select-value' && activeOpKey) {\n      commitValueSelection(activeOpKey, opt.dataset.id, opt.dataset.label)\n    }\n  })\n\n  chipsEl.addEventListener('click', (ev) => {\n    const x = ev.target.closest('.tw-tok-x')\n    if (!x) return\n    const chips = Array.from(chipsEl.querySelectorAll('.tw-tok'))\n    const idx = chips.indexOf(x.closest('.tw-tok'))\n    if (idx >= 0) {\n      removeChipByIndex(idx)\n      // The activated remove button was just destroyed by the re-render; move\n      // focus to the draft input so keyboard users aren't dropped onto <body>.\n      // Suppress the focus handler's auto-open so removal doesn't spuriously\n      // pop the operator menu (focus() fires the handler synchronously).\n      suppressFocusOpen = true\n      draftEl.focus()\n      suppressFocusOpen = false\n    }\n  })\n\n  root.addEventListener('click', (ev) => {\n    if (ev.target === root || ev.target === chipsEl) {\n      draftEl.focus()\n    }\n  })\n\n  fetchOperators(compositeUrl).then(data => {\n    operatorList = data.operators || []\n    operatorMap = {}\n    for (const op of operatorList) operatorMap[op.key] = op\n    renderChips()\n  }).catch(e => {\n    console.warn('[django-tomselect-token] could not load operators:', e)\n    errorEl.textContent = 'Could not load filter options. Free-text search still works.'\n    errorEl.style.display = 'block'\n  })\n}\n\n// ---------------------------------------------------------------------------\n// Public global\n// ---------------------------------------------------------------------------\n\nif (typeof window !== 'undefined') {\n  window.djangoTomSelectToken = window.djangoTomSelectToken || {}\n  window.djangoTomSelectToken.init = init\n  window.djangoTomSelectToken.parseQuery = parseQuery\n  window.djangoTomSelectToken.PARSE_ERRORS = PARSE_ERRORS\n}\n\nexport { init, parseQuery, PARSE_ERRORS }\n", "import TomSelect from 'tom-select' // Use the full package instead of base\n/* eslint-disable camelcase */\nimport TomSelect_checkbox_options from 'tom-select/plugins/checkbox_options/plugin.js'\nimport TomSelect_clear_button from 'tom-select/plugins/clear_button/plugin.js'\nimport TomSelect_dropdown_header from 'tom-select/plugins/dropdown_header/plugin.js'\nimport TomSelect_dropdown_input from 'tom-select/plugins/dropdown_input/plugin.js'\nimport TomSelect_remove_button from './plugins/remove_button_accessible/plugin.js'\nimport TomSelect_virtual_scroll from 'tom-select/plugins/virtual_scroll/plugin.js'\nimport TomSelect_dropdown_footer from './plugins/dropdown_footer/plugin.js'\nimport './plugins/token/index.js' // Side-effect: registers window.djangoTomSelectToken\n/* eslint-enable camelcase */\n\n// Define plugins\nTomSelect.define('checkbox_options', TomSelect_checkbox_options)\nTomSelect.define('clear_button', TomSelect_clear_button)\nTomSelect.define('dropdown_header', TomSelect_dropdown_header)\nTomSelect.define('dropdown_input', TomSelect_dropdown_input)\nTomSelect.define('remove_button', TomSelect_remove_button)\nTomSelect.define('virtual_scroll', TomSelect_virtual_scroll)\nTomSelect.define('dropdown_footer', TomSelect_dropdown_footer)\n\n// Export to window with constructor check\nif (typeof TomSelect === 'function') {\n  window.TomSelect = TomSelect\n} else {\n  window.TomSelect = TomSelect.default || TomSelect\n}\n"],
  "mappings": "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",
  "names": ["forEvents", "events", "callback", "event", "MicroEvent", "fct", "event_array", "n", "args", "self", "MicroPlugin", "Interface", "name", "fn", "plugins", "key", "self", "queue", "plugin", "arrayToPattern", "chars", "maxValueLength", "sequencePattern", "array", "hasDuplicates", "pattern", "prev_char_count", "prev_pattern", "char", "i", "setToPattern", "escape_regex", "str", "longest", "value", "unicodeLength", "allSubstrings", "input", "result", "start", "subresult", "tmp", "code_points", "accent_pat", "unicode_map", "multi_char_reg", "max_char_length", "latin_convert", "latin_condensed", "latin", "unicode", "i", "char", "convert_pat", "initialize", "_code_points", "generateMap", "normalize", "str", "form", "asciifold", "result", "_asciifold", "generator", "code_point_min", "code_point_max", "composed", "folded", "generateSets", "unicode_sets", "addMatching", "to_add", "folded_set", "patt", "setToPattern", "escape_regex", "value", "multi_char", "set", "a", "b", "multi_char_patt", "arrayToPattern", "mapSequence", "strings", "min_replacement", "chars_replaced", "sequencePattern", "substringsToPattern", "allSubstrings", "sub_pat", "sequencesToPattern", "sequences", "all", "sequence", "seq", "len", "j", "inSequences", "needle_seq", "needle_parts", "filter", "part", "needle_part", "Sequence", "_Sequence", "position", "last_piece", "clone", "parts", "last_part", "last_substr", "clone_last_len", "getPattern", "pattern", "match", "match_str", "overlapping", "added_types", "new_seq", "old_seq", "getAttr", "obj", "name", "getAttrNesting", "part", "names", "scoreValue", "value", "token", "weight", "score", "pos", "propToArray", "key", "iterate", "object", "callback", "cmp", "a", "b", "asciifold", "Sifter", "items", "settings", "query", "respect_word_boundaries", "weights", "tokens", "words", "field_regex", "escape_regex", "word", "field_match", "field", "regex", "getPattern", "options", "search", "token_count", "fields", "field_count", "getAttrFn", "scoreObject", "token", "data", "scoreValue", "sum", "value", "iterate", "weight", "score", "implicit_score", "sort_flds", "self", "sort", "get_field", "name", "result", "s", "fld", "b", "sort_fld", "cmp", "optsUser", "propToArray", "getAttrNesting", "getAttr", "fn_score", "item", "id", "_", "fn_sort", "hash_key", "value", "get_hash", "escape_html", "str", "timeout", "fn", "loadDebounce", "delay", "callback", "self", "debounce_events", "types", "type", "trigger", "event_args", "getSelection", "input", "preventDefault", "evt", "stop", "addEvent", "target", "options", "isKeyDown", "key_name", "count", "getId", "el", "id", "existing_id", "addSlashes", "append", "parent", "node", "iterate", "object", "key", "getDom", "query", "isHtmlString", "tpl", "arg", "escapeQuery", "triggerEvent", "dom_el", "event_name", "event", "applyCSS", "css", "addClasses", "elmts", "classes", "norm_classes", "classesArray", "castAsArray", "el", "cls", "removeClasses", "args", "iterate", "_classes", "parentMatch", "target", "selector", "wrapper", "getTail", "list", "direction", "isEmptyObject", "obj", "nodeIndex", "amongst", "i", "setAttr", "attrs", "val", "attr", "replaceNode", "existing", "replacement", "highlight", "element", "regex", "highlightText", "node", "match", "spannode", "middlebit", "middleclone", "replaceNode", "highlightChildren", "highlightRecursive", "removeHighlight", "el", "elements", "parent", "IS_MAC", "KEY_SHORTCUT", "defaults_default", "query", "getSettings", "input", "settings_user", "settings", "defaults_default", "attr_data", "field_label", "field_value", "field_disabled", "field_optgroup", "field_optgroup_label", "field_optgroup_value", "tag_name", "placeholder", "option", "settings_element", "init_select", "tagName", "options", "optionsMap", "group_count", "$order", "readData", "el", "data", "json", "addOption", "group", "value", "hash_key", "arr", "option_data", "addGroup", "optgroup", "id", "optgroup_data", "iterate", "child", "init_textbox", "data_raw", "opt", "values", "instance_i", "TomSelect", "MicroPlugin", "MicroEvent", "input_arg", "user_settings", "dir", "input", "getDom", "computedStyle", "settings", "getSettings", "getId", "Sifter", "filter", "value", "wrapper", "control", "dropdown", "dropdown_content", "classes", "inputMode", "control_input", "addClasses", "append", "isHtmlString", "attrs", "iterate", "attr", "setAttr", "self", "focus_node", "passive_event", "listboxId", "control_id", "query", "escapeQuery", "label", "label_click", "addEvent", "label_id", "classes_plugins", "escape_regex", "loadDebounce", "e", "target_match", "parentMatch", "evt", "option", "preventDefault", "doc_mousedown", "target", "win_scroll", "input_invalid", "options", "optgroups", "optgroup", "field_label", "field_optgroup", "templates", "data", "escape", "key", "fn", "callbacks", "get_settings", "triggerEvent", "pastedText", "splitInput", "piece", "hash_key", "character", "isKeyDown", "KEY_SHORTCUT", "next", "prev", "timeout", "wasFocused", "deactivate", "item", "callback", "removeClasses", "classList", "changed", "silent", "events", "debounce_events", "eventName", "i", "begin", "end", "swap", "last", "last_active", "idx", "scroll", "behavior", "content", "height_menu", "scrollTop", "height_item", "y", "activeItems", "sort", "result", "calculateScore", "hashed", "triggerDropdown", "j", "k", "n", "html", "has_create_option", "active_group", "create", "groups", "groups_order", "same_query", "results", "active_option", "show_dropdown", "getGroupFragment", "order", "group_order_i", "order_group", "group_fragment", "opt_value", "opt_hash", "get_hash", "option_el", "self_optgroup", "regGroup", "a", "b", "group_order", "group_heading", "group_options", "header", "group_html", "removeHighlight", "tok", "highlight", "add_template", "template", "active_index", "user_created", "dat", "id", "hashed_id", "item_new", "index_item", "value_old", "value_new", "data_old", "option_new", "replaceNode", "boundFilter", "selected", "direction", "type", "all", "addSlashes", "values", "items", "x", "last_item", "wasFull", "nodeIndex", "caret", "output", "created", "isFull", "isLocked", "wrap_classList", "isEmptyObject", "opts", "empty_option", "AddSelected", "escape_html", "has_selected", "reuse_opt", "applyCSS", "setTextboxValue", "trigger", "context", "rect", "top", "left", "el", "selection", "tail", "getSelection", "rm_items", "getTail", "rm_item", "adjacent", "new_pos", "lock", "disabled", "isReadOnly", "revertSettings", "templateName", "when", "method", "new_fn", "orig_method", "result_new", "addEvent", "target", "type", "callback", "options", "addEventListener", "plugin", "input", "sync", "hash_key", "value", "get_hash", "preventDefault", "evt", "stop", "stopPropagation", "getDom", "query", "jquery", "HTMLElement", "isHtmlString", "tpl", "document", "createElement", "innerHTML", "trim", "content", "firstChild", "querySelector", "arg", "indexOf", "plugin", "userOptions", "self", "orig_onOptionSelect", "onOptionSelect", "settings", "hideSelected", "cbOptions", "Object", "assign", "className", "checkedClassNames", "undefined", "uncheckedClassNames", "UpdateChecked", "checkbox", "toCheck", "checked", "classList", "remove", "add", "UpdateCheckbox", "option", "setTimeout", "HTMLInputElement", "contains", "hook", "orig_render_option", "render", "data", "escape_html", "rendered", "call", "addEventListener", "type", "hashed", "valueField", "items", "prepend", "on", "getOption", "removeItem", "dataset", "refreshOptions", "getDom", "query", "jquery", "HTMLElement", "isHtmlString", "tpl", "document", "createElement", "innerHTML", "trim", "content", "firstChild", "querySelector", "arg", "indexOf", "plugin", "userOptions", "self", "options", "Object", "assign", "className", "title", "role", "tabindex", "html", "data", "on", "button", "addEventListener", "evt", "isLocked", "clear", "settings", "mode", "allowEmptyOption", "addItem", "refreshOptions", "preventDefault", "stopPropagation", "control", "appendChild", "preventDefault", "evt", "stop", "stopPropagation", "addEvent", "target", "type", "callback", "options", "addEventListener", "iterate", "object", "Array", "isArray", "forEach", "key", "hasOwnProperty", "getDom", "query", "jquery", "HTMLElement", "isHtmlString", "tpl", "document", "createElement", "innerHTML", "trim", "content", "firstChild", "querySelector", "arg", "indexOf", "setAttr", "el", "attrs", "val", "attr", "removeAttribute", "setAttribute", "insertAfter", "referenceNode", "newNode", "_referenceNode$parent", "parentNode", "insertBefore", "nextSibling", "_referenceNode$parent2", "isBefore", "_newNode", "previousElementSibling", "plugin", "self", "settings", "mode", "orig_lock", "lock", "orig_unlock", "unlock", "sortable", "drag_item", "hook", "orig_render_item", "render", "item", "data", "escape", "call", "mousedown", "dragStart", "setTimeout", "classList", "add", "dragOver", "moveitem", "dragLeave", "remove", "targetitem", "dragitem", "undefined", "dragend", "_drag_item", "querySelectorAll", "values", "control", "dataset", "value", "push", "setValue", "preventDefault", "evt", "stop", "stopPropagation", "getDom", "query", "jquery", "HTMLElement", "isHtmlString", "tpl", "document", "createElement", "innerHTML", "trim", "content", "firstChild", "querySelector", "arg", "indexOf", "plugin", "userOptions", "self", "options", "Object", "assign", "title", "headerClass", "titleRowClass", "labelClass", "closeClass", "html", "data", "on", "header", "close_link", "addEventListener", "close", "dropdown", "insertBefore", "iterate", "object", "callback", "Array", "isArray", "forEach", "key", "hasOwnProperty", "removeClasses", "elmts", "classes", "norm_classes", "classesArray", "castAsArray", "map", "el", "cls", "classList", "remove", "args", "_classes", "trim", "split", "concat", "filter", "Boolean", "arg", "nodeIndex", "amongst", "nodeName", "i", "previousElementSibling", "matches", "plugin", "self", "hook", "new_pos", "settings", "mode", "control", "contains", "control_input", "items", "length", "Math", "max", "min", "caretPos", "isPending", "controlChildren", "child", "j", "insertAdjacentElement", "appendChild", "direction", "isFocused", "last_active", "getLastActive", "idx", "setCaret", "setActiveItem", "preventDefault", "evt", "stop", "stopPropagation", "addEvent", "target", "type", "callback", "options", "addEventListener", "iterate", "object", "Array", "isArray", "forEach", "key", "hasOwnProperty", "getDom", "query", "jquery", "HTMLElement", "isHtmlString", "tpl", "document", "createElement", "innerHTML", "trim", "content", "firstChild", "querySelector", "arg", "indexOf", "addClasses", "elmts", "classes", "norm_classes", "classesArray", "castAsArray", "map", "el", "cls", "classList", "add", "args", "_classes", "split", "concat", "filter", "Boolean", "plugin", "self", "settings", "shouldOpen", "hook", "_self$input", "focus_node", "control", "control_input", "div", "append", "dropdown", "insertBefore", "placeholder", "label", "input", "getAttribute", "setAttribute", "on", "keyCode", "constants", "isOpen", "close", "clearActiveItems", "tabIndex", "onKeyDown", "call", "isDisabled", "focus", "orig_onBlur", "onBlur", "relatedTarget", "preventScroll", "addEvent", "target", "type", "callback", "options", "addEventListener", "plugin", "self", "on", "test_input", "document", "createElement", "control", "control_input", "style", "cssText", "wrapper", "appendChild", "transfer_styles", "style_name", "resize", "textContent", "value", "width", "clientWidth", "plugin", "self", "orig_deleteSelection", "deleteSelection", "hook", "evt", "activeItems", "length", "call", "plugin", "hook", "parentMatch", "target", "selector", "wrapper", "matches", "parentNode", "nodeIndex", "el", "amongst", "nodeName", "i", "previousElementSibling", "plugin", "self", "orig_keydown", "onKeyDown", "hook", "evt", "index", "option", "options", "optgroup", "isOpen", "keyCode", "constants", "call", "ignoreHover", "activeOption", "previousSibling", "nextSibling", "querySelectorAll", "Math", "min", "length", "setActiveOption", "escape_html", "str", "replace", "preventDefault", "evt", "stop", "stopPropagation", "addEvent", "target", "type", "callback", "options", "addEventListener", "getDom", "query", "jquery", "HTMLElement", "isHtmlString", "tpl", "document", "createElement", "innerHTML", "trim", "content", "firstChild", "querySelector", "arg", "indexOf", "plugin", "userOptions", "Object", "assign", "label", "title", "className", "append", "self", "html", "hook", "orig_render_item", "settings", "render", "item", "data", "escape", "call", "close_button", "appendChild", "isLocked", "shouldDelete", "removeItem", "refreshOptions", "inputState", "plugin", "userOptions", "self", "options", "Object", "assign", "text", "option", "settings", "labelField", "on", "value", "isFocused", "control_input", "trim", "setTextboxValue", "call", "iterate", "object", "callback", "Array", "isArray", "forEach", "key", "hasOwnProperty", "addClasses", "elmts", "classes", "norm_classes", "classesArray", "castAsArray", "map", "el", "cls", "classList", "add", "args", "_classes", "trim", "split", "concat", "filter", "Boolean", "arg", "plugin", "self", "orig_canLoad", "canLoad", "orig_clearActiveOption", "clearActiveOption", "orig_loadCallback", "loadCallback", "pagination", "dropdown_content", "loading_more", "load_more_opt", "default_values", "settings", "shouldLoadMore", "clientHeight", "scrollHeight", "scrollTop", "activeOption", "selectable", "index", "from", "indexOf", "length", "firstUrl", "sortField", "field", "canLoadMore", "query", "maxOptions", "children", "clearFilter", "option", "value", "items", "setNextUrl", "next_url", "getUrl", "clearPagination", "call", "hook", "options", "optgroups", "clearOptions", "first_option", "undefined", "dataset", "valueField", "lastValue", "render", "setAttribute", "querySelector", "optionClass", "append", "on", "Object", "keys", "assign", "no_more_results", "addEventListener", "load", "TomSelect", "plugin", "tom_select_complete_default", "getDom", "query", "tpl", "decodeLabel", "raw", "preventDefault", "evt", "stop", "plugin_default", "userOptions", "options", "self", "orig_render_item", "data", "escape", "item", "labelField", "valueField", "itemLabel", "close_button", "plugin_default", "userOptions", "self", "options", "data", "footer", "getDom", "PARSE_ERRORS", "OPERATOR_KEY_RE", "DEFAULT_CAPS", "tokenize", "raw", "opts", "maxBytes", "e", "segments", "i", "n", "buf", "inQuote", "quotedSegment", "flush", "ch", "nxt", "parseQuery", "operators", "caps", "merged", "result", "s", "seg", "m", "key", "value", "opSpec", "values", "v", "HYDRATION_CACHE_KEY", "fetchOperators", "compositeUrl", "url", "resp", "fetchValueResults", "opKey", "query", "page", "signal", "opts", "fetchResolveBatch", "pairs", "op", "id", "el", "tag", "attrs", "children", "node", "k", "v", "c", "buildTokenChip", "token", "label", "valueText", "isMissing", "labelMarkup", "buildFreeTextChip", "text", "buildErrorChip", "buildOperatorMenu", "operators", "draft", "listboxId", "filtered", "o", "wrapper", "section", "listbox", "i", "opt", "buildFooter", "buildValueDropdown", "results", "opMeta", "row", "buildFreeFormHint", "heading", "hintText", "variant", "footer", "parts", "p", "init", "root", "targetName", "config", "hiddenInput", "operatorList", "operatorMap", "hydration", "mode", "activeOpKey", "suppressFocusOpen", "valueFetchController", "chipsEl", "dropdownId", "draftEl", "dropdownEl", "errorEl", "statusEl", "announce", "message", "operatorRegistryForParser", "out", "serializedValue", "serializeTokenSegment", "key", "value", "raw", "setSerialized", "s", "clearChildren", "setActiveOption", "other", "renderChips", "parsed", "parseQuery", "hasError", "err", "t", "cacheKey", "cached", "isFreeForm", "scheduleResolve", "ft", "resolveQueue", "resolveScheduled", "pending", "data", "r", "e", "showOperatorMenu", "showValueDropdown", "controller", "closeDropdown", "commitOperatorAndEnterValueMode", "commitValueSelection", "existing", "newPart", "next", "commitFreeFormValue", "commitFreeText", "part", "removeChipByIndex", "index", "flat", "item", "colonIdx", "candidate", "remainder", "ev", "active", "cur", "elt", "chips", "action", "x", "idx", "PARSE_ERRORS", "tom_select_complete_default", "plugin", "plugin_default"]
}
