{"version":3,"sources":["webpack:///custom-fe229a618fbc60ee5102.js","webpack:///webpack/bootstrap 3cbe0e4cda69decce2c4","webpack:///./node_modules/preact/dist/preact.umd.js","webpack:///./app/javascript/lib/utilities.js","webpack:///./node_modules/sprintf/lib/sprintf.js","webpack:///./app/javascript/packs/custom.js","webpack:///./app/javascript/custom/index.js","webpack:///./app/javascript/custom/tabs.js","webpack:///./app/javascript/custom/user-form-events.js","webpack:///./app/javascript/custom/choicify.js","webpack:///./app/javascript/lib/choices.js","webpack:///(webpack)/buildin/module.js","webpack:///./app/javascript/custom/pulldown-events.js","webpack:///./app/javascript/lib/headroom.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","0","global","factory","this","h","nodeName","attributes","children","EMPTY_CHILDREN","lastSimple","child","simple","arguments","length","stack","push","pop","undefined","String","VNode","key","options","vnode","extend","obj","props","applyRef","ref","value","current","cloneElement","slice","enqueueRender","component","_dirty","items","debounceRendering","defer","rerender","renderComponent","isSameNodeType","node","hydrating","splitText","_componentConstructor","isNamedNode","normalizedNodeName","toLowerCase","getNodeProps","defaultProps","createNode","isSvg","document","createElementNS","createElement","removeNode","parentNode","removeChild","setAccessor","old","style","cssText","_i","IS_NON_DIMENSIONAL","test","innerHTML","__html","useCapture","replace","substring","addEventListener","eventProxy","removeEventListener","_listeners","e","removeAttribute","ns","removeAttributeNS","setAttributeNS","setAttribute","className","type","event","flushMounts","mounts","shift","afterMount","componentDidMount","diff","dom","context","mountAll","parent","componentRoot","diffLevel","isSvgMode","ownerSVGElement","ATTR_KEY","ret","idiff","appendChild","out","prevSvgMode","_component","nodeValue","createTextNode","replaceChild","recollectNodeTree","vnodeName","buildComponentFromVNode","firstChild","fc","vchildren","a","nextSibling","innerDiffNode","dangerouslySetInnerHTML","diffAttributes","isHydrating","originalChildren","childNodes","keyed","keyedLen","min","len","childrenLen","vlen","j","f","vchild","_child","__key","trim","_key","insertBefore","_i2","unmountOnly","unmountComponent","removeChildren","lastChild","next","previousSibling","attrs","createComponent","Ctor","inst","recyclerComponents","render","Component","constructor","doRender","nextBase","splice","state","setComponentProps","renderMode","_disable","__ref","getDerivedStateFromProps","base","componentWillMount","componentWillReceiveProps","prevContext","prevProps","NO_RENDER","SYNC_RENDER","syncComponentUpdates","isChild","previousProps","previousState","prevState","previousContext","isUpdate","initialBase","initialChildComponent","skip","snapshot","rendered","cbase","FORCE_RENDER","shouldComponentUpdate","componentWillUpdate","getChildContext","getSnapshotBeforeUpdate","childComponent","toUnmount","childProps","_parentComponent","baseParent","componentRef","t","componentDidUpdate","afterUpdate","_renderCallbacks","originalComponent","oldDom","isDirectOwner","isOwner","ASYNC_RENDER","beforeUnmount","componentWillUnmount","inner","merge","createRef","Promise","resolve","then","bind","setTimeout","setState","callback","forceUpdate","preact","default","2","__webpack_exports__","defaultSortDirection","attribute","ASCENDING_ATTRIBUTES","has","getCSRFToken","_cachedCSRFToken","querySelector","content","timeAgoInWords","timestamp","timeNow","Date","timeThen","secondsAgo","Math","floor","hoursAgo","toLocaleDateString","currentUser","_cachedCurrentUser","user","getCookieJSON","getCookieValue","keyName","allCookies","decodeURIComponent","cookie","split","find","entry","cookieValue","JSON","parse","formatNumber","number","precision","round","sprintf","factor","pow","linkifyTeams","teams","abbreviations","links","map","url","text","toUpperCase","href","updateAddressBar","window","history","pushState","cleanedUpState","keys","reduce","params","k","buildNewUrl","newParams","location","pathname","stringifyParams","deserializeQueryString","queryString","pair","match","arrayValue","concat","memo","param","Array","isArray","paramName","v","encodeURIComponent","join","hasClass","el","classList","contains","RegExp","addClasses","classes","forEach","add","removeClasses","remove","popupify","selector","querySelectorAll","button","preventDefault","open","opener","__WEBPACK_IMPORTED_MODULE_0_preact__","__WEBPACK_IMPORTED_MODULE_1_sprintf__","_slicedToArray","sliceIterator","arr","_arr","_n","_d","_e","_s","Symbol","iterator","done","err","TypeError","Set","3","get_type","variable","toString","str_repeat","input","multiplier","output","str_format","cache","format","object_stringify","depth","maxdepth","seen","str","Error","indexOf","parse_tree","argv","arg","pad","pad_character","pad_length","cursor","tree_length","node_type","fromCharCode","parseInt","toExponential","parseFloat","toFixed","abs","charAt","fmt","_fmt","arg_names","exec","field_list","replacement_field","field_match","vsprintf","argvClone","unshift","apply","43","44","setupHeadroom","header","Headroom","init","scrollBy","require","readyState","setupTabs","setupUserFormListeners","choicify","setupPullDownEvents","45","tabToggles","tabs","tabPanes","tabbable","toggle","currentTarget","tab","tabPane","pane","getElementById","dataset","46","validateField","imageFields","preview","previewValidation","imageField","maxHeight","maxWidth","files","reader","FileReader","onload","image","Image","height","width","turnInvalid","src","target","result","readAsDataURL","validationButtonWarn","validationButtonGreen","turnValid","msg","message","field","validationButton","minLength","max","maxLength","regex","getAttribute","reg","checkUrl","request","XMLHttpRequest","status","responseText","send","compareWith","47","Choices","removeItemButton","callbackOnInit","textInput","containerOuter","choicesDrop","selected","getValue","stopPropagation","48","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","_typeof2","root","define","id","loaded","_interopRequireDefault","_defineProperty","writable","_toConsumableArray","arr2","from","_classCallCheck","instance","Constructor","_createClass","defineProperties","descriptor","protoProps","staticProps","_fuse","_fuse2","_classnames","_classnames2","_index","_index2","_index3","_utils","element","userConfig","isType","elements","defaultConfig","silent","choices","renderChoiceLimit","maxItemCount","addItems","removeItems","editItems","duplicateItems","delimiter","paste","searchEnabled","searchChoices","searchFloor","searchResultLimit","searchFields","position","resetScrollPosition","regexFilter","shouldSort","shouldSortItems","sortFilter","sortByAlpha","placeholder","placeholderValue","searchPlaceholderValue","prependValue","appendValue","renderSelectedChoices","loadingText","noResultsText","noChoicesText","itemSelectText","addItemText","maxItemText","uniqueItemText","classNames","containerInner","inputCloned","list","listItems","listSingle","listDropdown","item","itemSelectable","itemDisabled","itemChoice","group","groupHeading","activeState","focusState","openState","disabledState","highlightedState","hiddenState","flippedState","loadingState","noResults","noChoices","fuseOptions","include","callbackOnCreateTemplates","idNames","config","console","warn","store","initialised","currentState","currentValue","passedElement","error","isTextElement","isSelectOneElement","isSelectMultipleElement","isSelectElement","isValidElementType","isIe11","navigator","userAgent","isScrollingOnIe","highlightPosition","canSearch","presetChoices","presetItems","baseId","generateId","_onFocus","_onBlur","_onKeyUp","_onKeyDown","_onClick","_onTouchMove","_onTouchEnd","_onMouseDown","_onMouseOver","_onPaste","_onInput","wasTap","documentElement","isElement","_createTemplates","_createInput","subscribe","_addEventListeners","_removeEventListeners","origStyle","Boolean","clearStore","templates","groups","fragment","_this","groupFragment","createDocumentFragment","filter","sort","groupChoices","choice","groupId","dropdownGroup","_getTemplate","renderChoices","_this2","withinGroup","choicesFragment","_config","isSearching","sortByScore","rendererableChoices","_rendererableChoices$","acc","placeholderChoices","normalChoices","choiceLimit","sortedChoices","dropdownItem","_this3","itemListFragment","itemsFiltered","getItemsReducedToValues","itemsFilteredString","selectedOptionsFragment","option","listItem","isLoading","getState","activeGroups","getGroupsFilteredByActive","activeChoices","getChoicesFilteredByActive","choiceListFragment","choiceList","scrollTop","renderGroups","activeItems","getItemsFilteredByActive","canAddItem","_canAddItem","response","_highlightChoice","notice","_activeItems","itemList","renderItems","runEvent","getGroupById","dispatch","highlightItem","triggerEvent","label","groupValue","_this4","getItems","_this5","unhighlightItem","_this6","_removeItem","excludedId","_this7","active","_this8","highlighted","_triggerChange","focusInput","body","html","winHeight","scrollHeight","offsetHeight","clientHeight","dropdown","dimensions","getBoundingClientRect","dropdownPos","ceil","top","scrollY","shouldFlip","activeElement","focus","blurInput","isFlipped","blur","hideDropdown","showDropdown","_this9","valueOnly","selectedItems","args","_this10","values","handleValue","itemType","getType","_addItem","customProperties","_addChoice","_this11","getChoices","val","foundChoice","keyCode","_this12","replaceChoices","_clearChoices","_setLoading","_addGroup","disabled","clearAll","_setInputWidth","activateChoices","fn","_this13","requestAnimationFrame","_handleLoadingState","_ajaxCallback","itemId","itemToRemove","_selectPlaceholderChoice","placeholderChoice","getPlaceholderChoice","_this14","hasShiftKey","passedId","getChoiceById","passedKeyCode","hasActiveDropdown","clearInput","lastItem","hasHighlightedItems","some","removeHighlightedItems","_regexFilter","setLoading","placeholderItem","_this15","results","parsedResults","newValue","haystack","getSearchableChoices","needle","assign","fuse","search","filterChoices","hasUnactiveChoices","resultCount","_searchChoices","getWidthOfInput","_keyDownActions","_this16","hasFocusedInput","hasItems","keyString","ctrlDownKey","ctrlKey","metaKey","onAKey","highlightAll","onEnterKey","hasAttribute","_handleButtonAction","_handleChoiceAction","onEscapeKey","toggleDropdown","onDirectionKey","directionInt","skipKey","nextEl","currentEl","getAdjacentEl","isScrolledIntoView","_scrollToChoice","onDeleteKey","_handleBackspace","keyDownActions","outerHTML","_handleSearch","touches","foundTarget","shiftKey","findAncestorByAttrName","_handleItemAction","unhighlightAll","_this17","_this18","source","direction","_this19","dropdownHeight","choiceHeight","choicePos","offsetTop","containerScrollPos","endPoint","animateScroll","choiceListScrollTop","continueAnimation","easing","distance","time","_this20","passedEl","choiceId","passedValue","passedLabel","passedOptionId","addItem","removeActiveItems","removeItem","isSelected","isDisabled","choiceLabel","choiceElementId","addChoice","clearChoices","_this21","valueKey","labelKey","getElementsByTagName","valueOf","random","addGroup","isOptDisabled","template","_len","_this22","globalClasses","strToEl","_classNames","localClasses","data","_classNames2","_classNames3","choiceGroup","_classNames5","elementId","_classNames6","callbackTemplate","userTemplates","setIsLoading","_this23","tabIndex","wrap","disable","passedGroups","passedOptions","allChoices","hasSelectedChoice","index","shouldPreselect","log","Fuse","defaultOptions","deepValue","path","firstSegment","remaining","dotIndex","BitapSearcher","pattern","threshold","maxPatternLength","caseSensitive","patternLen","matchmask","patternAlphabet","_calculatePatternAlphabet","searchFn","sortFn","b","score","getFn","verbose","tokenize","matchAllTokens","tokenSeparator","minMatchCharLength","findAllMatches","VERSION","set","resultMap","_keyMap","_prepareSearchers","_startSearch","_computeScore","_sort","_format","tokens","tokenSearchers","fullSeacher","weight","listLen","keysLen","_analyze","entity","words","scores","existingResult","averageScore","finalScore","scoresLen","mainSearchResult","tokenSearcher","termScores","word","tokenSearchResult","hasMatchInText","checkTextMatches","exists","numTextMatches","isMatch","matchedIndices","totalScore","scoreLen","bestScore","nScore","keyMap","replaceValue","getItemAtIndex","finalOutput","_item","_result","record","matches","indices","mask","_bitapScore","errors","accuracy","proximity","textLen","bestLoc","binMin","binMid","binMax","start","finish","bitArr","lastBitArr","charMatch","locations","isMatched","matchMask","matchesLen","lastIndexOf","_getMatchedIndices","end","argType","hasOwn","_redux","Store","createStore","devToolsExtension","action","onChange","general","loading","prev","getChoicesFilteredBySelectable","getGroups","isActive","hasActiveOptions","reverse","compose","applyMiddleware","bindActionCreators","combineReducers","_createStore","_createStore2","_combineReducers","_combineReducers2","_bindActionCreators","_bindActionCreators2","_applyMiddleware","_applyMiddleware2","_compose","_compose2","_warning","reducer","preloadedState","enhancer","ensureCanMutateNextListeners","nextListeners","currentListeners","listener","isSubscribed","_isPlainObject2","isDispatching","currentReducer","listeners","replaceReducer","nextReducer","ActionTypes","INIT","observable","_ref","outerSubscribe","observer","observeState","unsubscribe","_symbolObservable2","_ref2","_isPlainObject","_symbolObservable","isPlainObject","isObjectLike","baseGetTag","objectTag","proto","getPrototype","funcToString","objectCtorString","funcProto","Function","objectProto","undefinedTag","nullTag","symToStringTag","getRawTag","objectToString","toStringTag","freeGlobal","freeSelf","self","isOwn","tag","unmasked","nativeObjectToString","overArg","getPrototypeOf","func","transform","_ponyfill","_ponyfill2","webpackPolyfill","deprecate","paths","symbolObservablePonyfill","_Symbol","getUndefinedStateErrorMessage","actionType","assertReducerShape","reducers","reducerKeys","finalReducers","finalReducerKeys","shapeAssertionError","hasChanged","nextState","previousStateForKey","nextStateForKey","errorMessage","warning","bindActionCreator","actionCreator","actionCreators","boundActionCreators","middlewares","_dispatch","chain","middlewareAPI","middleware","_extends","funcs","_items","_items2","_groups","_groups2","_choices","_choices2","_general","_general2","appReducer","rootReducer","passedState","newState","activateOptions","filteredResults","_typeof","generateChars","capitalise","txt","substr","chars","getRandomNumber","prefix","clas","whichAnimationEvent","isNode","Node","nodeType","HTMLElement","extended","prop","whichTransitionEvent","transitions","animations","getParentsUntil","elem","parents","parentType","tagName","selectorType","wrapper","getSiblings","siblings","sibling","findAncestor","cls","parentElement","attr","debounce","wait","immediate","timeout","later","callNow","clearTimeout","getElemDistance","offsetParent","getElementOffset","offset","elOffset","startEl","getScrollPosition","pageYOffset","innerHeight","isInView","stripHTML","textContent","innerText","addAnimation","animation","animationEvent","removeAnimation","tmpEl","cleanedInput","r","offsetWidth","testEl","padding","left","whiteSpace","getComputedStyle","inputStyle","fontSize","fontFamily","fontWeight","fontStyle","letterSpacing","textTransform","labelA","labelB","customArgs","CustomEvent","detail","bubbles","cancelable","dispatchEvent","evt","createEvent","initCustomEvent","toStr","isCallable","toInteger","Number","isNaN","isFinite","maxSafeInteger","toLength","arrayLike","C","T","mapFn","kValue","A","predicate","thisArg","Event","49","50","handleTeamPulldownChange","basePath","seasonParam","season","newPath","origin","handleSeasonPulldownChange","year","team","teamPulldown","wtfTeamPulldown","seasonPulldown","wtfSeasonPulldown","current_query_string","new_query_string","host","51","Debouncer","ticking","isDOMElement","replacement","normalizeTolerance","down","up","lastKnownScrollY","tolerance","scroller","onPin","onUnpin","onTop","onNotTop","onBottom","onNotBottom","features","rAF","webkitRequestAnimationFrame","mozRequestAnimationFrame","update","requestTick","rafCallback","handleEvent","cutsTheMustard","debouncer","initial","attachEvent","destroy","getScrollY","unpin","pinned","unpinned","pin","notTop","bottom","notBottom","getViewportHeight","getElementPhysicalHeight","elm","getScrollerPhysicalHeight","getDocumentHeight","getElementHeight","getScrollerHeight","isOutOfBounds","currentScrollY","pastTop","pastBottom","toleranceExceeded","shouldUnpin","scrollingDown","pastOffset","shouldPin","scrollingUp","scrollDirection"],"mappings":"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","file":"custom-fe229a618fbc60ee5102.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/packs/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 43);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n(function (global, factory) {\n\t true ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.preact = {})));\n}(this, (function (exports) { 'use strict';\n\n\tvar VNode = function VNode() {};\n\n\tvar options = {};\n\n\tvar stack = [];\n\n\tvar EMPTY_CHILDREN = [];\n\n\tfunction h(nodeName, attributes) {\n\t\tvar children = EMPTY_CHILDREN,\n\t\t lastSimple = void 0,\n\t\t child = void 0,\n\t\t simple = void 0,\n\t\t i = void 0;\n\t\tfor (i = arguments.length; i-- > 2;) {\n\t\t\tstack.push(arguments[i]);\n\t\t}\n\t\tif (attributes && attributes.children != null) {\n\t\t\tif (!stack.length) stack.push(attributes.children);\n\t\t\tdelete attributes.children;\n\t\t}\n\t\twhile (stack.length) {\n\t\t\tif ((child = stack.pop()) && child.pop !== undefined) {\n\t\t\t\tfor (i = child.length; i--;) {\n\t\t\t\t\tstack.push(child[i]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (typeof child === 'boolean') child = null;\n\n\t\t\t\tif (simple = typeof nodeName !== 'function') {\n\t\t\t\t\tif (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;\n\t\t\t\t}\n\n\t\t\t\tif (simple && lastSimple) {\n\t\t\t\t\tchildren[children.length - 1] += child;\n\t\t\t\t} else if (children === EMPTY_CHILDREN) {\n\t\t\t\t\tchildren = [child];\n\t\t\t\t} else {\n\t\t\t\t\tchildren.push(child);\n\t\t\t\t}\n\n\t\t\t\tlastSimple = simple;\n\t\t\t}\n\t\t}\n\n\t\tvar p = new VNode();\n\t\tp.nodeName = nodeName;\n\t\tp.children = children;\n\t\tp.attributes = attributes == null ? undefined : attributes;\n\t\tp.key = attributes == null ? undefined : attributes.key;\n\n\t\tif (options.vnode !== undefined) options.vnode(p);\n\n\t\treturn p;\n\t}\n\n\tfunction extend(obj, props) {\n\t for (var i in props) {\n\t obj[i] = props[i];\n\t }return obj;\n\t}\n\n\tfunction applyRef(ref, value) {\n\t if (ref) {\n\t if (typeof ref == 'function') ref(value);else ref.current = value;\n\t }\n\t}\n\n\tvar defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;\n\n\tfunction cloneElement(vnode, props) {\n\t return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);\n\t}\n\n\tvar NO_RENDER = 0;\n\n\tvar SYNC_RENDER = 1;\n\n\tvar FORCE_RENDER = 2;\n\n\tvar ASYNC_RENDER = 3;\n\n\tvar ATTR_KEY = '__preactattr_';\n\n\tvar IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\n\tvar items = [];\n\n\tfunction enqueueRender(component) {\n\t\tif (!component._dirty && (component._dirty = true) && items.push(component) == 1) {\n\t\t\t(options.debounceRendering || defer)(rerender);\n\t\t}\n\t}\n\n\tfunction rerender() {\n\t\tvar p = void 0;\n\t\twhile (p = items.pop()) {\n\t\t\tif (p._dirty) renderComponent(p);\n\t\t}\n\t}\n\n\tfunction isSameNodeType(node, vnode, hydrating) {\n\t\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\t\treturn node.splitText !== undefined;\n\t\t}\n\t\tif (typeof vnode.nodeName === 'string') {\n\t\t\treturn !node._componentConstructor && isNamedNode(node, vnode.nodeName);\n\t\t}\n\t\treturn hydrating || node._componentConstructor === vnode.nodeName;\n\t}\n\n\tfunction isNamedNode(node, nodeName) {\n\t\treturn node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();\n\t}\n\n\tfunction getNodeProps(vnode) {\n\t\tvar props = extend({}, vnode.attributes);\n\t\tprops.children = vnode.children;\n\n\t\tvar defaultProps = vnode.nodeName.defaultProps;\n\t\tif (defaultProps !== undefined) {\n\t\t\tfor (var i in defaultProps) {\n\t\t\t\tif (props[i] === undefined) {\n\t\t\t\t\tprops[i] = defaultProps[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn props;\n\t}\n\n\tfunction createNode(nodeName, isSvg) {\n\t\tvar node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);\n\t\tnode.normalizedNodeName = nodeName;\n\t\treturn node;\n\t}\n\n\tfunction removeNode(node) {\n\t\tvar parentNode = node.parentNode;\n\t\tif (parentNode) parentNode.removeChild(node);\n\t}\n\n\tfunction setAccessor(node, name, old, value, isSvg) {\n\t\tif (name === 'className') name = 'class';\n\n\t\tif (name === 'key') {} else if (name === 'ref') {\n\t\t\tapplyRef(old, null);\n\t\t\tapplyRef(value, node);\n\t\t} else if (name === 'class' && !isSvg) {\n\t\t\tnode.className = value || '';\n\t\t} else if (name === 'style') {\n\t\t\tif (!value || typeof value === 'string' || typeof old === 'string') {\n\t\t\t\tnode.style.cssText = value || '';\n\t\t\t}\n\t\t\tif (value && typeof value === 'object') {\n\t\t\t\tif (typeof old !== 'string') {\n\t\t\t\t\tfor (var i in old) {\n\t\t\t\t\t\tif (!(i in value)) node.style[i] = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var _i in value) {\n\t\t\t\t\tnode.style[_i] = typeof value[_i] === 'number' && IS_NON_DIMENSIONAL.test(_i) === false ? value[_i] + 'px' : value[_i];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (name === 'dangerouslySetInnerHTML') {\n\t\t\tif (value) node.innerHTML = value.__html || '';\n\t\t} else if (name[0] == 'o' && name[1] == 'n') {\n\t\t\tvar useCapture = name !== (name = name.replace(/Capture$/, ''));\n\t\t\tname = name.toLowerCase().substring(2);\n\t\t\tif (value) {\n\t\t\t\tif (!old) node.addEventListener(name, eventProxy, useCapture);\n\t\t\t} else {\n\t\t\t\tnode.removeEventListener(name, eventProxy, useCapture);\n\t\t\t}\n\t\t\t(node._listeners || (node._listeners = {}))[name] = value;\n\t\t} else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n\t\t\ttry {\n\t\t\t\tnode[name] = value == null ? '' : value;\n\t\t\t} catch (e) {}\n\t\t\tif ((value == null || value === false) && name != 'spellcheck') node.removeAttribute(name);\n\t\t} else {\n\t\t\tvar ns = isSvg && name !== (name = name.replace(/^xlink:?/, ''));\n\n\t\t\tif (value == null || value === false) {\n\t\t\t\tif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);\n\t\t\t} else if (typeof value !== 'function') {\n\t\t\t\tif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction eventProxy(e) {\n\t\treturn this._listeners[e.type](options.event && options.event(e) || e);\n\t}\n\n\tvar mounts = [];\n\n\tvar diffLevel = 0;\n\n\tvar isSvgMode = false;\n\n\tvar hydrating = false;\n\n\tfunction flushMounts() {\n\t\tvar c = void 0;\n\t\twhile (c = mounts.shift()) {\n\t\t\tif (options.afterMount) options.afterMount(c);\n\t\t\tif (c.componentDidMount) c.componentDidMount();\n\t\t}\n\t}\n\n\tfunction diff(dom, vnode, context, mountAll, parent, componentRoot) {\n\t\tif (!diffLevel++) {\n\t\t\tisSvgMode = parent != null && parent.ownerSVGElement !== undefined;\n\n\t\t\thydrating = dom != null && !(ATTR_KEY in dom);\n\t\t}\n\n\t\tvar ret = idiff(dom, vnode, context, mountAll, componentRoot);\n\n\t\tif (parent && ret.parentNode !== parent) parent.appendChild(ret);\n\n\t\tif (! --diffLevel) {\n\t\t\thydrating = false;\n\n\t\t\tif (!componentRoot) flushMounts();\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n\t\tvar out = dom,\n\t\t prevSvgMode = isSvgMode;\n\n\t\tif (vnode == null || typeof vnode === 'boolean') vnode = '';\n\n\t\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\t\tif (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {\n\t\t\t\tif (dom.nodeValue != vnode) {\n\t\t\t\t\tdom.nodeValue = vnode;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tout = document.createTextNode(vnode);\n\t\t\t\tif (dom) {\n\t\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\t\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tout[ATTR_KEY] = true;\n\n\t\t\treturn out;\n\t\t}\n\n\t\tvar vnodeName = vnode.nodeName;\n\t\tif (typeof vnodeName === 'function') {\n\t\t\treturn buildComponentFromVNode(dom, vnode, context, mountAll);\n\t\t}\n\n\t\tisSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;\n\n\t\tvnodeName = String(vnodeName);\n\t\tif (!dom || !isNamedNode(dom, vnodeName)) {\n\t\t\tout = createNode(vnodeName, isSvgMode);\n\n\t\t\tif (dom) {\n\t\t\t\twhile (dom.firstChild) {\n\t\t\t\t\tout.appendChild(dom.firstChild);\n\t\t\t\t}\n\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\n\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t}\n\t\t}\n\n\t\tvar fc = out.firstChild,\n\t\t props = out[ATTR_KEY],\n\t\t vchildren = vnode.children;\n\n\t\tif (props == null) {\n\t\t\tprops = out[ATTR_KEY] = {};\n\t\t\tfor (var a = out.attributes, i = a.length; i--;) {\n\t\t\t\tprops[a[i].name] = a[i].value;\n\t\t\t}\n\t\t}\n\n\t\tif (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {\n\t\t\tif (fc.nodeValue != vchildren[0]) {\n\t\t\t\tfc.nodeValue = vchildren[0];\n\t\t\t}\n\t\t} else if (vchildren && vchildren.length || fc != null) {\n\t\t\t\tinnerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);\n\t\t\t}\n\n\t\tdiffAttributes(out, vnode.attributes, props);\n\n\t\tisSvgMode = prevSvgMode;\n\n\t\treturn out;\n\t}\n\n\tfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n\t\tvar originalChildren = dom.childNodes,\n\t\t children = [],\n\t\t keyed = {},\n\t\t keyedLen = 0,\n\t\t min = 0,\n\t\t len = originalChildren.length,\n\t\t childrenLen = 0,\n\t\t vlen = vchildren ? vchildren.length : 0,\n\t\t j = void 0,\n\t\t c = void 0,\n\t\t f = void 0,\n\t\t vchild = void 0,\n\t\t child = void 0;\n\n\t\tif (len !== 0) {\n\t\t\tfor (var i = 0; i < len; i++) {\n\t\t\t\tvar _child = originalChildren[i],\n\t\t\t\t props = _child[ATTR_KEY],\n\t\t\t\t key = vlen && props ? _child._component ? _child._component.__key : props.key : null;\n\t\t\t\tif (key != null) {\n\t\t\t\t\tkeyedLen++;\n\t\t\t\t\tkeyed[key] = _child;\n\t\t\t\t} else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {\n\t\t\t\t\tchildren[childrenLen++] = _child;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (vlen !== 0) {\n\t\t\tfor (var _i = 0; _i < vlen; _i++) {\n\t\t\t\tvchild = vchildren[_i];\n\t\t\t\tchild = null;\n\n\t\t\t\tvar _key = vchild.key;\n\t\t\t\tif (_key != null) {\n\t\t\t\t\tif (keyedLen && keyed[_key] !== undefined) {\n\t\t\t\t\t\tchild = keyed[_key];\n\t\t\t\t\t\tkeyed[_key] = undefined;\n\t\t\t\t\t\tkeyedLen--;\n\t\t\t\t\t}\n\t\t\t\t} else if (min < childrenLen) {\n\t\t\t\t\t\tfor (j = min; j < childrenLen; j++) {\n\t\t\t\t\t\t\tif (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {\n\t\t\t\t\t\t\t\tchild = c;\n\t\t\t\t\t\t\t\tchildren[j] = undefined;\n\t\t\t\t\t\t\t\tif (j === childrenLen - 1) childrenLen--;\n\t\t\t\t\t\t\t\tif (j === min) min++;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tchild = idiff(child, vchild, context, mountAll);\n\n\t\t\t\tf = originalChildren[_i];\n\t\t\t\tif (child && child !== dom && child !== f) {\n\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\tdom.appendChild(child);\n\t\t\t\t\t} else if (child === f.nextSibling) {\n\t\t\t\t\t\tremoveNode(f);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.insertBefore(child, f);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (keyedLen) {\n\t\t\tfor (var _i2 in keyed) {\n\t\t\t\tif (keyed[_i2] !== undefined) recollectNodeTree(keyed[_i2], false);\n\t\t\t}\n\t\t}\n\n\t\twhile (min <= childrenLen) {\n\t\t\tif ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);\n\t\t}\n\t}\n\n\tfunction recollectNodeTree(node, unmountOnly) {\n\t\tvar component = node._component;\n\t\tif (component) {\n\t\t\tunmountComponent(component);\n\t\t} else {\n\t\t\tif (node[ATTR_KEY] != null) applyRef(node[ATTR_KEY].ref, null);\n\n\t\t\tif (unmountOnly === false || node[ATTR_KEY] == null) {\n\t\t\t\tremoveNode(node);\n\t\t\t}\n\n\t\t\tremoveChildren(node);\n\t\t}\n\t}\n\n\tfunction removeChildren(node) {\n\t\tnode = node.lastChild;\n\t\twhile (node) {\n\t\t\tvar next = node.previousSibling;\n\t\t\trecollectNodeTree(node, true);\n\t\t\tnode = next;\n\t\t}\n\t}\n\n\tfunction diffAttributes(dom, attrs, old) {\n\t\tvar name = void 0;\n\n\t\tfor (name in old) {\n\t\t\tif (!(attrs && attrs[name] != null) && old[name] != null) {\n\t\t\t\tsetAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);\n\t\t\t}\n\t\t}\n\n\t\tfor (name in attrs) {\n\t\t\tif (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {\n\t\t\t\tsetAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);\n\t\t\t}\n\t\t}\n\t}\n\n\tvar recyclerComponents = [];\n\n\tfunction createComponent(Ctor, props, context) {\n\t\tvar inst = void 0,\n\t\t i = recyclerComponents.length;\n\n\t\tif (Ctor.prototype && Ctor.prototype.render) {\n\t\t\tinst = new Ctor(props, context);\n\t\t\tComponent.call(inst, props, context);\n\t\t} else {\n\t\t\tinst = new Component(props, context);\n\t\t\tinst.constructor = Ctor;\n\t\t\tinst.render = doRender;\n\t\t}\n\n\t\twhile (i--) {\n\t\t\tif (recyclerComponents[i].constructor === Ctor) {\n\t\t\t\tinst.nextBase = recyclerComponents[i].nextBase;\n\t\t\t\trecyclerComponents.splice(i, 1);\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\n\t\treturn inst;\n\t}\n\n\tfunction doRender(props, state, context) {\n\t\treturn this.constructor(props, context);\n\t}\n\n\tfunction setComponentProps(component, props, renderMode, context, mountAll) {\n\t\tif (component._disable) return;\n\t\tcomponent._disable = true;\n\n\t\tcomponent.__ref = props.ref;\n\t\tcomponent.__key = props.key;\n\t\tdelete props.ref;\n\t\tdelete props.key;\n\n\t\tif (typeof component.constructor.getDerivedStateFromProps === 'undefined') {\n\t\t\tif (!component.base || mountAll) {\n\t\t\t\tif (component.componentWillMount) component.componentWillMount();\n\t\t\t} else if (component.componentWillReceiveProps) {\n\t\t\t\tcomponent.componentWillReceiveProps(props, context);\n\t\t\t}\n\t\t}\n\n\t\tif (context && context !== component.context) {\n\t\t\tif (!component.prevContext) component.prevContext = component.context;\n\t\t\tcomponent.context = context;\n\t\t}\n\n\t\tif (!component.prevProps) component.prevProps = component.props;\n\t\tcomponent.props = props;\n\n\t\tcomponent._disable = false;\n\n\t\tif (renderMode !== NO_RENDER) {\n\t\t\tif (renderMode === SYNC_RENDER || options.syncComponentUpdates !== false || !component.base) {\n\t\t\t\trenderComponent(component, SYNC_RENDER, mountAll);\n\t\t\t} else {\n\t\t\t\tenqueueRender(component);\n\t\t\t}\n\t\t}\n\n\t\tapplyRef(component.__ref, component);\n\t}\n\n\tfunction renderComponent(component, renderMode, mountAll, isChild) {\n\t\tif (component._disable) return;\n\n\t\tvar props = component.props,\n\t\t state = component.state,\n\t\t context = component.context,\n\t\t previousProps = component.prevProps || props,\n\t\t previousState = component.prevState || state,\n\t\t previousContext = component.prevContext || context,\n\t\t isUpdate = component.base,\n\t\t nextBase = component.nextBase,\n\t\t initialBase = isUpdate || nextBase,\n\t\t initialChildComponent = component._component,\n\t\t skip = false,\n\t\t snapshot = previousContext,\n\t\t rendered = void 0,\n\t\t inst = void 0,\n\t\t cbase = void 0;\n\n\t\tif (component.constructor.getDerivedStateFromProps) {\n\t\t\tstate = extend(extend({}, state), component.constructor.getDerivedStateFromProps(props, state));\n\t\t\tcomponent.state = state;\n\t\t}\n\n\t\tif (isUpdate) {\n\t\t\tcomponent.props = previousProps;\n\t\t\tcomponent.state = previousState;\n\t\t\tcomponent.context = previousContext;\n\t\t\tif (renderMode !== FORCE_RENDER && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {\n\t\t\t\tskip = true;\n\t\t\t} else if (component.componentWillUpdate) {\n\t\t\t\tcomponent.componentWillUpdate(props, state, context);\n\t\t\t}\n\t\t\tcomponent.props = props;\n\t\t\tcomponent.state = state;\n\t\t\tcomponent.context = context;\n\t\t}\n\n\t\tcomponent.prevProps = component.prevState = component.prevContext = component.nextBase = null;\n\t\tcomponent._dirty = false;\n\n\t\tif (!skip) {\n\t\t\trendered = component.render(props, state, context);\n\n\t\t\tif (component.getChildContext) {\n\t\t\t\tcontext = extend(extend({}, context), component.getChildContext());\n\t\t\t}\n\n\t\t\tif (isUpdate && component.getSnapshotBeforeUpdate) {\n\t\t\t\tsnapshot = component.getSnapshotBeforeUpdate(previousProps, previousState);\n\t\t\t}\n\n\t\t\tvar childComponent = rendered && rendered.nodeName,\n\t\t\t toUnmount = void 0,\n\t\t\t base = void 0;\n\n\t\t\tif (typeof childComponent === 'function') {\n\n\t\t\t\tvar childProps = getNodeProps(rendered);\n\t\t\t\tinst = initialChildComponent;\n\n\t\t\t\tif (inst && inst.constructor === childComponent && childProps.key == inst.__key) {\n\t\t\t\t\tsetComponentProps(inst, childProps, SYNC_RENDER, context, false);\n\t\t\t\t} else {\n\t\t\t\t\ttoUnmount = inst;\n\n\t\t\t\t\tcomponent._component = inst = createComponent(childComponent, childProps, context);\n\t\t\t\t\tinst.nextBase = inst.nextBase || nextBase;\n\t\t\t\t\tinst._parentComponent = component;\n\t\t\t\t\tsetComponentProps(inst, childProps, NO_RENDER, context, false);\n\t\t\t\t\trenderComponent(inst, SYNC_RENDER, mountAll, true);\n\t\t\t\t}\n\n\t\t\t\tbase = inst.base;\n\t\t\t} else {\n\t\t\t\tcbase = initialBase;\n\n\t\t\t\ttoUnmount = initialChildComponent;\n\t\t\t\tif (toUnmount) {\n\t\t\t\t\tcbase = component._component = null;\n\t\t\t\t}\n\n\t\t\t\tif (initialBase || renderMode === SYNC_RENDER) {\n\t\t\t\t\tif (cbase) cbase._component = null;\n\t\t\t\t\tbase = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (initialBase && base !== initialBase && inst !== initialChildComponent) {\n\t\t\t\tvar baseParent = initialBase.parentNode;\n\t\t\t\tif (baseParent && base !== baseParent) {\n\t\t\t\t\tbaseParent.replaceChild(base, initialBase);\n\n\t\t\t\t\tif (!toUnmount) {\n\t\t\t\t\t\tinitialBase._component = null;\n\t\t\t\t\t\trecollectNodeTree(initialBase, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (toUnmount) {\n\t\t\t\tunmountComponent(toUnmount);\n\t\t\t}\n\n\t\t\tcomponent.base = base;\n\t\t\tif (base && !isChild) {\n\t\t\t\tvar componentRef = component,\n\t\t\t\t t = component;\n\t\t\t\twhile (t = t._parentComponent) {\n\t\t\t\t\t(componentRef = t).base = base;\n\t\t\t\t}\n\t\t\t\tbase._component = componentRef;\n\t\t\t\tbase._componentConstructor = componentRef.constructor;\n\t\t\t}\n\t\t}\n\n\t\tif (!isUpdate || mountAll) {\n\t\t\tmounts.push(component);\n\t\t} else if (!skip) {\n\n\t\t\tif (component.componentDidUpdate) {\n\t\t\t\tcomponent.componentDidUpdate(previousProps, previousState, snapshot);\n\t\t\t}\n\t\t\tif (options.afterUpdate) options.afterUpdate(component);\n\t\t}\n\n\t\twhile (component._renderCallbacks.length) {\n\t\t\tcomponent._renderCallbacks.pop().call(component);\n\t\t}if (!diffLevel && !isChild) flushMounts();\n\t}\n\n\tfunction buildComponentFromVNode(dom, vnode, context, mountAll) {\n\t\tvar c = dom && dom._component,\n\t\t originalComponent = c,\n\t\t oldDom = dom,\n\t\t isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n\t\t isOwner = isDirectOwner,\n\t\t props = getNodeProps(vnode);\n\t\twhile (c && !isOwner && (c = c._parentComponent)) {\n\t\t\tisOwner = c.constructor === vnode.nodeName;\n\t\t}\n\n\t\tif (c && isOwner && (!mountAll || c._component)) {\n\t\t\tsetComponentProps(c, props, ASYNC_RENDER, context, mountAll);\n\t\t\tdom = c.base;\n\t\t} else {\n\t\t\tif (originalComponent && !isDirectOwner) {\n\t\t\t\tunmountComponent(originalComponent);\n\t\t\t\tdom = oldDom = null;\n\t\t\t}\n\n\t\t\tc = createComponent(vnode.nodeName, props, context);\n\t\t\tif (dom && !c.nextBase) {\n\t\t\t\tc.nextBase = dom;\n\n\t\t\t\toldDom = null;\n\t\t\t}\n\t\t\tsetComponentProps(c, props, SYNC_RENDER, context, mountAll);\n\t\t\tdom = c.base;\n\n\t\t\tif (oldDom && dom !== oldDom) {\n\t\t\t\toldDom._component = null;\n\t\t\t\trecollectNodeTree(oldDom, false);\n\t\t\t}\n\t\t}\n\n\t\treturn dom;\n\t}\n\n\tfunction unmountComponent(component) {\n\t\tif (options.beforeUnmount) options.beforeUnmount(component);\n\n\t\tvar base = component.base;\n\n\t\tcomponent._disable = true;\n\n\t\tif (component.componentWillUnmount) component.componentWillUnmount();\n\n\t\tcomponent.base = null;\n\n\t\tvar inner = component._component;\n\t\tif (inner) {\n\t\t\tunmountComponent(inner);\n\t\t} else if (base) {\n\t\t\tif (base[ATTR_KEY] != null) applyRef(base[ATTR_KEY].ref, null);\n\n\t\t\tcomponent.nextBase = base;\n\n\t\t\tremoveNode(base);\n\t\t\trecyclerComponents.push(component);\n\n\t\t\tremoveChildren(base);\n\t\t}\n\n\t\tapplyRef(component.__ref, null);\n\t}\n\n\tfunction Component(props, context) {\n\t\tthis._dirty = true;\n\n\t\tthis.context = context;\n\n\t\tthis.props = props;\n\n\t\tthis.state = this.state || {};\n\n\t\tthis._renderCallbacks = [];\n\t}\n\n\textend(Component.prototype, {\n\t\tsetState: function setState(state, callback) {\n\t\t\tif (!this.prevState) this.prevState = this.state;\n\t\t\tthis.state = extend(extend({}, this.state), typeof state === 'function' ? state(this.state, this.props) : state);\n\t\t\tif (callback) this._renderCallbacks.push(callback);\n\t\t\tenqueueRender(this);\n\t\t},\n\t\tforceUpdate: function forceUpdate(callback) {\n\t\t\tif (callback) this._renderCallbacks.push(callback);\n\t\t\trenderComponent(this, FORCE_RENDER);\n\t\t},\n\t\trender: function render() {}\n\t});\n\n\tfunction render(vnode, parent, merge) {\n\t return diff(merge, vnode, {}, false, parent, false);\n\t}\n\n\tfunction createRef() {\n\t\treturn {};\n\t}\n\n\tvar preact = {\n\t\th: h,\n\t\tcreateElement: h,\n\t\tcloneElement: cloneElement,\n\t\tcreateRef: createRef,\n\t\tComponent: Component,\n\t\trender: render,\n\t\trerender: rerender,\n\t\toptions: options\n\t};\n\n\texports.default = preact;\n\texports.h = h;\n\texports.createElement = h;\n\texports.cloneElement = cloneElement;\n\texports.createRef = createRef;\n\texports.Component = Component;\n\texports.render = render;\n\texports.rerender = rerender;\n\texports.options = options;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=preact.umd.js.map\n\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = defaultSortDirection;\n/* harmony export (immutable) */ __webpack_exports__[\"f\"] = getCSRFToken;\n/* harmony export (immutable) */ __webpack_exports__[\"k\"] = timeAgoInWords;\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = currentUser;\n/* unused harmony export getCookieValue */\n/* unused harmony export getCookieJSON */\n/* harmony export (immutable) */ __webpack_exports__[\"e\"] = formatNumber;\n/* unused harmony export round */\n/* harmony export (immutable) */ __webpack_exports__[\"h\"] = linkifyTeams;\n/* harmony export (immutable) */ __webpack_exports__[\"l\"] = updateAddressBar;\n/* unused harmony export buildNewUrl */\n/* harmony export (immutable) */ __webpack_exports__[\"d\"] = deserializeQueryString;\n/* unused harmony export stringifyParams */\n/* harmony export (immutable) */ __webpack_exports__[\"g\"] = hasClass;\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addClasses;\n/* harmony export (immutable) */ __webpack_exports__[\"j\"] = removeClasses;\n/* harmony export (immutable) */ __webpack_exports__[\"i\"] = popupify;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_preact__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_preact___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_preact__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_sprintf__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_sprintf___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_sprintf__);\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\n\n\nvar _cachedCSRFToken = void 0;\nvar _cachedCurrentUser = void 0;\n\n// These are attributes where fewer is better, e.g. turnovers, fouls, so the\n// default sort is ascending. We also throw in strings here (name, etc) and the \n// jersey number\nvar ASCENDING_ATTRIBUTES = new Set(['lastname', 'exact_position', 'turnovers', 'per48_turnovers', 'fouls', 'per48_fouls', 'number', 'team_abbreviations']);\n\nfunction defaultSortDirection(attribute) {\n return ASCENDING_ATTRIBUTES.has(attribute) ? 'asc' : 'desc';\n}\n\nfunction getCSRFToken() {\n if (!_cachedCSRFToken) {\n _cachedCSRFToken = document.querySelector(\"meta[name=csrf-token]\").content;\n }\n return _cachedCSRFToken;\n}\n\nfunction timeAgoInWords(timestamp) {\n // A naive assumption, but...whatever\n if (!timestamp) {\n return 'just now';\n }\n\n var timeNow = new Date();\n var timeThen = new Date(timestamp);\n var secondsAgo = (timeNow - timeThen) / 1000;\n if (secondsAgo < 120) {\n return 'just now';\n }\n\n if (secondsAgo < 3600) {\n return Math.floor(secondsAgo / 60) + ' minutes ago';\n }\n\n var hoursAgo = Math.floor(secondsAgo / 3600);\n\n if (hoursAgo === 1) {\n return '1 hour ago';\n }\n\n if (hoursAgo < 24) {\n return hoursAgo + ' hours ago';\n }\n\n return '' + timeThen.toLocaleDateString();\n}\n\nfunction currentUser() {\n if (!_cachedCurrentUser) {\n // Store wrapped in an object so that when the cookie isn't defined, we nevertheless only \n // do the lookup once.\n _cachedCurrentUser = {\n user: getCookieJSON('boxscoregeeks_user')\n };\n }\n return _cachedCurrentUser.user;\n}\n\nfunction getCookieValue(keyName) {\n if (typeof document === 'undefined') {\n return;\n }\n\n var allCookies = decodeURIComponent(document.cookie).split(';');\n\n var cookie = allCookies.find(function (entry) {\n var _entry$trim$split = entry.trim().split('='),\n _entry$trim$split2 = _slicedToArray(_entry$trim$split, 2),\n key = _entry$trim$split2[0],\n value = _entry$trim$split2[1];\n\n return key === keyName;\n });\n\n if (cookie) {\n return cookie.trim().split('=')[1];\n }\n}\n\nfunction getCookieJSON(keyName) {\n var cookieValue = getCookieValue(keyName);\n\n if (cookieValue) {\n return JSON.parse(cookieValue);\n }\n}\n\nfunction formatNumber(number) {\n var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var n = round(number, precision);\n\n if (n < 0) {\n return Object(__WEBPACK_IMPORTED_MODULE_1_sprintf__[\"sprintf\"])('%.' + precision + 'f', number).replace(/^\\-0/, '-');\n }\n\n if (number === 0) {\n return '0';\n }\n\n return Object(__WEBPACK_IMPORTED_MODULE_1_sprintf__[\"sprintf\"])('%.' + precision + 'f', number).replace(/^(\\-)?0/, '');\n}\n\nfunction round(number) {\n var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var factor = Math.pow(10, precision);\n var roundedTempNumber = Math.round(number * factor);\n\n return roundedTempNumber / factor;\n}\n\nfunction linkifyTeams(teams) {\n // todo: how does this happen? Should we log it?\n if (typeof teams != 'string') {\n return '';\n }\n\n var abbreviations = teams.split(',');\n\n if (abbreviations.length > 2) {\n return '(3+)';\n }\n\n var links = abbreviations.map(function (t) {\n var url = '/teams/' + t;\n var text = t.toUpperCase();\n return Object(__WEBPACK_IMPORTED_MODULE_0_preact__[\"h\"])(\n 'a',\n { href: url },\n text\n );\n });\n\n if (links.length === 2) {\n return Object(__WEBPACK_IMPORTED_MODULE_0_preact__[\"h\"])(\n 'span',\n null,\n links[0],\n ', ',\n links[1]\n );\n }\n\n return links[0];\n}\n\nfunction updateAddressBar(state) {\n // Catch in case you are unit testing, and for older browsers that don't do pushState\n if (typeof window == 'undefined' || window.history === void 0 || !window.history.pushState) {\n return;\n }\n\n var cleanedUpState = Object.keys(state).reduce(function (params, k) {\n if (state[k] !== void 0) {\n params[k] = state[k];\n }\n return params;\n }, {});\n\n // Note that according to spec, the second argument (title) is ignored anyway.\n window.history.pushState(cleanedUpState, 'BoxscoreGeeks', buildNewUrl(cleanedUpState));\n}\n\nfunction buildNewUrl() {\n var newParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n var url = window.location.pathname;\n\n return url + stringifyParams(newParams);\n}\n\nfunction deserializeQueryString(queryString) {\n if (!queryString) {\n return {};\n }\n\n // N.B. Don't call decodeURIComponent before splitting, b/c decoding might unescape '&' that were escaped.\n var pairs = queryString.split('&');\n\n return pairs.reduce(function (params, pair) {\n var _pair$split$map = pair.split('=').map(function (p) {\n return decodeURIComponent(p);\n }),\n _pair$split$map2 = _slicedToArray(_pair$split$map, 2),\n key = _pair$split$map2[0],\n value = _pair$split$map2[1];\n\n // handle array params like 'positions[]=SG&positions[]=SF'\n\n\n if (key.match(/\\[\\]$/)) {\n var keyName = key.replace(/\\[\\]/, '');\n var arrayValue = params[keyName] || [];\n\n params[keyName] = arrayValue.concat(value);\n } else {\n params[key] = value;\n }\n\n return params;\n }, {});\n}\n\nfunction stringifyParams(obj) {\n var params = Object.keys(obj);\n\n if (params.length === 0) {\n return '';\n }\n\n var paramPairs = params.reduce(function (memo, param) {\n var value = obj[param];\n\n if (Array.isArray(value)) {\n var paramName = param + '[]';\n return memo.concat(value.map(function (v) {\n return encodeURIComponent(paramName) + '=' + encodeURIComponent(v);\n }));\n }\n\n return memo.concat(encodeURIComponent(param) + '=' + encodeURIComponent(obj[param]));\n }, []);\n\n return '?' + paramPairs.join('&');\n}\n\nfunction hasClass(el, className) {\n if (el.classList) {\n return el.classList.contains(className);\n } else {\n return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);\n }\n}\n\nfunction addClasses(el, classes) {\n classes.forEach(function (c) {\n if (el.classList) {\n el.classList.add(c);\n } else {\n el.className += ' ' + c;\n }\n });\n\n return el;\n}\n\n// see http://youmightnotneedjquery.com/ for why the crazy regex.\nfunction removeClasses(el, classes) {\n classes.forEach(function (c) {\n if (el.classList) {\n el.classList.remove(c);\n } else {\n el.className = el.className.replace(new RegExp('(^|\\\\b)' + c.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\n }\n });\n\n return el;\n}\n\nfunction popupify(selector) {\n // TODO: move the below stuff to importables\n var buttons = document.querySelectorAll(selector);\n buttons.forEach(function (button) {\n button.addEventListener('click', function (e) {\n e.preventDefault();\n var newWindow = window.open(button.href, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=600');\n newWindow.opener = null;\n });\n });\n}\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n/**\nsprintf() for JavaScript 0.7-beta1\nhttp://www.diveintojavascript.com/projects/javascript-sprintf\n\nCopyright (c) Alexandru Marasteanu \nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of sprintf() for JavaScript nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nChangelog:\n2010.11.07 - 0.7-beta1-node\n - converted it to a node.js compatible module\n\n2010.09.06 - 0.7-beta1\n - features: vsprintf, support for named placeholders\n - enhancements: format cache, reduced global namespace pollution\n\n2010.05.22 - 0.6:\n - reverted to 0.4 and fixed the bug regarding the sign of the number 0\n Note:\n Thanks to Raphael Pigulla (http://www.n3rd.org/)\n who warned me about a bug in 0.5, I discovered that the last update was\n a regress. I appologize for that.\n\n2010.05.09 - 0.5:\n - bug fix: 0 is now preceeded with a + sign\n - bug fix: the sign was not at the right position on padded results (Kamal Abdali)\n - switched from GPL to BSD license\n\n2007.10.21 - 0.4:\n - unit test and patch (David Baird)\n\n2007.09.17 - 0.3:\n - bug fix: no longer throws exception on empty paramenters (Hans Pufal)\n\n2007.09.11 - 0.2:\n - feature: added argument swapping\n\n2007.04.03 - 0.1:\n - initial release\n**/\n\nvar sprintf = (function() {\n\tfunction get_type(variable) {\n\t\treturn Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();\n\t}\n\tfunction str_repeat(input, multiplier) {\n\t\tfor (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}\n\t\treturn output.join('');\n\t}\n\n\tvar str_format = function() {\n\t\tif (!str_format.cache.hasOwnProperty(arguments[0])) {\n\t\t\tstr_format.cache[arguments[0]] = str_format.parse(arguments[0]);\n\t\t}\n\t\treturn str_format.format.call(null, str_format.cache[arguments[0]], arguments);\n\t};\n\n\t// convert object to simple one line string without indentation or\n\t// newlines. Note that this implementation does not print array\n\t// values to their actual place for sparse arrays. \n\t//\n\t// For example sparse array like this\n\t// l = []\n\t// l[4] = 1\n\t// Would be printed as \"[1]\" instead of \"[, , , , 1]\"\n\t// \n\t// If argument 'seen' is not null and array the function will check for \n\t// circular object references from argument.\n\tstr_format.object_stringify = function(obj, depth, maxdepth, seen) {\n\t\tvar str = '';\n\t\tif (obj != null) {\n\t\t\tswitch( typeof(obj) ) {\n\t\t\tcase 'function': \n\t\t\t\treturn '[Function' + (obj.name ? ': '+obj.name : '') + ']';\n\t\t\t break;\n\t\t\tcase 'object':\n\t\t\t\tif ( obj instanceof Error) { return '[' + obj.toString() + ']' };\n\t\t\t\tif (depth >= maxdepth) return '[Object]'\n\t\t\t\tif (seen) {\n\t\t\t\t\t// add object to seen list\n\t\t\t\t\tseen = seen.slice(0)\n\t\t\t\t\tseen.push(obj);\n\t\t\t\t}\n\t\t\t\tif (obj.length != null) { //array\n\t\t\t\t\tstr += '[';\n\t\t\t\t\tvar arr = []\n\t\t\t\t\tfor (var i in obj) {\n\t\t\t\t\t\tif (seen && seen.indexOf(obj[i]) >= 0) arr.push('[Circular]');\n\t\t\t\t\t\telse arr.push(str_format.object_stringify(obj[i], depth+1, maxdepth, seen));\n\t\t\t\t\t}\n\t\t\t\t\tstr += arr.join(', ') + ']';\n\t\t\t\t} else if ('getMonth' in obj) { // date\n\t\t\t\t\treturn 'Date(' + obj + ')';\n\t\t\t\t} else { // object\n\t\t\t\t\tstr += '{';\n\t\t\t\t\tvar arr = []\n\t\t\t\t\tfor (var k in obj) { \n\t\t\t\t\t\tif(obj.hasOwnProperty(k)) {\n\t\t\t\t\t\t\tif (seen && seen.indexOf(obj[k]) >= 0) arr.push(k + ': [Circular]');\n\t\t\t\t\t\t\telse arr.push(k +': ' +str_format.object_stringify(obj[k], depth+1, maxdepth, seen)); \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstr += arr.join(', ') + '}';\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t\tbreak;\n\t\t\tcase 'string':\t\t\t\t\n\t\t\t\treturn '\"' + obj + '\"';\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn '' + obj;\n\t}\n\n\tstr_format.format = function(parse_tree, argv) {\n\t\tvar cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;\n\t\tfor (i = 0; i < tree_length; i++) {\n\t\t\tnode_type = get_type(parse_tree[i]);\n\t\t\tif (node_type === 'string') {\n\t\t\t\toutput.push(parse_tree[i]);\n\t\t\t}\n\t\t\telse if (node_type === 'array') {\n\t\t\t\tmatch = parse_tree[i]; // convenience purposes only\n\t\t\t\tif (match[2]) { // keyword argument\n\t\t\t\t\targ = argv[cursor];\n\t\t\t\t\tfor (k = 0; k < match[2].length; k++) {\n\t\t\t\t\t\tif (!arg.hasOwnProperty(match[2][k])) {\n\t\t\t\t\t\t\tthrow new Error(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]));\n\t\t\t\t\t\t}\n\t\t\t\t\t\targ = arg[match[2][k]];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (match[1]) { // positional argument (explicit)\n\t\t\t\t\targ = argv[match[1]];\n\t\t\t\t}\n\t\t\t\telse { // positional argument (implicit)\n\t\t\t\t\targ = argv[cursor++];\n\t\t\t\t}\n\n\t\t\t\tif (/[^sO]/.test(match[8]) && (get_type(arg) != 'number')) {\n\t\t\t\t\tthrow new Error(sprintf('[sprintf] expecting number but found %s \"' + arg + '\"', get_type(arg)));\n\t\t\t\t}\n\t\t\t\tswitch (match[8]) {\n\t\t\t\t\tcase 'b': arg = arg.toString(2); break;\n\t\t\t\t\tcase 'c': arg = String.fromCharCode(arg); break;\n\t\t\t\t\tcase 'd': arg = parseInt(arg, 10); break;\n\t\t\t\t\tcase 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;\n\t\t\t\t\tcase 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;\n\t\t\t\t case 'O': arg = str_format.object_stringify(arg, 0, parseInt(match[7]) || 5); break;\n\t\t\t\t\tcase 'o': arg = arg.toString(8); break;\n\t\t\t\t\tcase 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;\n\t\t\t\t\tcase 'u': arg = Math.abs(arg); break;\n\t\t\t\t\tcase 'x': arg = arg.toString(16); break;\n\t\t\t\t\tcase 'X': arg = arg.toString(16).toUpperCase(); break;\n\t\t\t\t}\n\t\t\t\targ = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);\n\t\t\t\tpad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';\n\t\t\t\tpad_length = match[6] - String(arg).length;\n\t\t\t\tpad = match[6] ? str_repeat(pad_character, pad_length) : '';\n\t\t\t\toutput.push(match[5] ? arg + pad : pad + arg);\n\t\t\t}\n\t\t}\n\t\treturn output.join('');\n\t};\n\n\tstr_format.cache = {};\n\n\tstr_format.parse = function(fmt) {\n\t\tvar _fmt = fmt, match = [], parse_tree = [], arg_names = 0;\n\t\twhile (_fmt) {\n\t\t\tif ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n\t\t\t\tparse_tree.push(match[0]);\n\t\t\t}\n\t\t\telse if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n\t\t\t\tparse_tree.push('%');\n\t\t\t}\n\t\t\telse if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosOuxX])/.exec(_fmt)) !== null) {\n\t\t\t\tif (match[2]) {\n\t\t\t\t\targ_names |= 1;\n\t\t\t\t\tvar field_list = [], replacement_field = match[2], field_match = [];\n\t\t\t\t\tif ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n\t\t\t\t\t\tfield_list.push(field_match[1]);\n\t\t\t\t\t\twhile ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n\t\t\t\t\t\t\tif ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n\t\t\t\t\t\t\t\tfield_list.push(field_match[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n\t\t\t\t\t\t\t\tfield_list.push(field_match[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthrow new Error('[sprintf] ' + replacement_field);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n throw new Error('[sprintf] ' + replacement_field);\n\t\t\t\t\t}\n\t\t\t\t\tmatch[2] = field_list;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\targ_names |= 2;\n\t\t\t\t}\n\t\t\t\tif (arg_names === 3) {\n\t\t\t\t\tthrow new Error('[sprintf] mixing positional and named placeholders is not (yet) supported');\n\t\t\t\t}\n\t\t\t\tparse_tree.push(match);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error('[sprintf] ' + _fmt);\n\t\t\t}\n\t\t\t_fmt = _fmt.substring(match[0].length);\n\t\t}\n\t\treturn parse_tree;\n\t};\n\n\treturn str_format;\n})();\n\nvar vsprintf = function(fmt, argv) {\n\tvar argvClone = argv.slice();\n\targvClone.unshift(fmt);\n\treturn sprintf.apply(null, argvClone);\n};\n\nmodule.exports = sprintf;\nsprintf.sprintf = sprintf;\nsprintf.vsprintf = vsprintf;\n\n\n/***/ }),\n\n/***/ 43:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__custom__ = __webpack_require__(44);\n\n\n/***/ }),\n\n/***/ 44:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__tabs__ = __webpack_require__(45);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__user_form_events__ = __webpack_require__(46);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__choicify__ = __webpack_require__(47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__pulldown_events__ = __webpack_require__(50);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__lib_utilities__ = __webpack_require__(2);\n\n\n\n\n\n\nvar Headroom = __webpack_require__(51);\nfunction setupHeadroom() {\n var header = document.querySelector('div.navbar-wrapper');\n var headroom = new Headroom(header);\n headroom.init();\n // This makes sure that an anchor doesn't land \"under\" the headroom header, which\n // will appear if clicking the anchor causes a \"scroll up\"\n window.addEventListener('hashchange', function () {\n scrollBy(0, -110);\n });\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', function () {\n Object(__WEBPACK_IMPORTED_MODULE_0__tabs__[\"a\" /* setupTabs */])();\n Object(__WEBPACK_IMPORTED_MODULE_1__user_form_events__[\"a\" /* setupUserFormListeners */])();\n Object(__WEBPACK_IMPORTED_MODULE_4__lib_utilities__[\"i\" /* popupify */])('.social-buttons');\n Object(__WEBPACK_IMPORTED_MODULE_2__choicify__[\"a\" /* choicify */])('.choices-select');\n Object(__WEBPACK_IMPORTED_MODULE_3__pulldown_events__[\"a\" /* setupPullDownEvents */])();\n setupHeadroom();\n });\n} else {\n Object(__WEBPACK_IMPORTED_MODULE_0__tabs__[\"a\" /* setupTabs */])();\n Object(__WEBPACK_IMPORTED_MODULE_1__user_form_events__[\"a\" /* setupUserFormListeners */])();\n Object(__WEBPACK_IMPORTED_MODULE_4__lib_utilities__[\"i\" /* popupify */])('.social-buttons');\n Object(__WEBPACK_IMPORTED_MODULE_2__choicify__[\"a\" /* choicify */])('.choices-select');\n Object(__WEBPACK_IMPORTED_MODULE_3__pulldown_events__[\"a\" /* setupPullDownEvents */])();\n setupHeadroom();\n}\n\n/***/ }),\n\n/***/ 45:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = setupTabs;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_utilities__ = __webpack_require__(2);\n\n\nfunction setupTabs() {\n var tabToggles = document.querySelectorAll('.js-tab-toggle');\n // TODO: Naively assumes only one tabset per page, which atm is true, but tabs within tabpane, or\n // multiple different tab divs on a page, ought to be possible. But FTM we're trying to just keep the\n // JS for this tiny.\n var tabs = document.querySelectorAll('.js-tab');\n var tabPanes = document.querySelectorAll('.tab-pane');\n tabToggles.forEach(function (tabbable) {\n tabbable.addEventListener('click', function (e) {\n e.preventDefault();\n var toggle = e.currentTarget;\n var tab = toggle.parentNode;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"g\" /* hasClass */])(tab, 'active')) {\n return;\n }\n\n tabs.forEach(function (t) {\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"j\" /* removeClasses */])(t, ['active']);\n });\n tabPanes.forEach(function (tabPane) {\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"j\" /* removeClasses */])(tabPane, ['active']);\n });\n\n var pane = document.getElementById(toggle.dataset.tabPane);\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"a\" /* addClasses */])(pane, ['active']);\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"a\" /* addClasses */])(tab, ['active']);\n });\n });\n}\n\n/***/ }),\n\n/***/ 46:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = setupUserFormListeners;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_utilities__ = __webpack_require__(2);\n\n\nfunction setupUserFormListeners() {\n var inputs = document.querySelectorAll('.input-validatable');\n\n inputs.forEach(function (input) {\n input.addEventListener('keyup', function (e) {\n validateField(e.currentTarget);\n });\n\n input.addEventListener('blur', function (e) {\n validateField(e.currentTarget);\n });\n });\n\n var imageFields = document.querySelectorAll('.hidden-upload-input');\n var preview = document.getElementById('js-image-preview');\n var previewValidation = document.getElementById('imageValidation');\n\n imageFields.forEach(function (imageField) {\n var maxHeight = imageField.dataset.maxHeight;\n var maxWidth = imageField.dataset.maxWidth;\n\n imageField.addEventListener('change', function (e) {\n if (imageField.files && imageField.files[0]) {\n var reader = new FileReader();\n\n reader.onload = function (e) {\n var image = new Image();\n\n image.onload = function () {\n var validHeight = maxHeight && image.height <= maxHeight;\n var validWidth = maxWidth && image.width <= maxWidth;\n if (image.width > maxWidth || image.height > maxHeight) {\n turnInvalid(previewValidation, 'Image Exceeds Max Size (' + maxWidth + ' x ' + maxHeight + ')');\n imageField.value = null;\n } else {\n preview.src = image.src;\n if (previewValidation) {\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"j\" /* removeClasses */])(previewValidation, ['field-validation-error']);\n }\n }\n };\n\n image.src = e.target.result;\n };\n\n reader.readAsDataURL(imageField.files[0]);\n }\n });\n });\n}\n\nfunction validationButtonWarn(button) {\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"j\" /* removeClasses */])(button, ['field-validation-success']);\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"a\" /* addClasses */])(button, ['field-validation-error']);\n var icon = button.querySelectorAll('i.ss-icon')[0];\n icon.innerHTML = '⛔';\n}\n\nfunction validationButtonGreen(button) {\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"j\" /* removeClasses */])(button, ['field-validation-error']);\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"a\" /* addClasses */])(button, ['field-validation-success']);\n\n var icon = button.querySelectorAll('i.ss-icon')[0];\n icon.innerHTML = '👍';\n}\n\nfunction turnValid(button) {\n var msg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n var message = button.querySelectorAll('span')[0];\n validationButtonGreen(button);\n message.innerHTML = msg;\n}\n\nfunction turnInvalid(button, msg) {\n var message = button.querySelectorAll('span')[0];\n validationButtonWarn(button);\n message.innerHTML = msg;\n}\n\nfunction validateField(field) {\n // First check validation:\n var value = field.value;\n var button = document.getElementById(field.dataset.validationButton);\n\n var min = field.dataset.minLength;\n var max = field.dataset.maxLength;\n\n if (min > 0) {\n if (value.length < min) {\n return turnInvalid(button, 'Too short');\n } else {\n turnValid(button);\n }\n }\n\n if (max > 0) {\n if (value.length > max) {\n return turnInvalid(button, 'Too long');\n } else {\n turnValid(button);\n }\n }\n\n if (field.dataset.regex) {\n if (field.getAttribute('type') === 'email') {\n // Email regex used to validate email formats. It simply asserts that\n // one (and only one) @ exists in the given string. This is mainly\n // to give user feedback and not to assert the e-mail validity.\n var reg = /^[\\w\\%\\+\\-\\.]+@[\\w\\.\\-]+\\.[A-Za-z]{2,4}$/;\n\n if (reg.test(value)) {\n turnValid(button);\n } else {\n return turnInvalid(button, 'Not a valid email');\n }\n } else {\n var reg = /^[\\w\\-]+$/;\n if (reg.test(value)) {\n turnValid(button);\n } else {\n return turnInvalid(button, 'Can only contain letters, \"-\", and \"_\"');\n }\n }\n }\n\n if (field.dataset.checkUrl) {\n var url = '/users/check_availability?nickname=' + encodeURIComponent(value);\n if (field.getAttribute('name') === 'user[email]') {\n url = '/users/check_availability?email=' + encodeURIComponent(value);\n }\n\n var request = new XMLHttpRequest();\n request.open('GET', url, true);\n\n request.onload = function () {\n if (request.status >= 200 && request.status < 400) {\n var data = JSON.parse(request.responseText);\n if (data === 0) {\n turnValid(button, 'available');\n } else {\n return turnInvalid(button, 'Already taken');\n }\n }\n };\n\n request.send();\n }\n\n if (field.dataset.compareWith) {\n var otherVal = document.getElementById(field.dataset.compareWith).value;\n if (otherVal === value) {\n turnValid(button);\n } else {\n return turnInvalid(button, 'Does not match');\n }\n }\n}\n\n/***/ }),\n\n/***/ 47:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = choicify;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_utilities__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lib_choices__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lib_choices___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__lib_choices__);\n\n\n\nfunction choicify(selector) {\n // For some reason, the new Choices() api doesn't handle the empty list case\n var choicesPulldown = document.querySelectorAll(selector);\n if (choicesPulldown.length) {\n var choices = new __WEBPACK_IMPORTED_MODULE_1__lib_choices___default.a(selector, {\n removeItemButton: true,\n // This fixes choices' annoying default behavior of ENTER selecting\n // the first option, even when you have not typed anyting\n callbackOnInit: function callbackOnInit() {\n // Beware: `this` here should refer to the choices instance, but if you change\n // this to an arrow function, it won't.\n var c = this;\n\n var textInput = c.containerOuter.querySelectorAll('.choices__input--cloned')[0];\n var choicesDrop = c.containerOuter.querySelectorAll('.choices__list.choices__list--dropdown')[0];\n\n textInput.addEventListener('keydown', function (e) {\n if (e.key === 'Enter' && e.target.value.length === 0) {\n var selected = c.getValue();\n\n e.stopPropagation();\n\n // if drop is visible, ENTER closes it, but doesn't submit\n if (Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"g\" /* hasClass */])(choicesDrop, 'is-active')) {\n Object(__WEBPACK_IMPORTED_MODULE_0__lib_utilities__[\"j\" /* removeClasses */])(choicesDrop, ['is-active']);\n e.preventDefault();\n }\n\n // otherwise, ENTER submits the form, but if nothing selected so far, \n // preventDefault() so that the form isn't submitted with this field empty.\n if (selected.length === 0) {\n e.preventDefault();\n }\n }\n });\n }\n });\n }\n}\n\n/***/ }),\n\n/***/ 48:\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*! choices.js v3.0.3 | (c) 2018 Josh Johnson | https://github.com/jshjohnson/Choices#readme */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif (( false ? 'undefined' : _typeof2(exports)) === 'object' && ( false ? 'undefined' : _typeof2(module)) === 'object') module.exports = factory();else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else if ((typeof exports === 'undefined' ? 'undefined' : _typeof2(exports)) === 'object') exports[\"Choices\"] = factory();else root[\"Choices\"] = factory();\n})(this, function () {\n\treturn (/******/function (modules) {\n\t\t\t// webpackBootstrap\n\t\t\t/******/ // The module cache\n\t\t\t/******/var installedModules = {};\n\n\t\t\t/******/ // The require function\n\t\t\t/******/function __webpack_require__(moduleId) {\n\n\t\t\t\t/******/ // Check if module is in cache\n\t\t\t\t/******/if (installedModules[moduleId])\n\t\t\t\t\t/******/return installedModules[moduleId].exports;\n\n\t\t\t\t/******/ // Create a new module (and put it into the cache)\n\t\t\t\t/******/var module = installedModules[moduleId] = {\n\t\t\t\t\t/******/exports: {},\n\t\t\t\t\t/******/id: moduleId,\n\t\t\t\t\t/******/loaded: false\n\t\t\t\t\t/******/ };\n\n\t\t\t\t/******/ // Execute the module function\n\t\t\t\t/******/modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t\t\t\t/******/ // Flag the module as loaded\n\t\t\t\t/******/module.loaded = true;\n\n\t\t\t\t/******/ // Return the exports of the module\n\t\t\t\t/******/return module.exports;\n\t\t\t\t/******/\n\t\t\t}\n\n\t\t\t/******/ // expose the modules object (__webpack_modules__)\n\t\t\t/******/__webpack_require__.m = modules;\n\n\t\t\t/******/ // expose the module cache\n\t\t\t/******/__webpack_require__.c = installedModules;\n\n\t\t\t/******/ // __webpack_public_path__\n\t\t\t/******/__webpack_require__.p = \"/assets/scripts/dist/\";\n\n\t\t\t/******/ // Load entry module and return exports\n\t\t\t/******/return __webpack_require__(0);\n\t\t\t/******/\n\t\t}(\n\t\t/************************************************************************/\n\t\t/******/[\n\t\t/* 0 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tmodule.exports = __webpack_require__(1);\n\n\t\t\t/***/\n\t\t},\n\t\t/* 1 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\tvar _createClass = function () {\n\t\t\t\tfunction defineProperties(target, props) {\n\t\t\t\t\tfor (var i = 0; i < props.length; i++) {\n\t\t\t\t\t\tvar descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n\t\t\t\t\t}\n\t\t\t\t}return function (Constructor, protoProps, staticProps) {\n\t\t\t\t\tif (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n\t\t\t\t};\n\t\t\t}();\n\n\t\t\tvar _fuse = __webpack_require__(2);\n\n\t\t\tvar _fuse2 = _interopRequireDefault(_fuse);\n\n\t\t\tvar _classnames = __webpack_require__(3);\n\n\t\t\tvar _classnames2 = _interopRequireDefault(_classnames);\n\n\t\t\tvar _index = __webpack_require__(4);\n\n\t\t\tvar _index2 = _interopRequireDefault(_index);\n\n\t\t\tvar _index3 = __webpack_require__(31);\n\n\t\t\tvar _utils = __webpack_require__(32);\n\n\t\t\t__webpack_require__(33);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { default: obj };\n\t\t\t}\n\n\t\t\tfunction _defineProperty(obj, key, value) {\n\t\t\t\tif (key in obj) {\n\t\t\t\t\tObject.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });\n\t\t\t\t} else {\n\t\t\t\t\tobj[key] = value;\n\t\t\t\t}return obj;\n\t\t\t}\n\n\t\t\tfunction _toConsumableArray(arr) {\n\t\t\t\tif (Array.isArray(arr)) {\n\t\t\t\t\tfor (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t\t\t\t\t\tarr2[i] = arr[i];\n\t\t\t\t\t}return arr2;\n\t\t\t\t} else {\n\t\t\t\t\treturn Array.from(arr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction _classCallCheck(instance, Constructor) {\n\t\t\t\tif (!(instance instanceof Constructor)) {\n\t\t\t\t\tthrow new TypeError(\"Cannot call a class as a function\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Choices\n */\n\t\t\tvar Choices = function () {\n\t\t\t\tfunction Choices() {\n\t\t\t\t\tvar element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-choice]';\n\t\t\t\t\tvar userConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t\t\t\t_classCallCheck(this, Choices);\n\n\t\t\t\t\t// If there are multiple elements, create a new instance\n\t\t\t\t\t// for each element besides the first one (as that already has an instance)\n\t\t\t\t\tif ((0, _utils.isType)('String', element)) {\n\t\t\t\t\t\tvar elements = document.querySelectorAll(element);\n\t\t\t\t\t\tif (elements.length > 1) {\n\t\t\t\t\t\t\tfor (var i = 1; i < elements.length; i++) {\n\t\t\t\t\t\t\t\tvar el = elements[i];\n\t\t\t\t\t\t\t\tnew Choices(el, userConfig);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar defaultConfig = {\n\t\t\t\t\t\tsilent: false,\n\t\t\t\t\t\titems: [],\n\t\t\t\t\t\tchoices: [],\n\t\t\t\t\t\trenderChoiceLimit: -1,\n\t\t\t\t\t\tmaxItemCount: -1,\n\t\t\t\t\t\taddItems: true,\n\t\t\t\t\t\tremoveItems: true,\n\t\t\t\t\t\tremoveItemButton: false,\n\t\t\t\t\t\teditItems: false,\n\t\t\t\t\t\tduplicateItems: true,\n\t\t\t\t\t\tdelimiter: ',',\n\t\t\t\t\t\tpaste: true,\n\t\t\t\t\t\tsearchEnabled: true,\n\t\t\t\t\t\tsearchChoices: true,\n\t\t\t\t\t\tsearchFloor: 1,\n\t\t\t\t\t\tsearchResultLimit: 4,\n\t\t\t\t\t\tsearchFields: ['label', 'value'],\n\t\t\t\t\t\tposition: 'auto',\n\t\t\t\t\t\tresetScrollPosition: true,\n\t\t\t\t\t\tregexFilter: null,\n\t\t\t\t\t\tshouldSort: true,\n\t\t\t\t\t\tshouldSortItems: false,\n\t\t\t\t\t\tsortFilter: _utils.sortByAlpha,\n\t\t\t\t\t\tplaceholder: true,\n\t\t\t\t\t\tplaceholderValue: null,\n\t\t\t\t\t\tsearchPlaceholderValue: null,\n\t\t\t\t\t\tprependValue: null,\n\t\t\t\t\t\tappendValue: null,\n\t\t\t\t\t\trenderSelectedChoices: 'auto',\n\t\t\t\t\t\tloadingText: 'Loading...',\n\t\t\t\t\t\tnoResultsText: 'No results found',\n\t\t\t\t\t\tnoChoicesText: 'No choices to choose from',\n\t\t\t\t\t\titemSelectText: 'Press to select',\n\t\t\t\t\t\taddItemText: function addItemText(value) {\n\t\t\t\t\t\t\treturn 'Press Enter to add \"' + value + '\"';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmaxItemText: function maxItemText(maxItemCount) {\n\t\t\t\t\t\t\treturn 'Only ' + maxItemCount + ' values can be added.';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuniqueItemText: 'Only unique values can be added.',\n\t\t\t\t\t\tclassNames: {\n\t\t\t\t\t\t\tcontainerOuter: 'choices',\n\t\t\t\t\t\t\tcontainerInner: 'choices__inner',\n\t\t\t\t\t\t\tinput: 'choices__input',\n\t\t\t\t\t\t\tinputCloned: 'choices__input--cloned',\n\t\t\t\t\t\t\tlist: 'choices__list',\n\t\t\t\t\t\t\tlistItems: 'choices__list--multiple',\n\t\t\t\t\t\t\tlistSingle: 'choices__list--single',\n\t\t\t\t\t\t\tlistDropdown: 'choices__list--dropdown',\n\t\t\t\t\t\t\titem: 'choices__item',\n\t\t\t\t\t\t\titemSelectable: 'choices__item--selectable',\n\t\t\t\t\t\t\titemDisabled: 'choices__item--disabled',\n\t\t\t\t\t\t\titemChoice: 'choices__item--choice',\n\t\t\t\t\t\t\tplaceholder: 'choices__placeholder',\n\t\t\t\t\t\t\tgroup: 'choices__group',\n\t\t\t\t\t\t\tgroupHeading: 'choices__heading',\n\t\t\t\t\t\t\tbutton: 'choices__button',\n\t\t\t\t\t\t\tactiveState: 'is-active',\n\t\t\t\t\t\t\tfocusState: 'is-focused',\n\t\t\t\t\t\t\topenState: 'is-open',\n\t\t\t\t\t\t\tdisabledState: 'is-disabled',\n\t\t\t\t\t\t\thighlightedState: 'is-highlighted',\n\t\t\t\t\t\t\thiddenState: 'is-hidden',\n\t\t\t\t\t\t\tflippedState: 'is-flipped',\n\t\t\t\t\t\t\tloadingState: 'is-loading',\n\t\t\t\t\t\t\tnoResults: 'has-no-results',\n\t\t\t\t\t\t\tnoChoices: 'has-no-choices'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfuseOptions: {\n\t\t\t\t\t\t\tinclude: 'score'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallbackOnInit: null,\n\t\t\t\t\t\tcallbackOnCreateTemplates: null\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.idNames = {\n\t\t\t\t\t\titemChoice: 'item-choice'\n\t\t\t\t\t};\n\n\t\t\t\t\t// Merge options with user options\n\t\t\t\t\tthis.config = (0, _utils.extend)(defaultConfig, userConfig);\n\n\t\t\t\t\tif (this.config.renderSelectedChoices !== 'auto' && this.config.renderSelectedChoices !== 'always') {\n\t\t\t\t\t\tif (!this.config.silent) {\n\t\t\t\t\t\t\tconsole.warn('renderSelectedChoices: Possible values are \\'auto\\' and \\'always\\'. Falling back to \\'auto\\'.');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.config.renderSelectedChoices = 'auto';\n\t\t\t\t\t}\n\n\t\t\t\t\t// Create data store\n\t\t\t\t\tthis.store = new _index2.default(this.render);\n\n\t\t\t\t\t// State tracking\n\t\t\t\t\tthis.initialised = false;\n\t\t\t\t\tthis.currentState = {};\n\t\t\t\t\tthis.prevState = {};\n\t\t\t\t\tthis.currentValue = '';\n\n\t\t\t\t\t// Retrieve triggering element (i.e. element with 'data-choice' trigger)\n\t\t\t\t\tthis.element = element;\n\t\t\t\t\tthis.passedElement = (0, _utils.isType)('String', element) ? document.querySelector(element) : element;\n\n\t\t\t\t\tif (!this.passedElement) {\n\t\t\t\t\t\tif (!this.config.silent) {\n\t\t\t\t\t\t\tconsole.error('Passed element not found');\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.isTextElement = this.passedElement.type === 'text';\n\t\t\t\t\tthis.isSelectOneElement = this.passedElement.type === 'select-one';\n\t\t\t\t\tthis.isSelectMultipleElement = this.passedElement.type === 'select-multiple';\n\t\t\t\t\tthis.isSelectElement = this.isSelectOneElement || this.isSelectMultipleElement;\n\t\t\t\t\tthis.isValidElementType = this.isTextElement || this.isSelectElement;\n\t\t\t\t\tthis.isIe11 = !!(navigator.userAgent.match(/Trident/) && navigator.userAgent.match(/rv[ :]11/));\n\t\t\t\t\tthis.isScrollingOnIe = false;\n\n\t\t\t\t\tif (this.config.shouldSortItems === true && this.isSelectOneElement) {\n\t\t\t\t\t\tif (!this.config.silent) {\n\t\t\t\t\t\t\tconsole.warn('shouldSortElements: Type of passed element is \\'select-one\\', falling back to false.');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.highlightPosition = 0;\n\t\t\t\t\tthis.canSearch = this.config.searchEnabled;\n\n\t\t\t\t\tthis.placeholder = false;\n\t\t\t\t\tif (!this.isSelectOneElement) {\n\t\t\t\t\t\tthis.placeholder = this.config.placeholder ? this.config.placeholderValue || this.passedElement.getAttribute('placeholder') : false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Assign preset choices from passed object\n\t\t\t\t\tthis.presetChoices = this.config.choices;\n\n\t\t\t\t\t// Assign preset items from passed object first\n\t\t\t\t\tthis.presetItems = this.config.items;\n\n\t\t\t\t\t// Then add any values passed from attribute\n\t\t\t\t\tif (this.passedElement.value) {\n\t\t\t\t\t\tthis.presetItems = this.presetItems.concat(this.passedElement.value.split(this.config.delimiter));\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set unique base Id\n\t\t\t\t\tthis.baseId = (0, _utils.generateId)(this.passedElement, 'choices-');\n\n\t\t\t\t\t// Bind methods\n\t\t\t\t\tthis.render = this.render.bind(this);\n\n\t\t\t\t\t// Bind event handlers\n\t\t\t\t\tthis._onFocus = this._onFocus.bind(this);\n\t\t\t\t\tthis._onBlur = this._onBlur.bind(this);\n\t\t\t\t\tthis._onKeyUp = this._onKeyUp.bind(this);\n\t\t\t\t\tthis._onKeyDown = this._onKeyDown.bind(this);\n\t\t\t\t\tthis._onClick = this._onClick.bind(this);\n\t\t\t\t\tthis._onTouchMove = this._onTouchMove.bind(this);\n\t\t\t\t\tthis._onTouchEnd = this._onTouchEnd.bind(this);\n\t\t\t\t\tthis._onMouseDown = this._onMouseDown.bind(this);\n\t\t\t\t\tthis._onMouseOver = this._onMouseOver.bind(this);\n\t\t\t\t\tthis._onPaste = this._onPaste.bind(this);\n\t\t\t\t\tthis._onInput = this._onInput.bind(this);\n\n\t\t\t\t\t// Monitor touch taps/scrolls\n\t\t\t\t\tthis.wasTap = true;\n\n\t\t\t\t\t// Cutting the mustard\n\t\t\t\t\tvar cuttingTheMustard = 'classList' in document.documentElement;\n\t\t\t\t\tif (!cuttingTheMustard && !this.config.silent) {\n\t\t\t\t\t\tconsole.error('Choices: Your browser doesn\\'t support Choices');\n\t\t\t\t\t}\n\n\t\t\t\t\tvar canInit = (0, _utils.isElement)(this.passedElement) && this.isValidElementType;\n\n\t\t\t\t\tif (canInit) {\n\t\t\t\t\t\t// If element has already been initialised with Choices\n\t\t\t\t\t\tif (this.passedElement.getAttribute('data-choice') === 'active') {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Let's go\n\t\t\t\t\t\tthis.init();\n\t\t\t\t\t} else if (!this.config.silent) {\n\t\t\t\t\t\tconsole.error('Incompatible input passed');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/*========================================\n = Public functions =\n ========================================*/\n\n\t\t\t\t/**\n * Initialise Choices\n * @return\n * @public\n */\n\n\t\t\t\t_createClass(Choices, [{\n\t\t\t\t\tkey: 'init',\n\t\t\t\t\tvalue: function init() {\n\t\t\t\t\t\tif (this.initialised === true) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar callback = this.config.callbackOnInit;\n\n\t\t\t\t\t\t// Set initialise flag\n\t\t\t\t\t\tthis.initialised = true;\n\t\t\t\t\t\t// Create required elements\n\t\t\t\t\t\tthis._createTemplates();\n\t\t\t\t\t\t// Generate input markup\n\t\t\t\t\t\tthis._createInput();\n\t\t\t\t\t\t// Subscribe store to render method\n\t\t\t\t\t\tthis.store.subscribe(this.render);\n\t\t\t\t\t\t// Render any items\n\t\t\t\t\t\tthis.render();\n\t\t\t\t\t\t// Trigger event listeners\n\t\t\t\t\t\tthis._addEventListeners();\n\n\t\t\t\t\t\t// Run callback if it is a function\n\t\t\t\t\t\tif (callback) {\n\t\t\t\t\t\t\tif ((0, _utils.isType)('Function', callback)) {\n\t\t\t\t\t\t\t\tcallback.call(this);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Destroy Choices and nullify values\n * @return\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'destroy',\n\t\t\t\t\tvalue: function destroy() {\n\t\t\t\t\t\tif (this.initialised === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Remove all event listeners\n\t\t\t\t\t\tthis._removeEventListeners();\n\n\t\t\t\t\t\t// Reinstate passed element\n\t\t\t\t\t\tthis.passedElement.classList.remove(this.config.classNames.input, this.config.classNames.hiddenState);\n\t\t\t\t\t\tthis.passedElement.removeAttribute('tabindex');\n\t\t\t\t\t\t// Recover original styles if any\n\t\t\t\t\t\tvar origStyle = this.passedElement.getAttribute('data-choice-orig-style');\n\t\t\t\t\t\tif (Boolean(origStyle)) {\n\t\t\t\t\t\t\tthis.passedElement.removeAttribute('data-choice-orig-style');\n\t\t\t\t\t\t\tthis.passedElement.setAttribute('style', origStyle);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.passedElement.removeAttribute('style');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.passedElement.removeAttribute('aria-hidden');\n\t\t\t\t\t\tthis.passedElement.removeAttribute('data-choice');\n\n\t\t\t\t\t\t// Re-assign values - this is weird, I know\n\t\t\t\t\t\tthis.passedElement.value = this.passedElement.value;\n\n\t\t\t\t\t\t// Move passed element back to original position\n\t\t\t\t\t\tthis.containerOuter.parentNode.insertBefore(this.passedElement, this.containerOuter);\n\t\t\t\t\t\t// Remove added elements\n\t\t\t\t\t\tthis.containerOuter.parentNode.removeChild(this.containerOuter);\n\n\t\t\t\t\t\t// Clear data store\n\t\t\t\t\t\tthis.clearStore();\n\n\t\t\t\t\t\t// Nullify instance-specific data\n\t\t\t\t\t\tthis.config.templates = null;\n\n\t\t\t\t\t\t// Uninitialise\n\t\t\t\t\t\tthis.initialised = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Render group choices into a DOM fragment and append to choice list\n * @param {Array} groups Groups to add to list\n * @param {Array} choices Choices to add to groups\n * @param {DocumentFragment} fragment Fragment to add groups and options to (optional)\n * @return {DocumentFragment} Populated options fragment\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'renderGroups',\n\t\t\t\t\tvalue: function renderGroups(groups, choices, fragment) {\n\t\t\t\t\t\tvar _this = this;\n\n\t\t\t\t\t\tvar groupFragment = fragment || document.createDocumentFragment();\n\t\t\t\t\t\tvar filter = this.config.sortFilter;\n\n\t\t\t\t\t\t// If sorting is enabled, filter groups\n\t\t\t\t\t\tif (this.config.shouldSort) {\n\t\t\t\t\t\t\tgroups.sort(filter);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgroups.forEach(function (group) {\n\t\t\t\t\t\t\t// Grab options that are children of this group\n\t\t\t\t\t\t\tvar groupChoices = choices.filter(function (choice) {\n\t\t\t\t\t\t\t\tif (_this.isSelectOneElement) {\n\t\t\t\t\t\t\t\t\treturn choice.groupId === group.id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn choice.groupId === group.id && !choice.selected;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (groupChoices.length >= 1) {\n\t\t\t\t\t\t\t\tvar dropdownGroup = _this._getTemplate('choiceGroup', group);\n\t\t\t\t\t\t\t\tgroupFragment.appendChild(dropdownGroup);\n\t\t\t\t\t\t\t\t_this.renderChoices(groupChoices, groupFragment, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn groupFragment;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Render choices into a DOM fragment and append to choice list\n * @param {Array} choices Choices to add to list\n * @param {DocumentFragment} fragment Fragment to add choices to (optional)\n * @return {DocumentFragment} Populated choices fragment\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'renderChoices',\n\t\t\t\t\tvalue: function renderChoices(choices, fragment) {\n\t\t\t\t\t\tvar _this2 = this;\n\n\t\t\t\t\t\tvar withinGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t\t\t\t\t\t// Create a fragment to store our list items (so we don't have to update the DOM for each item)\n\t\t\t\t\t\tvar choicesFragment = fragment || document.createDocumentFragment();\n\t\t\t\t\t\tvar _config = this.config,\n\t\t\t\t\t\t renderSelectedChoices = _config.renderSelectedChoices,\n\t\t\t\t\t\t searchResultLimit = _config.searchResultLimit,\n\t\t\t\t\t\t renderChoiceLimit = _config.renderChoiceLimit;\n\n\t\t\t\t\t\tvar filter = this.isSearching ? _utils.sortByScore : this.config.sortFilter;\n\t\t\t\t\t\tvar appendChoice = function appendChoice(choice) {\n\t\t\t\t\t\t\tvar shouldRender = renderSelectedChoices === 'auto' ? _this2.isSelectOneElement || !choice.selected : true;\n\t\t\t\t\t\t\tif (shouldRender) {\n\t\t\t\t\t\t\t\tvar dropdownItem = _this2._getTemplate('choice', choice);\n\t\t\t\t\t\t\t\tchoicesFragment.appendChild(dropdownItem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar rendererableChoices = choices;\n\n\t\t\t\t\t\tif (renderSelectedChoices === 'auto' && !this.isSelectOneElement) {\n\t\t\t\t\t\t\trendererableChoices = choices.filter(function (choice) {\n\t\t\t\t\t\t\t\treturn !choice.selected;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Split array into placeholders and \"normal\" choices\n\n\t\t\t\t\t\tvar _rendererableChoices$ = rendererableChoices.reduce(function (acc, choice) {\n\t\t\t\t\t\t\tif (choice.placeholder) {\n\t\t\t\t\t\t\t\tacc.placeholderChoices.push(choice);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tacc.normalChoices.push(choice);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, { placeholderChoices: [], normalChoices: [] }),\n\t\t\t\t\t\t placeholderChoices = _rendererableChoices$.placeholderChoices,\n\t\t\t\t\t\t normalChoices = _rendererableChoices$.normalChoices;\n\n\t\t\t\t\t\t// If sorting is enabled or the user is searching, filter choices\n\n\n\t\t\t\t\t\tif (this.config.shouldSort || this.isSearching) {\n\t\t\t\t\t\t\tnormalChoices.sort(filter);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar choiceLimit = rendererableChoices.length;\n\n\t\t\t\t\t\t// Prepend placeholeder\n\t\t\t\t\t\tvar sortedChoices = [].concat(_toConsumableArray(placeholderChoices), _toConsumableArray(normalChoices));\n\n\t\t\t\t\t\tif (this.isSearching) {\n\t\t\t\t\t\t\tchoiceLimit = searchResultLimit;\n\t\t\t\t\t\t} else if (renderChoiceLimit > 0 && !withinGroup) {\n\t\t\t\t\t\t\tchoiceLimit = renderChoiceLimit;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Add each choice to dropdown within range\n\t\t\t\t\t\tfor (var i = 0; i < choiceLimit; i++) {\n\t\t\t\t\t\t\tif (sortedChoices[i]) {\n\t\t\t\t\t\t\t\tappendChoice(sortedChoices[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn choicesFragment;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Render items into a DOM fragment and append to items list\n * @param {Array} items Items to add to list\n * @param {DocumentFragment} [fragment] Fragment to add items to (optional)\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'renderItems',\n\t\t\t\t\tvalue: function renderItems(items) {\n\t\t\t\t\t\tvar _this3 = this;\n\n\t\t\t\t\t\tvar fragment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t\t\t\t\t\t// Create fragment to add elements to\n\t\t\t\t\t\tvar itemListFragment = fragment || document.createDocumentFragment();\n\n\t\t\t\t\t\t// If sorting is enabled, filter items\n\t\t\t\t\t\tif (this.config.shouldSortItems && !this.isSelectOneElement) {\n\t\t\t\t\t\t\titems.sort(this.config.sortFilter);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.isTextElement) {\n\t\t\t\t\t\t\t// Simplify store data to just values\n\t\t\t\t\t\t\tvar itemsFiltered = this.store.getItemsReducedToValues(items);\n\t\t\t\t\t\t\tvar itemsFilteredString = itemsFiltered.join(this.config.delimiter);\n\t\t\t\t\t\t\t// Update the value of the hidden input\n\t\t\t\t\t\t\tthis.passedElement.setAttribute('value', itemsFilteredString);\n\t\t\t\t\t\t\tthis.passedElement.value = itemsFilteredString;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar selectedOptionsFragment = document.createDocumentFragment();\n\n\t\t\t\t\t\t\t// Add each list item to list\n\t\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\t\t// Create a standard select option\n\t\t\t\t\t\t\t\tvar option = _this3._getTemplate('option', item);\n\t\t\t\t\t\t\t\t// Append it to fragment\n\t\t\t\t\t\t\t\tselectedOptionsFragment.appendChild(option);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// Update selected choices\n\t\t\t\t\t\t\tthis.passedElement.innerHTML = '';\n\t\t\t\t\t\t\tthis.passedElement.appendChild(selectedOptionsFragment);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Add each list item to list\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\t// Create new list element\n\t\t\t\t\t\t\tvar listItem = _this3._getTemplate('item', item);\n\t\t\t\t\t\t\t// Append it to list\n\t\t\t\t\t\t\titemListFragment.appendChild(listItem);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn itemListFragment;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Render DOM with values\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'render',\n\t\t\t\t\tvalue: function render() {\n\t\t\t\t\t\tif (this.store.isLoading()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.currentState = this.store.getState();\n\n\t\t\t\t\t\t// Only render if our state has actually changed\n\t\t\t\t\t\tif (this.currentState !== this.prevState) {\n\t\t\t\t\t\t\t// Choices\n\t\t\t\t\t\t\tif (this.currentState.choices !== this.prevState.choices || this.currentState.groups !== this.prevState.groups || this.currentState.items !== this.prevState.items) {\n\t\t\t\t\t\t\t\tif (this.isSelectElement) {\n\t\t\t\t\t\t\t\t\t// Get active groups/choices\n\t\t\t\t\t\t\t\t\tvar activeGroups = this.store.getGroupsFilteredByActive();\n\t\t\t\t\t\t\t\t\tvar activeChoices = this.store.getChoicesFilteredByActive();\n\n\t\t\t\t\t\t\t\t\tvar choiceListFragment = document.createDocumentFragment();\n\n\t\t\t\t\t\t\t\t\t// Clear choices\n\t\t\t\t\t\t\t\t\tthis.choiceList.innerHTML = '';\n\n\t\t\t\t\t\t\t\t\t// Scroll back to top of choices list\n\t\t\t\t\t\t\t\t\tif (this.config.resetScrollPosition) {\n\t\t\t\t\t\t\t\t\t\tthis.choiceList.scrollTop = 0;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// If we have grouped options\n\t\t\t\t\t\t\t\t\tif (activeGroups.length >= 1 && this.isSearching !== true) {\n\t\t\t\t\t\t\t\t\t\tchoiceListFragment = this.renderGroups(activeGroups, activeChoices, choiceListFragment);\n\t\t\t\t\t\t\t\t\t} else if (activeChoices.length >= 1) {\n\t\t\t\t\t\t\t\t\t\tchoiceListFragment = this.renderChoices(activeChoices, choiceListFragment);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar activeItems = this.store.getItemsFilteredByActive();\n\t\t\t\t\t\t\t\t\tvar canAddItem = this._canAddItem(activeItems, this.input.value);\n\n\t\t\t\t\t\t\t\t\t// If we have choices to show\n\t\t\t\t\t\t\t\t\tif (choiceListFragment.childNodes && choiceListFragment.childNodes.length > 0) {\n\t\t\t\t\t\t\t\t\t\t// ...and we can select them\n\t\t\t\t\t\t\t\t\t\tif (canAddItem.response) {\n\t\t\t\t\t\t\t\t\t\t\t// ...append them and highlight the first choice\n\t\t\t\t\t\t\t\t\t\t\tthis.choiceList.appendChild(choiceListFragment);\n\t\t\t\t\t\t\t\t\t\t\tthis._highlightChoice();\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t// ...otherwise show a notice\n\t\t\t\t\t\t\t\t\t\t\tthis.choiceList.appendChild(this._getTemplate('notice', canAddItem.notice));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Otherwise show a notice\n\t\t\t\t\t\t\t\t\t\tvar dropdownItem = void 0;\n\t\t\t\t\t\t\t\t\t\tvar notice = void 0;\n\n\t\t\t\t\t\t\t\t\t\tif (this.isSearching) {\n\t\t\t\t\t\t\t\t\t\t\tnotice = (0, _utils.isType)('Function', this.config.noResultsText) ? this.config.noResultsText() : this.config.noResultsText;\n\n\t\t\t\t\t\t\t\t\t\t\tdropdownItem = this._getTemplate('notice', notice, 'no-results');\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tnotice = (0, _utils.isType)('Function', this.config.noChoicesText) ? this.config.noChoicesText() : this.config.noChoicesText;\n\n\t\t\t\t\t\t\t\t\t\t\tdropdownItem = this._getTemplate('notice', notice, 'no-choices');\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tthis.choiceList.appendChild(dropdownItem);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Items\n\t\t\t\t\t\t\tif (this.currentState.items !== this.prevState.items) {\n\t\t\t\t\t\t\t\t// Get active items (items that can be selected)\n\t\t\t\t\t\t\t\tvar _activeItems = this.store.getItemsFilteredByActive();\n\n\t\t\t\t\t\t\t\t// Clear list\n\t\t\t\t\t\t\t\tthis.itemList.innerHTML = '';\n\n\t\t\t\t\t\t\t\tif (_activeItems && _activeItems) {\n\t\t\t\t\t\t\t\t\t// Create a fragment to store our list items\n\t\t\t\t\t\t\t\t\t// (so we don't have to update the DOM for each item)\n\t\t\t\t\t\t\t\t\tvar itemListFragment = this.renderItems(_activeItems);\n\n\t\t\t\t\t\t\t\t\t// If we have items to add\n\t\t\t\t\t\t\t\t\tif (itemListFragment.childNodes) {\n\t\t\t\t\t\t\t\t\t\t// Update list\n\t\t\t\t\t\t\t\t\t\tthis.itemList.appendChild(itemListFragment);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.prevState = this.currentState;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Select item (a selected item can be deleted)\n * @param {Element} item Element to select\n * @param {Boolean} [runEvent=true] Whether to trigger 'highlightItem' event\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'highlightItem',\n\t\t\t\t\tvalue: function highlightItem(item) {\n\t\t\t\t\t\tvar runEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t\t\t\t\t\tif (!item) {\n\t\t\t\t\t\t\treturn this;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar id = item.id;\n\t\t\t\t\t\tvar groupId = item.groupId;\n\t\t\t\t\t\tvar group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.highlightItem)(id, true));\n\n\t\t\t\t\t\tif (runEvent) {\n\t\t\t\t\t\t\tif (group && group.value) {\n\t\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'highlightItem', {\n\t\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\t\t\t\tlabel: item.label,\n\t\t\t\t\t\t\t\t\tgroupValue: group.value\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'highlightItem', {\n\t\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\t\t\t\tlabel: item.label\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Deselect item\n * @param {Element} item Element to de-select\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'unhighlightItem',\n\t\t\t\t\tvalue: function unhighlightItem(item) {\n\t\t\t\t\t\tif (!item) {\n\t\t\t\t\t\t\treturn this;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar id = item.id;\n\t\t\t\t\t\tvar groupId = item.groupId;\n\t\t\t\t\t\tvar group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.highlightItem)(id, false));\n\n\t\t\t\t\t\tif (group && group.value) {\n\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'unhighlightItem', {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\t\t\tlabel: item.label,\n\t\t\t\t\t\t\t\tgroupValue: group.value\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'unhighlightItem', {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\tvalue: item.value,\n\t\t\t\t\t\t\t\tlabel: item.label\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Highlight items within store\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'highlightAll',\n\t\t\t\t\tvalue: function highlightAll() {\n\t\t\t\t\t\tvar _this4 = this;\n\n\t\t\t\t\t\tvar items = this.store.getItems();\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\t_this4.highlightItem(item);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Deselect items within store\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'unhighlightAll',\n\t\t\t\t\tvalue: function unhighlightAll() {\n\t\t\t\t\t\tvar _this5 = this;\n\n\t\t\t\t\t\tvar items = this.store.getItems();\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\t_this5.unhighlightItem(item);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Remove an item from the store by its value\n * @param {String} value Value to search for\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'removeItemsByValue',\n\t\t\t\t\tvalue: function removeItemsByValue(value) {\n\t\t\t\t\t\tvar _this6 = this;\n\n\t\t\t\t\t\tif (!value || !(0, _utils.isType)('String', value)) {\n\t\t\t\t\t\t\treturn this;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar items = this.store.getItemsFilteredByActive();\n\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\tif (item.value === value) {\n\t\t\t\t\t\t\t\t_this6._removeItem(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Remove all items from store array\n * @note Removed items are soft deleted\n * @param {Number} excludedId Optionally exclude item by ID\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'removeActiveItems',\n\t\t\t\t\tvalue: function removeActiveItems(excludedId) {\n\t\t\t\t\t\tvar _this7 = this;\n\n\t\t\t\t\t\tvar items = this.store.getItemsFilteredByActive();\n\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\tif (item.active && excludedId !== item.id) {\n\t\t\t\t\t\t\t\t_this7._removeItem(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Remove all selected items from store\n * @note Removed items are soft deleted\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'removeHighlightedItems',\n\t\t\t\t\tvalue: function removeHighlightedItems() {\n\t\t\t\t\t\tvar _this8 = this;\n\n\t\t\t\t\t\tvar runEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t\t\t\t\t\tvar items = this.store.getItemsFilteredByActive();\n\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\tif (item.highlighted && item.active) {\n\t\t\t\t\t\t\t\t_this8._removeItem(item);\n\t\t\t\t\t\t\t\t// If this action was performed by the user\n\t\t\t\t\t\t\t\t// trigger the event\n\t\t\t\t\t\t\t\tif (runEvent) {\n\t\t\t\t\t\t\t\t\t_this8._triggerChange(item.value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Show dropdown to user by adding active state class\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'showDropdown',\n\t\t\t\t\tvalue: function showDropdown() {\n\t\t\t\t\t\tvar focusInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t\t\t\t\t\tvar body = document.body;\n\t\t\t\t\t\tvar html = document.documentElement;\n\t\t\t\t\t\tvar winHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n\n\t\t\t\t\t\tthis.containerOuter.classList.add(this.config.classNames.openState);\n\t\t\t\t\t\tthis.containerOuter.setAttribute('aria-expanded', 'true');\n\t\t\t\t\t\tthis.dropdown.classList.add(this.config.classNames.activeState);\n\t\t\t\t\t\tthis.dropdown.setAttribute('aria-expanded', 'true');\n\n\t\t\t\t\t\tvar dimensions = this.dropdown.getBoundingClientRect();\n\t\t\t\t\t\tvar dropdownPos = Math.ceil(dimensions.top + window.scrollY + this.dropdown.offsetHeight);\n\n\t\t\t\t\t\t// If flip is enabled and the dropdown bottom position is greater than the window height flip the dropdown.\n\t\t\t\t\t\tvar shouldFlip = false;\n\t\t\t\t\t\tif (this.config.position === 'auto') {\n\t\t\t\t\t\t\tshouldFlip = dropdownPos >= winHeight;\n\t\t\t\t\t\t} else if (this.config.position === 'top') {\n\t\t\t\t\t\t\tshouldFlip = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (shouldFlip) {\n\t\t\t\t\t\t\tthis.containerOuter.classList.add(this.config.classNames.flippedState);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Optionally focus the input if we have a search input\n\t\t\t\t\t\tif (focusInput && this.canSearch && document.activeElement !== this.input) {\n\t\t\t\t\t\t\tthis.input.focus();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'showDropdown', {});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Hide dropdown from user\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'hideDropdown',\n\t\t\t\t\tvalue: function hideDropdown() {\n\t\t\t\t\t\tvar blurInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t\t\t\t\t\t// A dropdown flips if it does not have space within the page\n\t\t\t\t\t\tvar isFlipped = this.containerOuter.classList.contains(this.config.classNames.flippedState);\n\n\t\t\t\t\t\tthis.containerOuter.classList.remove(this.config.classNames.openState);\n\t\t\t\t\t\tthis.containerOuter.setAttribute('aria-expanded', 'false');\n\t\t\t\t\t\tthis.dropdown.classList.remove(this.config.classNames.activeState);\n\t\t\t\t\t\tthis.dropdown.setAttribute('aria-expanded', 'false');\n\n\t\t\t\t\t\tif (isFlipped) {\n\t\t\t\t\t\t\tthis.containerOuter.classList.remove(this.config.classNames.flippedState);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Optionally blur the input if we have a search input\n\t\t\t\t\t\tif (blurInput && this.canSearch && document.activeElement === this.input) {\n\t\t\t\t\t\t\tthis.input.blur();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'hideDropdown', {});\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Determine whether to hide or show dropdown based on its current state\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'toggleDropdown',\n\t\t\t\t\tvalue: function toggleDropdown() {\n\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\tthis.hideDropdown();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.showDropdown(true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get value(s) of input (i.e. inputted items (text) or selected choices (select))\n * @param {Boolean} valueOnly Get only values of selected items, otherwise return selected items\n * @return {Array/String} selected value (select-one) or array of selected items (inputs & select-multiple)\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getValue',\n\t\t\t\t\tvalue: function getValue() {\n\t\t\t\t\t\tvar _this9 = this;\n\n\t\t\t\t\t\tvar valueOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t\t\t\t\t\tvar items = this.store.getItemsFilteredByActive();\n\t\t\t\t\t\tvar selectedItems = [];\n\n\t\t\t\t\t\titems.forEach(function (item) {\n\t\t\t\t\t\t\tif (_this9.isTextElement) {\n\t\t\t\t\t\t\t\tselectedItems.push(valueOnly ? item.value : item);\n\t\t\t\t\t\t\t} else if (item.active) {\n\t\t\t\t\t\t\t\tselectedItems.push(valueOnly ? item.value : item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\treturn selectedItems[0];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn selectedItems;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Set value of input. If the input is a select box, a choice will be created and selected otherwise\n * an item will created directly.\n * @param {Array} args Array of value objects or value strings\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'setValue',\n\t\t\t\t\tvalue: function setValue(args) {\n\t\t\t\t\t\tvar _this10 = this;\n\n\t\t\t\t\t\tif (this.initialised === true) {\n\t\t\t\t\t\t\t// Convert args to an iterable array\n\t\t\t\t\t\t\tvar values = [].concat(_toConsumableArray(args)),\n\t\t\t\t\t\t\t handleValue = function handleValue(item) {\n\t\t\t\t\t\t\t\tvar itemType = (0, _utils.getType)(item);\n\t\t\t\t\t\t\t\tif (itemType === 'Object') {\n\t\t\t\t\t\t\t\t\tif (!item.value) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// If we are dealing with a select input, we need to create an option first\n\t\t\t\t\t\t\t\t\t// that is then selected. For text inputs we can just add items normally.\n\t\t\t\t\t\t\t\t\tif (!_this10.isTextElement) {\n\t\t\t\t\t\t\t\t\t\t_this10._addChoice(item.value, item.label, true, false, -1, item.customProperties, item.placeholder);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t_this10._addItem(item.value, item.label, item.id, undefined, item.customProperties, item.placeholder);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (itemType === 'String') {\n\t\t\t\t\t\t\t\t\tif (!_this10.isTextElement) {\n\t\t\t\t\t\t\t\t\t\t_this10._addChoice(item, item, true, false, -1, null);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t_this10._addItem(item);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tif (values.length > 1) {\n\t\t\t\t\t\t\t\tvalues.forEach(function (value) {\n\t\t\t\t\t\t\t\t\thandleValue(value);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thandleValue(values[0]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Select value of select box via the value of an existing choice\n * @param {Array/String} value An array of strings of a single string\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'setValueByChoice',\n\t\t\t\t\tvalue: function setValueByChoice(value) {\n\t\t\t\t\t\tvar _this11 = this;\n\n\t\t\t\t\t\tif (!this.isTextElement) {\n\t\t\t\t\t\t\tvar choices = this.store.getChoices();\n\t\t\t\t\t\t\t// If only one value has been passed, convert to array\n\t\t\t\t\t\t\tvar choiceValue = (0, _utils.isType)('Array', value) ? value : [value];\n\n\t\t\t\t\t\t\t// Loop through each value and\n\t\t\t\t\t\t\tchoiceValue.forEach(function (val) {\n\t\t\t\t\t\t\t\tvar foundChoice = choices.find(function (choice) {\n\t\t\t\t\t\t\t\t\t// Check 'value' property exists and the choice isn't already selected\n\t\t\t\t\t\t\t\t\treturn choice.value === val;\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (foundChoice) {\n\t\t\t\t\t\t\t\t\tif (!foundChoice.selected) {\n\t\t\t\t\t\t\t\t\t\t_this11._addItem(foundChoice.value, foundChoice.label, foundChoice.id, foundChoice.groupId, foundChoice.customProperties, foundChoice.placeholder, foundChoice.keyCode);\n\t\t\t\t\t\t\t\t\t} else if (!_this11.config.silent) {\n\t\t\t\t\t\t\t\t\t\tconsole.warn('Attempting to select choice already selected');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (!_this11.config.silent) {\n\t\t\t\t\t\t\t\t\tconsole.warn('Attempting to select choice that does not exist');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Direct populate choices\n * @param {Array} choices - Choices to insert\n * @param {String} value - Name of 'value' property\n * @param {String} label - Name of 'label' property\n * @param {Boolean} replaceChoices Whether existing choices should be removed\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'setChoices',\n\t\t\t\t\tvalue: function setChoices(choices, value, label) {\n\t\t\t\t\t\tvar _this12 = this;\n\n\t\t\t\t\t\tvar replaceChoices = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n\t\t\t\t\t\tif (this.initialised === true) {\n\t\t\t\t\t\t\tif (this.isSelectElement) {\n\t\t\t\t\t\t\t\tif (!(0, _utils.isType)('Array', choices) || !value) {\n\t\t\t\t\t\t\t\t\treturn this;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Clear choices if needed\n\t\t\t\t\t\t\t\tif (replaceChoices) {\n\t\t\t\t\t\t\t\t\tthis._clearChoices();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis._setLoading(true);\n\n\t\t\t\t\t\t\t\t// Add choices if passed\n\t\t\t\t\t\t\t\tif (choices && choices.length) {\n\t\t\t\t\t\t\t\t\tthis.containerOuter.classList.remove(this.config.classNames.loadingState);\n\t\t\t\t\t\t\t\t\tchoices.forEach(function (result) {\n\t\t\t\t\t\t\t\t\t\tif (result.choices) {\n\t\t\t\t\t\t\t\t\t\t\t_this12._addGroup(result, result.id || null, value, label);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t_this12._addChoice(result[value], result[label], result.selected, result.disabled, undefined, result.customProperties, result.placeholder);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tthis._setLoading(false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Clear items,choices and groups\n * @note Hard delete\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'clearStore',\n\t\t\t\t\tvalue: function clearStore() {\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.clearAll)());\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Set value of input to blank\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'clearInput',\n\t\t\t\t\tvalue: function clearInput() {\n\t\t\t\t\t\tif (this.input.value) {\n\t\t\t\t\t\t\tthis.input.value = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!this.isSelectOneElement) {\n\t\t\t\t\t\t\tthis._setInputWidth();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!this.isTextElement && this.config.searchEnabled) {\n\t\t\t\t\t\t\tthis.isSearching = false;\n\t\t\t\t\t\t\tthis.store.dispatch((0, _index3.activateChoices)(true));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Enable interaction with Choices\n * @return {Object} Class instance\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'enable',\n\t\t\t\t\tvalue: function enable() {\n\t\t\t\t\t\tif (this.initialised) {\n\t\t\t\t\t\t\tthis.passedElement.disabled = false;\n\t\t\t\t\t\t\tvar isDisabled = this.containerOuter.classList.contains(this.config.classNames.disabledState);\n\t\t\t\t\t\t\tif (isDisabled) {\n\t\t\t\t\t\t\t\tthis._addEventListeners();\n\t\t\t\t\t\t\t\tthis.passedElement.removeAttribute('disabled');\n\t\t\t\t\t\t\t\tthis.input.removeAttribute('disabled');\n\t\t\t\t\t\t\t\tthis.containerOuter.classList.remove(this.config.classNames.disabledState);\n\t\t\t\t\t\t\t\tthis.containerOuter.removeAttribute('aria-disabled');\n\t\t\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\t\t\tthis.containerOuter.setAttribute('tabindex', '0');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Disable interaction with Choices\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'disable',\n\t\t\t\t\tvalue: function disable() {\n\t\t\t\t\t\tif (this.initialised) {\n\t\t\t\t\t\t\tthis.passedElement.disabled = true;\n\t\t\t\t\t\t\tvar isEnabled = !this.containerOuter.classList.contains(this.config.classNames.disabledState);\n\t\t\t\t\t\t\tif (isEnabled) {\n\t\t\t\t\t\t\t\tthis._removeEventListeners();\n\t\t\t\t\t\t\t\tthis.passedElement.setAttribute('disabled', '');\n\t\t\t\t\t\t\t\tthis.input.setAttribute('disabled', '');\n\t\t\t\t\t\t\t\tthis.containerOuter.classList.add(this.config.classNames.disabledState);\n\t\t\t\t\t\t\t\tthis.containerOuter.setAttribute('aria-disabled', 'true');\n\t\t\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\t\t\tthis.containerOuter.setAttribute('tabindex', '-1');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Populate options via ajax callback\n * @param {Function} fn Function that actually makes an AJAX request\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'ajax',\n\t\t\t\t\tvalue: function ajax(fn) {\n\t\t\t\t\t\tvar _this13 = this;\n\n\t\t\t\t\t\tif (this.initialised === true) {\n\t\t\t\t\t\t\tif (this.isSelectElement) {\n\t\t\t\t\t\t\t\t// Show loading text\n\t\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\t\t_this13._handleLoadingState(true);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t// Run callback\n\t\t\t\t\t\t\t\tfn(this._ajaxCallback());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/*===== End of Public functions ======*/\n\n\t\t\t\t\t/*=============================================\n = Private functions =\n =============================================*/\n\n\t\t\t\t\t/**\n * Call change callback\n * @param {String} value - last added/deleted/selected value\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_triggerChange',\n\t\t\t\t\tvalue: function _triggerChange(value) {\n\t\t\t\t\t\tif (!value) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'change', {\n\t\t\t\t\t\t\tvalue: value\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Process enter/click of an item button\n * @param {Array} activeItems The currently active items\n * @param {Element} element Button being interacted with\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_handleButtonAction',\n\t\t\t\t\tvalue: function _handleButtonAction(activeItems, element) {\n\t\t\t\t\t\tif (!activeItems || !element) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If we are clicking on a button\n\t\t\t\t\t\tif (this.config.removeItems && this.config.removeItemButton) {\n\t\t\t\t\t\t\tvar itemId = element.parentNode.getAttribute('data-id');\n\t\t\t\t\t\t\tvar itemToRemove = activeItems.find(function (item) {\n\t\t\t\t\t\t\t\treturn item.id === parseInt(itemId, 10);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// Remove item associated with button\n\t\t\t\t\t\t\tthis._removeItem(itemToRemove);\n\t\t\t\t\t\t\tthis._triggerChange(itemToRemove.value);\n\n\t\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\t\tthis._selectPlaceholderChoice();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Select placeholder choice\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_selectPlaceholderChoice',\n\t\t\t\t\tvalue: function _selectPlaceholderChoice() {\n\t\t\t\t\t\tvar placeholderChoice = this.store.getPlaceholderChoice();\n\n\t\t\t\t\t\tif (placeholderChoice) {\n\t\t\t\t\t\t\tthis._addItem(placeholderChoice.value, placeholderChoice.label, placeholderChoice.id, placeholderChoice.groupId, null, placeholderChoice.placeholder);\n\t\t\t\t\t\t\tthis._triggerChange(placeholderChoice.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Process click of an item\n * @param {Array} activeItems The currently active items\n * @param {Element} element Item being interacted with\n * @param {Boolean} hasShiftKey Whether the user has the shift key active\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_handleItemAction',\n\t\t\t\t\tvalue: function _handleItemAction(activeItems, element) {\n\t\t\t\t\t\tvar _this14 = this;\n\n\t\t\t\t\t\tvar hasShiftKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t\t\t\t\t\tif (!activeItems || !element) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If we are clicking on an item\n\t\t\t\t\t\tif (this.config.removeItems && !this.isSelectOneElement) {\n\t\t\t\t\t\t\tvar passedId = element.getAttribute('data-id');\n\n\t\t\t\t\t\t\t// We only want to select one item with a click\n\t\t\t\t\t\t\t// so we deselect any items that aren't the target\n\t\t\t\t\t\t\t// unless shift is being pressed\n\t\t\t\t\t\t\tactiveItems.forEach(function (item) {\n\t\t\t\t\t\t\t\tif (item.id === parseInt(passedId, 10) && !item.highlighted) {\n\t\t\t\t\t\t\t\t\t_this14.highlightItem(item);\n\t\t\t\t\t\t\t\t} else if (!hasShiftKey) {\n\t\t\t\t\t\t\t\t\tif (item.highlighted) {\n\t\t\t\t\t\t\t\t\t\t_this14.unhighlightItem(item);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// Focus input as without focus, a user cannot do anything with a\n\t\t\t\t\t\t\t// highlighted item\n\t\t\t\t\t\t\tif (document.activeElement !== this.input) {\n\t\t\t\t\t\t\t\tthis.input.focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Process click of a choice\n * @param {Array} activeItems The currently active items\n * @param {Element} element Choice being interacted with\n * @return\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_handleChoiceAction',\n\t\t\t\t\tvalue: function _handleChoiceAction(activeItems, element) {\n\t\t\t\t\t\tif (!activeItems || !element) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If we are clicking on an option\n\t\t\t\t\t\tvar id = element.getAttribute('data-id');\n\t\t\t\t\t\tvar choice = this.store.getChoiceById(id);\n\t\t\t\t\t\tvar passedKeyCode = activeItems[0] && activeItems[0].keyCode ? activeItems[0].keyCode : null;\n\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\n\t\t\t\t\t\t// Update choice keyCode\n\t\t\t\t\t\tchoice.keyCode = passedKeyCode;\n\n\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'choice', {\n\t\t\t\t\t\t\tchoice: choice\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (choice && !choice.selected && !choice.disabled) {\n\t\t\t\t\t\t\tvar canAddItem = this._canAddItem(activeItems, choice.value);\n\n\t\t\t\t\t\t\tif (canAddItem.response) {\n\t\t\t\t\t\t\t\tthis._addItem(choice.value, choice.label, choice.id, choice.groupId, choice.customProperties, choice.placeholder, choice.keyCode);\n\t\t\t\t\t\t\t\tthis._triggerChange(choice.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.clearInput();\n\n\t\t\t\t\t\t// We wont to close the dropdown if we are dealing with a single select box\n\t\t\t\t\t\tif (hasActiveDropdown && this.isSelectOneElement) {\n\t\t\t\t\t\t\tthis.hideDropdown();\n\t\t\t\t\t\t\tthis.containerOuter.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Process back space event\n * @param {Array} activeItems items\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_handleBackspace',\n\t\t\t\t\tvalue: function _handleBackspace(activeItems) {\n\t\t\t\t\t\tif (this.config.removeItems && activeItems) {\n\t\t\t\t\t\t\tvar lastItem = activeItems[activeItems.length - 1];\n\t\t\t\t\t\t\tvar hasHighlightedItems = activeItems.some(function (item) {\n\t\t\t\t\t\t\t\treturn item.highlighted;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// If editing the last item is allowed and there are not other selected items,\n\t\t\t\t\t\t\t// we can edit the item value. Otherwise if we can remove items, remove all selected items\n\t\t\t\t\t\t\tif (this.config.editItems && !hasHighlightedItems && lastItem) {\n\t\t\t\t\t\t\t\tthis.input.value = lastItem.value;\n\t\t\t\t\t\t\t\tthis._setInputWidth();\n\t\t\t\t\t\t\t\tthis._removeItem(lastItem);\n\t\t\t\t\t\t\t\tthis._triggerChange(lastItem.value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (!hasHighlightedItems) {\n\t\t\t\t\t\t\t\t\tthis.highlightItem(lastItem, false);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.removeHighlightedItems(true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Validates whether an item can be added by a user\n * @param {Array} activeItems The currently active items\n * @param {String} value Value of item to add\n * @return {Object} Response: Whether user can add item\n * Notice: Notice show in dropdown\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_canAddItem',\n\t\t\t\t\tvalue: function _canAddItem(activeItems, value) {\n\t\t\t\t\t\tvar canAddItem = true;\n\t\t\t\t\t\tvar notice = (0, _utils.isType)('Function', this.config.addItemText) ? this.config.addItemText(value) : this.config.addItemText;\n\n\t\t\t\t\t\tif (this.isSelectMultipleElement || this.isTextElement) {\n\t\t\t\t\t\t\tif (this.config.maxItemCount > 0 && this.config.maxItemCount <= activeItems.length) {\n\t\t\t\t\t\t\t\t// If there is a max entry limit and we have reached that limit\n\t\t\t\t\t\t\t\t// don't update\n\t\t\t\t\t\t\t\tcanAddItem = false;\n\t\t\t\t\t\t\t\tnotice = (0, _utils.isType)('Function', this.config.maxItemText) ? this.config.maxItemText(this.config.maxItemCount) : this.config.maxItemText;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.isTextElement && this.config.addItems && canAddItem) {\n\t\t\t\t\t\t\t// If a user has supplied a regular expression filter\n\t\t\t\t\t\t\tif (this.config.regexFilter) {\n\t\t\t\t\t\t\t\t// Determine whether we can update based on whether\n\t\t\t\t\t\t\t\t// our regular expression passes\n\t\t\t\t\t\t\t\tcanAddItem = this._regexFilter(value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If no duplicates are allowed, and the value already exists\n\t\t\t\t\t\t// in the array\n\t\t\t\t\t\tvar isUnique = !activeItems.some(function (item) {\n\t\t\t\t\t\t\tif ((0, _utils.isType)('String', value)) {\n\t\t\t\t\t\t\t\treturn item.value === value.trim();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn item.value === value;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!isUnique && !this.config.duplicateItems && !this.isSelectOneElement && canAddItem) {\n\t\t\t\t\t\t\tcanAddItem = false;\n\t\t\t\t\t\t\tnotice = (0, _utils.isType)('Function', this.config.uniqueItemText) ? this.config.uniqueItemText(value) : this.config.uniqueItemText;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tresponse: canAddItem,\n\t\t\t\t\t\t\tnotice: notice\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Apply or remove a loading state to the component.\n * @param {Boolean} setLoading default value set to 'true'.\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_handleLoadingState',\n\t\t\t\t\tvalue: function _handleLoadingState() {\n\t\t\t\t\t\tvar setLoading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t\t\t\t\t\tvar placeholderItem = this.itemList.querySelector('.' + this.config.classNames.placeholder);\n\t\t\t\t\t\tif (setLoading) {\n\t\t\t\t\t\t\tthis.containerOuter.classList.add(this.config.classNames.loadingState);\n\t\t\t\t\t\t\tthis.containerOuter.setAttribute('aria-busy', 'true');\n\t\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\t\tif (!placeholderItem) {\n\t\t\t\t\t\t\t\t\tplaceholderItem = this._getTemplate('placeholder', this.config.loadingText);\n\t\t\t\t\t\t\t\t\tthis.itemList.appendChild(placeholderItem);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tplaceholderItem.innerHTML = this.config.loadingText;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.input.placeholder = this.config.loadingText;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Remove loading states/text\n\t\t\t\t\t\t\tthis.containerOuter.classList.remove(this.config.classNames.loadingState);\n\n\t\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\t\tplaceholderItem.innerHTML = this.placeholder || '';\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.input.placeholder = this.placeholder || '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Retrieve the callback used to populate component's choices in an async way.\n * @returns {Function} The callback as a function.\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_ajaxCallback',\n\t\t\t\t\tvalue: function _ajaxCallback() {\n\t\t\t\t\t\tvar _this15 = this;\n\n\t\t\t\t\t\treturn function (results, value, label) {\n\t\t\t\t\t\t\tif (!results || !value) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar parsedResults = (0, _utils.isType)('Object', results) ? [results] : results;\n\n\t\t\t\t\t\t\tif (parsedResults && (0, _utils.isType)('Array', parsedResults) && parsedResults.length) {\n\t\t\t\t\t\t\t\t// Remove loading states/text\n\t\t\t\t\t\t\t\t_this15._handleLoadingState(false);\n\t\t\t\t\t\t\t\t// Add each result as a choice\n\n\t\t\t\t\t\t\t\t_this15._setLoading(true);\n\n\t\t\t\t\t\t\t\tparsedResults.forEach(function (result) {\n\t\t\t\t\t\t\t\t\tif (result.choices) {\n\t\t\t\t\t\t\t\t\t\tvar groupId = result.id || null;\n\t\t\t\t\t\t\t\t\t\t_this15._addGroup(result, groupId, value, label);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t_this15._addChoice(result[value], result[label], result.selected, result.disabled, undefined, result.customProperties, result.placeholder);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t_this15._setLoading(false);\n\n\t\t\t\t\t\t\t\tif (_this15.isSelectOneElement) {\n\t\t\t\t\t\t\t\t\t_this15._selectPlaceholderChoice();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// No results, remove loading state\n\t\t\t\t\t\t\t\t_this15._handleLoadingState(false);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_this15.containerOuter.removeAttribute('aria-busy');\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Filter choices based on search value\n * @param {String} value Value to filter by\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_searchChoices',\n\t\t\t\t\tvalue: function _searchChoices(value) {\n\t\t\t\t\t\tvar newValue = (0, _utils.isType)('String', value) ? value.trim() : value;\n\t\t\t\t\t\tvar currentValue = (0, _utils.isType)('String', this.currentValue) ? this.currentValue.trim() : this.currentValue;\n\n\t\t\t\t\t\t// If new value matches the desired length and is not the same as the current value with a space\n\t\t\t\t\t\tif (newValue.length >= 1 && newValue !== currentValue + ' ') {\n\t\t\t\t\t\t\tvar haystack = this.store.getSearchableChoices();\n\t\t\t\t\t\t\tvar needle = newValue;\n\t\t\t\t\t\t\tvar keys = (0, _utils.isType)('Array', this.config.searchFields) ? this.config.searchFields : [this.config.searchFields];\n\t\t\t\t\t\t\tvar options = Object.assign(this.config.fuseOptions, { keys: keys });\n\t\t\t\t\t\t\tvar fuse = new _fuse2.default(haystack, options);\n\t\t\t\t\t\t\tvar results = fuse.search(needle);\n\n\t\t\t\t\t\t\tthis.currentValue = newValue;\n\t\t\t\t\t\t\tthis.highlightPosition = 0;\n\t\t\t\t\t\t\tthis.isSearching = true;\n\t\t\t\t\t\t\tthis.store.dispatch((0, _index3.filterChoices)(results));\n\n\t\t\t\t\t\t\treturn results.length;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Determine the action when a user is searching\n * @param {String} value Value entered by user\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_handleSearch',\n\t\t\t\t\tvalue: function _handleSearch(value) {\n\t\t\t\t\t\tif (!value) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar choices = this.store.getChoices();\n\t\t\t\t\t\tvar hasUnactiveChoices = choices.some(function (option) {\n\t\t\t\t\t\t\treturn !option.active;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Run callback if it is a function\n\t\t\t\t\t\tif (this.input === document.activeElement) {\n\t\t\t\t\t\t\t// Check that we have a value to search and the input was an alphanumeric character\n\t\t\t\t\t\t\tif (value && value.length >= this.config.searchFloor) {\n\t\t\t\t\t\t\t\tvar resultCount = 0;\n\t\t\t\t\t\t\t\t// Check flag to filter search input\n\t\t\t\t\t\t\t\tif (this.config.searchChoices) {\n\t\t\t\t\t\t\t\t\t// Filter available choices\n\t\t\t\t\t\t\t\t\tresultCount = this._searchChoices(value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Trigger search event\n\t\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'search', {\n\t\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t\t\tresultCount: resultCount\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else if (hasUnactiveChoices) {\n\t\t\t\t\t\t\t\t// Otherwise reset choices to active\n\t\t\t\t\t\t\t\tthis.isSearching = false;\n\t\t\t\t\t\t\t\tthis.store.dispatch((0, _index3.activateChoices)(true));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Trigger event listeners\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_addEventListeners',\n\t\t\t\t\tvalue: function _addEventListeners() {\n\t\t\t\t\t\tdocument.addEventListener('keyup', this._onKeyUp);\n\t\t\t\t\t\tdocument.addEventListener('keydown', this._onKeyDown);\n\t\t\t\t\t\tdocument.addEventListener('click', this._onClick);\n\t\t\t\t\t\tdocument.addEventListener('touchmove', this._onTouchMove);\n\t\t\t\t\t\tdocument.addEventListener('touchend', this._onTouchEnd);\n\t\t\t\t\t\tdocument.addEventListener('mousedown', this._onMouseDown);\n\t\t\t\t\t\tdocument.addEventListener('mouseover', this._onMouseOver);\n\n\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\tthis.containerOuter.addEventListener('focus', this._onFocus);\n\t\t\t\t\t\t\tthis.containerOuter.addEventListener('blur', this._onBlur);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.input.addEventListener('input', this._onInput);\n\t\t\t\t\t\tthis.input.addEventListener('paste', this._onPaste);\n\t\t\t\t\t\tthis.input.addEventListener('focus', this._onFocus);\n\t\t\t\t\t\tthis.input.addEventListener('blur', this._onBlur);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Remove event listeners\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_removeEventListeners',\n\t\t\t\t\tvalue: function _removeEventListeners() {\n\t\t\t\t\t\tdocument.removeEventListener('keyup', this._onKeyUp);\n\t\t\t\t\t\tdocument.removeEventListener('keydown', this._onKeyDown);\n\t\t\t\t\t\tdocument.removeEventListener('click', this._onClick);\n\t\t\t\t\t\tdocument.removeEventListener('touchmove', this._onTouchMove);\n\t\t\t\t\t\tdocument.removeEventListener('touchend', this._onTouchEnd);\n\t\t\t\t\t\tdocument.removeEventListener('mousedown', this._onMouseDown);\n\t\t\t\t\t\tdocument.removeEventListener('mouseover', this._onMouseOver);\n\n\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\tthis.containerOuter.removeEventListener('focus', this._onFocus);\n\t\t\t\t\t\t\tthis.containerOuter.removeEventListener('blur', this._onBlur);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.input.removeEventListener('input', this._onInput);\n\t\t\t\t\t\tthis.input.removeEventListener('paste', this._onPaste);\n\t\t\t\t\t\tthis.input.removeEventListener('focus', this._onFocus);\n\t\t\t\t\t\tthis.input.removeEventListener('blur', this._onBlur);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Set the correct input width based on placeholder\n * value or input value\n * @return\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_setInputWidth',\n\t\t\t\t\tvalue: function _setInputWidth() {\n\t\t\t\t\t\tif (this.placeholder) {\n\t\t\t\t\t\t\t// If there is a placeholder, we only want to set the width of the input when it is a greater\n\t\t\t\t\t\t\t// length than 75% of the placeholder. This stops the input jumping around.\n\t\t\t\t\t\t\tif (this.input.value && this.input.value.length >= this.placeholder.length / 1.25) {\n\t\t\t\t\t\t\t\tthis.input.style.width = (0, _utils.getWidthOfInput)(this.input);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If there is no placeholder, resize input to contents\n\t\t\t\t\t\t\tthis.input.style.width = (0, _utils.getWidthOfInput)(this.input);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Key down event\n * @param {Object} e Event\n * @return\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onKeyDown',\n\t\t\t\t\tvalue: function _onKeyDown(e) {\n\t\t\t\t\t\tvar _this16 = this,\n\t\t\t\t\t\t _keyDownActions;\n\n\t\t\t\t\t\tif (e.target !== this.input && !this.containerOuter.contains(e.target)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar target = e.target;\n\t\t\t\t\t\tvar activeItems = this.store.getItemsFilteredByActive();\n\t\t\t\t\t\tvar hasFocusedInput = this.input === document.activeElement;\n\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t\t\t\t\t\tvar hasItems = this.itemList && this.itemList.children;\n\t\t\t\t\t\tvar keyString = String.fromCharCode(e.keyCode);\n\n\t\t\t\t\t\tvar backKey = 46;\n\t\t\t\t\t\tvar deleteKey = 8;\n\t\t\t\t\t\tvar enterKey = 13;\n\t\t\t\t\t\tvar aKey = 65;\n\t\t\t\t\t\tvar escapeKey = 27;\n\t\t\t\t\t\tvar upKey = 38;\n\t\t\t\t\t\tvar downKey = 40;\n\t\t\t\t\t\tvar pageUpKey = 33;\n\t\t\t\t\t\tvar pageDownKey = 34;\n\t\t\t\t\t\tvar ctrlDownKey = e.ctrlKey || e.metaKey;\n\n\t\t\t\t\t\t// If a user is typing and the dropdown is not active\n\t\t\t\t\t\tif (!this.isTextElement && /[a-zA-Z0-9-_ ]/.test(keyString) && !hasActiveDropdown) {\n\t\t\t\t\t\t\tthis.showDropdown(true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.canSearch = this.config.searchEnabled;\n\n\t\t\t\t\t\tvar onAKey = function onAKey() {\n\t\t\t\t\t\t\t// If CTRL + A or CMD + A have been pressed and there are items to select\n\t\t\t\t\t\t\tif (ctrlDownKey && hasItems) {\n\t\t\t\t\t\t\t\t_this16.canSearch = false;\n\t\t\t\t\t\t\t\tif (_this16.config.removeItems && !_this16.input.value && _this16.input === document.activeElement) {\n\t\t\t\t\t\t\t\t\t// Highlight items\n\t\t\t\t\t\t\t\t\t_this16.highlightAll();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar onEnterKey = function onEnterKey() {\n\t\t\t\t\t\t\t// If enter key is pressed and the input has a value\n\t\t\t\t\t\t\tif (_this16.isTextElement && target.value) {\n\t\t\t\t\t\t\t\tvar value = _this16.input.value;\n\t\t\t\t\t\t\t\tvar canAddItem = _this16._canAddItem(activeItems, value);\n\n\t\t\t\t\t\t\t\t// All is good, add\n\t\t\t\t\t\t\t\tif (canAddItem.response) {\n\t\t\t\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t_this16.hideDropdown();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t_this16._addItem(value);\n\t\t\t\t\t\t\t\t\t_this16._triggerChange(value);\n\t\t\t\t\t\t\t\t\t_this16.clearInput();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (target.hasAttribute('data-button')) {\n\t\t\t\t\t\t\t\t_this16._handleButtonAction(activeItems, target);\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tvar highlighted = _this16.dropdown.querySelector('.' + _this16.config.classNames.highlightedState);\n\n\t\t\t\t\t\t\t\t// If we have a highlighted choice\n\t\t\t\t\t\t\t\tif (highlighted) {\n\t\t\t\t\t\t\t\t\t// add enter keyCode value\n\t\t\t\t\t\t\t\t\tif (activeItems[0]) {\n\t\t\t\t\t\t\t\t\t\tactiveItems[0].keyCode = enterKey;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t_this16._handleChoiceAction(activeItems, highlighted);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (_this16.isSelectOneElement) {\n\t\t\t\t\t\t\t\t// Open single select dropdown if it's not active\n\t\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t_this16.showDropdown(true);\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar onEscapeKey = function onEscapeKey() {\n\t\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\t\t_this16.toggleDropdown();\n\t\t\t\t\t\t\t\t_this16.containerOuter.focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar onDirectionKey = function onDirectionKey() {\n\t\t\t\t\t\t\t// If up or down key is pressed, traverse through options\n\t\t\t\t\t\t\tif (hasActiveDropdown || _this16.isSelectOneElement) {\n\t\t\t\t\t\t\t\t// Show dropdown if focus\n\t\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t_this16.showDropdown(true);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t_this16.canSearch = false;\n\n\t\t\t\t\t\t\t\tvar directionInt = e.keyCode === downKey || e.keyCode === pageDownKey ? 1 : -1;\n\t\t\t\t\t\t\t\tvar skipKey = e.metaKey || e.keyCode === pageDownKey || e.keyCode === pageUpKey;\n\n\t\t\t\t\t\t\t\tvar nextEl = void 0;\n\t\t\t\t\t\t\t\tif (skipKey) {\n\t\t\t\t\t\t\t\t\tif (directionInt > 0) {\n\t\t\t\t\t\t\t\t\t\tnextEl = Array.from(_this16.dropdown.querySelectorAll('[data-choice-selectable]')).pop();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnextEl = _this16.dropdown.querySelector('[data-choice-selectable]');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tvar currentEl = _this16.dropdown.querySelector('.' + _this16.config.classNames.highlightedState);\n\t\t\t\t\t\t\t\t\tif (currentEl) {\n\t\t\t\t\t\t\t\t\t\tnextEl = (0, _utils.getAdjacentEl)(currentEl, '[data-choice-selectable]', directionInt);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnextEl = _this16.dropdown.querySelector('[data-choice-selectable]');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (nextEl) {\n\t\t\t\t\t\t\t\t\t// We prevent default to stop the cursor moving\n\t\t\t\t\t\t\t\t\t// when pressing the arrow\n\t\t\t\t\t\t\t\t\tif (!(0, _utils.isScrolledIntoView)(nextEl, _this16.choiceList, directionInt)) {\n\t\t\t\t\t\t\t\t\t\t_this16._scrollToChoice(nextEl, directionInt);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t_this16._highlightChoice(nextEl);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Prevent default to maintain cursor position whilst\n\t\t\t\t\t\t\t\t// traversing dropdown options\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar onDeleteKey = function onDeleteKey() {\n\t\t\t\t\t\t\t// If backspace or delete key is pressed and the input has no value\n\t\t\t\t\t\t\tif (hasFocusedInput && !e.target.value && !_this16.isSelectOneElement) {\n\t\t\t\t\t\t\t\t_this16._handleBackspace(activeItems);\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Map keys to key actions\n\t\t\t\t\t\tvar keyDownActions = (_keyDownActions = {}, _defineProperty(_keyDownActions, aKey, onAKey), _defineProperty(_keyDownActions, enterKey, onEnterKey), _defineProperty(_keyDownActions, escapeKey, onEscapeKey), _defineProperty(_keyDownActions, upKey, onDirectionKey), _defineProperty(_keyDownActions, pageUpKey, onDirectionKey), _defineProperty(_keyDownActions, downKey, onDirectionKey), _defineProperty(_keyDownActions, pageDownKey, onDirectionKey), _defineProperty(_keyDownActions, deleteKey, onDeleteKey), _defineProperty(_keyDownActions, backKey, onDeleteKey), _keyDownActions);\n\n\t\t\t\t\t\t// If keycode has a function, run it\n\t\t\t\t\t\tif (keyDownActions[e.keyCode]) {\n\t\t\t\t\t\t\tkeyDownActions[e.keyCode]();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Key up event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onKeyUp',\n\t\t\t\t\tvalue: function _onKeyUp(e) {\n\t\t\t\t\t\tif (e.target !== this.input) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar value = this.input.value;\n\t\t\t\t\t\tvar activeItems = this.store.getItemsFilteredByActive();\n\t\t\t\t\t\tvar canAddItem = this._canAddItem(activeItems, value);\n\n\t\t\t\t\t\t// We are typing into a text input and have a value, we want to show a dropdown\n\t\t\t\t\t\t// notice. Otherwise hide the dropdown\n\t\t\t\t\t\tif (this.isTextElement) {\n\t\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t\t\t\t\t\t\tif (value) {\n\n\t\t\t\t\t\t\t\tif (canAddItem.notice) {\n\t\t\t\t\t\t\t\t\tvar dropdownItem = this._getTemplate('notice', canAddItem.notice);\n\t\t\t\t\t\t\t\t\tthis.dropdown.innerHTML = dropdownItem.outerHTML;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (canAddItem.response === true) {\n\t\t\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\tthis.showDropdown();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (!canAddItem.notice && hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\tthis.hideDropdown();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (hasActiveDropdown) {\n\t\t\t\t\t\t\t\tthis.hideDropdown();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar backKey = 46;\n\t\t\t\t\t\t\tvar deleteKey = 8;\n\n\t\t\t\t\t\t\t// If user has removed value...\n\t\t\t\t\t\t\tif ((e.keyCode === backKey || e.keyCode === deleteKey) && !e.target.value) {\n\t\t\t\t\t\t\t\t// ...and it is a multiple select input, activate choices (if searching)\n\t\t\t\t\t\t\t\tif (!this.isTextElement && this.isSearching) {\n\t\t\t\t\t\t\t\t\tthis.isSearching = false;\n\t\t\t\t\t\t\t\t\tthis.store.dispatch((0, _index3.activateChoices)(true));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (this.canSearch && canAddItem.response) {\n\t\t\t\t\t\t\t\tthis._handleSearch(this.input.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Re-establish canSearch value from changes in _onKeyDown\n\t\t\t\t\t\tthis.canSearch = this.config.searchEnabled;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Input event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onInput',\n\t\t\t\t\tvalue: function _onInput() {\n\t\t\t\t\t\tif (!this.isSelectOneElement) {\n\t\t\t\t\t\t\tthis._setInputWidth();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Touch move event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onTouchMove',\n\t\t\t\t\tvalue: function _onTouchMove() {\n\t\t\t\t\t\tif (this.wasTap === true) {\n\t\t\t\t\t\t\tthis.wasTap = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Touch end event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onTouchEnd',\n\t\t\t\t\tvalue: function _onTouchEnd(e) {\n\t\t\t\t\t\tvar target = e.target || e.touches[0].target;\n\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\n\t\t\t\t\t\t// If a user tapped within our container...\n\t\t\t\t\t\tif (this.wasTap === true && this.containerOuter.contains(target)) {\n\t\t\t\t\t\t\t// ...and we aren't dealing with a single select box, show dropdown/focus input\n\t\t\t\t\t\t\tif ((target === this.containerOuter || target === this.containerInner) && !this.isSelectOneElement) {\n\t\t\t\t\t\t\t\tif (this.isTextElement) {\n\t\t\t\t\t\t\t\t\t// If text element, we only want to focus the input (if it isn't already)\n\t\t\t\t\t\t\t\t\tif (document.activeElement !== this.input) {\n\t\t\t\t\t\t\t\t\t\tthis.input.focus();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t// If a select box, we want to show the dropdown\n\t\t\t\t\t\t\t\t\t\tthis.showDropdown(true);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Prevents focus event firing\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.wasTap = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Mouse down event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onMouseDown',\n\t\t\t\t\tvalue: function _onMouseDown(e) {\n\t\t\t\t\t\tvar target = e.target;\n\n\t\t\t\t\t\t// If we have our mouse down on the scrollbar and are on IE11...\n\t\t\t\t\t\tif (target === this.choiceList && this.isIe11) {\n\t\t\t\t\t\t\tthis.isScrollingOnIe = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.containerOuter.contains(target) && target !== this.input) {\n\t\t\t\t\t\t\tvar foundTarget = void 0;\n\t\t\t\t\t\t\tvar activeItems = this.store.getItemsFilteredByActive();\n\t\t\t\t\t\t\tvar hasShiftKey = e.shiftKey;\n\n\t\t\t\t\t\t\tif (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-button')) {\n\t\t\t\t\t\t\t\tthis._handleButtonAction(activeItems, foundTarget);\n\t\t\t\t\t\t\t} else if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-item')) {\n\t\t\t\t\t\t\t\tthis._handleItemAction(activeItems, foundTarget, hasShiftKey);\n\t\t\t\t\t\t\t} else if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-choice')) {\n\t\t\t\t\t\t\t\tthis._handleChoiceAction(activeItems, foundTarget);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Click event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onClick',\n\t\t\t\t\tvalue: function _onClick(e) {\n\t\t\t\t\t\tvar target = e.target;\n\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t\t\t\t\t\tvar activeItems = this.store.getItemsFilteredByActive();\n\n\t\t\t\t\t\t// If target is something that concerns us\n\t\t\t\t\t\tif (this.containerOuter.contains(target)) {\n\t\t\t\t\t\t\t// Handle button delete\n\t\t\t\t\t\t\tif (target.hasAttribute('data-button')) {\n\t\t\t\t\t\t\t\tthis._handleButtonAction(activeItems, target);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\tif (this.isTextElement) {\n\t\t\t\t\t\t\t\t\tif (document.activeElement !== this.input) {\n\t\t\t\t\t\t\t\t\t\tthis.input.focus();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (this.canSearch) {\n\t\t\t\t\t\t\t\t\t\tthis.showDropdown(true);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.showDropdown();\n\t\t\t\t\t\t\t\t\t\tthis.containerOuter.focus();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (this.isSelectOneElement && target !== this.input && !this.dropdown.contains(target)) {\n\t\t\t\t\t\t\t\tthis.hideDropdown(true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar hasHighlightedItems = activeItems.some(function (item) {\n\t\t\t\t\t\t\t\treturn item.highlighted;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// De-select any highlighted items\n\t\t\t\t\t\t\tif (hasHighlightedItems) {\n\t\t\t\t\t\t\t\tthis.unhighlightAll();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Remove focus state\n\t\t\t\t\t\t\tthis.containerOuter.classList.remove(this.config.classNames.focusState);\n\n\t\t\t\t\t\t\t// Close all other dropdowns\n\t\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\t\tthis.hideDropdown();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Mouse over (hover) event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onMouseOver',\n\t\t\t\t\tvalue: function _onMouseOver(e) {\n\t\t\t\t\t\t// If the dropdown is either the target or one of its children is the target\n\t\t\t\t\t\tif (e.target === this.dropdown || this.dropdown.contains(e.target)) {\n\t\t\t\t\t\t\tif (e.target.hasAttribute('data-choice')) this._highlightChoice(e.target);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Paste event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onPaste',\n\t\t\t\t\tvalue: function _onPaste(e) {\n\t\t\t\t\t\t// Disable pasting into the input if option has been set\n\t\t\t\t\t\tif (e.target === this.input && !this.config.paste) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Focus event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onFocus',\n\t\t\t\t\tvalue: function _onFocus(e) {\n\t\t\t\t\t\tvar _this17 = this;\n\n\t\t\t\t\t\tvar target = e.target;\n\t\t\t\t\t\t// If target is something that concerns us\n\t\t\t\t\t\tif (this.containerOuter.contains(target)) {\n\t\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t\t\t\t\t\t\tvar focusActions = {\n\t\t\t\t\t\t\t\ttext: function text() {\n\t\t\t\t\t\t\t\t\tif (target === _this17.input) {\n\t\t\t\t\t\t\t\t\t\t_this17.containerOuter.classList.add(_this17.config.classNames.focusState);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'select-one': function selectOne() {\n\t\t\t\t\t\t\t\t\t_this17.containerOuter.classList.add(_this17.config.classNames.focusState);\n\t\t\t\t\t\t\t\t\tif (target === _this17.input) {\n\t\t\t\t\t\t\t\t\t\t// Show dropdown if it isn't already showing\n\t\t\t\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t\t_this17.showDropdown();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'select-multiple': function selectMultiple() {\n\t\t\t\t\t\t\t\t\tif (target === _this17.input) {\n\t\t\t\t\t\t\t\t\t\t// If element is a select box, the focused element is the container and the dropdown\n\t\t\t\t\t\t\t\t\t\t// isn't already open, focus and show dropdown\n\t\t\t\t\t\t\t\t\t\t_this17.containerOuter.classList.add(_this17.config.classNames.focusState);\n\n\t\t\t\t\t\t\t\t\t\tif (!hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t\t_this17.showDropdown(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tfocusActions[this.passedElement.type]();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Blur event\n * @param {Object} e Event\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_onBlur',\n\t\t\t\t\tvalue: function _onBlur(e) {\n\t\t\t\t\t\tvar _this18 = this;\n\n\t\t\t\t\t\tvar target = e.target;\n\t\t\t\t\t\t// If target is something that concerns us\n\t\t\t\t\t\tif (this.containerOuter.contains(target) && !this.isScrollingOnIe) {\n\t\t\t\t\t\t\tvar activeItems = this.store.getItemsFilteredByActive();\n\t\t\t\t\t\t\tvar hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t\t\t\t\t\t\tvar hasHighlightedItems = activeItems.some(function (item) {\n\t\t\t\t\t\t\t\treturn item.highlighted;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tvar blurActions = {\n\t\t\t\t\t\t\t\ttext: function text() {\n\t\t\t\t\t\t\t\t\tif (target === _this18.input) {\n\t\t\t\t\t\t\t\t\t\t// Remove the focus state\n\t\t\t\t\t\t\t\t\t\t_this18.containerOuter.classList.remove(_this18.config.classNames.focusState);\n\t\t\t\t\t\t\t\t\t\t// De-select any highlighted items\n\t\t\t\t\t\t\t\t\t\tif (hasHighlightedItems) {\n\t\t\t\t\t\t\t\t\t\t\t_this18.unhighlightAll();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t// Hide dropdown if it is showing\n\t\t\t\t\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t\t_this18.hideDropdown();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'select-one': function selectOne() {\n\t\t\t\t\t\t\t\t\t_this18.containerOuter.classList.remove(_this18.config.classNames.focusState);\n\t\t\t\t\t\t\t\t\tif (target === _this18.containerOuter) {\n\t\t\t\t\t\t\t\t\t\t// Hide dropdown if it is showing\n\t\t\t\t\t\t\t\t\t\tif (hasActiveDropdown && !_this18.canSearch) {\n\t\t\t\t\t\t\t\t\t\t\t_this18.hideDropdown();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (target === _this18.input && hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t// Hide dropdown if it is showing\n\t\t\t\t\t\t\t\t\t\t_this18.hideDropdown();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t'select-multiple': function selectMultiple() {\n\t\t\t\t\t\t\t\t\tif (target === _this18.input) {\n\t\t\t\t\t\t\t\t\t\t// Remove the focus state\n\t\t\t\t\t\t\t\t\t\t_this18.containerOuter.classList.remove(_this18.config.classNames.focusState);\n\t\t\t\t\t\t\t\t\t\t// Hide dropdown if it is showing\n\t\t\t\t\t\t\t\t\t\tif (hasActiveDropdown) {\n\t\t\t\t\t\t\t\t\t\t\t_this18.hideDropdown();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t// De-select any highlighted items\n\t\t\t\t\t\t\t\t\t\tif (hasHighlightedItems) {\n\t\t\t\t\t\t\t\t\t\t\t_this18.unhighlightAll();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tblurActions[this.passedElement.type]();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// On IE11, clicking the scollbar blurs our input and thus\n\t\t\t\t\t\t\t// closes the dropdown. To stop this, we refocus our input\n\t\t\t\t\t\t\t// if we know we are on IE *and* are scrolling.\n\t\t\t\t\t\t\tthis.isScrollingOnIe = false;\n\t\t\t\t\t\t\tthis.input.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Tests value against a regular expression\n * @param {string} value Value to test\n * @return {Boolean} Whether test passed/failed\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_regexFilter',\n\t\t\t\t\tvalue: function _regexFilter(value) {\n\t\t\t\t\t\tif (!value) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar regex = this.config.regexFilter;\n\t\t\t\t\t\tvar expression = new RegExp(regex.source, 'i');\n\t\t\t\t\t\treturn expression.test(value);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Scroll to an option element\n * @param {HTMLElement} choice Option to scroll to\n * @param {Number} direction Whether option is above or below\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_scrollToChoice',\n\t\t\t\t\tvalue: function _scrollToChoice(choice, direction) {\n\t\t\t\t\t\tvar _this19 = this;\n\n\t\t\t\t\t\tif (!choice) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar dropdownHeight = this.choiceList.offsetHeight;\n\t\t\t\t\t\tvar choiceHeight = choice.offsetHeight;\n\t\t\t\t\t\t// Distance from bottom of element to top of parent\n\t\t\t\t\t\tvar choicePos = choice.offsetTop + choiceHeight;\n\t\t\t\t\t\t// Scroll position of dropdown\n\t\t\t\t\t\tvar containerScrollPos = this.choiceList.scrollTop + dropdownHeight;\n\t\t\t\t\t\t// Difference between the choice and scroll position\n\t\t\t\t\t\tvar endPoint = direction > 0 ? this.choiceList.scrollTop + choicePos - containerScrollPos : choice.offsetTop;\n\n\t\t\t\t\t\tvar animateScroll = function animateScroll() {\n\t\t\t\t\t\t\tvar strength = 4;\n\t\t\t\t\t\t\tvar choiceListScrollTop = _this19.choiceList.scrollTop;\n\t\t\t\t\t\t\tvar continueAnimation = false;\n\t\t\t\t\t\t\tvar easing = void 0;\n\t\t\t\t\t\t\tvar distance = void 0;\n\n\t\t\t\t\t\t\tif (direction > 0) {\n\t\t\t\t\t\t\t\teasing = (endPoint - choiceListScrollTop) / strength;\n\t\t\t\t\t\t\t\tdistance = easing > 1 ? easing : 1;\n\n\t\t\t\t\t\t\t\t_this19.choiceList.scrollTop = choiceListScrollTop + distance;\n\t\t\t\t\t\t\t\tif (choiceListScrollTop < endPoint) {\n\t\t\t\t\t\t\t\t\tcontinueAnimation = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\teasing = (choiceListScrollTop - endPoint) / strength;\n\t\t\t\t\t\t\t\tdistance = easing > 1 ? easing : 1;\n\n\t\t\t\t\t\t\t\t_this19.choiceList.scrollTop = choiceListScrollTop - distance;\n\t\t\t\t\t\t\t\tif (choiceListScrollTop > endPoint) {\n\t\t\t\t\t\t\t\t\tcontinueAnimation = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (continueAnimation) {\n\t\t\t\t\t\t\t\trequestAnimationFrame(function (time) {\n\t\t\t\t\t\t\t\t\tanimateScroll(time, endPoint, direction);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\trequestAnimationFrame(function (time) {\n\t\t\t\t\t\t\tanimateScroll(time, endPoint, direction);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Highlight choice\n * @param {HTMLElement} [el] Element to highlight\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_highlightChoice',\n\t\t\t\t\tvalue: function _highlightChoice() {\n\t\t\t\t\t\tvar _this20 = this;\n\n\t\t\t\t\t\tvar el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n\t\t\t\t\t\t// Highlight first element in dropdown\n\t\t\t\t\t\tvar choices = Array.from(this.dropdown.querySelectorAll('[data-choice-selectable]'));\n\t\t\t\t\t\tvar passedEl = el;\n\n\t\t\t\t\t\tif (choices && choices.length) {\n\t\t\t\t\t\t\tvar highlightedChoices = Array.from(this.dropdown.querySelectorAll('.' + this.config.classNames.highlightedState));\n\n\t\t\t\t\t\t\t// Remove any highlighted choices\n\t\t\t\t\t\t\thighlightedChoices.forEach(function (choice) {\n\t\t\t\t\t\t\t\tchoice.classList.remove(_this20.config.classNames.highlightedState);\n\t\t\t\t\t\t\t\tchoice.setAttribute('aria-selected', 'false');\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (passedEl) {\n\t\t\t\t\t\t\t\tthis.highlightPosition = choices.indexOf(passedEl);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Highlight choice based on last known highlight location\n\t\t\t\t\t\t\t\tif (choices.length > this.highlightPosition) {\n\t\t\t\t\t\t\t\t\t// If we have an option to highlight\n\t\t\t\t\t\t\t\t\tpassedEl = choices[this.highlightPosition];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Otherwise highlight the option before\n\t\t\t\t\t\t\t\t\tpassedEl = choices[choices.length - 1];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!passedEl) {\n\t\t\t\t\t\t\t\t\tpassedEl = choices[0];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Highlight given option, and set accessiblity attributes\n\t\t\t\t\t\t\tpassedEl.classList.add(this.config.classNames.highlightedState);\n\t\t\t\t\t\t\tpassedEl.setAttribute('aria-selected', 'true');\n\t\t\t\t\t\t\tthis.containerOuter.setAttribute('aria-activedescendant', passedEl.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Add item to store with correct value\n * @param {String} value Value to add to store\n * @param {String} [label] Label to add to store\n * @param {Number} [choiceId=-1] ID of the associated choice that was selected\n * @param {Number} [groupId=-1] ID of group choice is within. Negative number indicates no group\n * @param {Object} [customProperties] Object containing user defined properties\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_addItem',\n\t\t\t\t\tvalue: function _addItem(value) {\n\t\t\t\t\t\tvar label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t\t\t\t\t\tvar choiceId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n\t\t\t\t\t\tvar groupId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1;\n\t\t\t\t\t\tvar customProperties = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\t\t\t\t\t\tvar placeholder = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\t\t\t\t\t\tvar keyCode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;\n\n\t\t\t\t\t\tvar passedValue = (0, _utils.isType)('String', value) ? value.trim() : value;\n\t\t\t\t\t\tvar passedKeyCode = keyCode;\n\t\t\t\t\t\tvar items = this.store.getItems();\n\t\t\t\t\t\tvar passedLabel = label || passedValue;\n\t\t\t\t\t\tvar passedOptionId = parseInt(choiceId, 10) || -1;\n\n\t\t\t\t\t\t// Get group if group ID passed\n\t\t\t\t\t\tvar group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t\t\t\t\t\t// Generate unique id\n\t\t\t\t\t\tvar id = items ? items.length + 1 : 1;\n\n\t\t\t\t\t\t// If a prepended value has been passed, prepend it\n\t\t\t\t\t\tif (this.config.prependValue) {\n\t\t\t\t\t\t\tpassedValue = this.config.prependValue + passedValue.toString();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If an appended value has been passed, append it\n\t\t\t\t\t\tif (this.config.appendValue) {\n\t\t\t\t\t\t\tpassedValue += this.config.appendValue.toString();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.addItem)(passedValue, passedLabel, id, passedOptionId, groupId, customProperties, placeholder, passedKeyCode));\n\n\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\tthis.removeActiveItems(id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Trigger change event\n\t\t\t\t\t\tif (group && group.value) {\n\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'addItem', {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\tvalue: passedValue,\n\t\t\t\t\t\t\t\tlabel: passedLabel,\n\t\t\t\t\t\t\t\tgroupValue: group.value,\n\t\t\t\t\t\t\t\tkeyCode: passedKeyCode\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'addItem', {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\tvalue: passedValue,\n\t\t\t\t\t\t\t\tlabel: passedLabel,\n\t\t\t\t\t\t\t\tkeyCode: passedKeyCode\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Remove item from store\n * @param {Object} item Item to remove\n * @return {Object} Class instance\n * @public\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_removeItem',\n\t\t\t\t\tvalue: function _removeItem(item) {\n\t\t\t\t\t\tif (!item || !(0, _utils.isType)('Object', item)) {\n\t\t\t\t\t\t\treturn this;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar id = item.id;\n\t\t\t\t\t\tvar value = item.value;\n\t\t\t\t\t\tvar label = item.label;\n\t\t\t\t\t\tvar choiceId = item.choiceId;\n\t\t\t\t\t\tvar groupId = item.groupId;\n\t\t\t\t\t\tvar group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.removeItem)(id, choiceId));\n\n\t\t\t\t\t\tif (group && group.value) {\n\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'removeItem', {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\t\tgroupValue: group.value\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t(0, _utils.triggerEvent)(this.passedElement, 'removeItem', {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t\tlabel: label\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Add choice to dropdown\n * @param {String} value Value of choice\n * @param {String} [label] Label of choice\n * @param {Boolean} [isSelected=false] Whether choice is selected\n * @param {Boolean} [isDisabled=false] Whether choice is disabled\n * @param {Number} [groupId=-1] ID of group choice is within. Negative number indicates no group\n * @param {Object} [customProperties] Object containing user defined properties\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_addChoice',\n\t\t\t\t\tvalue: function _addChoice(value) {\n\t\t\t\t\t\tvar label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t\t\t\t\t\tvar isSelected = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\t\t\t\t\t\tvar isDisabled = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\t\t\t\t\t\tvar groupId = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1;\n\t\t\t\t\t\tvar customProperties = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n\t\t\t\t\t\tvar placeholder = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n\t\t\t\t\t\tvar keyCode = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;\n\n\t\t\t\t\t\tif (typeof value === 'undefined' || value === null) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Generate unique id\n\t\t\t\t\t\tvar choices = this.store.getChoices();\n\t\t\t\t\t\tvar choiceLabel = label || value;\n\t\t\t\t\t\tvar choiceId = choices ? choices.length + 1 : 1;\n\t\t\t\t\t\tvar choiceElementId = this.baseId + '-' + this.idNames.itemChoice + '-' + choiceId;\n\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.addChoice)(value, choiceLabel, choiceId, groupId, isDisabled, choiceElementId, customProperties, placeholder, keyCode));\n\n\t\t\t\t\t\tif (isSelected) {\n\t\t\t\t\t\t\tthis._addItem(value, choiceLabel, choiceId, undefined, customProperties, placeholder, keyCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Clear all choices added to the store.\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_clearChoices',\n\t\t\t\t\tvalue: function _clearChoices() {\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.clearChoices)());\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Add group to dropdown\n * @param {Object} group Group to add\n * @param {Number} id Group ID\n * @param {String} [valueKey] name of the value property on the object\n * @param {String} [labelKey] name of the label property on the object\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_addGroup',\n\t\t\t\t\tvalue: function _addGroup(group, id) {\n\t\t\t\t\t\tvar _this21 = this;\n\n\t\t\t\t\t\tvar valueKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value';\n\t\t\t\t\t\tvar labelKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'label';\n\n\t\t\t\t\t\tvar groupChoices = (0, _utils.isType)('Object', group) ? group.choices : Array.from(group.getElementsByTagName('OPTION'));\n\t\t\t\t\t\tvar groupId = id ? id : Math.floor(new Date().valueOf() * Math.random());\n\t\t\t\t\t\tvar isDisabled = group.disabled ? group.disabled : false;\n\n\t\t\t\t\t\tif (groupChoices) {\n\t\t\t\t\t\t\tthis.store.dispatch((0, _index3.addGroup)(group.label, groupId, true, isDisabled));\n\n\t\t\t\t\t\t\tgroupChoices.forEach(function (option) {\n\t\t\t\t\t\t\t\tvar isOptDisabled = option.disabled || option.parentNode && option.parentNode.disabled;\n\t\t\t\t\t\t\t\t_this21._addChoice(option[valueKey], (0, _utils.isType)('Object', option) ? option[labelKey] : option.innerHTML, option.selected, isOptDisabled, groupId, option.customProperties, option.placeholder);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.store.dispatch((0, _index3.addGroup)(group.label, group.id, false, group.disabled));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get template from name\n * @param {String} template Name of template to get\n * @param {...} args Data to pass to template\n * @return {HTMLElement} Template\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_getTemplate',\n\t\t\t\t\tvalue: function _getTemplate(template) {\n\t\t\t\t\t\tif (!template) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar templates = this.config.templates;\n\n\t\t\t\t\t\tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t\t\t\t\t\t\targs[_key - 1] = arguments[_key];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn templates[template].apply(templates, args);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Create HTML element based on type and arguments\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_createTemplates',\n\t\t\t\t\tvalue: function _createTemplates() {\n\t\t\t\t\t\tvar _this22 = this;\n\n\t\t\t\t\t\tvar globalClasses = this.config.classNames;\n\t\t\t\t\t\tvar templates = {\n\t\t\t\t\t\t\tcontainerOuter: function containerOuter(direction) {\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcontainerInner: function containerInner() {\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n
\\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\titemList: function itemList() {\n\t\t\t\t\t\t\t\tvar _classNames;\n\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.list, (_classNames = {}, _defineProperty(_classNames, globalClasses.listSingle, _this22.isSelectOneElement), _defineProperty(_classNames, globalClasses.listItems, !_this22.isSelectOneElement), _classNames));\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n
\\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tplaceholder: function placeholder(value) {\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n
\\n ' + value + '\\n
\\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\titem: function item(data) {\n\t\t\t\t\t\t\t\tvar _classNames2;\n\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.item, (_classNames2 = {}, _defineProperty(_classNames2, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames2, globalClasses.itemSelectable, !data.highlighted), _defineProperty(_classNames2, globalClasses.placeholder, data.placeholder), _classNames2));\n\n\t\t\t\t\t\t\t\tif (_this22.config.removeItemButton) {\n\t\t\t\t\t\t\t\t\tvar _classNames3;\n\n\t\t\t\t\t\t\t\t\tlocalClasses = (0, _classnames2.default)(globalClasses.item, (_classNames3 = {}, _defineProperty(_classNames3, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames3, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames3, globalClasses.placeholder, data.placeholder), _classNames3));\n\n\t\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n ' + data.label + '\\n \\n \\n \\n ');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n ' + data.label + '\\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchoiceList: function choiceList() {\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchoiceGroup: function choiceGroup(data) {\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.group, _defineProperty({}, globalClasses.itemDisabled, data.disabled));\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n
' + data.value + '
\\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tchoice: function choice(data) {\n\t\t\t\t\t\t\t\tvar _classNames5;\n\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.item, globalClasses.itemChoice, (_classNames5 = {}, _defineProperty(_classNames5, globalClasses.itemDisabled, data.disabled), _defineProperty(_classNames5, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames5, globalClasses.placeholder, data.placeholder), _classNames5));\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n 0 ? 'role=\"treeitem\"' : 'role=\"option\"') + '\\n >\\n ' + data.label + '\\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinput: function input() {\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.input, globalClasses.inputCloned);\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdropdown: function dropdown() {\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.list, globalClasses.listDropdown);\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n \\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnotice: function notice(label) {\n\t\t\t\t\t\t\t\tvar _classNames6;\n\n\t\t\t\t\t\t\t\tvar type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n\t\t\t\t\t\t\t\tvar localClasses = (0, _classnames2.default)(globalClasses.item, globalClasses.itemChoice, (_classNames6 = {}, _defineProperty(_classNames6, globalClasses.noResults, type === 'no-results'), _defineProperty(_classNames6, globalClasses.noChoices, type === 'no-choices'), _classNames6));\n\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n
\\n ' + label + '\\n
\\n ');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\toption: function option(data) {\n\t\t\t\t\t\t\t\treturn (0, _utils.strToEl)('\\n \\n ');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// User's custom templates\n\t\t\t\t\t\tvar callbackTemplate = this.config.callbackOnCreateTemplates;\n\t\t\t\t\t\tvar userTemplates = {};\n\t\t\t\t\t\tif (callbackTemplate && (0, _utils.isType)('Function', callbackTemplate)) {\n\t\t\t\t\t\t\tuserTemplates = callbackTemplate.call(this, _utils.strToEl);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.config.templates = (0, _utils.extend)(templates, userTemplates);\n\t\t\t\t\t}\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_setLoading',\n\t\t\t\t\tvalue: function _setLoading(isLoading) {\n\t\t\t\t\t\tthis.store.dispatch((0, _index3.setIsLoading)(isLoading));\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Create DOM structure around passed select element\n * @return\n * @private\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: '_createInput',\n\t\t\t\t\tvalue: function _createInput() {\n\t\t\t\t\t\tvar _this23 = this;\n\n\t\t\t\t\t\tvar direction = this.passedElement.getAttribute('dir') || 'ltr';\n\t\t\t\t\t\tvar containerOuter = this._getTemplate('containerOuter', direction);\n\t\t\t\t\t\tvar containerInner = this._getTemplate('containerInner');\n\t\t\t\t\t\tvar itemList = this._getTemplate('itemList');\n\t\t\t\t\t\tvar choiceList = this._getTemplate('choiceList');\n\t\t\t\t\t\tvar input = this._getTemplate('input');\n\t\t\t\t\t\tvar dropdown = this._getTemplate('dropdown');\n\n\t\t\t\t\t\tthis.containerOuter = containerOuter;\n\t\t\t\t\t\tthis.containerInner = containerInner;\n\t\t\t\t\t\tthis.input = input;\n\t\t\t\t\t\tthis.choiceList = choiceList;\n\t\t\t\t\t\tthis.itemList = itemList;\n\t\t\t\t\t\tthis.dropdown = dropdown;\n\n\t\t\t\t\t\t// Hide passed input\n\t\t\t\t\t\tthis.passedElement.classList.add(this.config.classNames.input, this.config.classNames.hiddenState);\n\n\t\t\t\t\t\t// Remove element from tab index\n\t\t\t\t\t\tthis.passedElement.tabIndex = '-1';\n\n\t\t\t\t\t\t// Backup original styles if any\n\t\t\t\t\t\tvar origStyle = this.passedElement.getAttribute('style');\n\n\t\t\t\t\t\tif (Boolean(origStyle)) {\n\t\t\t\t\t\t\tthis.passedElement.setAttribute('data-choice-orig-style', origStyle);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.passedElement.setAttribute('style', 'display:none;');\n\t\t\t\t\t\tthis.passedElement.setAttribute('aria-hidden', 'true');\n\t\t\t\t\t\tthis.passedElement.setAttribute('data-choice', 'active');\n\n\t\t\t\t\t\t// Wrap input in container preserving DOM ordering\n\t\t\t\t\t\t(0, _utils.wrap)(this.passedElement, containerInner);\n\n\t\t\t\t\t\t// Wrapper inner container with outer container\n\t\t\t\t\t\t(0, _utils.wrap)(containerInner, containerOuter);\n\n\t\t\t\t\t\tif (this.isSelectOneElement) {\n\t\t\t\t\t\t\tinput.placeholder = this.config.searchPlaceholderValue || '';\n\t\t\t\t\t\t} else if (this.placeholder) {\n\t\t\t\t\t\t\tinput.placeholder = this.placeholder;\n\t\t\t\t\t\t\tinput.style.width = (0, _utils.getWidthOfInput)(input);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!this.config.addItems) {\n\t\t\t\t\t\t\tthis.disable();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontainerOuter.appendChild(containerInner);\n\t\t\t\t\t\tcontainerOuter.appendChild(dropdown);\n\t\t\t\t\t\tcontainerInner.appendChild(itemList);\n\n\t\t\t\t\t\tif (!this.isTextElement) {\n\t\t\t\t\t\t\tdropdown.appendChild(choiceList);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.isSelectMultipleElement || this.isTextElement) {\n\t\t\t\t\t\t\tcontainerInner.appendChild(input);\n\t\t\t\t\t\t} else if (this.canSearch) {\n\t\t\t\t\t\t\tdropdown.insertBefore(input, dropdown.firstChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.isSelectElement) {\n\t\t\t\t\t\t\tvar passedGroups = Array.from(this.passedElement.getElementsByTagName('OPTGROUP'));\n\n\t\t\t\t\t\t\tthis.highlightPosition = 0;\n\t\t\t\t\t\t\tthis.isSearching = false;\n\n\t\t\t\t\t\t\tthis._setLoading(true);\n\n\t\t\t\t\t\t\tif (passedGroups && passedGroups.length) {\n\t\t\t\t\t\t\t\tpassedGroups.forEach(function (group) {\n\t\t\t\t\t\t\t\t\t_this23._addGroup(group, group.id || null);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar passedOptions = Array.from(this.passedElement.options);\n\t\t\t\t\t\t\t\tvar filter = this.config.sortFilter;\n\t\t\t\t\t\t\t\tvar allChoices = this.presetChoices;\n\n\t\t\t\t\t\t\t\t// Create array of options from option elements\n\t\t\t\t\t\t\t\tpassedOptions.forEach(function (o) {\n\t\t\t\t\t\t\t\t\tallChoices.push({\n\t\t\t\t\t\t\t\t\t\tvalue: o.value,\n\t\t\t\t\t\t\t\t\t\tlabel: o.innerHTML,\n\t\t\t\t\t\t\t\t\t\tselected: o.selected,\n\t\t\t\t\t\t\t\t\t\tdisabled: o.disabled || o.parentNode.disabled,\n\t\t\t\t\t\t\t\t\t\tplaceholder: o.hasAttribute('placeholder')\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t// If sorting is enabled or the user is searching, filter choices\n\t\t\t\t\t\t\t\tif (this.config.shouldSort) {\n\t\t\t\t\t\t\t\t\tallChoices.sort(filter);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Determine whether there is a selected choice\n\t\t\t\t\t\t\t\tvar hasSelectedChoice = allChoices.some(function (choice) {\n\t\t\t\t\t\t\t\t\treturn choice.selected;\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t// Add each choice\n\t\t\t\t\t\t\t\tallChoices.forEach(function (choice, index) {\n\t\t\t\t\t\t\t\t\t// Pre-select first choice if it's a single select\n\t\t\t\t\t\t\t\t\tif (_this23.isSelectOneElement) {\n\t\t\t\t\t\t\t\t\t\t// If there is a selected choice already or the choice is not\n\t\t\t\t\t\t\t\t\t\t// the first in the array, add each choice normally\n\t\t\t\t\t\t\t\t\t\t// Otherwise pre-select the first choice in the array\n\t\t\t\t\t\t\t\t\t\tvar shouldPreselect = hasSelectedChoice || !hasSelectedChoice && index > 0;\n\t\t\t\t\t\t\t\t\t\t_this23._addChoice(choice.value, choice.label, shouldPreselect ? choice.selected : true, shouldPreselect ? choice.disabled : false, undefined, choice.customProperties, choice.placeholder);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t_this23._addChoice(choice.value, choice.label, choice.selected, choice.disabled, undefined, choice.customProperties, choice.placeholder);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._setLoading(false);\n\t\t\t\t\t\t} else if (this.isTextElement) {\n\t\t\t\t\t\t\t// Add any preset values seperated by delimiter\n\t\t\t\t\t\t\tthis.presetItems.forEach(function (item) {\n\t\t\t\t\t\t\t\tvar itemType = (0, _utils.getType)(item);\n\t\t\t\t\t\t\t\tif (itemType === 'Object') {\n\t\t\t\t\t\t\t\t\tif (!item.value) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t_this23._addItem(item.value, item.label, item.id, undefined, item.customProperties, item.placeholder);\n\t\t\t\t\t\t\t\t} else if (itemType === 'String') {\n\t\t\t\t\t\t\t\t\t_this23._addItem(item);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*===== End of Private functions ======*/\n\n\t\t\t\t}]);\n\n\t\t\t\treturn Choices;\n\t\t\t}();\n\n\t\t\tmodule.exports = Choices;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 2 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t/**\n * @license\n * Fuse - Lightweight fuzzy-search\n *\n * Copyright (c) 2012-2016 Kirollos Risk .\n * All Rights Reserved. Apache Software License 2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\t\t\t;(function (global) {\n\t\t\t\t'use strict';\n\n\t\t\t\t/** @type {function(...*)} */\n\n\t\t\t\tfunction log() {\n\t\t\t\t\tconsole.log.apply(console, arguments);\n\t\t\t\t}\n\n\t\t\t\tvar defaultOptions = {\n\t\t\t\t\t// The name of the identifier property. If specified, the returned result will be a list\n\t\t\t\t\t// of the items' dentifiers, otherwise it will be a list of the items.\n\t\t\t\t\tid: null,\n\n\t\t\t\t\t// Indicates whether comparisons should be case sensitive.\n\n\t\t\t\t\tcaseSensitive: false,\n\n\t\t\t\t\t// An array of values that should be included from the searcher's output. When this array\n\t\t\t\t\t// contains elements, each result in the list will be of the form `{ item: ..., include1: ..., include2: ... }`.\n\t\t\t\t\t// Values you can include are `score`, `matchedLocations`\n\t\t\t\t\tinclude: [],\n\n\t\t\t\t\t// Whether to sort the result list, by score\n\t\t\t\t\tshouldSort: true,\n\n\t\t\t\t\t// The search function to use\n\t\t\t\t\t// Note that the default search function ([[Function]]) must conform to the following API:\n\t\t\t\t\t//\n\t\t\t\t\t// @param pattern The pattern string to search\n\t\t\t\t\t// @param options The search option\n\t\t\t\t\t// [[Function]].constructor = function(pattern, options)\n\t\t\t\t\t//\n\t\t\t\t\t// @param text: the string to search in for the pattern\n\t\t\t\t\t// @return Object in the form of:\n\t\t\t\t\t// - isMatch: boolean\n\t\t\t\t\t// - score: Int\n\t\t\t\t\t// [[Function]].prototype.search = function(text)\n\t\t\t\t\tsearchFn: BitapSearcher,\n\n\t\t\t\t\t// Default sort function\n\t\t\t\t\tsortFn: function sortFn(a, b) {\n\t\t\t\t\t\treturn a.score - b.score;\n\t\t\t\t\t},\n\n\t\t\t\t\t// The get function to use when fetching an object's properties.\n\t\t\t\t\t// The default will search nested paths *ie foo.bar.baz*\n\t\t\t\t\tgetFn: deepValue,\n\n\t\t\t\t\t// List of properties that will be searched. This also supports nested properties.\n\t\t\t\t\tkeys: [],\n\n\t\t\t\t\t// Will print to the console. Useful for debugging.\n\t\t\t\t\tverbose: false,\n\n\t\t\t\t\t// When true, the search algorithm will search individual words **and** the full string,\n\t\t\t\t\t// computing the final score as a function of both. Note that when `tokenize` is `true`,\n\t\t\t\t\t// the `threshold`, `distance`, and `location` are inconsequential for individual tokens.\n\t\t\t\t\ttokenize: false,\n\n\t\t\t\t\t// When true, the result set will only include records that match all tokens. Will only work\n\t\t\t\t\t// if `tokenize` is also true.\n\t\t\t\t\tmatchAllTokens: false,\n\n\t\t\t\t\t// Regex used to separate words when searching. Only applicable when `tokenize` is `true`.\n\t\t\t\t\ttokenSeparator: / +/g,\n\n\t\t\t\t\t// Minimum number of characters that must be matched before a result is considered a match\n\t\t\t\t\tminMatchCharLength: 1,\n\n\t\t\t\t\t// When true, the algorithm continues searching to the end of the input even if a perfect\n\t\t\t\t\t// match is found before the end of the same input.\n\t\t\t\t\tfindAllMatches: false\n\n\t\t\t\t\t/**\n * @constructor\n * @param {!Array} list\n * @param {!Object} options\n */\n\t\t\t\t};function Fuse(list, options) {\n\t\t\t\t\tvar key;\n\n\t\t\t\t\tthis.list = list;\n\t\t\t\t\tthis.options = options = options || {};\n\n\t\t\t\t\tfor (key in defaultOptions) {\n\t\t\t\t\t\tif (!defaultOptions.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Add boolean type options\n\t\t\t\t\t\tif (typeof defaultOptions[key] === 'boolean') {\n\t\t\t\t\t\t\tthis.options[key] = key in options ? options[key] : defaultOptions[key];\n\t\t\t\t\t\t\t// Add all other options\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.options[key] = options[key] || defaultOptions[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tFuse.VERSION = '2.7.3';\n\n\t\t\t\t/**\n * Sets a new list for Fuse to match against.\n * @param {!Array} list\n * @return {!Array} The newly set list\n * @public\n */\n\t\t\t\tFuse.prototype.set = function (list) {\n\t\t\t\t\tthis.list = list;\n\t\t\t\t\treturn list;\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype.search = function (pattern) {\n\t\t\t\t\tif (this.options.verbose) log('\\nSearch term:', pattern, '\\n');\n\n\t\t\t\t\tthis.pattern = pattern;\n\t\t\t\t\tthis.results = [];\n\t\t\t\t\tthis.resultMap = {};\n\t\t\t\t\tthis._keyMap = null;\n\n\t\t\t\t\tthis._prepareSearchers();\n\t\t\t\t\tthis._startSearch();\n\t\t\t\t\tthis._computeScore();\n\t\t\t\t\tthis._sort();\n\n\t\t\t\t\tvar output = this._format();\n\t\t\t\t\treturn output;\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype._prepareSearchers = function () {\n\t\t\t\t\tvar options = this.options;\n\t\t\t\t\tvar pattern = this.pattern;\n\t\t\t\t\tvar searchFn = options.searchFn;\n\t\t\t\t\tvar tokens = pattern.split(options.tokenSeparator);\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar len = tokens.length;\n\n\t\t\t\t\tif (this.options.tokenize) {\n\t\t\t\t\t\tthis.tokenSearchers = [];\n\t\t\t\t\t\tfor (; i < len; i++) {\n\t\t\t\t\t\t\tthis.tokenSearchers.push(new searchFn(tokens[i], options));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.fullSeacher = new searchFn(pattern, options);\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype._startSearch = function () {\n\t\t\t\t\tvar options = this.options;\n\t\t\t\t\tvar getFn = options.getFn;\n\t\t\t\t\tvar list = this.list;\n\t\t\t\t\tvar listLen = list.length;\n\t\t\t\t\tvar keys = this.options.keys;\n\t\t\t\t\tvar keysLen = keys.length;\n\t\t\t\t\tvar key;\n\t\t\t\t\tvar weight;\n\t\t\t\t\tvar item = null;\n\t\t\t\t\tvar i;\n\t\t\t\t\tvar j;\n\n\t\t\t\t\t// Check the first item in the list, if it's a string, then we assume\n\t\t\t\t\t// that every item in the list is also a string, and thus it's a flattened array.\n\t\t\t\t\tif (typeof list[0] === 'string') {\n\t\t\t\t\t\t// Iterate over every item\n\t\t\t\t\t\tfor (i = 0; i < listLen; i++) {\n\t\t\t\t\t\t\tthis._analyze('', list[i], i, i);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._keyMap = {};\n\t\t\t\t\t\t// Otherwise, the first item is an Object (hopefully), and thus the searching\n\t\t\t\t\t\t// is done on the values of the keys of each item.\n\t\t\t\t\t\t// Iterate over every item\n\t\t\t\t\t\tfor (i = 0; i < listLen; i++) {\n\t\t\t\t\t\t\titem = list[i];\n\t\t\t\t\t\t\t// Iterate over every key\n\t\t\t\t\t\t\tfor (j = 0; j < keysLen; j++) {\n\t\t\t\t\t\t\t\tkey = keys[j];\n\t\t\t\t\t\t\t\tif (typeof key !== 'string') {\n\t\t\t\t\t\t\t\t\tweight = 1 - key.weight || 1;\n\t\t\t\t\t\t\t\t\tthis._keyMap[key.name] = {\n\t\t\t\t\t\t\t\t\t\tweight: weight\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tif (key.weight <= 0 || key.weight > 1) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error('Key weight has to be > 0 and <= 1');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tkey = key.name;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis._keyMap[key] = {\n\t\t\t\t\t\t\t\t\t\tweight: 1\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._analyze(key, getFn(item, key, []), item, i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype._analyze = function (key, text, entity, index) {\n\t\t\t\t\tvar options = this.options;\n\t\t\t\t\tvar words;\n\t\t\t\t\tvar scores;\n\t\t\t\t\tvar exists = false;\n\t\t\t\t\tvar existingResult;\n\t\t\t\t\tvar averageScore;\n\t\t\t\t\tvar finalScore;\n\t\t\t\t\tvar scoresLen;\n\t\t\t\t\tvar mainSearchResult;\n\t\t\t\t\tvar tokenSearcher;\n\t\t\t\t\tvar termScores;\n\t\t\t\t\tvar word;\n\t\t\t\t\tvar tokenSearchResult;\n\t\t\t\t\tvar hasMatchInText;\n\t\t\t\t\tvar checkTextMatches;\n\t\t\t\t\tvar i;\n\t\t\t\t\tvar j;\n\n\t\t\t\t\t// Check if the text can be searched\n\t\t\t\t\tif (text === undefined || text === null) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tscores = [];\n\n\t\t\t\t\tvar numTextMatches = 0;\n\n\t\t\t\t\tif (typeof text === 'string') {\n\t\t\t\t\t\twords = text.split(options.tokenSeparator);\n\n\t\t\t\t\t\tif (options.verbose) log('---------\\nKey:', key);\n\n\t\t\t\t\t\tif (this.options.tokenize) {\n\t\t\t\t\t\t\tfor (i = 0; i < this.tokenSearchers.length; i++) {\n\t\t\t\t\t\t\t\ttokenSearcher = this.tokenSearchers[i];\n\n\t\t\t\t\t\t\t\tif (options.verbose) log('Pattern:', tokenSearcher.pattern);\n\n\t\t\t\t\t\t\t\ttermScores = [];\n\t\t\t\t\t\t\t\thasMatchInText = false;\n\n\t\t\t\t\t\t\t\tfor (j = 0; j < words.length; j++) {\n\t\t\t\t\t\t\t\t\tword = words[j];\n\t\t\t\t\t\t\t\t\ttokenSearchResult = tokenSearcher.search(word);\n\t\t\t\t\t\t\t\t\tvar obj = {};\n\t\t\t\t\t\t\t\t\tif (tokenSearchResult.isMatch) {\n\t\t\t\t\t\t\t\t\t\tobj[word] = tokenSearchResult.score;\n\t\t\t\t\t\t\t\t\t\texists = true;\n\t\t\t\t\t\t\t\t\t\thasMatchInText = true;\n\t\t\t\t\t\t\t\t\t\tscores.push(tokenSearchResult.score);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tobj[word] = 1;\n\t\t\t\t\t\t\t\t\t\tif (!this.options.matchAllTokens) {\n\t\t\t\t\t\t\t\t\t\t\tscores.push(1);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttermScores.push(obj);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (hasMatchInText) {\n\t\t\t\t\t\t\t\t\tnumTextMatches++;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (options.verbose) log('Token scores:', termScores);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\taverageScore = scores[0];\n\t\t\t\t\t\t\tscoresLen = scores.length;\n\t\t\t\t\t\t\tfor (i = 1; i < scoresLen; i++) {\n\t\t\t\t\t\t\t\taverageScore += scores[i];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taverageScore = averageScore / scoresLen;\n\n\t\t\t\t\t\t\tif (options.verbose) log('Token score average:', averageScore);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmainSearchResult = this.fullSeacher.search(text);\n\t\t\t\t\t\tif (options.verbose) log('Full text score:', mainSearchResult.score);\n\n\t\t\t\t\t\tfinalScore = mainSearchResult.score;\n\t\t\t\t\t\tif (averageScore !== undefined) {\n\t\t\t\t\t\t\tfinalScore = (finalScore + averageScore) / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (options.verbose) log('Score average:', finalScore);\n\n\t\t\t\t\t\tcheckTextMatches = this.options.tokenize && this.options.matchAllTokens ? numTextMatches >= this.tokenSearchers.length : true;\n\n\t\t\t\t\t\tif (options.verbose) log('Check Matches', checkTextMatches);\n\n\t\t\t\t\t\t// If a match is found, add the item to , including its score\n\t\t\t\t\t\tif ((exists || mainSearchResult.isMatch) && checkTextMatches) {\n\t\t\t\t\t\t\t// Check if the item already exists in our results\n\t\t\t\t\t\t\texistingResult = this.resultMap[index];\n\n\t\t\t\t\t\t\tif (existingResult) {\n\t\t\t\t\t\t\t\t// Use the lowest score\n\t\t\t\t\t\t\t\t// existingResult.score, bitapResult.score\n\t\t\t\t\t\t\t\texistingResult.output.push({\n\t\t\t\t\t\t\t\t\tkey: key,\n\t\t\t\t\t\t\t\t\tscore: finalScore,\n\t\t\t\t\t\t\t\t\tmatchedIndices: mainSearchResult.matchedIndices\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Add it to the raw result list\n\t\t\t\t\t\t\t\tthis.resultMap[index] = {\n\t\t\t\t\t\t\t\t\titem: entity,\n\t\t\t\t\t\t\t\t\toutput: [{\n\t\t\t\t\t\t\t\t\t\tkey: key,\n\t\t\t\t\t\t\t\t\t\tscore: finalScore,\n\t\t\t\t\t\t\t\t\t\tmatchedIndices: mainSearchResult.matchedIndices\n\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tthis.results.push(this.resultMap[index]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (isArray(text)) {\n\t\t\t\t\t\tfor (i = 0; i < text.length; i++) {\n\t\t\t\t\t\t\tthis._analyze(key, text[i], entity, index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype._computeScore = function () {\n\t\t\t\t\tvar i;\n\t\t\t\t\tvar j;\n\t\t\t\t\tvar keyMap = this._keyMap;\n\t\t\t\t\tvar totalScore;\n\t\t\t\t\tvar output;\n\t\t\t\t\tvar scoreLen;\n\t\t\t\t\tvar score;\n\t\t\t\t\tvar weight;\n\t\t\t\t\tvar results = this.results;\n\t\t\t\t\tvar bestScore;\n\t\t\t\t\tvar nScore;\n\n\t\t\t\t\tif (this.options.verbose) log('\\n\\nComputing score:\\n');\n\n\t\t\t\t\tfor (i = 0; i < results.length; i++) {\n\t\t\t\t\t\ttotalScore = 0;\n\t\t\t\t\t\toutput = results[i].output;\n\t\t\t\t\t\tscoreLen = output.length;\n\n\t\t\t\t\t\tbestScore = 1;\n\n\t\t\t\t\t\tfor (j = 0; j < scoreLen; j++) {\n\t\t\t\t\t\t\tscore = output[j].score;\n\t\t\t\t\t\t\tweight = keyMap ? keyMap[output[j].key].weight : 1;\n\n\t\t\t\t\t\t\tnScore = score * weight;\n\n\t\t\t\t\t\t\tif (weight !== 1) {\n\t\t\t\t\t\t\t\tbestScore = Math.min(bestScore, nScore);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttotalScore += nScore;\n\t\t\t\t\t\t\t\toutput[j].nScore = nScore;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (bestScore === 1) {\n\t\t\t\t\t\t\tresults[i].score = totalScore / scoreLen;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresults[i].score = bestScore;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.options.verbose) log(results[i]);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype._sort = function () {\n\t\t\t\t\tvar options = this.options;\n\t\t\t\t\tif (options.shouldSort) {\n\t\t\t\t\t\tif (options.verbose) log('\\n\\nSorting....');\n\t\t\t\t\t\tthis.results.sort(options.sortFn);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tFuse.prototype._format = function () {\n\t\t\t\t\tvar options = this.options;\n\t\t\t\t\tvar getFn = options.getFn;\n\t\t\t\t\tvar finalOutput = [];\n\t\t\t\t\tvar i;\n\t\t\t\t\tvar len;\n\t\t\t\t\tvar results = this.results;\n\t\t\t\t\tvar replaceValue;\n\t\t\t\t\tvar getItemAtIndex;\n\t\t\t\t\tvar include = options.include;\n\n\t\t\t\t\tif (options.verbose) log('\\n\\nOutput:\\n\\n', results);\n\n\t\t\t\t\t// Helper function, here for speed-up, which replaces the item with its value,\n\t\t\t\t\t// if the options specifies it,\n\t\t\t\t\treplaceValue = options.id ? function (index) {\n\t\t\t\t\t\tresults[index].item = getFn(results[index].item, options.id, [])[0];\n\t\t\t\t\t} : function () {};\n\n\t\t\t\t\tgetItemAtIndex = function getItemAtIndex(index) {\n\t\t\t\t\t\tvar record = results[index];\n\t\t\t\t\t\tvar data;\n\t\t\t\t\t\tvar j;\n\t\t\t\t\t\tvar output;\n\t\t\t\t\t\tvar _item;\n\t\t\t\t\t\tvar _result;\n\n\t\t\t\t\t\t// If `include` has values, put the item in the result\n\t\t\t\t\t\tif (include.length > 0) {\n\t\t\t\t\t\t\tdata = {\n\t\t\t\t\t\t\t\titem: record.item\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (include.indexOf('matches') !== -1) {\n\t\t\t\t\t\t\t\toutput = record.output;\n\t\t\t\t\t\t\t\tdata.matches = [];\n\t\t\t\t\t\t\t\tfor (j = 0; j < output.length; j++) {\n\t\t\t\t\t\t\t\t\t_item = output[j];\n\t\t\t\t\t\t\t\t\t_result = {\n\t\t\t\t\t\t\t\t\t\tindices: _item.matchedIndices\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tif (_item.key) {\n\t\t\t\t\t\t\t\t\t\t_result.key = _item.key;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdata.matches.push(_result);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (include.indexOf('score') !== -1) {\n\t\t\t\t\t\t\t\tdata.score = results[index].score;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdata = record.item;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn data;\n\t\t\t\t\t};\n\n\t\t\t\t\t// From the results, push into a new array only the item identifier (if specified)\n\t\t\t\t\t// of the entire item. This is because we don't want to return the ,\n\t\t\t\t\t// since it contains other metadata\n\t\t\t\t\tfor (i = 0, len = results.length; i < len; i++) {\n\t\t\t\t\t\treplaceValue(i);\n\t\t\t\t\t\tfinalOutput.push(getItemAtIndex(i));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn finalOutput;\n\t\t\t\t};\n\n\t\t\t\t// Helpers\n\n\t\t\t\tfunction deepValue(obj, path, list) {\n\t\t\t\t\tvar firstSegment;\n\t\t\t\t\tvar remaining;\n\t\t\t\t\tvar dotIndex;\n\t\t\t\t\tvar value;\n\t\t\t\t\tvar i;\n\t\t\t\t\tvar len;\n\n\t\t\t\t\tif (!path) {\n\t\t\t\t\t\t// If there's no path left, we've gotten to the object we care about.\n\t\t\t\t\t\tlist.push(obj);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdotIndex = path.indexOf('.');\n\n\t\t\t\t\t\tif (dotIndex !== -1) {\n\t\t\t\t\t\t\tfirstSegment = path.slice(0, dotIndex);\n\t\t\t\t\t\t\tremaining = path.slice(dotIndex + 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfirstSegment = path;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalue = obj[firstSegment];\n\t\t\t\t\t\tif (value !== null && value !== undefined) {\n\t\t\t\t\t\t\tif (!remaining && (typeof value === 'string' || typeof value === 'number')) {\n\t\t\t\t\t\t\t\tlist.push(value);\n\t\t\t\t\t\t\t} else if (isArray(value)) {\n\t\t\t\t\t\t\t\t// Search each item in the array.\n\t\t\t\t\t\t\t\tfor (i = 0, len = value.length; i < len; i++) {\n\t\t\t\t\t\t\t\t\tdeepValue(value[i], remaining, list);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (remaining) {\n\t\t\t\t\t\t\t\t// An object. Recurse further.\n\t\t\t\t\t\t\t\tdeepValue(value, remaining, list);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn list;\n\t\t\t\t}\n\n\t\t\t\tfunction isArray(obj) {\n\t\t\t\t\treturn Object.prototype.toString.call(obj) === '[object Array]';\n\t\t\t\t}\n\n\t\t\t\t/**\n * Adapted from \"Diff, Match and Patch\", by Google\n *\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Modified by: Kirollos Risk \n * -----------------------------------------------\n * Details: the algorithm and structure was modified to allow the creation of\n * instances with a method which does the actual\n * bitap search. The (the string that is searched for) is only defined\n * once per instance and thus it eliminates redundant re-creation when searching\n * over a list of strings.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\")\n * you may not use this file except in compliance with the License.\n *\n * @constructor\n */\n\t\t\t\tfunction BitapSearcher(pattern, options) {\n\t\t\t\t\toptions = options || {};\n\t\t\t\t\tthis.options = options;\n\t\t\t\t\tthis.options.location = options.location || BitapSearcher.defaultOptions.location;\n\t\t\t\t\tthis.options.distance = 'distance' in options ? options.distance : BitapSearcher.defaultOptions.distance;\n\t\t\t\t\tthis.options.threshold = 'threshold' in options ? options.threshold : BitapSearcher.defaultOptions.threshold;\n\t\t\t\t\tthis.options.maxPatternLength = options.maxPatternLength || BitapSearcher.defaultOptions.maxPatternLength;\n\n\t\t\t\t\tthis.pattern = options.caseSensitive ? pattern : pattern.toLowerCase();\n\t\t\t\t\tthis.patternLen = pattern.length;\n\n\t\t\t\t\tif (this.patternLen <= this.options.maxPatternLength) {\n\t\t\t\t\t\tthis.matchmask = 1 << this.patternLen - 1;\n\t\t\t\t\t\tthis.patternAlphabet = this._calculatePatternAlphabet();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tBitapSearcher.defaultOptions = {\n\t\t\t\t\t// Approximately where in the text is the pattern expected to be found?\n\t\t\t\t\tlocation: 0,\n\n\t\t\t\t\t// Determines how close the match must be to the fuzzy location (specified above).\n\t\t\t\t\t// An exact letter match which is 'distance' characters away from the fuzzy location\n\t\t\t\t\t// would score as a complete mismatch. A distance of '0' requires the match be at\n\t\t\t\t\t// the exact location specified, a threshold of '1000' would require a perfect match\n\t\t\t\t\t// to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n\t\t\t\t\tdistance: 100,\n\n\t\t\t\t\t// At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n\t\t\t\t\t// (of both letters and location), a threshold of '1.0' would match anything.\n\t\t\t\t\tthreshold: 0.6,\n\n\t\t\t\t\t// Machine word size\n\t\t\t\t\tmaxPatternLength: 32\n\n\t\t\t\t\t/**\n * Initialize the alphabet for the Bitap algorithm.\n * @return {Object} Hash of character locations.\n * @private\n */\n\t\t\t\t};BitapSearcher.prototype._calculatePatternAlphabet = function () {\n\t\t\t\t\tvar mask = {},\n\t\t\t\t\t i = 0;\n\n\t\t\t\t\tfor (i = 0; i < this.patternLen; i++) {\n\t\t\t\t\t\tmask[this.pattern.charAt(i)] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < this.patternLen; i++) {\n\t\t\t\t\t\tmask[this.pattern.charAt(i)] |= 1 << this.pattern.length - i - 1;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn mask;\n\t\t\t\t};\n\n\t\t\t\t/**\n * Compute and return the score for a match with `e` errors and `x` location.\n * @param {number} errors Number of errors in match.\n * @param {number} location Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n\t\t\t\tBitapSearcher.prototype._bitapScore = function (errors, location) {\n\t\t\t\t\tvar accuracy = errors / this.patternLen,\n\t\t\t\t\t proximity = Math.abs(this.options.location - location);\n\n\t\t\t\t\tif (!this.options.distance) {\n\t\t\t\t\t\t// Dodge divide by zero error.\n\t\t\t\t\t\treturn proximity ? 1.0 : accuracy;\n\t\t\t\t\t}\n\t\t\t\t\treturn accuracy + proximity / this.options.distance;\n\t\t\t\t};\n\n\t\t\t\t/**\n * Compute and return the result of the search\n * @param {string} text The text to search in\n * @return {{isMatch: boolean, score: number}} Literal containing:\n * isMatch - Whether the text is a match or not\n * score - Overall score for the match\n * @public\n */\n\t\t\t\tBitapSearcher.prototype.search = function (text) {\n\t\t\t\t\tvar options = this.options;\n\t\t\t\t\tvar i;\n\t\t\t\t\tvar j;\n\t\t\t\t\tvar textLen;\n\t\t\t\t\tvar findAllMatches;\n\t\t\t\t\tvar location;\n\t\t\t\t\tvar threshold;\n\t\t\t\t\tvar bestLoc;\n\t\t\t\t\tvar binMin;\n\t\t\t\t\tvar binMid;\n\t\t\t\t\tvar binMax;\n\t\t\t\t\tvar start, finish;\n\t\t\t\t\tvar bitArr;\n\t\t\t\t\tvar lastBitArr;\n\t\t\t\t\tvar charMatch;\n\t\t\t\t\tvar score;\n\t\t\t\t\tvar locations;\n\t\t\t\t\tvar matches;\n\t\t\t\t\tvar isMatched;\n\t\t\t\t\tvar matchMask;\n\t\t\t\t\tvar matchedIndices;\n\t\t\t\t\tvar matchesLen;\n\t\t\t\t\tvar match;\n\n\t\t\t\t\ttext = options.caseSensitive ? text : text.toLowerCase();\n\n\t\t\t\t\tif (this.pattern === text) {\n\t\t\t\t\t\t// Exact match\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tisMatch: true,\n\t\t\t\t\t\t\tscore: 0,\n\t\t\t\t\t\t\tmatchedIndices: [[0, text.length - 1]]\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// When pattern length is greater than the machine word length, just do a a regex comparison\n\t\t\t\t\tif (this.patternLen > options.maxPatternLength) {\n\t\t\t\t\t\tmatches = text.match(new RegExp(this.pattern.replace(options.tokenSeparator, '|')));\n\t\t\t\t\t\tisMatched = !!matches;\n\n\t\t\t\t\t\tif (isMatched) {\n\t\t\t\t\t\t\tmatchedIndices = [];\n\t\t\t\t\t\t\tfor (i = 0, matchesLen = matches.length; i < matchesLen; i++) {\n\t\t\t\t\t\t\t\tmatch = matches[i];\n\t\t\t\t\t\t\t\tmatchedIndices.push([text.indexOf(match), match.length - 1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tisMatch: isMatched,\n\t\t\t\t\t\t\t// TODO: revisit this score\n\t\t\t\t\t\t\tscore: isMatched ? 0.5 : 1,\n\t\t\t\t\t\t\tmatchedIndices: matchedIndices\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tfindAllMatches = options.findAllMatches;\n\n\t\t\t\t\tlocation = options.location;\n\t\t\t\t\t// Set starting location at beginning text and initialize the alphabet.\n\t\t\t\t\ttextLen = text.length;\n\t\t\t\t\t// Highest score beyond which we give up.\n\t\t\t\t\tthreshold = options.threshold;\n\t\t\t\t\t// Is there a nearby exact match? (speedup)\n\t\t\t\t\tbestLoc = text.indexOf(this.pattern, location);\n\n\t\t\t\t\t// a mask of the matches\n\t\t\t\t\tmatchMask = [];\n\t\t\t\t\tfor (i = 0; i < textLen; i++) {\n\t\t\t\t\t\tmatchMask[i] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (bestLoc != -1) {\n\t\t\t\t\t\tthreshold = Math.min(this._bitapScore(0, bestLoc), threshold);\n\t\t\t\t\t\t// What about in the other direction? (speed up)\n\t\t\t\t\t\tbestLoc = text.lastIndexOf(this.pattern, location + this.patternLen);\n\n\t\t\t\t\t\tif (bestLoc != -1) {\n\t\t\t\t\t\t\tthreshold = Math.min(this._bitapScore(0, bestLoc), threshold);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tbestLoc = -1;\n\t\t\t\t\tscore = 1;\n\t\t\t\t\tlocations = [];\n\t\t\t\t\tbinMax = this.patternLen + textLen;\n\n\t\t\t\t\tfor (i = 0; i < this.patternLen; i++) {\n\t\t\t\t\t\t// Scan for the best match; each iteration allows for one more error.\n\t\t\t\t\t\t// Run a binary search to determine how far from the match location we can stray\n\t\t\t\t\t\t// at this error level.\n\t\t\t\t\t\tbinMin = 0;\n\t\t\t\t\t\tbinMid = binMax;\n\t\t\t\t\t\twhile (binMin < binMid) {\n\t\t\t\t\t\t\tif (this._bitapScore(i, location + binMid) <= threshold) {\n\t\t\t\t\t\t\t\tbinMin = binMid;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbinMax = binMid;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbinMid = Math.floor((binMax - binMin) / 2 + binMin);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use the result from this iteration as the maximum for the next.\n\t\t\t\t\t\tbinMax = binMid;\n\t\t\t\t\t\tstart = Math.max(1, location - binMid + 1);\n\t\t\t\t\t\tif (findAllMatches) {\n\t\t\t\t\t\t\tfinish = textLen;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfinish = Math.min(location + binMid, textLen) + this.patternLen;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Initialize the bit array\n\t\t\t\t\t\tbitArr = Array(finish + 2);\n\n\t\t\t\t\t\tbitArr[finish + 1] = (1 << i) - 1;\n\n\t\t\t\t\t\tfor (j = finish; j >= start; j--) {\n\t\t\t\t\t\t\tcharMatch = this.patternAlphabet[text.charAt(j - 1)];\n\n\t\t\t\t\t\t\tif (charMatch) {\n\t\t\t\t\t\t\t\tmatchMask[j - 1] = 1;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;\n\n\t\t\t\t\t\t\tif (i !== 0) {\n\t\t\t\t\t\t\t\t// Subsequent passes: fuzzy match.\n\t\t\t\t\t\t\t\tbitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (bitArr[j] & this.matchmask) {\n\t\t\t\t\t\t\t\tscore = this._bitapScore(i, j - 1);\n\n\t\t\t\t\t\t\t\t// This match will almost certainly be better than any existing match.\n\t\t\t\t\t\t\t\t// But check anyway.\n\t\t\t\t\t\t\t\tif (score <= threshold) {\n\t\t\t\t\t\t\t\t\t// Indeed it is\n\t\t\t\t\t\t\t\t\tthreshold = score;\n\t\t\t\t\t\t\t\t\tbestLoc = j - 1;\n\t\t\t\t\t\t\t\t\tlocations.push(bestLoc);\n\n\t\t\t\t\t\t\t\t\t// Already passed loc, downhill from here on in.\n\t\t\t\t\t\t\t\t\tif (bestLoc <= location) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When passing loc, don't exceed our current distance from loc.\n\t\t\t\t\t\t\t\t\tstart = Math.max(1, 2 * location - bestLoc);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// No hope for a (better) match at greater error levels.\n\t\t\t\t\t\tif (this._bitapScore(i + 1, location) > threshold) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastBitArr = bitArr;\n\t\t\t\t\t}\n\n\t\t\t\t\tmatchedIndices = this._getMatchedIndices(matchMask);\n\n\t\t\t\t\t// Count exact matches (those with a score of 0) to be \"almost\" exact\n\t\t\t\t\treturn {\n\t\t\t\t\t\tisMatch: bestLoc >= 0,\n\t\t\t\t\t\tscore: score === 0 ? 0.001 : score,\n\t\t\t\t\t\tmatchedIndices: matchedIndices\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\tBitapSearcher.prototype._getMatchedIndices = function (matchMask) {\n\t\t\t\t\tvar matchedIndices = [];\n\t\t\t\t\tvar start = -1;\n\t\t\t\t\tvar end = -1;\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar match;\n\t\t\t\t\tvar len = matchMask.length;\n\t\t\t\t\tfor (; i < len; i++) {\n\t\t\t\t\t\tmatch = matchMask[i];\n\t\t\t\t\t\tif (match && start === -1) {\n\t\t\t\t\t\t\tstart = i;\n\t\t\t\t\t\t} else if (!match && start !== -1) {\n\t\t\t\t\t\t\tend = i - 1;\n\t\t\t\t\t\t\tif (end - start + 1 >= this.options.minMatchCharLength) {\n\t\t\t\t\t\t\t\tmatchedIndices.push([start, end]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstart = -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (matchMask[i - 1]) {\n\t\t\t\t\t\tif (i - 1 - start + 1 >= this.options.minMatchCharLength) {\n\t\t\t\t\t\t\tmatchedIndices.push([start, i - 1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn matchedIndices;\n\t\t\t\t};\n\n\t\t\t\t// Export to Common JS Loader\n\t\t\t\tif (true) {\n\t\t\t\t\t// Node. Does not work with strict CommonJS, but\n\t\t\t\t\t// only CommonJS-like environments that support module.exports,\n\t\t\t\t\t// like Node.\n\t\t\t\t\tmodule.exports = Fuse;\n\t\t\t\t} else if (typeof define === 'function' && define.amd) {\n\t\t\t\t\t// AMD. Register as an anonymous module.\n\t\t\t\t\tdefine(function () {\n\t\t\t\t\t\treturn Fuse;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Browser globals (root is window)\n\t\t\t\t\tglobal.Fuse = Fuse;\n\t\t\t\t}\n\t\t\t})(this);\n\n\t\t\t/***/\n\t\t},\n\t\t/* 3 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; /*!\n Copyright (c) 2016 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n */\n\t\t\t/* global define */\n\n\t\t\t(function () {\n\t\t\t\t'use strict';\n\n\t\t\t\tvar hasOwn = {}.hasOwnProperty;\n\n\t\t\t\tfunction classNames() {\n\t\t\t\t\tvar classes = [];\n\n\t\t\t\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\t\t\t\tvar arg = arguments[i];\n\t\t\t\t\t\tif (!arg) continue;\n\n\t\t\t\t\t\tvar argType = typeof arg === 'undefined' ? 'undefined' : _typeof2(arg);\n\n\t\t\t\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\t\t\t\tclasses.push(arg);\n\t\t\t\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t\t\t\t} else if (argType === 'object') {\n\t\t\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn classes.join(' ');\n\t\t\t\t}\n\n\t\t\t\tif (typeof module !== 'undefined' && module.exports) {\n\t\t\t\t\tmodule.exports = classNames;\n\t\t\t\t} else if (true) {\n\t\t\t\t\t// register as 'classnames', consistent with npm package name\n\t\t\t\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {\n\t\t\t\t\t\treturn classNames;\n\t\t\t\t\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\t\t\t} else {\n\t\t\t\t\twindow.classNames = classNames;\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\t/***/\n\t\t},\n\t\t/* 4 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\n\t\t\tvar _createClass = function () {\n\t\t\t\tfunction defineProperties(target, props) {\n\t\t\t\t\tfor (var i = 0; i < props.length; i++) {\n\t\t\t\t\t\tvar descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n\t\t\t\t\t}\n\t\t\t\t}return function (Constructor, protoProps, staticProps) {\n\t\t\t\t\tif (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n\t\t\t\t};\n\t\t\t}();\n\n\t\t\tvar _redux = __webpack_require__(5);\n\n\t\t\tvar _index = __webpack_require__(26);\n\n\t\t\tvar _index2 = _interopRequireDefault(_index);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { default: obj };\n\t\t\t}\n\n\t\t\tfunction _toConsumableArray(arr) {\n\t\t\t\tif (Array.isArray(arr)) {\n\t\t\t\t\tfor (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t\t\t\t\t\tarr2[i] = arr[i];\n\t\t\t\t\t}return arr2;\n\t\t\t\t} else {\n\t\t\t\t\treturn Array.from(arr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction _classCallCheck(instance, Constructor) {\n\t\t\t\tif (!(instance instanceof Constructor)) {\n\t\t\t\t\tthrow new TypeError(\"Cannot call a class as a function\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar Store = function () {\n\t\t\t\tfunction Store() {\n\t\t\t\t\t_classCallCheck(this, Store);\n\n\t\t\t\t\tthis.store = (0, _redux.createStore)(_index2.default, window.devToolsExtension ? window.devToolsExtension() : undefined);\n\t\t\t\t}\n\n\t\t\t\t/**\n * Get store object (wrapping Redux method)\n * @return {Object} State\n */\n\n\t\t\t\t_createClass(Store, [{\n\t\t\t\t\tkey: 'getState',\n\t\t\t\t\tvalue: function getState() {\n\t\t\t\t\t\treturn this.store.getState();\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Dispatch event to store (wrapped Redux method)\n * @param {Function} action Action function to trigger\n * @return\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'dispatch',\n\t\t\t\t\tvalue: function dispatch(action) {\n\t\t\t\t\t\tthis.store.dispatch(action);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Subscribe store to function call (wrapped Redux method)\n * @param {Function} onChange Function to trigger when state changes\n * @return\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'subscribe',\n\t\t\t\t\tvalue: function subscribe(onChange) {\n\t\t\t\t\t\tthis.store.subscribe(onChange);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get loading state from store\n * @return {Boolean} Loading State\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'isLoading',\n\t\t\t\t\tvalue: function isLoading() {\n\t\t\t\t\t\tvar state = this.store.getState();\n\t\t\t\t\t\treturn state.general.loading;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get items from store\n * @return {Array} Item objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getItems',\n\t\t\t\t\tvalue: function getItems() {\n\t\t\t\t\t\tvar state = this.store.getState();\n\t\t\t\t\t\treturn state.items;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get active items from store\n * @return {Array} Item objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getItemsFilteredByActive',\n\t\t\t\t\tvalue: function getItemsFilteredByActive() {\n\t\t\t\t\t\tvar items = this.getItems();\n\t\t\t\t\t\tvar values = items.filter(function (item) {\n\t\t\t\t\t\t\treturn item.active === true;\n\t\t\t\t\t\t}, []);\n\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get items from store reduced to just their values\n * @return {Array} Item objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getItemsReducedToValues',\n\t\t\t\t\tvalue: function getItemsReducedToValues() {\n\t\t\t\t\t\tvar items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getItems();\n\n\t\t\t\t\t\tvar values = items.reduce(function (prev, current) {\n\t\t\t\t\t\t\tprev.push(current.value);\n\t\t\t\t\t\t\treturn prev;\n\t\t\t\t\t\t}, []);\n\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get choices from store\n * @return {Array} Option objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getChoices',\n\t\t\t\t\tvalue: function getChoices() {\n\t\t\t\t\t\tvar state = this.store.getState();\n\t\t\t\t\t\treturn state.choices;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get active choices from store\n * @return {Array} Option objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getChoicesFilteredByActive',\n\t\t\t\t\tvalue: function getChoicesFilteredByActive() {\n\t\t\t\t\t\tvar choices = this.getChoices();\n\t\t\t\t\t\tvar values = choices.filter(function (choice) {\n\t\t\t\t\t\t\treturn choice.active === true;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get selectable choices from store\n * @return {Array} Option objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getChoicesFilteredBySelectable',\n\t\t\t\t\tvalue: function getChoicesFilteredBySelectable() {\n\t\t\t\t\t\tvar choices = this.getChoices();\n\t\t\t\t\t\tvar values = choices.filter(function (choice) {\n\t\t\t\t\t\t\treturn choice.disabled !== true;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get choices that can be searched (excluding placeholders)\n * @return {Array} Option objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getSearchableChoices',\n\t\t\t\t\tvalue: function getSearchableChoices() {\n\t\t\t\t\t\tvar filtered = this.getChoicesFilteredBySelectable();\n\t\t\t\t\t\treturn filtered.filter(function (choice) {\n\t\t\t\t\t\t\treturn choice.placeholder !== true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get single choice by it's ID\n * @return {Object} Found choice\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getChoiceById',\n\t\t\t\t\tvalue: function getChoiceById(id) {\n\t\t\t\t\t\tif (id) {\n\t\t\t\t\t\t\tvar choices = this.getChoicesFilteredByActive();\n\t\t\t\t\t\t\tvar foundChoice = choices.find(function (choice) {\n\t\t\t\t\t\t\t\treturn choice.id === parseInt(id, 10);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn foundChoice;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get groups from store\n * @return {Array} Group objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getGroups',\n\t\t\t\t\tvalue: function getGroups() {\n\t\t\t\t\t\tvar state = this.store.getState();\n\t\t\t\t\t\treturn state.groups;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get active groups from store\n * @return {Array} Group objects\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getGroupsFilteredByActive',\n\t\t\t\t\tvalue: function getGroupsFilteredByActive() {\n\t\t\t\t\t\tvar groups = this.getGroups();\n\t\t\t\t\t\tvar choices = this.getChoices();\n\n\t\t\t\t\t\tvar values = groups.filter(function (group) {\n\t\t\t\t\t\t\tvar isActive = group.active === true && group.disabled === false;\n\t\t\t\t\t\t\tvar hasActiveOptions = choices.some(function (choice) {\n\t\t\t\t\t\t\t\treturn choice.active === true && choice.disabled === false;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn isActive && hasActiveOptions;\n\t\t\t\t\t\t}, []);\n\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get group by group id\n * @param {Number} id Group ID\n * @return {Object} Group data\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getGroupById',\n\t\t\t\t\tvalue: function getGroupById(id) {\n\t\t\t\t\t\tvar groups = this.getGroups();\n\t\t\t\t\t\tvar foundGroup = groups.find(function (group) {\n\t\t\t\t\t\t\treturn group.id === id;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn foundGroup;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n * Get placeholder choice from store\n * @return {Object} Found placeholder\n */\n\n\t\t\t\t}, {\n\t\t\t\t\tkey: 'getPlaceholderChoice',\n\t\t\t\t\tvalue: function getPlaceholderChoice() {\n\t\t\t\t\t\tvar choices = this.getChoices();\n\t\t\t\t\t\tvar placeholderChoice = [].concat(_toConsumableArray(choices)).reverse().find(function (choice) {\n\t\t\t\t\t\t\treturn choice.placeholder === true;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn placeholderChoice;\n\t\t\t\t\t}\n\t\t\t\t}]);\n\n\t\t\t\treturn Store;\n\t\t\t}();\n\n\t\t\texports.default = Store;\n\n\t\t\tmodule.exports = Store;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 5 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\texports.__esModule = true;\n\t\t\texports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined;\n\n\t\t\tvar _createStore = __webpack_require__(6);\n\n\t\t\tvar _createStore2 = _interopRequireDefault(_createStore);\n\n\t\t\tvar _combineReducers = __webpack_require__(21);\n\n\t\t\tvar _combineReducers2 = _interopRequireDefault(_combineReducers);\n\n\t\t\tvar _bindActionCreators = __webpack_require__(23);\n\n\t\t\tvar _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);\n\n\t\t\tvar _applyMiddleware = __webpack_require__(24);\n\n\t\t\tvar _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);\n\n\t\t\tvar _compose = __webpack_require__(25);\n\n\t\t\tvar _compose2 = _interopRequireDefault(_compose);\n\n\t\t\tvar _warning = __webpack_require__(22);\n\n\t\t\tvar _warning2 = _interopRequireDefault(_warning);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { 'default': obj };\n\t\t\t}\n\n\t\t\t/*\n * This is a dummy function to check if the function name has been altered by minification.\n * If the function has been minified and NODE_ENV !== 'production', warn the user.\n */\n\t\t\tfunction isCrushed() {}\n\n\t\t\tif (false) {\n\t\t\t\t(0, _warning2['default'])('You are currently using minified code outside of NODE_ENV === \\'production\\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');\n\t\t\t}\n\n\t\t\texports.createStore = _createStore2['default'];\n\t\t\texports.combineReducers = _combineReducers2['default'];\n\t\t\texports.bindActionCreators = _bindActionCreators2['default'];\n\t\t\texports.applyMiddleware = _applyMiddleware2['default'];\n\t\t\texports.compose = _compose2['default'];\n\n\t\t\t/***/\n\t\t},\n\t\t/* 6 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\texports.__esModule = true;\n\t\t\texports.ActionTypes = undefined;\n\t\t\texports['default'] = createStore;\n\n\t\t\tvar _isPlainObject = __webpack_require__(7);\n\n\t\t\tvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\n\t\t\tvar _symbolObservable = __webpack_require__(17);\n\n\t\t\tvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { 'default': obj };\n\t\t\t}\n\n\t\t\t/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\t\t\tvar ActionTypes = exports.ActionTypes = {\n\t\t\t\tINIT: '@@redux/INIT'\n\n\t\t\t\t/**\n * Creates a Redux store that holds the state tree.\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\t\t\t};function createStore(reducer, preloadedState, enhancer) {\n\t\t\t\tvar _ref2;\n\n\t\t\t\tif (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n\t\t\t\t\tenhancer = preloadedState;\n\t\t\t\t\tpreloadedState = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (typeof enhancer !== 'undefined') {\n\t\t\t\t\tif (typeof enhancer !== 'function') {\n\t\t\t\t\t\tthrow new Error('Expected the enhancer to be a function.');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn enhancer(createStore)(reducer, preloadedState);\n\t\t\t\t}\n\n\t\t\t\tif (typeof reducer !== 'function') {\n\t\t\t\t\tthrow new Error('Expected the reducer to be a function.');\n\t\t\t\t}\n\n\t\t\t\tvar currentReducer = reducer;\n\t\t\t\tvar currentState = preloadedState;\n\t\t\t\tvar currentListeners = [];\n\t\t\t\tvar nextListeners = currentListeners;\n\t\t\t\tvar isDispatching = false;\n\n\t\t\t\tfunction ensureCanMutateNextListeners() {\n\t\t\t\t\tif (nextListeners === currentListeners) {\n\t\t\t\t\t\tnextListeners = currentListeners.slice();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\t\t\t\tfunction getState() {\n\t\t\t\t\treturn currentState;\n\t\t\t\t}\n\n\t\t\t\t/**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\t\t\t\tfunction subscribe(listener) {\n\t\t\t\t\tif (typeof listener !== 'function') {\n\t\t\t\t\t\tthrow new Error('Expected listener to be a function.');\n\t\t\t\t\t}\n\n\t\t\t\t\tvar isSubscribed = true;\n\n\t\t\t\t\tensureCanMutateNextListeners();\n\t\t\t\t\tnextListeners.push(listener);\n\n\t\t\t\t\treturn function unsubscribe() {\n\t\t\t\t\t\tif (!isSubscribed) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tisSubscribed = false;\n\n\t\t\t\t\t\tensureCanMutateNextListeners();\n\t\t\t\t\t\tvar index = nextListeners.indexOf(listener);\n\t\t\t\t\t\tnextListeners.splice(index, 1);\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t/**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\t\t\t\tfunction dispatch(action) {\n\t\t\t\t\tif (!(0, _isPlainObject2['default'])(action)) {\n\t\t\t\t\t\tthrow new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof action.type === 'undefined') {\n\t\t\t\t\t\tthrow new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isDispatching) {\n\t\t\t\t\t\tthrow new Error('Reducers may not dispatch actions.');\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tisDispatching = true;\n\t\t\t\t\t\tcurrentState = currentReducer(currentState, action);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tisDispatching = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar listeners = currentListeners = nextListeners;\n\t\t\t\t\tfor (var i = 0; i < listeners.length; i++) {\n\t\t\t\t\t\tvar listener = listeners[i];\n\t\t\t\t\t\tlistener();\n\t\t\t\t\t}\n\n\t\t\t\t\treturn action;\n\t\t\t\t}\n\n\t\t\t\t/**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\t\t\t\tfunction replaceReducer(nextReducer) {\n\t\t\t\t\tif (typeof nextReducer !== 'function') {\n\t\t\t\t\t\tthrow new Error('Expected the nextReducer to be a function.');\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReducer = nextReducer;\n\t\t\t\t\tdispatch({ type: ActionTypes.INIT });\n\t\t\t\t}\n\n\t\t\t\t/**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\t\t\t\tfunction observable() {\n\t\t\t\t\tvar _ref;\n\n\t\t\t\t\tvar outerSubscribe = subscribe;\n\t\t\t\t\treturn _ref = {\n\t\t\t\t\t\t/**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n\t\t\t\t\t\tsubscribe: function subscribe(observer) {\n\t\t\t\t\t\t\tif ((typeof observer === 'undefined' ? 'undefined' : _typeof2(observer)) !== 'object') {\n\t\t\t\t\t\t\t\tthrow new TypeError('Expected the observer to be an object.');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfunction observeState() {\n\t\t\t\t\t\t\t\tif (observer.next) {\n\t\t\t\t\t\t\t\t\tobserver.next(getState());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobserveState();\n\t\t\t\t\t\t\tvar unsubscribe = outerSubscribe(observeState);\n\t\t\t\t\t\t\treturn { unsubscribe: unsubscribe };\n\t\t\t\t\t\t}\n\t\t\t\t\t}, _ref[_symbolObservable2['default']] = function () {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}, _ref;\n\t\t\t\t}\n\n\t\t\t\t// When a store is created, an \"INIT\" action is dispatched so that every\n\t\t\t\t// reducer returns their initial state. This effectively populates\n\t\t\t\t// the initial state tree.\n\t\t\t\tdispatch({ type: ActionTypes.INIT });\n\n\t\t\t\treturn _ref2 = {\n\t\t\t\t\tdispatch: dispatch,\n\t\t\t\t\tsubscribe: subscribe,\n\t\t\t\t\tgetState: getState,\n\t\t\t\t\treplaceReducer: replaceReducer\n\t\t\t\t}, _ref2[_symbolObservable2['default']] = observable, _ref2;\n\t\t\t}\n\n\t\t\t/***/\n\t\t},\n\t\t/* 7 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar baseGetTag = __webpack_require__(8),\n\t\t\t getPrototype = __webpack_require__(14),\n\t\t\t isObjectLike = __webpack_require__(16);\n\n\t\t\t/** `Object#toString` result references. */\n\t\t\tvar objectTag = '[object Object]';\n\n\t\t\t/** Used for built-in method references. */\n\t\t\tvar funcProto = Function.prototype,\n\t\t\t objectProto = Object.prototype;\n\n\t\t\t/** Used to resolve the decompiled source of functions. */\n\t\t\tvar funcToString = funcProto.toString;\n\n\t\t\t/** Used to check objects for own properties. */\n\t\t\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t\t\t/** Used to infer the `Object` constructor. */\n\t\t\tvar objectCtorString = funcToString.call(Object);\n\n\t\t\t/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n\t\t\tfunction isPlainObject(value) {\n\t\t\t\tif (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar proto = getPrototype(value);\n\t\t\t\tif (proto === null) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tvar Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n\t\t\t\treturn typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;\n\t\t\t}\n\n\t\t\tmodule.exports = isPlainObject;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 8 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar _Symbol2 = __webpack_require__(9),\n\t\t\t getRawTag = __webpack_require__(12),\n\t\t\t objectToString = __webpack_require__(13);\n\n\t\t\t/** `Object#toString` result references. */\n\t\t\tvar nullTag = '[object Null]',\n\t\t\t undefinedTag = '[object Undefined]';\n\n\t\t\t/** Built-in value references. */\n\t\t\tvar symToStringTag = _Symbol2 ? _Symbol2.toStringTag : undefined;\n\n\t\t\t/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n\t\t\tfunction baseGetTag(value) {\n\t\t\t\tif (value == null) {\n\t\t\t\t\treturn value === undefined ? undefinedTag : nullTag;\n\t\t\t\t}\n\t\t\t\treturn symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);\n\t\t\t}\n\n\t\t\tmodule.exports = baseGetTag;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 9 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar root = __webpack_require__(10);\n\n\t\t\t/** Built-in value references. */\n\t\t\tvar _Symbol3 = root.Symbol;\n\n\t\t\tmodule.exports = _Symbol3;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 10 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar freeGlobal = __webpack_require__(11);\n\n\t\t\t/** Detect free variable `self`. */\n\t\t\tvar freeSelf = (typeof self === 'undefined' ? 'undefined' : _typeof2(self)) == 'object' && self && self.Object === Object && self;\n\n\t\t\t/** Used as a reference to the global object. */\n\t\t\tvar root = freeGlobal || freeSelf || Function('return this')();\n\n\t\t\tmodule.exports = root;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 11 */\n\t\t/***/function (module, exports) {\n\n\t\t\t/* WEBPACK VAR INJECTION */(function (global) {\n\t\t\t\t/** Detect free variable `global` from Node.js. */\n\t\t\t\tvar freeGlobal = (typeof global === 'undefined' ? 'undefined' : _typeof2(global)) == 'object' && global && global.Object === Object && global;\n\n\t\t\t\tmodule.exports = freeGlobal;\n\n\t\t\t\t/* WEBPACK VAR INJECTION */\n\t\t\t}).call(exports, function () {\n\t\t\t\treturn this;\n\t\t\t}());\n\n\t\t\t/***/\n\t\t},\n\t\t/* 12 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar _Symbol4 = __webpack_require__(9);\n\n\t\t\t/** Used for built-in method references. */\n\t\t\tvar objectProto = Object.prototype;\n\n\t\t\t/** Used to check objects for own properties. */\n\t\t\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t\t\t/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\t\t\tvar nativeObjectToString = objectProto.toString;\n\n\t\t\t/** Built-in value references. */\n\t\t\tvar symToStringTag = _Symbol4 ? _Symbol4.toStringTag : undefined;\n\n\t\t\t/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n\t\t\tfunction getRawTag(value) {\n\t\t\t\tvar isOwn = hasOwnProperty.call(value, symToStringTag),\n\t\t\t\t tag = value[symToStringTag];\n\n\t\t\t\ttry {\n\t\t\t\t\tvalue[symToStringTag] = undefined;\n\t\t\t\t\tvar unmasked = true;\n\t\t\t\t} catch (e) {}\n\n\t\t\t\tvar result = nativeObjectToString.call(value);\n\t\t\t\tif (unmasked) {\n\t\t\t\t\tif (isOwn) {\n\t\t\t\t\t\tvalue[symToStringTag] = tag;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdelete value[symToStringTag];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tmodule.exports = getRawTag;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 13 */\n\t\t/***/function (module, exports) {\n\n\t\t\t/** Used for built-in method references. */\n\t\t\tvar objectProto = Object.prototype;\n\n\t\t\t/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\t\t\tvar nativeObjectToString = objectProto.toString;\n\n\t\t\t/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n\t\t\tfunction objectToString(value) {\n\t\t\t\treturn nativeObjectToString.call(value);\n\t\t\t}\n\n\t\t\tmodule.exports = objectToString;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 14 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tvar overArg = __webpack_require__(15);\n\n\t\t\t/** Built-in value references. */\n\t\t\tvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\n\t\t\tmodule.exports = getPrototype;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 15 */\n\t\t/***/function (module, exports) {\n\n\t\t\t/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n\t\t\tfunction overArg(func, transform) {\n\t\t\t\treturn function (arg) {\n\t\t\t\t\treturn func(transform(arg));\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmodule.exports = overArg;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 16 */\n\t\t/***/function (module, exports) {\n\n\t\t\t/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n\t\t\tfunction isObjectLike(value) {\n\t\t\t\treturn value != null && (typeof value === 'undefined' ? 'undefined' : _typeof2(value)) == 'object';\n\t\t\t}\n\n\t\t\tmodule.exports = isObjectLike;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 17 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\tmodule.exports = __webpack_require__(18);\n\n\t\t\t/***/\n\t\t},\n\t\t/* 18 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t/* WEBPACK VAR INJECTION */(function (global, module) {\n\t\t\t\t'use strict';\n\n\t\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\t\tvalue: true\n\t\t\t\t});\n\n\t\t\t\tvar _ponyfill = __webpack_require__(20);\n\n\t\t\t\tvar _ponyfill2 = _interopRequireDefault(_ponyfill);\n\n\t\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\t\treturn obj && obj.__esModule ? obj : { 'default': obj };\n\t\t\t\t}\n\n\t\t\t\tvar root; /* global window */\n\n\t\t\t\tif (typeof self !== 'undefined') {\n\t\t\t\t\troot = self;\n\t\t\t\t} else if (typeof window !== 'undefined') {\n\t\t\t\t\troot = window;\n\t\t\t\t} else if (typeof global !== 'undefined') {\n\t\t\t\t\troot = global;\n\t\t\t\t} else if (true) {\n\t\t\t\t\troot = module;\n\t\t\t\t} else {\n\t\t\t\t\troot = Function('return this')();\n\t\t\t\t}\n\n\t\t\t\tvar result = (0, _ponyfill2['default'])(root);\n\t\t\t\texports['default'] = result;\n\t\t\t\t/* WEBPACK VAR INJECTION */\n\t\t\t}).call(exports, function () {\n\t\t\t\treturn this;\n\t\t\t}(), __webpack_require__(19)(module));\n\n\t\t\t/***/\n\t\t},\n\t\t/* 19 */\n\t\t/***/function (module, exports) {\n\n\t\t\tmodule.exports = function (module) {\n\t\t\t\tif (!module.webpackPolyfill) {\n\t\t\t\t\tmodule.deprecate = function () {};\n\t\t\t\t\tmodule.paths = [];\n\t\t\t\t\t// module.parent = undefined by default\n\t\t\t\t\tmodule.children = [];\n\t\t\t\t\tmodule.webpackPolyfill = 1;\n\t\t\t\t}\n\t\t\t\treturn module;\n\t\t\t};\n\n\t\t\t/***/\n\t\t},\n\t\t/* 20 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\t\t\texports['default'] = symbolObservablePonyfill;\n\t\t\tfunction symbolObservablePonyfill(root) {\n\t\t\t\tvar result;\n\t\t\t\tvar _Symbol = root.Symbol;\n\n\t\t\t\tif (typeof _Symbol === 'function') {\n\t\t\t\t\tif (_Symbol.observable) {\n\t\t\t\t\t\tresult = _Symbol.observable;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = _Symbol('observable');\n\t\t\t\t\t\t_Symbol.observable = result;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult = '@@observable';\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\t/***/\n\t\t},\n\t\t/* 21 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\texports.__esModule = true;\n\t\t\texports['default'] = combineReducers;\n\n\t\t\tvar _createStore = __webpack_require__(6);\n\n\t\t\tvar _isPlainObject = __webpack_require__(7);\n\n\t\t\tvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\n\t\t\tvar _warning = __webpack_require__(22);\n\n\t\t\tvar _warning2 = _interopRequireDefault(_warning);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { 'default': obj };\n\t\t\t}\n\n\t\t\tfunction getUndefinedStateErrorMessage(key, action) {\n\t\t\t\tvar actionType = action && action.type;\n\t\t\t\tvar actionName = actionType && '\"' + actionType.toString() + '\"' || 'an action';\n\n\t\t\t\treturn 'Given action ' + actionName + ', reducer \"' + key + '\" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.';\n\t\t\t}\n\n\t\t\tfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n\t\t\t\tvar reducerKeys = Object.keys(reducers);\n\t\t\t\tvar argumentName = action && action.type === _createStore.ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n\t\t\t\tif (reducerKeys.length === 0) {\n\t\t\t\t\treturn 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n\t\t\t\t}\n\n\t\t\t\tif (!(0, _isPlainObject2['default'])(inputState)) {\n\t\t\t\t\treturn 'The ' + argumentName + ' has unexpected type of \"' + {}.toString.call(inputState).match(/\\s([a-z|A-Z]+)/)[1] + '\". Expected argument to be an object with the following ' + ('keys: \"' + reducerKeys.join('\", \"') + '\"');\n\t\t\t\t}\n\n\t\t\t\tvar unexpectedKeys = Object.keys(inputState).filter(function (key) {\n\t\t\t\t\treturn !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n\t\t\t\t});\n\n\t\t\t\tunexpectedKeys.forEach(function (key) {\n\t\t\t\t\tunexpectedKeyCache[key] = true;\n\t\t\t\t});\n\n\t\t\t\tif (unexpectedKeys.length > 0) {\n\t\t\t\t\treturn 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('\"' + unexpectedKeys.join('\", \"') + '\" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('\"' + reducerKeys.join('\", \"') + '\". Unexpected keys will be ignored.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction assertReducerShape(reducers) {\n\t\t\t\tObject.keys(reducers).forEach(function (key) {\n\t\t\t\t\tvar reducer = reducers[key];\n\t\t\t\t\tvar initialState = reducer(undefined, { type: _createStore.ActionTypes.INIT });\n\n\t\t\t\t\tif (typeof initialState === 'undefined') {\n\t\t\t\t\t\tthrow new Error('Reducer \"' + key + '\" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.');\n\t\t\t\t\t}\n\n\t\t\t\t\tvar type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');\n\t\t\t\t\tif (typeof reducer(undefined, { type: type }) === 'undefined') {\n\t\t\t\t\t\tthrow new Error('Reducer \"' + key + '\" returned undefined when probed with a random type. ' + ('Don\\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in \"redux/*\" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\t\t\tfunction combineReducers(reducers) {\n\t\t\t\tvar reducerKeys = Object.keys(reducers);\n\t\t\t\tvar finalReducers = {};\n\t\t\t\tfor (var i = 0; i < reducerKeys.length; i++) {\n\t\t\t\t\tvar key = reducerKeys[i];\n\n\t\t\t\t\tif (false) {\n\t\t\t\t\t\tif (typeof reducers[key] === 'undefined') {\n\t\t\t\t\t\t\t(0, _warning2['default'])('No reducer provided for key \"' + key + '\"');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof reducers[key] === 'function') {\n\t\t\t\t\t\tfinalReducers[key] = reducers[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar finalReducerKeys = Object.keys(finalReducers);\n\n\t\t\t\tvar unexpectedKeyCache = void 0;\n\t\t\t\tif (false) {\n\t\t\t\t\tunexpectedKeyCache = {};\n\t\t\t\t}\n\n\t\t\t\tvar shapeAssertionError = void 0;\n\t\t\t\ttry {\n\t\t\t\t\tassertReducerShape(finalReducers);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tshapeAssertionError = e;\n\t\t\t\t}\n\n\t\t\t\treturn function combination() {\n\t\t\t\t\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t\t\t\t\tvar action = arguments[1];\n\n\t\t\t\t\tif (shapeAssertionError) {\n\t\t\t\t\t\tthrow shapeAssertionError;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (false) {\n\t\t\t\t\t\tvar warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\t\t\t\t\t\tif (warningMessage) {\n\t\t\t\t\t\t\t(0, _warning2['default'])(warningMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar hasChanged = false;\n\t\t\t\t\tvar nextState = {};\n\t\t\t\t\tfor (var _i = 0; _i < finalReducerKeys.length; _i++) {\n\t\t\t\t\t\tvar _key = finalReducerKeys[_i];\n\t\t\t\t\t\tvar reducer = finalReducers[_key];\n\t\t\t\t\t\tvar previousStateForKey = state[_key];\n\t\t\t\t\t\tvar nextStateForKey = reducer(previousStateForKey, action);\n\t\t\t\t\t\tif (typeof nextStateForKey === 'undefined') {\n\t\t\t\t\t\t\tvar errorMessage = getUndefinedStateErrorMessage(_key, action);\n\t\t\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextState[_key] = nextStateForKey;\n\t\t\t\t\t\thasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n\t\t\t\t\t}\n\t\t\t\t\treturn hasChanged ? nextState : state;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/***/\n\t\t},\n\t\t/* 22 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\texports.__esModule = true;\n\t\t\texports['default'] = warning;\n\t\t\t/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\n\t\t\tfunction warning(message) {\n\t\t\t\t/* eslint-disable no-console */\n\t\t\t\tif (typeof console !== 'undefined' && typeof console.error === 'function') {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t}\n\t\t\t\t/* eslint-enable no-console */\n\t\t\t\ttry {\n\t\t\t\t\t// This error was thrown as a convenience so that if you enable\n\t\t\t\t\t// \"break on all exceptions\" in your console,\n\t\t\t\t\t// it would pause the execution at this line.\n\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t/* eslint-disable no-empty */\n\t\t\t\t} catch (e) {}\n\t\t\t\t/* eslint-enable no-empty */\n\t\t\t}\n\n\t\t\t/***/\n\t\t},\n\t\t/* 23 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\texports.__esModule = true;\n\t\t\texports['default'] = bindActionCreators;\n\t\t\tfunction bindActionCreator(actionCreator, dispatch) {\n\t\t\t\treturn function () {\n\t\t\t\t\treturn dispatch(actionCreator.apply(undefined, arguments));\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass a single function as the first argument,\n * and get a function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\t\t\tfunction bindActionCreators(actionCreators, dispatch) {\n\t\t\t\tif (typeof actionCreators === 'function') {\n\t\t\t\t\treturn bindActionCreator(actionCreators, dispatch);\n\t\t\t\t}\n\n\t\t\t\tif ((typeof actionCreators === 'undefined' ? 'undefined' : _typeof2(actionCreators)) !== 'object' || actionCreators === null) {\n\t\t\t\t\tthrow new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators === 'undefined' ? 'undefined' : _typeof2(actionCreators)) + '. ' + 'Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');\n\t\t\t\t}\n\n\t\t\t\tvar keys = Object.keys(actionCreators);\n\t\t\t\tvar boundActionCreators = {};\n\t\t\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\t\t\tvar key = keys[i];\n\t\t\t\t\tvar actionCreator = actionCreators[key];\n\t\t\t\t\tif (typeof actionCreator === 'function') {\n\t\t\t\t\t\tboundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn boundActionCreators;\n\t\t\t}\n\n\t\t\t/***/\n\t\t},\n\t\t/* 24 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\texports.__esModule = true;\n\n\t\t\tvar _extends = Object.assign || function (target) {\n\t\t\t\tfor (var i = 1; i < arguments.length; i++) {\n\t\t\t\t\tvar source = arguments[i];for (var key in source) {\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\n\t\t\t\t\t\t\ttarget[key] = source[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}return target;\n\t\t\t};\n\n\t\t\texports['default'] = applyMiddleware;\n\n\t\t\tvar _compose = __webpack_require__(25);\n\n\t\t\tvar _compose2 = _interopRequireDefault(_compose);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { 'default': obj };\n\t\t\t}\n\n\t\t\t/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\t\t\tfunction applyMiddleware() {\n\t\t\t\tfor (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\t\tmiddlewares[_key] = arguments[_key];\n\t\t\t\t}\n\n\t\t\t\treturn function (createStore) {\n\t\t\t\t\treturn function (reducer, preloadedState, enhancer) {\n\t\t\t\t\t\tvar store = createStore(reducer, preloadedState, enhancer);\n\t\t\t\t\t\tvar _dispatch = store.dispatch;\n\t\t\t\t\t\tvar chain = [];\n\n\t\t\t\t\t\tvar middlewareAPI = {\n\t\t\t\t\t\t\tgetState: store.getState,\n\t\t\t\t\t\t\tdispatch: function dispatch(action) {\n\t\t\t\t\t\t\t\treturn _dispatch(action);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchain = middlewares.map(function (middleware) {\n\t\t\t\t\t\t\treturn middleware(middlewareAPI);\n\t\t\t\t\t\t});\n\t\t\t\t\t\t_dispatch = _compose2['default'].apply(undefined, chain)(store.dispatch);\n\n\t\t\t\t\t\treturn _extends({}, store, {\n\t\t\t\t\t\t\tdispatch: _dispatch\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/***/\n\t\t},\n\t\t/* 25 */\n\t\t/***/function (module, exports) {\n\n\t\t\t\"use strict\";\n\n\t\t\texports.__esModule = true;\n\t\t\texports[\"default\"] = compose;\n\t\t\t/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\n\n\t\t\tfunction compose() {\n\t\t\t\tfor (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\t\tfuncs[_key] = arguments[_key];\n\t\t\t\t}\n\n\t\t\t\tif (funcs.length === 0) {\n\t\t\t\t\treturn function (arg) {\n\t\t\t\t\t\treturn arg;\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (funcs.length === 1) {\n\t\t\t\t\treturn funcs[0];\n\t\t\t\t}\n\n\t\t\t\treturn funcs.reduce(function (a, b) {\n\t\t\t\t\treturn function () {\n\t\t\t\t\t\treturn a(b.apply(undefined, arguments));\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/***/\n\t\t},\n\t\t/* 26 */\n\t\t/***/function (module, exports, __webpack_require__) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\n\t\t\tvar _redux = __webpack_require__(5);\n\n\t\t\tvar _items = __webpack_require__(27);\n\n\t\t\tvar _items2 = _interopRequireDefault(_items);\n\n\t\t\tvar _groups = __webpack_require__(28);\n\n\t\t\tvar _groups2 = _interopRequireDefault(_groups);\n\n\t\t\tvar _choices = __webpack_require__(29);\n\n\t\t\tvar _choices2 = _interopRequireDefault(_choices);\n\n\t\t\tvar _general = __webpack_require__(30);\n\n\t\t\tvar _general2 = _interopRequireDefault(_general);\n\n\t\t\tfunction _interopRequireDefault(obj) {\n\t\t\t\treturn obj && obj.__esModule ? obj : { default: obj };\n\t\t\t}\n\n\t\t\tvar appReducer = (0, _redux.combineReducers)({\n\t\t\t\titems: _items2.default,\n\t\t\t\tgroups: _groups2.default,\n\t\t\t\tchoices: _choices2.default,\n\t\t\t\tgeneral: _general2.default\n\t\t\t});\n\n\t\t\tvar rootReducer = function rootReducer(passedState, action) {\n\t\t\t\tvar state = passedState;\n\t\t\t\t// If we are clearing all items, groups and options we reassign\n\t\t\t\t// state and then pass that state to our proper reducer. This isn't\n\t\t\t\t// mutating our actual state\n\t\t\t\t// See: http://stackoverflow.com/a/35641992\n\t\t\t\tif (action.type === 'CLEAR_ALL') {\n\t\t\t\t\tstate = undefined;\n\t\t\t\t}\n\n\t\t\t\treturn appReducer(state, action);\n\t\t\t};\n\n\t\t\texports.default = rootReducer;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 27 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\n\t\t\tfunction _toConsumableArray(arr) {\n\t\t\t\tif (Array.isArray(arr)) {\n\t\t\t\t\tfor (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t\t\t\t\t\tarr2[i] = arr[i];\n\t\t\t\t\t}return arr2;\n\t\t\t\t} else {\n\t\t\t\t\treturn Array.from(arr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar items = function items() {\n\t\t\t\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\t\t\t\tvar action = arguments[1];\n\n\t\t\t\tswitch (action.type) {\n\t\t\t\t\tcase 'ADD_ITEM':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Add object to items array\n\t\t\t\t\t\t\tvar newState = [].concat(_toConsumableArray(state), [{\n\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\tchoiceId: action.choiceId,\n\t\t\t\t\t\t\t\tgroupId: action.groupId,\n\t\t\t\t\t\t\t\tvalue: action.value,\n\t\t\t\t\t\t\t\tlabel: action.label,\n\t\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\t\thighlighted: false,\n\t\t\t\t\t\t\t\tcustomProperties: action.customProperties,\n\t\t\t\t\t\t\t\tplaceholder: action.placeholder || false,\n\t\t\t\t\t\t\t\tkeyCode: null\n\t\t\t\t\t\t\t}]);\n\n\t\t\t\t\t\t\treturn newState.map(function (item) {\n\t\t\t\t\t\t\t\tif (item.highlighted) {\n\t\t\t\t\t\t\t\t\titem.highlighted = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'REMOVE_ITEM':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Set item to inactive\n\t\t\t\t\t\t\treturn state.map(function (item) {\n\t\t\t\t\t\t\t\tif (item.id === action.id) {\n\t\t\t\t\t\t\t\t\titem.active = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'HIGHLIGHT_ITEM':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state.map(function (item) {\n\t\t\t\t\t\t\t\tif (item.id === action.id) {\n\t\t\t\t\t\t\t\t\titem.highlighted = action.highlighted;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\texports.default = items;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 28 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\n\t\t\tfunction _toConsumableArray(arr) {\n\t\t\t\tif (Array.isArray(arr)) {\n\t\t\t\t\tfor (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t\t\t\t\t\tarr2[i] = arr[i];\n\t\t\t\t\t}return arr2;\n\t\t\t\t} else {\n\t\t\t\t\treturn Array.from(arr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar groups = function groups() {\n\t\t\t\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\t\t\t\tvar action = arguments[1];\n\n\t\t\t\tswitch (action.type) {\n\t\t\t\t\tcase 'ADD_GROUP':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn [].concat(_toConsumableArray(state), [{\n\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\tvalue: action.value,\n\t\t\t\t\t\t\t\tactive: action.active,\n\t\t\t\t\t\t\t\tdisabled: action.disabled\n\t\t\t\t\t\t\t}]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'CLEAR_CHOICES':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state.groups = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\texports.default = groups;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 29 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\n\t\t\tfunction _toConsumableArray(arr) {\n\t\t\t\tif (Array.isArray(arr)) {\n\t\t\t\t\tfor (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t\t\t\t\t\tarr2[i] = arr[i];\n\t\t\t\t\t}return arr2;\n\t\t\t\t} else {\n\t\t\t\t\treturn Array.from(arr);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar choices = function choices() {\n\t\t\t\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\t\t\t\tvar action = arguments[1];\n\n\t\t\t\tswitch (action.type) {\n\t\t\t\t\tcase 'ADD_CHOICE':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n A disabled choice appears in the choice dropdown but cannot be selected\n A selected choice has been added to the passed input's value (added as an item)\n An active choice appears within the choice dropdown\n */\n\t\t\t\t\t\t\treturn [].concat(_toConsumableArray(state), [{\n\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\telementId: action.elementId,\n\t\t\t\t\t\t\t\tgroupId: action.groupId,\n\t\t\t\t\t\t\t\tvalue: action.value,\n\t\t\t\t\t\t\t\tlabel: action.label || action.value,\n\t\t\t\t\t\t\t\tdisabled: action.disabled || false,\n\t\t\t\t\t\t\t\tselected: false,\n\t\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\t\tscore: 9999,\n\t\t\t\t\t\t\t\tcustomProperties: action.customProperties,\n\t\t\t\t\t\t\t\tplaceholder: action.placeholder || false,\n\t\t\t\t\t\t\t\tkeyCode: null\n\t\t\t\t\t\t\t}]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'ADD_ITEM':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar newState = state;\n\n\t\t\t\t\t\t\t// If all choices need to be activated\n\t\t\t\t\t\t\tif (action.activateOptions) {\n\t\t\t\t\t\t\t\tnewState = state.map(function (choice) {\n\t\t\t\t\t\t\t\t\tchoice.active = action.active;\n\t\t\t\t\t\t\t\t\treturn choice;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// When an item is added and it has an associated choice,\n\t\t\t\t\t\t\t// we want to disable it so it can't be chosen again\n\t\t\t\t\t\t\tif (action.choiceId > -1) {\n\t\t\t\t\t\t\t\tnewState = state.map(function (choice) {\n\t\t\t\t\t\t\t\t\tif (choice.id === parseInt(action.choiceId, 10)) {\n\t\t\t\t\t\t\t\t\t\tchoice.selected = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn choice;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn newState;\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'REMOVE_ITEM':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// When an item is removed and it has an associated choice,\n\t\t\t\t\t\t\t// we want to re-enable it so it can be chosen again\n\t\t\t\t\t\t\tif (action.choiceId > -1) {\n\t\t\t\t\t\t\t\treturn state.map(function (choice) {\n\t\t\t\t\t\t\t\t\tif (choice.id === parseInt(action.choiceId, 10)) {\n\t\t\t\t\t\t\t\t\t\tchoice.selected = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn choice;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'FILTER_CHOICES':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar filteredResults = action.results;\n\t\t\t\t\t\t\tvar filteredState = state.map(function (choice) {\n\t\t\t\t\t\t\t\t// Set active state based on whether choice is\n\t\t\t\t\t\t\t\t// within filtered results\n\n\t\t\t\t\t\t\t\tchoice.active = filteredResults.some(function (result) {\n\t\t\t\t\t\t\t\t\tif (result.item.id === choice.id) {\n\t\t\t\t\t\t\t\t\t\tchoice.score = result.score;\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn choice;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn filteredState;\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'ACTIVATE_CHOICES':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state.map(function (choice) {\n\t\t\t\t\t\t\t\tchoice.active = action.active;\n\t\t\t\t\t\t\t\treturn choice;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase 'CLEAR_CHOICES':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state.choices = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\texports.default = choices;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 30 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\t\t\tvar general = function general() {\n\t\t\t\tvar state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { loading: false };\n\t\t\t\tvar action = arguments[1];\n\n\t\t\t\tswitch (action.type) {\n\t\t\t\t\tcase 'LOADING':\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tloading: action.isLoading\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\texports.default = general;\n\n\t\t\t/***/\n\t\t},\n\t\t/* 31 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\t\t\tvar addItem = exports.addItem = function addItem(value, label, id, choiceId, groupId, customProperties, placeholder, keyCode) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'ADD_ITEM',\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tid: id,\n\t\t\t\t\tchoiceId: choiceId,\n\t\t\t\t\tgroupId: groupId,\n\t\t\t\t\tcustomProperties: customProperties,\n\t\t\t\t\tplaceholder: placeholder,\n\t\t\t\t\tkeyCode: keyCode\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar removeItem = exports.removeItem = function removeItem(id, choiceId) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'REMOVE_ITEM',\n\t\t\t\t\tid: id,\n\t\t\t\t\tchoiceId: choiceId\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar highlightItem = exports.highlightItem = function highlightItem(id, highlighted) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'HIGHLIGHT_ITEM',\n\t\t\t\t\tid: id,\n\t\t\t\t\thighlighted: highlighted\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar addChoice = exports.addChoice = function addChoice(value, label, id, groupId, disabled, elementId, customProperties, placeholder, keyCode) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'ADD_CHOICE',\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tid: id,\n\t\t\t\t\tgroupId: groupId,\n\t\t\t\t\tdisabled: disabled,\n\t\t\t\t\telementId: elementId,\n\t\t\t\t\tcustomProperties: customProperties,\n\t\t\t\t\tplaceholder: placeholder,\n\t\t\t\t\tkeyCode: keyCode\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar filterChoices = exports.filterChoices = function filterChoices(results) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'FILTER_CHOICES',\n\t\t\t\t\tresults: results\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar activateChoices = exports.activateChoices = function activateChoices() {\n\t\t\t\tvar active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'ACTIVATE_CHOICES',\n\t\t\t\t\tactive: active\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar clearChoices = exports.clearChoices = function clearChoices() {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'CLEAR_CHOICES'\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar addGroup = exports.addGroup = function addGroup(value, id, active, disabled) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'ADD_GROUP',\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tid: id,\n\t\t\t\t\tactive: active,\n\t\t\t\t\tdisabled: disabled\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar clearAll = exports.clearAll = function clearAll() {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'CLEAR_ALL'\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tvar setIsLoading = exports.setIsLoading = function setIsLoading(isLoading) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'LOADING',\n\t\t\t\t\tisLoading: isLoading\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t/***/\n\t\t},\n\t\t/* 32 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t\t\tvalue: true\n\t\t\t});\n\n\t\t\tvar _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n\t\t\t\treturn typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n\t\t\t} : function (obj) {\n\t\t\t\treturn obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);\n\t\t\t};\n\n\t\t\t/* eslint-disable */\n\t\t\t/**\n * Capitalises the first letter of each word in a string\n * @param {String} str String to capitalise\n * @return {String} Capitalised string\n */\n\t\t\tvar capitalise = exports.capitalise = function capitalise(str) {\n\t\t\t\treturn str.replace(/\\w\\S*/g, function (txt) {\n\t\t\t\t\treturn txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n\t\t\t\t});\n\t\t\t};\n\n\t\t\t/**\n * Generates a string of random chars\n * @param {Number} length Length of the string to generate\n * @return {String} String of random chars\n */\n\t\t\tvar generateChars = exports.generateChars = function generateChars(length) {\n\t\t\t\tvar chars = '';\n\n\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\tvar randomChar = getRandomNumber(0, 36);\n\t\t\t\t\tchars += randomChar.toString(36);\n\t\t\t\t}\n\n\t\t\t\treturn chars;\n\t\t\t};\n\n\t\t\t/**\n * Generates a unique id based on an element\n * @param {HTMLElement} element Element to generate the id from\n * @param {String} Prefix for the Id\n * @return {String} Unique Id\n */\n\t\t\tvar generateId = exports.generateId = function generateId(element, prefix) {\n\t\t\t\tvar id = element.id || element.name && element.name + '-' + generateChars(2) || generateChars(4);\n\t\t\t\tid = id.replace(/(:|\\.|\\[|\\]|,)/g, '');\n\t\t\t\tid = prefix + id;\n\n\t\t\t\treturn id;\n\t\t\t};\n\n\t\t\t/**\n * Tests the type of an object\n * @param {String} type Type to test object against\n * @param {Object} obj Object to be tested\n * @return {Boolean}\n */\n\t\t\tvar getType = exports.getType = function getType(obj) {\n\t\t\t\treturn Object.prototype.toString.call(obj).slice(8, -1);\n\t\t\t};\n\n\t\t\t/**\n * Tests the type of an object\n * @param {String} type Type to test object against\n * @param {Object} obj Object to be tested\n * @return {Boolean}\n */\n\t\t\tvar isType = exports.isType = function isType(type, obj) {\n\t\t\t\tvar clas = getType(obj);\n\t\t\t\treturn obj !== undefined && obj !== null && clas === type;\n\t\t\t};\n\n\t\t\t/**\n * Tests to see if a passed object is a node\n * @param {Object} obj Object to be tested\n * @return {Boolean}\n */\n\t\t\tvar isNode = exports.isNode = function isNode(o) {\n\t\t\t\treturn (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === \"object\" ? o instanceof Node : o && (typeof o === 'undefined' ? 'undefined' : _typeof(o)) === \"object\" && typeof o.nodeType === \"number\" && typeof o.nodeName === \"string\";\n\t\t\t};\n\n\t\t\t/**\n * Tests to see if a passed object is an element\n * @param {Object} obj Object to be tested\n * @return {Boolean}\n */\n\t\t\tvar isElement = exports.isElement = function isElement(o) {\n\t\t\t\treturn (typeof HTMLElement === 'undefined' ? 'undefined' : _typeof(HTMLElement)) === \"object\" ? o instanceof HTMLElement : //DOM2\n\t\t\t\to && (typeof o === 'undefined' ? 'undefined' : _typeof(o)) === \"object\" && o !== null && o.nodeType === 1 && typeof o.nodeName === \"string\";\n\t\t\t};\n\n\t\t\t/**\n * Merges unspecified amount of objects into new object\n * @private\n * @return {Object} Merged object of arguments\n */\n\t\t\tvar extend = exports.extend = function extend() {\n\t\t\t\tvar extended = {};\n\t\t\t\tvar length = arguments.length;\n\n\t\t\t\t/**\n * Merge one object into another\n * @param {Object} obj Object to merge into extended object\n */\n\t\t\t\tvar merge = function merge(obj) {\n\t\t\t\t\tfor (var prop in obj) {\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(obj, prop)) {\n\t\t\t\t\t\t\t// If deep merge and property is an object, merge properties\n\t\t\t\t\t\t\tif (isType('Object', obj[prop])) {\n\t\t\t\t\t\t\t\textended[prop] = extend(true, extended[prop], obj[prop]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\textended[prop] = obj[prop];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Loop through each passed argument\n\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t// store argument at position i\n\t\t\t\t\tvar obj = arguments[i];\n\n\t\t\t\t\t// If we are in fact dealing with an object, merge it.\n\t\t\t\t\tif (isType('Object', obj)) {\n\t\t\t\t\t\tmerge(obj);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn extended;\n\t\t\t};\n\n\t\t\t/**\n * CSS transition end event listener\n * @return\n */\n\t\t\tvar whichTransitionEvent = exports.whichTransitionEvent = function whichTransitionEvent() {\n\t\t\t\tvar t,\n\t\t\t\t el = document.createElement('fakeelement');\n\n\t\t\t\tvar transitions = {\n\t\t\t\t\t'transition': 'transitionend',\n\t\t\t\t\t'OTransition': 'oTransitionEnd',\n\t\t\t\t\t'MozTransition': 'transitionend',\n\t\t\t\t\t'WebkitTransition': 'webkitTransitionEnd'\n\t\t\t\t};\n\n\t\t\t\tfor (t in transitions) {\n\t\t\t\t\tif (el.style[t] !== undefined) {\n\t\t\t\t\t\treturn transitions[t];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * CSS animation end event listener\n * @return\n */\n\t\t\tvar whichAnimationEvent = exports.whichAnimationEvent = function whichAnimationEvent() {\n\t\t\t\tvar t,\n\t\t\t\t el = document.createElement('fakeelement');\n\n\t\t\t\tvar animations = {\n\t\t\t\t\t'animation': 'animationend',\n\t\t\t\t\t'OAnimation': 'oAnimationEnd',\n\t\t\t\t\t'MozAnimation': 'animationend',\n\t\t\t\t\t'WebkitAnimation': 'webkitAnimationEnd'\n\t\t\t\t};\n\n\t\t\t\tfor (t in animations) {\n\t\t\t\t\tif (el.style[t] !== undefined) {\n\t\t\t\t\t\treturn animations[t];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * Get the ancestors of each element in the current set of matched elements,\n * up to but not including the element matched by the selector\n * @param {NodeElement} elem Element to begin search from\n * @param {NodeElement} parent Parent to find\n * @param {String} selector Class to find\n * @return {Array} Array of parent elements\n */\n\t\t\tvar getParentsUntil = exports.getParentsUntil = function getParentsUntil(elem, parent, selector) {\n\t\t\t\tvar parents = [];\n\t\t\t\t// Get matches\n\t\t\t\tfor (; elem && elem !== document; elem = elem.parentNode) {\n\n\t\t\t\t\t// Check if parent has been reached\n\t\t\t\t\tif (parent) {\n\n\t\t\t\t\t\tvar parentType = parent.charAt(0);\n\n\t\t\t\t\t\t// If parent is a class\n\t\t\t\t\t\tif (parentType === '.') {\n\t\t\t\t\t\t\tif (elem.classList.contains(parent.substr(1))) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If parent is an ID\n\t\t\t\t\t\tif (parentType === '#') {\n\t\t\t\t\t\t\tif (elem.id === parent.substr(1)) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If parent is a data attribute\n\t\t\t\t\t\tif (parentType === '[') {\n\t\t\t\t\t\t\tif (elem.hasAttribute(parent.substr(1, parent.length - 1))) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If parent is a tag\n\t\t\t\t\t\tif (elem.tagName.toLowerCase() === parent) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (selector) {\n\t\t\t\t\t\tvar selectorType = selector.charAt(0);\n\n\t\t\t\t\t\t// If selector is a class\n\t\t\t\t\t\tif (selectorType === '.') {\n\t\t\t\t\t\t\tif (elem.classList.contains(selector.substr(1))) {\n\t\t\t\t\t\t\t\tparents.push(elem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If selector is an ID\n\t\t\t\t\t\tif (selectorType === '#') {\n\t\t\t\t\t\t\tif (elem.id === selector.substr(1)) {\n\t\t\t\t\t\t\t\tparents.push(elem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If selector is a data attribute\n\t\t\t\t\t\tif (selectorType === '[') {\n\t\t\t\t\t\t\tif (elem.hasAttribute(selector.substr(1, selector.length - 1))) {\n\t\t\t\t\t\t\t\tparents.push(elem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If selector is a tag\n\t\t\t\t\t\tif (elem.tagName.toLowerCase() === selector) {\n\t\t\t\t\t\t\tparents.push(elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparents.push(elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Return parents if any exist\n\t\t\t\tif (parents.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\treturn parents;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar wrap = exports.wrap = function wrap(element, wrapper) {\n\t\t\t\twrapper = wrapper || document.createElement('div');\n\t\t\t\tif (element.nextSibling) {\n\t\t\t\t\telement.parentNode.insertBefore(wrapper, element.nextSibling);\n\t\t\t\t} else {\n\t\t\t\t\telement.parentNode.appendChild(wrapper);\n\t\t\t\t}\n\t\t\t\treturn wrapper.appendChild(element);\n\t\t\t};\n\n\t\t\tvar getSiblings = exports.getSiblings = function getSiblings(elem) {\n\t\t\t\tvar siblings = [];\n\t\t\t\tvar sibling = elem.parentNode.firstChild;\n\t\t\t\tfor (; sibling; sibling = sibling.nextSibling) {\n\t\t\t\t\tif (sibling.nodeType === 1 && sibling !== elem) {\n\t\t\t\t\t\tsiblings.push(sibling);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn siblings;\n\t\t\t};\n\n\t\t\t/**\n * Find ancestor in DOM tree\n * @param {NodeElement} el Element to start search from\n * @param {[type]} cls Class of parent\n * @return {NodeElement} Found parent element\n */\n\t\t\tvar findAncestor = exports.findAncestor = function findAncestor(el, cls) {\n\t\t\t\twhile ((el = el.parentElement) && !el.classList.contains(cls)) {}\n\t\t\t\treturn el;\n\t\t\t};\n\n\t\t\t/**\n * Find ancestor in DOM tree by attribute name\n * @param {NodeElement} el Element to start search from\n * @param {string} attr Attribute name of parent\n * @return {?NodeElement} Found parent element or null\n */\n\t\t\tvar findAncestorByAttrName = exports.findAncestorByAttrName = function findAncestorByAttrName(el, attr) {\n\t\t\t\tvar target = el;\n\n\t\t\t\twhile (target) {\n\t\t\t\t\tif (target.hasAttribute(attr)) {\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget = target.parentElement;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t};\n\n\t\t\t/**\n * Debounce an event handler.\n * @param {Function} func Function to run after wait\n * @param {Number} wait The delay before the function is executed\n * @param {Boolean} immediate If passed, trigger the function on the leading edge, instead of the trailing.\n * @return {Function} A function will be called after it stops being called for a given delay\n */\n\t\t\tvar debounce = exports.debounce = function debounce(func, wait, immediate) {\n\t\t\t\tvar timeout;\n\t\t\t\treturn function () {\n\t\t\t\t\tvar context = this,\n\t\t\t\t\t args = arguments;\n\t\t\t\t\tvar later = function later() {\n\t\t\t\t\t\ttimeout = null;\n\t\t\t\t\t\tif (!immediate) func.apply(context, args);\n\t\t\t\t\t};\n\t\t\t\t\tvar callNow = immediate && !timeout;\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t\t\tif (callNow) func.apply(context, args);\n\t\t\t\t};\n\t\t\t};\n\n\t\t\t/**\n * Get an element's distance from the top of the page\n * @private\n * @param {NodeElement} el Element to test for\n * @return {Number} Elements Distance from top of page\n */\n\t\t\tvar getElemDistance = exports.getElemDistance = function getElemDistance(el) {\n\t\t\t\tvar location = 0;\n\t\t\t\tif (el.offsetParent) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\tlocation += el.offsetTop;\n\t\t\t\t\t\tel = el.offsetParent;\n\t\t\t\t\t} while (el);\n\t\t\t\t}\n\t\t\t\treturn location >= 0 ? location : 0;\n\t\t\t};\n\n\t\t\t/**\n * Determine element height multiplied by any offsets\n * @private\n * @param {HTMLElement} el Element to test for\n * @return {Number} Height of element\n */\n\t\t\tvar getElementOffset = exports.getElementOffset = function getElementOffset(el, offset) {\n\t\t\t\tvar elOffset = offset;\n\t\t\t\tif (elOffset > 1) elOffset = 1;\n\t\t\t\tif (elOffset > 0) elOffset = 0;\n\n\t\t\t\treturn Math.max(el.offsetHeight * elOffset);\n\t\t\t};\n\n\t\t\t/**\n * Get the next or previous element from a given start point\n * @param {HTMLElement} startEl Element to start position from\n * @param {String} className The class we will look through\n * @param {Number} direction Positive next element, negative previous element\n * @return {[HTMLElement} Found element\n */\n\t\t\tvar getAdjacentEl = exports.getAdjacentEl = function getAdjacentEl(startEl, className) {\n\t\t\t\tvar direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n\t\t\t\tif (!startEl || !className) return;\n\n\t\t\t\tvar parent = startEl.parentNode.parentNode;\n\t\t\t\tvar children = Array.from(parent.querySelectorAll(className));\n\n\t\t\t\tvar startPos = children.indexOf(startEl);\n\t\t\t\tvar operatorDirection = direction > 0 ? 1 : -1;\n\n\t\t\t\treturn children[startPos + operatorDirection];\n\t\t\t};\n\n\t\t\t/**\n * Get scroll position based on top/bottom position\n * @private\n * @return {String} Position of scroll\n */\n\t\t\tvar getScrollPosition = exports.getScrollPosition = function getScrollPosition(position) {\n\t\t\t\tif (position === 'bottom') {\n\t\t\t\t\t// Scroll position from the bottom of the viewport\n\t\t\t\t\treturn Math.max((window.scrollY || window.pageYOffset) + (window.innerHeight || document.documentElement.clientHeight));\n\t\t\t\t} else {\n\t\t\t\t\t// Scroll position from the top of the viewport\n\t\t\t\t\treturn window.scrollY || window.pageYOffset;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * Determine whether an element is within the viewport\n * @param {HTMLElement} el Element to test\n * @return {String} Position of scroll\n * @return {Boolean}\n */\n\t\t\tvar isInView = exports.isInView = function isInView(el, position, offset) {\n\t\t\t\t// If the user has scrolled further than the distance from the element to the top of its parent\n\t\t\t\treturn this.getScrollPosition(position) > this.getElemDistance(el) + this.getElementOffset(el, offset) ? true : false;\n\t\t\t};\n\n\t\t\t/**\n * Determine whether an element is within\n * @param {HTMLElement} el Element to test\n * @param {HTMLElement} parent Scrolling parent\n * @param {Number} direction Whether element is visible from above or below\n * @return {Boolean}\n */\n\t\t\tvar isScrolledIntoView = exports.isScrolledIntoView = function isScrolledIntoView(el, parent) {\n\t\t\t\tvar direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n\t\t\t\tif (!el) return;\n\n\t\t\t\tvar isVisible = void 0;\n\n\t\t\t\tif (direction > 0) {\n\t\t\t\t\t// In view from bottom\n\t\t\t\t\tisVisible = parent.scrollTop + parent.offsetHeight >= el.offsetTop + el.offsetHeight;\n\t\t\t\t} else {\n\t\t\t\t\t// In view from top\n\t\t\t\t\tisVisible = el.offsetTop >= parent.scrollTop;\n\t\t\t\t}\n\n\t\t\t\treturn isVisible;\n\t\t\t};\n\n\t\t\t/**\n * Remove html tags from a string\n * @param {String} Initial string/html\n * @return {String} Sanitised string\n */\n\t\t\tvar stripHTML = exports.stripHTML = function stripHTML(html) {\n\t\t\t\tvar el = document.createElement(\"DIV\");\n\t\t\t\tel.innerHTML = html;\n\t\t\t\treturn el.textContent || el.innerText || \"\";\n\t\t\t};\n\n\t\t\t/**\n * Adds animation to an element and removes it upon animation completion\n * @param {Element} el Element to add animation to\n * @param {String} animation Animation class to add to element\n * @return\n */\n\t\t\tvar addAnimation = exports.addAnimation = function addAnimation(el, animation) {\n\t\t\t\tvar animationEvent = whichAnimationEvent();\n\n\t\t\t\tvar removeAnimation = function removeAnimation() {\n\t\t\t\t\tel.classList.remove(animation);\n\t\t\t\t\tel.removeEventListener(animationEvent, removeAnimation, false);\n\t\t\t\t};\n\n\t\t\t\tel.classList.add(animation);\n\t\t\t\tel.addEventListener(animationEvent, removeAnimation, false);\n\t\t\t};\n\n\t\t\t/**\n * Get a random number between a range\n * @param {Number} min Minimum range\n * @param {Number} max Maximum range\n * @return {Number} Random number\n */\n\t\t\tvar getRandomNumber = exports.getRandomNumber = function getRandomNumber(min, max) {\n\t\t\t\treturn Math.floor(Math.random() * (max - min) + min);\n\t\t\t};\n\n\t\t\t/**\n * Turn a string into a node\n * @param {String} String to convert\n * @return {HTMLElement} Converted node element\n */\n\t\t\tvar strToEl = exports.strToEl = function () {\n\t\t\t\tvar tmpEl = document.createElement('div');\n\t\t\t\treturn function (str) {\n\t\t\t\t\tvar cleanedInput = str.trim();\n\t\t\t\t\tvar r = void 0;\n\t\t\t\t\ttmpEl.innerHTML = cleanedInput;\n\t\t\t\t\tr = tmpEl.children[0];\n\n\t\t\t\t\twhile (tmpEl.firstChild) {\n\t\t\t\t\t\ttmpEl.removeChild(tmpEl.firstChild);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn r;\n\t\t\t\t};\n\t\t\t}();\n\n\t\t\t/**\n * Sets the width of a passed input based on its value\n * @return {Number} Width of input\n */\n\t\t\tvar getWidthOfInput = exports.getWidthOfInput = function getWidthOfInput(input) {\n\t\t\t\tvar value = input.value || input.placeholder;\n\t\t\t\tvar width = input.offsetWidth;\n\n\t\t\t\tif (value) {\n\t\t\t\t\tvar testEl = strToEl('' + value + '');\n\t\t\t\t\ttestEl.style.position = 'absolute';\n\t\t\t\t\ttestEl.style.padding = '0';\n\t\t\t\t\ttestEl.style.top = '-9999px';\n\t\t\t\t\ttestEl.style.left = '-9999px';\n\t\t\t\t\ttestEl.style.width = 'auto';\n\t\t\t\t\ttestEl.style.whiteSpace = 'pre';\n\n\t\t\t\t\tif (document.body.contains(input) && window.getComputedStyle) {\n\t\t\t\t\t\tvar inputStyle = window.getComputedStyle(input);\n\n\t\t\t\t\t\tif (inputStyle) {\n\t\t\t\t\t\t\ttestEl.style.fontSize = inputStyle.fontSize;\n\t\t\t\t\t\t\ttestEl.style.fontFamily = inputStyle.fontFamily;\n\t\t\t\t\t\t\ttestEl.style.fontWeight = inputStyle.fontWeight;\n\t\t\t\t\t\t\ttestEl.style.fontStyle = inputStyle.fontStyle;\n\t\t\t\t\t\t\ttestEl.style.letterSpacing = inputStyle.letterSpacing;\n\t\t\t\t\t\t\ttestEl.style.textTransform = inputStyle.textTransform;\n\t\t\t\t\t\t\ttestEl.style.padding = inputStyle.padding;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.appendChild(testEl);\n\n\t\t\t\t\tif (value && testEl.offsetWidth !== input.offsetWidth) {\n\t\t\t\t\t\twidth = testEl.offsetWidth + 4;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.removeChild(testEl);\n\t\t\t\t}\n\n\t\t\t\treturn width + 'px';\n\t\t\t};\n\n\t\t\t/**\n * Sorting function for current and previous string\n * @param {String} a Current value\n * @param {String} b Next value\n * @return {Number} -1 for after previous,\n * 1 for before,\n * 0 for same location\n */\n\t\t\tvar sortByAlpha = exports.sortByAlpha = function sortByAlpha(a, b) {\n\t\t\t\tvar labelA = (a.label || a.value).toLowerCase();\n\t\t\t\tvar labelB = (b.label || b.value).toLowerCase();\n\n\t\t\t\tif (labelA < labelB) return -1;\n\t\t\t\tif (labelA > labelB) return 1;\n\t\t\t\treturn 0;\n\t\t\t};\n\n\t\t\t/**\n * Sort by numeric score\n * @param {Object} a Current value\n * @param {Object} b Next value\n * @return {Number} -1 for after previous,\n * 1 for before,\n * 0 for same location\n */\n\t\t\tvar sortByScore = exports.sortByScore = function sortByScore(a, b) {\n\t\t\t\treturn a.score - b.score;\n\t\t\t};\n\n\t\t\t/**\n * Trigger native event\n * @param {NodeElement} element Element to trigger event on\n * @param {String} type Type of event to trigger\n * @param {Object} customArgs Data to pass with event\n * @return {Object} Triggered event\n */\n\t\t\tvar triggerEvent = exports.triggerEvent = function triggerEvent(element, type) {\n\t\t\t\tvar customArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n\t\t\t\tvar event = new CustomEvent(type, {\n\t\t\t\t\tdetail: customArgs,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcancelable: true\n\t\t\t\t});\n\n\t\t\t\treturn element.dispatchEvent(event);\n\t\t\t};\n\n\t\t\t/***/\n\t\t},\n\t\t/* 33 */\n\t\t/***/function (module, exports) {\n\n\t\t\t'use strict';\n\n\t\t\t/* eslint-disable */\n\n\t\t\t(function () {\n\t\t\t\t// Production steps of ECMA-262, Edition 6, 22.1.2.1\n\t\t\t\t// Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from\n\t\t\t\tif (!Array.from) {\n\t\t\t\t\tArray.from = function () {\n\t\t\t\t\t\tvar toStr = Object.prototype.toString;\n\n\t\t\t\t\t\tvar isCallable = function isCallable(fn) {\n\t\t\t\t\t\t\treturn typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar toInteger = function toInteger(value) {\n\t\t\t\t\t\t\tvar number = Number(value);\n\t\t\t\t\t\t\tif (isNaN(number)) {\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (number === 0 || !isFinite(number)) {\n\t\t\t\t\t\t\t\treturn number;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar maxSafeInteger = Math.pow(2, 53) - 1;\n\n\t\t\t\t\t\tvar toLength = function toLength(value) {\n\t\t\t\t\t\t\tvar len = toInteger(value);\n\t\t\t\t\t\t\treturn Math.min(Math.max(len, 0), maxSafeInteger);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// The length property of the from method is 1.\n\t\t\t\t\t\treturn function from(arrayLike /*, mapFn, thisArg */) {\n\t\t\t\t\t\t\t// 1. Let C be the this value.\n\t\t\t\t\t\t\tvar C = this;\n\n\t\t\t\t\t\t\t// 2. Let items be ToObject(arrayLike).\n\t\t\t\t\t\t\tvar items = Object(arrayLike);\n\n\t\t\t\t\t\t\t// 3. ReturnIfAbrupt(items).\n\t\t\t\t\t\t\tif (arrayLike == null) {\n\t\t\t\t\t\t\t\tthrow new TypeError(\"Array.from requires an array-like object - not null or undefined\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// 4. If mapfn is undefined, then let mapping be false.\n\t\t\t\t\t\t\tvar mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n\t\t\t\t\t\t\tvar T;\n\t\t\t\t\t\t\tif (typeof mapFn !== 'undefined') {\n\t\t\t\t\t\t\t\t// 5. else\n\t\t\t\t\t\t\t\t// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n\t\t\t\t\t\t\t\tif (!isCallable(mapFn)) {\n\t\t\t\t\t\t\t\t\tthrow new TypeError('Array.from: when provided, the second argument must be a function');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\t\t\t\t\t\t\t\tif (arguments.length > 2) {\n\t\t\t\t\t\t\t\t\tT = arguments[2];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// 10. Let lenValue be Get(items, \"length\").\n\t\t\t\t\t\t\t// 11. Let len be ToLength(lenValue).\n\t\t\t\t\t\t\tvar len = toLength(items.length);\n\n\t\t\t\t\t\t\t// 13. If IsConstructor(C) is true, then\n\t\t\t\t\t\t\t// 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.\n\t\t\t\t\t\t\t// 14. a. Else, Let A be ArrayCreate(len).\n\t\t\t\t\t\t\tvar A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n\t\t\t\t\t\t\t// 16. Let k be 0.\n\t\t\t\t\t\t\tvar k = 0;\n\t\t\t\t\t\t\t// 17. Repeat, while k < len… (also steps a - h)\n\t\t\t\t\t\t\tvar kValue;\n\t\t\t\t\t\t\twhile (k < len) {\n\t\t\t\t\t\t\t\tkValue = items[k];\n\t\t\t\t\t\t\t\tif (mapFn) {\n\t\t\t\t\t\t\t\t\tA[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tA[k] = kValue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tk += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 18. Let putStatus be Put(A, \"length\", len, true).\n\t\t\t\t\t\t\tA.length = len;\n\t\t\t\t\t\t\t// 20. Return A.\n\t\t\t\t\t\t\treturn A;\n\t\t\t\t\t\t};\n\t\t\t\t\t}();\n\t\t\t\t}\n\n\t\t\t\t// Reference: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n\t\t\t\tif (!Array.prototype.find) {\n\t\t\t\t\tArray.prototype.find = function (predicate) {\n\t\t\t\t\t\t'use strict';\n\n\t\t\t\t\t\tif (this == null) {\n\t\t\t\t\t\t\tthrow new TypeError('Array.prototype.find called on null or undefined');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof predicate !== 'function') {\n\t\t\t\t\t\t\tthrow new TypeError('predicate must be a function');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar list = Object(this);\n\t\t\t\t\t\tvar length = list.length >>> 0;\n\t\t\t\t\t\tvar thisArg = arguments[1];\n\t\t\t\t\t\tvar value;\n\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\tvalue = list[i];\n\t\t\t\t\t\t\tif (predicate.call(thisArg, value, i, list)) {\n\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfunction CustomEvent(event, params) {\n\t\t\t\t\tparams = params || {\n\t\t\t\t\t\tbubbles: false,\n\t\t\t\t\t\tcancelable: false,\n\t\t\t\t\t\tdetail: undefined\n\t\t\t\t\t};\n\t\t\t\t\tvar evt = document.createEvent('CustomEvent');\n\t\t\t\t\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t\t\t\t\treturn evt;\n\t\t\t\t}\n\n\t\t\t\tCustomEvent.prototype = window.Event.prototype;\n\n\t\t\t\twindow.CustomEvent = CustomEvent;\n\t\t\t})();\n\n\t\t\t/***/\n\t\t}]\n\t\t/******/)\n\t);\n});\n;\n//# sourceMappingURL=choices.js.map\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(49)(module)))\n\n/***/ }),\n\n/***/ 49:\n/***/ (function(module, exports) {\n\nmodule.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n/***/ }),\n\n/***/ 50:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = setupPullDownEvents;\nfunction handleTeamPulldownChange(input, basePath) {\n var id = input.value;\n\n if (!id) {\n return false;\n }\n\n var seasonParam = input.dataset.season ? '/' + input.dataset.season : '';\n var path = document.location.pathname;\n var newPath = basePath + id + seasonParam;\n\n if (newPath === path) {\n return false;\n }\n\n window.location.replace(document.location.origin + newPath + document.location.search);\n}\n\nfunction handleSeasonPulldownChange(e) {\n var input = e.currentTarget;\n var year = input.value;\n\n if (!year) {\n return false;\n }\n\n var team = input.dataset.team;\n\n var path = document.location.pathname;\n var newPath = '/teams/' + team + '/' + year;\n\n if (path === newPath) {\n return false;\n }\n\n window.location.replace(document.location.origin + newPath + document.location.search);\n}\n\nfunction setupPullDownEvents() {\n var teamPulldown = document.getElementById('team-pulldown');\n if (teamPulldown) {\n teamPulldown.addEventListener('change', function (e) {\n handleTeamPulldownChange(e.currentTarget, '/teams/');\n });\n }\n\n var wtfTeamPulldown = document.getElementById('wtf-team-pulldown');\n if (wtfTeamPulldown) {\n wtfTeamPulldown.addEventListener('change', function (e) {\n handleTeamPulldownChange(e.currentTarget, '/tools/wtf_engine/');\n });\n }\n\n var seasonPulldown = document.getElementById('season-pulldown');\n if (seasonPulldown) {\n seasonPulldown.addEventListener('change', handleSeasonPulldownChange);\n }\n\n var wtfSeasonPulldown = document.getElementById('wtf-season-pulldown');\n if (wtfSeasonPulldown) {\n wtfSeasonPulldown.addEventListener('change', function (e) {\n var input = e.currentTarget;\n var year = input.value;\n if (!year) {\n return false;\n }\n\n var current_query_string = document.location.search;\n var new_query_string = '';\n\n if (current_query_string.length > 0) {\n var reg = new RegExp(/season=\\w+/);\n if (reg.test(current_query_string)) {\n new_query_string = current_query_string.replace(/season=\\d+/, 'season=' + year);\n } else {\n new_query_string = current_query_string + '&season=' + year;\n }\n } else {\n new_query_string = '?season=' + year;\n }\n\n if (current_query_string === new_query_string) {\n return false;\n }\n\n document.location.href = 'http://' + window.location.host + window.location.pathname + new_query_string;\n });\n }\n}\n\n/***/ }),\n\n/***/ 51:\n/***/ (function(module, exports) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * headroom.js v0.9.4 - Give your page some headroom. Hide your header until you need it\n * Copyright (c) 2017 Nick Williams - http://wicky.nillia.ms/headroom.js\n * License: MIT\n */\n\n(function (root, factory) {\n 'use strict';\n\n // COMMONJS\n\n module.exports = factory();\n})(this, function () {\n 'use strict';\n\n /* exported features */\n\n var features = {\n bind: !!function () {}.bind,\n classList: 'classList' in document.documentElement,\n rAF: !!(window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame)\n };\n window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n\n /**\n * Handles debouncing of events via requestAnimationFrame\n * @see http://www.html5rocks.com/en/tutorials/speed/animations/\n * @param {Function} callback The callback to handle whichever event\n */\n function Debouncer(callback) {\n this.callback = callback;\n this.ticking = false;\n }\n Debouncer.prototype = {\n constructor: Debouncer,\n\n /**\n * dispatches the event to the supplied callback\n * @private\n */\n update: function update() {\n this.callback && this.callback();\n this.ticking = false;\n },\n\n /**\n * ensures events don't get stacked\n * @private\n */\n requestTick: function requestTick() {\n if (!this.ticking) {\n requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));\n this.ticking = true;\n }\n },\n\n /**\n * Attach this as the event listeners\n */\n handleEvent: function handleEvent() {\n this.requestTick();\n }\n };\n /**\n * Check if object is part of the DOM\n * @constructor\n * @param {Object} obj element to check\n */\n function isDOMElement(obj) {\n return obj && typeof window !== 'undefined' && (obj === window || obj.nodeType);\n }\n\n /**\n * Helper function for extending objects\n */\n function extend(object /*, objectN ... */) {\n if (arguments.length <= 0) {\n throw new Error('Missing arguments in extend function');\n }\n\n var result = object || {},\n key,\n i;\n\n for (i = 1; i < arguments.length; i++) {\n var replacement = arguments[i] || {};\n\n for (key in replacement) {\n // Recurse into object except if the object is a DOM element\n if (_typeof(result[key]) === 'object' && !isDOMElement(result[key])) {\n result[key] = extend(result[key], replacement[key]);\n } else {\n result[key] = result[key] || replacement[key];\n }\n }\n }\n\n return result;\n }\n\n /**\n * Helper function for normalizing tolerance option to object format\n */\n function normalizeTolerance(t) {\n return t === Object(t) ? t : { down: t, up: t };\n }\n\n /**\n * UI enhancement for fixed headers.\n * Hides header when scrolling down\n * Shows header when scrolling up\n * @constructor\n * @param {DOMElement} elem the header element\n * @param {Object} options options for the widget\n */\n function Headroom(elem, options) {\n options = extend(options, Headroom.options);\n\n this.lastKnownScrollY = 0;\n this.elem = elem;\n this.tolerance = normalizeTolerance(options.tolerance);\n this.classes = options.classes;\n this.offset = options.offset;\n this.scroller = options.scroller;\n this.initialised = false;\n this.onPin = options.onPin;\n this.onUnpin = options.onUnpin;\n this.onTop = options.onTop;\n this.onNotTop = options.onNotTop;\n this.onBottom = options.onBottom;\n this.onNotBottom = options.onNotBottom;\n }\n Headroom.prototype = {\n constructor: Headroom,\n\n /**\n * Initialises the widget\n */\n init: function init() {\n if (!Headroom.cutsTheMustard) {\n return;\n }\n\n this.debouncer = new Debouncer(this.update.bind(this));\n this.elem.classList.add(this.classes.initial);\n\n // defer event registration to handle browser\n // potentially restoring previous scroll position\n setTimeout(this.attachEvent.bind(this), 100);\n\n return this;\n },\n\n /**\n * Unattaches events and removes any classes that were added\n */\n destroy: function destroy() {\n var classes = this.classes;\n\n this.initialised = false;\n\n for (var key in classes) {\n if (classes.hasOwnProperty(key)) {\n this.elem.classList.remove(classes[key]);\n }\n }\n\n this.scroller.removeEventListener('scroll', this.debouncer, false);\n },\n\n /**\n * Attaches the scroll event\n * @private\n */\n attachEvent: function attachEvent() {\n if (!this.initialised) {\n this.lastKnownScrollY = this.getScrollY();\n this.initialised = true;\n this.scroller.addEventListener('scroll', this.debouncer, false);\n\n this.debouncer.handleEvent();\n }\n },\n\n /**\n * Unpins the header if it's currently pinned\n */\n unpin: function unpin() {\n var classList = this.elem.classList,\n classes = this.classes;\n\n if (classList.contains(classes.pinned) || !classList.contains(classes.unpinned)) {\n classList.add(classes.unpinned);\n classList.remove(classes.pinned);\n this.onUnpin && this.onUnpin.call(this);\n }\n },\n\n /**\n * Pins the header if it's currently unpinned\n */\n pin: function pin() {\n var classList = this.elem.classList,\n classes = this.classes;\n\n if (classList.contains(classes.unpinned)) {\n classList.remove(classes.unpinned);\n classList.add(classes.pinned);\n this.onPin && this.onPin.call(this);\n }\n },\n\n /**\n * Handles the top states\n */\n top: function top() {\n var classList = this.elem.classList,\n classes = this.classes;\n\n if (!classList.contains(classes.top)) {\n classList.add(classes.top);\n classList.remove(classes.notTop);\n this.onTop && this.onTop.call(this);\n }\n },\n\n /**\n * Handles the not top state\n */\n notTop: function notTop() {\n var classList = this.elem.classList,\n classes = this.classes;\n\n if (!classList.contains(classes.notTop)) {\n classList.add(classes.notTop);\n classList.remove(classes.top);\n this.onNotTop && this.onNotTop.call(this);\n }\n },\n\n bottom: function bottom() {\n var classList = this.elem.classList,\n classes = this.classes;\n\n if (!classList.contains(classes.bottom)) {\n classList.add(classes.bottom);\n classList.remove(classes.notBottom);\n this.onBottom && this.onBottom.call(this);\n }\n },\n\n /**\n * Handles the not top state\n */\n notBottom: function notBottom() {\n var classList = this.elem.classList,\n classes = this.classes;\n\n if (!classList.contains(classes.notBottom)) {\n classList.add(classes.notBottom);\n classList.remove(classes.bottom);\n this.onNotBottom && this.onNotBottom.call(this);\n }\n },\n\n /**\n * Gets the Y scroll position\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY\n * @return {Number} pixels the page has scrolled along the Y-axis\n */\n getScrollY: function getScrollY() {\n return this.scroller.pageYOffset !== undefined ? this.scroller.pageYOffset : this.scroller.scrollTop !== undefined ? this.scroller.scrollTop : (document.documentElement || document.body.parentNode || document.body).scrollTop;\n },\n\n /**\n * Gets the height of the viewport\n * @see http://andylangton.co.uk/blog/development/get-viewport-size-width-and-height-javascript\n * @return {int} the height of the viewport in pixels\n */\n getViewportHeight: function getViewportHeight() {\n return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\n },\n\n /**\n * Gets the physical height of the DOM element\n * @param {Object} elm the element to calculate the physical height of which\n * @return {int} the physical height of the element in pixels\n */\n getElementPhysicalHeight: function getElementPhysicalHeight(elm) {\n return Math.max(elm.offsetHeight, elm.clientHeight);\n },\n\n /**\n * Gets the physical height of the scroller element\n * @return {int} the physical height of the scroller element in pixels\n */\n getScrollerPhysicalHeight: function getScrollerPhysicalHeight() {\n return this.scroller === window || this.scroller === document.body ? this.getViewportHeight() : this.getElementPhysicalHeight(this.scroller);\n },\n\n /**\n * Gets the height of the document\n * @see http://james.padolsey.com/javascript/get-document-height-cross-browser/\n * @return {int} the height of the document in pixels\n */\n getDocumentHeight: function getDocumentHeight() {\n var body = document.body,\n documentElement = document.documentElement;\n\n return Math.max(body.scrollHeight, documentElement.scrollHeight, body.offsetHeight, documentElement.offsetHeight, body.clientHeight, documentElement.clientHeight);\n },\n\n /**\n * Gets the height of the DOM element\n * @param {Object} elm the element to calculate the height of which\n * @return {int} the height of the element in pixels\n */\n getElementHeight: function getElementHeight(elm) {\n return Math.max(elm.scrollHeight, elm.offsetHeight, elm.clientHeight);\n },\n\n /**\n * Gets the height of the scroller element\n * @return {int} the height of the scroller element in pixels\n */\n getScrollerHeight: function getScrollerHeight() {\n return this.scroller === window || this.scroller === document.body ? this.getDocumentHeight() : this.getElementHeight(this.scroller);\n },\n\n /**\n * determines if the scroll position is outside of document boundaries\n * @param {int} currentScrollY the current y scroll position\n * @return {bool} true if out of bounds, false otherwise\n */\n isOutOfBounds: function isOutOfBounds(currentScrollY) {\n var pastTop = currentScrollY < 0,\n pastBottom = currentScrollY + this.getScrollerPhysicalHeight() > this.getScrollerHeight();\n\n return pastTop || pastBottom;\n },\n\n /**\n * determines if the tolerance has been exceeded\n * @param {int} currentScrollY the current scroll y position\n * @return {bool} true if tolerance exceeded, false otherwise\n */\n toleranceExceeded: function toleranceExceeded(currentScrollY, direction) {\n return Math.abs(currentScrollY - this.lastKnownScrollY) >= this.tolerance[direction];\n },\n\n /**\n * determine if it is appropriate to unpin\n * @param {int} currentScrollY the current y scroll position\n * @param {bool} toleranceExceeded has the tolerance been exceeded?\n * @return {bool} true if should unpin, false otherwise\n */\n shouldUnpin: function shouldUnpin(currentScrollY, toleranceExceeded) {\n var scrollingDown = currentScrollY > this.lastKnownScrollY,\n pastOffset = currentScrollY >= this.offset;\n\n return scrollingDown && pastOffset && toleranceExceeded;\n },\n\n /**\n * determine if it is appropriate to pin\n * @param {int} currentScrollY the current y scroll position\n * @param {bool} toleranceExceeded has the tolerance been exceeded?\n * @return {bool} true if should pin, false otherwise\n */\n shouldPin: function shouldPin(currentScrollY, toleranceExceeded) {\n var scrollingUp = currentScrollY < this.lastKnownScrollY,\n pastOffset = currentScrollY <= this.offset;\n\n return scrollingUp && toleranceExceeded || pastOffset;\n },\n\n /**\n * Handles updating the state of the widget\n */\n update: function update() {\n var currentScrollY = this.getScrollY(),\n scrollDirection = currentScrollY > this.lastKnownScrollY ? 'down' : 'up',\n toleranceExceeded = this.toleranceExceeded(currentScrollY, scrollDirection);\n\n if (this.isOutOfBounds(currentScrollY)) {\n // Ignore bouncy scrolling in OSX\n return;\n }\n\n if (currentScrollY <= this.offset) {\n this.top();\n } else {\n this.notTop();\n }\n\n if (currentScrollY + this.getViewportHeight() >= this.getScrollerHeight()) {\n this.bottom();\n } else {\n this.notBottom();\n }\n\n if (this.shouldUnpin(currentScrollY, toleranceExceeded)) {\n this.unpin();\n } else if (this.shouldPin(currentScrollY, toleranceExceeded)) {\n this.pin();\n }\n\n this.lastKnownScrollY = currentScrollY;\n }\n };\n /**\n * Default options\n * @type {Object}\n */\n Headroom.options = {\n tolerance: {\n up: 0,\n down: 0\n },\n offset: 0,\n scroller: window,\n classes: {\n pinned: 'headroom--pinned',\n unpinned: 'headroom--unpinned',\n top: 'headroom--top',\n notTop: 'headroom--not-top',\n bottom: 'headroom--bottom',\n notBottom: 'headroom--not-bottom',\n initial: 'headroom'\n }\n };\n Headroom.cutsTheMustard = typeof features !== 'undefined' && features.rAF && features.bind && features.classList;\n\n return Headroom;\n});\n\n/***/ })\n\n/******/ });\n\n\n// WEBPACK FOOTER //\n// custom-fe229a618fbc60ee5102.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 43);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3cbe0e4cda69decce2c4","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.preact = {})));\n}(this, (function (exports) { 'use strict';\n\n\tvar VNode = function VNode() {};\n\n\tvar options = {};\n\n\tvar stack = [];\n\n\tvar EMPTY_CHILDREN = [];\n\n\tfunction h(nodeName, attributes) {\n\t\tvar children = EMPTY_CHILDREN,\n\t\t lastSimple = void 0,\n\t\t child = void 0,\n\t\t simple = void 0,\n\t\t i = void 0;\n\t\tfor (i = arguments.length; i-- > 2;) {\n\t\t\tstack.push(arguments[i]);\n\t\t}\n\t\tif (attributes && attributes.children != null) {\n\t\t\tif (!stack.length) stack.push(attributes.children);\n\t\t\tdelete attributes.children;\n\t\t}\n\t\twhile (stack.length) {\n\t\t\tif ((child = stack.pop()) && child.pop !== undefined) {\n\t\t\t\tfor (i = child.length; i--;) {\n\t\t\t\t\tstack.push(child[i]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (typeof child === 'boolean') child = null;\n\n\t\t\t\tif (simple = typeof nodeName !== 'function') {\n\t\t\t\t\tif (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;\n\t\t\t\t}\n\n\t\t\t\tif (simple && lastSimple) {\n\t\t\t\t\tchildren[children.length - 1] += child;\n\t\t\t\t} else if (children === EMPTY_CHILDREN) {\n\t\t\t\t\tchildren = [child];\n\t\t\t\t} else {\n\t\t\t\t\tchildren.push(child);\n\t\t\t\t}\n\n\t\t\t\tlastSimple = simple;\n\t\t\t}\n\t\t}\n\n\t\tvar p = new VNode();\n\t\tp.nodeName = nodeName;\n\t\tp.children = children;\n\t\tp.attributes = attributes == null ? undefined : attributes;\n\t\tp.key = attributes == null ? undefined : attributes.key;\n\n\t\tif (options.vnode !== undefined) options.vnode(p);\n\n\t\treturn p;\n\t}\n\n\tfunction extend(obj, props) {\n\t for (var i in props) {\n\t obj[i] = props[i];\n\t }return obj;\n\t}\n\n\tfunction applyRef(ref, value) {\n\t if (ref) {\n\t if (typeof ref == 'function') ref(value);else ref.current = value;\n\t }\n\t}\n\n\tvar defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;\n\n\tfunction cloneElement(vnode, props) {\n\t return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);\n\t}\n\n\tvar NO_RENDER = 0;\n\n\tvar SYNC_RENDER = 1;\n\n\tvar FORCE_RENDER = 2;\n\n\tvar ASYNC_RENDER = 3;\n\n\tvar ATTR_KEY = '__preactattr_';\n\n\tvar IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\n\tvar items = [];\n\n\tfunction enqueueRender(component) {\n\t\tif (!component._dirty && (component._dirty = true) && items.push(component) == 1) {\n\t\t\t(options.debounceRendering || defer)(rerender);\n\t\t}\n\t}\n\n\tfunction rerender() {\n\t\tvar p = void 0;\n\t\twhile (p = items.pop()) {\n\t\t\tif (p._dirty) renderComponent(p);\n\t\t}\n\t}\n\n\tfunction isSameNodeType(node, vnode, hydrating) {\n\t\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\t\treturn node.splitText !== undefined;\n\t\t}\n\t\tif (typeof vnode.nodeName === 'string') {\n\t\t\treturn !node._componentConstructor && isNamedNode(node, vnode.nodeName);\n\t\t}\n\t\treturn hydrating || node._componentConstructor === vnode.nodeName;\n\t}\n\n\tfunction isNamedNode(node, nodeName) {\n\t\treturn node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();\n\t}\n\n\tfunction getNodeProps(vnode) {\n\t\tvar props = extend({}, vnode.attributes);\n\t\tprops.children = vnode.children;\n\n\t\tvar defaultProps = vnode.nodeName.defaultProps;\n\t\tif (defaultProps !== undefined) {\n\t\t\tfor (var i in defaultProps) {\n\t\t\t\tif (props[i] === undefined) {\n\t\t\t\t\tprops[i] = defaultProps[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn props;\n\t}\n\n\tfunction createNode(nodeName, isSvg) {\n\t\tvar node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);\n\t\tnode.normalizedNodeName = nodeName;\n\t\treturn node;\n\t}\n\n\tfunction removeNode(node) {\n\t\tvar parentNode = node.parentNode;\n\t\tif (parentNode) parentNode.removeChild(node);\n\t}\n\n\tfunction setAccessor(node, name, old, value, isSvg) {\n\t\tif (name === 'className') name = 'class';\n\n\t\tif (name === 'key') {} else if (name === 'ref') {\n\t\t\tapplyRef(old, null);\n\t\t\tapplyRef(value, node);\n\t\t} else if (name === 'class' && !isSvg) {\n\t\t\tnode.className = value || '';\n\t\t} else if (name === 'style') {\n\t\t\tif (!value || typeof value === 'string' || typeof old === 'string') {\n\t\t\t\tnode.style.cssText = value || '';\n\t\t\t}\n\t\t\tif (value && typeof value === 'object') {\n\t\t\t\tif (typeof old !== 'string') {\n\t\t\t\t\tfor (var i in old) {\n\t\t\t\t\t\tif (!(i in value)) node.style[i] = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var _i in value) {\n\t\t\t\t\tnode.style[_i] = typeof value[_i] === 'number' && IS_NON_DIMENSIONAL.test(_i) === false ? value[_i] + 'px' : value[_i];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (name === 'dangerouslySetInnerHTML') {\n\t\t\tif (value) node.innerHTML = value.__html || '';\n\t\t} else if (name[0] == 'o' && name[1] == 'n') {\n\t\t\tvar useCapture = name !== (name = name.replace(/Capture$/, ''));\n\t\t\tname = name.toLowerCase().substring(2);\n\t\t\tif (value) {\n\t\t\t\tif (!old) node.addEventListener(name, eventProxy, useCapture);\n\t\t\t} else {\n\t\t\t\tnode.removeEventListener(name, eventProxy, useCapture);\n\t\t\t}\n\t\t\t(node._listeners || (node._listeners = {}))[name] = value;\n\t\t} else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n\t\t\ttry {\n\t\t\t\tnode[name] = value == null ? '' : value;\n\t\t\t} catch (e) {}\n\t\t\tif ((value == null || value === false) && name != 'spellcheck') node.removeAttribute(name);\n\t\t} else {\n\t\t\tvar ns = isSvg && name !== (name = name.replace(/^xlink:?/, ''));\n\n\t\t\tif (value == null || value === false) {\n\t\t\t\tif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);\n\t\t\t} else if (typeof value !== 'function') {\n\t\t\t\tif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction eventProxy(e) {\n\t\treturn this._listeners[e.type](options.event && options.event(e) || e);\n\t}\n\n\tvar mounts = [];\n\n\tvar diffLevel = 0;\n\n\tvar isSvgMode = false;\n\n\tvar hydrating = false;\n\n\tfunction flushMounts() {\n\t\tvar c = void 0;\n\t\twhile (c = mounts.shift()) {\n\t\t\tif (options.afterMount) options.afterMount(c);\n\t\t\tif (c.componentDidMount) c.componentDidMount();\n\t\t}\n\t}\n\n\tfunction diff(dom, vnode, context, mountAll, parent, componentRoot) {\n\t\tif (!diffLevel++) {\n\t\t\tisSvgMode = parent != null && parent.ownerSVGElement !== undefined;\n\n\t\t\thydrating = dom != null && !(ATTR_KEY in dom);\n\t\t}\n\n\t\tvar ret = idiff(dom, vnode, context, mountAll, componentRoot);\n\n\t\tif (parent && ret.parentNode !== parent) parent.appendChild(ret);\n\n\t\tif (! --diffLevel) {\n\t\t\thydrating = false;\n\n\t\t\tif (!componentRoot) flushMounts();\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n\t\tvar out = dom,\n\t\t prevSvgMode = isSvgMode;\n\n\t\tif (vnode == null || typeof vnode === 'boolean') vnode = '';\n\n\t\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\t\tif (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {\n\t\t\t\tif (dom.nodeValue != vnode) {\n\t\t\t\t\tdom.nodeValue = vnode;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tout = document.createTextNode(vnode);\n\t\t\t\tif (dom) {\n\t\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\t\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tout[ATTR_KEY] = true;\n\n\t\t\treturn out;\n\t\t}\n\n\t\tvar vnodeName = vnode.nodeName;\n\t\tif (typeof vnodeName === 'function') {\n\t\t\treturn buildComponentFromVNode(dom, vnode, context, mountAll);\n\t\t}\n\n\t\tisSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;\n\n\t\tvnodeName = String(vnodeName);\n\t\tif (!dom || !isNamedNode(dom, vnodeName)) {\n\t\t\tout = createNode(vnodeName, isSvgMode);\n\n\t\t\tif (dom) {\n\t\t\t\twhile (dom.firstChild) {\n\t\t\t\t\tout.appendChild(dom.firstChild);\n\t\t\t\t}\n\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\n\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t}\n\t\t}\n\n\t\tvar fc = out.firstChild,\n\t\t props = out[ATTR_KEY],\n\t\t vchildren = vnode.children;\n\n\t\tif (props == null) {\n\t\t\tprops = out[ATTR_KEY] = {};\n\t\t\tfor (var a = out.attributes, i = a.length; i--;) {\n\t\t\t\tprops[a[i].name] = a[i].value;\n\t\t\t}\n\t\t}\n\n\t\tif (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {\n\t\t\tif (fc.nodeValue != vchildren[0]) {\n\t\t\t\tfc.nodeValue = vchildren[0];\n\t\t\t}\n\t\t} else if (vchildren && vchildren.length || fc != null) {\n\t\t\t\tinnerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);\n\t\t\t}\n\n\t\tdiffAttributes(out, vnode.attributes, props);\n\n\t\tisSvgMode = prevSvgMode;\n\n\t\treturn out;\n\t}\n\n\tfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n\t\tvar originalChildren = dom.childNodes,\n\t\t children = [],\n\t\t keyed = {},\n\t\t keyedLen = 0,\n\t\t min = 0,\n\t\t len = originalChildren.length,\n\t\t childrenLen = 0,\n\t\t vlen = vchildren ? vchildren.length : 0,\n\t\t j = void 0,\n\t\t c = void 0,\n\t\t f = void 0,\n\t\t vchild = void 0,\n\t\t child = void 0;\n\n\t\tif (len !== 0) {\n\t\t\tfor (var i = 0; i < len; i++) {\n\t\t\t\tvar _child = originalChildren[i],\n\t\t\t\t props = _child[ATTR_KEY],\n\t\t\t\t key = vlen && props ? _child._component ? _child._component.__key : props.key : null;\n\t\t\t\tif (key != null) {\n\t\t\t\t\tkeyedLen++;\n\t\t\t\t\tkeyed[key] = _child;\n\t\t\t\t} else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {\n\t\t\t\t\tchildren[childrenLen++] = _child;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (vlen !== 0) {\n\t\t\tfor (var _i = 0; _i < vlen; _i++) {\n\t\t\t\tvchild = vchildren[_i];\n\t\t\t\tchild = null;\n\n\t\t\t\tvar _key = vchild.key;\n\t\t\t\tif (_key != null) {\n\t\t\t\t\tif (keyedLen && keyed[_key] !== undefined) {\n\t\t\t\t\t\tchild = keyed[_key];\n\t\t\t\t\t\tkeyed[_key] = undefined;\n\t\t\t\t\t\tkeyedLen--;\n\t\t\t\t\t}\n\t\t\t\t} else if (min < childrenLen) {\n\t\t\t\t\t\tfor (j = min; j < childrenLen; j++) {\n\t\t\t\t\t\t\tif (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {\n\t\t\t\t\t\t\t\tchild = c;\n\t\t\t\t\t\t\t\tchildren[j] = undefined;\n\t\t\t\t\t\t\t\tif (j === childrenLen - 1) childrenLen--;\n\t\t\t\t\t\t\t\tif (j === min) min++;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tchild = idiff(child, vchild, context, mountAll);\n\n\t\t\t\tf = originalChildren[_i];\n\t\t\t\tif (child && child !== dom && child !== f) {\n\t\t\t\t\tif (f == null) {\n\t\t\t\t\t\tdom.appendChild(child);\n\t\t\t\t\t} else if (child === f.nextSibling) {\n\t\t\t\t\t\tremoveNode(f);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.insertBefore(child, f);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (keyedLen) {\n\t\t\tfor (var _i2 in keyed) {\n\t\t\t\tif (keyed[_i2] !== undefined) recollectNodeTree(keyed[_i2], false);\n\t\t\t}\n\t\t}\n\n\t\twhile (min <= childrenLen) {\n\t\t\tif ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);\n\t\t}\n\t}\n\n\tfunction recollectNodeTree(node, unmountOnly) {\n\t\tvar component = node._component;\n\t\tif (component) {\n\t\t\tunmountComponent(component);\n\t\t} else {\n\t\t\tif (node[ATTR_KEY] != null) applyRef(node[ATTR_KEY].ref, null);\n\n\t\t\tif (unmountOnly === false || node[ATTR_KEY] == null) {\n\t\t\t\tremoveNode(node);\n\t\t\t}\n\n\t\t\tremoveChildren(node);\n\t\t}\n\t}\n\n\tfunction removeChildren(node) {\n\t\tnode = node.lastChild;\n\t\twhile (node) {\n\t\t\tvar next = node.previousSibling;\n\t\t\trecollectNodeTree(node, true);\n\t\t\tnode = next;\n\t\t}\n\t}\n\n\tfunction diffAttributes(dom, attrs, old) {\n\t\tvar name = void 0;\n\n\t\tfor (name in old) {\n\t\t\tif (!(attrs && attrs[name] != null) && old[name] != null) {\n\t\t\t\tsetAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);\n\t\t\t}\n\t\t}\n\n\t\tfor (name in attrs) {\n\t\t\tif (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {\n\t\t\t\tsetAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);\n\t\t\t}\n\t\t}\n\t}\n\n\tvar recyclerComponents = [];\n\n\tfunction createComponent(Ctor, props, context) {\n\t\tvar inst = void 0,\n\t\t i = recyclerComponents.length;\n\n\t\tif (Ctor.prototype && Ctor.prototype.render) {\n\t\t\tinst = new Ctor(props, context);\n\t\t\tComponent.call(inst, props, context);\n\t\t} else {\n\t\t\tinst = new Component(props, context);\n\t\t\tinst.constructor = Ctor;\n\t\t\tinst.render = doRender;\n\t\t}\n\n\t\twhile (i--) {\n\t\t\tif (recyclerComponents[i].constructor === Ctor) {\n\t\t\t\tinst.nextBase = recyclerComponents[i].nextBase;\n\t\t\t\trecyclerComponents.splice(i, 1);\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t}\n\n\t\treturn inst;\n\t}\n\n\tfunction doRender(props, state, context) {\n\t\treturn this.constructor(props, context);\n\t}\n\n\tfunction setComponentProps(component, props, renderMode, context, mountAll) {\n\t\tif (component._disable) return;\n\t\tcomponent._disable = true;\n\n\t\tcomponent.__ref = props.ref;\n\t\tcomponent.__key = props.key;\n\t\tdelete props.ref;\n\t\tdelete props.key;\n\n\t\tif (typeof component.constructor.getDerivedStateFromProps === 'undefined') {\n\t\t\tif (!component.base || mountAll) {\n\t\t\t\tif (component.componentWillMount) component.componentWillMount();\n\t\t\t} else if (component.componentWillReceiveProps) {\n\t\t\t\tcomponent.componentWillReceiveProps(props, context);\n\t\t\t}\n\t\t}\n\n\t\tif (context && context !== component.context) {\n\t\t\tif (!component.prevContext) component.prevContext = component.context;\n\t\t\tcomponent.context = context;\n\t\t}\n\n\t\tif (!component.prevProps) component.prevProps = component.props;\n\t\tcomponent.props = props;\n\n\t\tcomponent._disable = false;\n\n\t\tif (renderMode !== NO_RENDER) {\n\t\t\tif (renderMode === SYNC_RENDER || options.syncComponentUpdates !== false || !component.base) {\n\t\t\t\trenderComponent(component, SYNC_RENDER, mountAll);\n\t\t\t} else {\n\t\t\t\tenqueueRender(component);\n\t\t\t}\n\t\t}\n\n\t\tapplyRef(component.__ref, component);\n\t}\n\n\tfunction renderComponent(component, renderMode, mountAll, isChild) {\n\t\tif (component._disable) return;\n\n\t\tvar props = component.props,\n\t\t state = component.state,\n\t\t context = component.context,\n\t\t previousProps = component.prevProps || props,\n\t\t previousState = component.prevState || state,\n\t\t previousContext = component.prevContext || context,\n\t\t isUpdate = component.base,\n\t\t nextBase = component.nextBase,\n\t\t initialBase = isUpdate || nextBase,\n\t\t initialChildComponent = component._component,\n\t\t skip = false,\n\t\t snapshot = previousContext,\n\t\t rendered = void 0,\n\t\t inst = void 0,\n\t\t cbase = void 0;\n\n\t\tif (component.constructor.getDerivedStateFromProps) {\n\t\t\tstate = extend(extend({}, state), component.constructor.getDerivedStateFromProps(props, state));\n\t\t\tcomponent.state = state;\n\t\t}\n\n\t\tif (isUpdate) {\n\t\t\tcomponent.props = previousProps;\n\t\t\tcomponent.state = previousState;\n\t\t\tcomponent.context = previousContext;\n\t\t\tif (renderMode !== FORCE_RENDER && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {\n\t\t\t\tskip = true;\n\t\t\t} else if (component.componentWillUpdate) {\n\t\t\t\tcomponent.componentWillUpdate(props, state, context);\n\t\t\t}\n\t\t\tcomponent.props = props;\n\t\t\tcomponent.state = state;\n\t\t\tcomponent.context = context;\n\t\t}\n\n\t\tcomponent.prevProps = component.prevState = component.prevContext = component.nextBase = null;\n\t\tcomponent._dirty = false;\n\n\t\tif (!skip) {\n\t\t\trendered = component.render(props, state, context);\n\n\t\t\tif (component.getChildContext) {\n\t\t\t\tcontext = extend(extend({}, context), component.getChildContext());\n\t\t\t}\n\n\t\t\tif (isUpdate && component.getSnapshotBeforeUpdate) {\n\t\t\t\tsnapshot = component.getSnapshotBeforeUpdate(previousProps, previousState);\n\t\t\t}\n\n\t\t\tvar childComponent = rendered && rendered.nodeName,\n\t\t\t toUnmount = void 0,\n\t\t\t base = void 0;\n\n\t\t\tif (typeof childComponent === 'function') {\n\n\t\t\t\tvar childProps = getNodeProps(rendered);\n\t\t\t\tinst = initialChildComponent;\n\n\t\t\t\tif (inst && inst.constructor === childComponent && childProps.key == inst.__key) {\n\t\t\t\t\tsetComponentProps(inst, childProps, SYNC_RENDER, context, false);\n\t\t\t\t} else {\n\t\t\t\t\ttoUnmount = inst;\n\n\t\t\t\t\tcomponent._component = inst = createComponent(childComponent, childProps, context);\n\t\t\t\t\tinst.nextBase = inst.nextBase || nextBase;\n\t\t\t\t\tinst._parentComponent = component;\n\t\t\t\t\tsetComponentProps(inst, childProps, NO_RENDER, context, false);\n\t\t\t\t\trenderComponent(inst, SYNC_RENDER, mountAll, true);\n\t\t\t\t}\n\n\t\t\t\tbase = inst.base;\n\t\t\t} else {\n\t\t\t\tcbase = initialBase;\n\n\t\t\t\ttoUnmount = initialChildComponent;\n\t\t\t\tif (toUnmount) {\n\t\t\t\t\tcbase = component._component = null;\n\t\t\t\t}\n\n\t\t\t\tif (initialBase || renderMode === SYNC_RENDER) {\n\t\t\t\t\tif (cbase) cbase._component = null;\n\t\t\t\t\tbase = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (initialBase && base !== initialBase && inst !== initialChildComponent) {\n\t\t\t\tvar baseParent = initialBase.parentNode;\n\t\t\t\tif (baseParent && base !== baseParent) {\n\t\t\t\t\tbaseParent.replaceChild(base, initialBase);\n\n\t\t\t\t\tif (!toUnmount) {\n\t\t\t\t\t\tinitialBase._component = null;\n\t\t\t\t\t\trecollectNodeTree(initialBase, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (toUnmount) {\n\t\t\t\tunmountComponent(toUnmount);\n\t\t\t}\n\n\t\t\tcomponent.base = base;\n\t\t\tif (base && !isChild) {\n\t\t\t\tvar componentRef = component,\n\t\t\t\t t = component;\n\t\t\t\twhile (t = t._parentComponent) {\n\t\t\t\t\t(componentRef = t).base = base;\n\t\t\t\t}\n\t\t\t\tbase._component = componentRef;\n\t\t\t\tbase._componentConstructor = componentRef.constructor;\n\t\t\t}\n\t\t}\n\n\t\tif (!isUpdate || mountAll) {\n\t\t\tmounts.push(component);\n\t\t} else if (!skip) {\n\n\t\t\tif (component.componentDidUpdate) {\n\t\t\t\tcomponent.componentDidUpdate(previousProps, previousState, snapshot);\n\t\t\t}\n\t\t\tif (options.afterUpdate) options.afterUpdate(component);\n\t\t}\n\n\t\twhile (component._renderCallbacks.length) {\n\t\t\tcomponent._renderCallbacks.pop().call(component);\n\t\t}if (!diffLevel && !isChild) flushMounts();\n\t}\n\n\tfunction buildComponentFromVNode(dom, vnode, context, mountAll) {\n\t\tvar c = dom && dom._component,\n\t\t originalComponent = c,\n\t\t oldDom = dom,\n\t\t isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n\t\t isOwner = isDirectOwner,\n\t\t props = getNodeProps(vnode);\n\t\twhile (c && !isOwner && (c = c._parentComponent)) {\n\t\t\tisOwner = c.constructor === vnode.nodeName;\n\t\t}\n\n\t\tif (c && isOwner && (!mountAll || c._component)) {\n\t\t\tsetComponentProps(c, props, ASYNC_RENDER, context, mountAll);\n\t\t\tdom = c.base;\n\t\t} else {\n\t\t\tif (originalComponent && !isDirectOwner) {\n\t\t\t\tunmountComponent(originalComponent);\n\t\t\t\tdom = oldDom = null;\n\t\t\t}\n\n\t\t\tc = createComponent(vnode.nodeName, props, context);\n\t\t\tif (dom && !c.nextBase) {\n\t\t\t\tc.nextBase = dom;\n\n\t\t\t\toldDom = null;\n\t\t\t}\n\t\t\tsetComponentProps(c, props, SYNC_RENDER, context, mountAll);\n\t\t\tdom = c.base;\n\n\t\t\tif (oldDom && dom !== oldDom) {\n\t\t\t\toldDom._component = null;\n\t\t\t\trecollectNodeTree(oldDom, false);\n\t\t\t}\n\t\t}\n\n\t\treturn dom;\n\t}\n\n\tfunction unmountComponent(component) {\n\t\tif (options.beforeUnmount) options.beforeUnmount(component);\n\n\t\tvar base = component.base;\n\n\t\tcomponent._disable = true;\n\n\t\tif (component.componentWillUnmount) component.componentWillUnmount();\n\n\t\tcomponent.base = null;\n\n\t\tvar inner = component._component;\n\t\tif (inner) {\n\t\t\tunmountComponent(inner);\n\t\t} else if (base) {\n\t\t\tif (base[ATTR_KEY] != null) applyRef(base[ATTR_KEY].ref, null);\n\n\t\t\tcomponent.nextBase = base;\n\n\t\t\tremoveNode(base);\n\t\t\trecyclerComponents.push(component);\n\n\t\t\tremoveChildren(base);\n\t\t}\n\n\t\tapplyRef(component.__ref, null);\n\t}\n\n\tfunction Component(props, context) {\n\t\tthis._dirty = true;\n\n\t\tthis.context = context;\n\n\t\tthis.props = props;\n\n\t\tthis.state = this.state || {};\n\n\t\tthis._renderCallbacks = [];\n\t}\n\n\textend(Component.prototype, {\n\t\tsetState: function setState(state, callback) {\n\t\t\tif (!this.prevState) this.prevState = this.state;\n\t\t\tthis.state = extend(extend({}, this.state), typeof state === 'function' ? state(this.state, this.props) : state);\n\t\t\tif (callback) this._renderCallbacks.push(callback);\n\t\t\tenqueueRender(this);\n\t\t},\n\t\tforceUpdate: function forceUpdate(callback) {\n\t\t\tif (callback) this._renderCallbacks.push(callback);\n\t\t\trenderComponent(this, FORCE_RENDER);\n\t\t},\n\t\trender: function render() {}\n\t});\n\n\tfunction render(vnode, parent, merge) {\n\t return diff(merge, vnode, {}, false, parent, false);\n\t}\n\n\tfunction createRef() {\n\t\treturn {};\n\t}\n\n\tvar preact = {\n\t\th: h,\n\t\tcreateElement: h,\n\t\tcloneElement: cloneElement,\n\t\tcreateRef: createRef,\n\t\tComponent: Component,\n\t\trender: render,\n\t\trerender: rerender,\n\t\toptions: options\n\t};\n\n\texports.default = preact;\n\texports.h = h;\n\texports.createElement = h;\n\texports.cloneElement = cloneElement;\n\texports.createRef = createRef;\n\texports.Component = Component;\n\texports.render = render;\n\texports.rerender = rerender;\n\texports.options = options;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=preact.umd.js.map\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/preact/dist/preact.umd.js\n// module id = 0\n// module chunks = 0 1 2 3 4","import { h } from 'preact'\nimport { sprintf } from 'sprintf'\n\nlet _cachedCSRFToken\nlet _cachedCurrentUser\n\n// These are attributes where fewer is better, e.g. turnovers, fouls, so the\n// default sort is ascending. We also throw in strings here (name, etc) and the \n// jersey number\nconst ASCENDING_ATTRIBUTES = new Set([\n 'lastname',\n 'exact_position',\n 'turnovers',\n 'per48_turnovers',\n 'fouls',\n 'per48_fouls',\n 'number',\n 'team_abbreviations',\n])\n\nexport function defaultSortDirection(attribute) {\n return ASCENDING_ATTRIBUTES.has(attribute) ? 'asc' : 'desc'\n}\n\nexport function getCSRFToken() {\n if ( !_cachedCSRFToken ) {\n _cachedCSRFToken = document.querySelector(\"meta[name=csrf-token]\").content\n }\n return _cachedCSRFToken\n}\n\nexport function timeAgoInWords(timestamp) {\n // A naive assumption, but...whatever\n if ( ! timestamp ) {\n return 'just now'\n }\n \n const timeNow = new Date()\n const timeThen = new Date(timestamp)\n const secondsAgo = (timeNow - timeThen) / 1000\n if ( secondsAgo < 120 ) {\n return 'just now'\n }\n\n if ( secondsAgo < 3600 ) {\n return `${Math.floor( secondsAgo / 60 )} minutes ago`\n }\n\n const hoursAgo = Math.floor( secondsAgo / 3600 )\n\n if ( hoursAgo === 1 ) {\n return '1 hour ago'\n }\n\n if ( hoursAgo < 24 ) {\n return `${hoursAgo} hours ago`\n }\n\n return `${timeThen.toLocaleDateString()}` \n}\n\n\nexport function currentUser() {\n if ( !_cachedCurrentUser ) {\n // Store wrapped in an object so that when the cookie isn't defined, we nevertheless only \n // do the lookup once.\n _cachedCurrentUser = {\n user: getCookieJSON('boxscoregeeks_user')\n }\n }\n return _cachedCurrentUser.user\n}\n \nexport function getCookieValue(keyName) {\n if ( typeof(document) === 'undefined' ) {\n return\n }\n \n const allCookies = decodeURIComponent(document.cookie).split(';')\n \n const cookie = allCookies.find((entry) => {\n const [ key, value ] = entry.trim().split('=')\n return key === keyName\n })\n \n if ( cookie ) {\n return cookie.trim().split('=')[1]\n } \n}\n\nexport function getCookieJSON(keyName) {\n const cookieValue = getCookieValue(keyName)\n \n if ( cookieValue ) {\n return JSON.parse(cookieValue)\n } \n}\n\nexport function formatNumber(number, precision = 0) {\n const n = round(number, precision)\n\n if ( n < 0 ) {\n return sprintf(`%.${precision}f`, number).replace(/^\\-0/, '-')\n }\n\n if ( number === 0 ) {\n return '0' \n }\n\n return sprintf(`%.${precision}f`, number).replace(/^(\\-)?0/, '')\n}\n\nexport function round(number, precision = 0) {\n const factor = Math.pow(10, precision)\n const roundedTempNumber = Math.round(number * factor)\n\n return roundedTempNumber / factor\n}\n\nexport function linkifyTeams(teams) {\n // todo: how does this happen? Should we log it?\n if (typeof(teams) != 'string') {\n return ''\n }\n\n const abbreviations = teams.split(',')\n \n if ( abbreviations.length > 2 ) {\n return '(3+)' \n }\n \n const links = abbreviations.map((t) => {\n const url = `/teams/${t}`\n const text = t.toUpperCase()\n return { text }\n })\n \n if ( links.length === 2 ) {\n return { links[0] }, { links[1] }\n }\n \n return links[0]\n}\n\nexport function updateAddressBar(state) {\n // Catch in case you are unit testing, and for older browsers that don't do pushState\n if ( typeof(window) == 'undefined' || window.history === void 0 || !window.history.pushState ) {\n return\n }\n \n const cleanedUpState = Object.keys(state).reduce((params, k) => {\n if ( state[k] !== void 0 ) {\n params[k] = state[k]\n }\n return params\n }, {})\n\n // Note that according to spec, the second argument (title) is ignored anyway.\n window.history.pushState(cleanedUpState, 'BoxscoreGeeks', buildNewUrl(cleanedUpState))\n}\n\nexport function buildNewUrl(newParams = {}) {\n const url = window.location.pathname\n\n return url + stringifyParams(newParams)\n}\n\nexport function deserializeQueryString(queryString) {\n if ( !queryString ) {\n return {}\n }\n\n // N.B. Don't call decodeURIComponent before splitting, b/c decoding might unescape '&' that were escaped.\n const pairs = queryString.split('&')\n \n return pairs.reduce((params, pair) => {\n const [ key, value ] = pair.split('=').map((p) => decodeURIComponent(p))\n \n // handle array params like 'positions[]=SG&positions[]=SF'\n if ( key.match(/\\[\\]$/) ) {\n const keyName = key.replace(/\\[\\]/, '') \n const arrayValue = params[keyName] || []\n\n params[keyName] = arrayValue.concat(value)\n } else {\n params[key] = value\n }\n\n return params\n }, {})\n}\n\nexport function stringifyParams(obj) {\n const params = Object.keys(obj)\n \n if ( params.length === 0 ) {\n return ''\n }\n \n const paramPairs = params.reduce((memo, param) => {\n const value = obj[param]\n \n if ( Array.isArray(value) ) {\n const paramName = `${param}[]`\n return memo.concat(value.map((v) => `${encodeURIComponent(paramName)}=${encodeURIComponent(v)}`))\n }\n\n return memo.concat(`${encodeURIComponent(param)}=${encodeURIComponent(obj[param])}`)\n }, [])\n\n return '?' + paramPairs.join('&')\n}\n\nexport function hasClass(el, className) {\n if (el.classList) {\n return el.classList.contains(className);\n } else {\n return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); \n }\n}\n\nexport function addClasses(el, classes) {\n classes.forEach(function(c) {\n if ( el.classList ) {\n el.classList.add(c);\n } else {\n el.className += ' ' + c;\n }\n })\n \n return el;\n}\n\n// see http://youmightnotneedjquery.com/ for why the crazy regex.\nexport function removeClasses(el, classes) {\n classes.forEach(function(c) {\n if ( el.classList ) {\n el.classList.remove(c);\n } else {\n el.className = el.className.replace(new RegExp('(^|\\\\b)' + c.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\n }\n })\n \n return el;\n}\n\nexport function popupify(selector) {\n // TODO: move the below stuff to importables\n const buttons = document.querySelectorAll(selector);\n buttons.forEach((button) => {\n button.addEventListener('click', (e) => {\n e.preventDefault()\n var newWindow = window.open(button.href, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=600')\n newWindow.opener = null\n })\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/lib/utilities.js","/**\nsprintf() for JavaScript 0.7-beta1\nhttp://www.diveintojavascript.com/projects/javascript-sprintf\n\nCopyright (c) Alexandru Marasteanu \nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of sprintf() for JavaScript nor the\n names of its contributors may be used to endorse or promote products\n derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nChangelog:\n2010.11.07 - 0.7-beta1-node\n - converted it to a node.js compatible module\n\n2010.09.06 - 0.7-beta1\n - features: vsprintf, support for named placeholders\n - enhancements: format cache, reduced global namespace pollution\n\n2010.05.22 - 0.6:\n - reverted to 0.4 and fixed the bug regarding the sign of the number 0\n Note:\n Thanks to Raphael Pigulla (http://www.n3rd.org/)\n who warned me about a bug in 0.5, I discovered that the last update was\n a regress. I appologize for that.\n\n2010.05.09 - 0.5:\n - bug fix: 0 is now preceeded with a + sign\n - bug fix: the sign was not at the right position on padded results (Kamal Abdali)\n - switched from GPL to BSD license\n\n2007.10.21 - 0.4:\n - unit test and patch (David Baird)\n\n2007.09.17 - 0.3:\n - bug fix: no longer throws exception on empty paramenters (Hans Pufal)\n\n2007.09.11 - 0.2:\n - feature: added argument swapping\n\n2007.04.03 - 0.1:\n - initial release\n**/\n\nvar sprintf = (function() {\n\tfunction get_type(variable) {\n\t\treturn Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();\n\t}\n\tfunction str_repeat(input, multiplier) {\n\t\tfor (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}\n\t\treturn output.join('');\n\t}\n\n\tvar str_format = function() {\n\t\tif (!str_format.cache.hasOwnProperty(arguments[0])) {\n\t\t\tstr_format.cache[arguments[0]] = str_format.parse(arguments[0]);\n\t\t}\n\t\treturn str_format.format.call(null, str_format.cache[arguments[0]], arguments);\n\t};\n\n\t// convert object to simple one line string without indentation or\n\t// newlines. Note that this implementation does not print array\n\t// values to their actual place for sparse arrays. \n\t//\n\t// For example sparse array like this\n\t// l = []\n\t// l[4] = 1\n\t// Would be printed as \"[1]\" instead of \"[, , , , 1]\"\n\t// \n\t// If argument 'seen' is not null and array the function will check for \n\t// circular object references from argument.\n\tstr_format.object_stringify = function(obj, depth, maxdepth, seen) {\n\t\tvar str = '';\n\t\tif (obj != null) {\n\t\t\tswitch( typeof(obj) ) {\n\t\t\tcase 'function': \n\t\t\t\treturn '[Function' + (obj.name ? ': '+obj.name : '') + ']';\n\t\t\t break;\n\t\t\tcase 'object':\n\t\t\t\tif ( obj instanceof Error) { return '[' + obj.toString() + ']' };\n\t\t\t\tif (depth >= maxdepth) return '[Object]'\n\t\t\t\tif (seen) {\n\t\t\t\t\t// add object to seen list\n\t\t\t\t\tseen = seen.slice(0)\n\t\t\t\t\tseen.push(obj);\n\t\t\t\t}\n\t\t\t\tif (obj.length != null) { //array\n\t\t\t\t\tstr += '[';\n\t\t\t\t\tvar arr = []\n\t\t\t\t\tfor (var i in obj) {\n\t\t\t\t\t\tif (seen && seen.indexOf(obj[i]) >= 0) arr.push('[Circular]');\n\t\t\t\t\t\telse arr.push(str_format.object_stringify(obj[i], depth+1, maxdepth, seen));\n\t\t\t\t\t}\n\t\t\t\t\tstr += arr.join(', ') + ']';\n\t\t\t\t} else if ('getMonth' in obj) { // date\n\t\t\t\t\treturn 'Date(' + obj + ')';\n\t\t\t\t} else { // object\n\t\t\t\t\tstr += '{';\n\t\t\t\t\tvar arr = []\n\t\t\t\t\tfor (var k in obj) { \n\t\t\t\t\t\tif(obj.hasOwnProperty(k)) {\n\t\t\t\t\t\t\tif (seen && seen.indexOf(obj[k]) >= 0) arr.push(k + ': [Circular]');\n\t\t\t\t\t\t\telse arr.push(k +': ' +str_format.object_stringify(obj[k], depth+1, maxdepth, seen)); \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstr += arr.join(', ') + '}';\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t\tbreak;\n\t\t\tcase 'string':\t\t\t\t\n\t\t\t\treturn '\"' + obj + '\"';\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn '' + obj;\n\t}\n\n\tstr_format.format = function(parse_tree, argv) {\n\t\tvar cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;\n\t\tfor (i = 0; i < tree_length; i++) {\n\t\t\tnode_type = get_type(parse_tree[i]);\n\t\t\tif (node_type === 'string') {\n\t\t\t\toutput.push(parse_tree[i]);\n\t\t\t}\n\t\t\telse if (node_type === 'array') {\n\t\t\t\tmatch = parse_tree[i]; // convenience purposes only\n\t\t\t\tif (match[2]) { // keyword argument\n\t\t\t\t\targ = argv[cursor];\n\t\t\t\t\tfor (k = 0; k < match[2].length; k++) {\n\t\t\t\t\t\tif (!arg.hasOwnProperty(match[2][k])) {\n\t\t\t\t\t\t\tthrow new Error(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]));\n\t\t\t\t\t\t}\n\t\t\t\t\t\targ = arg[match[2][k]];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (match[1]) { // positional argument (explicit)\n\t\t\t\t\targ = argv[match[1]];\n\t\t\t\t}\n\t\t\t\telse { // positional argument (implicit)\n\t\t\t\t\targ = argv[cursor++];\n\t\t\t\t}\n\n\t\t\t\tif (/[^sO]/.test(match[8]) && (get_type(arg) != 'number')) {\n\t\t\t\t\tthrow new Error(sprintf('[sprintf] expecting number but found %s \"' + arg + '\"', get_type(arg)));\n\t\t\t\t}\n\t\t\t\tswitch (match[8]) {\n\t\t\t\t\tcase 'b': arg = arg.toString(2); break;\n\t\t\t\t\tcase 'c': arg = String.fromCharCode(arg); break;\n\t\t\t\t\tcase 'd': arg = parseInt(arg, 10); break;\n\t\t\t\t\tcase 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;\n\t\t\t\t\tcase 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;\n\t\t\t\t case 'O': arg = str_format.object_stringify(arg, 0, parseInt(match[7]) || 5); break;\n\t\t\t\t\tcase 'o': arg = arg.toString(8); break;\n\t\t\t\t\tcase 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;\n\t\t\t\t\tcase 'u': arg = Math.abs(arg); break;\n\t\t\t\t\tcase 'x': arg = arg.toString(16); break;\n\t\t\t\t\tcase 'X': arg = arg.toString(16).toUpperCase(); break;\n\t\t\t\t}\n\t\t\t\targ = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);\n\t\t\t\tpad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';\n\t\t\t\tpad_length = match[6] - String(arg).length;\n\t\t\t\tpad = match[6] ? str_repeat(pad_character, pad_length) : '';\n\t\t\t\toutput.push(match[5] ? arg + pad : pad + arg);\n\t\t\t}\n\t\t}\n\t\treturn output.join('');\n\t};\n\n\tstr_format.cache = {};\n\n\tstr_format.parse = function(fmt) {\n\t\tvar _fmt = fmt, match = [], parse_tree = [], arg_names = 0;\n\t\twhile (_fmt) {\n\t\t\tif ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n\t\t\t\tparse_tree.push(match[0]);\n\t\t\t}\n\t\t\telse if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n\t\t\t\tparse_tree.push('%');\n\t\t\t}\n\t\t\telse if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosOuxX])/.exec(_fmt)) !== null) {\n\t\t\t\tif (match[2]) {\n\t\t\t\t\targ_names |= 1;\n\t\t\t\t\tvar field_list = [], replacement_field = match[2], field_match = [];\n\t\t\t\t\tif ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n\t\t\t\t\t\tfield_list.push(field_match[1]);\n\t\t\t\t\t\twhile ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\n\t\t\t\t\t\t\tif ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n\t\t\t\t\t\t\t\tfield_list.push(field_match[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n\t\t\t\t\t\t\t\tfield_list.push(field_match[1]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tthrow new Error('[sprintf] ' + replacement_field);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n throw new Error('[sprintf] ' + replacement_field);\n\t\t\t\t\t}\n\t\t\t\t\tmatch[2] = field_list;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\targ_names |= 2;\n\t\t\t\t}\n\t\t\t\tif (arg_names === 3) {\n\t\t\t\t\tthrow new Error('[sprintf] mixing positional and named placeholders is not (yet) supported');\n\t\t\t\t}\n\t\t\t\tparse_tree.push(match);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error('[sprintf] ' + _fmt);\n\t\t\t}\n\t\t\t_fmt = _fmt.substring(match[0].length);\n\t\t}\n\t\treturn parse_tree;\n\t};\n\n\treturn str_format;\n})();\n\nvar vsprintf = function(fmt, argv) {\n\tvar argvClone = argv.slice();\n\targvClone.unshift(fmt);\n\treturn sprintf.apply(null, argvClone);\n};\n\nmodule.exports = sprintf;\nsprintf.sprintf = sprintf;\nsprintf.vsprintf = vsprintf;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sprintf/lib/sprintf.js\n// module id = 3\n// module chunks = 0 1 2 3 4","import '../custom'\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/packs/custom.js","import { setupTabs } from './tabs'\nimport { setupUserFormListeners } from './user-form-events'\nimport { choicify } from './choicify'\nimport { setupPullDownEvents } from './pulldown-events'\nimport { popupify } from '../lib/utilities'\n\nconst Headroom = require('../lib/headroom')\nfunction setupHeadroom() {\n const header = document.querySelector('div.navbar-wrapper')\n const headroom = new Headroom(header)\n headroom.init()\n // This makes sure that an anchor doesn't land \"under\" the headroom header, which\n // will appear if clicking the anchor causes a \"scroll up\"\n window.addEventListener('hashchange', function() { scrollBy(0, -110) })\n}\n\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n setupTabs()\n setupUserFormListeners()\n popupify('.social-buttons')\n choicify('.choices-select')\n setupPullDownEvents()\n setupHeadroom()\n })\n} else {\n setupTabs()\n setupUserFormListeners()\n popupify('.social-buttons')\n choicify('.choices-select')\n setupPullDownEvents()\n setupHeadroom()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/custom/index.js","import { addClasses, hasClass, removeClasses } from '../lib/utilities'\n\nexport function setupTabs() {\n const tabToggles = document.querySelectorAll('.js-tab-toggle');\n // TODO: Naively assumes only one tabset per page, which atm is true, but tabs within tabpane, or\n // multiple different tab divs on a page, ought to be possible. But FTM we're trying to just keep the\n // JS for this tiny.\n const tabs = document.querySelectorAll('.js-tab');\n const tabPanes = document.querySelectorAll('.tab-pane');\n tabToggles.forEach(function(tabbable) {\n tabbable.addEventListener('click', function(e) {\n e.preventDefault();\n const toggle = e.currentTarget;\n const tab = toggle.parentNode;\n \n if ( hasClass(tab, 'active') ) {\n return\n }\n \n tabs.forEach(function(t) {\n removeClasses(t, ['active']);\n })\n tabPanes.forEach(function(tabPane) {\n removeClasses(tabPane, ['active']);\n })\n\n const pane = document.getElementById(toggle.dataset.tabPane);\n addClasses(pane, ['active']);\n addClasses(tab, ['active']);\n })\n }) \n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/custom/tabs.js","import { addClasses, removeClasses } from '../lib/utilities'\n\nexport function setupUserFormListeners() {\n const inputs = document.querySelectorAll('.input-validatable')\n\n inputs.forEach(function(input) {\n input.addEventListener('keyup', (e) => {\n validateField(e.currentTarget)\n })\n\n input.addEventListener('blur', (e) => {\n validateField(e.currentTarget)\n })\n })\n \n const imageFields = document.querySelectorAll('.hidden-upload-input')\n const preview = document.getElementById('js-image-preview')\n const previewValidation = document.getElementById('imageValidation')\n\n imageFields.forEach((imageField) => {\n const maxHeight = imageField.dataset.maxHeight\n const maxWidth = imageField.dataset.maxWidth\n \n imageField.addEventListener('change', (e) => {\n if (imageField.files && imageField.files[0]) {\n const reader = new FileReader();\n\n reader.onload = (e) => {\n const image = new Image()\n \n image.onload = function() {\n const validHeight = maxHeight && image.height <= maxHeight\n const validWidth = maxWidth && image.width <= maxWidth\n if ( image.width > maxWidth || image.height > maxHeight ) {\n turnInvalid(previewValidation, `Image Exceeds Max Size (${maxWidth} x ${maxHeight})`)\n imageField.value = null\n } else {\n preview.src = image.src\n if ( previewValidation ) {\n removeClasses(previewValidation, ['field-validation-error'])\n }\n } \n }\n \n image.src = e.target.result \n }\n\n reader.readAsDataURL(imageField.files[0])\n }\n })\n })\n}\n\nfunction validationButtonWarn(button) {\n removeClasses(button, ['field-validation-success'])\n addClasses(button, ['field-validation-error'])\n var icon = button.querySelectorAll('i.ss-icon')[0]\n icon.innerHTML = '⛔'\n}\n\nfunction validationButtonGreen(button) {\n removeClasses(button, ['field-validation-error'])\n addClasses(button, ['field-validation-success'])\n\n var icon = button.querySelectorAll('i.ss-icon')[0]\n icon.innerHTML = '👍'\n}\n\nfunction turnValid(button, msg = '') {\n const message = button.querySelectorAll('span')[0]\n validationButtonGreen(button)\n message.innerHTML = (msg)\n}\n\nfunction turnInvalid(button, msg) {\n const message = button.querySelectorAll('span')[0]\n validationButtonWarn(button)\n message.innerHTML = msg;\n}\n\nfunction validateField(field) {\n // First check validation:\n const value = field.value\n const button = document.getElementById(field.dataset.validationButton)\n\n const min = field.dataset.minLength\n const max = field.dataset.maxLength\n\n if ( min > 0 ) {\n if ( value.length < min ) {\n return turnInvalid(button, 'Too short')\n } else {\n turnValid(button)\n }\n }\n\n if ( max > 0 ) {\n if ( value.length > max ) {\n return turnInvalid(button, 'Too long')\n } else {\n turnValid(button)\n }\n }\n\n if ( field.dataset.regex ) {\n if ( field.getAttribute('type') === 'email' ) {\n // Email regex used to validate email formats. It simply asserts that\n // one (and only one) @ exists in the given string. This is mainly\n // to give user feedback and not to assert the e-mail validity.\n var reg = /^[\\w\\%\\+\\-\\.]+@[\\w\\.\\-]+\\.[A-Za-z]{2,4}$/;\n\n if ( reg.test(value) ) {\n turnValid(button)\n } else {\n return turnInvalid(button, 'Not a valid email')\n }\n\n } else {\n var reg = /^[\\w\\-]+$/;\n if ( reg.test(value) ) {\n turnValid(button)\n } else {\n return turnInvalid(button, 'Can only contain letters, \"-\", and \"_\"')\n }\n }\n }\n\n if ( field.dataset.checkUrl ) {\n var url = '/users/check_availability?nickname=' + encodeURIComponent(value)\n if ( field.getAttribute('name') === 'user[email]' ) {\n url = '/users/check_availability?email=' + encodeURIComponent(value)\n }\n\n var request = new XMLHttpRequest()\n request.open('GET', url, true)\n\n request.onload = function() {\n if (request.status >= 200 && request.status < 400) {\n var data = JSON.parse(request.responseText)\n if ( data === 0 ) {\n turnValid(button, 'available')\n } else {\n return turnInvalid(button, 'Already taken')\n }\n }\n }\n\n request.send()\n }\n\n if ( field.dataset.compareWith ) {\n const otherVal = document.getElementById( field.dataset.compareWith ).value\n if ( otherVal === value ) {\n turnValid(button)\n } else {\n return turnInvalid(button, 'Does not match')\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/custom/user-form-events.js","import { hasClass, removeClasses } from '../lib/utilities'\nimport Choices from '../lib/choices'\n\nexport function choicify(selector) {\n // For some reason, the new Choices() api doesn't handle the empty list case\n const choicesPulldown = document.querySelectorAll(selector)\n if ( choicesPulldown.length ) {\n const choices = new Choices(selector, {\n removeItemButton: true,\n // This fixes choices' annoying default behavior of ENTER selecting\n // the first option, even when you have not typed anyting\n callbackOnInit: function() {\n // Beware: `this` here should refer to the choices instance, but if you change\n // this to an arrow function, it won't.\n const c = this;\n \n const textInput = c.containerOuter.querySelectorAll('.choices__input--cloned')[0]\n const choicesDrop = c.containerOuter.querySelectorAll('.choices__list.choices__list--dropdown')[0]\n\n textInput.addEventListener('keydown', (e) => {\n if ( e.key === 'Enter' && e.target.value.length === 0 ) {\n const selected = c.getValue()\n\n e.stopPropagation()\n\n // if drop is visible, ENTER closes it, but doesn't submit\n if ( hasClass(choicesDrop, 'is-active') ) {\n removeClasses(choicesDrop, ['is-active']);\n e.preventDefault() \n }\n\n // otherwise, ENTER submits the form, but if nothing selected so far, \n // preventDefault() so that the form isn't submitted with this field empty.\n if ( selected.length === 0 ) {\n e.preventDefault() \n }\n }\n }) \n }\n })\n } \n}\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/custom/choicify.js","/*! choices.js v3.0.3 | (c) 2018 Josh Johnson | https://github.com/jshjohnson/Choices#readme */ \n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Choices\"] = factory();\n\telse\n\t\troot[\"Choices\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/assets/scripts/dist/\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1);\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _fuse = __webpack_require__(2);\n\n\tvar _fuse2 = _interopRequireDefault(_fuse);\n\n\tvar _classnames = __webpack_require__(3);\n\n\tvar _classnames2 = _interopRequireDefault(_classnames);\n\n\tvar _index = __webpack_require__(4);\n\n\tvar _index2 = _interopRequireDefault(_index);\n\n\tvar _index3 = __webpack_require__(31);\n\n\tvar _utils = __webpack_require__(32);\n\n\t__webpack_require__(33);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\t/**\n\t * Choices\n\t */\n\tvar Choices = function () {\n\t function Choices() {\n\t var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-choice]';\n\t var userConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t _classCallCheck(this, Choices);\n\n\t // If there are multiple elements, create a new instance\n\t // for each element besides the first one (as that already has an instance)\n\t if ((0, _utils.isType)('String', element)) {\n\t var elements = document.querySelectorAll(element);\n\t if (elements.length > 1) {\n\t for (var i = 1; i < elements.length; i++) {\n\t var el = elements[i];\n\t new Choices(el, userConfig);\n\t }\n\t }\n\t }\n\n\t var defaultConfig = {\n\t silent: false,\n\t items: [],\n\t choices: [],\n\t renderChoiceLimit: -1,\n\t maxItemCount: -1,\n\t addItems: true,\n\t removeItems: true,\n\t removeItemButton: false,\n\t editItems: false,\n\t duplicateItems: true,\n\t delimiter: ',',\n\t paste: true,\n\t searchEnabled: true,\n\t searchChoices: true,\n\t searchFloor: 1,\n\t searchResultLimit: 4,\n\t searchFields: ['label', 'value'],\n\t position: 'auto',\n\t resetScrollPosition: true,\n\t regexFilter: null,\n\t shouldSort: true,\n\t shouldSortItems: false,\n\t sortFilter: _utils.sortByAlpha,\n\t placeholder: true,\n\t placeholderValue: null,\n\t searchPlaceholderValue: null,\n\t prependValue: null,\n\t appendValue: null,\n\t renderSelectedChoices: 'auto',\n\t loadingText: 'Loading...',\n\t noResultsText: 'No results found',\n\t noChoicesText: 'No choices to choose from',\n\t itemSelectText: 'Press to select',\n\t addItemText: function addItemText(value) {\n\t return 'Press Enter to add \"' + value + '\"';\n\t },\n\t maxItemText: function maxItemText(maxItemCount) {\n\t return 'Only ' + maxItemCount + ' values can be added.';\n\t },\n\t uniqueItemText: 'Only unique values can be added.',\n\t classNames: {\n\t containerOuter: 'choices',\n\t containerInner: 'choices__inner',\n\t input: 'choices__input',\n\t inputCloned: 'choices__input--cloned',\n\t list: 'choices__list',\n\t listItems: 'choices__list--multiple',\n\t listSingle: 'choices__list--single',\n\t listDropdown: 'choices__list--dropdown',\n\t item: 'choices__item',\n\t itemSelectable: 'choices__item--selectable',\n\t itemDisabled: 'choices__item--disabled',\n\t itemChoice: 'choices__item--choice',\n\t placeholder: 'choices__placeholder',\n\t group: 'choices__group',\n\t groupHeading: 'choices__heading',\n\t button: 'choices__button',\n\t activeState: 'is-active',\n\t focusState: 'is-focused',\n\t openState: 'is-open',\n\t disabledState: 'is-disabled',\n\t highlightedState: 'is-highlighted',\n\t hiddenState: 'is-hidden',\n\t flippedState: 'is-flipped',\n\t loadingState: 'is-loading',\n\t noResults: 'has-no-results',\n\t noChoices: 'has-no-choices'\n\t },\n\t fuseOptions: {\n\t include: 'score'\n\t },\n\t callbackOnInit: null,\n\t callbackOnCreateTemplates: null\n\t };\n\n\t this.idNames = {\n\t itemChoice: 'item-choice'\n\t };\n\n\t // Merge options with user options\n\t this.config = (0, _utils.extend)(defaultConfig, userConfig);\n\n\t if (this.config.renderSelectedChoices !== 'auto' && this.config.renderSelectedChoices !== 'always') {\n\t if (!this.config.silent) {\n\t console.warn('renderSelectedChoices: Possible values are \\'auto\\' and \\'always\\'. Falling back to \\'auto\\'.');\n\t }\n\t this.config.renderSelectedChoices = 'auto';\n\t }\n\n\t // Create data store\n\t this.store = new _index2.default(this.render);\n\n\t // State tracking\n\t this.initialised = false;\n\t this.currentState = {};\n\t this.prevState = {};\n\t this.currentValue = '';\n\n\t // Retrieve triggering element (i.e. element with 'data-choice' trigger)\n\t this.element = element;\n\t this.passedElement = (0, _utils.isType)('String', element) ? document.querySelector(element) : element;\n\n\t if (!this.passedElement) {\n\t if (!this.config.silent) {\n\t console.error('Passed element not found');\n\t }\n\t return;\n\t }\n\n\t this.isTextElement = this.passedElement.type === 'text';\n\t this.isSelectOneElement = this.passedElement.type === 'select-one';\n\t this.isSelectMultipleElement = this.passedElement.type === 'select-multiple';\n\t this.isSelectElement = this.isSelectOneElement || this.isSelectMultipleElement;\n\t this.isValidElementType = this.isTextElement || this.isSelectElement;\n\t this.isIe11 = !!(navigator.userAgent.match(/Trident/) && navigator.userAgent.match(/rv[ :]11/));\n\t this.isScrollingOnIe = false;\n\n\t if (this.config.shouldSortItems === true && this.isSelectOneElement) {\n\t if (!this.config.silent) {\n\t console.warn('shouldSortElements: Type of passed element is \\'select-one\\', falling back to false.');\n\t }\n\t }\n\n\t this.highlightPosition = 0;\n\t this.canSearch = this.config.searchEnabled;\n\n\t this.placeholder = false;\n\t if (!this.isSelectOneElement) {\n\t this.placeholder = this.config.placeholder ? this.config.placeholderValue || this.passedElement.getAttribute('placeholder') : false;\n\t }\n\n\t // Assign preset choices from passed object\n\t this.presetChoices = this.config.choices;\n\n\t // Assign preset items from passed object first\n\t this.presetItems = this.config.items;\n\n\t // Then add any values passed from attribute\n\t if (this.passedElement.value) {\n\t this.presetItems = this.presetItems.concat(this.passedElement.value.split(this.config.delimiter));\n\t }\n\n\t // Set unique base Id\n\t this.baseId = (0, _utils.generateId)(this.passedElement, 'choices-');\n\n\t // Bind methods\n\t this.render = this.render.bind(this);\n\n\t // Bind event handlers\n\t this._onFocus = this._onFocus.bind(this);\n\t this._onBlur = this._onBlur.bind(this);\n\t this._onKeyUp = this._onKeyUp.bind(this);\n\t this._onKeyDown = this._onKeyDown.bind(this);\n\t this._onClick = this._onClick.bind(this);\n\t this._onTouchMove = this._onTouchMove.bind(this);\n\t this._onTouchEnd = this._onTouchEnd.bind(this);\n\t this._onMouseDown = this._onMouseDown.bind(this);\n\t this._onMouseOver = this._onMouseOver.bind(this);\n\t this._onPaste = this._onPaste.bind(this);\n\t this._onInput = this._onInput.bind(this);\n\n\t // Monitor touch taps/scrolls\n\t this.wasTap = true;\n\n\t // Cutting the mustard\n\t var cuttingTheMustard = 'classList' in document.documentElement;\n\t if (!cuttingTheMustard && !this.config.silent) {\n\t console.error('Choices: Your browser doesn\\'t support Choices');\n\t }\n\n\t var canInit = (0, _utils.isElement)(this.passedElement) && this.isValidElementType;\n\n\t if (canInit) {\n\t // If element has already been initialised with Choices\n\t if (this.passedElement.getAttribute('data-choice') === 'active') {\n\t return;\n\t }\n\n\t // Let's go\n\t this.init();\n\t } else if (!this.config.silent) {\n\t console.error('Incompatible input passed');\n\t }\n\t }\n\n\t /*========================================\n\t = Public functions =\n\t ========================================*/\n\n\t /**\n\t * Initialise Choices\n\t * @return\n\t * @public\n\t */\n\n\n\t _createClass(Choices, [{\n\t key: 'init',\n\t value: function init() {\n\t if (this.initialised === true) {\n\t return;\n\t }\n\n\t var callback = this.config.callbackOnInit;\n\n\t // Set initialise flag\n\t this.initialised = true;\n\t // Create required elements\n\t this._createTemplates();\n\t // Generate input markup\n\t this._createInput();\n\t // Subscribe store to render method\n\t this.store.subscribe(this.render);\n\t // Render any items\n\t this.render();\n\t // Trigger event listeners\n\t this._addEventListeners();\n\n\t // Run callback if it is a function\n\t if (callback) {\n\t if ((0, _utils.isType)('Function', callback)) {\n\t callback.call(this);\n\t }\n\t }\n\t }\n\n\t /**\n\t * Destroy Choices and nullify values\n\t * @return\n\t * @public\n\t */\n\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t if (this.initialised === false) {\n\t return;\n\t }\n\n\t // Remove all event listeners\n\t this._removeEventListeners();\n\n\t // Reinstate passed element\n\t this.passedElement.classList.remove(this.config.classNames.input, this.config.classNames.hiddenState);\n\t this.passedElement.removeAttribute('tabindex');\n\t // Recover original styles if any\n\t var origStyle = this.passedElement.getAttribute('data-choice-orig-style');\n\t if (Boolean(origStyle)) {\n\t this.passedElement.removeAttribute('data-choice-orig-style');\n\t this.passedElement.setAttribute('style', origStyle);\n\t } else {\n\t this.passedElement.removeAttribute('style');\n\t }\n\t this.passedElement.removeAttribute('aria-hidden');\n\t this.passedElement.removeAttribute('data-choice');\n\n\t // Re-assign values - this is weird, I know\n\t this.passedElement.value = this.passedElement.value;\n\n\t // Move passed element back to original position\n\t this.containerOuter.parentNode.insertBefore(this.passedElement, this.containerOuter);\n\t // Remove added elements\n\t this.containerOuter.parentNode.removeChild(this.containerOuter);\n\n\t // Clear data store\n\t this.clearStore();\n\n\t // Nullify instance-specific data\n\t this.config.templates = null;\n\n\t // Uninitialise\n\t this.initialised = false;\n\t }\n\n\t /**\n\t * Render group choices into a DOM fragment and append to choice list\n\t * @param {Array} groups Groups to add to list\n\t * @param {Array} choices Choices to add to groups\n\t * @param {DocumentFragment} fragment Fragment to add groups and options to (optional)\n\t * @return {DocumentFragment} Populated options fragment\n\t * @private\n\t */\n\n\t }, {\n\t key: 'renderGroups',\n\t value: function renderGroups(groups, choices, fragment) {\n\t var _this = this;\n\n\t var groupFragment = fragment || document.createDocumentFragment();\n\t var filter = this.config.sortFilter;\n\n\t // If sorting is enabled, filter groups\n\t if (this.config.shouldSort) {\n\t groups.sort(filter);\n\t }\n\n\t groups.forEach(function (group) {\n\t // Grab options that are children of this group\n\t var groupChoices = choices.filter(function (choice) {\n\t if (_this.isSelectOneElement) {\n\t return choice.groupId === group.id;\n\t }\n\t return choice.groupId === group.id && !choice.selected;\n\t });\n\n\t if (groupChoices.length >= 1) {\n\t var dropdownGroup = _this._getTemplate('choiceGroup', group);\n\t groupFragment.appendChild(dropdownGroup);\n\t _this.renderChoices(groupChoices, groupFragment, true);\n\t }\n\t });\n\n\t return groupFragment;\n\t }\n\n\t /**\n\t * Render choices into a DOM fragment and append to choice list\n\t * @param {Array} choices Choices to add to list\n\t * @param {DocumentFragment} fragment Fragment to add choices to (optional)\n\t * @return {DocumentFragment} Populated choices fragment\n\t * @private\n\t */\n\n\t }, {\n\t key: 'renderChoices',\n\t value: function renderChoices(choices, fragment) {\n\t var _this2 = this;\n\n\t var withinGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t // Create a fragment to store our list items (so we don't have to update the DOM for each item)\n\t var choicesFragment = fragment || document.createDocumentFragment();\n\t var _config = this.config,\n\t renderSelectedChoices = _config.renderSelectedChoices,\n\t searchResultLimit = _config.searchResultLimit,\n\t renderChoiceLimit = _config.renderChoiceLimit;\n\n\t var filter = this.isSearching ? _utils.sortByScore : this.config.sortFilter;\n\t var appendChoice = function appendChoice(choice) {\n\t var shouldRender = renderSelectedChoices === 'auto' ? _this2.isSelectOneElement || !choice.selected : true;\n\t if (shouldRender) {\n\t var dropdownItem = _this2._getTemplate('choice', choice);\n\t choicesFragment.appendChild(dropdownItem);\n\t }\n\t };\n\n\t var rendererableChoices = choices;\n\n\t if (renderSelectedChoices === 'auto' && !this.isSelectOneElement) {\n\t rendererableChoices = choices.filter(function (choice) {\n\t return !choice.selected;\n\t });\n\t }\n\n\t // Split array into placeholders and \"normal\" choices\n\n\t var _rendererableChoices$ = rendererableChoices.reduce(function (acc, choice) {\n\t if (choice.placeholder) {\n\t acc.placeholderChoices.push(choice);\n\t } else {\n\t acc.normalChoices.push(choice);\n\t }\n\t return acc;\n\t }, { placeholderChoices: [], normalChoices: [] }),\n\t placeholderChoices = _rendererableChoices$.placeholderChoices,\n\t normalChoices = _rendererableChoices$.normalChoices;\n\n\t // If sorting is enabled or the user is searching, filter choices\n\n\n\t if (this.config.shouldSort || this.isSearching) {\n\t normalChoices.sort(filter);\n\t }\n\n\t var choiceLimit = rendererableChoices.length;\n\n\t // Prepend placeholeder\n\t var sortedChoices = [].concat(_toConsumableArray(placeholderChoices), _toConsumableArray(normalChoices));\n\n\t if (this.isSearching) {\n\t choiceLimit = searchResultLimit;\n\t } else if (renderChoiceLimit > 0 && !withinGroup) {\n\t choiceLimit = renderChoiceLimit;\n\t }\n\n\t // Add each choice to dropdown within range\n\t for (var i = 0; i < choiceLimit; i++) {\n\t if (sortedChoices[i]) {\n\t appendChoice(sortedChoices[i]);\n\t }\n\t };\n\n\t return choicesFragment;\n\t }\n\n\t /**\n\t * Render items into a DOM fragment and append to items list\n\t * @param {Array} items Items to add to list\n\t * @param {DocumentFragment} [fragment] Fragment to add items to (optional)\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: 'renderItems',\n\t value: function renderItems(items) {\n\t var _this3 = this;\n\n\t var fragment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t // Create fragment to add elements to\n\t var itemListFragment = fragment || document.createDocumentFragment();\n\n\t // If sorting is enabled, filter items\n\t if (this.config.shouldSortItems && !this.isSelectOneElement) {\n\t items.sort(this.config.sortFilter);\n\t }\n\n\t if (this.isTextElement) {\n\t // Simplify store data to just values\n\t var itemsFiltered = this.store.getItemsReducedToValues(items);\n\t var itemsFilteredString = itemsFiltered.join(this.config.delimiter);\n\t // Update the value of the hidden input\n\t this.passedElement.setAttribute('value', itemsFilteredString);\n\t this.passedElement.value = itemsFilteredString;\n\t } else {\n\t var selectedOptionsFragment = document.createDocumentFragment();\n\n\t // Add each list item to list\n\t items.forEach(function (item) {\n\t // Create a standard select option\n\t var option = _this3._getTemplate('option', item);\n\t // Append it to fragment\n\t selectedOptionsFragment.appendChild(option);\n\t });\n\n\t // Update selected choices\n\t this.passedElement.innerHTML = '';\n\t this.passedElement.appendChild(selectedOptionsFragment);\n\t }\n\n\t // Add each list item to list\n\t items.forEach(function (item) {\n\t // Create new list element\n\t var listItem = _this3._getTemplate('item', item);\n\t // Append it to list\n\t itemListFragment.appendChild(listItem);\n\t });\n\n\t return itemListFragment;\n\t }\n\n\t /**\n\t * Render DOM with values\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: 'render',\n\t value: function render() {\n\t if (this.store.isLoading()) {\n\t return;\n\t }\n\n\t this.currentState = this.store.getState();\n\n\t // Only render if our state has actually changed\n\t if (this.currentState !== this.prevState) {\n\t // Choices\n\t if (this.currentState.choices !== this.prevState.choices || this.currentState.groups !== this.prevState.groups || this.currentState.items !== this.prevState.items) {\n\t if (this.isSelectElement) {\n\t // Get active groups/choices\n\t var activeGroups = this.store.getGroupsFilteredByActive();\n\t var activeChoices = this.store.getChoicesFilteredByActive();\n\n\t var choiceListFragment = document.createDocumentFragment();\n\n\t // Clear choices\n\t this.choiceList.innerHTML = '';\n\n\t // Scroll back to top of choices list\n\t if (this.config.resetScrollPosition) {\n\t this.choiceList.scrollTop = 0;\n\t }\n\n\t // If we have grouped options\n\t if (activeGroups.length >= 1 && this.isSearching !== true) {\n\t choiceListFragment = this.renderGroups(activeGroups, activeChoices, choiceListFragment);\n\t } else if (activeChoices.length >= 1) {\n\t choiceListFragment = this.renderChoices(activeChoices, choiceListFragment);\n\t }\n\n\t var activeItems = this.store.getItemsFilteredByActive();\n\t var canAddItem = this._canAddItem(activeItems, this.input.value);\n\n\t // If we have choices to show\n\t if (choiceListFragment.childNodes && choiceListFragment.childNodes.length > 0) {\n\t // ...and we can select them\n\t if (canAddItem.response) {\n\t // ...append them and highlight the first choice\n\t this.choiceList.appendChild(choiceListFragment);\n\t this._highlightChoice();\n\t } else {\n\t // ...otherwise show a notice\n\t this.choiceList.appendChild(this._getTemplate('notice', canAddItem.notice));\n\t }\n\t } else {\n\t // Otherwise show a notice\n\t var dropdownItem = void 0;\n\t var notice = void 0;\n\n\t if (this.isSearching) {\n\t notice = (0, _utils.isType)('Function', this.config.noResultsText) ? this.config.noResultsText() : this.config.noResultsText;\n\n\t dropdownItem = this._getTemplate('notice', notice, 'no-results');\n\t } else {\n\t notice = (0, _utils.isType)('Function', this.config.noChoicesText) ? this.config.noChoicesText() : this.config.noChoicesText;\n\n\t dropdownItem = this._getTemplate('notice', notice, 'no-choices');\n\t }\n\n\t this.choiceList.appendChild(dropdownItem);\n\t }\n\t }\n\t }\n\n\t // Items\n\t if (this.currentState.items !== this.prevState.items) {\n\t // Get active items (items that can be selected)\n\t var _activeItems = this.store.getItemsFilteredByActive();\n\n\t // Clear list\n\t this.itemList.innerHTML = '';\n\n\t if (_activeItems && _activeItems) {\n\t // Create a fragment to store our list items\n\t // (so we don't have to update the DOM for each item)\n\t var itemListFragment = this.renderItems(_activeItems);\n\n\t // If we have items to add\n\t if (itemListFragment.childNodes) {\n\t // Update list\n\t this.itemList.appendChild(itemListFragment);\n\t }\n\t }\n\t }\n\n\t this.prevState = this.currentState;\n\t }\n\t }\n\n\t /**\n\t * Select item (a selected item can be deleted)\n\t * @param {Element} item Element to select\n\t * @param {Boolean} [runEvent=true] Whether to trigger 'highlightItem' event\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'highlightItem',\n\t value: function highlightItem(item) {\n\t var runEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t if (!item) {\n\t return this;\n\t }\n\n\t var id = item.id;\n\t var groupId = item.groupId;\n\t var group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t this.store.dispatch((0, _index3.highlightItem)(id, true));\n\n\t if (runEvent) {\n\t if (group && group.value) {\n\t (0, _utils.triggerEvent)(this.passedElement, 'highlightItem', {\n\t id: id,\n\t value: item.value,\n\t label: item.label,\n\t groupValue: group.value\n\t });\n\t } else {\n\t (0, _utils.triggerEvent)(this.passedElement, 'highlightItem', {\n\t id: id,\n\t value: item.value,\n\t label: item.label\n\t });\n\t }\n\t }\n\n\t return this;\n\t }\n\n\t /**\n\t * Deselect item\n\t * @param {Element} item Element to de-select\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'unhighlightItem',\n\t value: function unhighlightItem(item) {\n\t if (!item) {\n\t return this;\n\t }\n\n\t var id = item.id;\n\t var groupId = item.groupId;\n\t var group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t this.store.dispatch((0, _index3.highlightItem)(id, false));\n\n\t if (group && group.value) {\n\t (0, _utils.triggerEvent)(this.passedElement, 'unhighlightItem', {\n\t id: id,\n\t value: item.value,\n\t label: item.label,\n\t groupValue: group.value\n\t });\n\t } else {\n\t (0, _utils.triggerEvent)(this.passedElement, 'unhighlightItem', {\n\t id: id,\n\t value: item.value,\n\t label: item.label\n\t });\n\t }\n\n\t return this;\n\t }\n\n\t /**\n\t * Highlight items within store\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'highlightAll',\n\t value: function highlightAll() {\n\t var _this4 = this;\n\n\t var items = this.store.getItems();\n\t items.forEach(function (item) {\n\t _this4.highlightItem(item);\n\t });\n\n\t return this;\n\t }\n\n\t /**\n\t * Deselect items within store\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'unhighlightAll',\n\t value: function unhighlightAll() {\n\t var _this5 = this;\n\n\t var items = this.store.getItems();\n\t items.forEach(function (item) {\n\t _this5.unhighlightItem(item);\n\t });\n\n\t return this;\n\t }\n\n\t /**\n\t * Remove an item from the store by its value\n\t * @param {String} value Value to search for\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'removeItemsByValue',\n\t value: function removeItemsByValue(value) {\n\t var _this6 = this;\n\n\t if (!value || !(0, _utils.isType)('String', value)) {\n\t return this;\n\t }\n\n\t var items = this.store.getItemsFilteredByActive();\n\n\t items.forEach(function (item) {\n\t if (item.value === value) {\n\t _this6._removeItem(item);\n\t }\n\t });\n\n\t return this;\n\t }\n\n\t /**\n\t * Remove all items from store array\n\t * @note Removed items are soft deleted\n\t * @param {Number} excludedId Optionally exclude item by ID\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'removeActiveItems',\n\t value: function removeActiveItems(excludedId) {\n\t var _this7 = this;\n\n\t var items = this.store.getItemsFilteredByActive();\n\n\t items.forEach(function (item) {\n\t if (item.active && excludedId !== item.id) {\n\t _this7._removeItem(item);\n\t }\n\t });\n\n\t return this;\n\t }\n\n\t /**\n\t * Remove all selected items from store\n\t * @note Removed items are soft deleted\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'removeHighlightedItems',\n\t value: function removeHighlightedItems() {\n\t var _this8 = this;\n\n\t var runEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t var items = this.store.getItemsFilteredByActive();\n\n\t items.forEach(function (item) {\n\t if (item.highlighted && item.active) {\n\t _this8._removeItem(item);\n\t // If this action was performed by the user\n\t // trigger the event\n\t if (runEvent) {\n\t _this8._triggerChange(item.value);\n\t }\n\t }\n\t });\n\n\t return this;\n\t }\n\n\t /**\n\t * Show dropdown to user by adding active state class\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'showDropdown',\n\t value: function showDropdown() {\n\t var focusInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t var body = document.body;\n\t var html = document.documentElement;\n\t var winHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n\n\t this.containerOuter.classList.add(this.config.classNames.openState);\n\t this.containerOuter.setAttribute('aria-expanded', 'true');\n\t this.dropdown.classList.add(this.config.classNames.activeState);\n\t this.dropdown.setAttribute('aria-expanded', 'true');\n\n\t var dimensions = this.dropdown.getBoundingClientRect();\n\t var dropdownPos = Math.ceil(dimensions.top + window.scrollY + this.dropdown.offsetHeight);\n\n\t // If flip is enabled and the dropdown bottom position is greater than the window height flip the dropdown.\n\t var shouldFlip = false;\n\t if (this.config.position === 'auto') {\n\t shouldFlip = dropdownPos >= winHeight;\n\t } else if (this.config.position === 'top') {\n\t shouldFlip = true;\n\t }\n\n\t if (shouldFlip) {\n\t this.containerOuter.classList.add(this.config.classNames.flippedState);\n\t }\n\n\t // Optionally focus the input if we have a search input\n\t if (focusInput && this.canSearch && document.activeElement !== this.input) {\n\t this.input.focus();\n\t }\n\n\t (0, _utils.triggerEvent)(this.passedElement, 'showDropdown', {});\n\n\t return this;\n\t }\n\n\t /**\n\t * Hide dropdown from user\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'hideDropdown',\n\t value: function hideDropdown() {\n\t var blurInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t // A dropdown flips if it does not have space within the page\n\t var isFlipped = this.containerOuter.classList.contains(this.config.classNames.flippedState);\n\n\t this.containerOuter.classList.remove(this.config.classNames.openState);\n\t this.containerOuter.setAttribute('aria-expanded', 'false');\n\t this.dropdown.classList.remove(this.config.classNames.activeState);\n\t this.dropdown.setAttribute('aria-expanded', 'false');\n\n\t if (isFlipped) {\n\t this.containerOuter.classList.remove(this.config.classNames.flippedState);\n\t }\n\n\t // Optionally blur the input if we have a search input\n\t if (blurInput && this.canSearch && document.activeElement === this.input) {\n\t this.input.blur();\n\t }\n\n\t (0, _utils.triggerEvent)(this.passedElement, 'hideDropdown', {});\n\n\t return this;\n\t }\n\n\t /**\n\t * Determine whether to hide or show dropdown based on its current state\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'toggleDropdown',\n\t value: function toggleDropdown() {\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t if (hasActiveDropdown) {\n\t this.hideDropdown();\n\t } else {\n\t this.showDropdown(true);\n\t }\n\n\t return this;\n\t }\n\n\t /**\n\t * Get value(s) of input (i.e. inputted items (text) or selected choices (select))\n\t * @param {Boolean} valueOnly Get only values of selected items, otherwise return selected items\n\t * @return {Array/String} selected value (select-one) or array of selected items (inputs & select-multiple)\n\t * @public\n\t */\n\n\t }, {\n\t key: 'getValue',\n\t value: function getValue() {\n\t var _this9 = this;\n\n\t var valueOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t var items = this.store.getItemsFilteredByActive();\n\t var selectedItems = [];\n\n\t items.forEach(function (item) {\n\t if (_this9.isTextElement) {\n\t selectedItems.push(valueOnly ? item.value : item);\n\t } else if (item.active) {\n\t selectedItems.push(valueOnly ? item.value : item);\n\t }\n\t });\n\n\t if (this.isSelectOneElement) {\n\t return selectedItems[0];\n\t }\n\n\t return selectedItems;\n\t }\n\n\t /**\n\t * Set value of input. If the input is a select box, a choice will be created and selected otherwise\n\t * an item will created directly.\n\t * @param {Array} args Array of value objects or value strings\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'setValue',\n\t value: function setValue(args) {\n\t var _this10 = this;\n\n\t if (this.initialised === true) {\n\t // Convert args to an iterable array\n\t var values = [].concat(_toConsumableArray(args)),\n\t handleValue = function handleValue(item) {\n\t var itemType = (0, _utils.getType)(item);\n\t if (itemType === 'Object') {\n\t if (!item.value) {\n\t return;\n\t }\n\n\t // If we are dealing with a select input, we need to create an option first\n\t // that is then selected. For text inputs we can just add items normally.\n\t if (!_this10.isTextElement) {\n\t _this10._addChoice(item.value, item.label, true, false, -1, item.customProperties, item.placeholder);\n\t } else {\n\t _this10._addItem(item.value, item.label, item.id, undefined, item.customProperties, item.placeholder);\n\t }\n\t } else if (itemType === 'String') {\n\t if (!_this10.isTextElement) {\n\t _this10._addChoice(item, item, true, false, -1, null);\n\t } else {\n\t _this10._addItem(item);\n\t }\n\t }\n\t };\n\n\t if (values.length > 1) {\n\t values.forEach(function (value) {\n\t handleValue(value);\n\t });\n\t } else {\n\t handleValue(values[0]);\n\t }\n\t }\n\t return this;\n\t }\n\n\t /**\n\t * Select value of select box via the value of an existing choice\n\t * @param {Array/String} value An array of strings of a single string\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'setValueByChoice',\n\t value: function setValueByChoice(value) {\n\t var _this11 = this;\n\n\t if (!this.isTextElement) {\n\t var choices = this.store.getChoices();\n\t // If only one value has been passed, convert to array\n\t var choiceValue = (0, _utils.isType)('Array', value) ? value : [value];\n\n\t // Loop through each value and\n\t choiceValue.forEach(function (val) {\n\t var foundChoice = choices.find(function (choice) {\n\t // Check 'value' property exists and the choice isn't already selected\n\t return choice.value === val;\n\t });\n\n\t if (foundChoice) {\n\t if (!foundChoice.selected) {\n\t _this11._addItem(foundChoice.value, foundChoice.label, foundChoice.id, foundChoice.groupId, foundChoice.customProperties, foundChoice.placeholder, foundChoice.keyCode);\n\t } else if (!_this11.config.silent) {\n\t console.warn('Attempting to select choice already selected');\n\t }\n\t } else if (!_this11.config.silent) {\n\t console.warn('Attempting to select choice that does not exist');\n\t }\n\t });\n\t }\n\t return this;\n\t }\n\n\t /**\n\t * Direct populate choices\n\t * @param {Array} choices - Choices to insert\n\t * @param {String} value - Name of 'value' property\n\t * @param {String} label - Name of 'label' property\n\t * @param {Boolean} replaceChoices Whether existing choices should be removed\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'setChoices',\n\t value: function setChoices(choices, value, label) {\n\t var _this12 = this;\n\n\t var replaceChoices = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n\t if (this.initialised === true) {\n\t if (this.isSelectElement) {\n\t if (!(0, _utils.isType)('Array', choices) || !value) {\n\t return this;\n\t }\n\n\t // Clear choices if needed\n\t if (replaceChoices) {\n\t this._clearChoices();\n\t }\n\n\t this._setLoading(true);\n\n\t // Add choices if passed\n\t if (choices && choices.length) {\n\t this.containerOuter.classList.remove(this.config.classNames.loadingState);\n\t choices.forEach(function (result) {\n\t if (result.choices) {\n\t _this12._addGroup(result, result.id || null, value, label);\n\t } else {\n\t _this12._addChoice(result[value], result[label], result.selected, result.disabled, undefined, result.customProperties, result.placeholder);\n\t }\n\t });\n\t }\n\n\t this._setLoading(false);\n\t }\n\t }\n\t return this;\n\t }\n\n\t /**\n\t * Clear items,choices and groups\n\t * @note Hard delete\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'clearStore',\n\t value: function clearStore() {\n\t this.store.dispatch((0, _index3.clearAll)());\n\t return this;\n\t }\n\n\t /**\n\t * Set value of input to blank\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'clearInput',\n\t value: function clearInput() {\n\t if (this.input.value) {\n\t this.input.value = '';\n\t }\n\t if (!this.isSelectOneElement) {\n\t this._setInputWidth();\n\t }\n\t if (!this.isTextElement && this.config.searchEnabled) {\n\t this.isSearching = false;\n\t this.store.dispatch((0, _index3.activateChoices)(true));\n\t }\n\t return this;\n\t }\n\n\t /**\n\t * Enable interaction with Choices\n\t * @return {Object} Class instance\n\t */\n\n\t }, {\n\t key: 'enable',\n\t value: function enable() {\n\t if (this.initialised) {\n\t this.passedElement.disabled = false;\n\t var isDisabled = this.containerOuter.classList.contains(this.config.classNames.disabledState);\n\t if (isDisabled) {\n\t this._addEventListeners();\n\t this.passedElement.removeAttribute('disabled');\n\t this.input.removeAttribute('disabled');\n\t this.containerOuter.classList.remove(this.config.classNames.disabledState);\n\t this.containerOuter.removeAttribute('aria-disabled');\n\t if (this.isSelectOneElement) {\n\t this.containerOuter.setAttribute('tabindex', '0');\n\t }\n\t }\n\t }\n\t return this;\n\t }\n\n\t /**\n\t * Disable interaction with Choices\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'disable',\n\t value: function disable() {\n\t if (this.initialised) {\n\t this.passedElement.disabled = true;\n\t var isEnabled = !this.containerOuter.classList.contains(this.config.classNames.disabledState);\n\t if (isEnabled) {\n\t this._removeEventListeners();\n\t this.passedElement.setAttribute('disabled', '');\n\t this.input.setAttribute('disabled', '');\n\t this.containerOuter.classList.add(this.config.classNames.disabledState);\n\t this.containerOuter.setAttribute('aria-disabled', 'true');\n\t if (this.isSelectOneElement) {\n\t this.containerOuter.setAttribute('tabindex', '-1');\n\t }\n\t }\n\t }\n\t return this;\n\t }\n\n\t /**\n\t * Populate options via ajax callback\n\t * @param {Function} fn Function that actually makes an AJAX request\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: 'ajax',\n\t value: function ajax(fn) {\n\t var _this13 = this;\n\n\t if (this.initialised === true) {\n\t if (this.isSelectElement) {\n\t // Show loading text\n\t requestAnimationFrame(function () {\n\t _this13._handleLoadingState(true);\n\t });\n\t // Run callback\n\t fn(this._ajaxCallback());\n\t }\n\t }\n\t return this;\n\t }\n\n\t /*===== End of Public functions ======*/\n\n\t /*=============================================\n\t = Private functions =\n\t =============================================*/\n\n\t /**\n\t * Call change callback\n\t * @param {String} value - last added/deleted/selected value\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_triggerChange',\n\t value: function _triggerChange(value) {\n\t if (!value) {\n\t return;\n\t }\n\n\t (0, _utils.triggerEvent)(this.passedElement, 'change', {\n\t value: value\n\t });\n\t }\n\n\t /**\n\t * Process enter/click of an item button\n\t * @param {Array} activeItems The currently active items\n\t * @param {Element} element Button being interacted with\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_handleButtonAction',\n\t value: function _handleButtonAction(activeItems, element) {\n\t if (!activeItems || !element) {\n\t return;\n\t }\n\n\t // If we are clicking on a button\n\t if (this.config.removeItems && this.config.removeItemButton) {\n\t var itemId = element.parentNode.getAttribute('data-id');\n\t var itemToRemove = activeItems.find(function (item) {\n\t return item.id === parseInt(itemId, 10);\n\t });\n\n\t // Remove item associated with button\n\t this._removeItem(itemToRemove);\n\t this._triggerChange(itemToRemove.value);\n\n\t if (this.isSelectOneElement) {\n\t this._selectPlaceholderChoice();\n\t }\n\t }\n\t }\n\n\t /**\n\t * Select placeholder choice\n\t */\n\n\t }, {\n\t key: '_selectPlaceholderChoice',\n\t value: function _selectPlaceholderChoice() {\n\t var placeholderChoice = this.store.getPlaceholderChoice();\n\n\t if (placeholderChoice) {\n\t this._addItem(placeholderChoice.value, placeholderChoice.label, placeholderChoice.id, placeholderChoice.groupId, null, placeholderChoice.placeholder);\n\t this._triggerChange(placeholderChoice.value);\n\t }\n\t }\n\n\t /**\n\t * Process click of an item\n\t * @param {Array} activeItems The currently active items\n\t * @param {Element} element Item being interacted with\n\t * @param {Boolean} hasShiftKey Whether the user has the shift key active\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_handleItemAction',\n\t value: function _handleItemAction(activeItems, element) {\n\t var _this14 = this;\n\n\t var hasShiftKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t if (!activeItems || !element) {\n\t return;\n\t }\n\n\t // If we are clicking on an item\n\t if (this.config.removeItems && !this.isSelectOneElement) {\n\t var passedId = element.getAttribute('data-id');\n\n\t // We only want to select one item with a click\n\t // so we deselect any items that aren't the target\n\t // unless shift is being pressed\n\t activeItems.forEach(function (item) {\n\t if (item.id === parseInt(passedId, 10) && !item.highlighted) {\n\t _this14.highlightItem(item);\n\t } else if (!hasShiftKey) {\n\t if (item.highlighted) {\n\t _this14.unhighlightItem(item);\n\t }\n\t }\n\t });\n\n\t // Focus input as without focus, a user cannot do anything with a\n\t // highlighted item\n\t if (document.activeElement !== this.input) {\n\t this.input.focus();\n\t }\n\t }\n\t }\n\n\t /**\n\t * Process click of a choice\n\t * @param {Array} activeItems The currently active items\n\t * @param {Element} element Choice being interacted with\n\t * @return\n\t */\n\n\t }, {\n\t key: '_handleChoiceAction',\n\t value: function _handleChoiceAction(activeItems, element) {\n\t if (!activeItems || !element) {\n\t return;\n\t }\n\n\t // If we are clicking on an option\n\t var id = element.getAttribute('data-id');\n\t var choice = this.store.getChoiceById(id);\n\t var passedKeyCode = activeItems[0] && activeItems[0].keyCode ? activeItems[0].keyCode : null;\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\n\t // Update choice keyCode\n\t choice.keyCode = passedKeyCode;\n\n\t (0, _utils.triggerEvent)(this.passedElement, 'choice', {\n\t choice: choice\n\t });\n\n\t if (choice && !choice.selected && !choice.disabled) {\n\t var canAddItem = this._canAddItem(activeItems, choice.value);\n\n\t if (canAddItem.response) {\n\t this._addItem(choice.value, choice.label, choice.id, choice.groupId, choice.customProperties, choice.placeholder, choice.keyCode);\n\t this._triggerChange(choice.value);\n\t }\n\t }\n\n\t this.clearInput();\n\n\t // We wont to close the dropdown if we are dealing with a single select box\n\t if (hasActiveDropdown && this.isSelectOneElement) {\n\t this.hideDropdown();\n\t this.containerOuter.focus();\n\t }\n\t }\n\n\t /**\n\t * Process back space event\n\t * @param {Array} activeItems items\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_handleBackspace',\n\t value: function _handleBackspace(activeItems) {\n\t if (this.config.removeItems && activeItems) {\n\t var lastItem = activeItems[activeItems.length - 1];\n\t var hasHighlightedItems = activeItems.some(function (item) {\n\t return item.highlighted;\n\t });\n\n\t // If editing the last item is allowed and there are not other selected items,\n\t // we can edit the item value. Otherwise if we can remove items, remove all selected items\n\t if (this.config.editItems && !hasHighlightedItems && lastItem) {\n\t this.input.value = lastItem.value;\n\t this._setInputWidth();\n\t this._removeItem(lastItem);\n\t this._triggerChange(lastItem.value);\n\t } else {\n\t if (!hasHighlightedItems) {\n\t this.highlightItem(lastItem, false);\n\t }\n\t this.removeHighlightedItems(true);\n\t }\n\t }\n\t }\n\n\t /**\n\t * Validates whether an item can be added by a user\n\t * @param {Array} activeItems The currently active items\n\t * @param {String} value Value of item to add\n\t * @return {Object} Response: Whether user can add item\n\t * Notice: Notice show in dropdown\n\t */\n\n\t }, {\n\t key: '_canAddItem',\n\t value: function _canAddItem(activeItems, value) {\n\t var canAddItem = true;\n\t var notice = (0, _utils.isType)('Function', this.config.addItemText) ? this.config.addItemText(value) : this.config.addItemText;\n\n\t if (this.isSelectMultipleElement || this.isTextElement) {\n\t if (this.config.maxItemCount > 0 && this.config.maxItemCount <= activeItems.length) {\n\t // If there is a max entry limit and we have reached that limit\n\t // don't update\n\t canAddItem = false;\n\t notice = (0, _utils.isType)('Function', this.config.maxItemText) ? this.config.maxItemText(this.config.maxItemCount) : this.config.maxItemText;\n\t }\n\t }\n\n\t if (this.isTextElement && this.config.addItems && canAddItem) {\n\t // If a user has supplied a regular expression filter\n\t if (this.config.regexFilter) {\n\t // Determine whether we can update based on whether\n\t // our regular expression passes\n\t canAddItem = this._regexFilter(value);\n\t }\n\t }\n\n\t // If no duplicates are allowed, and the value already exists\n\t // in the array\n\t var isUnique = !activeItems.some(function (item) {\n\t if ((0, _utils.isType)('String', value)) {\n\t return item.value === value.trim();\n\t }\n\n\t return item.value === value;\n\t });\n\n\t if (!isUnique && !this.config.duplicateItems && !this.isSelectOneElement && canAddItem) {\n\t canAddItem = false;\n\t notice = (0, _utils.isType)('Function', this.config.uniqueItemText) ? this.config.uniqueItemText(value) : this.config.uniqueItemText;\n\t }\n\n\t return {\n\t response: canAddItem,\n\t notice: notice\n\t };\n\t }\n\n\t /**\n\t * Apply or remove a loading state to the component.\n\t * @param {Boolean} setLoading default value set to 'true'.\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_handleLoadingState',\n\t value: function _handleLoadingState() {\n\t var setLoading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t var placeholderItem = this.itemList.querySelector('.' + this.config.classNames.placeholder);\n\t if (setLoading) {\n\t this.containerOuter.classList.add(this.config.classNames.loadingState);\n\t this.containerOuter.setAttribute('aria-busy', 'true');\n\t if (this.isSelectOneElement) {\n\t if (!placeholderItem) {\n\t placeholderItem = this._getTemplate('placeholder', this.config.loadingText);\n\t this.itemList.appendChild(placeholderItem);\n\t } else {\n\t placeholderItem.innerHTML = this.config.loadingText;\n\t }\n\t } else {\n\t this.input.placeholder = this.config.loadingText;\n\t }\n\t } else {\n\t // Remove loading states/text\n\t this.containerOuter.classList.remove(this.config.classNames.loadingState);\n\n\t if (this.isSelectOneElement) {\n\t placeholderItem.innerHTML = this.placeholder || '';\n\t } else {\n\t this.input.placeholder = this.placeholder || '';\n\t }\n\t }\n\t }\n\n\t /**\n\t * Retrieve the callback used to populate component's choices in an async way.\n\t * @returns {Function} The callback as a function.\n\t * @private\n\t */\n\n\t }, {\n\t key: '_ajaxCallback',\n\t value: function _ajaxCallback() {\n\t var _this15 = this;\n\n\t return function (results, value, label) {\n\t if (!results || !value) {\n\t return;\n\t }\n\n\t var parsedResults = (0, _utils.isType)('Object', results) ? [results] : results;\n\n\t if (parsedResults && (0, _utils.isType)('Array', parsedResults) && parsedResults.length) {\n\t // Remove loading states/text\n\t _this15._handleLoadingState(false);\n\t // Add each result as a choice\n\n\t _this15._setLoading(true);\n\n\t parsedResults.forEach(function (result) {\n\t if (result.choices) {\n\t var groupId = result.id || null;\n\t _this15._addGroup(result, groupId, value, label);\n\t } else {\n\t _this15._addChoice(result[value], result[label], result.selected, result.disabled, undefined, result.customProperties, result.placeholder);\n\t }\n\t });\n\n\t _this15._setLoading(false);\n\n\t if (_this15.isSelectOneElement) {\n\t _this15._selectPlaceholderChoice();\n\t }\n\t } else {\n\t // No results, remove loading state\n\t _this15._handleLoadingState(false);\n\t }\n\n\t _this15.containerOuter.removeAttribute('aria-busy');\n\t };\n\t }\n\n\t /**\n\t * Filter choices based on search value\n\t * @param {String} value Value to filter by\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_searchChoices',\n\t value: function _searchChoices(value) {\n\t var newValue = (0, _utils.isType)('String', value) ? value.trim() : value;\n\t var currentValue = (0, _utils.isType)('String', this.currentValue) ? this.currentValue.trim() : this.currentValue;\n\n\t // If new value matches the desired length and is not the same as the current value with a space\n\t if (newValue.length >= 1 && newValue !== currentValue + ' ') {\n\t var haystack = this.store.getSearchableChoices();\n\t var needle = newValue;\n\t var keys = (0, _utils.isType)('Array', this.config.searchFields) ? this.config.searchFields : [this.config.searchFields];\n\t var options = Object.assign(this.config.fuseOptions, { keys: keys });\n\t var fuse = new _fuse2.default(haystack, options);\n\t var results = fuse.search(needle);\n\n\t this.currentValue = newValue;\n\t this.highlightPosition = 0;\n\t this.isSearching = true;\n\t this.store.dispatch((0, _index3.filterChoices)(results));\n\n\t return results.length;\n\t }\n\n\t return 0;\n\t }\n\n\t /**\n\t * Determine the action when a user is searching\n\t * @param {String} value Value entered by user\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_handleSearch',\n\t value: function _handleSearch(value) {\n\t if (!value) {\n\t return;\n\t }\n\n\t var choices = this.store.getChoices();\n\t var hasUnactiveChoices = choices.some(function (option) {\n\t return !option.active;\n\t });\n\n\t // Run callback if it is a function\n\t if (this.input === document.activeElement) {\n\t // Check that we have a value to search and the input was an alphanumeric character\n\t if (value && value.length >= this.config.searchFloor) {\n\t var resultCount = 0;\n\t // Check flag to filter search input\n\t if (this.config.searchChoices) {\n\t // Filter available choices\n\t resultCount = this._searchChoices(value);\n\t }\n\t // Trigger search event\n\t (0, _utils.triggerEvent)(this.passedElement, 'search', {\n\t value: value,\n\t resultCount: resultCount\n\t });\n\t } else if (hasUnactiveChoices) {\n\t // Otherwise reset choices to active\n\t this.isSearching = false;\n\t this.store.dispatch((0, _index3.activateChoices)(true));\n\t }\n\t }\n\t }\n\n\t /**\n\t * Trigger event listeners\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_addEventListeners',\n\t value: function _addEventListeners() {\n\t document.addEventListener('keyup', this._onKeyUp);\n\t document.addEventListener('keydown', this._onKeyDown);\n\t document.addEventListener('click', this._onClick);\n\t document.addEventListener('touchmove', this._onTouchMove);\n\t document.addEventListener('touchend', this._onTouchEnd);\n\t document.addEventListener('mousedown', this._onMouseDown);\n\t document.addEventListener('mouseover', this._onMouseOver);\n\n\t if (this.isSelectOneElement) {\n\t this.containerOuter.addEventListener('focus', this._onFocus);\n\t this.containerOuter.addEventListener('blur', this._onBlur);\n\t }\n\n\t this.input.addEventListener('input', this._onInput);\n\t this.input.addEventListener('paste', this._onPaste);\n\t this.input.addEventListener('focus', this._onFocus);\n\t this.input.addEventListener('blur', this._onBlur);\n\t }\n\n\t /**\n\t * Remove event listeners\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_removeEventListeners',\n\t value: function _removeEventListeners() {\n\t document.removeEventListener('keyup', this._onKeyUp);\n\t document.removeEventListener('keydown', this._onKeyDown);\n\t document.removeEventListener('click', this._onClick);\n\t document.removeEventListener('touchmove', this._onTouchMove);\n\t document.removeEventListener('touchend', this._onTouchEnd);\n\t document.removeEventListener('mousedown', this._onMouseDown);\n\t document.removeEventListener('mouseover', this._onMouseOver);\n\n\t if (this.isSelectOneElement) {\n\t this.containerOuter.removeEventListener('focus', this._onFocus);\n\t this.containerOuter.removeEventListener('blur', this._onBlur);\n\t }\n\n\t this.input.removeEventListener('input', this._onInput);\n\t this.input.removeEventListener('paste', this._onPaste);\n\t this.input.removeEventListener('focus', this._onFocus);\n\t this.input.removeEventListener('blur', this._onBlur);\n\t }\n\n\t /**\n\t * Set the correct input width based on placeholder\n\t * value or input value\n\t * @return\n\t */\n\n\t }, {\n\t key: '_setInputWidth',\n\t value: function _setInputWidth() {\n\t if (this.placeholder) {\n\t // If there is a placeholder, we only want to set the width of the input when it is a greater\n\t // length than 75% of the placeholder. This stops the input jumping around.\n\t if (this.input.value && this.input.value.length >= this.placeholder.length / 1.25) {\n\t this.input.style.width = (0, _utils.getWidthOfInput)(this.input);\n\t }\n\t } else {\n\t // If there is no placeholder, resize input to contents\n\t this.input.style.width = (0, _utils.getWidthOfInput)(this.input);\n\t }\n\t }\n\n\t /**\n\t * Key down event\n\t * @param {Object} e Event\n\t * @return\n\t */\n\n\t }, {\n\t key: '_onKeyDown',\n\t value: function _onKeyDown(e) {\n\t var _this16 = this,\n\t _keyDownActions;\n\n\t if (e.target !== this.input && !this.containerOuter.contains(e.target)) {\n\t return;\n\t }\n\n\t var target = e.target;\n\t var activeItems = this.store.getItemsFilteredByActive();\n\t var hasFocusedInput = this.input === document.activeElement;\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t var hasItems = this.itemList && this.itemList.children;\n\t var keyString = String.fromCharCode(e.keyCode);\n\n\t var backKey = 46;\n\t var deleteKey = 8;\n\t var enterKey = 13;\n\t var aKey = 65;\n\t var escapeKey = 27;\n\t var upKey = 38;\n\t var downKey = 40;\n\t var pageUpKey = 33;\n\t var pageDownKey = 34;\n\t var ctrlDownKey = e.ctrlKey || e.metaKey;\n\n\t // If a user is typing and the dropdown is not active\n\t if (!this.isTextElement && /[a-zA-Z0-9-_ ]/.test(keyString) && !hasActiveDropdown) {\n\t this.showDropdown(true);\n\t }\n\n\t this.canSearch = this.config.searchEnabled;\n\n\t var onAKey = function onAKey() {\n\t // If CTRL + A or CMD + A have been pressed and there are items to select\n\t if (ctrlDownKey && hasItems) {\n\t _this16.canSearch = false;\n\t if (_this16.config.removeItems && !_this16.input.value && _this16.input === document.activeElement) {\n\t // Highlight items\n\t _this16.highlightAll();\n\t }\n\t }\n\t };\n\n\t var onEnterKey = function onEnterKey() {\n\t // If enter key is pressed and the input has a value\n\t if (_this16.isTextElement && target.value) {\n\t var value = _this16.input.value;\n\t var canAddItem = _this16._canAddItem(activeItems, value);\n\n\t // All is good, add\n\t if (canAddItem.response) {\n\t if (hasActiveDropdown) {\n\t _this16.hideDropdown();\n\t }\n\t _this16._addItem(value);\n\t _this16._triggerChange(value);\n\t _this16.clearInput();\n\t }\n\t }\n\n\t if (target.hasAttribute('data-button')) {\n\t _this16._handleButtonAction(activeItems, target);\n\t e.preventDefault();\n\t }\n\n\t if (hasActiveDropdown) {\n\t e.preventDefault();\n\t var highlighted = _this16.dropdown.querySelector('.' + _this16.config.classNames.highlightedState);\n\n\t // If we have a highlighted choice\n\t if (highlighted) {\n\t // add enter keyCode value\n\t if (activeItems[0]) {\n\t activeItems[0].keyCode = enterKey;\n\t }\n\t _this16._handleChoiceAction(activeItems, highlighted);\n\t }\n\t } else if (_this16.isSelectOneElement) {\n\t // Open single select dropdown if it's not active\n\t if (!hasActiveDropdown) {\n\t _this16.showDropdown(true);\n\t e.preventDefault();\n\t }\n\t }\n\t };\n\n\t var onEscapeKey = function onEscapeKey() {\n\t if (hasActiveDropdown) {\n\t _this16.toggleDropdown();\n\t _this16.containerOuter.focus();\n\t }\n\t };\n\n\t var onDirectionKey = function onDirectionKey() {\n\t // If up or down key is pressed, traverse through options\n\t if (hasActiveDropdown || _this16.isSelectOneElement) {\n\t // Show dropdown if focus\n\t if (!hasActiveDropdown) {\n\t _this16.showDropdown(true);\n\t }\n\n\t _this16.canSearch = false;\n\n\t var directionInt = e.keyCode === downKey || e.keyCode === pageDownKey ? 1 : -1;\n\t var skipKey = e.metaKey || e.keyCode === pageDownKey || e.keyCode === pageUpKey;\n\n\t var nextEl = void 0;\n\t if (skipKey) {\n\t if (directionInt > 0) {\n\t nextEl = Array.from(_this16.dropdown.querySelectorAll('[data-choice-selectable]')).pop();\n\t } else {\n\t nextEl = _this16.dropdown.querySelector('[data-choice-selectable]');\n\t }\n\t } else {\n\t var currentEl = _this16.dropdown.querySelector('.' + _this16.config.classNames.highlightedState);\n\t if (currentEl) {\n\t nextEl = (0, _utils.getAdjacentEl)(currentEl, '[data-choice-selectable]', directionInt);\n\t } else {\n\t nextEl = _this16.dropdown.querySelector('[data-choice-selectable]');\n\t }\n\t }\n\n\t if (nextEl) {\n\t // We prevent default to stop the cursor moving\n\t // when pressing the arrow\n\t if (!(0, _utils.isScrolledIntoView)(nextEl, _this16.choiceList, directionInt)) {\n\t _this16._scrollToChoice(nextEl, directionInt);\n\t }\n\t _this16._highlightChoice(nextEl);\n\t }\n\n\t // Prevent default to maintain cursor position whilst\n\t // traversing dropdown options\n\t e.preventDefault();\n\t }\n\t };\n\n\t var onDeleteKey = function onDeleteKey() {\n\t // If backspace or delete key is pressed and the input has no value\n\t if (hasFocusedInput && !e.target.value && !_this16.isSelectOneElement) {\n\t _this16._handleBackspace(activeItems);\n\t e.preventDefault();\n\t }\n\t };\n\n\t // Map keys to key actions\n\t var keyDownActions = (_keyDownActions = {}, _defineProperty(_keyDownActions, aKey, onAKey), _defineProperty(_keyDownActions, enterKey, onEnterKey), _defineProperty(_keyDownActions, escapeKey, onEscapeKey), _defineProperty(_keyDownActions, upKey, onDirectionKey), _defineProperty(_keyDownActions, pageUpKey, onDirectionKey), _defineProperty(_keyDownActions, downKey, onDirectionKey), _defineProperty(_keyDownActions, pageDownKey, onDirectionKey), _defineProperty(_keyDownActions, deleteKey, onDeleteKey), _defineProperty(_keyDownActions, backKey, onDeleteKey), _keyDownActions);\n\n\t // If keycode has a function, run it\n\t if (keyDownActions[e.keyCode]) {\n\t keyDownActions[e.keyCode]();\n\t }\n\t }\n\n\t /**\n\t * Key up event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onKeyUp',\n\t value: function _onKeyUp(e) {\n\t if (e.target !== this.input) {\n\t return;\n\t }\n\n\t var value = this.input.value;\n\t var activeItems = this.store.getItemsFilteredByActive();\n\t var canAddItem = this._canAddItem(activeItems, value);\n\n\t // We are typing into a text input and have a value, we want to show a dropdown\n\t // notice. Otherwise hide the dropdown\n\t if (this.isTextElement) {\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t if (value) {\n\n\t if (canAddItem.notice) {\n\t var dropdownItem = this._getTemplate('notice', canAddItem.notice);\n\t this.dropdown.innerHTML = dropdownItem.outerHTML;\n\t }\n\n\t if (canAddItem.response === true) {\n\t if (!hasActiveDropdown) {\n\t this.showDropdown();\n\t }\n\t } else if (!canAddItem.notice && hasActiveDropdown) {\n\t this.hideDropdown();\n\t }\n\t } else if (hasActiveDropdown) {\n\t this.hideDropdown();\n\t }\n\t } else {\n\t var backKey = 46;\n\t var deleteKey = 8;\n\n\t // If user has removed value...\n\t if ((e.keyCode === backKey || e.keyCode === deleteKey) && !e.target.value) {\n\t // ...and it is a multiple select input, activate choices (if searching)\n\t if (!this.isTextElement && this.isSearching) {\n\t this.isSearching = false;\n\t this.store.dispatch((0, _index3.activateChoices)(true));\n\t }\n\t } else if (this.canSearch && canAddItem.response) {\n\t this._handleSearch(this.input.value);\n\t }\n\t }\n\t // Re-establish canSearch value from changes in _onKeyDown\n\t this.canSearch = this.config.searchEnabled;\n\t }\n\n\t /**\n\t * Input event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onInput',\n\t value: function _onInput() {\n\t if (!this.isSelectOneElement) {\n\t this._setInputWidth();\n\t }\n\t }\n\n\t /**\n\t * Touch move event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onTouchMove',\n\t value: function _onTouchMove() {\n\t if (this.wasTap === true) {\n\t this.wasTap = false;\n\t }\n\t }\n\n\t /**\n\t * Touch end event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onTouchEnd',\n\t value: function _onTouchEnd(e) {\n\t var target = e.target || e.touches[0].target;\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\n\t // If a user tapped within our container...\n\t if (this.wasTap === true && this.containerOuter.contains(target)) {\n\t // ...and we aren't dealing with a single select box, show dropdown/focus input\n\t if ((target === this.containerOuter || target === this.containerInner) && !this.isSelectOneElement) {\n\t if (this.isTextElement) {\n\t // If text element, we only want to focus the input (if it isn't already)\n\t if (document.activeElement !== this.input) {\n\t this.input.focus();\n\t }\n\t } else {\n\t if (!hasActiveDropdown) {\n\t // If a select box, we want to show the dropdown\n\t this.showDropdown(true);\n\t }\n\t }\n\t }\n\t // Prevents focus event firing\n\t e.stopPropagation();\n\t }\n\n\t this.wasTap = true;\n\t }\n\n\t /**\n\t * Mouse down event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onMouseDown',\n\t value: function _onMouseDown(e) {\n\t var target = e.target;\n\n\t // If we have our mouse down on the scrollbar and are on IE11...\n\t if (target === this.choiceList && this.isIe11) {\n\t this.isScrollingOnIe = true;\n\t }\n\n\t if (this.containerOuter.contains(target) && target !== this.input) {\n\t var foundTarget = void 0;\n\t var activeItems = this.store.getItemsFilteredByActive();\n\t var hasShiftKey = e.shiftKey;\n\n\t if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-button')) {\n\t this._handleButtonAction(activeItems, foundTarget);\n\t } else if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-item')) {\n\t this._handleItemAction(activeItems, foundTarget, hasShiftKey);\n\t } else if (foundTarget = (0, _utils.findAncestorByAttrName)(target, 'data-choice')) {\n\t this._handleChoiceAction(activeItems, foundTarget);\n\t }\n\n\t e.preventDefault();\n\t }\n\t }\n\n\t /**\n\t * Click event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onClick',\n\t value: function _onClick(e) {\n\t var target = e.target;\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t var activeItems = this.store.getItemsFilteredByActive();\n\n\t // If target is something that concerns us\n\t if (this.containerOuter.contains(target)) {\n\t // Handle button delete\n\t if (target.hasAttribute('data-button')) {\n\t this._handleButtonAction(activeItems, target);\n\t }\n\n\t if (!hasActiveDropdown) {\n\t if (this.isTextElement) {\n\t if (document.activeElement !== this.input) {\n\t this.input.focus();\n\t }\n\t } else {\n\t if (this.canSearch) {\n\t this.showDropdown(true);\n\t } else {\n\t this.showDropdown();\n\t this.containerOuter.focus();\n\t }\n\t }\n\t } else if (this.isSelectOneElement && target !== this.input && !this.dropdown.contains(target)) {\n\t this.hideDropdown(true);\n\t }\n\t } else {\n\t var hasHighlightedItems = activeItems.some(function (item) {\n\t return item.highlighted;\n\t });\n\n\t // De-select any highlighted items\n\t if (hasHighlightedItems) {\n\t this.unhighlightAll();\n\t }\n\n\t // Remove focus state\n\t this.containerOuter.classList.remove(this.config.classNames.focusState);\n\n\t // Close all other dropdowns\n\t if (hasActiveDropdown) {\n\t this.hideDropdown();\n\t }\n\t }\n\t }\n\n\t /**\n\t * Mouse over (hover) event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onMouseOver',\n\t value: function _onMouseOver(e) {\n\t // If the dropdown is either the target or one of its children is the target\n\t if (e.target === this.dropdown || this.dropdown.contains(e.target)) {\n\t if (e.target.hasAttribute('data-choice')) this._highlightChoice(e.target);\n\t }\n\t }\n\n\t /**\n\t * Paste event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onPaste',\n\t value: function _onPaste(e) {\n\t // Disable pasting into the input if option has been set\n\t if (e.target === this.input && !this.config.paste) {\n\t e.preventDefault();\n\t }\n\t }\n\n\t /**\n\t * Focus event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onFocus',\n\t value: function _onFocus(e) {\n\t var _this17 = this;\n\n\t var target = e.target;\n\t // If target is something that concerns us\n\t if (this.containerOuter.contains(target)) {\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t var focusActions = {\n\t text: function text() {\n\t if (target === _this17.input) {\n\t _this17.containerOuter.classList.add(_this17.config.classNames.focusState);\n\t }\n\t },\n\t 'select-one': function selectOne() {\n\t _this17.containerOuter.classList.add(_this17.config.classNames.focusState);\n\t if (target === _this17.input) {\n\t // Show dropdown if it isn't already showing\n\t if (!hasActiveDropdown) {\n\t _this17.showDropdown();\n\t }\n\t }\n\t },\n\t 'select-multiple': function selectMultiple() {\n\t if (target === _this17.input) {\n\t // If element is a select box, the focused element is the container and the dropdown\n\t // isn't already open, focus and show dropdown\n\t _this17.containerOuter.classList.add(_this17.config.classNames.focusState);\n\n\t if (!hasActiveDropdown) {\n\t _this17.showDropdown(true);\n\t }\n\t }\n\t }\n\t };\n\n\t focusActions[this.passedElement.type]();\n\t }\n\t }\n\n\t /**\n\t * Blur event\n\t * @param {Object} e Event\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_onBlur',\n\t value: function _onBlur(e) {\n\t var _this18 = this;\n\n\t var target = e.target;\n\t // If target is something that concerns us\n\t if (this.containerOuter.contains(target) && !this.isScrollingOnIe) {\n\t var activeItems = this.store.getItemsFilteredByActive();\n\t var hasActiveDropdown = this.dropdown.classList.contains(this.config.classNames.activeState);\n\t var hasHighlightedItems = activeItems.some(function (item) {\n\t return item.highlighted;\n\t });\n\t var blurActions = {\n\t text: function text() {\n\t if (target === _this18.input) {\n\t // Remove the focus state\n\t _this18.containerOuter.classList.remove(_this18.config.classNames.focusState);\n\t // De-select any highlighted items\n\t if (hasHighlightedItems) {\n\t _this18.unhighlightAll();\n\t }\n\t // Hide dropdown if it is showing\n\t if (hasActiveDropdown) {\n\t _this18.hideDropdown();\n\t }\n\t }\n\t },\n\t 'select-one': function selectOne() {\n\t _this18.containerOuter.classList.remove(_this18.config.classNames.focusState);\n\t if (target === _this18.containerOuter) {\n\t // Hide dropdown if it is showing\n\t if (hasActiveDropdown && !_this18.canSearch) {\n\t _this18.hideDropdown();\n\t }\n\t }\n\t if (target === _this18.input && hasActiveDropdown) {\n\t // Hide dropdown if it is showing\n\t _this18.hideDropdown();\n\t }\n\t },\n\t 'select-multiple': function selectMultiple() {\n\t if (target === _this18.input) {\n\t // Remove the focus state\n\t _this18.containerOuter.classList.remove(_this18.config.classNames.focusState);\n\t // Hide dropdown if it is showing\n\t if (hasActiveDropdown) {\n\t _this18.hideDropdown();\n\t }\n\t // De-select any highlighted items\n\t if (hasHighlightedItems) {\n\t _this18.unhighlightAll();\n\t }\n\t }\n\t }\n\t };\n\n\t blurActions[this.passedElement.type]();\n\t } else {\n\t // On IE11, clicking the scollbar blurs our input and thus\n\t // closes the dropdown. To stop this, we refocus our input\n\t // if we know we are on IE *and* are scrolling.\n\t this.isScrollingOnIe = false;\n\t this.input.focus();\n\t }\n\t }\n\n\t /**\n\t * Tests value against a regular expression\n\t * @param {string} value Value to test\n\t * @return {Boolean} Whether test passed/failed\n\t * @private\n\t */\n\n\t }, {\n\t key: '_regexFilter',\n\t value: function _regexFilter(value) {\n\t if (!value) {\n\t return false;\n\t }\n\n\t var regex = this.config.regexFilter;\n\t var expression = new RegExp(regex.source, 'i');\n\t return expression.test(value);\n\t }\n\n\t /**\n\t * Scroll to an option element\n\t * @param {HTMLElement} choice Option to scroll to\n\t * @param {Number} direction Whether option is above or below\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_scrollToChoice',\n\t value: function _scrollToChoice(choice, direction) {\n\t var _this19 = this;\n\n\t if (!choice) {\n\t return;\n\t }\n\n\t var dropdownHeight = this.choiceList.offsetHeight;\n\t var choiceHeight = choice.offsetHeight;\n\t // Distance from bottom of element to top of parent\n\t var choicePos = choice.offsetTop + choiceHeight;\n\t // Scroll position of dropdown\n\t var containerScrollPos = this.choiceList.scrollTop + dropdownHeight;\n\t // Difference between the choice and scroll position\n\t var endPoint = direction > 0 ? this.choiceList.scrollTop + choicePos - containerScrollPos : choice.offsetTop;\n\n\t var animateScroll = function animateScroll() {\n\t var strength = 4;\n\t var choiceListScrollTop = _this19.choiceList.scrollTop;\n\t var continueAnimation = false;\n\t var easing = void 0;\n\t var distance = void 0;\n\n\t if (direction > 0) {\n\t easing = (endPoint - choiceListScrollTop) / strength;\n\t distance = easing > 1 ? easing : 1;\n\n\t _this19.choiceList.scrollTop = choiceListScrollTop + distance;\n\t if (choiceListScrollTop < endPoint) {\n\t continueAnimation = true;\n\t }\n\t } else {\n\t easing = (choiceListScrollTop - endPoint) / strength;\n\t distance = easing > 1 ? easing : 1;\n\n\t _this19.choiceList.scrollTop = choiceListScrollTop - distance;\n\t if (choiceListScrollTop > endPoint) {\n\t continueAnimation = true;\n\t }\n\t }\n\n\t if (continueAnimation) {\n\t requestAnimationFrame(function (time) {\n\t animateScroll(time, endPoint, direction);\n\t });\n\t }\n\t };\n\n\t requestAnimationFrame(function (time) {\n\t animateScroll(time, endPoint, direction);\n\t });\n\t }\n\n\t /**\n\t * Highlight choice\n\t * @param {HTMLElement} [el] Element to highlight\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_highlightChoice',\n\t value: function _highlightChoice() {\n\t var _this20 = this;\n\n\t var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n\t // Highlight first element in dropdown\n\t var choices = Array.from(this.dropdown.querySelectorAll('[data-choice-selectable]'));\n\t var passedEl = el;\n\n\t if (choices && choices.length) {\n\t var highlightedChoices = Array.from(this.dropdown.querySelectorAll('.' + this.config.classNames.highlightedState));\n\n\t // Remove any highlighted choices\n\t highlightedChoices.forEach(function (choice) {\n\t choice.classList.remove(_this20.config.classNames.highlightedState);\n\t choice.setAttribute('aria-selected', 'false');\n\t });\n\n\t if (passedEl) {\n\t this.highlightPosition = choices.indexOf(passedEl);\n\t } else {\n\t // Highlight choice based on last known highlight location\n\t if (choices.length > this.highlightPosition) {\n\t // If we have an option to highlight\n\t passedEl = choices[this.highlightPosition];\n\t } else {\n\t // Otherwise highlight the option before\n\t passedEl = choices[choices.length - 1];\n\t }\n\n\t if (!passedEl) {\n\t passedEl = choices[0];\n\t }\n\t }\n\n\t // Highlight given option, and set accessiblity attributes\n\t passedEl.classList.add(this.config.classNames.highlightedState);\n\t passedEl.setAttribute('aria-selected', 'true');\n\t this.containerOuter.setAttribute('aria-activedescendant', passedEl.id);\n\t }\n\t }\n\n\t /**\n\t * Add item to store with correct value\n\t * @param {String} value Value to add to store\n\t * @param {String} [label] Label to add to store\n\t * @param {Number} [choiceId=-1] ID of the associated choice that was selected\n\t * @param {Number} [groupId=-1] ID of group choice is within. Negative number indicates no group\n\t * @param {Object} [customProperties] Object containing user defined properties\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: '_addItem',\n\t value: function _addItem(value) {\n\t var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t var choiceId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n\t var groupId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1;\n\t var customProperties = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\t var placeholder = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\t var keyCode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;\n\n\t var passedValue = (0, _utils.isType)('String', value) ? value.trim() : value;\n\t var passedKeyCode = keyCode;\n\t var items = this.store.getItems();\n\t var passedLabel = label || passedValue;\n\t var passedOptionId = parseInt(choiceId, 10) || -1;\n\n\t // Get group if group ID passed\n\t var group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t // Generate unique id\n\t var id = items ? items.length + 1 : 1;\n\n\t // If a prepended value has been passed, prepend it\n\t if (this.config.prependValue) {\n\t passedValue = this.config.prependValue + passedValue.toString();\n\t }\n\n\t // If an appended value has been passed, append it\n\t if (this.config.appendValue) {\n\t passedValue += this.config.appendValue.toString();\n\t }\n\n\t this.store.dispatch((0, _index3.addItem)(passedValue, passedLabel, id, passedOptionId, groupId, customProperties, placeholder, passedKeyCode));\n\n\t if (this.isSelectOneElement) {\n\t this.removeActiveItems(id);\n\t }\n\n\t // Trigger change event\n\t if (group && group.value) {\n\t (0, _utils.triggerEvent)(this.passedElement, 'addItem', {\n\t id: id,\n\t value: passedValue,\n\t label: passedLabel,\n\t groupValue: group.value,\n\t keyCode: passedKeyCode\n\t });\n\t } else {\n\t (0, _utils.triggerEvent)(this.passedElement, 'addItem', {\n\t id: id,\n\t value: passedValue,\n\t label: passedLabel,\n\t keyCode: passedKeyCode\n\t });\n\t }\n\n\t return this;\n\t }\n\n\t /**\n\t * Remove item from store\n\t * @param {Object} item Item to remove\n\t * @return {Object} Class instance\n\t * @public\n\t */\n\n\t }, {\n\t key: '_removeItem',\n\t value: function _removeItem(item) {\n\t if (!item || !(0, _utils.isType)('Object', item)) {\n\t return this;\n\t }\n\n\t var id = item.id;\n\t var value = item.value;\n\t var label = item.label;\n\t var choiceId = item.choiceId;\n\t var groupId = item.groupId;\n\t var group = groupId >= 0 ? this.store.getGroupById(groupId) : null;\n\n\t this.store.dispatch((0, _index3.removeItem)(id, choiceId));\n\n\t if (group && group.value) {\n\t (0, _utils.triggerEvent)(this.passedElement, 'removeItem', {\n\t id: id,\n\t value: value,\n\t label: label,\n\t groupValue: group.value\n\t });\n\t } else {\n\t (0, _utils.triggerEvent)(this.passedElement, 'removeItem', {\n\t id: id,\n\t value: value,\n\t label: label\n\t });\n\t }\n\n\t return this;\n\t }\n\n\t /**\n\t * Add choice to dropdown\n\t * @param {String} value Value of choice\n\t * @param {String} [label] Label of choice\n\t * @param {Boolean} [isSelected=false] Whether choice is selected\n\t * @param {Boolean} [isDisabled=false] Whether choice is disabled\n\t * @param {Number} [groupId=-1] ID of group choice is within. Negative number indicates no group\n\t * @param {Object} [customProperties] Object containing user defined properties\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_addChoice',\n\t value: function _addChoice(value) {\n\t var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\t var isSelected = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\t var isDisabled = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\t var groupId = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1;\n\t var customProperties = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n\t var placeholder = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n\t var keyCode = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;\n\n\t if (typeof value === 'undefined' || value === null) {\n\t return;\n\t }\n\n\t // Generate unique id\n\t var choices = this.store.getChoices();\n\t var choiceLabel = label || value;\n\t var choiceId = choices ? choices.length + 1 : 1;\n\t var choiceElementId = this.baseId + '-' + this.idNames.itemChoice + '-' + choiceId;\n\n\t this.store.dispatch((0, _index3.addChoice)(value, choiceLabel, choiceId, groupId, isDisabled, choiceElementId, customProperties, placeholder, keyCode));\n\n\t if (isSelected) {\n\t this._addItem(value, choiceLabel, choiceId, undefined, customProperties, placeholder, keyCode);\n\t }\n\t }\n\n\t /**\n\t * Clear all choices added to the store.\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_clearChoices',\n\t value: function _clearChoices() {\n\t this.store.dispatch((0, _index3.clearChoices)());\n\t }\n\n\t /**\n\t * Add group to dropdown\n\t * @param {Object} group Group to add\n\t * @param {Number} id Group ID\n\t * @param {String} [valueKey] name of the value property on the object\n\t * @param {String} [labelKey] name of the label property on the object\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_addGroup',\n\t value: function _addGroup(group, id) {\n\t var _this21 = this;\n\n\t var valueKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value';\n\t var labelKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'label';\n\n\t var groupChoices = (0, _utils.isType)('Object', group) ? group.choices : Array.from(group.getElementsByTagName('OPTION'));\n\t var groupId = id ? id : Math.floor(new Date().valueOf() * Math.random());\n\t var isDisabled = group.disabled ? group.disabled : false;\n\n\t if (groupChoices) {\n\t this.store.dispatch((0, _index3.addGroup)(group.label, groupId, true, isDisabled));\n\n\t groupChoices.forEach(function (option) {\n\t var isOptDisabled = option.disabled || option.parentNode && option.parentNode.disabled;\n\t _this21._addChoice(option[valueKey], (0, _utils.isType)('Object', option) ? option[labelKey] : option.innerHTML, option.selected, isOptDisabled, groupId, option.customProperties, option.placeholder);\n\t });\n\t } else {\n\t this.store.dispatch((0, _index3.addGroup)(group.label, group.id, false, group.disabled));\n\t }\n\t }\n\n\t /**\n\t * Get template from name\n\t * @param {String} template Name of template to get\n\t * @param {...} args Data to pass to template\n\t * @return {HTMLElement} Template\n\t * @private\n\t */\n\n\t }, {\n\t key: '_getTemplate',\n\t value: function _getTemplate(template) {\n\t if (!template) {\n\t return null;\n\t }\n\t var templates = this.config.templates;\n\n\t for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\n\t return templates[template].apply(templates, args);\n\t }\n\n\t /**\n\t * Create HTML element based on type and arguments\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_createTemplates',\n\t value: function _createTemplates() {\n\t var _this22 = this;\n\n\t var globalClasses = this.config.classNames;\n\t var templates = {\n\t containerOuter: function containerOuter(direction) {\n\t return (0, _utils.strToEl)('\\n \\n \\n ');\n\t },\n\t containerInner: function containerInner() {\n\t return (0, _utils.strToEl)('\\n
\\n ');\n\t },\n\t itemList: function itemList() {\n\t var _classNames;\n\n\t var localClasses = (0, _classnames2.default)(globalClasses.list, (_classNames = {}, _defineProperty(_classNames, globalClasses.listSingle, _this22.isSelectOneElement), _defineProperty(_classNames, globalClasses.listItems, !_this22.isSelectOneElement), _classNames));\n\n\t return (0, _utils.strToEl)('\\n
\\n ');\n\t },\n\t placeholder: function placeholder(value) {\n\t return (0, _utils.strToEl)('\\n
\\n ' + value + '\\n
\\n ');\n\t },\n\t item: function item(data) {\n\t var _classNames2;\n\n\t var localClasses = (0, _classnames2.default)(globalClasses.item, (_classNames2 = {}, _defineProperty(_classNames2, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames2, globalClasses.itemSelectable, !data.highlighted), _defineProperty(_classNames2, globalClasses.placeholder, data.placeholder), _classNames2));\n\n\t if (_this22.config.removeItemButton) {\n\t var _classNames3;\n\n\t localClasses = (0, _classnames2.default)(globalClasses.item, (_classNames3 = {}, _defineProperty(_classNames3, globalClasses.highlightedState, data.highlighted), _defineProperty(_classNames3, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames3, globalClasses.placeholder, data.placeholder), _classNames3));\n\n\t return (0, _utils.strToEl)('\\n \\n ' + data.label + '\\n \\n \\n \\n ');\n\t }\n\n\t return (0, _utils.strToEl)('\\n \\n ' + data.label + '\\n \\n ');\n\t },\n\t choiceList: function choiceList() {\n\t return (0, _utils.strToEl)('\\n \\n \\n ');\n\t },\n\t choiceGroup: function choiceGroup(data) {\n\t var localClasses = (0, _classnames2.default)(globalClasses.group, _defineProperty({}, globalClasses.itemDisabled, data.disabled));\n\n\t return (0, _utils.strToEl)('\\n \\n
' + data.value + '
\\n \\n ');\n\t },\n\t choice: function choice(data) {\n\t var _classNames5;\n\n\t var localClasses = (0, _classnames2.default)(globalClasses.item, globalClasses.itemChoice, (_classNames5 = {}, _defineProperty(_classNames5, globalClasses.itemDisabled, data.disabled), _defineProperty(_classNames5, globalClasses.itemSelectable, !data.disabled), _defineProperty(_classNames5, globalClasses.placeholder, data.placeholder), _classNames5));\n\n\t return (0, _utils.strToEl)('\\n 0 ? 'role=\"treeitem\"' : 'role=\"option\"') + '\\n >\\n ' + data.label + '\\n \\n ');\n\t },\n\t input: function input() {\n\t var localClasses = (0, _classnames2.default)(globalClasses.input, globalClasses.inputCloned);\n\n\t return (0, _utils.strToEl)('\\n \\n ');\n\t },\n\t dropdown: function dropdown() {\n\t var localClasses = (0, _classnames2.default)(globalClasses.list, globalClasses.listDropdown);\n\n\t return (0, _utils.strToEl)('\\n \\n \\n ');\n\t },\n\t notice: function notice(label) {\n\t var _classNames6;\n\n\t var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n\t var localClasses = (0, _classnames2.default)(globalClasses.item, globalClasses.itemChoice, (_classNames6 = {}, _defineProperty(_classNames6, globalClasses.noResults, type === 'no-results'), _defineProperty(_classNames6, globalClasses.noChoices, type === 'no-choices'), _classNames6));\n\n\t return (0, _utils.strToEl)('\\n
\\n ' + label + '\\n
\\n ');\n\t },\n\t option: function option(data) {\n\t return (0, _utils.strToEl)('\\n \\n ');\n\t }\n\t };\n\n\t // User's custom templates\n\t var callbackTemplate = this.config.callbackOnCreateTemplates;\n\t var userTemplates = {};\n\t if (callbackTemplate && (0, _utils.isType)('Function', callbackTemplate)) {\n\t userTemplates = callbackTemplate.call(this, _utils.strToEl);\n\t }\n\n\t this.config.templates = (0, _utils.extend)(templates, userTemplates);\n\t }\n\t }, {\n\t key: '_setLoading',\n\t value: function _setLoading(isLoading) {\n\t this.store.dispatch((0, _index3.setIsLoading)(isLoading));\n\t }\n\n\t /**\n\t * Create DOM structure around passed select element\n\t * @return\n\t * @private\n\t */\n\n\t }, {\n\t key: '_createInput',\n\t value: function _createInput() {\n\t var _this23 = this;\n\n\t var direction = this.passedElement.getAttribute('dir') || 'ltr';\n\t var containerOuter = this._getTemplate('containerOuter', direction);\n\t var containerInner = this._getTemplate('containerInner');\n\t var itemList = this._getTemplate('itemList');\n\t var choiceList = this._getTemplate('choiceList');\n\t var input = this._getTemplate('input');\n\t var dropdown = this._getTemplate('dropdown');\n\n\t this.containerOuter = containerOuter;\n\t this.containerInner = containerInner;\n\t this.input = input;\n\t this.choiceList = choiceList;\n\t this.itemList = itemList;\n\t this.dropdown = dropdown;\n\n\t // Hide passed input\n\t this.passedElement.classList.add(this.config.classNames.input, this.config.classNames.hiddenState);\n\n\t // Remove element from tab index\n\t this.passedElement.tabIndex = '-1';\n\n\t // Backup original styles if any\n\t var origStyle = this.passedElement.getAttribute('style');\n\n\t if (Boolean(origStyle)) {\n\t this.passedElement.setAttribute('data-choice-orig-style', origStyle);\n\t }\n\n\t this.passedElement.setAttribute('style', 'display:none;');\n\t this.passedElement.setAttribute('aria-hidden', 'true');\n\t this.passedElement.setAttribute('data-choice', 'active');\n\n\t // Wrap input in container preserving DOM ordering\n\t (0, _utils.wrap)(this.passedElement, containerInner);\n\n\t // Wrapper inner container with outer container\n\t (0, _utils.wrap)(containerInner, containerOuter);\n\n\t if (this.isSelectOneElement) {\n\t input.placeholder = this.config.searchPlaceholderValue || '';\n\t } else if (this.placeholder) {\n\t input.placeholder = this.placeholder;\n\t input.style.width = (0, _utils.getWidthOfInput)(input);\n\t }\n\n\t if (!this.config.addItems) {\n\t this.disable();\n\t }\n\n\t containerOuter.appendChild(containerInner);\n\t containerOuter.appendChild(dropdown);\n\t containerInner.appendChild(itemList);\n\n\t if (!this.isTextElement) {\n\t dropdown.appendChild(choiceList);\n\t }\n\n\t if (this.isSelectMultipleElement || this.isTextElement) {\n\t containerInner.appendChild(input);\n\t } else if (this.canSearch) {\n\t dropdown.insertBefore(input, dropdown.firstChild);\n\t }\n\n\t if (this.isSelectElement) {\n\t var passedGroups = Array.from(this.passedElement.getElementsByTagName('OPTGROUP'));\n\n\t this.highlightPosition = 0;\n\t this.isSearching = false;\n\n\t this._setLoading(true);\n\n\t if (passedGroups && passedGroups.length) {\n\t passedGroups.forEach(function (group) {\n\t _this23._addGroup(group, group.id || null);\n\t });\n\t } else {\n\t var passedOptions = Array.from(this.passedElement.options);\n\t var filter = this.config.sortFilter;\n\t var allChoices = this.presetChoices;\n\n\t // Create array of options from option elements\n\t passedOptions.forEach(function (o) {\n\t allChoices.push({\n\t value: o.value,\n\t label: o.innerHTML,\n\t selected: o.selected,\n\t disabled: o.disabled || o.parentNode.disabled,\n\t placeholder: o.hasAttribute('placeholder')\n\t });\n\t });\n\n\t // If sorting is enabled or the user is searching, filter choices\n\t if (this.config.shouldSort) {\n\t allChoices.sort(filter);\n\t }\n\n\t // Determine whether there is a selected choice\n\t var hasSelectedChoice = allChoices.some(function (choice) {\n\t return choice.selected;\n\t });\n\n\t // Add each choice\n\t allChoices.forEach(function (choice, index) {\n\t // Pre-select first choice if it's a single select\n\t if (_this23.isSelectOneElement) {\n\t // If there is a selected choice already or the choice is not\n\t // the first in the array, add each choice normally\n\t // Otherwise pre-select the first choice in the array\n\t var shouldPreselect = hasSelectedChoice || !hasSelectedChoice && index > 0;\n\t _this23._addChoice(choice.value, choice.label, shouldPreselect ? choice.selected : true, shouldPreselect ? choice.disabled : false, undefined, choice.customProperties, choice.placeholder);\n\t } else {\n\t _this23._addChoice(choice.value, choice.label, choice.selected, choice.disabled, undefined, choice.customProperties, choice.placeholder);\n\t }\n\t });\n\t }\n\n\t this._setLoading(false);\n\t } else if (this.isTextElement) {\n\t // Add any preset values seperated by delimiter\n\t this.presetItems.forEach(function (item) {\n\t var itemType = (0, _utils.getType)(item);\n\t if (itemType === 'Object') {\n\t if (!item.value) {\n\t return;\n\t }\n\t _this23._addItem(item.value, item.label, item.id, undefined, item.customProperties, item.placeholder);\n\t } else if (itemType === 'String') {\n\t _this23._addItem(item);\n\t }\n\t });\n\t }\n\t }\n\n\t /*===== End of Private functions ======*/\n\n\t }]);\n\n\t return Choices;\n\t}();\n\n\t\tmodule.exports = Choices;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * @license\n\t * Fuse - Lightweight fuzzy-search\n\t *\n\t * Copyright (c) 2012-2016 Kirollos Risk .\n\t * All Rights Reserved. Apache Software License 2.0\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\")\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t */\n\t;(function (global) {\n\t 'use strict'\n\n\t /** @type {function(...*)} */\n\t function log () {\n\t console.log.apply(console, arguments)\n\t }\n\n\t var defaultOptions = {\n\t // The name of the identifier property. If specified, the returned result will be a list\n\t // of the items' dentifiers, otherwise it will be a list of the items.\n\t id: null,\n\n\t // Indicates whether comparisons should be case sensitive.\n\n\t caseSensitive: false,\n\n\t // An array of values that should be included from the searcher's output. When this array\n\t // contains elements, each result in the list will be of the form `{ item: ..., include1: ..., include2: ... }`.\n\t // Values you can include are `score`, `matchedLocations`\n\t include: [],\n\n\t // Whether to sort the result list, by score\n\t shouldSort: true,\n\n\t // The search function to use\n\t // Note that the default search function ([[Function]]) must conform to the following API:\n\t //\n\t // @param pattern The pattern string to search\n\t // @param options The search option\n\t // [[Function]].constructor = function(pattern, options)\n\t //\n\t // @param text: the string to search in for the pattern\n\t // @return Object in the form of:\n\t // - isMatch: boolean\n\t // - score: Int\n\t // [[Function]].prototype.search = function(text)\n\t searchFn: BitapSearcher,\n\n\t // Default sort function\n\t sortFn: function (a, b) {\n\t return a.score - b.score\n\t },\n\n\t // The get function to use when fetching an object's properties.\n\t // The default will search nested paths *ie foo.bar.baz*\n\t getFn: deepValue,\n\n\t // List of properties that will be searched. This also supports nested properties.\n\t keys: [],\n\n\t // Will print to the console. Useful for debugging.\n\t verbose: false,\n\n\t // When true, the search algorithm will search individual words **and** the full string,\n\t // computing the final score as a function of both. Note that when `tokenize` is `true`,\n\t // the `threshold`, `distance`, and `location` are inconsequential for individual tokens.\n\t tokenize: false,\n\n\t // When true, the result set will only include records that match all tokens. Will only work\n\t // if `tokenize` is also true.\n\t matchAllTokens: false,\n\n\t // Regex used to separate words when searching. Only applicable when `tokenize` is `true`.\n\t tokenSeparator: / +/g,\n\n\t // Minimum number of characters that must be matched before a result is considered a match\n\t minMatchCharLength: 1,\n\n\t // When true, the algorithm continues searching to the end of the input even if a perfect\n\t // match is found before the end of the same input.\n\t findAllMatches: false\n\t }\n\n\t /**\n\t * @constructor\n\t * @param {!Array} list\n\t * @param {!Object} options\n\t */\n\t function Fuse (list, options) {\n\t var key\n\n\t this.list = list\n\t this.options = options = options || {}\n\n\t for (key in defaultOptions) {\n\t if (!defaultOptions.hasOwnProperty(key)) {\n\t continue;\n\t }\n\t // Add boolean type options\n\t if (typeof defaultOptions[key] === 'boolean') {\n\t this.options[key] = key in options ? options[key] : defaultOptions[key];\n\t // Add all other options\n\t } else {\n\t this.options[key] = options[key] || defaultOptions[key]\n\t }\n\t }\n\t }\n\n\t Fuse.VERSION = '2.7.3'\n\n\t /**\n\t * Sets a new list for Fuse to match against.\n\t * @param {!Array} list\n\t * @return {!Array} The newly set list\n\t * @public\n\t */\n\t Fuse.prototype.set = function (list) {\n\t this.list = list\n\t return list\n\t }\n\n\t Fuse.prototype.search = function (pattern) {\n\t if (this.options.verbose) log('\\nSearch term:', pattern, '\\n')\n\n\t this.pattern = pattern\n\t this.results = []\n\t this.resultMap = {}\n\t this._keyMap = null\n\n\t this._prepareSearchers()\n\t this._startSearch()\n\t this._computeScore()\n\t this._sort()\n\n\t var output = this._format()\n\t return output\n\t }\n\n\t Fuse.prototype._prepareSearchers = function () {\n\t var options = this.options\n\t var pattern = this.pattern\n\t var searchFn = options.searchFn\n\t var tokens = pattern.split(options.tokenSeparator)\n\t var i = 0\n\t var len = tokens.length\n\n\t if (this.options.tokenize) {\n\t this.tokenSearchers = []\n\t for (; i < len; i++) {\n\t this.tokenSearchers.push(new searchFn(tokens[i], options))\n\t }\n\t }\n\t this.fullSeacher = new searchFn(pattern, options)\n\t }\n\n\t Fuse.prototype._startSearch = function () {\n\t var options = this.options\n\t var getFn = options.getFn\n\t var list = this.list\n\t var listLen = list.length\n\t var keys = this.options.keys\n\t var keysLen = keys.length\n\t var key\n\t var weight\n\t var item = null\n\t var i\n\t var j\n\n\t // Check the first item in the list, if it's a string, then we assume\n\t // that every item in the list is also a string, and thus it's a flattened array.\n\t if (typeof list[0] === 'string') {\n\t // Iterate over every item\n\t for (i = 0; i < listLen; i++) {\n\t this._analyze('', list[i], i, i)\n\t }\n\t } else {\n\t this._keyMap = {}\n\t // Otherwise, the first item is an Object (hopefully), and thus the searching\n\t // is done on the values of the keys of each item.\n\t // Iterate over every item\n\t for (i = 0; i < listLen; i++) {\n\t item = list[i]\n\t // Iterate over every key\n\t for (j = 0; j < keysLen; j++) {\n\t key = keys[j]\n\t if (typeof key !== 'string') {\n\t weight = (1 - key.weight) || 1\n\t this._keyMap[key.name] = {\n\t weight: weight\n\t }\n\t if (key.weight <= 0 || key.weight > 1) {\n\t throw new Error('Key weight has to be > 0 and <= 1')\n\t }\n\t key = key.name\n\t } else {\n\t this._keyMap[key] = {\n\t weight: 1\n\t }\n\t }\n\t this._analyze(key, getFn(item, key, []), item, i)\n\t }\n\t }\n\t }\n\t }\n\n\t Fuse.prototype._analyze = function (key, text, entity, index) {\n\t var options = this.options\n\t var words\n\t var scores\n\t var exists = false\n\t var existingResult\n\t var averageScore\n\t var finalScore\n\t var scoresLen\n\t var mainSearchResult\n\t var tokenSearcher\n\t var termScores\n\t var word\n\t var tokenSearchResult\n\t var hasMatchInText\n\t var checkTextMatches\n\t var i\n\t var j\n\n\t // Check if the text can be searched\n\t if (text === undefined || text === null) {\n\t return\n\t }\n\n\t scores = []\n\n\t var numTextMatches = 0\n\n\t if (typeof text === 'string') {\n\t words = text.split(options.tokenSeparator)\n\n\t if (options.verbose) log('---------\\nKey:', key)\n\n\t if (this.options.tokenize) {\n\t for (i = 0; i < this.tokenSearchers.length; i++) {\n\t tokenSearcher = this.tokenSearchers[i]\n\n\t if (options.verbose) log('Pattern:', tokenSearcher.pattern)\n\n\t termScores = []\n\t hasMatchInText = false\n\n\t for (j = 0; j < words.length; j++) {\n\t word = words[j]\n\t tokenSearchResult = tokenSearcher.search(word)\n\t var obj = {}\n\t if (tokenSearchResult.isMatch) {\n\t obj[word] = tokenSearchResult.score\n\t exists = true\n\t hasMatchInText = true\n\t scores.push(tokenSearchResult.score)\n\t } else {\n\t obj[word] = 1\n\t if (!this.options.matchAllTokens) {\n\t scores.push(1)\n\t }\n\t }\n\t termScores.push(obj)\n\t }\n\n\t if (hasMatchInText) {\n\t numTextMatches++\n\t }\n\n\t if (options.verbose) log('Token scores:', termScores)\n\t }\n\n\t averageScore = scores[0]\n\t scoresLen = scores.length\n\t for (i = 1; i < scoresLen; i++) {\n\t averageScore += scores[i]\n\t }\n\t averageScore = averageScore / scoresLen\n\n\t if (options.verbose) log('Token score average:', averageScore)\n\t }\n\n\t mainSearchResult = this.fullSeacher.search(text)\n\t if (options.verbose) log('Full text score:', mainSearchResult.score)\n\n\t finalScore = mainSearchResult.score\n\t if (averageScore !== undefined) {\n\t finalScore = (finalScore + averageScore) / 2\n\t }\n\n\t if (options.verbose) log('Score average:', finalScore)\n\n\t checkTextMatches = (this.options.tokenize && this.options.matchAllTokens) ? numTextMatches >= this.tokenSearchers.length : true\n\n\t if (options.verbose) log('Check Matches', checkTextMatches)\n\n\t // If a match is found, add the item to , including its score\n\t if ((exists || mainSearchResult.isMatch) && checkTextMatches) {\n\t // Check if the item already exists in our results\n\t existingResult = this.resultMap[index]\n\n\t if (existingResult) {\n\t // Use the lowest score\n\t // existingResult.score, bitapResult.score\n\t existingResult.output.push({\n\t key: key,\n\t score: finalScore,\n\t matchedIndices: mainSearchResult.matchedIndices\n\t })\n\t } else {\n\t // Add it to the raw result list\n\t this.resultMap[index] = {\n\t item: entity,\n\t output: [{\n\t key: key,\n\t score: finalScore,\n\t matchedIndices: mainSearchResult.matchedIndices\n\t }]\n\t }\n\n\t this.results.push(this.resultMap[index])\n\t }\n\t }\n\t } else if (isArray(text)) {\n\t for (i = 0; i < text.length; i++) {\n\t this._analyze(key, text[i], entity, index)\n\t }\n\t }\n\t }\n\n\t Fuse.prototype._computeScore = function () {\n\t var i\n\t var j\n\t var keyMap = this._keyMap\n\t var totalScore\n\t var output\n\t var scoreLen\n\t var score\n\t var weight\n\t var results = this.results\n\t var bestScore\n\t var nScore\n\n\t if (this.options.verbose) log('\\n\\nComputing score:\\n')\n\n\t for (i = 0; i < results.length; i++) {\n\t totalScore = 0\n\t output = results[i].output\n\t scoreLen = output.length\n\n\t bestScore = 1\n\n\t for (j = 0; j < scoreLen; j++) {\n\t score = output[j].score\n\t weight = keyMap ? keyMap[output[j].key].weight : 1\n\n\t nScore = score * weight\n\n\t if (weight !== 1) {\n\t bestScore = Math.min(bestScore, nScore)\n\t } else {\n\t totalScore += nScore\n\t output[j].nScore = nScore\n\t }\n\t }\n\n\t if (bestScore === 1) {\n\t results[i].score = totalScore / scoreLen\n\t } else {\n\t results[i].score = bestScore\n\t }\n\n\t if (this.options.verbose) log(results[i])\n\t }\n\t }\n\n\t Fuse.prototype._sort = function () {\n\t var options = this.options\n\t if (options.shouldSort) {\n\t if (options.verbose) log('\\n\\nSorting....')\n\t this.results.sort(options.sortFn)\n\t }\n\t }\n\n\t Fuse.prototype._format = function () {\n\t var options = this.options\n\t var getFn = options.getFn\n\t var finalOutput = []\n\t var i\n\t var len\n\t var results = this.results\n\t var replaceValue\n\t var getItemAtIndex\n\t var include = options.include\n\n\t if (options.verbose) log('\\n\\nOutput:\\n\\n', results)\n\n\t // Helper function, here for speed-up, which replaces the item with its value,\n\t // if the options specifies it,\n\t replaceValue = options.id ? function (index) {\n\t results[index].item = getFn(results[index].item, options.id, [])[0]\n\t } : function () {}\n\n\t getItemAtIndex = function (index) {\n\t var record = results[index]\n\t var data\n\t var j\n\t var output\n\t var _item\n\t var _result\n\n\t // If `include` has values, put the item in the result\n\t if (include.length > 0) {\n\t data = {\n\t item: record.item\n\t }\n\t if (include.indexOf('matches') !== -1) {\n\t output = record.output\n\t data.matches = []\n\t for (j = 0; j < output.length; j++) {\n\t _item = output[j]\n\t _result = {\n\t indices: _item.matchedIndices\n\t }\n\t if (_item.key) {\n\t _result.key = _item.key\n\t }\n\t data.matches.push(_result)\n\t }\n\t }\n\n\t if (include.indexOf('score') !== -1) {\n\t data.score = results[index].score\n\t }\n\n\t } else {\n\t data = record.item\n\t }\n\n\t return data\n\t }\n\n\t // From the results, push into a new array only the item identifier (if specified)\n\t // of the entire item. This is because we don't want to return the ,\n\t // since it contains other metadata\n\t for (i = 0, len = results.length; i < len; i++) {\n\t replaceValue(i)\n\t finalOutput.push(getItemAtIndex(i))\n\t }\n\n\t return finalOutput\n\t }\n\n\t // Helpers\n\n\t function deepValue (obj, path, list) {\n\t var firstSegment\n\t var remaining\n\t var dotIndex\n\t var value\n\t var i\n\t var len\n\n\t if (!path) {\n\t // If there's no path left, we've gotten to the object we care about.\n\t list.push(obj)\n\t } else {\n\t dotIndex = path.indexOf('.')\n\n\t if (dotIndex !== -1) {\n\t firstSegment = path.slice(0, dotIndex)\n\t remaining = path.slice(dotIndex + 1)\n\t } else {\n\t firstSegment = path\n\t }\n\n\t value = obj[firstSegment]\n\t if (value !== null && value !== undefined) {\n\t if (!remaining && (typeof value === 'string' || typeof value === 'number')) {\n\t list.push(value)\n\t } else if (isArray(value)) {\n\t // Search each item in the array.\n\t for (i = 0, len = value.length; i < len; i++) {\n\t deepValue(value[i], remaining, list)\n\t }\n\t } else if (remaining) {\n\t // An object. Recurse further.\n\t deepValue(value, remaining, list)\n\t }\n\t }\n\t }\n\n\t return list\n\t }\n\n\t function isArray (obj) {\n\t return Object.prototype.toString.call(obj) === '[object Array]'\n\t }\n\n\t /**\n\t * Adapted from \"Diff, Match and Patch\", by Google\n\t *\n\t * http://code.google.com/p/google-diff-match-patch/\n\t *\n\t * Modified by: Kirollos Risk \n\t * -----------------------------------------------\n\t * Details: the algorithm and structure was modified to allow the creation of\n\t * instances with a method which does the actual\n\t * bitap search. The (the string that is searched for) is only defined\n\t * once per instance and thus it eliminates redundant re-creation when searching\n\t * over a list of strings.\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\")\n\t * you may not use this file except in compliance with the License.\n\t *\n\t * @constructor\n\t */\n\t function BitapSearcher (pattern, options) {\n\t options = options || {}\n\t this.options = options\n\t this.options.location = options.location || BitapSearcher.defaultOptions.location\n\t this.options.distance = 'distance' in options ? options.distance : BitapSearcher.defaultOptions.distance\n\t this.options.threshold = 'threshold' in options ? options.threshold : BitapSearcher.defaultOptions.threshold\n\t this.options.maxPatternLength = options.maxPatternLength || BitapSearcher.defaultOptions.maxPatternLength\n\n\t this.pattern = options.caseSensitive ? pattern : pattern.toLowerCase()\n\t this.patternLen = pattern.length\n\n\t if (this.patternLen <= this.options.maxPatternLength) {\n\t this.matchmask = 1 << (this.patternLen - 1)\n\t this.patternAlphabet = this._calculatePatternAlphabet()\n\t }\n\t }\n\n\t BitapSearcher.defaultOptions = {\n\t // Approximately where in the text is the pattern expected to be found?\n\t location: 0,\n\n\t // Determines how close the match must be to the fuzzy location (specified above).\n\t // An exact letter match which is 'distance' characters away from the fuzzy location\n\t // would score as a complete mismatch. A distance of '0' requires the match be at\n\t // the exact location specified, a threshold of '1000' would require a perfect match\n\t // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n\t distance: 100,\n\n\t // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n\t // (of both letters and location), a threshold of '1.0' would match anything.\n\t threshold: 0.6,\n\n\t // Machine word size\n\t maxPatternLength: 32\n\t }\n\n\t /**\n\t * Initialize the alphabet for the Bitap algorithm.\n\t * @return {Object} Hash of character locations.\n\t * @private\n\t */\n\t BitapSearcher.prototype._calculatePatternAlphabet = function () {\n\t var mask = {},\n\t i = 0\n\n\t for (i = 0; i < this.patternLen; i++) {\n\t mask[this.pattern.charAt(i)] = 0\n\t }\n\n\t for (i = 0; i < this.patternLen; i++) {\n\t mask[this.pattern.charAt(i)] |= 1 << (this.pattern.length - i - 1)\n\t }\n\n\t return mask\n\t }\n\n\t /**\n\t * Compute and return the score for a match with `e` errors and `x` location.\n\t * @param {number} errors Number of errors in match.\n\t * @param {number} location Location of match.\n\t * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n\t * @private\n\t */\n\t BitapSearcher.prototype._bitapScore = function (errors, location) {\n\t var accuracy = errors / this.patternLen,\n\t proximity = Math.abs(this.options.location - location)\n\n\t if (!this.options.distance) {\n\t // Dodge divide by zero error.\n\t return proximity ? 1.0 : accuracy\n\t }\n\t return accuracy + (proximity / this.options.distance)\n\t }\n\n\t /**\n\t * Compute and return the result of the search\n\t * @param {string} text The text to search in\n\t * @return {{isMatch: boolean, score: number}} Literal containing:\n\t * isMatch - Whether the text is a match or not\n\t * score - Overall score for the match\n\t * @public\n\t */\n\t BitapSearcher.prototype.search = function (text) {\n\t var options = this.options\n\t var i\n\t var j\n\t var textLen\n\t var findAllMatches\n\t var location\n\t var threshold\n\t var bestLoc\n\t var binMin\n\t var binMid\n\t var binMax\n\t var start, finish\n\t var bitArr\n\t var lastBitArr\n\t var charMatch\n\t var score\n\t var locations\n\t var matches\n\t var isMatched\n\t var matchMask\n\t var matchedIndices\n\t var matchesLen\n\t var match\n\n\t text = options.caseSensitive ? text : text.toLowerCase()\n\n\t if (this.pattern === text) {\n\t // Exact match\n\t return {\n\t isMatch: true,\n\t score: 0,\n\t matchedIndices: [[0, text.length - 1]]\n\t }\n\t }\n\n\t // When pattern length is greater than the machine word length, just do a a regex comparison\n\t if (this.patternLen > options.maxPatternLength) {\n\t matches = text.match(new RegExp(this.pattern.replace(options.tokenSeparator, '|')))\n\t isMatched = !!matches\n\n\t if (isMatched) {\n\t matchedIndices = []\n\t for (i = 0, matchesLen = matches.length; i < matchesLen; i++) {\n\t match = matches[i]\n\t matchedIndices.push([text.indexOf(match), match.length - 1])\n\t }\n\t }\n\n\t return {\n\t isMatch: isMatched,\n\t // TODO: revisit this score\n\t score: isMatched ? 0.5 : 1,\n\t matchedIndices: matchedIndices\n\t }\n\t }\n\n\t findAllMatches = options.findAllMatches\n\n\t location = options.location\n\t // Set starting location at beginning text and initialize the alphabet.\n\t textLen = text.length\n\t // Highest score beyond which we give up.\n\t threshold = options.threshold\n\t // Is there a nearby exact match? (speedup)\n\t bestLoc = text.indexOf(this.pattern, location)\n\n\t // a mask of the matches\n\t matchMask = []\n\t for (i = 0; i < textLen; i++) {\n\t matchMask[i] = 0\n\t }\n\n\t if (bestLoc != -1) {\n\t threshold = Math.min(this._bitapScore(0, bestLoc), threshold)\n\t // What about in the other direction? (speed up)\n\t bestLoc = text.lastIndexOf(this.pattern, location + this.patternLen)\n\n\t if (bestLoc != -1) {\n\t threshold = Math.min(this._bitapScore(0, bestLoc), threshold)\n\t }\n\t }\n\n\t bestLoc = -1\n\t score = 1\n\t locations = []\n\t binMax = this.patternLen + textLen\n\n\t for (i = 0; i < this.patternLen; i++) {\n\t // Scan for the best match; each iteration allows for one more error.\n\t // Run a binary search to determine how far from the match location we can stray\n\t // at this error level.\n\t binMin = 0\n\t binMid = binMax\n\t while (binMin < binMid) {\n\t if (this._bitapScore(i, location + binMid) <= threshold) {\n\t binMin = binMid\n\t } else {\n\t binMax = binMid\n\t }\n\t binMid = Math.floor((binMax - binMin) / 2 + binMin)\n\t }\n\n\t // Use the result from this iteration as the maximum for the next.\n\t binMax = binMid\n\t start = Math.max(1, location - binMid + 1)\n\t if (findAllMatches) {\n\t finish = textLen;\n\t } else {\n\t finish = Math.min(location + binMid, textLen) + this.patternLen\n\t }\n\n\t // Initialize the bit array\n\t bitArr = Array(finish + 2)\n\n\t bitArr[finish + 1] = (1 << i) - 1\n\n\t for (j = finish; j >= start; j--) {\n\t charMatch = this.patternAlphabet[text.charAt(j - 1)]\n\n\t if (charMatch) {\n\t matchMask[j - 1] = 1\n\t }\n\n\t bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch\n\n\t if (i !== 0) {\n\t // Subsequent passes: fuzzy match.\n\t bitArr[j] |= (((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1) | lastBitArr[j + 1]\n\t }\n\t if (bitArr[j] & this.matchmask) {\n\t score = this._bitapScore(i, j - 1)\n\n\t // This match will almost certainly be better than any existing match.\n\t // But check anyway.\n\t if (score <= threshold) {\n\t // Indeed it is\n\t threshold = score\n\t bestLoc = j - 1\n\t locations.push(bestLoc)\n\n\t // Already passed loc, downhill from here on in.\n\t if (bestLoc <= location) {\n\t break\n\t }\n\n\t // When passing loc, don't exceed our current distance from loc.\n\t start = Math.max(1, 2 * location - bestLoc)\n\t }\n\t }\n\t }\n\n\t // No hope for a (better) match at greater error levels.\n\t if (this._bitapScore(i + 1, location) > threshold) {\n\t break\n\t }\n\t lastBitArr = bitArr\n\t }\n\n\t matchedIndices = this._getMatchedIndices(matchMask)\n\n\t // Count exact matches (those with a score of 0) to be \"almost\" exact\n\t return {\n\t isMatch: bestLoc >= 0,\n\t score: score === 0 ? 0.001 : score,\n\t matchedIndices: matchedIndices\n\t }\n\t }\n\n\t BitapSearcher.prototype._getMatchedIndices = function (matchMask) {\n\t var matchedIndices = []\n\t var start = -1\n\t var end = -1\n\t var i = 0\n\t var match\n\t var len = matchMask.length\n\t for (; i < len; i++) {\n\t match = matchMask[i]\n\t if (match && start === -1) {\n\t start = i\n\t } else if (!match && start !== -1) {\n\t end = i - 1\n\t if ((end - start) + 1 >= this.options.minMatchCharLength) {\n\t matchedIndices.push([start, end])\n\t }\n\t start = -1\n\t }\n\t }\n\t if (matchMask[i - 1]) {\n\t if ((i-1 - start) + 1 >= this.options.minMatchCharLength) {\n\t matchedIndices.push([start, i - 1])\n\t }\n\t }\n\t return matchedIndices\n\t }\n\n\t // Export to Common JS Loader\n\t if (true) {\n\t // Node. Does not work with strict CommonJS, but\n\t // only CommonJS-like environments that support module.exports,\n\t // like Node.\n\t module.exports = Fuse\n\t } else if (typeof define === 'function' && define.amd) {\n\t // AMD. Register as an anonymous module.\n\t define(function () {\n\t return Fuse\n\t })\n\t } else {\n\t // Browser globals (root is window)\n\t global.Fuse = Fuse\n\t }\n\n\t})(this);\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t Copyright (c) 2016 Jed Watson.\n\t Licensed under the MIT License (MIT), see\n\t http://jedwatson.github.io/classnames\n\t*/\n\t/* global define */\n\n\t(function () {\n\t\t'use strict';\n\n\t\tvar hasOwn = {}.hasOwnProperty;\n\n\t\tfunction classNames () {\n\t\t\tvar classes = [];\n\n\t\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\t\tvar arg = arguments[i];\n\t\t\t\tif (!arg) continue;\n\n\t\t\t\tvar argType = typeof arg;\n\n\t\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\t\tclasses.push(arg);\n\t\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t\t} else if (argType === 'object') {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes.join(' ');\n\t\t}\n\n\t\tif (typeof module !== 'undefined' && module.exports) {\n\t\t\tmodule.exports = classNames;\n\t\t} else if (true) {\n\t\t\t// register as 'classnames', consistent with npm package name\n\t\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {\n\t\t\t\treturn classNames;\n\t\t\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\t} else {\n\t\t\twindow.classNames = classNames;\n\t\t}\n\t}());\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _redux = __webpack_require__(5);\n\n\tvar _index = __webpack_require__(26);\n\n\tvar _index2 = _interopRequireDefault(_index);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar Store = function () {\n\t function Store() {\n\t _classCallCheck(this, Store);\n\n\t this.store = (0, _redux.createStore)(_index2.default, window.devToolsExtension ? window.devToolsExtension() : undefined);\n\t }\n\n\t /**\n\t * Get store object (wrapping Redux method)\n\t * @return {Object} State\n\t */\n\n\n\t _createClass(Store, [{\n\t key: 'getState',\n\t value: function getState() {\n\t return this.store.getState();\n\t }\n\n\t /**\n\t * Dispatch event to store (wrapped Redux method)\n\t * @param {Function} action Action function to trigger\n\t * @return\n\t */\n\n\t }, {\n\t key: 'dispatch',\n\t value: function dispatch(action) {\n\t this.store.dispatch(action);\n\t }\n\n\t /**\n\t * Subscribe store to function call (wrapped Redux method)\n\t * @param {Function} onChange Function to trigger when state changes\n\t * @return\n\t */\n\n\t }, {\n\t key: 'subscribe',\n\t value: function subscribe(onChange) {\n\t this.store.subscribe(onChange);\n\t }\n\n\t /**\n\t * Get loading state from store\n\t * @return {Boolean} Loading State\n\t */\n\n\t }, {\n\t key: 'isLoading',\n\t value: function isLoading() {\n\t var state = this.store.getState();\n\t return state.general.loading;\n\t }\n\n\t /**\n\t * Get items from store\n\t * @return {Array} Item objects\n\t */\n\n\t }, {\n\t key: 'getItems',\n\t value: function getItems() {\n\t var state = this.store.getState();\n\t return state.items;\n\t }\n\n\t /**\n\t * Get active items from store\n\t * @return {Array} Item objects\n\t */\n\n\t }, {\n\t key: 'getItemsFilteredByActive',\n\t value: function getItemsFilteredByActive() {\n\t var items = this.getItems();\n\t var values = items.filter(function (item) {\n\t return item.active === true;\n\t }, []);\n\n\t return values;\n\t }\n\n\t /**\n\t * Get items from store reduced to just their values\n\t * @return {Array} Item objects\n\t */\n\n\t }, {\n\t key: 'getItemsReducedToValues',\n\t value: function getItemsReducedToValues() {\n\t var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getItems();\n\n\t var values = items.reduce(function (prev, current) {\n\t prev.push(current.value);\n\t return prev;\n\t }, []);\n\n\t return values;\n\t }\n\n\t /**\n\t * Get choices from store\n\t * @return {Array} Option objects\n\t */\n\n\t }, {\n\t key: 'getChoices',\n\t value: function getChoices() {\n\t var state = this.store.getState();\n\t return state.choices;\n\t }\n\n\t /**\n\t * Get active choices from store\n\t * @return {Array} Option objects\n\t */\n\n\t }, {\n\t key: 'getChoicesFilteredByActive',\n\t value: function getChoicesFilteredByActive() {\n\t var choices = this.getChoices();\n\t var values = choices.filter(function (choice) {\n\t return choice.active === true;\n\t });\n\n\t return values;\n\t }\n\n\t /**\n\t * Get selectable choices from store\n\t * @return {Array} Option objects\n\t */\n\n\t }, {\n\t key: 'getChoicesFilteredBySelectable',\n\t value: function getChoicesFilteredBySelectable() {\n\t var choices = this.getChoices();\n\t var values = choices.filter(function (choice) {\n\t return choice.disabled !== true;\n\t });\n\n\t return values;\n\t }\n\n\t /**\n\t * Get choices that can be searched (excluding placeholders)\n\t * @return {Array} Option objects\n\t */\n\n\t }, {\n\t key: 'getSearchableChoices',\n\t value: function getSearchableChoices() {\n\t var filtered = this.getChoicesFilteredBySelectable();\n\t return filtered.filter(function (choice) {\n\t return choice.placeholder !== true;\n\t });\n\t }\n\n\t /**\n\t * Get single choice by it's ID\n\t * @return {Object} Found choice\n\t */\n\n\t }, {\n\t key: 'getChoiceById',\n\t value: function getChoiceById(id) {\n\t if (id) {\n\t var choices = this.getChoicesFilteredByActive();\n\t var foundChoice = choices.find(function (choice) {\n\t return choice.id === parseInt(id, 10);\n\t });\n\t return foundChoice;\n\t }\n\t return false;\n\t }\n\n\t /**\n\t * Get groups from store\n\t * @return {Array} Group objects\n\t */\n\n\t }, {\n\t key: 'getGroups',\n\t value: function getGroups() {\n\t var state = this.store.getState();\n\t return state.groups;\n\t }\n\n\t /**\n\t * Get active groups from store\n\t * @return {Array} Group objects\n\t */\n\n\t }, {\n\t key: 'getGroupsFilteredByActive',\n\t value: function getGroupsFilteredByActive() {\n\t var groups = this.getGroups();\n\t var choices = this.getChoices();\n\n\t var values = groups.filter(function (group) {\n\t var isActive = group.active === true && group.disabled === false;\n\t var hasActiveOptions = choices.some(function (choice) {\n\t return choice.active === true && choice.disabled === false;\n\t });\n\t return isActive && hasActiveOptions;\n\t }, []);\n\n\t return values;\n\t }\n\n\t /**\n\t * Get group by group id\n\t * @param {Number} id Group ID\n\t * @return {Object} Group data\n\t */\n\n\t }, {\n\t key: 'getGroupById',\n\t value: function getGroupById(id) {\n\t var groups = this.getGroups();\n\t var foundGroup = groups.find(function (group) {\n\t return group.id === id;\n\t });\n\n\t return foundGroup;\n\t }\n\n\t /**\n\t * Get placeholder choice from store\n\t * @return {Object} Found placeholder\n\t */\n\n\t }, {\n\t key: 'getPlaceholderChoice',\n\t value: function getPlaceholderChoice() {\n\t var choices = this.getChoices();\n\t var placeholderChoice = [].concat(_toConsumableArray(choices)).reverse().find(function (choice) {\n\t return choice.placeholder === true;\n\t });\n\n\t return placeholderChoice;\n\t }\n\t }]);\n\n\t return Store;\n\t}();\n\n\texports.default = Store;\n\n\n\t\tmodule.exports = Store;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined;\n\n\tvar _createStore = __webpack_require__(6);\n\n\tvar _createStore2 = _interopRequireDefault(_createStore);\n\n\tvar _combineReducers = __webpack_require__(21);\n\n\tvar _combineReducers2 = _interopRequireDefault(_combineReducers);\n\n\tvar _bindActionCreators = __webpack_require__(23);\n\n\tvar _bindActionCreators2 = _interopRequireDefault(_bindActionCreators);\n\n\tvar _applyMiddleware = __webpack_require__(24);\n\n\tvar _applyMiddleware2 = _interopRequireDefault(_applyMiddleware);\n\n\tvar _compose = __webpack_require__(25);\n\n\tvar _compose2 = _interopRequireDefault(_compose);\n\n\tvar _warning = __webpack_require__(22);\n\n\tvar _warning2 = _interopRequireDefault(_warning);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*\n\t* This is a dummy function to check if the function name has been altered by minification.\n\t* If the function has been minified and NODE_ENV !== 'production', warn the user.\n\t*/\n\tfunction isCrushed() {}\n\n\tif (false) {\n\t (0, _warning2['default'])('You are currently using minified code outside of NODE_ENV === \\'production\\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');\n\t}\n\n\texports.createStore = _createStore2['default'];\n\texports.combineReducers = _combineReducers2['default'];\n\texports.bindActionCreators = _bindActionCreators2['default'];\n\texports.applyMiddleware = _applyMiddleware2['default'];\n\texports.compose = _compose2['default'];\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports.ActionTypes = undefined;\n\texports['default'] = createStore;\n\n\tvar _isPlainObject = __webpack_require__(7);\n\n\tvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\n\tvar _symbolObservable = __webpack_require__(17);\n\n\tvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/**\n\t * These are private action types reserved by Redux.\n\t * For any unknown actions, you must return the current state.\n\t * If the current state is undefined, you must return the initial state.\n\t * Do not reference these action types directly in your code.\n\t */\n\tvar ActionTypes = exports.ActionTypes = {\n\t INIT: '@@redux/INIT'\n\n\t /**\n\t * Creates a Redux store that holds the state tree.\n\t * The only way to change the data in the store is to call `dispatch()` on it.\n\t *\n\t * There should only be a single store in your app. To specify how different\n\t * parts of the state tree respond to actions, you may combine several reducers\n\t * into a single reducer function by using `combineReducers`.\n\t *\n\t * @param {Function} reducer A function that returns the next state tree, given\n\t * the current state tree and the action to handle.\n\t *\n\t * @param {any} [preloadedState] The initial state. You may optionally specify it\n\t * to hydrate the state from the server in universal apps, or to restore a\n\t * previously serialized user session.\n\t * If you use `combineReducers` to produce the root reducer function, this must be\n\t * an object with the same shape as `combineReducers` keys.\n\t *\n\t * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n\t * to enhance the store with third-party capabilities such as middleware,\n\t * time travel, persistence, etc. The only store enhancer that ships with Redux\n\t * is `applyMiddleware()`.\n\t *\n\t * @returns {Store} A Redux store that lets you read the state, dispatch actions\n\t * and subscribe to changes.\n\t */\n\t};function createStore(reducer, preloadedState, enhancer) {\n\t var _ref2;\n\n\t if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n\t enhancer = preloadedState;\n\t preloadedState = undefined;\n\t }\n\n\t if (typeof enhancer !== 'undefined') {\n\t if (typeof enhancer !== 'function') {\n\t throw new Error('Expected the enhancer to be a function.');\n\t }\n\n\t return enhancer(createStore)(reducer, preloadedState);\n\t }\n\n\t if (typeof reducer !== 'function') {\n\t throw new Error('Expected the reducer to be a function.');\n\t }\n\n\t var currentReducer = reducer;\n\t var currentState = preloadedState;\n\t var currentListeners = [];\n\t var nextListeners = currentListeners;\n\t var isDispatching = false;\n\n\t function ensureCanMutateNextListeners() {\n\t if (nextListeners === currentListeners) {\n\t nextListeners = currentListeners.slice();\n\t }\n\t }\n\n\t /**\n\t * Reads the state tree managed by the store.\n\t *\n\t * @returns {any} The current state tree of your application.\n\t */\n\t function getState() {\n\t return currentState;\n\t }\n\n\t /**\n\t * Adds a change listener. It will be called any time an action is dispatched,\n\t * and some part of the state tree may potentially have changed. You may then\n\t * call `getState()` to read the current state tree inside the callback.\n\t *\n\t * You may call `dispatch()` from a change listener, with the following\n\t * caveats:\n\t *\n\t * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n\t * If you subscribe or unsubscribe while the listeners are being invoked, this\n\t * will not have any effect on the `dispatch()` that is currently in progress.\n\t * However, the next `dispatch()` call, whether nested or not, will use a more\n\t * recent snapshot of the subscription list.\n\t *\n\t * 2. The listener should not expect to see all state changes, as the state\n\t * might have been updated multiple times during a nested `dispatch()` before\n\t * the listener is called. It is, however, guaranteed that all subscribers\n\t * registered before the `dispatch()` started will be called with the latest\n\t * state by the time it exits.\n\t *\n\t * @param {Function} listener A callback to be invoked on every dispatch.\n\t * @returns {Function} A function to remove this change listener.\n\t */\n\t function subscribe(listener) {\n\t if (typeof listener !== 'function') {\n\t throw new Error('Expected listener to be a function.');\n\t }\n\n\t var isSubscribed = true;\n\n\t ensureCanMutateNextListeners();\n\t nextListeners.push(listener);\n\n\t return function unsubscribe() {\n\t if (!isSubscribed) {\n\t return;\n\t }\n\n\t isSubscribed = false;\n\n\t ensureCanMutateNextListeners();\n\t var index = nextListeners.indexOf(listener);\n\t nextListeners.splice(index, 1);\n\t };\n\t }\n\n\t /**\n\t * Dispatches an action. It is the only way to trigger a state change.\n\t *\n\t * The `reducer` function, used to create the store, will be called with the\n\t * current state tree and the given `action`. Its return value will\n\t * be considered the **next** state of the tree, and the change listeners\n\t * will be notified.\n\t *\n\t * The base implementation only supports plain object actions. If you want to\n\t * dispatch a Promise, an Observable, a thunk, or something else, you need to\n\t * wrap your store creating function into the corresponding middleware. For\n\t * example, see the documentation for the `redux-thunk` package. Even the\n\t * middleware will eventually dispatch plain object actions using this method.\n\t *\n\t * @param {Object} action A plain object representing “what changed”. It is\n\t * a good idea to keep actions serializable so you can record and replay user\n\t * sessions, or use the time travelling `redux-devtools`. An action must have\n\t * a `type` property which may not be `undefined`. It is a good idea to use\n\t * string constants for action types.\n\t *\n\t * @returns {Object} For convenience, the same action object you dispatched.\n\t *\n\t * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n\t * return something else (for example, a Promise you can await).\n\t */\n\t function dispatch(action) {\n\t if (!(0, _isPlainObject2['default'])(action)) {\n\t throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');\n\t }\n\n\t if (typeof action.type === 'undefined') {\n\t throw new Error('Actions may not have an undefined \"type\" property. ' + 'Have you misspelled a constant?');\n\t }\n\n\t if (isDispatching) {\n\t throw new Error('Reducers may not dispatch actions.');\n\t }\n\n\t try {\n\t isDispatching = true;\n\t currentState = currentReducer(currentState, action);\n\t } finally {\n\t isDispatching = false;\n\t }\n\n\t var listeners = currentListeners = nextListeners;\n\t for (var i = 0; i < listeners.length; i++) {\n\t var listener = listeners[i];\n\t listener();\n\t }\n\n\t return action;\n\t }\n\n\t /**\n\t * Replaces the reducer currently used by the store to calculate the state.\n\t *\n\t * You might need this if your app implements code splitting and you want to\n\t * load some of the reducers dynamically. You might also need this if you\n\t * implement a hot reloading mechanism for Redux.\n\t *\n\t * @param {Function} nextReducer The reducer for the store to use instead.\n\t * @returns {void}\n\t */\n\t function replaceReducer(nextReducer) {\n\t if (typeof nextReducer !== 'function') {\n\t throw new Error('Expected the nextReducer to be a function.');\n\t }\n\n\t currentReducer = nextReducer;\n\t dispatch({ type: ActionTypes.INIT });\n\t }\n\n\t /**\n\t * Interoperability point for observable/reactive libraries.\n\t * @returns {observable} A minimal observable of state changes.\n\t * For more information, see the observable proposal:\n\t * https://github.com/tc39/proposal-observable\n\t */\n\t function observable() {\n\t var _ref;\n\n\t var outerSubscribe = subscribe;\n\t return _ref = {\n\t /**\n\t * The minimal observable subscription method.\n\t * @param {Object} observer Any object that can be used as an observer.\n\t * The observer object should have a `next` method.\n\t * @returns {subscription} An object with an `unsubscribe` method that can\n\t * be used to unsubscribe the observable from the store, and prevent further\n\t * emission of values from the observable.\n\t */\n\t subscribe: function subscribe(observer) {\n\t if (typeof observer !== 'object') {\n\t throw new TypeError('Expected the observer to be an object.');\n\t }\n\n\t function observeState() {\n\t if (observer.next) {\n\t observer.next(getState());\n\t }\n\t }\n\n\t observeState();\n\t var unsubscribe = outerSubscribe(observeState);\n\t return { unsubscribe: unsubscribe };\n\t }\n\t }, _ref[_symbolObservable2['default']] = function () {\n\t return this;\n\t }, _ref;\n\t }\n\n\t // When a store is created, an \"INIT\" action is dispatched so that every\n\t // reducer returns their initial state. This effectively populates\n\t // the initial state tree.\n\t dispatch({ type: ActionTypes.INIT });\n\n\t return _ref2 = {\n\t dispatch: dispatch,\n\t subscribe: subscribe,\n\t getState: getState,\n\t replaceReducer: replaceReducer\n\t }, _ref2[_symbolObservable2['default']] = observable, _ref2;\n\t}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar baseGetTag = __webpack_require__(8),\n\t getPrototype = __webpack_require__(14),\n\t isObjectLike = __webpack_require__(16);\n\n\t/** `Object#toString` result references. */\n\tvar objectTag = '[object Object]';\n\n\t/** Used for built-in method references. */\n\tvar funcProto = Function.prototype,\n\t objectProto = Object.prototype;\n\n\t/** Used to resolve the decompiled source of functions. */\n\tvar funcToString = funcProto.toString;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/** Used to infer the `Object` constructor. */\n\tvar objectCtorString = funcToString.call(Object);\n\n\t/**\n\t * Checks if `value` is a plain object, that is, an object created by the\n\t * `Object` constructor or one with a `[[Prototype]]` of `null`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.8.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * }\n\t *\n\t * _.isPlainObject(new Foo);\n\t * // => false\n\t *\n\t * _.isPlainObject([1, 2, 3]);\n\t * // => false\n\t *\n\t * _.isPlainObject({ 'x': 0, 'y': 0 });\n\t * // => true\n\t *\n\t * _.isPlainObject(Object.create(null));\n\t * // => true\n\t */\n\tfunction isPlainObject(value) {\n\t if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n\t return false;\n\t }\n\t var proto = getPrototype(value);\n\t if (proto === null) {\n\t return true;\n\t }\n\t var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n\t return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n\t funcToString.call(Ctor) == objectCtorString;\n\t}\n\n\tmodule.exports = isPlainObject;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(9),\n\t getRawTag = __webpack_require__(12),\n\t objectToString = __webpack_require__(13);\n\n\t/** `Object#toString` result references. */\n\tvar nullTag = '[object Null]',\n\t undefinedTag = '[object Undefined]';\n\n\t/** Built-in value references. */\n\tvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n\t/**\n\t * The base implementation of `getTag` without fallbacks for buggy environments.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {string} Returns the `toStringTag`.\n\t */\n\tfunction baseGetTag(value) {\n\t if (value == null) {\n\t return value === undefined ? undefinedTag : nullTag;\n\t }\n\t return (symToStringTag && symToStringTag in Object(value))\n\t ? getRawTag(value)\n\t : objectToString(value);\n\t}\n\n\tmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar root = __webpack_require__(10);\n\n\t/** Built-in value references. */\n\tvar Symbol = root.Symbol;\n\n\tmodule.exports = Symbol;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar freeGlobal = __webpack_require__(11);\n\n\t/** Detect free variable `self`. */\n\tvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n\t/** Used as a reference to the global object. */\n\tvar root = freeGlobal || freeSelf || Function('return this')();\n\n\tmodule.exports = root;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\n\tvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n\tmodule.exports = freeGlobal;\n\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(9);\n\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar nativeObjectToString = objectProto.toString;\n\n\t/** Built-in value references. */\n\tvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n\t/**\n\t * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {string} Returns the raw `toStringTag`.\n\t */\n\tfunction getRawTag(value) {\n\t var isOwn = hasOwnProperty.call(value, symToStringTag),\n\t tag = value[symToStringTag];\n\n\t try {\n\t value[symToStringTag] = undefined;\n\t var unmasked = true;\n\t } catch (e) {}\n\n\t var result = nativeObjectToString.call(value);\n\t if (unmasked) {\n\t if (isOwn) {\n\t value[symToStringTag] = tag;\n\t } else {\n\t delete value[symToStringTag];\n\t }\n\t }\n\t return result;\n\t}\n\n\tmodule.exports = getRawTag;\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar nativeObjectToString = objectProto.toString;\n\n\t/**\n\t * Converts `value` to a string using `Object.prototype.toString`.\n\t *\n\t * @private\n\t * @param {*} value The value to convert.\n\t * @returns {string} Returns the converted string.\n\t */\n\tfunction objectToString(value) {\n\t return nativeObjectToString.call(value);\n\t}\n\n\tmodule.exports = objectToString;\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar overArg = __webpack_require__(15);\n\n\t/** Built-in value references. */\n\tvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\n\tmodule.exports = getPrototype;\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Creates a unary function that invokes `func` with its argument transformed.\n\t *\n\t * @private\n\t * @param {Function} func The function to wrap.\n\t * @param {Function} transform The argument transform.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction overArg(func, transform) {\n\t return function(arg) {\n\t return func(transform(arg));\n\t };\n\t}\n\n\tmodule.exports = overArg;\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return value != null && typeof value == 'object';\n\t}\n\n\tmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(18);\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, module) {'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _ponyfill = __webpack_require__(20);\n\n\tvar _ponyfill2 = _interopRequireDefault(_ponyfill);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tvar root; /* global window */\n\n\n\tif (typeof self !== 'undefined') {\n\t root = self;\n\t} else if (typeof window !== 'undefined') {\n\t root = window;\n\t} else if (typeof global !== 'undefined') {\n\t root = global;\n\t} else if (true) {\n\t root = module;\n\t} else {\n\t root = Function('return this')();\n\t}\n\n\tvar result = (0, _ponyfill2['default'])(root);\n\texports['default'] = result;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(19)(module)))\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\n\tmodule.exports = function(module) {\r\n\t\tif(!module.webpackPolyfill) {\r\n\t\t\tmodule.deprecate = function() {};\r\n\t\t\tmodule.paths = [];\r\n\t\t\t// module.parent = undefined by default\r\n\t\t\tmodule.children = [];\r\n\t\t\tmodule.webpackPolyfill = 1;\r\n\t\t}\r\n\t\treturn module;\r\n\t}\r\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t\tvalue: true\n\t});\n\texports['default'] = symbolObservablePonyfill;\n\tfunction symbolObservablePonyfill(root) {\n\t\tvar result;\n\t\tvar _Symbol = root.Symbol;\n\n\t\tif (typeof _Symbol === 'function') {\n\t\t\tif (_Symbol.observable) {\n\t\t\t\tresult = _Symbol.observable;\n\t\t\t} else {\n\t\t\t\tresult = _Symbol('observable');\n\t\t\t\t_Symbol.observable = result;\n\t\t\t}\n\t\t} else {\n\t\t\tresult = '@@observable';\n\t\t}\n\n\t\treturn result;\n\t};\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports['default'] = combineReducers;\n\n\tvar _createStore = __webpack_require__(6);\n\n\tvar _isPlainObject = __webpack_require__(7);\n\n\tvar _isPlainObject2 = _interopRequireDefault(_isPlainObject);\n\n\tvar _warning = __webpack_require__(22);\n\n\tvar _warning2 = _interopRequireDefault(_warning);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\tfunction getUndefinedStateErrorMessage(key, action) {\n\t var actionType = action && action.type;\n\t var actionName = actionType && '\"' + actionType.toString() + '\"' || 'an action';\n\n\t return 'Given action ' + actionName + ', reducer \"' + key + '\" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state. ' + 'If you want this reducer to hold no value, you can return null instead of undefined.';\n\t}\n\n\tfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n\t var reducerKeys = Object.keys(reducers);\n\t var argumentName = action && action.type === _createStore.ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n\t if (reducerKeys.length === 0) {\n\t return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n\t }\n\n\t if (!(0, _isPlainObject2['default'])(inputState)) {\n\t return 'The ' + argumentName + ' has unexpected type of \"' + {}.toString.call(inputState).match(/\\s([a-z|A-Z]+)/)[1] + '\". Expected argument to be an object with the following ' + ('keys: \"' + reducerKeys.join('\", \"') + '\"');\n\t }\n\n\t var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n\t return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n\t });\n\n\t unexpectedKeys.forEach(function (key) {\n\t unexpectedKeyCache[key] = true;\n\t });\n\n\t if (unexpectedKeys.length > 0) {\n\t return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('\"' + unexpectedKeys.join('\", \"') + '\" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('\"' + reducerKeys.join('\", \"') + '\". Unexpected keys will be ignored.');\n\t }\n\t}\n\n\tfunction assertReducerShape(reducers) {\n\t Object.keys(reducers).forEach(function (key) {\n\t var reducer = reducers[key];\n\t var initialState = reducer(undefined, { type: _createStore.ActionTypes.INIT });\n\n\t if (typeof initialState === 'undefined') {\n\t throw new Error('Reducer \"' + key + '\" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined. If you don\\'t want to set a value for this reducer, ' + 'you can use null instead of undefined.');\n\t }\n\n\t var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.');\n\t if (typeof reducer(undefined, { type: type }) === 'undefined') {\n\t throw new Error('Reducer \"' + key + '\" returned undefined when probed with a random type. ' + ('Don\\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in \"redux/*\" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined, but can be null.');\n\t }\n\t });\n\t}\n\n\t/**\n\t * Turns an object whose values are different reducer functions, into a single\n\t * reducer function. It will call every child reducer, and gather their results\n\t * into a single state object, whose keys correspond to the keys of the passed\n\t * reducer functions.\n\t *\n\t * @param {Object} reducers An object whose values correspond to different\n\t * reducer functions that need to be combined into one. One handy way to obtain\n\t * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n\t * undefined for any action. Instead, they should return their initial state\n\t * if the state passed to them was undefined, and the current state for any\n\t * unrecognized action.\n\t *\n\t * @returns {Function} A reducer function that invokes every reducer inside the\n\t * passed object, and builds a state object with the same shape.\n\t */\n\tfunction combineReducers(reducers) {\n\t var reducerKeys = Object.keys(reducers);\n\t var finalReducers = {};\n\t for (var i = 0; i < reducerKeys.length; i++) {\n\t var key = reducerKeys[i];\n\n\t if (false) {\n\t if (typeof reducers[key] === 'undefined') {\n\t (0, _warning2['default'])('No reducer provided for key \"' + key + '\"');\n\t }\n\t }\n\n\t if (typeof reducers[key] === 'function') {\n\t finalReducers[key] = reducers[key];\n\t }\n\t }\n\t var finalReducerKeys = Object.keys(finalReducers);\n\n\t var unexpectedKeyCache = void 0;\n\t if (false) {\n\t unexpectedKeyCache = {};\n\t }\n\n\t var shapeAssertionError = void 0;\n\t try {\n\t assertReducerShape(finalReducers);\n\t } catch (e) {\n\t shapeAssertionError = e;\n\t }\n\n\t return function combination() {\n\t var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\t var action = arguments[1];\n\n\t if (shapeAssertionError) {\n\t throw shapeAssertionError;\n\t }\n\n\t if (false) {\n\t var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\t if (warningMessage) {\n\t (0, _warning2['default'])(warningMessage);\n\t }\n\t }\n\n\t var hasChanged = false;\n\t var nextState = {};\n\t for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n\t var _key = finalReducerKeys[_i];\n\t var reducer = finalReducers[_key];\n\t var previousStateForKey = state[_key];\n\t var nextStateForKey = reducer(previousStateForKey, action);\n\t if (typeof nextStateForKey === 'undefined') {\n\t var errorMessage = getUndefinedStateErrorMessage(_key, action);\n\t throw new Error(errorMessage);\n\t }\n\t nextState[_key] = nextStateForKey;\n\t hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n\t }\n\t return hasChanged ? nextState : state;\n\t };\n\t}\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports['default'] = warning;\n\t/**\n\t * Prints a warning in the console if it exists.\n\t *\n\t * @param {String} message The warning message.\n\t * @returns {void}\n\t */\n\tfunction warning(message) {\n\t /* eslint-disable no-console */\n\t if (typeof console !== 'undefined' && typeof console.error === 'function') {\n\t console.error(message);\n\t }\n\t /* eslint-enable no-console */\n\t try {\n\t // This error was thrown as a convenience so that if you enable\n\t // \"break on all exceptions\" in your console,\n\t // it would pause the execution at this line.\n\t throw new Error(message);\n\t /* eslint-disable no-empty */\n\t } catch (e) {}\n\t /* eslint-enable no-empty */\n\t}\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports['default'] = bindActionCreators;\n\tfunction bindActionCreator(actionCreator, dispatch) {\n\t return function () {\n\t return dispatch(actionCreator.apply(undefined, arguments));\n\t };\n\t}\n\n\t/**\n\t * Turns an object whose values are action creators, into an object with the\n\t * same keys, but with every function wrapped into a `dispatch` call so they\n\t * may be invoked directly. This is just a convenience method, as you can call\n\t * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n\t *\n\t * For convenience, you can also pass a single function as the first argument,\n\t * and get a function in return.\n\t *\n\t * @param {Function|Object} actionCreators An object whose values are action\n\t * creator functions. One handy way to obtain it is to use ES6 `import * as`\n\t * syntax. You may also pass a single function.\n\t *\n\t * @param {Function} dispatch The `dispatch` function available on your Redux\n\t * store.\n\t *\n\t * @returns {Function|Object} The object mimicking the original object, but with\n\t * every action creator wrapped into the `dispatch` call. If you passed a\n\t * function as `actionCreators`, the return value will also be a single\n\t * function.\n\t */\n\tfunction bindActionCreators(actionCreators, dispatch) {\n\t if (typeof actionCreators === 'function') {\n\t return bindActionCreator(actionCreators, dispatch);\n\t }\n\n\t if (typeof actionCreators !== 'object' || actionCreators === null) {\n\t throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators) + '. ' + 'Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');\n\t }\n\n\t var keys = Object.keys(actionCreators);\n\t var boundActionCreators = {};\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t var actionCreator = actionCreators[key];\n\t if (typeof actionCreator === 'function') {\n\t boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n\t }\n\t }\n\t return boundActionCreators;\n\t}\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\n\tvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\texports['default'] = applyMiddleware;\n\n\tvar _compose = __webpack_require__(25);\n\n\tvar _compose2 = _interopRequireDefault(_compose);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/**\n\t * Creates a store enhancer that applies middleware to the dispatch method\n\t * of the Redux store. This is handy for a variety of tasks, such as expressing\n\t * asynchronous actions in a concise manner, or logging every action payload.\n\t *\n\t * See `redux-thunk` package as an example of the Redux middleware.\n\t *\n\t * Because middleware is potentially asynchronous, this should be the first\n\t * store enhancer in the composition chain.\n\t *\n\t * Note that each middleware will be given the `dispatch` and `getState` functions\n\t * as named arguments.\n\t *\n\t * @param {...Function} middlewares The middleware chain to be applied.\n\t * @returns {Function} A store enhancer applying the middleware.\n\t */\n\tfunction applyMiddleware() {\n\t for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {\n\t middlewares[_key] = arguments[_key];\n\t }\n\n\t return function (createStore) {\n\t return function (reducer, preloadedState, enhancer) {\n\t var store = createStore(reducer, preloadedState, enhancer);\n\t var _dispatch = store.dispatch;\n\t var chain = [];\n\n\t var middlewareAPI = {\n\t getState: store.getState,\n\t dispatch: function dispatch(action) {\n\t return _dispatch(action);\n\t }\n\t };\n\t chain = middlewares.map(function (middleware) {\n\t return middleware(middlewareAPI);\n\t });\n\t _dispatch = _compose2['default'].apply(undefined, chain)(store.dispatch);\n\n\t return _extends({}, store, {\n\t dispatch: _dispatch\n\t });\n\t };\n\t };\n\t}\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\n\t\"use strict\";\n\n\texports.__esModule = true;\n\texports[\"default\"] = compose;\n\t/**\n\t * Composes single-argument functions from right to left. The rightmost\n\t * function can take multiple arguments as it provides the signature for\n\t * the resulting composite function.\n\t *\n\t * @param {...Function} funcs The functions to compose.\n\t * @returns {Function} A function obtained by composing the argument functions\n\t * from right to left. For example, compose(f, g, h) is identical to doing\n\t * (...args) => f(g(h(...args))).\n\t */\n\n\tfunction compose() {\n\t for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {\n\t funcs[_key] = arguments[_key];\n\t }\n\n\t if (funcs.length === 0) {\n\t return function (arg) {\n\t return arg;\n\t };\n\t }\n\n\t if (funcs.length === 1) {\n\t return funcs[0];\n\t }\n\n\t return funcs.reduce(function (a, b) {\n\t return function () {\n\t return a(b.apply(undefined, arguments));\n\t };\n\t });\n\t}\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _redux = __webpack_require__(5);\n\n\tvar _items = __webpack_require__(27);\n\n\tvar _items2 = _interopRequireDefault(_items);\n\n\tvar _groups = __webpack_require__(28);\n\n\tvar _groups2 = _interopRequireDefault(_groups);\n\n\tvar _choices = __webpack_require__(29);\n\n\tvar _choices2 = _interopRequireDefault(_choices);\n\n\tvar _general = __webpack_require__(30);\n\n\tvar _general2 = _interopRequireDefault(_general);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tvar appReducer = (0, _redux.combineReducers)({\n\t items: _items2.default,\n\t groups: _groups2.default,\n\t choices: _choices2.default,\n\t general: _general2.default\n\t});\n\n\tvar rootReducer = function rootReducer(passedState, action) {\n\t var state = passedState;\n\t // If we are clearing all items, groups and options we reassign\n\t // state and then pass that state to our proper reducer. This isn't\n\t // mutating our actual state\n\t // See: http://stackoverflow.com/a/35641992\n\t if (action.type === 'CLEAR_ALL') {\n\t state = undefined;\n\t }\n\n\t return appReducer(state, action);\n\t};\n\n\texports.default = rootReducer;\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tvar items = function items() {\n\t var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\t var action = arguments[1];\n\n\t switch (action.type) {\n\t case 'ADD_ITEM':\n\t {\n\t // Add object to items array\n\t var newState = [].concat(_toConsumableArray(state), [{\n\t id: action.id,\n\t choiceId: action.choiceId,\n\t groupId: action.groupId,\n\t value: action.value,\n\t label: action.label,\n\t active: true,\n\t highlighted: false,\n\t customProperties: action.customProperties,\n\t placeholder: action.placeholder || false,\n\t keyCode: null\n\t }]);\n\n\t return newState.map(function (item) {\n\t if (item.highlighted) {\n\t item.highlighted = false;\n\t }\n\t return item;\n\t });\n\t }\n\n\t case 'REMOVE_ITEM':\n\t {\n\t // Set item to inactive\n\t return state.map(function (item) {\n\t if (item.id === action.id) {\n\t item.active = false;\n\t }\n\t return item;\n\t });\n\t }\n\n\t case 'HIGHLIGHT_ITEM':\n\t {\n\t return state.map(function (item) {\n\t if (item.id === action.id) {\n\t item.highlighted = action.highlighted;\n\t }\n\t return item;\n\t });\n\t }\n\n\t default:\n\t {\n\t return state;\n\t }\n\t }\n\t};\n\n\texports.default = items;\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tvar groups = function groups() {\n\t var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\t var action = arguments[1];\n\n\t switch (action.type) {\n\t case 'ADD_GROUP':\n\t {\n\t return [].concat(_toConsumableArray(state), [{\n\t id: action.id,\n\t value: action.value,\n\t active: action.active,\n\t disabled: action.disabled\n\t }]);\n\t }\n\n\t case 'CLEAR_CHOICES':\n\t {\n\t return state.groups = [];\n\t }\n\n\t default:\n\t {\n\t return state;\n\t }\n\t }\n\t};\n\n\texports.default = groups;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tvar choices = function choices() {\n\t var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\t var action = arguments[1];\n\n\t switch (action.type) {\n\t case 'ADD_CHOICE':\n\t {\n\t /*\n\t A disabled choice appears in the choice dropdown but cannot be selected\n\t A selected choice has been added to the passed input's value (added as an item)\n\t An active choice appears within the choice dropdown\n\t */\n\t return [].concat(_toConsumableArray(state), [{\n\t id: action.id,\n\t elementId: action.elementId,\n\t groupId: action.groupId,\n\t value: action.value,\n\t label: action.label || action.value,\n\t disabled: action.disabled || false,\n\t selected: false,\n\t active: true,\n\t score: 9999,\n\t customProperties: action.customProperties,\n\t placeholder: action.placeholder || false,\n\t keyCode: null\n\t }]);\n\t }\n\n\t case 'ADD_ITEM':\n\t {\n\t var newState = state;\n\n\t // If all choices need to be activated\n\t if (action.activateOptions) {\n\t newState = state.map(function (choice) {\n\t choice.active = action.active;\n\t return choice;\n\t });\n\t }\n\t // When an item is added and it has an associated choice,\n\t // we want to disable it so it can't be chosen again\n\t if (action.choiceId > -1) {\n\t newState = state.map(function (choice) {\n\t if (choice.id === parseInt(action.choiceId, 10)) {\n\t choice.selected = true;\n\t }\n\t return choice;\n\t });\n\t }\n\n\t return newState;\n\t }\n\n\t case 'REMOVE_ITEM':\n\t {\n\t // When an item is removed and it has an associated choice,\n\t // we want to re-enable it so it can be chosen again\n\t if (action.choiceId > -1) {\n\t return state.map(function (choice) {\n\t if (choice.id === parseInt(action.choiceId, 10)) {\n\t choice.selected = false;\n\t }\n\t return choice;\n\t });\n\t }\n\n\t return state;\n\t }\n\n\t case 'FILTER_CHOICES':\n\t {\n\t var filteredResults = action.results;\n\t var filteredState = state.map(function (choice) {\n\t // Set active state based on whether choice is\n\t // within filtered results\n\n\t choice.active = filteredResults.some(function (result) {\n\t if (result.item.id === choice.id) {\n\t choice.score = result.score;\n\t return true;\n\t }\n\t return false;\n\t });\n\n\t return choice;\n\t });\n\n\t return filteredState;\n\t }\n\n\t case 'ACTIVATE_CHOICES':\n\t {\n\t return state.map(function (choice) {\n\t choice.active = action.active;\n\t return choice;\n\t });\n\t }\n\n\t case 'CLEAR_CHOICES':\n\t {\n\t return state.choices = [];\n\t }\n\n\t default:\n\t {\n\t return state;\n\t }\n\t }\n\t};\n\n\texports.default = choices;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar general = function general() {\n\t var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { loading: false };\n\t var action = arguments[1];\n\n\t switch (action.type) {\n\t case 'LOADING':\n\t {\n\t return {\n\t loading: action.isLoading\n\t };\n\t }\n\n\t default:\n\t {\n\t return state;\n\t }\n\t }\n\t};\n\n\texports.default = general;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar addItem = exports.addItem = function addItem(value, label, id, choiceId, groupId, customProperties, placeholder, keyCode) {\n\t return {\n\t type: 'ADD_ITEM',\n\t value: value,\n\t label: label,\n\t id: id,\n\t choiceId: choiceId,\n\t groupId: groupId,\n\t customProperties: customProperties,\n\t placeholder: placeholder,\n\t keyCode: keyCode\n\t };\n\t};\n\n\tvar removeItem = exports.removeItem = function removeItem(id, choiceId) {\n\t return {\n\t type: 'REMOVE_ITEM',\n\t id: id,\n\t choiceId: choiceId\n\t };\n\t};\n\n\tvar highlightItem = exports.highlightItem = function highlightItem(id, highlighted) {\n\t return {\n\t type: 'HIGHLIGHT_ITEM',\n\t id: id,\n\t highlighted: highlighted\n\t };\n\t};\n\n\tvar addChoice = exports.addChoice = function addChoice(value, label, id, groupId, disabled, elementId, customProperties, placeholder, keyCode) {\n\t return {\n\t type: 'ADD_CHOICE',\n\t value: value,\n\t label: label,\n\t id: id,\n\t groupId: groupId,\n\t disabled: disabled,\n\t elementId: elementId,\n\t customProperties: customProperties,\n\t placeholder: placeholder,\n\t keyCode: keyCode\n\t };\n\t};\n\n\tvar filterChoices = exports.filterChoices = function filterChoices(results) {\n\t return {\n\t type: 'FILTER_CHOICES',\n\t results: results\n\t };\n\t};\n\n\tvar activateChoices = exports.activateChoices = function activateChoices() {\n\t var active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t return {\n\t type: 'ACTIVATE_CHOICES',\n\t active: active\n\t };\n\t};\n\n\tvar clearChoices = exports.clearChoices = function clearChoices() {\n\t return {\n\t type: 'CLEAR_CHOICES'\n\t };\n\t};\n\n\tvar addGroup = exports.addGroup = function addGroup(value, id, active, disabled) {\n\t return {\n\t type: 'ADD_GROUP',\n\t value: value,\n\t id: id,\n\t active: active,\n\t disabled: disabled\n\t };\n\t};\n\n\tvar clearAll = exports.clearAll = function clearAll() {\n\t return {\n\t type: 'CLEAR_ALL'\n\t };\n\t};\n\n\tvar setIsLoading = exports.setIsLoading = function setIsLoading(isLoading) {\n\t return {\n\t type: 'LOADING',\n\t isLoading: isLoading\n\t };\n\t\t};\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\t/* eslint-disable */\n\t/**\n\t * Capitalises the first letter of each word in a string\n\t * @param {String} str String to capitalise\n\t * @return {String} Capitalised string\n\t */\n\tvar capitalise = exports.capitalise = function capitalise(str) {\n\t return str.replace(/\\w\\S*/g, function (txt) {\n\t return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n\t });\n\t};\n\n\t/**\n\t * Generates a string of random chars\n\t * @param {Number} length Length of the string to generate\n\t * @return {String} String of random chars\n\t */\n\tvar generateChars = exports.generateChars = function generateChars(length) {\n\t var chars = '';\n\n\t for (var i = 0; i < length; i++) {\n\t var randomChar = getRandomNumber(0, 36);\n\t chars += randomChar.toString(36);\n\t }\n\n\t return chars;\n\t};\n\n\t/**\n\t * Generates a unique id based on an element\n\t * @param {HTMLElement} element Element to generate the id from\n\t * @param {String} Prefix for the Id\n\t * @return {String} Unique Id\n\t */\n\tvar generateId = exports.generateId = function generateId(element, prefix) {\n\t var id = element.id || element.name && element.name + '-' + generateChars(2) || generateChars(4);\n\t id = id.replace(/(:|\\.|\\[|\\]|,)/g, '');\n\t id = prefix + id;\n\n\t return id;\n\t};\n\n\t/**\n\t * Tests the type of an object\n\t * @param {String} type Type to test object against\n\t * @param {Object} obj Object to be tested\n\t * @return {Boolean}\n\t */\n\tvar getType = exports.getType = function getType(obj) {\n\t return Object.prototype.toString.call(obj).slice(8, -1);\n\t};\n\n\t/**\n\t * Tests the type of an object\n\t * @param {String} type Type to test object against\n\t * @param {Object} obj Object to be tested\n\t * @return {Boolean}\n\t */\n\tvar isType = exports.isType = function isType(type, obj) {\n\t var clas = getType(obj);\n\t return obj !== undefined && obj !== null && clas === type;\n\t};\n\n\t/**\n\t * Tests to see if a passed object is a node\n\t * @param {Object} obj Object to be tested\n\t * @return {Boolean}\n\t */\n\tvar isNode = exports.isNode = function isNode(o) {\n\t return (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === \"object\" ? o instanceof Node : o && (typeof o === 'undefined' ? 'undefined' : _typeof(o)) === \"object\" && typeof o.nodeType === \"number\" && typeof o.nodeName === \"string\";\n\t};\n\n\t/**\n\t * Tests to see if a passed object is an element\n\t * @param {Object} obj Object to be tested\n\t * @return {Boolean}\n\t */\n\tvar isElement = exports.isElement = function isElement(o) {\n\t return (typeof HTMLElement === 'undefined' ? 'undefined' : _typeof(HTMLElement)) === \"object\" ? o instanceof HTMLElement : //DOM2\n\t o && (typeof o === 'undefined' ? 'undefined' : _typeof(o)) === \"object\" && o !== null && o.nodeType === 1 && typeof o.nodeName === \"string\";\n\t};\n\n\t/**\n\t * Merges unspecified amount of objects into new object\n\t * @private\n\t * @return {Object} Merged object of arguments\n\t */\n\tvar extend = exports.extend = function extend() {\n\t var extended = {};\n\t var length = arguments.length;\n\n\t /**\n\t * Merge one object into another\n\t * @param {Object} obj Object to merge into extended object\n\t */\n\t var merge = function merge(obj) {\n\t for (var prop in obj) {\n\t if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n\t // If deep merge and property is an object, merge properties\n\t if (isType('Object', obj[prop])) {\n\t extended[prop] = extend(true, extended[prop], obj[prop]);\n\t } else {\n\t extended[prop] = obj[prop];\n\t }\n\t }\n\t }\n\t };\n\n\t // Loop through each passed argument\n\t for (var i = 0; i < length; i++) {\n\t // store argument at position i\n\t var obj = arguments[i];\n\n\t // If we are in fact dealing with an object, merge it.\n\t if (isType('Object', obj)) {\n\t merge(obj);\n\t }\n\t }\n\n\t return extended;\n\t};\n\n\t/**\n\t * CSS transition end event listener\n\t * @return\n\t */\n\tvar whichTransitionEvent = exports.whichTransitionEvent = function whichTransitionEvent() {\n\t var t,\n\t el = document.createElement('fakeelement');\n\n\t var transitions = {\n\t 'transition': 'transitionend',\n\t 'OTransition': 'oTransitionEnd',\n\t 'MozTransition': 'transitionend',\n\t 'WebkitTransition': 'webkitTransitionEnd'\n\t };\n\n\t for (t in transitions) {\n\t if (el.style[t] !== undefined) {\n\t return transitions[t];\n\t }\n\t }\n\t};\n\n\t/**\n\t * CSS animation end event listener\n\t * @return\n\t */\n\tvar whichAnimationEvent = exports.whichAnimationEvent = function whichAnimationEvent() {\n\t var t,\n\t el = document.createElement('fakeelement');\n\n\t var animations = {\n\t 'animation': 'animationend',\n\t 'OAnimation': 'oAnimationEnd',\n\t 'MozAnimation': 'animationend',\n\t 'WebkitAnimation': 'webkitAnimationEnd'\n\t };\n\n\t for (t in animations) {\n\t if (el.style[t] !== undefined) {\n\t return animations[t];\n\t }\n\t }\n\t};\n\n\t/**\n\t * Get the ancestors of each element in the current set of matched elements,\n\t * up to but not including the element matched by the selector\n\t * @param {NodeElement} elem Element to begin search from\n\t * @param {NodeElement} parent Parent to find\n\t * @param {String} selector Class to find\n\t * @return {Array} Array of parent elements\n\t */\n\tvar getParentsUntil = exports.getParentsUntil = function getParentsUntil(elem, parent, selector) {\n\t var parents = [];\n\t // Get matches\n\t for (; elem && elem !== document; elem = elem.parentNode) {\n\n\t // Check if parent has been reached\n\t if (parent) {\n\n\t var parentType = parent.charAt(0);\n\n\t // If parent is a class\n\t if (parentType === '.') {\n\t if (elem.classList.contains(parent.substr(1))) {\n\t break;\n\t }\n\t }\n\n\t // If parent is an ID\n\t if (parentType === '#') {\n\t if (elem.id === parent.substr(1)) {\n\t break;\n\t }\n\t }\n\n\t // If parent is a data attribute\n\t if (parentType === '[') {\n\t if (elem.hasAttribute(parent.substr(1, parent.length - 1))) {\n\t break;\n\t }\n\t }\n\n\t // If parent is a tag\n\t if (elem.tagName.toLowerCase() === parent) {\n\t break;\n\t }\n\t }\n\t if (selector) {\n\t var selectorType = selector.charAt(0);\n\n\t // If selector is a class\n\t if (selectorType === '.') {\n\t if (elem.classList.contains(selector.substr(1))) {\n\t parents.push(elem);\n\t }\n\t }\n\n\t // If selector is an ID\n\t if (selectorType === '#') {\n\t if (elem.id === selector.substr(1)) {\n\t parents.push(elem);\n\t }\n\t }\n\n\t // If selector is a data attribute\n\t if (selectorType === '[') {\n\t if (elem.hasAttribute(selector.substr(1, selector.length - 1))) {\n\t parents.push(elem);\n\t }\n\t }\n\n\t // If selector is a tag\n\t if (elem.tagName.toLowerCase() === selector) {\n\t parents.push(elem);\n\t }\n\t } else {\n\t parents.push(elem);\n\t }\n\t }\n\n\t // Return parents if any exist\n\t if (parents.length === 0) {\n\t return null;\n\t } else {\n\t return parents;\n\t }\n\t};\n\n\tvar wrap = exports.wrap = function wrap(element, wrapper) {\n\t wrapper = wrapper || document.createElement('div');\n\t if (element.nextSibling) {\n\t element.parentNode.insertBefore(wrapper, element.nextSibling);\n\t } else {\n\t element.parentNode.appendChild(wrapper);\n\t }\n\t return wrapper.appendChild(element);\n\t};\n\n\tvar getSiblings = exports.getSiblings = function getSiblings(elem) {\n\t var siblings = [];\n\t var sibling = elem.parentNode.firstChild;\n\t for (; sibling; sibling = sibling.nextSibling) {\n\t if (sibling.nodeType === 1 && sibling !== elem) {\n\t siblings.push(sibling);\n\t }\n\t }\n\t return siblings;\n\t};\n\n\t/**\n\t * Find ancestor in DOM tree\n\t * @param {NodeElement} el Element to start search from\n\t * @param {[type]} cls Class of parent\n\t * @return {NodeElement} Found parent element\n\t */\n\tvar findAncestor = exports.findAncestor = function findAncestor(el, cls) {\n\t while ((el = el.parentElement) && !el.classList.contains(cls)) {}\n\t return el;\n\t};\n\n\t/**\n\t * Find ancestor in DOM tree by attribute name\n\t * @param {NodeElement} el Element to start search from\n\t * @param {string} attr Attribute name of parent\n\t * @return {?NodeElement} Found parent element or null\n\t */\n\tvar findAncestorByAttrName = exports.findAncestorByAttrName = function findAncestorByAttrName(el, attr) {\n\t var target = el;\n\n\t while (target) {\n\t if (target.hasAttribute(attr)) {\n\t return target;\n\t }\n\n\t target = target.parentElement;\n\t }\n\n\t return null;\n\t};\n\n\t/**\n\t * Debounce an event handler.\n\t * @param {Function} func Function to run after wait\n\t * @param {Number} wait The delay before the function is executed\n\t * @param {Boolean} immediate If passed, trigger the function on the leading edge, instead of the trailing.\n\t * @return {Function} A function will be called after it stops being called for a given delay\n\t */\n\tvar debounce = exports.debounce = function debounce(func, wait, immediate) {\n\t var timeout;\n\t return function () {\n\t var context = this,\n\t args = arguments;\n\t var later = function later() {\n\t timeout = null;\n\t if (!immediate) func.apply(context, args);\n\t };\n\t var callNow = immediate && !timeout;\n\t clearTimeout(timeout);\n\t timeout = setTimeout(later, wait);\n\t if (callNow) func.apply(context, args);\n\t };\n\t};\n\n\t/**\n\t * Get an element's distance from the top of the page\n\t * @private\n\t * @param {NodeElement} el Element to test for\n\t * @return {Number} Elements Distance from top of page\n\t */\n\tvar getElemDistance = exports.getElemDistance = function getElemDistance(el) {\n\t var location = 0;\n\t if (el.offsetParent) {\n\t do {\n\t location += el.offsetTop;\n\t el = el.offsetParent;\n\t } while (el);\n\t }\n\t return location >= 0 ? location : 0;\n\t};\n\n\t/**\n\t * Determine element height multiplied by any offsets\n\t * @private\n\t * @param {HTMLElement} el Element to test for\n\t * @return {Number} Height of element\n\t */\n\tvar getElementOffset = exports.getElementOffset = function getElementOffset(el, offset) {\n\t var elOffset = offset;\n\t if (elOffset > 1) elOffset = 1;\n\t if (elOffset > 0) elOffset = 0;\n\n\t return Math.max(el.offsetHeight * elOffset);\n\t};\n\n\t/**\n\t * Get the next or previous element from a given start point\n\t * @param {HTMLElement} startEl Element to start position from\n\t * @param {String} className The class we will look through\n\t * @param {Number} direction Positive next element, negative previous element\n\t * @return {[HTMLElement} Found element\n\t */\n\tvar getAdjacentEl = exports.getAdjacentEl = function getAdjacentEl(startEl, className) {\n\t var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n\t if (!startEl || !className) return;\n\n\t var parent = startEl.parentNode.parentNode;\n\t var children = Array.from(parent.querySelectorAll(className));\n\n\t var startPos = children.indexOf(startEl);\n\t var operatorDirection = direction > 0 ? 1 : -1;\n\n\t return children[startPos + operatorDirection];\n\t};\n\n\t/**\n\t * Get scroll position based on top/bottom position\n\t * @private\n\t * @return {String} Position of scroll\n\t */\n\tvar getScrollPosition = exports.getScrollPosition = function getScrollPosition(position) {\n\t if (position === 'bottom') {\n\t // Scroll position from the bottom of the viewport\n\t return Math.max((window.scrollY || window.pageYOffset) + (window.innerHeight || document.documentElement.clientHeight));\n\t } else {\n\t // Scroll position from the top of the viewport\n\t return window.scrollY || window.pageYOffset;\n\t }\n\t};\n\n\t/**\n\t * Determine whether an element is within the viewport\n\t * @param {HTMLElement} el Element to test\n\t * @return {String} Position of scroll\n\t * @return {Boolean}\n\t */\n\tvar isInView = exports.isInView = function isInView(el, position, offset) {\n\t // If the user has scrolled further than the distance from the element to the top of its parent\n\t return this.getScrollPosition(position) > this.getElemDistance(el) + this.getElementOffset(el, offset) ? true : false;\n\t};\n\n\t/**\n\t * Determine whether an element is within\n\t * @param {HTMLElement} el Element to test\n\t * @param {HTMLElement} parent Scrolling parent\n\t * @param {Number} direction Whether element is visible from above or below\n\t * @return {Boolean}\n\t */\n\tvar isScrolledIntoView = exports.isScrolledIntoView = function isScrolledIntoView(el, parent) {\n\t var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n\t if (!el) return;\n\n\t var isVisible = void 0;\n\n\t if (direction > 0) {\n\t // In view from bottom\n\t isVisible = parent.scrollTop + parent.offsetHeight >= el.offsetTop + el.offsetHeight;\n\t } else {\n\t // In view from top\n\t isVisible = el.offsetTop >= parent.scrollTop;\n\t }\n\n\t return isVisible;\n\t};\n\n\t/**\n\t * Remove html tags from a string\n\t * @param {String} Initial string/html\n\t * @return {String} Sanitised string\n\t */\n\tvar stripHTML = exports.stripHTML = function stripHTML(html) {\n\t var el = document.createElement(\"DIV\");\n\t el.innerHTML = html;\n\t return el.textContent || el.innerText || \"\";\n\t};\n\n\t/**\n\t * Adds animation to an element and removes it upon animation completion\n\t * @param {Element} el Element to add animation to\n\t * @param {String} animation Animation class to add to element\n\t * @return\n\t */\n\tvar addAnimation = exports.addAnimation = function addAnimation(el, animation) {\n\t var animationEvent = whichAnimationEvent();\n\n\t var removeAnimation = function removeAnimation() {\n\t el.classList.remove(animation);\n\t el.removeEventListener(animationEvent, removeAnimation, false);\n\t };\n\n\t el.classList.add(animation);\n\t el.addEventListener(animationEvent, removeAnimation, false);\n\t};\n\n\t/**\n\t * Get a random number between a range\n\t * @param {Number} min Minimum range\n\t * @param {Number} max Maximum range\n\t * @return {Number} Random number\n\t */\n\tvar getRandomNumber = exports.getRandomNumber = function getRandomNumber(min, max) {\n\t return Math.floor(Math.random() * (max - min) + min);\n\t};\n\n\t/**\n\t * Turn a string into a node\n\t * @param {String} String to convert\n\t * @return {HTMLElement} Converted node element\n\t */\n\tvar strToEl = exports.strToEl = function () {\n\t var tmpEl = document.createElement('div');\n\t return function (str) {\n\t var cleanedInput = str.trim();\n\t var r = void 0;\n\t tmpEl.innerHTML = cleanedInput;\n\t r = tmpEl.children[0];\n\n\t while (tmpEl.firstChild) {\n\t tmpEl.removeChild(tmpEl.firstChild);\n\t }\n\n\t return r;\n\t };\n\t}();\n\n\t/**\n\t * Sets the width of a passed input based on its value\n\t * @return {Number} Width of input\n\t */\n\tvar getWidthOfInput = exports.getWidthOfInput = function getWidthOfInput(input) {\n\t var value = input.value || input.placeholder;\n\t var width = input.offsetWidth;\n\n\t if (value) {\n\t var testEl = strToEl('' + value + '');\n\t testEl.style.position = 'absolute';\n\t testEl.style.padding = '0';\n\t testEl.style.top = '-9999px';\n\t testEl.style.left = '-9999px';\n\t testEl.style.width = 'auto';\n\t testEl.style.whiteSpace = 'pre';\n\n\t if (document.body.contains(input) && window.getComputedStyle) {\n\t var inputStyle = window.getComputedStyle(input);\n\n\t if (inputStyle) {\n\t testEl.style.fontSize = inputStyle.fontSize;\n\t testEl.style.fontFamily = inputStyle.fontFamily;\n\t testEl.style.fontWeight = inputStyle.fontWeight;\n\t testEl.style.fontStyle = inputStyle.fontStyle;\n\t testEl.style.letterSpacing = inputStyle.letterSpacing;\n\t testEl.style.textTransform = inputStyle.textTransform;\n\t testEl.style.padding = inputStyle.padding;\n\t }\n\t }\n\n\t document.body.appendChild(testEl);\n\n\t if (value && testEl.offsetWidth !== input.offsetWidth) {\n\t width = testEl.offsetWidth + 4;\n\t }\n\n\t document.body.removeChild(testEl);\n\t }\n\n\t return width + 'px';\n\t};\n\n\t/**\n\t * Sorting function for current and previous string\n\t * @param {String} a Current value\n\t * @param {String} b Next value\n\t * @return {Number} -1 for after previous,\n\t * 1 for before,\n\t * 0 for same location\n\t */\n\tvar sortByAlpha = exports.sortByAlpha = function sortByAlpha(a, b) {\n\t var labelA = (a.label || a.value).toLowerCase();\n\t var labelB = (b.label || b.value).toLowerCase();\n\n\t if (labelA < labelB) return -1;\n\t if (labelA > labelB) return 1;\n\t return 0;\n\t};\n\n\t/**\n\t * Sort by numeric score\n\t * @param {Object} a Current value\n\t * @param {Object} b Next value\n\t * @return {Number} -1 for after previous,\n\t * 1 for before,\n\t * 0 for same location\n\t */\n\tvar sortByScore = exports.sortByScore = function sortByScore(a, b) {\n\t return a.score - b.score;\n\t};\n\n\t/**\n\t * Trigger native event\n\t * @param {NodeElement} element Element to trigger event on\n\t * @param {String} type Type of event to trigger\n\t * @param {Object} customArgs Data to pass with event\n\t * @return {Object} Triggered event\n\t */\n\tvar triggerEvent = exports.triggerEvent = function triggerEvent(element, type) {\n\t var customArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n\t var event = new CustomEvent(type, {\n\t detail: customArgs,\n\t bubbles: true,\n\t cancelable: true\n\t });\n\n\t return element.dispatchEvent(event);\n\t};\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\t/* eslint-disable */\n\t(function () {\n\t // Production steps of ECMA-262, Edition 6, 22.1.2.1\n\t // Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from\n\t if (!Array.from) {\n\t Array.from = function () {\n\t var toStr = Object.prototype.toString;\n\n\t var isCallable = function isCallable(fn) {\n\t return typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n\t };\n\n\t var toInteger = function toInteger(value) {\n\t var number = Number(value);\n\t if (isNaN(number)) {\n\t return 0;\n\t }\n\t if (number === 0 || !isFinite(number)) {\n\t return number;\n\t }\n\t return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n\t };\n\n\t var maxSafeInteger = Math.pow(2, 53) - 1;\n\n\t var toLength = function toLength(value) {\n\t var len = toInteger(value);\n\t return Math.min(Math.max(len, 0), maxSafeInteger);\n\t };\n\n\t // The length property of the from method is 1.\n\t return function from(arrayLike /*, mapFn, thisArg */) {\n\t // 1. Let C be the this value.\n\t var C = this;\n\n\t // 2. Let items be ToObject(arrayLike).\n\t var items = Object(arrayLike);\n\n\t // 3. ReturnIfAbrupt(items).\n\t if (arrayLike == null) {\n\t throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");\n\t }\n\n\t // 4. If mapfn is undefined, then let mapping be false.\n\t var mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n\t var T;\n\t if (typeof mapFn !== 'undefined') {\n\t // 5. else\n\t // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n\t if (!isCallable(mapFn)) {\n\t throw new TypeError('Array.from: when provided, the second argument must be a function');\n\t }\n\n\t // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\t if (arguments.length > 2) {\n\t T = arguments[2];\n\t }\n\t }\n\n\t // 10. Let lenValue be Get(items, \"length\").\n\t // 11. Let len be ToLength(lenValue).\n\t var len = toLength(items.length);\n\n\t // 13. If IsConstructor(C) is true, then\n\t // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.\n\t // 14. a. Else, Let A be ArrayCreate(len).\n\t var A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n\t // 16. Let k be 0.\n\t var k = 0;\n\t // 17. Repeat, while k < len… (also steps a - h)\n\t var kValue;\n\t while (k < len) {\n\t kValue = items[k];\n\t if (mapFn) {\n\t A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n\t } else {\n\t A[k] = kValue;\n\t }\n\t k += 1;\n\t }\n\t // 18. Let putStatus be Put(A, \"length\", len, true).\n\t A.length = len;\n\t // 20. Return A.\n\t return A;\n\t };\n\t }();\n\t }\n\n\t // Reference: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n\t if (!Array.prototype.find) {\n\t Array.prototype.find = function (predicate) {\n\t 'use strict';\n\n\t if (this == null) {\n\t throw new TypeError('Array.prototype.find called on null or undefined');\n\t }\n\t if (typeof predicate !== 'function') {\n\t throw new TypeError('predicate must be a function');\n\t }\n\t var list = Object(this);\n\t var length = list.length >>> 0;\n\t var thisArg = arguments[1];\n\t var value;\n\n\t for (var i = 0; i < length; i++) {\n\t value = list[i];\n\t if (predicate.call(thisArg, value, i, list)) {\n\t return value;\n\t }\n\t }\n\t return undefined;\n\t };\n\t }\n\n\t function CustomEvent(event, params) {\n\t params = params || {\n\t bubbles: false,\n\t cancelable: false,\n\t detail: undefined\n\t };\n\t var evt = document.createEvent('CustomEvent');\n\t evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t return evt;\n\t }\n\n\t CustomEvent.prototype = window.Event.prototype;\n\n\t window.CustomEvent = CustomEvent;\n\t})();\n\n/***/ })\n/******/ ])\n});\n;\n//# sourceMappingURL=choices.js.map\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/lib/choices.js","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = 49\n// module chunks = 2","function handleTeamPulldownChange(input, basePath) {\n const id = input.value\n \n if ( !id ) {\n return false\n }\n \n const seasonParam = input.dataset.season ? `/${input.dataset.season}` : ''\n const path = document.location.pathname\n const newPath = basePath + id + seasonParam\n \n if ( newPath === path ) {\n return false\n }\n \n window.location.replace(document.location.origin + newPath + document.location.search)\n}\n\nfunction handleSeasonPulldownChange(e) {\n const input = e.currentTarget\n const year = input.value\n \n if ( !year ) {\n return false\n }\n \n const team = input.dataset.team\n\n const path = document.location.pathname;\n const newPath = `/teams/${team}/${year}`\n\n if ( path === newPath ) {\n return false\n }\n\n window.location.replace(document.location.origin + newPath + document.location.search);\n}\n\nexport function setupPullDownEvents() {\n const teamPulldown = document.getElementById('team-pulldown')\n if ( teamPulldown ) {\n teamPulldown.addEventListener('change', (e) => {\n handleTeamPulldownChange(e.currentTarget, '/teams/')\n })\n }\n\n const wtfTeamPulldown = document.getElementById('wtf-team-pulldown')\n if ( wtfTeamPulldown ) {\n wtfTeamPulldown.addEventListener('change', (e) => {\n handleTeamPulldownChange(e.currentTarget, '/tools/wtf_engine/')\n }) \n }\n\n const seasonPulldown = document.getElementById('season-pulldown')\n if ( seasonPulldown ) {\n seasonPulldown.addEventListener('change', handleSeasonPulldownChange)\n }\n\n const wtfSeasonPulldown = document.getElementById('wtf-season-pulldown')\n if ( wtfSeasonPulldown ) {\n wtfSeasonPulldown.addEventListener('change', (e) => {\n const input = e.currentTarget\n const year = input.value\n if ( !year ) {\n return false\n }\n\n const current_query_string = document.location.search\n var new_query_string = ''\n \n if ( current_query_string.length > 0 ) {\n const reg = new RegExp(/season=\\w+/)\n if ( reg.test(current_query_string) ) {\n new_query_string = current_query_string.replace(/season=\\d+/, `season=${year}`)\n } else {\n new_query_string = `${current_query_string}&season=${year}`\n }\n } else {\n new_query_string = `?season=${year}`\n }\n\n if ( current_query_string === new_query_string ) {\n return false\n }\n\n document.location.href = `http://${window.location.host}${window.location.pathname}${new_query_string}`\n })\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/custom/pulldown-events.js","/*!\n * headroom.js v0.9.4 - Give your page some headroom. Hide your header until you need it\n * Copyright (c) 2017 Nick Williams - http://wicky.nillia.ms/headroom.js\n * License: MIT\n */\n\n(function(root, factory) {\n 'use strict';\n\n // COMMONJS\n module.exports = factory();\n}(this, function() {\n 'use strict';\n\n /* exported features */\n \n var features = {\n bind : !!(function(){}.bind),\n classList : 'classList' in document.documentElement,\n rAF : !!(window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame)\n };\n window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n \n /**\n * Handles debouncing of events via requestAnimationFrame\n * @see http://www.html5rocks.com/en/tutorials/speed/animations/\n * @param {Function} callback The callback to handle whichever event\n */\n function Debouncer (callback) {\n this.callback = callback;\n this.ticking = false;\n }\n Debouncer.prototype = {\n constructor : Debouncer,\n \n /**\n * dispatches the event to the supplied callback\n * @private\n */\n update : function() {\n this.callback && this.callback();\n this.ticking = false;\n },\n \n /**\n * ensures events don't get stacked\n * @private\n */\n requestTick : function() {\n if(!this.ticking) {\n requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));\n this.ticking = true;\n }\n },\n \n /**\n * Attach this as the event listeners\n */\n handleEvent : function() {\n this.requestTick();\n }\n };\n /**\n * Check if object is part of the DOM\n * @constructor\n * @param {Object} obj element to check\n */\n function isDOMElement(obj) {\n return obj && typeof window !== 'undefined' && (obj === window || obj.nodeType);\n }\n \n /**\n * Helper function for extending objects\n */\n function extend (object /*, objectN ... */) {\n if(arguments.length <= 0) {\n throw new Error('Missing arguments in extend function');\n }\n \n var result = object || {},\n key,\n i;\n \n for (i = 1; i < arguments.length; i++) {\n var replacement = arguments[i] || {};\n \n for (key in replacement) {\n // Recurse into object except if the object is a DOM element\n if(typeof result[key] === 'object' && ! isDOMElement(result[key])) {\n result[key] = extend(result[key], replacement[key]);\n }\n else {\n result[key] = result[key] || replacement[key];\n }\n }\n }\n \n return result;\n }\n \n /**\n * Helper function for normalizing tolerance option to object format\n */\n function normalizeTolerance (t) {\n return t === Object(t) ? t : { down : t, up : t };\n }\n \n /**\n * UI enhancement for fixed headers.\n * Hides header when scrolling down\n * Shows header when scrolling up\n * @constructor\n * @param {DOMElement} elem the header element\n * @param {Object} options options for the widget\n */\n function Headroom (elem, options) {\n options = extend(options, Headroom.options);\n \n this.lastKnownScrollY = 0;\n this.elem = elem;\n this.tolerance = normalizeTolerance(options.tolerance);\n this.classes = options.classes;\n this.offset = options.offset;\n this.scroller = options.scroller;\n this.initialised = false;\n this.onPin = options.onPin;\n this.onUnpin = options.onUnpin;\n this.onTop = options.onTop;\n this.onNotTop = options.onNotTop;\n this.onBottom = options.onBottom;\n this.onNotBottom = options.onNotBottom;\n }\n Headroom.prototype = {\n constructor : Headroom,\n \n /**\n * Initialises the widget\n */\n init : function() {\n if(!Headroom.cutsTheMustard) {\n return;\n }\n \n this.debouncer = new Debouncer(this.update.bind(this));\n this.elem.classList.add(this.classes.initial);\n \n // defer event registration to handle browser\n // potentially restoring previous scroll position\n setTimeout(this.attachEvent.bind(this), 100);\n \n return this;\n },\n \n /**\n * Unattaches events and removes any classes that were added\n */\n destroy : function() {\n var classes = this.classes;\n \n this.initialised = false;\n \n for (var key in classes) {\n if(classes.hasOwnProperty(key)) {\n this.elem.classList.remove(classes[key]);\n }\n }\n \n this.scroller.removeEventListener('scroll', this.debouncer, false);\n },\n \n /**\n * Attaches the scroll event\n * @private\n */\n attachEvent : function() {\n if(!this.initialised){\n this.lastKnownScrollY = this.getScrollY();\n this.initialised = true;\n this.scroller.addEventListener('scroll', this.debouncer, false);\n \n this.debouncer.handleEvent();\n }\n },\n \n /**\n * Unpins the header if it's currently pinned\n */\n unpin : function() {\n var classList = this.elem.classList,\n classes = this.classes;\n \n if(classList.contains(classes.pinned) || !classList.contains(classes.unpinned)) {\n classList.add(classes.unpinned);\n classList.remove(classes.pinned);\n this.onUnpin && this.onUnpin.call(this);\n }\n },\n \n /**\n * Pins the header if it's currently unpinned\n */\n pin : function() {\n var classList = this.elem.classList,\n classes = this.classes;\n \n if(classList.contains(classes.unpinned)) {\n classList.remove(classes.unpinned);\n classList.add(classes.pinned);\n this.onPin && this.onPin.call(this);\n }\n },\n \n /**\n * Handles the top states\n */\n top : function() {\n var classList = this.elem.classList,\n classes = this.classes;\n \n if(!classList.contains(classes.top)) {\n classList.add(classes.top);\n classList.remove(classes.notTop);\n this.onTop && this.onTop.call(this);\n }\n },\n \n /**\n * Handles the not top state\n */\n notTop : function() {\n var classList = this.elem.classList,\n classes = this.classes;\n \n if(!classList.contains(classes.notTop)) {\n classList.add(classes.notTop);\n classList.remove(classes.top);\n this.onNotTop && this.onNotTop.call(this);\n }\n },\n \n bottom : function() {\n var classList = this.elem.classList,\n classes = this.classes;\n \n if(!classList.contains(classes.bottom)) {\n classList.add(classes.bottom);\n classList.remove(classes.notBottom);\n this.onBottom && this.onBottom.call(this);\n }\n },\n \n /**\n * Handles the not top state\n */\n notBottom : function() {\n var classList = this.elem.classList,\n classes = this.classes;\n \n if(!classList.contains(classes.notBottom)) {\n classList.add(classes.notBottom);\n classList.remove(classes.bottom);\n this.onNotBottom && this.onNotBottom.call(this);\n }\n },\n \n /**\n * Gets the Y scroll position\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY\n * @return {Number} pixels the page has scrolled along the Y-axis\n */\n getScrollY : function() {\n return (this.scroller.pageYOffset !== undefined)\n ? this.scroller.pageYOffset\n : (this.scroller.scrollTop !== undefined)\n ? this.scroller.scrollTop\n : (document.documentElement || document.body.parentNode || document.body).scrollTop;\n },\n \n /**\n * Gets the height of the viewport\n * @see http://andylangton.co.uk/blog/development/get-viewport-size-width-and-height-javascript\n * @return {int} the height of the viewport in pixels\n */\n getViewportHeight : function () {\n return window.innerHeight\n || document.documentElement.clientHeight\n || document.body.clientHeight;\n },\n \n /**\n * Gets the physical height of the DOM element\n * @param {Object} elm the element to calculate the physical height of which\n * @return {int} the physical height of the element in pixels\n */\n getElementPhysicalHeight : function (elm) {\n return Math.max(\n elm.offsetHeight,\n elm.clientHeight\n );\n },\n \n /**\n * Gets the physical height of the scroller element\n * @return {int} the physical height of the scroller element in pixels\n */\n getScrollerPhysicalHeight : function () {\n return (this.scroller === window || this.scroller === document.body)\n ? this.getViewportHeight()\n : this.getElementPhysicalHeight(this.scroller);\n },\n \n /**\n * Gets the height of the document\n * @see http://james.padolsey.com/javascript/get-document-height-cross-browser/\n * @return {int} the height of the document in pixels\n */\n getDocumentHeight : function () {\n var body = document.body,\n documentElement = document.documentElement;\n \n return Math.max(\n body.scrollHeight, documentElement.scrollHeight,\n body.offsetHeight, documentElement.offsetHeight,\n body.clientHeight, documentElement.clientHeight\n );\n },\n \n /**\n * Gets the height of the DOM element\n * @param {Object} elm the element to calculate the height of which\n * @return {int} the height of the element in pixels\n */\n getElementHeight : function (elm) {\n return Math.max(\n elm.scrollHeight,\n elm.offsetHeight,\n elm.clientHeight\n );\n },\n \n /**\n * Gets the height of the scroller element\n * @return {int} the height of the scroller element in pixels\n */\n getScrollerHeight : function () {\n return (this.scroller === window || this.scroller === document.body)\n ? this.getDocumentHeight()\n : this.getElementHeight(this.scroller);\n },\n \n /**\n * determines if the scroll position is outside of document boundaries\n * @param {int} currentScrollY the current y scroll position\n * @return {bool} true if out of bounds, false otherwise\n */\n isOutOfBounds : function (currentScrollY) {\n var pastTop = currentScrollY < 0,\n pastBottom = currentScrollY + this.getScrollerPhysicalHeight() > this.getScrollerHeight();\n \n return pastTop || pastBottom;\n },\n \n /**\n * determines if the tolerance has been exceeded\n * @param {int} currentScrollY the current scroll y position\n * @return {bool} true if tolerance exceeded, false otherwise\n */\n toleranceExceeded : function (currentScrollY, direction) {\n return Math.abs(currentScrollY-this.lastKnownScrollY) >= this.tolerance[direction];\n },\n \n /**\n * determine if it is appropriate to unpin\n * @param {int} currentScrollY the current y scroll position\n * @param {bool} toleranceExceeded has the tolerance been exceeded?\n * @return {bool} true if should unpin, false otherwise\n */\n shouldUnpin : function (currentScrollY, toleranceExceeded) {\n var scrollingDown = currentScrollY > this.lastKnownScrollY,\n pastOffset = currentScrollY >= this.offset;\n \n return scrollingDown && pastOffset && toleranceExceeded;\n },\n \n /**\n * determine if it is appropriate to pin\n * @param {int} currentScrollY the current y scroll position\n * @param {bool} toleranceExceeded has the tolerance been exceeded?\n * @return {bool} true if should pin, false otherwise\n */\n shouldPin : function (currentScrollY, toleranceExceeded) {\n var scrollingUp = currentScrollY < this.lastKnownScrollY,\n pastOffset = currentScrollY <= this.offset;\n \n return (scrollingUp && toleranceExceeded) || pastOffset;\n },\n \n /**\n * Handles updating the state of the widget\n */\n update : function() {\n var currentScrollY = this.getScrollY(),\n scrollDirection = currentScrollY > this.lastKnownScrollY ? 'down' : 'up',\n toleranceExceeded = this.toleranceExceeded(currentScrollY, scrollDirection);\n \n if(this.isOutOfBounds(currentScrollY)) { // Ignore bouncy scrolling in OSX\n return;\n }\n \n if (currentScrollY <= this.offset ) {\n this.top();\n } else {\n this.notTop();\n }\n \n if(currentScrollY + this.getViewportHeight() >= this.getScrollerHeight()) {\n this.bottom();\n }\n else {\n this.notBottom();\n }\n \n if(this.shouldUnpin(currentScrollY, toleranceExceeded)) {\n this.unpin();\n }\n else if(this.shouldPin(currentScrollY, toleranceExceeded)) {\n this.pin();\n }\n \n this.lastKnownScrollY = currentScrollY;\n }\n };\n /**\n * Default options\n * @type {Object}\n */\n Headroom.options = {\n tolerance : {\n up : 0,\n down : 0\n },\n offset : 0,\n scroller: window,\n classes : {\n pinned : 'headroom--pinned',\n unpinned : 'headroom--unpinned',\n top : 'headroom--top',\n notTop : 'headroom--not-top',\n bottom : 'headroom--bottom',\n notBottom : 'headroom--not-bottom',\n initial : 'headroom'\n }\n };\n Headroom.cutsTheMustard = typeof features !== 'undefined' && features.rAF && features.bind && features.classList;\n\n return Headroom;\n}));\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/lib/headroom.js"],"sourceRoot":""}