{"version":3,"sources":["public/js/kalamar-0.41.1-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","getPluginList","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","tourshow","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) { //when is this ever called?\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n    // anno[i]: [0] First is name, then [1] what gets entered into the search bar, then a [2] description\r\n    // Question: is there a conflict with anno[\"Stored Queries\"][1] being \"\" if I do implement it like that?\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return; // no anno[i][2] means no description, this hopefully never happens\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else { //value includes :\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\ndefine('hint/foundries/storedQueries',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Stored Queries\", \"storedQ/=\", \"stored online\"]\r\n    // We do not want to add a string (I think) instead, as soon as we select a stored query, we just add its contents\r\n  );\r\n\r\n  ah[\"storedQ/=\"] = [\r\n    [\"Baum\", \"baum\", \"DescBaum\"],\r\n    [\"Holz\", \"holz\", \"DescParagraph\"],\r\n    [\"Blatt\", \"blatt\", \"DescText\"]\r\n  ];\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\",\r\n  \"hint/foundries/storedQueries\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * cq = corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General method to retrieve JSON information\r\n   */\r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  }\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n\r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 10000);\r\n      }\r\n    );\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.length > 0) {\r\n            // Load Plugin Server first\r\n            KorAP.Plugin = pluginClass.create();\r\n\r\n            // Add services container to head\r\n            d.head.appendChild(KorAP.Plugin.element());\r\n\r\n            // Add pipe form\r\n            KorAP.Pipe = pipeClass.create();\r\n            d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n            \r\n            try {\r\n              \r\n              // Register all plugins\r\n              json.forEach(i => KorAP.Plugin.register(i));\r\n            }\r\n            catch (e) {\r\n              KorAP.log(0, e);\r\n            }\r\n          }\r\n        });\r\n      };\r\n    };\r\n      \r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}