1{"version":3,"sources":["../node_modules/codemirror/lib/codemirror.js","../node_modules/codemirror/addon/dialog/dialog.js","../node_modules/codemirror/addon/edit/closebrackets.js","../node_modules/codemirror/addon/edit/matchbrackets.js","../node_modules/codemirror/addon/mode/loadmode.js","../node_modules/codemirror/addon/mode/multiplex.js","../node_modules/codemirror/addon/mode/overlay.js","../node_modules/codemirror/addon/mode/simple.js","../node_modules/codemirror/addon/runmode/runmode.js","../node_modules/codemirror/addon/search/jump-to-line.js","../node_modules/codemirror/addon/search/matchesonscrollbar.js","../node_modules/codemirror/addon/search/searchcursor.js","../node_modules/codemirror/addon/search/search.js","../node_modules/codemirror/addon/selection/active-line.js","../node_modules/codemirror/addon/scroll/annotatescrollbar.js","../node_modules/codemirror/addon/scroll/simplescrollbars.js","../node_modules/cm-show-invisibles/lib/show-invisibles.js","../mode.js","../init.js"],"names":["global","factory","exports","module","define","amd","self","CodeMirror","this","userAgent","navigator","platform","gecko","test","ie_upto10","ie_11up","exec","edge","ie","ie_version","document","documentMode","webkit","qtwebkit","chrome","presto","safari","vendor","mac_geMountainLion","phantom","ios","android","mobile","mac","chromeOS","windows","presto_version","match","Number","flipCtrlCmd","captureRightClick","classTest","cls","RegExp","rmClass","node","current","className","after","slice","index","length","removeChildren","e","count","childNodes","removeChild","firstChild","removeChildrenAndAdd","parent","appendChild","elt","tag","content","style","createElement","cssText","createTextNode","i","eltP","setAttribute","range","createRange","start","end","endNode","r","setEnd","setStart","body","createTextRange","moveToElementText","parentNode","collapse","moveEnd","moveStart","contains","child","nodeType","host","activeElt","activeElement","shadowRoot","addClass","joinClasses","a","b","as","split","selectInput","select","selectionStart","selectionEnd","value","_e","bind","f","args","Array","prototype","call","arguments","apply","copyObj","obj","target","overwrite","prop","hasOwnProperty","countColumn","string","tabSize","startIndex","startValue","search","n","nextTab","indexOf","Delayed","id","time","handler","onTimeout","Date","setTimeout","set","ms","clearTimeout","array","scrollerGap","Pass","toString","sel_dontScroll","scroll","sel_mouse","origin","sel_move","findColumn","goal","pos","col","skipped","Math","min","spaceStrs","spaceStr","push","lst","arr","map","out","insertSorted","score","priority","splice","nothing","createObj","base","props","inst","Object","create","nonASCIISingleCaseWordChar","isWordCharBasic","ch","toUpperCase","toLowerCase","isWordChar","helper","source","isEmpty","extendingChars","isExtendingChar","charCodeAt","skipExtendingChars","str","dir","charAt","findFirst","pred","from","to","midF","mid","ceil","floor","iterateBidiSections","order","found","part","max","level","bidiOther","getBidiPartAt","sticky","cur","bidiOrdering","lowTypes","arabicTypes","charType","code","bidiRE","isNeutral","isStrong","countsAsLeft","countsAsNum","BidiSpan","direction","outerType","len","types","i$1","prev","type","i$2","type$1","i$3","prev$1","type$2","i$4","type$3","replace","j","i$5","cur$1","type$4","i$6","end$1","before","replace$1","j$1","m","i$7","at","isRTL","j$2","nstart","unshift","reverse","getOrder","line","text","noHandlers","on","emitter","addEventListener","attachEvent","_handlers","concat","getHandlers","off","removeEventListener","detachEvent","signal","handlers","signalDOMEvent","cm","override","preventDefault","defaultPrevented","e_defaultPrevented","codemirrorIgnore","signalCursorActivity","cursorActivity","curOp","cursorActivityHandlers","hasHandler","eventMixin","ctor","e_preventDefault","returnValue","e_stopPropagation","stopPropagation","cancelBubble","e_stop","e_target","srcElement","e_button","which","button","ctrlKey","dragAndDrop","div","zwspSupported","zeroWidthElement","measure","offsetHeight","offsetWidth","badBidiRects","hasBadBidiRects","txt","r0","getBoundingClientRect","r1","left","right","splitLinesAuto","result","l","nl","rt","hasSelection","window","getSelection","te","ownerDocument","selection","parentElement","compareEndPoints","hasCopyEvent","oncopy","badZoomedRects","hasBadZoomedRects","normal","fromRange","abs","modes","mimeModes","defineMode","name","mode","dependencies","defineMIME","mime","spec","resolveMode","getMode","options","mfactory","modeObj","modeExtensions","exts","helperType","modeProps","prop$1","extendMode","properties","copyState","state","nstate","val","innerMode","info","startState","a1","a2","StringStream","lineOracle","lastColumnPos","lastColumnValue","lineStart","eol","sol","peek","undefined","next","eat","ok","eatWhile","eatSpace","skipToEnd","skipTo","backUp","column","indentation","pattern","consume","caseInsensitive","cased","substr","hideFirstChars","inner","lookAhead","oracle","baseToken","getLine","doc","first","size","Error","chunk","lines","children","sz","chunkSize","getBetween","iter","getLines","updateLineHeight","height","diff","lineNo","no","lineAtHeight","h","outer","lh","isLine","lineNumberFor","String","lineNumberFormatter","firstLineNumber","Pos","cmp","equalCursorPos","copyPos","x","maxPos","minPos","clipLine","clipPos","last","clipToLen","linelen","clipPosArray","SavedContext","Context","maxLookAhead","baseTokens","baseTokenPos","nextLine","fromSaved","saved","save","copy","highlightLine","context","forceToEnd","st","modeGen","lineClasses","runMode","loop","o","overlay","overlays","i_end","opaque","styles","classes","bgClass","textClass","getLineStyles","updateFrontier","getContextBefore","resetState","maxHighlightLength","stateAfter","styleClasses","highlightFrontier","modeFrontier","precise","display","findStartLine","processLine","viewFrom","viewTo","startAt","stream","callBlankLine","readToken","blankLine","token","Token","takeToken","asArray","tokens","extractLineClasses","output","lineClass","flattenSpans","curStart","curStyle","addModeClass","mName","minindent","minline","lim","indented","retreatFrontier","sawReadOnlySpans","sawCollapsedSpans","seeReadOnlySpans","seeCollapsedSpans","MarkedSpan","marker","getMarkedSpanFor","spans","span","removeMarkedSpan","addMarkedSpan","markedSpans","attachLine","markedSpansBefore","old","startCh","isInsert","nw","startsBefore","inclusiveLeft","insertLeft","endsAfter","inclusiveRight","markedSpansAfter","endCh","stretchSpansOverChange","change","full","oldFirst","oldLast","sameLine","offset","span$1","found$1","clearEmptySpans","newMarkers","gap","gapMarkers","clearWhenEmpty","removeReadOnlyRanges","markers","mark","readOnly","parts","mk","find","p","newParts","dfrom","dto","detachMarkedSpans","detachLine","attachMarkedSpans","extraLeft","extraRight","compareCollapsedMarkers","lenDiff","aPos","bPos","fromCmp","toCmp","collapsedSpanAtSide","sps","sp","collapsed","collapsedSpanAtStart","collapsedSpanAtEnd","collapsedSpanAround","conflictingCollapsedRange","visualLine","merged","visualLineEnd","visualLineContinued","visualLineNo","lineN","vis","visualLineEndNo","lastLine","lineIsHidden","widgetNode","lineIsHiddenInner","heightAtLine","lineObj","lineLength","findMaxLine","d","maxLine","maxLineLength","maxLineChanged","Line","estimateHeight","updateLine","estHeight","cleanUpLine","styleToClassCache","styleToClassCacheWithMode","interpretTokenStyle","cache","buildLineContent","lineView","builder","pre","trailingSpace","splitSpaces","getOption","rest","addToken","buildToken","buildTokenBadBidi","allowFrontierUpdate","externalMeasured","insertLineContent","maps","caches","lastChild","querySelector","defaultSpecialCharPlaceholder","title","startStyle","endStyle","css","attributes","displayText","special","specialChars","mustWrap","createDocumentFragment","lastIndex","txt$1","tabWidth","specialCharPlaceholder","fullStyle","attr","trailingBefore","spaceBefore","buildCollapsedSpan","ignoreWidget","widget","input","needsContentAttribute","setUneditable","allText","nextChange","spanStyle","spanEndStyle","spanStartStyle","Infinity","foundBookmarks","endStyles","upto","tokenText","LineView","hidden","buildViewArray","nextPos","view","operationGroup","pushOperation","op","ops","ownsGroup","delayedCallbacks","fireCallbacksForOps","group","callbacks","cursorActivityCalled","finishOperation","endCb","orphanDelayedCallbacks","signalLater","list","fireOrphanDelayed","delayed","updateLineForChanges","dims","changes","updateLineText","updateLineGutter","updateLineClasses","updateLineWidgets","ensureLineWrapped","replaceChild","zIndex","updateLineBackground","background","wrap","insertBefore","getLineContent","ext","built","wrapClass","gutter","gutterBackground","gutterClass","fixedGutter","fixedPos","gutterTotalWidth","gutterMarkers","lineNumbers","wrap$1","gutterWrap","lineNumber","gutterLeft","k","gutterSpecs","gutterWidth","alignable","isWidget","nextSibling","insertLineWidgets","buildLineElement","insertLineWidgetsFor","allowAbove","widgets","ws","handleMouseEvents","positionLineWidget","above","noHScroll","width","wrapperWidth","coverGutter","paddingLeft","position","marginLeft","widgetHeight","parentStyle","gutters","wrapper","clientWidth","eventInWidget","getAttribute","sizer","mover","paddingTop","lineSpace","offsetTop","paddingVert","paddingH","cachedPaddingH","getComputedStyle","currentStyle","data","parseInt","paddingRight","isNaN","scrollGap","nativeBarWidth","displayWidth","scroller","barWidth","displayHeight","clientHeight","barHeight","ensureLineHeights","rect","wrapping","lineWrapping","curWidth","heights","rects","getClientRects","bottom","top","mapFromLineView","updateExternalMeasurement","lineMeasure","measureChar","bias","measureCharPrepared","prepareMeasureForLine","findViewForLine","findViewIndex","getDimensions","forceUpdate","hasHeights","prepared","varHeight","key","measureCharInner","bogus","rtop","rbottom","nullRect","nodeAndOffsetInLineMap","mStart","mEnd","coverStart","coverEnd","getUsefulRect","place","maybeUpdateRectForZooming","rSpan","charWidth","rbot","bot","singleCursorHeightPerLine","screen","logicalXDPI","deviceXDPI","scaleX","scaleY","logicalYDPI","deviceYDPI","clearLineMeasurementCacheFor","clearLineMeasurementCache","externalMeasure","clearCaches","cachedCharWidth","cachedTextHeight","lineNumChars","pageScrollX","pageXOffset","documentElement","scrollLeft","pageScrollY","marginTop","pageYOffset","scrollTop","widgetTopHeight","intoCoordSystem","includeWidgets","yOff","viewOffset","lOff","xOff","fromCoordSystem","coords","localBox","lineSpaceBox","charCoords","cursorCoords","preparedMeasure","get","getBidi","partPos","invert","other","estimateCoords","PosWithInfo","outside","xRel","coordsChar","y","coordsCharInner","rangeEnd","wrappedLineExtent","begin","wrappedLineExtentChar","targetTop","boxIsAfter","box","ltr","coordsBidiPartWrapped","coordsBidiPart","chAround","boxAround","baseX","atLeft","atStart","_lineNo","ref","closestDist","endX","dist","measureText","textHeight","anchor","clientLeft","offsetLeft","compensateForHScroll","th","perLine","widgetsHeight","estimateLineHeights","est","posFromMouse","liberal","forRect","space","clientX","clientY","e$1","colDiff","round","regChange","lendiff","updateLineNumbers","viewChanged","resetView","cut","viewCuttingPoint","cut$1","cutTop","cutBot","regLineChange","oldN","newN","adjustView","countDirtyView","dirty","updateSelection","showSelection","prepareSelection","primary","curFragment","cursors","selFragment","sel","ranges","primIndex","empty","showCursorWhenSelecting","drawSelectionCursor","head","drawSelectionRange","cursor","cursorHeight","otherCursor","cmpCoords","fragment","padding","leftSide","rightSide","sizerWidth","docLTR","add","drawForLine","fromArg","toArg","lineLen","wrapX","side","extent","fromPos","toPos","openStart","openEnd","openLeft","openRight","topLeft","topRight","botLeft","botRight","sFrom","sTo","fromLine","toLine","singleVLine","leftEnd","rightStart","restartBlink","focused","clearInterval","blinker","cursorDiv","visibility","cursorBlinkRate","setInterval","ensureFocus","focus","onFocus","delayBlurEvent","delayingBlurEvent","onBlur","selForContextMenu","reset","receivedFocus","shift","updateHeightsInViewport","prevBottom","lineDiv","updateWidgetHeight","chWidth","w","visibleLines","viewport","ensure","ensureFrom","ensureTo","maybeScrollWindow","doScroll","innerHeight","scrollNode","scrollIntoView","scrollPosIntoView","margin","limit","changed","endCoords","scrollPos","calculateScrollPos","startTop","startLeft","updateScrollTop","setScrollLeft","snapMargin","screentop","docBottom","atTop","atBottom","newTop","screenleft","screenw","tooWide","addToScrollTop","resolveScrollToPos","ensureCursorVisible","getCursor","scrollToPos","cursorScrollMargin","scrollToCoords","scrollToRange","scrollToCoordsRange","sPos","updateDisplaySimple","setScrollTop","startWorker","forceScroll","scrollHeight","scrollbars","isScroller","scrollWidth","alignHorizontally","measureForScrollbars","gutterW","docH","viewHeight","viewWidth","barLeft","docHeight","NativeScrollbars","vert","horiz","tabIndex","checkedZeroWidth","minHeight","minWidth","update","needsH","needsV","sWidth","totalHeight","totalWidth","zeroWidthHack","disableHoriz","enableZeroWidthBar","disableVert","pointerEvents","bar","delay","maybeDisable","elementFromPoint","clear","NullScrollbars","updateScrollbars","startWidth","startHeight","updateScrollbarsInner","sizes","paddingBottom","heightForcer","borderBottom","scrollbarFiller","coverGutterNextToScrollbar","gutterFiller","scrollbarModel","native","null","initScrollbars","scrollbarStyle","axis","nextOpId","startOperation","updateInput","typing","changeObjs","selectionChanged","updateMaxLine","endOperation","endOperations","endOperation_R1","endOperation_W1","endOperation_R2","endOperation_W2","endOperation_finish","maybeClipScrollbars","mustUpdate","DisplayUpdate","updatedDisplay","updateDisplayIfNeeded","barMeasure","adjustWidthTo","maxScrollLeft","preparedSelection","takeFocus","setDocumentHeight","postUpdateDisplay","wheelStartX","wheelStartY","maybeHiddenMarkers","unhidden","maybeUnhiddenMarkers","finish","runInOp","operation","methodOp","docMethodOp","highlight","highlightWorker","workTime","changedLines","oldStyles","highlighted","oldCls","newCls","ischange","workDelay","force","visible","editorIsHidden","wrapperHeight","oldDisplayWidth","events","scrollbarsClipped","marginBottom","borderRightWidth","selectionSnapshot","hasFocus","active","anchorNode","extend","anchorOffset","focusNode","focusOffset","restoreSelection","snapshot","nodeName","removeAllRanges","addRange","renderedView","maybeUpdateLineNumberWidth","viewportMargin","different","lastWrapHeight","lastWrapWidth","toUpdate","selSnapshot","patchDisplay","selectionDiv","reportedViewFrom","reportedViewTo","updateNumbersFrom","container","rm","currentWheelTarget","updateNumber","updateGutterSpace","alignWidgets","comp","align","innerW","lineGutter","lineNumInnerWidth","lineNumWidth","getGutters","sawLineNumbers","renderGutters","specs","gElt","updateGutters","Display","draggable","wheelDX","wheelDY","activeTouch","init","wheelSamples","wheelPixelsPerUnit","wheelEventDelta","dx","wheelDeltaX","dy","wheelDeltaY","detail","HORIZONTAL_AXIS","VERTICAL_AXIS","wheelDelta","wheelEventPixels","delta","onScrollWheel","canScrollX","canScrollY","pixels","movedX","movedY","sample","Selection","equals","here","there","deepCopy","Range","somethingSelected","normalizeSelection","mayTouch","selectionsMayTouch","prim","sort","inv","simpleSelection","changeEnd","adjustForChange","computeSelAfterChange","offsetPos","computeReplacedSel","hint","oldPrev","newPrev","loadMode","modeOption","resetModeState","isWholeLineUpdate","wholeLineUpdateBefore","updateDoc","spansFor","linesFor","firstLine","lastText","lastSpans","nlines","insert","remove","added","added$1","added$2","linkedDocs","sharedHistOnly","propagate","skip","sharedHist","linked","rel","shared","attachDoc","setDirectionClass","directionChanged","History","startGen","done","undone","undoDepth","lastModTime","lastSelTime","lastOp","lastSelOp","lastOrigin","lastSelOrigin","generation","maxGeneration","historyChangeFromChange","histChange","attachLocalSpans","clearSelectionEvents","pop","lastChangeEvent","hist","addChangeToHistory","selAfter","opId","history","historyEventDelay","pushSelectionToHistory","selectionEventCanBeMerged","addSelectionToHistory","clearRedo","dest","existing","removeClearedSpans","explicitlyCleared","getOldSpans","mergeOldSpans","stretched","oldCur","stretchCur","copyHistoryArray","newGroup","instantiateSel","event","newChanges","extendRange","posBefore","extendSelection","setSelection","extendSelections","heads","newSel","replaceOneSelection","setSimpleSelection","filterSelectionChange","setSelectionReplaceHistory","setSelectionNoUndo","NaN","setSelectionInner","skipAtomicInSelection","reCheckSelection","mayClear","newAnchor","skipAtomic","newHead","skipAtomicInner","oldPos","preventCursorLeft","selectLeft","preventCursorRight","selectRight","atomic","near","movePos","far","cantEdit","selectAll","filterChange","canceled","cancel","makeChange","ignoreReadOnly","suppressEdits","makeChangeInner","makeChangeSingleDoc","rebased","rebaseHist","makeChangeFromHistory","allowSelectionOnly","suppress","antiChanges","filter","returned","v","shiftDoc","distance","removed","makeChangeSingleDocInEditor","recomputeMaxLength","checkWidthStart","changesHandler","changeHandler","replaceRange","assign","splitLines","rebaseHistSelSingle","rebaseHistArray","sub","copied","changeLine","handle","changeType","LeafChunk","removeInner","insertInner","iterN","BranchChunk","oldHeight","remaining","leaf","maybeSpill","me","spilled","sibling","myIndex","used","LineWidget","opt","adjustScrollWhenAboveVisible","this$1","oldH","addLineWidget","insertAt","aboveVisible","nextMarkerId","TextMarker","withOp","visual","dHeight","markText","markTextShared","replacedWith","addToHistory","curLine","clearOnEnter","clearHistory","SharedTextMarker","cloneNode","isParent","findSharedMarkers","findMarks","copySharedMarkers","mFrom","mTo","subMark","detachSharedMarkers","subMarker","nextDocId","Doc","lineSep","cleanGeneration","constructor","getValue","join","lineSeparator","setValue","getRange","getLineHandle","getLineNumber","getLineHandleVisualStart","lineCount","listSelections","setCursor","extendSelectionsBy","setSelections","addSelection","getSelections","replaceSelection","dup","replaceSelections","undo","redo","undoSelection","redoSelection","setExtending","getExtending","historySize","markClean","changeGeneration","forceSplit","isClean","gen","getHistory","setHistory","histData","setGutterMarker","gutterID","clearGutter","lineInfo","addLineClass","where","removeLineClass","removeLineWidget","setBookmark","realOpts","findMarksAt","getAllMarks","posFromIndex","sepSize","indexFromPos","copyHistory","linkedDoc","unlinkDoc","link","splitIds","iterLinkedDocs","getEditor","setDirection","eachLine","lastDrop","onDrop","clearDragCursor","files","dataTransfer","isReadOnly","FileReader","File","read","markAsReadAndPasteIfAllFilesAreRead","t","readTextFromFile","file","allowDropFileTypes","reader","onerror","onload","readAsText","draggingText","text$1","getData","selected","onDragStart","setData","effectAllowed","setDragImage","img","src","_top","onDragOver","frag","dragCursor","forEachCodeMirror","getElementsByClassName","byClass","editors","globalsRegistered","ensureGlobalHandlers","registerGlobalHandlers","resizeTimer","onResize","setSize","keyNames","3","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","44","45","46","59","61","91","92","93","106","107","109","110","111","145","173","186","187","188","189","190","191","192","219","220","221","222","224","63232","63233","63234","63235","63272","63273","63275","63276","63277","63302","fromCharCode","keyMap","basic","Left","Right","Up","Down","End","Home","PageUp","PageDown","Delete","Backspace","Shift-Backspace","Tab","Shift-Tab","Enter","Insert","Esc","pcDefault","Ctrl-A","Ctrl-D","Ctrl-Z","Shift-Ctrl-Z","Ctrl-Y","Ctrl-Home","Ctrl-End","Ctrl-Up","Ctrl-Down","Ctrl-Left","Ctrl-Right","Alt-Left","Alt-Right","Ctrl-Backspace","Ctrl-Delete","Ctrl-S","Ctrl-F","Ctrl-G","Shift-Ctrl-G","Shift-Ctrl-F","Shift-Ctrl-R","Ctrl-[","Ctrl-]","Ctrl-U","Shift-Ctrl-U","Alt-U","fallthrough","emacsy","Ctrl-B","Ctrl-P","Ctrl-N","Alt-F","Alt-B","Ctrl-E","Ctrl-V","Shift-Ctrl-V","Ctrl-H","Alt-D","Alt-Backspace","Ctrl-K","Ctrl-T","Ctrl-O","macDefault","Cmd-A","Cmd-D","Cmd-Z","Shift-Cmd-Z","Cmd-Y","Cmd-Home","Cmd-Up","Cmd-End","Cmd-Down","Cmd-Left","Cmd-Right","Ctrl-Alt-Backspace","Alt-Delete","Cmd-S","Cmd-F","Cmd-G","Shift-Cmd-G","Cmd-Alt-F","Shift-Cmd-Alt-F","Cmd-[","Cmd-]","Cmd-Backspace","Cmd-Delete","Cmd-U","Shift-Cmd-U","normalizeKeyName","alt","ctrl","cmd","mod","normalizeKeyMap","keymap","keyname","keys","lookupKey","getKeyMap","isModifierKey","keyCode","addModifierNames","noShift","altKey","metaKey","shiftKey","keyName","altGraphKey","deleteNearSelection","compute","kill","toKill","replaced","moveCharLogically","moveLogically","endOfLine","visually","moveInStorageOrder","prep","moveVisually","bidi","mv","getWrappedLineExtent","searchInVisualLine","getRes","res","nextCh","commands","singleSelection","killLine","deleteLine","delLineLeft","delWrappedLineLeft","leftPos","delWrappedLineRight","rightPos","goDocStart","goDocEnd","goLineStart","goLineStartSmart","lineStartSmart","goLineEnd","lineEnd","goLineRight","goLineLeft","goLineLeftSmart","goLineUp","moveV","goLineDown","goPageUp","goPageDown","goCharLeft","moveH","goCharRight","goColumnLeft","goColumnRight","goWordLeft","goGroupRight","goGroupLeft","goWordRight","delCharBefore","deleteH","delCharAfter","delWordBefore","delWordAfter","delGroupBefore","delGroupAfter","indentAuto","indentSelection","indentMore","indentLess","insertTab","insertSoftTab","spaces","defaultTab","execCommand","transposeChars","newlineAndIndent","sels","indentLine","openLine","toggleOverwrite","firstNonWS","inWS","doHandleBinding","bound","dropShift","ensurePolled","prevShift","lookupKeyForEditor","keyMaps","extraKeys","stopSeq","dispatchKey","seq","keySeq","dispatchKeyInner","handleKeyBinding","motion","handleCharBinding","lastStoppedKey","onKeyDown","getField","handled","showCrossHair","up","onKeyUp","onKeyPress","charCode","DOUBLECLICK_DELAY","PastClick","compare","lastClick","lastDoubleClick","clickRepeat","now","onMouseDown","supportsTouch","clickInGutter","repeat","selectingText","handleMappedButton","leftButtonDown","onContextMenu","configureMouse","option","unit","addNew","moveOnDrag","behavior","contained","dragDrop","leftButtonStartDrag","leftButtonSelect","moved","dragEnd","mouseMove","dragStart","preventScroll","e2","rangeForUnit","findWordAt","ourRange","ourIndex","startSel","lastPos","extendTo","startCol","posCol","oldRange","ranges$1","bidiSimplify","editorSize","counter","curCount","move","buttons","anchorLine","boundary","headIndex","usePart","gutterEvent","prevent","mX","mY","touches","lineBox","g","contextMenuInGutter","themeChanged","theme","Init","defaults","optionHandlers","defineOptions","deflt","notOnInit","defineOption","newBreaks","refresh","getInputField","spellcheck","autocorrect","autocapitalize","detach","attach","wrappingChanged","integer","blur","readOnlyChanged","screenReaderLabelChanged","dragDropChanged","resetPosition","wasOn","funcs","dragFunctions","toggle","enter","over","leave","drop","inputStyles","inputStyle","pasteIncoming","cutIncoming","autofocus","registerEventHandlers","finishInit","initHooks","textRendering","word","touchFinished","prevTouch","finishTouch","isMouseLikeTouchEvent","touch","radiusX","radiusY","farAway","pageX","pageY","inp","defineInitHook","how","aggressive","indent","curSpace","curSpaceString","indentUnit","indentString","indentWithTabs","pos$1","lastCopied","setLastCopied","newLastCopied","applyTextInput","inserted","deleted","recent","paste","textLines","multiPaste","pasteLinesPerSelection","lineWise","changeEvent","triggerElectric","handlePaste","pasted","clipboardData","disableInput","electricChars","smartIndent","getModeAt","electricInput","copyableRanges","lineRange","disableBrowserMagic","field","hiddenTextarea","border","addEditorMethods","helpers","setOption","getDoc","addKeyMap","removeKeyMap","addOverlay","modeSpec","removeOverlay","newRanges","getTokenAt","getLineTokens","getTokenTypeAt","getHelper","getHelpers","help","_global","getStateAfter","defaultTextHeight","defaultCharWidth","getViewport","addWidget","vspace","hspace","triggerOnKeyDown","triggerOnKeyPress","triggerOnKeyUp","triggerOnMouseDown","findPosH","amount","hitSide","rtlMoveVisually","findPosV","goalColumn","goals","headPos","startChar","check","scrollTo","getScrollInfo","interpret","swapDoc","phrase","phraseText","phrases","getWrapperElement","getScrollerElement","getGutterElement","registerHelper","registerGlobalHelper","predicate","origDir","lineDir","findNextLine","moveOnce","boundToLine","sawType","pageSize","moveAmount","ContentEditableInput","lastAnchorNode","lastAnchorOffset","lastFocusNode","lastFocusOffset","polling","composing","gracePeriod","readDOMTimeout","belongsToInput","updateFromDOM","readFromDOMSoon","forceCompositionEnd","onCopyCut","lineWiseCopyCut","clearData","kludge","hadFocus","showPrimarySelection","label","removeAttribute","showMultipleSelections","curAnchor","domToPos","curFocus","bad","posToDOM","rangeCount","getRangeAt","rng","startGracePeriod","rememberSelection","selectionInEditor","commonAncestorContainer","pollSelection","poll","pollInterval","isInGutter","pollContent","fromIndex","fromNode","toIndex","toNode","previousSibling","newText","domTextBetween","oldText","cutFront","cutEnd","oldTop","maxCutFront","newBot","oldBot","maxCutEnd","chFrom","chTo","contentEditable","scan","badPos","closing","extraLinebreak","recognizeMarker","close","addText","walk","cmText","markerID","isBlock","textContent","nodeValue","lineNode","locateNodeInLineView","textNode","topNode","curNode","dist$1","TextareaInput","prevInput","pollingFast","createField","textarea","fastPoll","prepareCopyCut","dispatchEvent","Event","_display","moveInputWithCursor","wrapOff","lineOff","teTop","teLeft","drawn","contextMenuPending","slowPoll","missed","same","resetSelectionOnContextMenu","oldCSS","oldWrapperCSS","wrapperBox","offsetParent","oldScrollY","scrollY","rehide","detectingSelectAll","prepareSelectAllHack","extval","mouseup","disabled","fromTextArea","tabindex","placeholder","realSubmit","form","leaveSubmitMethodAlone","submit","wrappedSubmit","getTextArea","toTextArea","addLegacyProps","cmpPos","dontDelegate","method","contenteditable","defineExtension","func","defineDocExtension","version","require","dialogDiv","template","dialog","innerHTML","closeNotification","newVal","currentNotificationClose","callback","closed","onClose","getElementsByTagName","selectValueOnOpen","onInput","closeOnEnter","closeOnBlur","evt","relatedTarget","blurring","doneTimer","duration","pairs","closeBefore","triples","explode","closeBrackets","ensureBound","conf","handleBackspace","handleEnter","chars","handleChar","getConfig","around","charsAround","linesep","contractSelection","inverted","identical","opening","curType","stringStartsAfter","ie_lt8","matching","(",")","[","]","{","}","<",">","bracketRegex","config","findMatchingBracket","afterCursor","re","strict","scanForBracket","forward","maxScanLen","maxScanLineLength","maxScanLines","stack","matchBrackets","autoclear","maxHighlightLen","maxHighlightLineLength","marks","doMatchBrackets","currentlyHighlighted","oldConfig","CM","env","modeURL","loading","splitCallback","cont","countDown","ensureDeps","deps","missing","requireMode","path","script","others","requirejs","autoLoadMode","instance","multiplexingMode","returnEnd","innerActive","cutOff","oldContent","open","parseDelimiters","outerIndent","possibleOuterIndent","delimStyle","outerToken","curInner","innerToken","innerStyle","textAfter","overlayMode","combine","basePos","baseCur","overlayPos","overlayCur","streamSeen","combineTokens","overlayToken","defineSimpleMode","states","simpleMode","ensureState","states_","meta","hasIndentation","orig","Rule","dedent","pending","local","localState","s","pers","persistentStates","tokenFunction","indentFunction","toRegex","caret","flags","ignoreCase","asToken","regex","pend","tok","endToken","endScan","curState","rule","matches","enterLocalMode","persistent","lState","forceEnd","dontIndentStates","rules","dedentIfLineStart","modespec","ie_lt9","idx","shortText","openDialog","prompt","getJumpDialog","interpretLine","num","jumpToLine","posStr","query","caseFold","SearchAnnotation","annotateOptions","listenForChanges","annotation","annotateScrollbar","findMatches","_cm","onChange","MAX_MATCHES","getSearchCursor","multiline","maxMatches","findNext","offsetLine","changeStart","sizeChange","startLine","endLine","newFrom","newTo","updateAfterChange","regexpFlags","regexp","ensureFlags","maybeMultiline","searchRegexpForward","searchRegexpForwardMultiline","inside","lastMatchIn","endMargin","newMatch","searchRegexpBackward","searchRegexpBackwardMultiline","doFold","noFold","normalize","adjustPos","folded","foldFunc","searchStringForward","fold","cutFrom","endString","searchStringBackward","lastIndexOf","topString","SearchCursor","atOccurrence","findPrevious","searchOverlay","SearchState","posFrom","posTo","lastQuery","getSearchState","queryCaseInsensitive","persistentDialog","onEnter","clearSearch","confirmDialog","fs","openConfirm","confirm","parseString","parseQuery","isRE","startSearch","queryText","showMatchesOnScrollbar","annotate","doSearch","rev","immediate","q","hiding","searchNext","opacity","_","getQueryDialog","extra","getReplaceQueryDialog","getReplacementQueryDialog","getDoReplaceConfirm","replaceAll","all","dialogText","advance","doReplace","findPersistent","findPersistentNext","findPersistentPrev","findPrev","WRAP_CLASS","BACK_CLASS","GUTT_CLASS","selectionChange","clearActiveLines","activeLines","updateActiveLines","sameArray","nonEmpty","Annotation","buttonHeight","scrollButtonHeight","annotations","doRedraw","doUpdate","computeScale","scheduleRedraw","redraw","resizeHandler","hScale","anns","singleLineH","curLineObj","getY","topY","nextTop","ann","Bar","orientation","total","startpos","moveTo","innerBox","onWheel","setPos","minButtonSize","scrollSize","clientSize","barSize","sizeChanged","buttonSize","SimpleScrollbars","simple","Count","Maximum","nextToken","ret","classBase","spaceChars","spaceChar","getStyle","getEOL","parserConfig","dokuModes","patterns","exit","innerState","codeFilename","codeLang","linkParam","linkTitle","exitInnerMode","dokuToken","allowedTypes","entries","lang","codeToken","allowedTypess","smileys","behind","wordsRegExp","acronyms","entities","camelcase","emtry","tokenStyles","externalLinkRegExp","schemes","emailLinkRegExp","fileLinkRegExp","connectDokuModes","escapeRegExp","words","escapedWords","email","punc","any","enterInnerMode","blockCommentStart","blockCommentEnd","lineComment","matchPatterns","validLang","allowed","allowedModes","connectMode","allowsType","jQuery","dokuMode","codeModes","apl","asciiarmor","asn.1","asterisk","aspx","bash","brainfuck","c","cassandra","ceylon","clojure","cmake","cobol","coffeescript","cpp","crystal","csharp","cypher","cython","dart","django","dockerfile","dtd","dylan","ebnf","ecl","ecmascript","elm","erb","eiffel","ejs","erlang","factor","fcl","forth","fortran","fsharp","gfm","gherkin","glsl","go","gql","groovy","gss","haml","handlebars","haskell","haskell-literate","haxe","hive","html","html5","http","hxml","idl","ini","jade","java5","java","javascript","jinja2","json","jsonld","jsp","jsx","julia","kotlin","latex","less","lisp","livescript","lua","mariadb","markdown","matlab","mbox","modelica","mscgen","mscgenny","mssql","mumps","mysql","nginx","nsis","ntriples","objc","ocaml","octave","oz","pascal","pgp","pegjs","perl","pgsql","php","pig","plsql","postgresql","powershell","protobuf","python","pug","puppet","rpmchanges","rpmspec","rst","ruby","rust","sas","sass","scala","scheme","scss","sieve","slim","smalltalk","smarty","smarty3","solr","soy","sparql","spreadsheet","sql","squirrel","stylus","swift","tcl","textile","tiddlywiki","tiki","toml","tornado","troff","ttcn","ttcn-cfg","turtle","twig","typescript","vbnet","vbscript","velocity","verilog","vhdl","vue","webidl","xml","xquery","xu","yacas","yaml","yaml-frontmatter","z80","settings","activeline","default_","closebrackets","fontsize","choices","requireKeyMap","linenumbers","matchbrackets","nativeeditor","JSINFO","plugin_codemirror","initCodeMirror","destroyCodeMirror","syntax","showinvisibles","url","initMode","initSettingsMenu","getSetting","codesyntax","each","element","classNames","getCodeMode","onLoadedAsync","loadNextDep","dep","DWgetSelection","DWsetSelection","autoheight","show","indentCommand","Space","Ctrl-Enter","click","usenativescroll","getTime","dw_locktimer","lasttime","setting","hide","dw","setWrap","dw_editor","sizeCtl","currentHeadlineLevel","selection_class","pasteText","editor","is","dw_getText","getText","geText","opts","initSettingsButton","menu","iconURL","btnOffset","btnWidth","outerWidth","menuWidth","menuHeight","outerHeight","appendTo","items","LANG","plugins","codemirror","append","item","submenu","choice","icon","my","ui","icons","siblings","removeClass","hasClass","setSetting","DokuCookie","inArray","intervalID","baseURL"],"mappings":"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","file":"scripts.min.js","sourcesContent":["// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n  var userAgent = navigator.userAgent;\n  var platform = navigator.platform;\n\n  var gecko = /gecko\\/\\d/i.test(userAgent);\n  var ie_upto10 = /MSIE \\d/.test(userAgent);\n  var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n  var edge = /Edge\\/(\\d+)/.exec(userAgent);\n  var ie = ie_upto10 || ie_11up || edge;\n  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n  var webkit = !edge && /WebKit\\//.test(userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n  var chrome = !edge && /Chrome\\//.test(userAgent);\n  var presto = /Opera\\//.test(userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n  var phantom = /PhantomJS/.test(userAgent);\n\n  var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\\/\\w+/.test(userAgent);\n  var android = /Android/.test(userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n  var mac = ios || /Mac/.test(platform);\n  var chromeOS = /\\bCrOS\\b/.test(userAgent);\n  var windows = /win/i.test(platform);\n\n  var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) { presto_version = Number(presto_version[1]); }\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && ie_version >= 9);\n\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  var rmClass = function(node, cls) {\n    var current = node.className;\n    var match = classTest(cls).exec(current);\n    if (match) {\n      var after = current.slice(match.index + match[0].length);\n      node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n    }\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      { e.removeChild(e.firstChild); }\n    return e\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e)\n  }\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) { e.className = className; }\n    if (style) { e.style.cssText = style; }\n    if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n    return e\n  }\n  // wrapper for elt, which removes the elt from the accessibility tree\n  function eltP(tag, content, className, style) {\n    var e = elt(tag, content, className, style);\n    e.setAttribute(\"role\", \"presentation\");\n    return e\n  }\n\n  var range;\n  if (document.createRange) { range = function(node, start, end, endNode) {\n    var r = document.createRange();\n    r.setEnd(endNode || node, end);\n    r.setStart(node, start);\n    return r\n  }; }\n  else { range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    try { r.moveToElementText(node.parentNode); }\n    catch(e) { return r }\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r\n  }; }\n\n  function contains(parent, child) {\n    if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n      { child = child.parentNode; }\n    if (parent.contains)\n      { return parent.contains(child) }\n    do {\n      if (child.nodeType == 11) { child = child.host; }\n      if (child == parent) { return true }\n    } while (child = child.parentNode)\n  }\n\n  function activeElt() {\n    // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n    // IE < 10 will throw when accessed while the page is loading or in an iframe.\n    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n    var activeElement;\n    try {\n      activeElement = document.activeElement;\n    } catch(e) {\n      activeElement = document.body || null;\n    }\n    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n      { activeElement = activeElement.shadowRoot.activeElement; }\n    return activeElement\n  }\n\n  function addClass(node, cls) {\n    var current = node.className;\n    if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n    return b\n  }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n  else if (ie) // Suppress mysterious IE10 errors\n    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args)}\n  }\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  var Delayed = function() {\n    this.id = null;\n    this.f = null;\n    this.time = 0;\n    this.handler = bind(this.onTimeout, this);\n  };\n  Delayed.prototype.onTimeout = function (self) {\n    self.id = 0;\n    if (self.time <= +new Date) {\n      self.f();\n    } else {\n      setTimeout(self.handler, self.time - +new Date);\n    }\n  };\n  Delayed.prototype.set = function (ms, f) {\n    this.f = f;\n    var time = +new Date + ms;\n    if (!this.id || time < this.time) {\n      clearTimeout(this.id);\n      this.id = setTimeout(this.handler, ms);\n      this.time = time;\n    }\n  };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      { if (array[i] == elt) { return i } }\n    return -1\n  }\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerGap = 50;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) { nextTab = string.length; }\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        { return pos + Math.min(skipped, goal - col) }\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) { return pos }\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      { spaceStrs.push(lst(spaceStrs) + \" \"); }\n    return spaceStrs[n]\n  }\n\n  function lst(arr) { return arr[arr.length-1] }\n\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n    return out\n  }\n\n  function insertSorted(array, value, score) {\n    var pos = 0, priority = score(value);\n    while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n    array.splice(pos, 0, value);\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  function isWordCharBasic(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n  }\n  function isWordChar(ch, helper) {\n    if (!helper) { return isWordCharBasic(ch) }\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n    return helper.test(ch)\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n    return true\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n  function skipExtendingChars(str, pos, dir) {\n    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n    return pos\n  }\n\n  // Returns the value from the range [`from`; `to`] that satisfies\n  // `pred` and is closest to `from`. Assumes that at least `to`\n  // satisfies `pred`. Supports `from` being greater than `to`.\n  function findFirst(pred, from, to) {\n    // At any point we are certain `to` satisfies `pred`, don't know\n    // whether `from` does.\n    var dir = from > to ? -1 : 1;\n    for (;;) {\n      if (from == to) { return from }\n      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n      if (mid == from) { return pred(mid) ? from : to }\n      if (pred(mid)) { to = mid; }\n      else { from = mid + dir; }\n    }\n  }\n\n  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) { return f(from, to, \"ltr\", 0) }\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n        found = true;\n      }\n    }\n    if (!found) { f(from, to, \"ltr\"); }\n  }\n\n  var bidiOther = null;\n  function getBidiPartAt(order, ch, sticky) {\n    var found;\n    bidiOther = null;\n    for (var i = 0; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < ch && cur.to > ch) { return i }\n      if (cur.to == ch) {\n        if (cur.from != cur.to && sticky == \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n      if (cur.from == ch) {\n        if (cur.from != cur.to && sticky != \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n    }\n    return found != null ? found : bidiOther\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6f9\n    var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n    function charType(code) {\n      if (code <= 0xf7) { return lowTypes.charAt(code) }\n      else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n      else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n      else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n      else if (code == 0x200c) { return \"b\" }\n      else { return \"L\" }\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str, direction) {\n      var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n      if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n      var len = str.length, types = [];\n      for (var i = 0; i < len; ++i)\n        { types.push(charType(str.charCodeAt(i))); }\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n        var type = types[i$1];\n        if (type == \"m\") { types[i$1] = prev; }\n        else { prev = type; }\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n        var type$1 = types[i$2];\n        if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n        var type$2 = types[i$3];\n        if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n        else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n                 (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n        prev$1 = type$2;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i$4 = 0; i$4 < len; ++i$4) {\n        var type$3 = types[i$4];\n        if (type$3 == \",\") { types[i$4] = \"N\"; }\n        else if (type$3 == \"%\") {\n          var end = (void 0);\n          for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i$4; j < end; ++j) { types[j] = replace; }\n          i$4 = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n        var type$4 = types[i$5];\n        if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n        else if (isStrong.test(type$4)) { cur$1 = type$4; }\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i$6 = 0; i$6 < len; ++i$6) {\n        if (isNeutral.test(types[i$6])) {\n          var end$1 = (void 0);\n          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n          var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n          var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n          var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n          i$6 = end$1 - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i$7 = 0; i$7 < len;) {\n        if (countsAsLeft.test(types[i$7])) {\n          var start = i$7;\n          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n          order.push(new BidiSpan(0, start, i$7));\n        } else {\n          var pos = i$7, at = order.length, isRTL = direction == \"rtl\" ? 1 : 0;\n          for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n          for (var j$2 = pos; j$2 < i$7;) {\n            if (countsAsNum.test(types[j$2])) {\n              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }\n              var nstart = j$2;\n              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n              at += isRTL;\n              pos = j$2;\n            } else { ++j$2; }\n          }\n          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n        }\n      }\n      if (direction == \"ltr\") {\n        if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n          order[0].from = m[0].length;\n          order.unshift(new BidiSpan(0, 0, m[0].length));\n        }\n        if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n          lst(order).to -= m[0].length;\n          order.push(new BidiSpan(0, len - m[0].length, len));\n        }\n      }\n\n      return direction == \"rtl\" ? order.reverse() : order\n    }\n  })();\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line, direction) {\n    var order = line.order;\n    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n    return order\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var noHandlers = [];\n\n  var on = function(emitter, type, f) {\n    if (emitter.addEventListener) {\n      emitter.addEventListener(type, f, false);\n    } else if (emitter.attachEvent) {\n      emitter.attachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers || (emitter._handlers = {});\n      map[type] = (map[type] || noHandlers).concat(f);\n    }\n  };\n\n  function getHandlers(emitter, type) {\n    return emitter._handlers && emitter._handlers[type] || noHandlers\n  }\n\n  function off(emitter, type, f) {\n    if (emitter.removeEventListener) {\n      emitter.removeEventListener(type, f, false);\n    } else if (emitter.detachEvent) {\n      emitter.detachEvent(\"on\" + type, f);\n    } else {\n      var map = emitter._handlers, arr = map && map[type];\n      if (arr) {\n        var index = indexOf(arr, f);\n        if (index > -1)\n          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n      }\n    }\n  }\n\n  function signal(emitter, type /*, values...*/) {\n    var handlers = getHandlers(emitter, type);\n    if (!handlers.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    if (typeof e == \"string\")\n      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) { return }\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n      { set.push(arr[i]); } }\n  }\n\n  function hasHandler(emitter, type) {\n    return getHandlers(emitter, type).length > 0\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  function e_preventDefault(e) {\n    if (e.preventDefault) { e.preventDefault(); }\n    else { e.returnValue = false; }\n  }\n  function e_stopPropagation(e) {\n    if (e.stopPropagation) { e.stopPropagation(); }\n    else { e.cancelBubble = true; }\n  }\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n  }\n  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n  function e_target(e) {return e.target || e.srcElement}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) { b = 1; }\n      else if (e.button & 2) { b = 3; }\n      else if (e.button & 4) { b = 2; }\n    }\n    if (mac && e.ctrlKey && b == 1) { b = 3; }\n    return b\n  }\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie && ie_version < 9) { return false }\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div\n  }();\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n    }\n    var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n      elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n    node.setAttribute(\"cm-text\", \"\");\n    return node\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) { return badBidiRects }\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    removeChildren(measure);\n    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n    return badBidiRects = (r1.right - r0.right < 3)\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) { nl = string.length; }\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result\n  } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n  var hasSelection = window.getSelection ? function (te) {\n    try { return te.selectionStart != te.selectionEnd }\n    catch(e) { return false }\n  } : function (te) {\n    var range;\n    try {range = te.ownerDocument.selection.createRange();}\n    catch(e) {}\n    if (!range || range.parentElement() != te) { return false }\n    return range.compareEndPoints(\"StartToEnd\", range) != 0\n  };\n\n  var hasCopyEvent = (function () {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) { return true }\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\"\n  })();\n\n  var badZoomedRects = null;\n  function hasBadZoomedRects(measure) {\n    if (badZoomedRects != null) { return badZoomedRects }\n    var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n    var normal = node.getBoundingClientRect();\n    var fromRange = range(node, 0, 1).getBoundingClientRect();\n    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n  }\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n    var chunk = doc;\n    while (!chunk.lines) {\n      for (var i = 0;; ++i) {\n        var child = chunk.children[i], sz = child.chunkSize();\n        if (n < sz) { chunk = child; break }\n        n -= sz;\n      }\n    }\n    return chunk.lines[n]\n  }\n\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function (line) {\n      var text = line.text;\n      if (n == end.line) { text = text.slice(0, end.ch); }\n      if (n == start.line) { text = text.slice(start.ch); }\n      out.push(text);\n      ++n;\n    });\n    return out\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n    return out\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\n  function lineNo(line) {\n    if (line.parent == null) { return null }\n    var cur = line.parent, no = indexOf(cur.lines, line);\n    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n      for (var i = 0;; ++i) {\n        if (chunk.children[i] == cur) { break }\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n        var child = chunk.children[i$1], ch = child.height;\n        if (h < ch) { chunk = child; continue outer }\n        h -= ch;\n        n += child.chunkSize();\n      }\n      return n\n    } while (!chunk.lines)\n    var i = 0;\n    for (; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i], lh = line.height;\n      if (h < lh) { break }\n      h -= lh;\n    }\n    return n + i\n  }\n\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber))\n  }\n\n  // A Pos instance represents a position within the text.\n  function Pos(line, ch, sticky) {\n    if ( sticky === void 0 ) sticky = null;\n\n    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n    this.line = line;\n    this.ch = ch;\n    this.sticky = sticky;\n  }\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n  function copyPos(x) {return Pos(x.line, x.ch)}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) { return Pos(doc.first, 0) }\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n    return clipToLen(pos, getLine(doc, pos.line).text.length)\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n    else if (ch < 0) { return Pos(pos.line, 0) }\n    else { return pos }\n  }\n  function clipPosArray(doc, array) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n    return out\n  }\n\n  var SavedContext = function(state, lookAhead) {\n    this.state = state;\n    this.lookAhead = lookAhead;\n  };\n\n  var Context = function(doc, state, line, lookAhead) {\n    this.state = state;\n    this.doc = doc;\n    this.line = line;\n    this.maxLookAhead = lookAhead || 0;\n    this.baseTokens = null;\n    this.baseTokenPos = 1;\n  };\n\n  Context.prototype.lookAhead = function (n) {\n    var line = this.doc.getLine(this.line + n);\n    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n    return line\n  };\n\n  Context.prototype.baseToken = function (n) {\n    if (!this.baseTokens) { return null }\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      { this.baseTokenPos += 2; }\n    var type = this.baseTokens[this.baseTokenPos + 1];\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  };\n\n  Context.prototype.nextLine = function () {\n    this.line++;\n    if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n  };\n\n  Context.fromSaved = function (doc, saved, line) {\n    if (saved instanceof SavedContext)\n      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n    else\n      { return new Context(doc, copyState(doc.mode, saved), line) }\n  };\n\n  Context.prototype.save = function (copy) {\n    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  };\n\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, context, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n            lineClasses, forceToEnd);\n    var state = context.state;\n\n    // Run overlays, adjust style array.\n    var loop = function ( o ) {\n      context.baseTokens = st;\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      context.state = true;\n      runMode(cm, line.text, overlay.mode, context, function (end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            { st.splice(i, 1, end, st[i+1], i_end); }\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) { return }\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n          }\n        }\n      }, lineClasses);\n      context.state = state;\n      context.baseTokens = null;\n      context.baseTokenPos = 1;\n    };\n\n    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n  }\n\n  function getLineStyles(cm, line, updateFrontier) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var context = getContextBefore(cm, lineNo(line));\n      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n      var result = highlightLine(cm, line, context);\n      if (resetState) { context.state = resetState; }\n      line.stateAfter = context.save(!resetState);\n      line.styles = result.styles;\n      if (result.classes) { line.styleClasses = result.classes; }\n      else if (line.styleClasses) { line.styleClasses = null; }\n      if (updateFrontier === cm.doc.highlightFrontier)\n        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n    }\n    return line.styles\n  }\n\n  function getContextBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) { return new Context(doc, true, n) }\n    var start = findStartLine(cm, n, precise);\n    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n    doc.iter(start, n, function (line) {\n      processLine(cm, line.text, context);\n      var pos = context.line;\n      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n      context.nextLine();\n    });\n    if (precise) { doc.modeFrontier = context.line; }\n    return context\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, context, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize, context);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") { callBlankLine(mode, context.state); }\n    while (!stream.eol()) {\n      readToken(mode, stream, context.state);\n      stream.start = stream.pos;\n    }\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) { return mode.blankLine(state) }\n    if (!mode.innerMode) { return }\n    var inner = innerMode(mode, state);\n    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n  }\n\n  function readToken(mode, stream, state, inner) {\n    for (var i = 0; i < 10; i++) {\n      if (inner) { inner[0] = innerMode(mode, state).mode; }\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) { return style }\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n  }\n\n  var Token = function(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos;\n    this.string = stream.current();\n    this.type = type || null;\n    this.state = state;\n  };\n\n  // Utility for getTokenAt and getLineTokens\n  function takeToken(cm, pos, precise, asArray) {\n    var doc = cm.doc, mode = doc.mode, style;\n    pos = clipPos(doc, pos);\n    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n    if (asArray) { tokens = []; }\n    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n      stream.start = stream.pos;\n      style = readToken(mode, stream, context.state);\n      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n    }\n    return asArray ? tokens : new Token(stream, style, context.state)\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) { for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) { break }\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        { output[prop] = lineClass[2]; }\n      else if (!(new RegExp(\"(?:^|\\\\s)\" + lineClass[2] + \"(?:$|\\\\s)\")).test(output[prop]))\n        { output[prop] += \" \" + lineClass[2]; }\n    } }\n    return type\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize, context), style;\n    var inner = cm.options.addModeClass && [null];\n    if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n      }\n      if (inner) {\n        var mName = inner[0].name;\n        if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n      }\n      if (!flattenSpans || curStyle != style) {\n        while (curStart < stream.start) {\n          curStart = Math.min(stream.start, curStart + 5000);\n          f(curStart, curStyle);\n        }\n        curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444\n      // characters, and returns inaccurate measurements in nodes\n      // starting around 5000 chars.\n      var pos = Math.min(stream.pos, curStart + 5000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Finds the line to start with when starting a parse. Tries to\n  // find a line with a stateAfter, so that it can start with a\n  // valid state. If that fails, it returns the line with the\n  // smallest indentation, which tends to need the least context to\n  // parse correctly.\n  function findStartLine(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) { return doc.first }\n      var line = getLine(doc, search - 1), after = line.stateAfter;\n      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n        { return search }\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline\n  }\n\n  function retreatFrontier(doc, n) {\n    doc.modeFrontier = Math.min(doc.modeFrontier, n);\n    if (doc.highlightFrontier < n - 10) { return }\n    var start = doc.first;\n    for (var line = n - 1; line > start; line--) {\n      var saved = getLine(doc, line).stateAfter;\n      // change is on 3\n      // state on line 1 looked ahead 2 -- so saw 3\n      // test 1 + 2 < 3 should cover this\n      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n        start = line + 1;\n        break\n      }\n    }\n    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n  }\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  function seeReadOnlySpans() {\n    sawReadOnlySpans = true;\n  }\n\n  function seeCollapsedSpans() {\n    sawCollapsedSpans = true;\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) { for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) { return span }\n    } }\n  }\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    var r;\n    for (var i = 0; i < spans.length; ++i)\n      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n    return r\n  }\n  // Add a span to a line.\n  function addMarkedSpan(line, span) {\n    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    } }\n    return nw\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    } }\n    return nw\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    if (change.full) { return null }\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) { return null }\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) { span.to = startCh; }\n          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i$1 = 0; i$1 < last.length; ++i$1) {\n        var span$1 = last[i$1];\n        if (span$1.to != null) { span$1.to += offset; }\n        if (span$1.from == null) {\n          var found$1 = getMarkedSpanFor(first, span$1.marker);\n          if (!found$1) {\n            span$1.from = offset;\n            if (sameLine) { (first || (first = [])).push(span$1); }\n          }\n        } else {\n          span$1.from += offset;\n          if (sameLine) { (first || (first = [])).push(span$1); }\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) { first = clearEmptySpans(first); }\n    if (last && last != first) { last = clearEmptySpans(last); }\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        { for (var i$2 = 0; i$2 < first.length; ++i$2)\n          { if (first[i$2].to == null)\n            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n      for (var i$3 = 0; i$3 < gap; ++i$3)\n        { newMarkers.push(gapMarkers); }\n      newMarkers.push(last);\n    }\n    return newMarkers\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        { spans.splice(i--, 1); }\n    }\n    if (!spans.length) { return null }\n    return spans\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function (line) {\n      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          { (markers || (markers = [])).push(mark); }\n      } }\n    });\n    if (!markers) { return null }\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          { newParts.push({from: p.from, to: m.from}); }\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          { newParts.push({from: m.to, to: p.to}); }\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 3;\n      }\n    }\n    return parts\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.detachLine(line); }\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.attachLine(line); }\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) { return lenDiff }\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) { return -fromCmp }\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) { return toCmp }\n    return b.id - a.id\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        { found = sp.marker; }\n    } }\n    return found\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n  function collapsedSpanAround(line, ch) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n    } }\n    return found\n  }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n    var line = getLine(doc, lineNo);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n        { return true }\n    } }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      { line = merged.find(-1, true).line; }\n    return line\n  }\n\n  function visualLineEnd(line) {\n    var merged;\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return line\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line\n      ;(lines || (lines = [])).push(line);\n    }\n    return lines\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) { return lineN }\n    return lineNo(vis)\n  }\n\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) { return lineN }\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) { return lineN }\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return lineNo(line) + 1\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      if (sp.from == null) { return true }\n      if (sp.marker.widgetNode) { continue }\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        { return true }\n    } }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      { return true }\n    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) { return true }\n    }\n  }\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) { break }\n      else { h += line.height; }\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n        var cur = p.children[i$1];\n        if (cur == chunk) { break }\n        else { h += cur.height; }\n      }\n    }\n    return h\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) { return 0 }\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found$1 = merged.find(0, true);\n      len -= cur.text.length - found$1.from.ch;\n      cur = found$1.to.line;\n      len += cur.text.length - found$1.to.ch;\n    }\n    return len\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function (line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n\n  Line.prototype.lineNo = function () { return lineNo(this) };\n  eventMixin(Line);\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) { line.stateAfter = null; }\n    if (line.styles) { line.styles = null; }\n    if (line.order != null) { line.order = null; }\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) { return null }\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                   col: 0, pos: 0, cm: cm,\n                   trailingSpace: false,\n                   splitSpaces: cm.getOption(\"lineWrapping\")};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n      builder.map = [];\n      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n        if (line.styleClasses.textClass)\n          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    // See issue #2901\n    if (webkit) {\n      var last = builder.content.lastChild;\n      if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n        { builder.content.className = \"cm-tab-wrap-hack\"; }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    if (builder.pre.className)\n      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n    return builder\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    token.setAttribute(\"aria-label\", token.title);\n    return token\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {\n    if (!text) { return }\n    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n    var special = builder.cm.state.specialChars, mustWrap = false;\n    var content;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      content = document.createTextNode(displayText);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie && ie_version < 9) { mustWrap = true; }\n      builder.pos += text.length;\n    } else {\n      content = document.createDocumentFragment();\n      var pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n          else { content.appendChild(txt); }\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) { break }\n        pos += skipped + 1;\n        var txt$1 = (void 0);\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          txt$1.setAttribute(\"role\", \"presentation\");\n          txt$1.setAttribute(\"cm-text\", \"\\t\");\n          builder.col += tabWidth;\n        } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n          txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          builder.col += 1;\n        } else {\n          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n          else { content.appendChild(txt$1); }\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt$1);\n        builder.pos++;\n      }\n    }\n    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n    if (style || startStyle || endStyle || mustWrap || css) {\n      var fullStyle = style || \"\";\n      if (startStyle) { fullStyle += startStyle; }\n      if (endStyle) { fullStyle += endStyle; }\n      var token = elt(\"span\", [content], fullStyle, css);\n      if (attributes) {\n        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != \"style\" && attr != \"class\")\n          { token.setAttribute(attr, attributes[attr]); } }\n      }\n      return builder.content.appendChild(token)\n    }\n    builder.content.appendChild(content);\n  }\n\n  // Change some spaces to NBSP to prevent the browser from collapsing\n  // trailing spaces at the end of a line when rendering text (issue #1362).\n  function splitSpaces(text, trailingBefore) {\n    if (text.length > 1 && !/  /.test(text)) { return text }\n    var spaceBefore = trailingBefore, result = \"\";\n    for (var i = 0; i < text.length; i++) {\n      var ch = text.charAt(i);\n      if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n        { ch = \"\\u00a0\"; }\n      result += ch;\n      spaceBefore = ch == \" \";\n    }\n    return result\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function (builder, text, style, startStyle, endStyle, css, attributes) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        var part = (void 0);\n        for (var i = 0; i < order.length; i++) {\n          part = order[i];\n          if (part.to > start && part.from <= start) { break }\n        }\n        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    }\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n      if (!widget)\n        { widget = builder.content.appendChild(document.createElement(\"span\")); }\n      widget.setAttribute(\"cm-marker\", marker.id);\n    }\n    if (widget) {\n      builder.cm.display.input.setUneditable(widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n    builder.trailingSpace = false;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n      return\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = css = \"\";\n        attributes = null;\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [], endStyles = (void 0);\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n            foundBookmarks.push(m);\n          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n            if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n              nextChange = sp.to;\n              spanEndStyle = \"\";\n            }\n            if (m.className) { spanStyle += \" \" + m.className; }\n            if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n            if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n            // support for the old title property\n            // https://github.com/codemirror/CodeMirror/pull/5673\n            if (m.title) { (attributes || (attributes = {})).title = m.title; }\n            if (m.attributes) {\n              for (var attr in m.attributes)\n                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }\n            }\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              { collapsed = sp; }\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n        }\n        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) { return }\n          if (collapsed.to == pos) { collapsed = false; }\n        }\n      }\n      if (pos >= len) { break }\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", css, attributes);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array\n  }\n\n  var operationGroup = null;\n\n  function pushOperation(op) {\n    if (operationGroup) {\n      operationGroup.ops.push(op);\n    } else {\n      op.ownsGroup = operationGroup = {\n        ops: [op],\n        delayedCallbacks: []\n      };\n    }\n  }\n\n  function fireCallbacksForOps(group) {\n    // Calls delayed callbacks and cursorActivity handlers until no\n    // new ones appear\n    var callbacks = group.delayedCallbacks, i = 0;\n    do {\n      for (; i < callbacks.length; i++)\n        { callbacks[i].call(null); }\n      for (var j = 0; j < group.ops.length; j++) {\n        var op = group.ops[j];\n        if (op.cursorActivityHandlers)\n          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n      }\n    } while (i < callbacks.length)\n  }\n\n  function finishOperation(op, endCb) {\n    var group = op.ownsGroup;\n    if (!group) { return }\n\n    try { fireCallbacksForOps(group); }\n    finally {\n      operationGroup = null;\n      endCb(group);\n    }\n  }\n\n  var orphanDelayedCallbacks = null;\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = getHandlers(emitter, type);\n    if (!arr.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2), list;\n    if (operationGroup) {\n      list = operationGroup.delayedCallbacks;\n    } else if (orphanDelayedCallbacks) {\n      list = orphanDelayedCallbacks;\n    } else {\n      list = orphanDelayedCallbacks = [];\n      setTimeout(fireOrphanDelayed, 0);\n    }\n    var loop = function ( i ) {\n      list.push(function () { return arr[i].apply(null, args); });\n    };\n\n    for (var i = 0; i < arr.length; ++i)\n      loop( i );\n  }\n\n  function fireOrphanDelayed() {\n    var delayed = orphanDelayedCallbacks;\n    orphanDelayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") { updateLineText(cm, lineView); }\n      else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n      else if (type == \"class\") { updateLineClasses(cm, lineView); }\n      else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n      lineView.node.appendChild(lineView.text);\n      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n    }\n    return lineView.node\n  }\n\n  function updateLineBackground(cm, lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) { cls += \" CodeMirror-linebackground\"; }\n    if (lineView.background) {\n      if (cls) { lineView.background.className = cls; }\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n      cm.display.input.setUneditable(lineView.background);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built\n    }\n    return buildLineContent(cm, lineView)\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) { lineView.node = built.pre; }\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(cm, lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(cm, lineView) {\n    updateLineBackground(cm, lineView);\n    if (lineView.line.wrapClass)\n      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n    else if (lineView.node != lineView.text)\n      { lineView.node.className = \"\"; }\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    if (lineView.gutterBackground) {\n      lineView.node.removeChild(lineView.gutterBackground);\n      lineView.gutterBackground = null;\n    }\n    if (lineView.line.gutterClass) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                      (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(lineView.gutterBackground);\n      wrap.insertBefore(lineView.gutterBackground, lineView.text);\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap$1 = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(gutterWrap);\n      wrap$1.insertBefore(gutterWrap, lineView.text);\n      if (lineView.line.gutterClass)\n        { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        { lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {\n        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                     (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n      } }\n    }\n  }\n\n  function updateLineWidgets(cm, lineView, dims) {\n    if (lineView.alignable) { lineView.alignable = null; }\n    var isWidget = classTest(\"CodeMirror-linewidget\");\n    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n      next = node.nextSibling;\n      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }\n    }\n    insertLineWidgets(cm, lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) { lineView.bgClass = built.bgClass; }\n    if (built.textClass) { lineView.textClass = built.textClass; }\n\n    updateLineClasses(cm, lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(cm, lineView, dims);\n    return lineView.node\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(cm, lineView, dims) {\n    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n  }\n\n  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n    if (!line.widgets) { return }\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\" + (widget.className ? \" \" + widget.className : \"\"));\n      if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n      positionLineWidget(widget, node, lineView, dims);\n      cm.display.input.setUneditable(node);\n      if (allowAbove && widget.above)\n        { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n      else\n        { wrap.appendChild(node); }\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n  (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n    }\n  }\n\n  function widgetHeight(widget) {\n    if (widget.height != null) { return widget.height }\n    var cm = widget.doc.cm;\n    if (!cm) { return 0 }\n    if (!contains(document.body, widget.node)) {\n      var parentStyle = \"position: relative;\";\n      if (widget.coverGutter)\n        { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n      if (widget.noHScroll)\n        { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n      removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n    }\n    return widget.height = widget.node.parentNode.offsetHeight\n  }\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n          (n.parentNode == display.sizer && n != display.mover))\n        { return true }\n    }\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n  function paddingH(display) {\n    if (display.cachedPaddingH) { return display.cachedPaddingH }\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\", \"CodeMirror-line-like\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n    return data\n  }\n\n  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n  function displayWidth(cm) {\n    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n  }\n  function displayHeight(cm) {\n    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && displayWidth(cm);\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n    for (var i = 0; i < lineView.rest.length; i++)\n      { if (lineView.rest[i] == line)\n        { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n    for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n      { if (lineNo(lineView.rest[i$1]) > lineN)\n        { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      { return cm.display.view[findViewIndex(cm, lineN)] }\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      { return ext }\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text) {\n      view = null;\n    } else if (view && view.changes) {\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n      cm.curOp.forceUpdate = true;\n    }\n    if (!view)\n      { view = updateExternalMeasurement(cm, line); }\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    }\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n    if (prepared.before) { ch = -1; }\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) { prepared.cache[key] = found; }\n    }\n    return {left: found.left, right: found.right,\n            top: varHeight ? found.rtop : found.top,\n            bottom: varHeight ? found.rbottom : found.bottom}\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function nodeAndOffsetInLineMap(map, ch, bias) {\n    var node, start, end, collapse, mStart, mEnd;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map.length; i += 3) {\n      mStart = map[i];\n      mEnd = map[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) { collapse = \"right\"; }\n      }\n      if (start != null) {\n        node = map[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          { collapse = bias; }\n        if (bias == \"left\" && start == 0)\n          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n            node = map[(i -= 3) + 2];\n            collapse = \"left\";\n          } }\n        if (bias == \"right\" && start == mEnd - mStart)\n          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n            node = map[(i += 3) + 2];\n            collapse = \"right\";\n          } }\n        break\n      }\n    }\n    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n  }\n\n  function getUsefulRect(rects, bias) {\n    var rect = nullRect;\n    if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n      if ((rect = rects[i]).left != rect.right) { break }\n    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n      if ((rect = rects[i$1]).left != rect.right) { break }\n    } }\n    return rect\n  }\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n          { rect = node.parentNode.getBoundingClientRect(); }\n        else\n          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n        if (rect.left || rect.right || start == 0) { break }\n        end = start;\n        start = start - 1;\n        collapse = \"right\";\n      }\n      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) { collapse = bias = \"right\"; }\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n      else\n        { rect = node.getBoundingClientRect(); }\n    }\n    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n      else\n        { rect = nullRect; }\n    }\n\n    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n    var mid = (rtop + rbot) / 2;\n    var heights = prepared.view.measure.heights;\n    var i = 0;\n    for (; i < heights.length - 1; i++)\n      { if (mid < heights[i]) { break } }\n    var top = i ? heights[i - 1] : 0, bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) { result.bogus = true; }\n    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n    return result\n  }\n\n  // Work around problem with bounding client rects on ranges being\n  // returned incorrectly when zoomed on IE10 and below.\n  function maybeUpdateRectForZooming(measure, rect) {\n    if (!window.screen || screen.logicalXDPI == null ||\n        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n      { return rect }\n    var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n    var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n    return {left: rect.left * scaleX, right: rect.right * scaleX,\n            top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n        { lineView.measure.caches[i] = {}; } }\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      { clearLineMeasurementCacheFor(cm.display.view[i]); }\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX() {\n    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n    // which causes page_Offset and bounding client rects to use\n    // different reference viewports and invalidate our calculations.\n    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n    return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n  }\n  function pageScrollY() {\n    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n    return window.pageYOffset || (document.documentElement || document.body).scrollTop\n  }\n\n  function widgetTopHeight(lineObj) {\n    var height = 0;\n    if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)\n      { height += widgetHeight(lineObj.widgets[i]); } } }\n    return height\n  }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n  // or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n    if (!includeWidgets) {\n      var height = widgetTopHeight(lineObj);\n      rect.top += height; rect.bottom += height;\n    }\n    if (context == \"line\") { return rect }\n    if (!context) { context = \"local\"; }\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") { yOff += paddingTop(cm.display); }\n    else { yOff -= cm.display.viewOffset; }\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") { return coords }\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX();\n      top -= pageScrollY();\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n  // and after `char - 1` in writing order of `char - 1`\n  // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n  // and before `char` in writing order of `char`\n  // Examples (upper-case letters are RTL, lower-case are LTR):\n  //     Pos(0, 1, ...)\n  //     before   after\n  // ab     a|b     a|b\n  // aB     a|B     aB|\n  // Ab     |Ab     A|b\n  // AB     B|A     B|A\n  // Every position after the last character on a line is considered to stick\n  // to the last character on the line.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n      if (right) { m.left = m.right; } else { m.right = m.left; }\n      return intoCoordSystem(cm, lineObj, m, context)\n    }\n    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n    if (ch >= lineObj.text.length) {\n      ch = lineObj.text.length;\n      sticky = \"before\";\n    } else if (ch <= 0) {\n      ch = 0;\n      sticky = \"after\";\n    }\n    if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n    function getBidi(ch, partPos, invert) {\n      var part = order[partPos], right = part.level == 1;\n      return get(invert ? ch - 1 : ch, right != invert)\n    }\n    var partPos = getBidiPartAt(order, ch, sticky);\n    var other = bidiOther;\n    var val = getBidi(ch, partPos, sticky == \"before\");\n    if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n    return val\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0;\n    pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height}\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, sticky, outside, xRel) {\n    var pos = Pos(line, ch, sticky);\n    pos.xRel = xRel;\n    if (outside) { pos.outside = outside; }\n    return pos\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }\n    if (x < 0) { x = 0; }\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));\n      if (!collapsed) { return found }\n      var rangeEnd = collapsed.find(1);\n      if (rangeEnd.line == lineN) { return rangeEnd }\n      lineObj = getLine(doc, lineN = rangeEnd.line);\n    }\n  }\n\n  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n    y -= widgetTopHeight(lineObj);\n    var end = lineObj.text.length;\n    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n    return {begin: begin, end: end}\n  }\n\n  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n  }\n\n  // Returns true if the given side of a box is after the given\n  // coordinates, in top-to-bottom, left-to-right order.\n  function boxIsAfter(box, x, y, left) {\n    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo, x, y) {\n    // Move y into line-local coordinate space\n    y -= heightAtLine(lineObj);\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    // When directly calling `measureCharPrepared`, we have to adjust\n    // for the widgets at this line.\n    var widgetHeight = widgetTopHeight(lineObj);\n    var begin = 0, end = lineObj.text.length, ltr = true;\n\n    var order = getOrder(lineObj, cm.doc.direction);\n    // If the line isn't plain left-to-right text, first figure out\n    // which bidi section the coordinates fall into.\n    if (order) {\n      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);\n      ltr = part.level != 1;\n      // The awkward -1 offsets are needed because findFirst (called\n      // on these below) will treat its first bound as inclusive,\n      // second as exclusive, but we want to actually address the\n      // characters in the part's range\n      begin = ltr ? part.from : part.to - 1;\n      end = ltr ? part.to : part.from - 1;\n    }\n\n    // A binary search to find the first character whose bounding box\n    // starts after the coordinates. If we run across any whose box wrap\n    // the coordinates, store that.\n    var chAround = null, boxAround = null;\n    var ch = findFirst(function (ch) {\n      var box = measureCharPrepared(cm, preparedMeasure, ch);\n      box.top += widgetHeight; box.bottom += widgetHeight;\n      if (!boxIsAfter(box, x, y, false)) { return false }\n      if (box.top <= y && box.left <= x) {\n        chAround = ch;\n        boxAround = box;\n      }\n      return true\n    }, begin, end);\n\n    var baseX, sticky, outside = false;\n    // If a box around the coordinates was found, use that\n    if (boxAround) {\n      // Distinguish coordinates nearer to the left or right side of the box\n      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n      ch = chAround + (atStart ? 0 : 1);\n      sticky = atStart ? \"after\" : \"before\";\n      baseX = atLeft ? boxAround.left : boxAround.right;\n    } else {\n      // (Adjust for extended bound, if necessary.)\n      if (!ltr && (ch == end || ch == begin)) { ch++; }\n      // To determine which side to associate with, get the box to the\n      // left of the character and compare it's vertical position to the\n      // coordinates\n      sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?\n        \"after\" : \"before\";\n      // Now get accurate coordinates for this place, in order to get a\n      // base X position\n      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), \"line\", lineObj, preparedMeasure);\n      baseX = coords.left;\n      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;\n    }\n\n    ch = skipExtendingChars(lineObj.text, ch, 1);\n    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)\n  }\n\n  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {\n    // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n    // situation, we can take this ordering to correspond to the visual\n    // ordering. This finds the first part whose end is after the given\n    // coordinates.\n    var index = findFirst(function (i) {\n      var part = order[i], ltr = part.level != 1;\n      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                     \"line\", lineObj, preparedMeasure), x, y, true)\n    }, 0, order.length - 1);\n    var part = order[index];\n    // If this isn't the first part, the part's start is also after\n    // the coordinates, and the coordinates aren't on the same line as\n    // that start, move one part back.\n    if (index > 0) {\n      var ltr = part.level != 1;\n      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                               \"line\", lineObj, preparedMeasure);\n      if (boxIsAfter(start, x, y, true) && start.top > y)\n        { part = order[index - 1]; }\n    }\n    return part\n  }\n\n  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n    // In a wrapped line, rtl text on wrapping boundaries can do things\n    // that don't correspond to the ordering in our `order` array at\n    // all, so a binary search doesn't work, and we want to return a\n    // part that only spans one line so that the binary search in\n    // coordsCharInner is safe. As such, we first find the extent of the\n    // wrapped line, and then do a flat search in which we discard any\n    // spans that aren't on the line.\n    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n    var begin = ref.begin;\n    var end = ref.end;\n    if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n    var part = null, closestDist = null;\n    for (var i = 0; i < order.length; i++) {\n      var p = order[i];\n      if (p.from >= end || p.to <= begin) { continue }\n      var ltr = p.level != 1;\n      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n      // Weigh against spans ending before this, so that they are only\n      // picked if nothing ends after\n      var dist = endX < x ? x - endX + 1e9 : endX - x;\n      if (!part || closestDist > dist) {\n        part = p;\n        closestDist = dist;\n      }\n    }\n    if (!part) { part = order[order.length - 1]; }\n    // Clip the part to the wrapped line.\n    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n    return part\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n    if (measureText == null) {\n      measureText = elt(\"pre\", null, \"CodeMirror-line-like\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) { display.cachedTextHeight = height; }\n    removeChildren(display.measure);\n    return height || 1\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor], \"CodeMirror-line-like\");\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) { display.cachedCharWidth = width; }\n    return width || 10\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    var gutterLeft = d.gutters.clientLeft;\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      var id = cm.display.gutterSpecs[i].className;\n      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;\n      width[id] = n.clientWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth}\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function (line) {\n      if (lineIsHidden(cm.doc, line)) { return 0 }\n\n      var widgetsHeight = 0;\n      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n      } }\n\n      if (wrapping)\n        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n      else\n        { return widgetsHeight + th }\n    }\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function (line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n    });\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e$1) { return null }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) { return null }\n    n -= cm.display.viewFrom;\n    if (n < 0) { return null }\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) { return i }\n    }\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) { from = cm.doc.first; }\n    if (to == null) { to = cm.doc.first + cm.doc.size; }\n    if (!lendiff) { lendiff = 0; }\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      { display.updateLineNumbers = from; }\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        { resetView(cm); }\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut$1 = viewCuttingPoint(cm, from, from, -1);\n      if (cut$1) {\n        display.view = display.view.slice(0, cut$1.index);\n        display.viewTo = cut$1.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        { ext.lineN += lendiff; }\n      else if (from < ext.lineN + ext.size)\n        { display.externalMeasured = null; }\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      { display.externalMeasured = null; }\n\n    if (line < display.viewFrom || line >= display.viewTo) { return }\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) { return }\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) { arr.push(type); }\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      { return {index: index, lineN: newN} }\n    var n = cm.display.viewFrom;\n    for (var i = 0; i < index; i++)\n      { n += view[i].size; }\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) { return null }\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN}\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n      else if (display.viewFrom < from)\n        { display.view = display.view.slice(findViewIndex(cm, from)); }\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n      else if (display.viewTo > to)\n        { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n    }\n    return dirty\n  }\n\n  function updateSelection(cm) {\n    cm.display.input.showSelection(cm.display.input.prepareSelection());\n  }\n\n  function prepareSelection(cm, primary) {\n    if ( primary === void 0 ) primary = true;\n\n    var doc = cm.doc, result = {};\n    var curFragment = result.cursors = document.createDocumentFragment();\n    var selFragment = result.selection = document.createDocumentFragment();\n\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      if (!primary && i == doc.sel.primIndex) { continue }\n      var range = doc.sel.ranges[i];\n      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }\n      var collapsed = range.empty();\n      if (collapsed || cm.options.showCursorWhenSelecting)\n        { drawSelectionCursor(cm, range.head, curFragment); }\n      if (!collapsed)\n        { drawSelectionRange(cm, range, selFragment); }\n    }\n    return result\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, head, output) {\n    var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left;\n    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n    var docLTR = doc.direction == \"ltr\";\n\n    function add(left, top, width, bottom) {\n      if (top < 0) { top = 0; }\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n                             top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n                             height: \" + (bottom - top) + \"px\")));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n      }\n\n      function wrapX(pos, dir, side) {\n        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n        var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n        var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n        return coords(ch, prop)[prop]\n      }\n\n      var order = getOrder(lineObj, doc.direction);\n      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n        var ltr = dir == \"ltr\";\n        var fromPos = coords(from, ltr ? \"left\" : \"right\");\n        var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n        var first = i == 0, last = !order || i == order.length - 1;\n        if (toPos.top - fromPos.top <= 3) { // Single line\n          var openLeft = (docLTR ? openStart : openEnd) && first;\n          var openRight = (docLTR ? openEnd : openStart) && last;\n          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n          add(left, fromPos.top, right - left, fromPos.bottom);\n        } else { // Multiple lines\n          var topLeft, topRight, botLeft, botRight;\n          if (ltr) {\n            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n            topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n            botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n            botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n          } else {\n            topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n            botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n          }\n          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n        }\n\n        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n        if (cmpCoords(toPos, start) < 0) { start = toPos; }\n        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n        if (cmpCoords(toPos, end) < 0) { end = toPos; }\n      });\n      return {start: start, end: end}\n    }\n\n    var sFrom = range.from(), sTo = range.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) { return }\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\"; },\n        cm.options.cursorBlinkRate); }\n    else if (cm.options.cursorBlinkRate < 0)\n      { display.cursorDiv.style.visibility = \"hidden\"; }\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }\n  }\n\n  function delayBlurEvent(cm) {\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { if (cm.state.delayingBlurEvent) {\n      cm.state.delayingBlurEvent = false;\n      onBlur(cm);\n    } }, 100);\n  }\n\n  function onFocus(cm, e) {\n    if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; }\n\n    if (cm.options.readOnly == \"nocursor\") { return }\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm, e);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // This test prevents this from firing when a context\n      // menu is closed (since the input reset would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        cm.display.input.reset();\n        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n      }\n      cm.display.input.receivedFocus();\n    }\n    restartBlink(cm);\n  }\n  function onBlur(cm, e) {\n    if (cm.state.delayingBlurEvent) { return }\n\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm, e);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], wrapping = cm.options.lineWrapping;\n      var height = (void 0), width = 0;\n      if (cur.hidden) { continue }\n      if (ie && ie_version < 8) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n        // Check that lines don't extend past the right of the current\n        // editor width\n        if (!wrapping && cur.text.firstChild)\n          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }\n      }\n      var diff = cur.line.height - height;\n      if (diff > .005 || diff < -.005) {\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n          { updateWidgetHeight(cur.rest[j]); } }\n      }\n      if (width > cm.display.sizerWidth) {\n        var chWidth = Math.ceil(width / charWidth(cm.display));\n        if (chWidth > cm.display.maxLineLength) {\n          cm.display.maxLineLength = chWidth;\n          cm.display.maxLine = cur.line;\n          cm.display.maxLineChanged = true;\n        }\n      }\n    }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n      var w = line.widgets[i], parent = w.node.parentNode;\n      if (parent) { w.height = parent.offsetHeight; }\n    } }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the the current scroll position). viewport may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewport) {\n    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewport && viewport.ensure) {\n      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n      if (ensureFrom < from) {\n        from = ensureFrom;\n        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n        to = ensureTo;\n      }\n    }\n    return {from: from, to: Math.max(to, from + 1)}\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, rect) {\n    if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    if (rect.top + box.top < 0) { doScroll = true; }\n    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n                         top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n                         height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n                         left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) { margin = 0; }\n    var rect;\n    if (!cm.options.lineWrapping && pos == end) {\n      // Set pos and end to the cursor positions around the character pos sticks to\n      // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n      // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n      pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n      end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n    }\n    for (var limit = 0; limit < 5; limit++) {\n      var changed = false;\n      var coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      rect = {left: Math.min(coords.left, endCoords.left),\n              top: Math.min(coords.top, endCoords.top) - margin,\n              right: Math.max(coords.left, endCoords.left),\n              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n      var scrollPos = calculateScrollPos(cm, rect);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        updateScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n      }\n      if (!changed) { break }\n    }\n    return rect\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, rect) {\n    var scrollPos = calculateScrollPos(cm, rect);\n    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, rect) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (rect.top < 0) { rect.top = 0; }\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = displayHeight(cm), result = {};\n    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n    if (rect.top < screentop) {\n      result.scrollTop = atTop ? 0 : rect.top;\n    } else if (rect.bottom > screentop + screen) {\n      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n      if (newTop != screentop) { result.scrollTop = newTop; }\n    }\n\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n    var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);\n    var tooWide = rect.right - rect.left > screenw;\n    if (tooWide) { rect.right = rect.left + screenw; }\n    if (rect.left < 10)\n      { result.scrollLeft = 0; }\n    else if (rect.left < screenleft)\n      { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); }\n    else if (rect.right > screenw + screenleft - 3)\n      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n    return result\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollTop(cm, top) {\n    if (top == null) { return }\n    resolveScrollToPos(cm);\n    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor();\n    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n  }\n\n  function scrollToCoords(cm, x, y) {\n    if (x != null || y != null) { resolveScrollToPos(cm); }\n    if (x != null) { cm.curOp.scrollLeft = x; }\n    if (y != null) { cm.curOp.scrollTop = y; }\n  }\n\n  function scrollToRange(cm, range) {\n    resolveScrollToPos(cm);\n    cm.curOp.scrollToPos = range;\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range = cm.curOp.scrollToPos;\n    if (range) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n      scrollToCoordsRange(cm, from, to, range.margin);\n    }\n  }\n\n  function scrollToCoordsRange(cm, from, to, margin) {\n    var sPos = calculateScrollPos(cm, {\n      left: Math.min(from.left, to.left),\n      top: Math.min(from.top, to.top) - margin,\n      right: Math.max(from.right, to.right),\n      bottom: Math.max(from.bottom, to.bottom) + margin\n    });\n    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n  }\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function updateScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n    if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n    setScrollTop(cm, val, true);\n    if (gecko) { updateDisplaySimple(cm); }\n    startWorker(cm, 100);\n  }\n\n  function setScrollTop(cm, val, forceScroll) {\n    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));\n    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n    cm.doc.scrollTop = val;\n    cm.display.scrollbars.setScrollTop(val);\n    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n  }\n\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller, forceScroll) {\n    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));\n    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n    cm.display.scrollbars.setScrollLeft(val);\n  }\n\n  // SCROLLBARS\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var d = cm.display, gutterW = d.gutters.offsetWidth;\n    var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n    return {\n      clientHeight: d.scroller.clientHeight,\n      viewHeight: d.wrapper.clientHeight,\n      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n      viewWidth: d.wrapper.clientWidth,\n      barLeft: cm.options.fixedGutter ? gutterW : 0,\n      docHeight: docH,\n      scrollHeight: docH + scrollGap(cm) + d.barHeight,\n      nativeBarWidth: d.nativeBarWidth,\n      gutterWidth: gutterW\n    }\n  }\n\n  var NativeScrollbars = function(place, scroll, cm) {\n    this.cm = cm;\n    var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    vert.tabIndex = horiz.tabIndex = -1;\n    place(vert); place(horiz);\n\n    on(vert, \"scroll\", function () {\n      if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n    });\n    on(horiz, \"scroll\", function () {\n      if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n    });\n\n    this.checkedZeroWidth = false;\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n  };\n\n  NativeScrollbars.prototype.update = function (measure) {\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    var sWidth = measure.nativeBarWidth;\n\n    if (needsV) {\n      this.vert.style.display = \"block\";\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n    } else {\n      this.vert.style.display = \"\";\n      this.vert.firstChild.style.height = \"0\";\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\";\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n      this.horiz.style.left = measure.barLeft + \"px\";\n      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n    } else {\n      this.horiz.style.display = \"\";\n      this.horiz.firstChild.style.width = \"0\";\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) { this.zeroWidthHack(); }\n      this.checkedZeroWidth = true;\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  };\n\n  NativeScrollbars.prototype.setScrollLeft = function (pos) {\n    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n  };\n\n  NativeScrollbars.prototype.setScrollTop = function (pos) {\n    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n  };\n\n  NativeScrollbars.prototype.zeroWidthHack = function () {\n    var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n    this.horiz.style.height = this.vert.style.width = w;\n    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n    this.disableHoriz = new Delayed;\n    this.disableVert = new Delayed;\n  };\n\n  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n    bar.style.pointerEvents = \"auto\";\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      var box = bar.getBoundingClientRect();\n      var elt = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n      if (elt != bar) { bar.style.pointerEvents = \"none\"; }\n      else { delay.set(1000, maybeDisable); }\n    }\n    delay.set(1000, maybeDisable);\n  };\n\n  NativeScrollbars.prototype.clear = function () {\n    var parent = this.horiz.parentNode;\n    parent.removeChild(this.horiz);\n    parent.removeChild(this.vert);\n  };\n\n  var NullScrollbars = function () {};\n\n  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n  NullScrollbars.prototype.setScrollLeft = function () {};\n  NullScrollbars.prototype.setScrollTop = function () {};\n  NullScrollbars.prototype.clear = function () {};\n\n  function updateScrollbars(cm, measure) {\n    if (!measure) { measure = measureForScrollbars(cm); }\n    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n    updateScrollbarsInner(cm, measure);\n    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n        { updateHeightsInViewport(cm); }\n      updateScrollbarsInner(cm, measureForScrollbars(cm));\n      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n    }\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbarsInner(cm, measure) {\n    var d = cm.display;\n    var sizes = d.scrollbars.update(measure);\n\n    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n    d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n    if (sizes.right && sizes.bottom) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n      d.scrollbarFiller.style.width = sizes.right + \"px\";\n    } else { d.scrollbarFiller.style.display = \"\"; }\n    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = sizes.bottom + \"px\";\n      d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n    } else { d.gutterFiller.style.display = \"\"; }\n  }\n\n  var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n  function initScrollbars(cm) {\n    if (cm.display.scrollbars) {\n      cm.display.scrollbars.clear();\n      if (cm.display.scrollbars.addClass)\n        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n    }\n\n    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n      // Prevent clicks in the scrollbars from killing focus\n      on(node, \"mousedown\", function () {\n        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n      });\n      node.setAttribute(\"cm-not-content\", \"true\");\n    }, function (pos, axis) {\n      if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n      else { updateScrollTop(cm, pos); }\n    }, cm);\n    if (cm.display.scrollbars.addClass)\n      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n  }\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      cm: cm,\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: 0,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      focus: false,\n      id: ++nextOpId           // Unique ID\n    };\n    pushOperation(cm.curOp);\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp;\n    if (op) { finishOperation(op, function (group) {\n      for (var i = 0; i < group.ops.length; i++)\n        { group.ops[i].cm.curOp = null; }\n      endOperations(group);\n    }); }\n  }\n\n  // The DOM updates done when an operation finishes are batched so\n  // that the minimum number of relayouts are required.\n  function endOperations(group) {\n    var ops = group.ops;\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      { endOperation_R1(ops[i]); }\n    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n      { endOperation_W1(ops[i$1]); }\n    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n      { endOperation_R2(ops[i$2]); }\n    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n      { endOperation_W2(ops[i$3]); }\n    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n      { endOperation_finish(ops[i$4]); }\n  }\n\n  function endOperation_R1(op) {\n    var cm = op.cm, display = cm.display;\n    maybeClipScrollbars(cm);\n    if (op.updateMaxLine) { findMaxLine(cm); }\n\n    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                         op.scrollToPos.to.line >= display.viewTo) ||\n      display.maxLineChanged && cm.options.lineWrapping;\n    op.update = op.mustUpdate &&\n      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n  }\n\n  function endOperation_W1(op) {\n    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n  }\n\n  function endOperation_R2(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n    op.barMeasure = measureForScrollbars(cm);\n\n    // If the max line changed since it was last measured, measure it,\n    // and ensure the document's width matches it.\n    // updateDisplay_W2 will use these properties to do the actual resizing\n    if (display.maxLineChanged && !cm.options.lineWrapping) {\n      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n      cm.display.sizerWidth = op.adjustWidthTo;\n      op.barMeasure.scrollWidth =\n        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n    }\n\n    if (op.updatedDisplay || op.selectionChanged)\n      { op.preparedSelection = display.input.prepareSelection(); }\n  }\n\n  function endOperation_W2(op) {\n    var cm = op.cm;\n\n    if (op.adjustWidthTo != null) {\n      cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n      if (op.maxScrollLeft < cm.doc.scrollLeft)\n        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n      cm.display.maxLineChanged = false;\n    }\n\n    var takeFocus = op.focus && op.focus == activeElt();\n    if (op.preparedSelection)\n      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n    if (op.updatedDisplay || op.startHeight != cm.doc.height)\n      { updateScrollbars(cm, op.barMeasure); }\n    if (op.updatedDisplay)\n      { setDocumentHeight(cm, op.barMeasure); }\n\n    if (op.selectionChanged) { restartBlink(cm); }\n\n    if (cm.state.focused && op.updateInput)\n      { cm.display.input.reset(op.typing); }\n    if (takeFocus) { ensureFocus(op.cm); }\n  }\n\n  function endOperation_finish(op) {\n    var cm = op.cm, display = cm.display, doc = cm.doc;\n\n    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n    // Abort mouse wheel delta measurement, when scrolling explicitly\n    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n      { display.wheelStartX = display.wheelStartY = null; }\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n      maybeScrollWindow(cm, rect);\n    }\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) { for (var i = 0; i < hidden.length; ++i)\n      { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n    if (display.wrapper.offsetHeight)\n      { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      { signal(cm, \"changes\", cm, op.changeObjs); }\n    if (op.update)\n      { op.update.finish(); }\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) { return f() }\n    startOperation(cm);\n    try { return f() }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) { return f.apply(cm, arguments) }\n      startOperation(cm);\n      try { return f.apply(cm, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) { return f.apply(this, arguments) }\n      startOperation(this);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(this); }\n    }\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) { return f.apply(this, arguments) }\n      startOperation(cm);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.highlightFrontier < cm.display.viewTo)\n      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.highlightFrontier >= cm.display.viewTo) { return }\n    var end = +new Date + cm.options.workTime;\n    var context = getContextBefore(cm, doc.highlightFrontier);\n    var changedLines = [];\n\n    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n      if (context.line >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n        var highlighted = highlightLine(cm, line, context, true);\n        if (resetState) { context.state = resetState; }\n        line.styles = highlighted.styles;\n        var oldCls = line.styleClasses, newCls = highlighted.classes;\n        if (newCls) { line.styleClasses = newCls; }\n        else if (oldCls) { line.styleClasses = null; }\n        var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n        if (ischange) { changedLines.push(context.line); }\n        line.stateAfter = context.save();\n        context.nextLine();\n      } else {\n        if (line.text.length <= cm.options.maxHighlightLength)\n          { processLine(cm, line.text, context); }\n        line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n        context.nextLine();\n      }\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true\n      }\n    });\n    doc.highlightFrontier = context.line;\n    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n    if (changedLines.length) { runInOp(cm, function () {\n      for (var i = 0; i < changedLines.length; i++)\n        { regLineChange(cm, changedLines[i], \"text\"); }\n    }); }\n  }\n\n  // DISPLAY DRAWING\n\n  var DisplayUpdate = function(cm, viewport, force) {\n    var display = cm.display;\n\n    this.viewport = viewport;\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport);\n    this.editorIsHidden = !display.wrapper.offsetWidth;\n    this.wrapperHeight = display.wrapper.clientHeight;\n    this.wrapperWidth = display.wrapper.clientWidth;\n    this.oldDisplayWidth = displayWidth(cm);\n    this.force = force;\n    this.dims = getDimensions(cm);\n    this.events = [];\n  };\n\n  DisplayUpdate.prototype.signal = function (emitter, type) {\n    if (hasHandler(emitter, type))\n      { this.events.push(arguments); }\n  };\n  DisplayUpdate.prototype.finish = function () {\n    for (var i = 0; i < this.events.length; i++)\n      { signal.apply(null, this.events[i]); }\n  };\n\n  function maybeClipScrollbars(cm) {\n    var display = cm.display;\n    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n      display.heightForcer.style.height = scrollGap(cm) + \"px\";\n      display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n      display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n      display.scrollbarsClipped = true;\n    }\n  }\n\n  function selectionSnapshot(cm) {\n    if (cm.hasFocus()) { return null }\n    var active = activeElt();\n    if (!active || !contains(cm.display.lineDiv, active)) { return null }\n    var result = {activeElt: active};\n    if (window.getSelection) {\n      var sel = window.getSelection();\n      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n        result.anchorNode = sel.anchorNode;\n        result.anchorOffset = sel.anchorOffset;\n        result.focusNode = sel.focusNode;\n        result.focusOffset = sel.focusOffset;\n      }\n    }\n    return result\n  }\n\n  function restoreSelection(snapshot) {\n    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n    snapshot.activeElt.focus();\n    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&\n        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n      var sel = window.getSelection(), range = document.createRange();\n      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n      range.collapse(false);\n      sel.removeAllRanges();\n      sel.addRange(range);\n      sel.extend(snapshot.focusNode, snapshot.focusOffset);\n    }\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayIfNeeded(cm, update) {\n    var display = cm.display, doc = cm.doc;\n\n    if (update.editorIsHidden) {\n      resetView(cm);\n      return false\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!update.force &&\n        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n        display.renderedView == display.view && countDirtyView(cm) == 0)\n      { return false }\n\n    if (maybeUpdateLineNumberWidth(cm)) {\n      resetView(cm);\n      update.dims = getDimensions(cm);\n    }\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n      { return false }\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var selSnapshot = selectionSnapshot(cm);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n    patchDisplay(cm, display.updateLineNumbers, update.dims);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n    display.renderedView = display.view;\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    restoreSelection(selSnapshot);\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width and height.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n    display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n    if (different) {\n      display.lastWrapHeight = update.wrapperHeight;\n      display.lastWrapWidth = update.wrapperWidth;\n      startWorker(cm, 400);\n    }\n\n    display.updateLineNumbers = null;\n\n    return true\n  }\n\n  function postUpdateDisplay(cm, update) {\n    var viewport = update.viewport;\n\n    for (var first = true;; first = false) {\n      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n        // Clip forced viewport to actual scrollable area.\n        if (viewport && viewport.top != null)\n          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n        // Updated line heights might result in the drawn area not\n        // actually covering the viewport. Keep looping until it does.\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n          { break }\n      } else if (first) {\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n      }\n      if (!updateDisplayIfNeeded(cm, update)) { break }\n      updateHeightsInViewport(cm);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.force = false;\n    }\n\n    update.signal(cm, \"update\", cm);\n    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n      update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n    }\n  }\n\n  function updateDisplaySimple(cm, viewport) {\n    var update = new DisplayUpdate(cm, viewport);\n    if (updateDisplayIfNeeded(cm, update)) {\n      updateHeightsInViewport(cm);\n      postUpdateDisplay(cm, update);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.finish();\n    }\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        { node.style.display = \"none\"; }\n      else\n        { node.parentNode.removeChild(node); }\n      return next\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) { cur = rm(cur); }\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) { cur = rm(cur); }\n  }\n\n  function updateGutterSpace(display) {\n    var width = display.gutters.offsetWidth;\n    display.sizer.style.marginLeft = width + \"px\";\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n    cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n  }\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n      if (cm.options.fixedGutter) {\n        if (view[i].gutter)\n          { view[i].gutter.style.left = left; }\n        if (view[i].gutterBackground)\n          { view[i].gutterBackground.style.left = left; }\n      }\n      var align = view[i].alignable;\n      if (align) { for (var j = 0; j < align.length; j++)\n        { align[j].style.left = left; } }\n    } }\n    if (cm.options.fixedGutter)\n      { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) { return false }\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm.display);\n      return true\n    }\n    return false\n  }\n\n  function getGutters(gutters, lineNumbers) {\n    var result = [], sawLineNumbers = false;\n    for (var i = 0; i < gutters.length; i++) {\n      var name = gutters[i], style = null;\n      if (typeof name != \"string\") { style = name.style; name = name.className; }\n      if (name == \"CodeMirror-linenumbers\") {\n        if (!lineNumbers) { continue }\n        else { sawLineNumbers = true; }\n      }\n      result.push({className: name, style: style});\n    }\n    if (lineNumbers && !sawLineNumbers) { result.push({className: \"CodeMirror-linenumbers\", style: null}); }\n    return result\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function renderGutters(display) {\n    var gutters = display.gutters, specs = display.gutterSpecs;\n    removeChildren(gutters);\n    display.lineGutter = null;\n    for (var i = 0; i < specs.length; ++i) {\n      var ref = specs[i];\n      var className = ref.className;\n      var style = ref.style;\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + className));\n      if (style) { gElt.style.cssText = style; }\n      if (className == \"CodeMirror-linenumbers\") {\n        display.lineGutter = gElt;\n        gElt.style.width = (display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = specs.length ? \"\" : \"none\";\n    updateGutterSpace(display);\n  }\n\n  function updateGutters(cm) {\n    renderGutters(cm.display);\n    regChange(cm);\n    alignHorizontally(cm);\n  }\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc, input, options) {\n    var d = this;\n    this.input = input;\n\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [lines], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    d.sizerWidth = null;\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n    if (place) {\n      if (place.appendChild) { place.appendChild(d.wrapper); }\n      else { place(d.wrapper); }\n    }\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    d.reportedViewFrom = d.reportedViewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    d.renderedView = null;\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastWrapHeight = d.lastWrapWidth = 0;\n    d.updateLineNumbers = null;\n\n    d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n    d.scrollbarsClipped = false;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n\n    d.activeTouch = null;\n\n    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);\n    renderGutters(d);\n\n    input.init(d);\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) { wheelPixelsPerUnit = -.53; }\n  else if (gecko) { wheelPixelsPerUnit = 15; }\n  else if (chrome) { wheelPixelsPerUnit = -.7; }\n  else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n  function wheelEventDelta(e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n    else if (dy == null) { dy = e.wheelDelta; }\n    return {x: dx, y: dy}\n  }\n  function wheelEventPixels(e) {\n    var delta = wheelEventDelta(e);\n    delta.x *= wheelPixelsPerUnit;\n    delta.y *= wheelPixelsPerUnit;\n    return delta\n  }\n\n  function onScrollWheel(cm, e) {\n    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n    var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n    if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n      if (dy && canScrollY)\n        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }\n      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));\n      // Only prevent default scrolling if vertical scrolling is\n      // actually possible. Otherwise, it causes vertical scroll\n      // jitter on OSX trackpads when deltaX is small and deltaY\n      // is large (issue #3579)\n      if (!dy || (dy && canScrollY))\n        { e_preventDefault(e); }\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && wheelPixelsPerUnit != null) {\n      var pixels = dy * wheelPixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n      updateDisplaySimple(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function () {\n          if (display.wheelStartX == null) { return }\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) { return }\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  var Selection = function(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  };\n\n  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n  Selection.prototype.equals = function (other) {\n    if (other == this) { return true }\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var here = this.ranges[i], there = other.ranges[i];\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n    }\n    return true\n  };\n\n  Selection.prototype.deepCopy = function () {\n    var out = [];\n    for (var i = 0; i < this.ranges.length; i++)\n      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }\n    return new Selection(out, this.primIndex)\n  };\n\n  Selection.prototype.somethingSelected = function () {\n    for (var i = 0; i < this.ranges.length; i++)\n      { if (!this.ranges[i].empty()) { return true } }\n    return false\n  };\n\n  Selection.prototype.contains = function (pos, end) {\n    if (!end) { end = pos; }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var range = this.ranges[i];\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        { return i }\n    }\n    return -1\n  };\n\n  var Range = function(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  };\n\n  Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(cm, ranges, primIndex) {\n    var mayTouch = cm && cm.options.selectionsMayTouch;\n    var prim = ranges[primIndex];\n    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      var diff = cmp(prev.to(), cur.from());\n      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) { --primIndex; }\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex)\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0)\n  }\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  function changeEnd(change) {\n    if (!change.text) { return change.to }\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n  }\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) { return pos }\n    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n    return Pos(line, ch)\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n    else\n      { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex)\n  }\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function (line) {\n      if (line.stateAfter) { line.stateAfter = null; }\n      if (line.styles) { line.styles = null; }\n    });\n    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) { regChange(cm); }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight);\n      signalLater(line, \"change\", line, change);\n    }\n    function linesFor(start, end) {\n      var result = [];\n      for (var i = start; i < end; ++i)\n        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }\n      return result\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (change.full) {\n      doc.insert(0, linesFor(0, text.length));\n      doc.remove(text.length, doc.size - text.length);\n    } else if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      var added = linesFor(0, text.length - 1);\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) { doc.remove(from.line, nlines); }\n      if (added.length) { doc.insert(from.line, added); }\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        var added$1 = linesFor(1, text.length - 1);\n        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added$1);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      var added$2 = linesFor(1, text.length - 1);\n      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n      doc.insert(from.line + 1, added$2);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) { continue }\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) { continue }\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      } }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) { throw new Error(\"This document is already in use.\") }\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    setDirectionClass(cm);\n    if (!cm.options.lineWrapping) { findMaxLine(cm); }\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  function setDirectionClass(cm) {\n  (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n  }\n\n  function directionChanged(cm) {\n    runInOp(cm, function () {\n      setDirectionClass(cm);\n      regChange(cm);\n    });\n  }\n\n  function History(startGen) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = this.lastSelOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = startGen || 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n    return histChange\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) { array.pop(); }\n      else { break }\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done)\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done)\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done)\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, or are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n    var last;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        { pushSelectionToHistory(doc.sel, hist.done); }\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) { hist.done.shift(); }\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = hist.lastSelOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) { signal(doc, \"historyAdded\"); }\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastSelOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      { hist.done[hist.done.length - 1] = sel; }\n    else\n      { pushSelectionToHistory(sel, hist.done); }\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastSelOp = opId;\n    if (options && options.clearRedo !== false)\n      { clearSelectionEvents(hist.undone); }\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      { dest.push(sel); }\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n      if (line.markedSpans)\n        { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) { return null }\n    var out;\n    for (var i = 0; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n      else if (out) { out.push(spans[i]); }\n    }\n    return !out ? spans : out.length ? out : null\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) { return null }\n    var nw = [];\n    for (var i = 0; i < change.text.length; ++i)\n      { nw.push(removeClearedSpans(found[i])); }\n    return nw\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) { return stretched }\n    if (!stretched) { return old }\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            { if (oldCur[k].marker == span.marker) { continue spans } }\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    var copy = [];\n    for (var i = 0; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m = (void 0);\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        } } }\n      }\n    }\n    return copy\n  }\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(range, head, other, extend) {\n    if (extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head)\n    } else {\n      return new Range(other || head, head)\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options, extend) {\n    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    var out = [];\n    var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n    for (var i = 0; i < doc.sel.ranges.length; i++)\n      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel, options) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head)); }\n      },\n      origin: options && options.origin\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n    else { return sel }\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      { sel = filterSelectionChange(doc, sel, options); }\n\n    var bias = options && options.bias ||\n      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm)\n      { ensureCursorVisible(doc.cm); }\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) { return }\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = 1;\n      doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) { out = sel.ranges.slice(0, i); }\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n  }\n\n  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n    var line = getLine(doc, pos.line);\n    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n      var sp = line.markedSpans[i], m = sp.marker;\n\n      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker\n      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it\n      // is with selectLeft/Right\n      var preventCursorLeft = (\"selectLeft\" in m) ? !m.selectLeft : m.inclusiveLeft;\n      var preventCursorRight = (\"selectRight\" in m) ? !m.selectRight : m.inclusiveRight;\n\n      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n        if (mayClear) {\n          signal(m, \"beforeCursorEnter\");\n          if (m.explicitlyCleared) {\n            if (!line.markedSpans) { break }\n            else {--i; continue}\n          }\n        }\n        if (!m.atomic) { continue }\n\n        if (oldPos) {\n          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n          if (dir < 0 ? preventCursorRight : preventCursorLeft)\n            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n            { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n        }\n\n        var far = m.find(dir < 0 ? -1 : 1);\n        if (dir < 0 ? preventCursorLeft : preventCursorRight)\n          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n      }\n    } }\n    return pos\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n    var dir = bias || 1;\n    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n    if (!found) {\n      doc.cantEdit = true;\n      return Pos(doc.first, 0)\n    }\n    return found\n  }\n\n  function movePos(doc, pos, dir, line) {\n    if (dir < 0 && pos.ch == 0) {\n      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n      else { return null }\n    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n      else { return null }\n    } else {\n      return new Pos(pos.line, pos.ch + dir)\n    }\n  }\n\n  function selectAll(cm) {\n    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n  }\n\n  // UPDATING\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function () { return obj.canceled = true; }\n    };\n    if (update) { obj.update = function (from, to, text, origin) {\n      if (from) { obj.from = clipPos(doc, from); }\n      if (to) { obj.to = clipPos(doc, to); }\n      if (text) { obj.text = text; }\n      if (origin !== undefined) { obj.origin = origin; }\n    }; }\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n    if (obj.canceled) {\n      if (doc.cm) { doc.cm.curOp.updateInput = 2; }\n      return null\n    }\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n      if (doc.cm.state.suppressEdits) { return }\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) { return }\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function (doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    var suppress = doc.cm && doc.cm.state.suppressEdits;\n    if (suppress && !allowSelectionOnly) { return }\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    var i = 0;\n    for (; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        { break }\n    }\n    if (i == source.length) { return }\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return\n        }\n        selAfter = event;\n      } else if (suppress) {\n        source.push(event);\n        return\n      } else { break }\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    var loop = function ( i ) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return {}\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function (doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    };\n\n    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n      var returned = loop( i$1 );\n\n      if ( returned ) return returned.v;\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) { return }\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n      Pos(range.anchor.line + distance, range.anchor.ch),\n      Pos(range.head.line + distance, range.head.ch)\n    ); }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        { regLineChange(doc.cm, l, \"gutter\"); }\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return\n    }\n    if (change.from.line > doc.lastLine()) { return }\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n    else { updateDoc(doc, change, spans); }\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n\n    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))\n      { doc.cantEdit = false; }\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function (line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      { signalCursorActivity(cm); }\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n    }\n\n    retreatFrontier(doc, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (change.full)\n      { regChange(cm); }\n    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      { regLineChange(cm, from.line, \"text\"); }\n    else\n      { regChange(cm, from.line, to.line + 1, lendiff); }\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    var assign;\n\n    if (!to) { to = from; }\n    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n    if (typeof code == \"string\") { code = doc.splitLines(code); }\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue\n      }\n      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n        var cur = sub.changes[j$1];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(doc, handle, changeType, op) {\n    var no = handle, line = handle;\n    if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n    else { no = lineNo(handle); }\n    if (no == null) { return null }\n    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n    return line\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    this.lines = lines;\n    this.parent = null;\n    var height = 0;\n    for (var i = 0; i < lines.length; ++i) {\n      lines[i].parent = this;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length },\n\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this.lines[i];\n        this.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }\n    },\n\n    // Used to iterate over a part of the tree.\n    iterN: function(at, n, op) {\n      for (var e = at + n; at < e; ++at)\n        { if (op(this.lines[at])) { return true } }\n    }\n  };\n\n  function BranchChunk(children) {\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++i) {\n      var ch = children[i];\n      size += ch.chunkSize(); height += ch.height;\n      ch.parent = this;\n    }\n    this.size = size;\n    this.height = height;\n    this.parent = null;\n  }\n\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size },\n\n    removeInner: function(at, n) {\n      this.size -= n;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var rm = Math.min(n, sz - at), oldHeight = child.height;\n          child.removeInner(at, rm);\n          this.height -= oldHeight - child.height;\n          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n          if ((n -= rm) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n      // If the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n\n    collapse: function(lines) {\n      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }\n    },\n\n    insertInner: function(at, lines, height) {\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(at, lines, height);\n          if (child.lines && child.lines.length > 50) {\n            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n            var remaining = child.lines.length % 25 + 25;\n            for (var pos = remaining; pos < child.lines.length;) {\n              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n              child.height -= leaf.height;\n              this.children.splice(++i, 0, leaf);\n              leaf.parent = this;\n            }\n            child.lines = child.lines.slice(0, remaining);\n            this.maybeSpill();\n          }\n          break\n        }\n        at -= sz;\n      }\n    },\n\n    // When a node has grown, check whether it should be split.\n    maybeSpill: function() {\n      if (this.children.length <= 10) { return }\n      var me = this;\n      do {\n        var spilled = me.children.splice(me.children.length - 5, 5);\n        var sibling = new BranchChunk(spilled);\n        if (!me.parent) { // Become the parent node\n          var copy = new BranchChunk(me.children);\n          copy.parent = me;\n          me.children = [copy, sibling];\n          me = copy;\n       } else {\n          me.size -= sibling.size;\n          me.height -= sibling.height;\n          var myIndex = indexOf(me.parent.children, me);\n          me.parent.children.splice(myIndex + 1, 0, sibling);\n        }\n        sibling.parent = me.parent;\n      } while (me.children.length > 10)\n      me.parent.maybeSpill();\n    },\n\n    iterN: function(at, n, op) {\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var used = Math.min(n, sz - at);\n          if (child.iterN(at, used, op)) { return true }\n          if ((n -= used) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n    }\n  };\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = function(doc, node, options) {\n    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n      { this[opt] = options[opt]; } } }\n    this.doc = doc;\n    this.node = node;\n  };\n\n  LineWidget.prototype.clear = function () {\n    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) { return }\n    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }\n    if (!ws.length) { line.widgets = null; }\n    var height = widgetHeight(this);\n    updateLineHeight(line, Math.max(0, line.height - height));\n    if (cm) {\n      runInOp(cm, function () {\n        adjustScrollWhenAboveVisible(cm, line, -height);\n        regLineChange(cm, no, \"widget\");\n      });\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n    }\n  };\n\n  LineWidget.prototype.changed = function () {\n      var this$1 = this;\n\n    var oldH = this.height, cm = this.doc.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) { return }\n    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n    if (cm) {\n      runInOp(cm, function () {\n        cm.curOp.forceUpdate = true;\n        adjustScrollWhenAboveVisible(cm, line, diff);\n        signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n      });\n    }\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      { addToScrollTop(cm, diff); }\n  }\n\n  function addLineWidget(doc, handle, node, options) {\n    var widget = new LineWidget(doc, node, options);\n    var cm = doc.cm;\n    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n    changeLine(doc, handle, \"widget\", function (line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) { widgets.push(widget); }\n      else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); }\n      widget.line = line;\n      if (cm && !lineIsHidden(doc, line)) {\n        var aboveVisible = heightAtLine(line) < doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) { addToScrollTop(cm, widget.height); }\n        cm.curOp.forceUpdate = true;\n      }\n      return true\n    });\n    if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n    return widget\n  }\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  var TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n    this.id = ++nextMarkerId;\n  };\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) { startOperation(cm); }\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) { signalLater(this, \"clear\", found.from, found.to); }\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n      else if (cm) {\n        if (span.to != null) { max = lineNo(line); }\n        if (span.from != null) { min = lineNo(line); }\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        { updateLineHeight(line, textHeight(cm.display)); }\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    } }\n\n    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) { reCheckSelection(cm.doc); }\n    }\n    if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n    if (withOp) { endOperation(cm); }\n    if (this.parent) { this.parent.clear(); }\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function (side, lineObj) {\n    if (side == null && this.type == \"bookmark\") { side = 1; }\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) { return from }\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) { return to }\n      }\n    }\n    return from && {from: from, to: to}\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function () {\n      var this$1 = this;\n\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) { return }\n    runInOp(cm, function () {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          { updateLineHeight(line, line.height + dHeight); }\n      }\n      signalLater(cm, \"markerChanged\", cm, this$1);\n    });\n  };\n\n  TextMarker.prototype.attachLine = function (line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n    }\n    this.lines.push(line);\n  };\n\n  TextMarker.prototype.detachLine = function (line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n  eventMixin(TextMarker);\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) { copyObj(options, marker, false); }\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      { return marker }\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n      seeCollapsedSpans();\n    }\n\n    if (marker.addToHistory)\n      { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function (line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        { updateMaxLine = true; }\n      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null));\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n    }); }\n\n    if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n    if (marker.readOnly) {\n      seeReadOnlySpans();\n      if (doc.history.done.length || doc.history.undone.length)\n        { doc.clearHistory(); }\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n      if (marker.collapsed)\n        { regChange(cm, from.line, to.line + 1); }\n      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||\n               marker.attributes || marker.title)\n        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n      if (marker.atomic) { reCheckSelection(cm.doc); }\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = function(markers, primary) {\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      { markers[i].parent = this; }\n  };\n\n  SharedTextMarker.prototype.clear = function () {\n    if (this.explicitlyCleared) { return }\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      { this.markers[i].clear(); }\n    signalLater(this, \"clear\");\n  };\n\n  SharedTextMarker.prototype.find = function (side, lineObj) {\n    return this.primary.find(side, lineObj)\n  };\n  eventMixin(SharedTextMarker);\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function (doc) {\n      if (widget) { options.widgetNode = widget.cloneNode(true); }\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        { if (doc.linked[i].isParent) { return } }\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary)\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    var loop = function ( i ) {\n      var marker = markers[i], linked = [marker.primary.doc];\n      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    };\n\n    for (var i = 0; i < markers.length; i++) loop( i );\n  }\n\n  var nextDocId = 0;\n  var Doc = function(text, mode, firstLine, lineSep, direction) {\n    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n    if (firstLine == null) { firstLine = 0; }\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.modeFrontier = this.highlightFrontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n    this.lineSep = lineSep;\n    this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n    this.extend = false;\n\n    if (typeof text == \"string\") { text = this.splitLines(text); }\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) { this.iterN(from - this.first, to - from, op); }\n      else { this.iterN(this.first, this.first + this.size, from); }\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n      if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n      setSelection(this, simpleSelection(top), sel_dontScroll);\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n    getLineNumber: function(line) {return lineNo(line)},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") { line = getLine(this, line); }\n      return visualLine(line)\n    },\n\n    lineCount: function() {return this.size},\n    firstLine: function() {return this.first},\n    lastLine: function() {return this.first + this.size - 1},\n\n    clipPos: function(pos) {return clipPos(this, pos)},\n\n    getCursor: function(start) {\n      var range = this.sel.primary(), pos;\n      if (start == null || start == \"head\") { pos = range.head; }\n      else if (start == \"anchor\") { pos = range.anchor; }\n      else if (start == \"end\" || start == \"to\" || start === false) { pos = range.to(); }\n      else { pos = range.from(); }\n      return pos\n    },\n    listSelections: function() { return this.sel.ranges },\n    somethingSelected: function() {return this.sel.somethingSelected()},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      var heads = map(this.sel.ranges, f);\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      if (!ranges.length) { return }\n      var out = [];\n      for (var i = 0; i < ranges.length; i++)\n        { out[i] = new Range(clipPos(this, ranges[i].anchor),\n                           clipPos(this, ranges[i].head)); }\n      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n      setSelection(this, normalizeSelection(this.cm, out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) { return lines }\n      else { return lines.join(lineSep || this.lineSeparator()) }\n    },\n    getSelections: function(lineSep) {\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }\n        parts[i] = sel;\n      }\n      return parts\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        { dup[i] = code; }\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range = sel.ranges[i];\n        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n        { makeChange(this, changes[i$1]); }\n      if (newSel) { setSelectionReplaceHistory(this, newSel); }\n      else if (this.cm) { ensureCursorVisible(this.cm); }\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n      return {undo: done, redo: undone}\n    },\n    clearHistory: function() {\n      var this$1 = this;\n\n      this.history = new History(this.history.maxGeneration);\n      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);\n    },\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n      return this.history.generation\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration)\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)}\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history.maxGeneration);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    setGutterMarker: docMethodOp(function(line, gutterID, value) {\n      return changeLine(this, line, \"gutter\", function (line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n        return true\n      })\n    }),\n\n    clearGutter: docMethodOp(function(gutterID) {\n      var this$1 = this;\n\n      this.iter(function (line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          changeLine(this$1, line, \"gutter\", function () {\n            line.gutterMarkers[gutterID] = null;\n            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n            return true\n          });\n        }\n      });\n    }),\n\n    lineInfo: function(line) {\n      var n;\n      if (typeof line == \"number\") {\n        if (!isLine(this, line)) { return null }\n        n = line;\n        line = getLine(this, line);\n        if (!line) { return null }\n      } else {\n        n = lineNo(line);\n        if (n == null) { return null }\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets}\n    },\n\n    addLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        if (!line[prop]) { line[prop] = cls; }\n        else if (classTest(cls).test(line[prop])) { return false }\n        else { line[prop] += \" \" + cls; }\n        return true\n      })\n    }),\n    removeLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) { return false }\n        else if (cls == null) { line[prop] = null; }\n        else {\n          var found = cur.match(classTest(cls));\n          if (!found) { return false }\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true\n      })\n    }),\n\n    addLineWidget: docMethodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options)\n    }),\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared,\n                      handleMouseEvents: options && options.handleMouseEvents};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\")\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) { for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          { markers.push(span.marker.parent || span.marker); }\n      } }\n      return markers\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo = from.line;\n      this.iter(from.line, to.line + 1, function (line) {\n        var spans = line.markedSpans;\n        if (spans) { for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||\n                span.from == null && lineNo != from.line ||\n                span.from != null && lineNo == to.line && span.from >= to.ch) &&\n              (!filter || filter(span.marker)))\n            { found.push(span.marker.parent || span.marker); }\n        } }\n        ++lineNo;\n      });\n      return found\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function (line) {\n        var sps = line.markedSpans;\n        if (sps) { for (var i = 0; i < sps.length; ++i)\n          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n      });\n      return markers\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;\n      this.iter(function (line) {\n        var sz = line.text.length + sepSize;\n        if (sz > off) { ch = off; return true }\n        off -= sz;\n        ++lineNo;\n      });\n      return clipPos(this, Pos(lineNo, ch))\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) { return 0 }\n      var sepSize = this.lineSeparator().length;\n      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n        index += line.text.length + sepSize;\n      });\n      return index\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size),\n                        this.modeOption, this.first, this.lineSep, this.direction);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc\n    },\n\n    linkedDoc: function(options) {\n      if (!options) { options = {}; }\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) { from = options.from; }\n      if (options.to != null && options.to < to) { to = options.to; }\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n      if (options.sharedHist) { copy.history = this.history\n      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy\n    },\n    unlinkDoc: function(other) {\n      if (other instanceof CodeMirror) { other = other.doc; }\n      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n        var link = this.linked[i];\n        if (link.doc != other) { continue }\n        this.linked.splice(i, 1);\n        other.unlinkDoc(this);\n        detachSharedMarkers(findSharedMarkers(this));\n        break\n      } }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode},\n    getEditor: function() {return this.cm},\n\n    splitLines: function(str) {\n      if (this.lineSep) { return str.split(this.lineSep) }\n      return splitLinesAuto(str)\n    },\n    lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n    setDirection: docMethodOp(function (dir) {\n      if (dir != \"rtl\") { dir = \"ltr\"; }\n      if (dir == this.direction) { return }\n      this.direction = dir;\n      this.iter(function (line) { return line.order = null; });\n      if (this.cm) { directionChanged(this.cm); }\n    })\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    clearDragCursor(cm);\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      { return }\n    e_preventDefault(e);\n    if (ie) { lastDrop = +new Date; }\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || cm.isReadOnly()) { return }\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var markAsReadAndPasteIfAllFilesAreRead = function () {\n        if (++read == n) {\n          operation(cm, function () {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos,\n                          text: cm.doc.splitLines(\n                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),\n                          origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));\n          })();\n        }\n      };\n      var readTextFromFile = function (file, i) {\n        if (cm.options.allowDropFileTypes &&\n            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {\n          markAsReadAndPasteIfAllFilesAreRead();\n          return\n        }\n        var reader = new FileReader;\n        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };\n        reader.onload = function () {\n          var content = reader.result;\n          if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) {\n            markAsReadAndPasteIfAllFilesAreRead();\n            return\n          }\n          text[i] = content;\n          markAsReadAndPasteIfAllFilesAreRead();\n        };\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(function () { return cm.display.input.focus(); }, 20);\n        return\n      }\n      try {\n        var text$1 = e.dataTransfer.getData(\"Text\");\n        if (text$1) {\n          var selected;\n          if (cm.state.draggingText && !cm.state.draggingText.copy)\n            { selected = cm.listSelections(); }\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n            { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n          cm.replaceSelection(text$1, \"around\", \"paste\");\n          cm.display.input.focus();\n        }\n      }\n      catch(e$1){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n    e.dataTransfer.effectAllowed = \"copyMove\";\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) { img.parentNode.removeChild(img); }\n    }\n  }\n\n  function onDragOver(cm, e) {\n    var pos = posFromMouse(cm, e);\n    if (!pos) { return }\n    var frag = document.createDocumentFragment();\n    drawSelectionCursor(cm, pos, frag);\n    if (!cm.display.dragCursor) {\n      cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n    }\n    removeChildrenAndAdd(cm.display.dragCursor, frag);\n  }\n\n  function clearDragCursor(cm) {\n    if (cm.display.dragCursor) {\n      cm.display.lineSpace.removeChild(cm.display.dragCursor);\n      cm.display.dragCursor = null;\n    }\n  }\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.getElementsByClassName) { return }\n    var byClass = document.getElementsByClassName(\"CodeMirror\"), editors = [];\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) { editors.push(cm); }\n    }\n    if (editors.length) { editors[0].operation(function () {\n      for (var i = 0; i < editors.length; i++) { f(editors[i]); }\n    }); }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) { return }\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function () {\n      if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n        resizeTimer = null;\n        forEachCodeMirror(onResize);\n      }, 100); }\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n  }\n  // Called when the window resizes\n  function onResize(cm) {\n    var d = cm.display;\n    // Might be a text scaling operation, clear size caches.\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    d.scrollbarsClipped = false;\n    cm.setSize();\n  }\n\n  var keyNames = {\n    3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n    19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n    36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n    46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n    106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 145: \"ScrollLock\",\n    173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n    221: \"]\", 222: \"'\", 224: \"Mod\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n    63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n  };\n\n  // Number keys\n  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n  // Alphabetic keys\n  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n  // Function keys\n  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n  var keyMap = {};\n\n  keyMap.basic = {\n    \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n    \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // are simply ignored.\n  keyMap.pcDefault = {\n    \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n    \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n    \"fallthrough\": \"basic\"\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\n  keyMap.emacsy = {\n    \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n    \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n    \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n    \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\",\n    \"Ctrl-O\": \"openLine\"\n  };\n  keyMap.macDefault = {\n    \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n    \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n    \"fallthrough\": [\"basic\", \"emacsy\"]\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function normalizeKeyName(name) {\n    var parts = name.split(/-(?!$)/);\n    name = parts[parts.length - 1];\n    var alt, ctrl, shift, cmd;\n    for (var i = 0; i < parts.length - 1; i++) {\n      var mod = parts[i];\n      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n      else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n      else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n      else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n    }\n    if (alt) { name = \"Alt-\" + name; }\n    if (ctrl) { name = \"Ctrl-\" + name; }\n    if (cmd) { name = \"Cmd-\" + name; }\n    if (shift) { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // This is a kludge to keep keymaps mostly working as raw objects\n  // (backwards compatibility) while at the same time support features\n  // like normalization and multi-stroke key bindings. It compiles a\n  // new normalized keymap, and then updates the old object to reflect\n  // this.\n  function normalizeKeyMap(keymap) {\n    var copy = {};\n    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n      var value = keymap[keyname];\n      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n      if (value == \"...\") { delete keymap[keyname]; continue }\n\n      var keys = map(keyname.split(\" \"), normalizeKeyName);\n      for (var i = 0; i < keys.length; i++) {\n        var val = (void 0), name = (void 0);\n        if (i == keys.length - 1) {\n          name = keys.join(\" \");\n          val = value;\n        } else {\n          name = keys.slice(0, i + 1).join(\" \");\n          val = \"...\";\n        }\n        var prev = copy[name];\n        if (!prev) { copy[name] = val; }\n        else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n      }\n      delete keymap[keyname];\n    } }\n    for (var prop in copy) { keymap[prop] = copy[prop]; }\n    return keymap\n  }\n\n  function lookupKey(key, map, handle, context) {\n    map = getKeyMap(map);\n    var found = map.call ? map.call(key, context) : map[key];\n    if (found === false) { return \"nothing\" }\n    if (found === \"...\") { return \"multi\" }\n    if (found != null && handle(found)) { return \"handled\" }\n\n    if (map.fallthrough) {\n      if (Object.prototype.toString.call(map.fallthrough) != \"[object Array]\")\n        { return lookupKey(key, map.fallthrough, handle, context) }\n      for (var i = 0; i < map.fallthrough.length; i++) {\n        var result = lookupKey(key, map.fallthrough[i], handle, context);\n        if (result) { return result }\n      }\n    }\n  }\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  function isModifierKey(value) {\n    var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n  }\n\n  function addModifierNames(name, event, noShift) {\n    var base = name;\n    if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Mod\") { name = \"Cmd-\" + name; }\n    if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // Look up the name of a key as indicated by an event object.\n  function keyName(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) { return false }\n    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n    if (event.keyCode == 3 && event.code) { name = event.code; }\n    return addModifierNames(name, event, noShift)\n  }\n\n  function getKeyMap(val) {\n    return typeof val == \"string\" ? keyMap[val] : val\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function () {\n      for (var i = kill.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n      ensureCursorVisible(cm);\n    });\n  }\n\n  function moveCharLogically(line, ch, dir) {\n    var target = skipExtendingChars(line.text, ch + dir, dir);\n    return target < 0 || target > line.text.length ? null : target\n  }\n\n  function moveLogically(line, start, dir) {\n    var ch = moveCharLogically(line, start.ch, dir);\n    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n  }\n\n  function endOfLine(visually, cm, lineObj, lineNo, dir) {\n    if (visually) {\n      if (cm.doc.direction == \"rtl\") { dir = -dir; }\n      var order = getOrder(lineObj, cm.doc.direction);\n      if (order) {\n        var part = dir < 0 ? lst(order) : order[0];\n        var moveInStorageOrder = (dir < 0) == (part.level == 1);\n        var sticky = moveInStorageOrder ? \"after\" : \"before\";\n        var ch;\n        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n        // it could be that the last bidi part is not on the last visual line,\n        // since visual lines contain content order-consecutive chunks.\n        // Thus, in rtl, we are looking for the first (content-order) character\n        // in the rtl chunk that is on the last line (that is, the same line\n        // as the last (content-order) character).\n        if (part.level > 0 || cm.doc.direction == \"rtl\") {\n          var prep = prepareMeasureForLine(cm, lineObj);\n          ch = dir < 0 ? lineObj.text.length - 1 : 0;\n          var targetTop = measureCharPrepared(cm, prep, ch).top;\n          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n          if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n        } else { ch = dir < 0 ? part.to : part.from; }\n        return new Pos(lineNo, ch, sticky)\n      }\n    }\n    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n  }\n\n  function moveVisually(cm, line, start, dir) {\n    var bidi = getOrder(line, cm.doc.direction);\n    if (!bidi) { return moveLogically(line, start, dir) }\n    if (start.ch >= line.text.length) {\n      start.ch = line.text.length;\n      start.sticky = \"before\";\n    } else if (start.ch <= 0) {\n      start.ch = 0;\n      start.sticky = \"after\";\n    }\n    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n    if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n      // nothing interesting happens.\n      return moveLogically(line, start, dir)\n    }\n\n    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n    var prep;\n    var getWrappedLineExtent = function (ch) {\n      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n      prep = prep || prepareMeasureForLine(cm, line);\n      return wrappedLineExtentChar(cm, line, prep, ch)\n    };\n    var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n    if (cm.doc.direction == \"rtl\" || part.level == 1) {\n      var moveInStorageOrder = (part.level == 1) == (dir < 0);\n      var ch = mv(start, moveInStorageOrder ? 1 : -1);\n      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n        // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n        var sticky = moveInStorageOrder ? \"before\" : \"after\";\n        return new Pos(start.line, ch, sticky)\n      }\n    }\n\n    // Case 3: Could not move within this bidi part in this visual line, so leave\n    // the current bidi part\n\n    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n        ? new Pos(start.line, mv(ch, 1), \"before\")\n        : new Pos(start.line, ch, \"after\"); };\n\n      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n        var part = bidi[partPos];\n        var moveInStorageOrder = (dir > 0) == (part.level != 1);\n        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n        ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n      }\n    };\n\n    // Case 3a: Look for other bidi parts on the same visual line\n    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n    if (res) { return res }\n\n    // Case 3b: Look for other bidi parts on the next visual line\n    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n      if (res) { return res }\n    }\n\n    // Case 4: Nowhere to move\n    return null\n  }\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = {\n    selectAll: selectAll,\n    singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n    killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n      if (range.empty()) {\n        var len = getLine(cm.doc, range.head.line).text.length;\n        if (range.head.ch == len && range.head.line < cm.lastLine())\n          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n        else\n          { return {from: range.head, to: Pos(range.head.line, len)} }\n      } else {\n        return {from: range.from(), to: range.to()}\n      }\n    }); },\n    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0),\n      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n    }); }); },\n    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0), to: range.from()\n    }); }); },\n    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n      return {from: leftPos, to: range.from()}\n    }); },\n    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      return {from: range.from(), to: rightPos }\n    }); },\n    undo: function (cm) { return cm.undo(); },\n    redo: function (cm) { return cm.redo(); },\n    undoSelection: function (cm) { return cm.undoSelection(); },\n    redoSelection: function (cm) { return cm.redoSelection(); },\n    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n      {origin: \"+move\", bias: -1}\n    ); },\n    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: 0, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n      if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n      return pos\n    }, sel_move); },\n    goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n    goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n    goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n    goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n    goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n    goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n    goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n    goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n    goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n    goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n    goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n    goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n    delCharBefore: function (cm) { return cm.deleteH(-1, \"char\"); },\n    delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n    delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n    delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n    delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n    delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n    indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n    indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n    indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n    insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n    insertSoftTab: function (cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(spaceStr(tabSize - col % tabSize));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function (cm) {\n      if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n      else { cm.execCommand(\"insertTab\"); }\n    },\n    // Swap the two chars left and right of each selection's head.\n    // Move cursor behind the two swapped characters afterwards.\n    //\n    // Doesn't consider line feeds a character.\n    // Doesn't scan more than one line above to find a character.\n    // Doesn't do anything on an empty line.\n    // Doesn't do anything with non-empty selections.\n    transposeChars: function (cm) { return runInOp(cm, function () {\n      var ranges = cm.listSelections(), newSel = [];\n      for (var i = 0; i < ranges.length; i++) {\n        if (!ranges[i].empty()) { continue }\n        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n        if (line) {\n          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n          if (cur.ch > 0) {\n            cur = new Pos(cur.line, cur.ch + 1);\n            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                            Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n          } else if (cur.line > cm.doc.first) {\n            var prev = getLine(cm.doc, cur.line - 1).text;\n            if (prev) {\n              cur = new Pos(cur.line, 1);\n              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                              prev.charAt(prev.length - 1),\n                              Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n            }\n          }\n        }\n        newSel.push(new Range(cur, cur));\n      }\n      cm.setSelections(newSel);\n    }); },\n    newlineAndIndent: function (cm) { return runInOp(cm, function () {\n      var sels = cm.listSelections();\n      for (var i = sels.length - 1; i >= 0; i--)\n        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n      sels = cm.listSelections();\n      for (var i$1 = 0; i$1 < sels.length; i$1++)\n        { cm.indentLine(sels[i$1].from().line, null, true); }\n      ensureCursorVisible(cm);\n    }); },\n    openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n  };\n\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, visual, lineN, 1)\n  }\n  function lineEnd(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLineEnd(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, line, lineN, -1)\n  }\n  function lineStartSmart(cm, pos) {\n    var start = lineStart(cm, pos.line);\n    var line = getLine(cm.doc, start.line);\n    var order = getOrder(line, cm.doc.direction);\n    if (!order || order[0].level == 0) {\n      var firstNonWS = Math.max(start.ch, line.text.search(/\\S/));\n      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n    }\n    return start\n  }\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) { return false }\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    cm.display.input.ensurePolled();\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n      if (dropShift) { cm.display.shift = false; }\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done\n  }\n\n  function lookupKeyForEditor(cm, name, handle) {\n    for (var i = 0; i < cm.state.keyMaps.length; i++) {\n      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n      if (result) { return result }\n    }\n    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n      || lookupKey(name, cm.options.keyMap, handle, cm)\n  }\n\n  // Note that, despite the name, this function is also used to check\n  // for bound mouse clicks.\n\n  var stopSeq = new Delayed;\n\n  function dispatchKey(cm, name, e, handle) {\n    var seq = cm.state.keySeq;\n    if (seq) {\n      if (isModifierKey(name)) { return \"handled\" }\n      if (/\\'$/.test(name))\n        { cm.state.keySeq = null; }\n      else\n        { stopSeq.set(50, function () {\n          if (cm.state.keySeq == seq) {\n            cm.state.keySeq = null;\n            cm.display.input.reset();\n          }\n        }); }\n      if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n    }\n    return dispatchKeyInner(cm, name, e, handle)\n  }\n\n  function dispatchKeyInner(cm, name, e, handle) {\n    var result = lookupKeyForEditor(cm, name, handle);\n\n    if (result == \"multi\")\n      { cm.state.keySeq = name; }\n    if (result == \"handled\")\n      { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n    if (result == \"handled\" || result == \"multi\") {\n      e_preventDefault(e);\n      restartBlink(cm);\n    }\n\n    return !!result\n  }\n\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    var name = keyName(e, true);\n    if (!name) { return false }\n\n    if (e.shiftKey && !cm.state.keySeq) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n          || dispatchKey(cm, name, e, function (b) {\n               if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                 { return doHandleBinding(cm, b) }\n             })\n    } else {\n      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n    }\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    cm.curOp.focus = activeElt();\n    if (signalDOMEvent(cm, e)) { return }\n    // IE does strange things with escape.\n    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        { cm.replaceSelection(\"\", null, \"cut\"); }\n    }\n    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)\n      { document.execCommand(\"cut\"); }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      { showCrossHair(cm); }\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (e.keyCode == 16) { this.doc.sel.shift = false; }\n    signalDOMEvent(this, e);\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (e.target && e.target != cm.display.input.getField()) { return }\n    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    // Some browsers fire keypress events for backspace\n    if (ch == \"\\x08\") { return }\n    if (handleCharBinding(cm, e, ch)) { return }\n    cm.display.input.onKeyPress(e);\n  }\n\n  var DOUBLECLICK_DELAY = 400;\n\n  var PastClick = function(time, pos, button) {\n    this.time = time;\n    this.pos = pos;\n    this.button = button;\n  };\n\n  PastClick.prototype.compare = function (time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  };\n\n  var lastClick, lastDoubleClick;\n  function clickRepeat(pos, button) {\n    var now = +new Date;\n    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n      lastClick = lastDoubleClick = null;\n      return \"triple\"\n    } else if (lastClick && lastClick.compare(now, pos, button)) {\n      lastDoubleClick = new PastClick(now, pos, button);\n      lastClick = null;\n      return \"double\"\n    } else {\n      lastClick = new PastClick(now, pos, button);\n      lastDoubleClick = null;\n      return \"single\"\n    }\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    var cm = this, display = cm.display;\n    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n    display.input.ensurePolled();\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function () { return display.scroller.draggable = true; }, 100);\n      }\n      return\n    }\n    if (clickInGutter(cm, e)) { return }\n    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n    window.focus();\n\n    // #3261: make sure, that we're not starting a second selection\n    if (button == 1 && cm.state.selectingText)\n      { cm.state.selectingText(e); }\n\n    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n    if (button == 1) {\n      if (pos) { leftButtonDown(cm, pos, repeat, e); }\n      else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n    } else if (button == 2) {\n      if (pos) { extendSelection(cm.doc, pos); }\n      setTimeout(function () { return display.input.focus(); }, 20);\n    } else if (button == 3) {\n      if (captureRightClick) { cm.display.input.onContextMenu(e); }\n      else { delayBlurEvent(cm); }\n    }\n  }\n\n  function handleMappedButton(cm, button, pos, repeat, event) {\n    var name = \"Click\";\n    if (repeat == \"double\") { name = \"Double\" + name; }\n    else if (repeat == \"triple\") { name = \"Triple\" + name; }\n    name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {\n      if (typeof bound == \"string\") { bound = commands[bound]; }\n      if (!bound) { return false }\n      var done = false;\n      try {\n        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n        done = bound(cm, pos) != Pass;\n      } finally {\n        cm.state.suppressEdits = false;\n      }\n      return done\n    })\n  }\n\n  function configureMouse(cm, repeat, event) {\n    var option = cm.getOption(\"configureMouse\");\n    var value = option ? option(cm, repeat, event) : {};\n    if (value.unit == null) {\n      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n      value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n    }\n    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n    return value\n  }\n\n  function leftButtonDown(cm, pos, repeat, event) {\n    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n    else { cm.curOp.focus = activeElt(); }\n\n    var behavior = configureMouse(cm, repeat, event);\n\n    var sel = cm.doc.sel, contained;\n    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n        repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n      { leftButtonStartDrag(cm, event, pos, behavior); }\n    else\n      { leftButtonSelect(cm, event, pos, behavior); }\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, event, pos, behavior) {\n    var display = cm.display, moved = false;\n    var dragEnd = operation(cm, function (e) {\n      if (webkit) { display.scroller.draggable = false; }\n      cm.state.draggingText = false;\n      off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n      off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n      off(display.scroller, \"dragstart\", dragStart);\n      off(display.scroller, \"drop\", dragEnd);\n      if (!moved) {\n        e_preventDefault(e);\n        if (!behavior.addNew)\n          { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n        if ((webkit && !safari) || ie && ie_version == 9)\n          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }\n        else\n          { display.input.focus(); }\n      }\n    });\n    var mouseMove = function(e2) {\n      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n    };\n    var dragStart = function () { return moved = true; };\n    // Let the drag handler handle this.\n    if (webkit) { display.scroller.draggable = true; }\n    cm.state.draggingText = dragEnd;\n    dragEnd.copy = !behavior.moveOnDrag;\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n    on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n    on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n    on(display.scroller, \"dragstart\", dragStart);\n    on(display.scroller, \"drop\", dragEnd);\n\n    delayBlurEvent(cm);\n    setTimeout(function () { return display.input.focus(); }, 20);\n  }\n\n  function rangeForUnit(cm, pos, unit) {\n    if (unit == \"char\") { return new Range(pos, pos) }\n    if (unit == \"word\") { return cm.findWordAt(pos) }\n    if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n    var result = unit(cm, pos);\n    return new Range(result.from, result.to)\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, event, start, behavior) {\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(event);\n\n    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n    if (behavior.addNew && !behavior.extend) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        { ourRange = ranges[ourIndex]; }\n      else\n        { ourRange = new Range(start, start); }\n    } else {\n      ourRange = doc.sel.primary();\n      ourIndex = doc.sel.primIndex;\n    }\n\n    if (behavior.unit == \"rectangle\") {\n      if (!behavior.addNew) { ourRange = new Range(start, start); }\n      start = posFromMouse(cm, event, true, true);\n      ourIndex = -1;\n    } else {\n      var range = rangeForUnit(cm, start, behavior.unit);\n      if (behavior.extend)\n        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }\n      else\n        { ourRange = range; }\n    }\n\n    if (!behavior.addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex == -1) {\n      ourIndex = ranges.length;\n      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                   {scroll: false, origin: \"*mouse\"});\n      startSel = doc.sel;\n    } else {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) { return }\n      lastPos = pos;\n\n      if (behavior.unit == \"rectangle\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n          else if (text.length > leftPos)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n        }\n        if (!ranges.length) { ranges.push(new Range(start, start)); }\n        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var range = rangeForUnit(cm, pos, behavior.unit);\n        var anchor = oldRange.anchor, head;\n        if (cmp(range.anchor, anchor) > 0) {\n          head = range.head;\n          anchor = minPos(oldRange.from(), range.anchor);\n        } else {\n          head = range.anchor;\n          anchor = maxPos(oldRange.to(), range.head);\n        }\n        var ranges$1 = startSel.ranges.slice(0);\n        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n      if (!cur) { return }\n      if (cmp(cur, lastPos) != 0) {\n        cm.curOp.focus = activeElt();\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) { setTimeout(operation(cm, function () {\n          if (counter != curCount) { return }\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50); }\n      }\n    }\n\n    function done(e) {\n      cm.state.selectingText = false;\n      counter = Infinity;\n      // If e is null or undefined we interpret this as someone trying\n      // to explicitly cancel the selection rather than the user\n      // letting go of the mouse button.\n      if (e) {\n        e_preventDefault(e);\n        display.input.focus();\n      }\n      off(display.wrapper.ownerDocument, \"mousemove\", move);\n      off(display.wrapper.ownerDocument, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function (e) {\n      if (e.buttons === 0 || !e_button(e)) { done(e); }\n      else { extend(e); }\n    });\n    var up = operation(cm, done);\n    cm.state.selectingText = up;\n    on(display.wrapper.ownerDocument, \"mousemove\", move);\n    on(display.wrapper.ownerDocument, \"mouseup\", up);\n  }\n\n  // Used when mouse-selecting to adjust the anchor to the proper side\n  // of a bidi jump depending on the visual position of the head.\n  function bidiSimplify(cm, range) {\n    var anchor = range.anchor;\n    var head = range.head;\n    var anchorLine = getLine(cm.doc, anchor.line);\n    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }\n    var order = getOrder(anchorLine);\n    if (!order) { return range }\n    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n    if (part.from != anchor.ch && part.to != anchor.ch) { return range }\n    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n    if (boundary == 0 || boundary == order.length) { return range }\n\n    // Compute the relative visual position of the head compared to the\n    // anchor (<0 is to the left, >0 to the right)\n    var leftSide;\n    if (head.line != anchor.line) {\n      leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n    } else {\n      var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n      if (headIndex == boundary - 1 || headIndex == boundary)\n        { leftSide = dir < 0; }\n      else\n        { leftSide = dir > 0; }\n    }\n\n    var usePart = order[boundary + (leftSide ? -1 : 0)];\n    var from = leftSide == (usePart.level == 1);\n    var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)\n  }\n\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent) {\n    var mX, mY;\n    if (e.touches) {\n      mX = e.touches[0].clientX;\n      mY = e.touches[0].clientY;\n    } else {\n      try { mX = e.clientX; mY = e.clientY; }\n      catch(e$1) { return false }\n    }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n    if (prevent) { e_preventDefault(e); }\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.display.gutterSpecs[i];\n        signal(cm, type, cm, line, gutter.className, e);\n        return e_defaultPrevented(e)\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true)\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n    if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n    if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n    return gutterEvent(cm, e, \"gutterContextMenu\", false)\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n  var defaults = {};\n  var optionHandlers = {};\n\n  function defineOptions(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    function option(name, deflt, handle, notOnInit) {\n      CodeMirror.defaults[name] = deflt;\n      if (handle) { optionHandlers[name] =\n        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n    }\n\n    CodeMirror.defineOption = option;\n\n    // Passed to option handlers when there is no old value.\n    CodeMirror.Init = Init;\n\n    // These two are, on init, called from the constructor because they\n    // have to be initialized before the editor can start at all.\n    option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n    option(\"mode\", null, function (cm, val) {\n      cm.doc.modeOption = val;\n      loadMode(cm);\n    }, true);\n\n    option(\"indentUnit\", 2, loadMode, true);\n    option(\"indentWithTabs\", false);\n    option(\"smartIndent\", true);\n    option(\"tabSize\", 4, function (cm) {\n      resetModeState(cm);\n      clearCaches(cm);\n      regChange(cm);\n    }, true);\n\n    option(\"lineSeparator\", null, function (cm, val) {\n      cm.doc.lineSep = val;\n      if (!val) { return }\n      var newBreaks = [], lineNo = cm.doc.first;\n      cm.doc.iter(function (line) {\n        for (var pos = 0;;) {\n          var found = line.text.indexOf(val, pos);\n          if (found == -1) { break }\n          pos = found + val.length;\n          newBreaks.push(Pos(lineNo, found));\n        }\n        lineNo++;\n      });\n      for (var i = newBreaks.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n    });\n    option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200c\\u200e\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g, function (cm, val, old) {\n      cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n      if (old != Init) { cm.refresh(); }\n    });\n    option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n    option(\"electricChars\", true);\n    option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n      throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n    }, true);\n    option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n    option(\"autocorrect\", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);\n    option(\"autocapitalize\", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);\n    option(\"rtlMoveVisually\", !windows);\n    option(\"wholeLineUpdateBefore\", true);\n\n    option(\"theme\", \"default\", function (cm) {\n      themeChanged(cm);\n      updateGutters(cm);\n    }, true);\n    option(\"keyMap\", \"default\", function (cm, val, old) {\n      var next = getKeyMap(val);\n      var prev = old != Init && getKeyMap(old);\n      if (prev && prev.detach) { prev.detach(cm, next); }\n      if (next.attach) { next.attach(cm, prev || null); }\n    });\n    option(\"extraKeys\", null);\n    option(\"configureMouse\", null);\n\n    option(\"lineWrapping\", false, wrappingChanged, true);\n    option(\"gutters\", [], function (cm, val) {\n      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);\n      updateGutters(cm);\n    }, true);\n    option(\"fixedGutter\", true, function (cm, val) {\n      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n      cm.refresh();\n    }, true);\n    option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n    option(\"scrollbarStyle\", \"native\", function (cm) {\n      initScrollbars(cm);\n      updateScrollbars(cm);\n      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n    }, true);\n    option(\"lineNumbers\", false, function (cm, val) {\n      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);\n      updateGutters(cm);\n    }, true);\n    option(\"firstLineNumber\", 1, updateGutters, true);\n    option(\"lineNumberFormatter\", function (integer) { return integer; }, updateGutters, true);\n    option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n    option(\"resetSelectionOnContextMenu\", true);\n    option(\"lineWiseCopyCut\", true);\n    option(\"pasteLinesPerSelection\", true);\n    option(\"selectionsMayTouch\", false);\n\n    option(\"readOnly\", false, function (cm, val) {\n      if (val == \"nocursor\") {\n        onBlur(cm);\n        cm.display.input.blur();\n      }\n      cm.display.input.readOnlyChanged(val);\n    });\n\n    option(\"screenReaderLabel\", null, function (cm, val) {\n      val = (val === '') ? null : val;\n      cm.display.input.screenReaderLabelChanged(val);\n    });\n\n    option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n    option(\"dragDrop\", true, dragDropChanged);\n    option(\"allowDropFileTypes\", null);\n\n    option(\"cursorBlinkRate\", 530);\n    option(\"cursorScrollMargin\", 0);\n    option(\"cursorHeight\", 1, updateSelection, true);\n    option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n    option(\"workTime\", 100);\n    option(\"workDelay\", 100);\n    option(\"flattenSpans\", true, resetModeState, true);\n    option(\"addModeClass\", false, resetModeState, true);\n    option(\"pollInterval\", 100);\n    option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n    option(\"historyEventDelay\", 1250);\n    option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n    option(\"maxHighlightLength\", 10000, resetModeState, true);\n    option(\"moveInputWithCursor\", true, function (cm, val) {\n      if (!val) { cm.display.input.resetPosition(); }\n    });\n\n    option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n    option(\"autofocus\", null);\n    option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n    option(\"phrases\", null);\n  }\n\n  function dragDropChanged(cm, value, old) {\n    var wasOn = old && old != Init;\n    if (!value != !wasOn) {\n      var funcs = cm.display.dragFunctions;\n      var toggle = value ? on : off;\n      toggle(cm.display.scroller, \"dragstart\", funcs.start);\n      toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n      toggle(cm.display.scroller, \"dragover\", funcs.over);\n      toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n      toggle(cm.display.scroller, \"drop\", funcs.drop);\n    }\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n      cm.display.sizerWidth = null;\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function () { return updateScrollbars(cm); }, 100);\n  }\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    var this$1 = this;\n\n    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n    this.options = options = options ? copyObj(options) : {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n    else if (options.mode) { doc.modeOption = options.mode; }\n    this.doc = doc;\n\n    var input = new CodeMirror.inputStyles[options.inputStyle](this);\n    var display = this.display = new Display(place, doc, input, options);\n    display.wrapper.CodeMirror = this;\n    themeChanged(this);\n    if (options.lineWrapping)\n      { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n    initScrollbars(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false,\n      delayingBlurEvent: false,\n      focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll\n      selectingText: false,\n      draggingText: false,\n      highlight: new Delayed(), // stores highlight worker timeout\n      keySeq: null,  // Unfinished key sequence\n      specialChars: null\n    };\n\n    if (options.autofocus && !mobile) { display.input.focus(); }\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    startOperation(this);\n    this.curOp.forceUpdate = true;\n    attachDoc(this, doc);\n\n    if ((options.autofocus && !mobile) || this.hasFocus())\n      { setTimeout(bind(onFocus, this), 20); }\n    else\n      { onBlur(this); }\n\n    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n      { optionHandlers[opt](this, options[opt], Init); } }\n    maybeUpdateLineNumberWidth(this);\n    if (options.finishInit) { options.finishInit(this); }\n    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }\n    endOperation(this);\n    // Suppress optimizelegibility in Webkit, since it breaks text\n    // measuring on line wrapping boundaries.\n    if (webkit && options.lineWrapping &&\n        getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n      { display.lineDiv.style.textRendering = \"auto\"; }\n  }\n\n  // The default configuration options.\n  CodeMirror.defaults = defaults;\n  // Functions to run when options are changed.\n  CodeMirror.optionHandlers = optionHandlers;\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie && ie_version < 11)\n      { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n        if (signalDOMEvent(cm, e)) { return }\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n        e_preventDefault(e);\n        var word = cm.findWordAt(pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      })); }\n    else\n      { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n    // Some browsers fire contextmenu *after* opening the menu, at\n    // which point we can't mess with it anymore. Context menu is\n    // handled in onMouseDown for these browsers.\n    on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n    on(d.input.getField(), \"contextmenu\", function (e) {\n      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }\n    });\n\n    // Used to suppress mouse event handling when a touch happens\n    var touchFinished, prevTouch = {end: 0};\n    function finishTouch() {\n      if (d.activeTouch) {\n        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n        prevTouch = d.activeTouch;\n        prevTouch.end = +new Date;\n      }\n    }\n    function isMouseLikeTouchEvent(e) {\n      if (e.touches.length != 1) { return false }\n      var touch = e.touches[0];\n      return touch.radiusX <= 1 && touch.radiusY <= 1\n    }\n    function farAway(touch, other) {\n      if (other.left == null) { return true }\n      var dx = other.left - touch.left, dy = other.top - touch.top;\n      return dx * dx + dy * dy > 20 * 20\n    }\n    on(d.scroller, \"touchstart\", function (e) {\n      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n        d.input.ensurePolled();\n        clearTimeout(touchFinished);\n        var now = +new Date;\n        d.activeTouch = {start: now, moved: false,\n                         prev: now - prevTouch.end <= 300 ? prevTouch : null};\n        if (e.touches.length == 1) {\n          d.activeTouch.left = e.touches[0].pageX;\n          d.activeTouch.top = e.touches[0].pageY;\n        }\n      }\n    });\n    on(d.scroller, \"touchmove\", function () {\n      if (d.activeTouch) { d.activeTouch.moved = true; }\n    });\n    on(d.scroller, \"touchend\", function (e) {\n      var touch = d.activeTouch;\n      if (touch && !eventInWidget(d, e) && touch.left != null &&\n          !touch.moved && new Date - touch.start < 300) {\n        var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n        if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n          { range = new Range(pos, pos); }\n        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n          { range = cm.findWordAt(pos); }\n        else // Triple tap\n          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n        cm.setSelection(range.anchor, range.head);\n        cm.focus();\n        e_preventDefault(e);\n      }\n      finishTouch();\n    });\n    on(d.scroller, \"touchcancel\", finishTouch);\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function () {\n      if (d.scroller.clientHeight) {\n        updateScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n    on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    d.dragFunctions = {\n      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n      start: function (e) { return onDragStart(cm, e); },\n      drop: operation(cm, onDrop),\n      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n    };\n\n    var inp = d.input.getField();\n    on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n    on(inp, \"keydown\", operation(cm, onKeyDown));\n    on(inp, \"keypress\", operation(cm, onKeyPress));\n    on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n    on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n  }\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) { how = \"add\"; }\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!doc.mode.indent) { how = \"prev\"; }\n      else { state = getContextBefore(cm, n).state; }\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) { line.stateAfter = null; }\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass || indentation > 150) {\n        if (!aggressive) { return }\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n      else { indentation = 0; }\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n    if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n    if (indentString != curSpaceString) {\n      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n      line.stateAfter = null;\n      return true\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n        var range = doc.sel.ranges[i$1];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos$1 = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n          break\n        }\n      }\n    }\n  }\n\n  // This will be set to a {lineWise: bool, text: [string]} object, so\n  // that, when pasting, we know what kind of selections the copied\n  // text was made out of.\n  var lastCopied = null;\n\n  function setLastCopied(newLastCopied) {\n    lastCopied = newLastCopied;\n  }\n\n  function applyTextInput(cm, inserted, deleted, sel, origin) {\n    var doc = cm.doc;\n    cm.display.shift = false;\n    if (!sel) { sel = doc.sel; }\n\n    var recent = +new Date - 200;\n    var paste = origin == \"paste\" || cm.state.pasteIncoming > recent;\n    var textLines = splitLinesAuto(inserted), multiPaste = null;\n    // When pasting N lines into N selections, insert one line per selection\n    if (paste && sel.ranges.length > 1) {\n      if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n        if (sel.ranges.length % lastCopied.text.length == 0) {\n          multiPaste = [];\n          for (var i = 0; i < lastCopied.text.length; i++)\n            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n        }\n      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n        multiPaste = map(textLines, function (l) { return [l]; });\n      }\n    }\n\n    var updateInput = cm.curOp.updateInput;\n    // Normal behavior is to insert the new text into every selection\n    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n      var range = sel.ranges[i$1];\n      var from = range.from(), to = range.to();\n      if (range.empty()) {\n        if (deleted && deleted > 0) // Handle deletion\n          { from = Pos(from.line, from.ch - deleted); }\n        else if (cm.state.overwrite && !paste) // Handle overwrite\n          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == textLines.join(\"\\n\"))\n          { from = to = Pos(from.line, 0); }\n      }\n      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n                         origin: origin || (paste ? \"paste\" : cm.state.cutIncoming > recent ? \"cut\" : \"+input\")};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n    }\n    if (inserted && !paste)\n      { triggerElectric(cm, inserted); }\n\n    ensureCursorVisible(cm);\n    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }\n    cm.curOp.typing = true;\n    cm.state.pasteIncoming = cm.state.cutIncoming = -1;\n  }\n\n  function handlePaste(e, cm) {\n    var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n    if (pasted) {\n      e.preventDefault();\n      if (!cm.isReadOnly() && !cm.options.disableInput)\n        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n      return true\n    }\n  }\n\n  function triggerElectric(cm, inserted) {\n    // When an 'electric' character is inserted, immediately trigger a reindent\n    if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n    var sel = cm.doc.sel;\n\n    for (var i = sel.ranges.length - 1; i >= 0; i--) {\n      var range = sel.ranges[i];\n      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }\n      var mode = cm.getModeAt(range.head);\n      var indented = false;\n      if (mode.electricChars) {\n        for (var j = 0; j < mode.electricChars.length; j++)\n          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n            indented = indentLine(cm, range.head.line, \"smart\");\n            break\n          } }\n      } else if (mode.electricInput) {\n        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))\n          { indented = indentLine(cm, range.head.line, \"smart\"); }\n      }\n      if (indented) { signalLater(cm, \"electricInput\", cm, range.head.line); }\n    }\n  }\n\n  function copyableRanges(cm) {\n    var text = [], ranges = [];\n    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n      var line = cm.doc.sel.ranges[i].head.line;\n      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n      ranges.push(lineRange);\n      text.push(cm.getRange(lineRange.anchor, lineRange.head));\n    }\n    return {text: text, ranges: ranges}\n  }\n\n  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {\n    field.setAttribute(\"autocorrect\", autocorrect ? \"\" : \"off\");\n    field.setAttribute(\"autocapitalize\", autocapitalize ? \"\" : \"off\");\n    field.setAttribute(\"spellcheck\", !!spellcheck);\n  }\n\n  function hiddenTextarea() {\n    var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\");\n    var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) { te.style.width = \"1000px\"; }\n    else { te.setAttribute(\"wrap\", \"off\"); }\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) { te.style.border = \"1px solid black\"; }\n    disableBrowserMagic(te);\n    return div\n  }\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  function addEditorMethods(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    var helpers = CodeMirror.helpers = {};\n\n    CodeMirror.prototype = {\n      constructor: CodeMirror,\n      focus: function(){window.focus(); this.display.input.focus();},\n\n      setOption: function(option, value) {\n        var options = this.options, old = options[option];\n        if (options[option] == value && option != \"mode\") { return }\n        options[option] = value;\n        if (optionHandlers.hasOwnProperty(option))\n          { operation(this, optionHandlers[option])(this, value, old); }\n        signal(this, \"optionChange\", this, option);\n      },\n\n      getOption: function(option) {return this.options[option]},\n      getDoc: function() {return this.doc},\n\n      addKeyMap: function(map, bottom) {\n        this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map));\n      },\n      removeKeyMap: function(map) {\n        var maps = this.state.keyMaps;\n        for (var i = 0; i < maps.length; ++i)\n          { if (maps[i] == map || maps[i].name == map) {\n            maps.splice(i, 1);\n            return true\n          } }\n      },\n\n      addOverlay: methodOp(function(spec, options) {\n        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n        if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n        insertSorted(this.state.overlays,\n                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                      priority: (options && options.priority) || 0},\n                     function (overlay) { return overlay.priority; });\n        this.state.modeGen++;\n        regChange(this);\n      }),\n      removeOverlay: methodOp(function(spec) {\n        var overlays = this.state.overlays;\n        for (var i = 0; i < overlays.length; ++i) {\n          var cur = overlays[i].modeSpec;\n          if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n            overlays.splice(i, 1);\n            this.state.modeGen++;\n            regChange(this);\n            return\n          }\n        }\n      }),\n\n      indentLine: methodOp(function(n, dir, aggressive) {\n        if (typeof dir != \"string\" && typeof dir != \"number\") {\n          if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n          else { dir = dir ? \"add\" : \"subtract\"; }\n        }\n        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n      }),\n      indentSelection: methodOp(function(how) {\n        var ranges = this.doc.sel.ranges, end = -1;\n        for (var i = 0; i < ranges.length; i++) {\n          var range = ranges[i];\n          if (!range.empty()) {\n            var from = range.from(), to = range.to();\n            var start = Math.max(end, from.line);\n            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n            for (var j = start; j < end; ++j)\n              { indentLine(this, j, how); }\n            var newRanges = this.doc.sel.ranges;\n            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n          } else if (range.head.line > end) {\n            indentLine(this, range.head.line, how, true);\n            end = range.head.line;\n            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }\n          }\n        }\n      }),\n\n      // Fetch the parser token for a given character. Useful for hacks\n      // that want to inspect the mode state (say, for completion).\n      getTokenAt: function(pos, precise) {\n        return takeToken(this, pos, precise)\n      },\n\n      getLineTokens: function(line, precise) {\n        return takeToken(this, Pos(line), precise, true)\n      },\n\n      getTokenTypeAt: function(pos) {\n        pos = clipPos(this.doc, pos);\n        var styles = getLineStyles(this, getLine(this.doc, pos.line));\n        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n        var type;\n        if (ch == 0) { type = styles[2]; }\n        else { for (;;) {\n          var mid = (before + after) >> 1;\n          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n          else { type = styles[mid * 2 + 2]; break }\n        } }\n        var cut = type ? type.indexOf(\"overlay \") : -1;\n        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n      },\n\n      getModeAt: function(pos) {\n        var mode = this.doc.mode;\n        if (!mode.innerMode) { return mode }\n        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n      },\n\n      getHelper: function(pos, type) {\n        return this.getHelpers(pos, type)[0]\n      },\n\n      getHelpers: function(pos, type) {\n        var found = [];\n        if (!helpers.hasOwnProperty(type)) { return found }\n        var help = helpers[type], mode = this.getModeAt(pos);\n        if (typeof mode[type] == \"string\") {\n          if (help[mode[type]]) { found.push(help[mode[type]]); }\n        } else if (mode[type]) {\n          for (var i = 0; i < mode[type].length; i++) {\n            var val = help[mode[type][i]];\n            if (val) { found.push(val); }\n          }\n        } else if (mode.helperType && help[mode.helperType]) {\n          found.push(help[mode.helperType]);\n        } else if (help[mode.name]) {\n          found.push(help[mode.name]);\n        }\n        for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n          var cur = help._global[i$1];\n          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n            { found.push(cur.val); }\n        }\n        return found\n      },\n\n      getStateAfter: function(line, precise) {\n        var doc = this.doc;\n        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n        return getContextBefore(this, line + 1, precise).state\n      },\n\n      cursorCoords: function(start, mode) {\n        var pos, range = this.doc.sel.primary();\n        if (start == null) { pos = range.head; }\n        else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n        else { pos = start ? range.from() : range.to(); }\n        return cursorCoords(this, pos, mode || \"page\")\n      },\n\n      charCoords: function(pos, mode) {\n        return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n      },\n\n      coordsChar: function(coords, mode) {\n        coords = fromCoordSystem(this, coords, mode || \"page\");\n        return coordsChar(this, coords.left, coords.top)\n      },\n\n      lineAtHeight: function(height, mode) {\n        height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n        return lineAtHeight(this.doc, height + this.display.viewOffset)\n      },\n      heightAtLine: function(line, mode, includeWidgets) {\n        var end = false, lineObj;\n        if (typeof line == \"number\") {\n          var last = this.doc.first + this.doc.size - 1;\n          if (line < this.doc.first) { line = this.doc.first; }\n          else if (line > last) { line = last; end = true; }\n          lineObj = getLine(this.doc, line);\n        } else {\n          lineObj = line;\n        }\n        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n          (end ? this.doc.height - heightAtLine(lineObj) : 0)\n      },\n\n      defaultTextHeight: function() { return textHeight(this.display) },\n      defaultCharWidth: function() { return charWidth(this.display) },\n\n      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n      addWidget: function(pos, node, scroll, vert, horiz) {\n        var display = this.display;\n        pos = cursorCoords(this, clipPos(this.doc, pos));\n        var top = pos.bottom, left = pos.left;\n        node.style.position = \"absolute\";\n        node.setAttribute(\"cm-ignore-events\", \"true\");\n        this.display.input.setUneditable(node);\n        display.sizer.appendChild(node);\n        if (vert == \"over\") {\n          top = pos.top;\n        } else if (vert == \"above\" || vert == \"near\") {\n          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n          // Default to positioning above (if specified and possible); otherwise default to positioning below\n          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n            { top = pos.top - node.offsetHeight; }\n          else if (pos.bottom + node.offsetHeight <= vspace)\n            { top = pos.bottom; }\n          if (left + node.offsetWidth > hspace)\n            { left = hspace - node.offsetWidth; }\n        }\n        node.style.top = top + \"px\";\n        node.style.left = node.style.right = \"\";\n        if (horiz == \"right\") {\n          left = display.sizer.clientWidth - node.offsetWidth;\n          node.style.right = \"0px\";\n        } else {\n          if (horiz == \"left\") { left = 0; }\n          else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n          node.style.left = left + \"px\";\n        }\n        if (scroll)\n          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n      },\n\n      triggerOnKeyDown: methodOp(onKeyDown),\n      triggerOnKeyPress: methodOp(onKeyPress),\n      triggerOnKeyUp: onKeyUp,\n      triggerOnMouseDown: methodOp(onMouseDown),\n\n      execCommand: function(cmd) {\n        if (commands.hasOwnProperty(cmd))\n          { return commands[cmd].call(null, this) }\n      },\n\n      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n      findPosH: function(from, amount, unit, visually) {\n        var dir = 1;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          cur = findPosH(this.doc, cur, dir, unit, visually);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveH: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        this.extendSelectionsBy(function (range) {\n          if (this$1.display.shift || this$1.doc.extend || range.empty())\n            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }\n          else\n            { return dir < 0 ? range.from() : range.to() }\n        }, sel_move);\n      }),\n\n      deleteH: methodOp(function(dir, unit) {\n        var sel = this.doc.sel, doc = this.doc;\n        if (sel.somethingSelected())\n          { doc.replaceSelection(\"\", null, \"+delete\"); }\n        else\n          { deleteNearSelection(this, function (range) {\n            var other = findPosH(doc, range.head, dir, unit, false);\n            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}\n          }); }\n      }),\n\n      findPosV: function(from, amount, unit, goalColumn) {\n        var dir = 1, x = goalColumn;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          var coords = cursorCoords(this, cur, \"div\");\n          if (x == null) { x = coords.left; }\n          else { coords.left = x; }\n          cur = findPosV(this, coords, dir, unit);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveV: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        var doc = this.doc, goals = [];\n        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n        doc.extendSelectionsBy(function (range) {\n          if (collapse)\n            { return dir < 0 ? range.from() : range.to() }\n          var headPos = cursorCoords(this$1, range.head, \"div\");\n          if (range.goalColumn != null) { headPos.left = range.goalColumn; }\n          goals.push(headPos.left);\n          var pos = findPosV(this$1, headPos, dir, unit);\n          if (unit == \"page\" && range == doc.sel.primary())\n            { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n          return pos\n        }, sel_move);\n        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n          { doc.sel.ranges[i].goalColumn = goals[i]; } }\n      }),\n\n      // Find the word at the given position (as returned by coordsChar).\n      findWordAt: function(pos) {\n        var doc = this.doc, line = getLine(doc, pos.line).text;\n        var start = pos.ch, end = pos.ch;\n        if (line) {\n          var helper = this.getHelper(pos, \"wordChars\");\n          if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n          var startChar = line.charAt(start);\n          var check = isWordChar(startChar, helper)\n            ? function (ch) { return isWordChar(ch, helper); }\n            : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n            : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n          while (start > 0 && check(line.charAt(start - 1))) { --start; }\n          while (end < line.length && check(line.charAt(end))) { ++end; }\n        }\n        return new Range(Pos(pos.line, start), Pos(pos.line, end))\n      },\n\n      toggleOverwrite: function(value) {\n        if (value != null && value == this.state.overwrite) { return }\n        if (this.state.overwrite = !this.state.overwrite)\n          { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n        else\n          { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n        signal(this, \"overwriteToggle\", this, this.state.overwrite);\n      },\n      hasFocus: function() { return this.display.input.getField() == activeElt() },\n      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n      getScrollInfo: function() {\n        var scroller = this.display.scroller;\n        return {left: scroller.scrollLeft, top: scroller.scrollTop,\n                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n      },\n\n      scrollIntoView: methodOp(function(range, margin) {\n        if (range == null) {\n          range = {from: this.doc.sel.primary().head, to: null};\n          if (margin == null) { margin = this.options.cursorScrollMargin; }\n        } else if (typeof range == \"number\") {\n          range = {from: Pos(range, 0), to: null};\n        } else if (range.from == null) {\n          range = {from: range, to: null};\n        }\n        if (!range.to) { range.to = range.from; }\n        range.margin = margin || 0;\n\n        if (range.from.line != null) {\n          scrollToRange(this, range);\n        } else {\n          scrollToCoordsRange(this, range.from, range.to, range.margin);\n        }\n      }),\n\n      setSize: methodOp(function(width, height) {\n        var this$1 = this;\n\n        var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n        if (width != null) { this.display.wrapper.style.width = interpret(width); }\n        if (height != null) { this.display.wrapper.style.height = interpret(height); }\n        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n        var lineNo = this.display.viewFrom;\n        this.doc.iter(lineNo, this.display.viewTo, function (line) {\n          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, \"widget\"); break } } }\n          ++lineNo;\n        });\n        this.curOp.forceUpdate = true;\n        signal(this, \"refresh\", this);\n      }),\n\n      operation: function(f){return runInOp(this, f)},\n      startOperation: function(){return startOperation(this)},\n      endOperation: function(){return endOperation(this)},\n\n      refresh: methodOp(function() {\n        var oldHeight = this.display.cachedTextHeight;\n        regChange(this);\n        this.curOp.forceUpdate = true;\n        clearCaches(this);\n        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n        updateGutterSpace(this.display);\n        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)\n          { estimateLineHeights(this); }\n        signal(this, \"refresh\", this);\n      }),\n\n      swapDoc: methodOp(function(doc) {\n        var old = this.doc;\n        old.cm = null;\n        // Cancel the current text selection if any (#5821)\n        if (this.state.selectingText) { this.state.selectingText(); }\n        attachDoc(this, doc);\n        clearCaches(this);\n        this.display.input.reset();\n        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n        this.curOp.forceScroll = true;\n        signalLater(this, \"swapDoc\", this, old);\n        return old\n      }),\n\n      phrase: function(phraseText) {\n        var phrases = this.options.phrases;\n        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n      },\n\n      getInputField: function(){return this.display.input.getField()},\n      getWrapperElement: function(){return this.display.wrapper},\n      getScrollerElement: function(){return this.display.scroller},\n      getGutterElement: function(){return this.display.gutters}\n    };\n    eventMixin(CodeMirror);\n\n    CodeMirror.registerHelper = function(type, name, value) {\n      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n      helpers[type][name] = value;\n    };\n    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n      CodeMirror.registerHelper(type, name, value);\n      helpers[type]._global.push({pred: predicate, val: value});\n    };\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"char\", \"column\" (like char, but doesn't\n  // cross line boundaries), \"word\" (across next word), or \"group\" (to\n  // the start of next group of word or non-word-non-whitespace\n  // chars). The visually param controls whether, in right-to-left\n  // text, direction 1 means to move towards the next index in the\n  // string, or towards the character to the right of the current\n  // position. The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var oldPos = pos;\n    var origDir = dir;\n    var lineObj = getLine(doc, pos.line);\n    var lineDir = visually && doc.direction == \"rtl\" ? -dir : dir;\n    function findNextLine() {\n      var l = pos.line + lineDir;\n      if (l < doc.first || l >= doc.first + doc.size) { return false }\n      pos = new Pos(l, pos.ch, pos.sticky);\n      return lineObj = getLine(doc, l)\n    }\n    function moveOnce(boundToLine) {\n      var next;\n      if (visually) {\n        next = moveVisually(doc.cm, lineObj, pos, dir);\n      } else {\n        next = moveLogically(lineObj, pos, dir);\n      }\n      if (next == null) {\n        if (!boundToLine && findNextLine())\n          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }\n        else\n          { return false }\n      } else {\n        pos = next;\n      }\n      return true\n    }\n\n    if (unit == \"char\") {\n      moveOnce();\n    } else if (unit == \"column\") {\n      moveOnce(true);\n    } else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) { break }\n        var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) { type = \"s\"; }\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n          break\n        }\n\n        if (type) { sawType = type; }\n        if (dir > 0 && !moveOnce(!first)) { break }\n      }\n    }\n    var result = skipAtomic(doc, pos, oldPos, origDir, true);\n    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n    return result\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    var target;\n    for (;;) {\n      target = coordsChar(cm, x, y);\n      if (!target.outside) { break }\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n      y += dir * 5;\n    }\n    return target\n  }\n\n  // CONTENTEDITABLE INPUT STYLE\n\n  var ContentEditableInput = function(cm) {\n    this.cm = cm;\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n    this.polling = new Delayed();\n    this.composing = null;\n    this.gracePeriod = false;\n    this.readDOMTimeout = null;\n  };\n\n  ContentEditableInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = input.cm;\n    var div = input.div = display.lineDiv;\n    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);\n\n    function belongsToInput(e) {\n      for (var t = e.target; t; t = t.parentNode) {\n        if (t == div) { return true }\n        if (/\\bCodeMirror-(?:line)?widget\\b/.test(t.className)) { break }\n      }\n      return false\n    }\n\n    on(div, \"paste\", function (e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n    });\n\n    on(div, \"compositionstart\", function (e) {\n      this$1.composing = {data: e.data, done: false};\n    });\n    on(div, \"compositionupdate\", function (e) {\n      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n    });\n    on(div, \"compositionend\", function (e) {\n      if (this$1.composing) {\n        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n        this$1.composing.done = true;\n      }\n    });\n\n    on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n    on(div, \"input\", function () {\n      if (!this$1.composing) { this$1.readFromDOMSoon(); }\n    });\n\n    function onCopyCut(e) {\n      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n        if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.operation(function () {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n            cm.replaceSelection(\"\", null, \"cut\");\n          });\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData();\n        var content = lastCopied.text.join(\"\\n\");\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content);\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault();\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      var kludge = hiddenTextarea(), te = kludge.firstChild;\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n      te.value = lastCopied.text.join(\"\\n\");\n      var hadFocus = document.activeElement;\n      selectInput(te);\n      setTimeout(function () {\n        cm.display.lineSpace.removeChild(kludge);\n        hadFocus.focus();\n        if (hadFocus == div) { input.showPrimarySelection(); }\n      }, 50);\n    }\n    on(div, \"copy\", onCopyCut);\n    on(div, \"cut\", onCopyCut);\n  };\n\n  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.div.setAttribute('aria-label', label);\n    } else {\n      this.div.removeAttribute('aria-label');\n    }\n  };\n\n  ContentEditableInput.prototype.prepareSelection = function () {\n    var result = prepareSelection(this.cm, false);\n    result.focus = document.activeElement == this.div;\n    return result\n  };\n\n  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n    if (!info || !this.cm.display.view.length) { return }\n    if (info.focus || takeFocus) { this.showPrimarySelection(); }\n    this.showMultipleSelections(info);\n  };\n\n  ContentEditableInput.prototype.getSelection = function () {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  };\n\n  ContentEditableInput.prototype.showPrimarySelection = function () {\n    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n    var from = prim.from(), to = prim.to();\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      { return }\n\n    var view = cm.display.view;\n    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0};\n    var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n    if (!end) {\n      var measure = view[view.length - 1].measure;\n      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var old = sel.rangeCount && sel.getRangeAt(0), rng;\n    try { rng = range(start.node, start.offset, end.offset, end.node); }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset);\n        if (!rng.collapsed) {\n          sel.removeAllRanges();\n          sel.addRange(rng);\n        }\n      } else {\n        sel.removeAllRanges();\n        sel.addRange(rng);\n      }\n      if (old && sel.anchorNode == null) { sel.addRange(old); }\n      else if (gecko) { this.startGracePeriod(); }\n    }\n    this.rememberSelection();\n  };\n\n  ContentEditableInput.prototype.startGracePeriod = function () {\n      var this$1 = this;\n\n    clearTimeout(this.gracePeriod);\n    this.gracePeriod = setTimeout(function () {\n      this$1.gracePeriod = false;\n      if (this$1.selectionChanged())\n        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n    }, 20);\n  };\n\n  ContentEditableInput.prototype.showMultipleSelections = function (info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n  };\n\n  ContentEditableInput.prototype.rememberSelection = function () {\n    var sel = this.getSelection();\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n  };\n\n  ContentEditableInput.prototype.selectionInEditor = function () {\n    var sel = this.getSelection();\n    if (!sel.rangeCount) { return false }\n    var node = sel.getRangeAt(0).commonAncestorContainer;\n    return contains(this.div, node)\n  };\n\n  ContentEditableInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor() || document.activeElement != this.div)\n        { this.showSelection(this.prepareSelection(), true); }\n      this.div.focus();\n    }\n  };\n  ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n  ContentEditableInput.prototype.getField = function () { return this.div };\n\n  ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n  ContentEditableInput.prototype.receivedFocus = function () {\n    var input = this;\n    if (this.selectionInEditor())\n      { this.pollSelection(); }\n    else\n      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection();\n        input.polling.set(input.cm.options.pollInterval, poll);\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll);\n  };\n\n  ContentEditableInput.prototype.selectionChanged = function () {\n    var sel = this.getSelection();\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  };\n\n  ContentEditableInput.prototype.pollSelection = function () {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n    var sel = this.getSelection(), cm = this.cm;\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n      this.blur();\n      this.focus();\n      return\n    }\n    if (this.composing) { return }\n    this.rememberSelection();\n    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (anchor && head) { runInOp(cm, function () {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n    }); }\n  };\n\n  ContentEditableInput.prototype.pollContent = function () {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout);\n      this.readDOMTimeout = null;\n    }\n\n    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n    var from = sel.from(), to = sel.to();\n    if (from.ch == 0 && from.line > cm.firstLine())\n      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      { to = Pos(to.line + 1, 0); }\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n    var fromIndex, fromLine, fromNode;\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line);\n      fromNode = display.view[0].node;\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line);\n      fromNode = display.view[fromIndex - 1].node.nextSibling;\n    }\n    var toIndex = findViewIndex(cm, to.line);\n    var toLine, toNode;\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1;\n      toNode = display.lineDiv.lastChild;\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1;\n      toNode = display.view[toIndex + 1].node.previousSibling;\n    }\n\n    if (!fromNode) { return false }\n    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n      else { break }\n    }\n\n    var cutFront = 0, cutEnd = 0;\n    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      { ++cutFront; }\n    var newBot = lst(newText), oldBot = lst(oldText);\n    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0));\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      { ++cutEnd; }\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--;\n        cutEnd++;\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n    var chFrom = Pos(fromLine, cutFront);\n    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n      return true\n    }\n  };\n\n  ContentEditableInput.prototype.ensurePolled = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.reset = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.forceCompositionEnd = function () {\n    if (!this.composing) { return }\n    clearTimeout(this.readDOMTimeout);\n    this.composing = null;\n    this.updateFromDOM();\n    this.div.blur();\n    this.div.focus();\n  };\n  ContentEditableInput.prototype.readFromDOMSoon = function () {\n      var this$1 = this;\n\n    if (this.readDOMTimeout != null) { return }\n    this.readDOMTimeout = setTimeout(function () {\n      this$1.readDOMTimeout = null;\n      if (this$1.composing) {\n        if (this$1.composing.done) { this$1.composing = null; }\n        else { return }\n      }\n      this$1.updateFromDOM();\n    }, 80);\n  };\n\n  ContentEditableInput.prototype.updateFromDOM = function () {\n      var this$1 = this;\n\n    if (this.cm.isReadOnly() || !this.pollContent())\n      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n  };\n\n  ContentEditableInput.prototype.setUneditable = function (node) {\n    node.contentEditable = \"false\";\n  };\n\n  ContentEditableInput.prototype.onKeyPress = function (e) {\n    if (e.charCode == 0 || this.composing) { return }\n    e.preventDefault();\n    if (!this.cm.isReadOnly())\n      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n  };\n\n  ContentEditableInput.prototype.readOnlyChanged = function (val) {\n    this.div.contentEditable = String(val != \"nocursor\");\n  };\n\n  ContentEditableInput.prototype.onContextMenu = function () {};\n  ContentEditableInput.prototype.resetPosition = function () {};\n\n  ContentEditableInput.prototype.needsContentAttribute = true;\n\n  function posToDOM(cm, pos) {\n    var view = findViewForLine(cm, pos.line);\n    if (!view || view.hidden) { return null }\n    var line = getLine(cm.doc, pos.line);\n    var info = mapFromLineView(view, line, pos.line);\n\n    var order = getOrder(line, cm.doc.direction), side = \"left\";\n    if (order) {\n      var partPos = getBidiPartAt(order, pos.ch);\n      side = partPos % 2 ? \"right\" : \"left\";\n    }\n    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n    result.offset = result.collapse == \"right\" ? result.end : result.start;\n    return result\n  }\n\n  function isInGutter(node) {\n    for (var scan = node; scan; scan = scan.parentNode)\n      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n    return false\n  }\n\n  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n  function domTextBetween(cm, from, to, fromLine, toLine) {\n    var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n    function close() {\n      if (closing) {\n        text += lineSep;\n        if (extraLinebreak) { text += lineSep; }\n        closing = extraLinebreak = false;\n      }\n    }\n    function addText(str) {\n      if (str) {\n        close();\n        text += str;\n      }\n    }\n    function walk(node) {\n      if (node.nodeType == 1) {\n        var cmText = node.getAttribute(\"cm-text\");\n        if (cmText) {\n          addText(cmText);\n          return\n        }\n        var markerID = node.getAttribute(\"cm-marker\"), range;\n        if (markerID) {\n          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n          if (found.length && (range = found[0].find(0)))\n            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }\n          return\n        }\n        if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n        if (isBlock) { close(); }\n        for (var i = 0; i < node.childNodes.length; i++)\n          { walk(node.childNodes[i]); }\n\n        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n        if (isBlock) { closing = true; }\n      } else if (node.nodeType == 3) {\n        addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n      }\n    }\n    for (;;) {\n      walk(from);\n      if (from == to) { break }\n      from = from.nextSibling;\n      extraLinebreak = false;\n    }\n    return text\n  }\n\n  function domToPos(cm, node, offset) {\n    var lineNode;\n    if (node == cm.display.lineDiv) {\n      lineNode = cm.display.lineDiv.childNodes[offset];\n      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n      node = null; offset = 0;\n    } else {\n      for (lineNode = node;; lineNode = lineNode.parentNode) {\n        if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n      }\n    }\n    for (var i = 0; i < cm.display.view.length; i++) {\n      var lineView = cm.display.view[i];\n      if (lineView.node == lineNode)\n        { return locateNodeInLineView(lineView, node, offset) }\n    }\n  }\n\n  function locateNodeInLineView(lineView, node, offset) {\n    var wrapper = lineView.text.firstChild, bad = false;\n    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n    if (node == wrapper) {\n      bad = true;\n      node = wrapper.childNodes[offset];\n      offset = 0;\n      if (!node) {\n        var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n        return badPos(Pos(lineNo(line), line.text.length), bad)\n      }\n    }\n\n    var textNode = node.nodeType == 3 ? node : null, topNode = node;\n    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n      textNode = node.firstChild;\n      if (offset) { offset = textNode.nodeValue.length; }\n    }\n    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n    var measure = lineView.measure, maps = measure.maps;\n\n    function find(textNode, topNode, offset) {\n      for (var i = -1; i < (maps ? maps.length : 0); i++) {\n        var map = i < 0 ? measure.map : maps[i];\n        for (var j = 0; j < map.length; j += 3) {\n          var curNode = map[j + 2];\n          if (curNode == textNode || curNode == topNode) {\n            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n            var ch = map[j] + offset;\n            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }\n            return Pos(line, ch)\n          }\n        }\n      }\n    }\n    var found = find(textNode, topNode, offset);\n    if (found) { return badPos(found, bad) }\n\n    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n      found = find(after, after.firstChild, 0);\n      if (found)\n        { return badPos(Pos(found.line, found.ch - dist), bad) }\n      else\n        { dist += after.textContent.length; }\n    }\n    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n      found = find(before, before.firstChild, -1);\n      if (found)\n        { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n      else\n        { dist$1 += before.textContent.length; }\n    }\n  }\n\n  // TEXTAREA INPUT STYLE\n\n  var TextareaInput = function(cm) {\n    this.cm = cm;\n    // See input.poll and input.reset\n    this.prevInput = \"\";\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false;\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed();\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false;\n    this.composing = null;\n  };\n\n  TextareaInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = this.cm;\n    this.createField(display);\n    var te = this.textarea;\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) { te.style.width = \"0px\"; }\n\n    on(te, \"input\", function () {\n      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n      input.poll();\n    });\n\n    on(te, \"paste\", function (e) {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n      cm.state.pasteIncoming = +new Date;\n      input.fastPoll();\n    });\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll);\n        } else {\n          input.prevInput = \"\";\n          te.value = ranges.text.join(\"\\n\");\n          selectInput(te);\n        }\n      }\n      if (e.type == \"cut\") { cm.state.cutIncoming = +new Date; }\n    }\n    on(te, \"cut\", prepareCopyCut);\n    on(te, \"copy\", prepareCopyCut);\n\n    on(display.scroller, \"paste\", function (e) {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n      if (!te.dispatchEvent) {\n        cm.state.pasteIncoming = +new Date;\n        input.focus();\n        return\n      }\n\n      // Pass the `paste` event to the textarea so it's handled by its event listener.\n      var event = new Event(\"paste\");\n      event.clipboardData = e.clipboardData;\n      te.dispatchEvent(event);\n    });\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", function (e) {\n      if (!eventInWidget(display, e)) { e_preventDefault(e); }\n    });\n\n    on(te, \"compositionstart\", function () {\n      var start = cm.getCursor(\"from\");\n      if (input.composing) { input.composing.range.clear(); }\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      };\n    });\n    on(te, \"compositionend\", function () {\n      if (input.composing) {\n        input.poll();\n        input.composing.range.clear();\n        input.composing = null;\n      }\n    });\n  };\n\n  TextareaInput.prototype.createField = function (_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea();\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild;\n  };\n\n  TextareaInput.prototype.screenReaderLabelChanged = function (label) {\n    // Label for screenreaders, accessibility\n    if(label) {\n      this.textarea.setAttribute('aria-label', label);\n    } else {\n      this.textarea.removeAttribute('aria-label');\n    }\n  };\n\n  TextareaInput.prototype.prepareSelection = function () {\n    // Redraw the selection and/or cursor\n    var cm = this.cm, display = cm.display, doc = cm.doc;\n    var result = prepareSelection(cm);\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top));\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left));\n    }\n\n    return result\n  };\n\n  TextareaInput.prototype.showSelection = function (drawn) {\n    var cm = this.cm, display = cm.display;\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\";\n      this.wrapper.style.left = drawn.teLeft + \"px\";\n    }\n  };\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  TextareaInput.prototype.reset = function (typing) {\n    if (this.contextMenuPending || this.composing) { return }\n    var cm = this.cm;\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\";\n      var content = cm.getSelection();\n      this.textarea.value = content;\n      if (cm.state.focused) { selectInput(this.textarea); }\n      if (ie && ie_version >= 9) { this.hasSelection = content; }\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\";\n      if (ie && ie_version >= 9) { this.hasSelection = null; }\n    }\n  };\n\n  TextareaInput.prototype.getField = function () { return this.textarea };\n\n  TextareaInput.prototype.supportsTouch = function () { return false };\n\n  TextareaInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n      try { this.textarea.focus(); }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  };\n\n  TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n  TextareaInput.prototype.resetPosition = function () {\n    this.wrapper.style.top = this.wrapper.style.left = 0;\n  };\n\n  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  TextareaInput.prototype.slowPoll = function () {\n      var this$1 = this;\n\n    if (this.pollingFast) { return }\n    this.polling.set(this.cm.options.pollInterval, function () {\n      this$1.poll();\n      if (this$1.cm.state.focused) { this$1.slowPoll(); }\n    });\n  };\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  TextareaInput.prototype.fastPoll = function () {\n    var missed = false, input = this;\n    input.pollingFast = true;\n    function p() {\n      var changed = input.poll();\n      if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n      else {input.pollingFast = false; input.slowPoll();}\n    }\n    input.polling.set(20, p);\n  };\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  TextareaInput.prototype.poll = function () {\n      var this$1 = this;\n\n    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      { return false }\n\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) { return false }\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset();\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      var first = text.charCodeAt(0);\n      if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n    runInOp(cm, function () {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this$1.composing ? \"*compose\" : null);\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n      else { this$1.prevInput = text; }\n\n      if (this$1.composing) {\n        this$1.composing.range.clear();\n        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"});\n      }\n    });\n    return true\n  };\n\n  TextareaInput.prototype.ensurePolled = function () {\n    if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n  };\n\n  TextareaInput.prototype.onKeyPress = function () {\n    if (ie && ie_version >= 9) { this.hasSelection = null; }\n    this.fastPoll();\n  };\n\n  TextareaInput.prototype.onContextMenu = function (e) {\n    var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n    if (input.contextMenuPending) { input.contextMenuPending(); }\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) { return } // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();\n    input.wrapper.style.cssText = \"position: static\";\n    te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n      top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n      z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    var oldScrollY;\n    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n    display.input.focus();\n    if (webkit) { window.scrollTo(null, oldScrollY); }\n    display.input.reset();\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n    input.contextMenuPending = rehide;\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = \"\\u200b\" + (selected ? te.value : \"\");\n        te.value = \"\\u21da\"; // Used to catch context-menu undo\n        te.value = extval;\n        input.prevInput = selected ? \"\" : \"\\u200b\";\n        te.selectionStart = 1; te.selectionEnd = extval.length;\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel;\n      }\n    }\n    function rehide() {\n      if (input.contextMenuPending != rehide) { return }\n      input.contextMenuPending = false;\n      input.wrapper.style.cssText = oldWrapperCSS;\n      te.style.cssText = oldCSS;\n      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n        var i = 0, poll = function () {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm);\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500);\n          } else {\n            display.selForContextMenu = null;\n            display.input.reset();\n          }\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function () {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  };\n\n  TextareaInput.prototype.readOnlyChanged = function (val) {\n    if (!val) { this.reset(); }\n    this.textarea.disabled = val == \"nocursor\";\n  };\n\n  TextareaInput.prototype.setUneditable = function () {};\n\n  TextareaInput.prototype.needsContentAttribute = false;\n\n  function fromTextArea(textarea, options) {\n    options = options ? copyObj(options) : {};\n    options.value = textarea.value;\n    if (!options.tabindex && textarea.tabIndex)\n      { options.tabindex = textarea.tabIndex; }\n    if (!options.placeholder && textarea.placeholder)\n      { options.placeholder = textarea.placeholder; }\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt();\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n\n    var realSubmit;\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form;\n        realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function () {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    options.finishInit = function (cm) {\n      cm.save = save;\n      cm.getTextArea = function () { return textarea; };\n      cm.toTextArea = function () {\n        cm.toTextArea = isNaN; // Prevent this from being ran twice\n        save();\n        textarea.parentNode.removeChild(cm.getWrapperElement());\n        textarea.style.display = \"\";\n        if (textarea.form) {\n          off(textarea.form, \"submit\", save);\n          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == \"function\")\n            { textarea.form.submit = realSubmit; }\n        }\n      };\n    };\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n      options);\n    return cm\n  }\n\n  function addLegacyProps(CodeMirror) {\n    CodeMirror.off = off;\n    CodeMirror.on = on;\n    CodeMirror.wheelEventPixels = wheelEventPixels;\n    CodeMirror.Doc = Doc;\n    CodeMirror.splitLines = splitLinesAuto;\n    CodeMirror.countColumn = countColumn;\n    CodeMirror.findColumn = findColumn;\n    CodeMirror.isWordChar = isWordCharBasic;\n    CodeMirror.Pass = Pass;\n    CodeMirror.signal = signal;\n    CodeMirror.Line = Line;\n    CodeMirror.changeEnd = changeEnd;\n    CodeMirror.scrollbarModel = scrollbarModel;\n    CodeMirror.Pos = Pos;\n    CodeMirror.cmpPos = cmp;\n    CodeMirror.modes = modes;\n    CodeMirror.mimeModes = mimeModes;\n    CodeMirror.resolveMode = resolveMode;\n    CodeMirror.getMode = getMode;\n    CodeMirror.modeExtensions = modeExtensions;\n    CodeMirror.extendMode = extendMode;\n    CodeMirror.copyState = copyState;\n    CodeMirror.startState = startState;\n    CodeMirror.innerMode = innerMode;\n    CodeMirror.commands = commands;\n    CodeMirror.keyMap = keyMap;\n    CodeMirror.keyName = keyName;\n    CodeMirror.isModifierKey = isModifierKey;\n    CodeMirror.lookupKey = lookupKey;\n    CodeMirror.normalizeKeyMap = normalizeKeyMap;\n    CodeMirror.StringStream = StringStream;\n    CodeMirror.SharedTextMarker = SharedTextMarker;\n    CodeMirror.TextMarker = TextMarker;\n    CodeMirror.LineWidget = LineWidget;\n    CodeMirror.e_preventDefault = e_preventDefault;\n    CodeMirror.e_stopPropagation = e_stopPropagation;\n    CodeMirror.e_stop = e_stop;\n    CodeMirror.addClass = addClass;\n    CodeMirror.contains = contains;\n    CodeMirror.rmClass = rmClass;\n    CodeMirror.keyNames = keyNames;\n  }\n\n  // EDITOR CONSTRUCTOR\n\n  defineOptions(CodeMirror);\n\n  addEditorMethods(CodeMirror);\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    { CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments)}\n    })(Doc.prototype[prop]); } }\n\n  eventMixin(Doc);\n  CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name/*, mode, …*/) {\n    if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n    defineMode.apply(this, arguments);\n  };\n\n  CodeMirror.defineMIME = defineMIME;\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function (name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function (name, func) {\n    Doc.prototype[name] = func;\n  };\n\n  CodeMirror.fromTextArea = fromTextArea;\n\n  addLegacyProps(CodeMirror);\n\n  CodeMirror.version = \"5.57.0\";\n\n  return CodeMirror;\n\n})));\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Open simple dialogs on top of an editor. Relies on dialog.css.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  function dialogDiv(cm, template, bottom) {\n    var wrap = cm.getWrapperElement();\n    var dialog;\n    dialog = wrap.appendChild(document.createElement(\"div\"));\n    if (bottom)\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-bottom\";\n    else\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-top\";\n\n    if (typeof template == \"string\") {\n      dialog.innerHTML = template;\n    } else { // Assuming it's a detached DOM element.\n      dialog.appendChild(template);\n    }\n    CodeMirror.addClass(wrap, 'dialog-opened');\n    return dialog;\n  }\n\n  function closeNotification(cm, newVal) {\n    if (cm.state.currentNotificationClose)\n      cm.state.currentNotificationClose();\n    cm.state.currentNotificationClose = newVal;\n  }\n\n  CodeMirror.defineExtension(\"openDialog\", function(template, callback, options) {\n    if (!options) options = {};\n\n    closeNotification(this, null);\n\n    var dialog = dialogDiv(this, template, options.bottom);\n    var closed = false, me = this;\n    function close(newVal) {\n      if (typeof newVal == 'string') {\n        inp.value = newVal;\n      } else {\n        if (closed) return;\n        closed = true;\n        CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n        dialog.parentNode.removeChild(dialog);\n        me.focus();\n\n        if (options.onClose) options.onClose(dialog);\n      }\n    }\n\n    var inp = dialog.getElementsByTagName(\"input\")[0], button;\n    if (inp) {\n      inp.focus();\n\n      if (options.value) {\n        inp.value = options.value;\n        if (options.selectValueOnOpen !== false) {\n          inp.select();\n        }\n      }\n\n      if (options.onInput)\n        CodeMirror.on(inp, \"input\", function(e) { options.onInput(e, inp.value, close);});\n      if (options.onKeyUp)\n        CodeMirror.on(inp, \"keyup\", function(e) {options.onKeyUp(e, inp.value, close);});\n\n      CodeMirror.on(inp, \"keydown\", function(e) {\n        if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }\n        if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {\n          inp.blur();\n          CodeMirror.e_stop(e);\n          close();\n        }\n        if (e.keyCode == 13) callback(inp.value, e);\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(dialog, \"focusout\", function (evt) {\n        if (evt.relatedTarget !== null) close();\n      });\n    } else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n      CodeMirror.on(button, \"click\", function() {\n        close();\n        me.focus();\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(button, \"blur\", close);\n\n      button.focus();\n    }\n    return close;\n  });\n\n  CodeMirror.defineExtension(\"openConfirm\", function(template, callbacks, options) {\n    closeNotification(this, null);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var buttons = dialog.getElementsByTagName(\"button\");\n    var closed = false, me = this, blurring = 1;\n    function close() {\n      if (closed) return;\n      closed = true;\n      CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n      dialog.parentNode.removeChild(dialog);\n      me.focus();\n    }\n    buttons[0].focus();\n    for (var i = 0; i < buttons.length; ++i) {\n      var b = buttons[i];\n      (function(callback) {\n        CodeMirror.on(b, \"click\", function(e) {\n          CodeMirror.e_preventDefault(e);\n          close();\n          if (callback) callback(me);\n        });\n      })(callbacks[i]);\n      CodeMirror.on(b, \"blur\", function() {\n        --blurring;\n        setTimeout(function() { if (blurring <= 0) close(); }, 200);\n      });\n      CodeMirror.on(b, \"focus\", function() { ++blurring; });\n    }\n  });\n\n  /*\n   * openNotification\n   * Opens a notification, that can be closed with an optional timer\n   * (default 5000ms timer) and always closes on click.\n   *\n   * If a notification is opened while another is opened, it will close the\n   * currently opened one and open the new one immediately.\n   */\n  CodeMirror.defineExtension(\"openNotification\", function(template, options) {\n    closeNotification(this, close);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var closed = false, doneTimer;\n    var duration = options && typeof options.duration !== \"undefined\" ? options.duration : 5000;\n\n    function close() {\n      if (closed) return;\n      closed = true;\n      clearTimeout(doneTimer);\n      CodeMirror.rmClass(dialog.parentNode, 'dialog-opened');\n      dialog.parentNode.removeChild(dialog);\n    }\n\n    CodeMirror.on(dialog, 'click', function(e) {\n      CodeMirror.e_preventDefault(e);\n      close();\n    });\n\n    if (duration)\n      doneTimer = setTimeout(close, duration);\n\n    return close;\n  });\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var defaults = {\n    pairs: \"()[]{}''\\\"\\\"\",\n    closeBefore: \")]}'\\\":;>\",\n    triples: \"\",\n    explode: \"[]{}\"\n  };\n\n  var Pos = CodeMirror.Pos;\n\n  CodeMirror.defineOption(\"autoCloseBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init) {\n      cm.removeKeyMap(keyMap);\n      cm.state.closeBrackets = null;\n    }\n    if (val) {\n      ensureBound(getOption(val, \"pairs\"))\n      cm.state.closeBrackets = val;\n      cm.addKeyMap(keyMap);\n    }\n  });\n\n  function getOption(conf, name) {\n    if (name == \"pairs\" && typeof conf == \"string\") return conf;\n    if (typeof conf == \"object\" && conf[name] != null) return conf[name];\n    return defaults[name];\n  }\n\n  var keyMap = {Backspace: handleBackspace, Enter: handleEnter};\n  function ensureBound(chars) {\n    for (var i = 0; i < chars.length; i++) {\n      var ch = chars.charAt(i), key = \"'\" + ch + \"'\"\n      if (!keyMap[key]) keyMap[key] = handler(ch)\n    }\n  }\n  ensureBound(defaults.pairs + \"`\")\n\n  function handler(ch) {\n    return function(cm) { return handleChar(cm, ch); };\n  }\n\n  function getConfig(cm) {\n    var deflt = cm.state.closeBrackets;\n    if (!deflt || deflt.override) return deflt;\n    var mode = cm.getModeAt(cm.getCursor());\n    return mode.closeBrackets || deflt;\n  }\n\n  function handleBackspace(cm) {\n    var conf = getConfig(cm);\n    if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var pairs = getOption(conf, \"pairs\");\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var around = charsAround(cm, ranges[i].head);\n      if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n    }\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var cur = ranges[i].head;\n      cm.replaceRange(\"\", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), \"+delete\");\n    }\n  }\n\n  function handleEnter(cm) {\n    var conf = getConfig(cm);\n    var explode = conf && getOption(conf, \"explode\");\n    if (!explode || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      if (!ranges[i].empty()) return CodeMirror.Pass;\n      var around = charsAround(cm, ranges[i].head);\n      if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;\n    }\n    cm.operation(function() {\n      var linesep = cm.lineSeparator() || \"\\n\";\n      cm.replaceSelection(linesep + linesep, null);\n      cm.execCommand(\"goCharLeft\");\n      ranges = cm.listSelections();\n      for (var i = 0; i < ranges.length; i++) {\n        var line = ranges[i].head.line;\n        cm.indentLine(line, null, true);\n        cm.indentLine(line + 1, null, true);\n      }\n    });\n  }\n\n  function contractSelection(sel) {\n    var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;\n    return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),\n            head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};\n  }\n\n  function handleChar(cm, ch) {\n    var conf = getConfig(cm);\n    if (!conf || cm.getOption(\"disableInput\")) return CodeMirror.Pass;\n\n    var pairs = getOption(conf, \"pairs\");\n    var pos = pairs.indexOf(ch);\n    if (pos == -1) return CodeMirror.Pass;\n\n    var closeBefore = getOption(conf,\"closeBefore\");\n\n    var triples = getOption(conf, \"triples\");\n\n    var identical = pairs.charAt(pos + 1) == ch;\n    var ranges = cm.listSelections();\n    var opening = pos % 2 == 0;\n\n    var type;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], cur = range.head, curType;\n      var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));\n      if (opening && !range.empty()) {\n        curType = \"surround\";\n      } else if ((identical || !opening) && next == ch) {\n        if (identical && stringStartsAfter(cm, cur))\n          curType = \"both\";\n        else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)\n          curType = \"skipThree\";\n        else\n          curType = \"skip\";\n      } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&\n                 cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {\n        if (cur.ch > 2 && /\\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;\n        curType = \"addFour\";\n      } else if (identical) {\n        var prev = cur.ch == 0 ? \" \" : cm.getRange(Pos(cur.line, cur.ch - 1), cur)\n        if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = \"both\";\n        else return CodeMirror.Pass;\n      } else if (opening && (next.length === 0 || /\\s/.test(next) || closeBefore.indexOf(next) > -1)) {\n        curType = \"both\";\n      } else {\n        return CodeMirror.Pass;\n      }\n      if (!type) type = curType;\n      else if (type != curType) return CodeMirror.Pass;\n    }\n\n    var left = pos % 2 ? pairs.charAt(pos - 1) : ch;\n    var right = pos % 2 ? ch : pairs.charAt(pos + 1);\n    cm.operation(function() {\n      if (type == \"skip\") {\n        cm.execCommand(\"goCharRight\");\n      } else if (type == \"skipThree\") {\n        for (var i = 0; i < 3; i++)\n          cm.execCommand(\"goCharRight\");\n      } else if (type == \"surround\") {\n        var sels = cm.getSelections();\n        for (var i = 0; i < sels.length; i++)\n          sels[i] = left + sels[i] + right;\n        cm.replaceSelections(sels, \"around\");\n        sels = cm.listSelections().slice();\n        for (var i = 0; i < sels.length; i++)\n          sels[i] = contractSelection(sels[i]);\n        cm.setSelections(sels);\n      } else if (type == \"both\") {\n        cm.replaceSelection(left + right, null);\n        cm.triggerElectric(left + right);\n        cm.execCommand(\"goCharLeft\");\n      } else if (type == \"addFour\") {\n        cm.replaceSelection(left + left + left + left, \"before\");\n        cm.execCommand(\"goCharRight\");\n      }\n    });\n  }\n\n  function charsAround(cm, pos) {\n    var str = cm.getRange(Pos(pos.line, pos.ch - 1),\n                          Pos(pos.line, pos.ch + 1));\n    return str.length == 2 ? str : null;\n  }\n\n  function stringStartsAfter(cm, pos) {\n    var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))\n    return /\\bstring/.test(token.type) && token.start == pos.ch &&\n      (pos.ch == 0 || !/\\bstring/.test(cm.getTokenTypeAt(pos)))\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n    (document.documentMode == null || document.documentMode < 8);\n\n  var Pos = CodeMirror.Pos;\n\n  var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\", \"<\": \">>\", \">\": \"<<\"};\n\n  function bracketRegex(config) {\n    return config && config.bracketRegex || /[(){}[\\]]/\n  }\n\n  function findMatchingBracket(cm, where, config) {\n    var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n    var afterCursor = config && config.afterCursor\n    if (afterCursor == null)\n      afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className)\n    var re = bracketRegex(config)\n\n    // A cursor is defined as between two characters, but in in vim command mode\n    // (i.e. not insert mode), the cursor is visually represented as a\n    // highlighted box on top of the 2nd character. Otherwise, we allow matches\n    // from before or after the cursor.\n    var match = (!afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)]) ||\n        re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)];\n    if (!match) return null;\n    var dir = match.charAt(1) == \">\" ? 1 : -1;\n    if (config && config.strict && (dir > 0) != (pos == where.ch)) return null;\n    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);\n    if (found == null) return null;\n    return {from: Pos(where.line, pos), to: found && found.pos,\n            match: found && found.ch == match.charAt(0), forward: dir > 0};\n  }\n\n  // bracketRegex is used to specify which type of bracket to scan\n  // should be a regexp, e.g. /[[\\]]/\n  //\n  // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n  //\n  // Returns false when no bracket was found, null when it reached\n  // maxScanLines and gave up\n  function scanForBracket(cm, where, dir, style, config) {\n    var maxScanLen = (config && config.maxScanLineLength) || 10000;\n    var maxScanLines = (config && config.maxScanLines) || 1000;\n\n    var stack = [];\n    var re = bracketRegex(config)\n    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n      var line = cm.getLine(lineNo);\n      if (!line) continue;\n      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n      if (line.length > maxScanLen) continue;\n      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n      for (; pos != end; pos += dir) {\n        var ch = line.charAt(pos);\n        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {\n          var match = matching[ch];\n          if (match && (match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n          else stack.pop();\n        }\n      }\n    }\n    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n  }\n\n  function matchBrackets(cm, autoclear, config) {\n    // Disable brace matching in long lines, since it'll cause hugely slow updates\n    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;\n    var marks = [], ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config);\n      if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {\n        var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n      }\n    }\n\n    if (marks.length) {\n      // Kludge to work around the IE bug from issue #1193, where text\n      // input stops going to the textare whever this fires.\n      if (ie_lt8 && cm.state.focused) cm.focus();\n\n      var clear = function() {\n        cm.operation(function() {\n          for (var i = 0; i < marks.length; i++) marks[i].clear();\n        });\n      };\n      if (autoclear) setTimeout(clear, 800);\n      else return clear;\n    }\n  }\n\n  function doMatchBrackets(cm) {\n    cm.operation(function() {\n      if (cm.state.matchBrackets.currentlyHighlighted) {\n        cm.state.matchBrackets.currentlyHighlighted();\n        cm.state.matchBrackets.currentlyHighlighted = null;\n      }\n      cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n    });\n  }\n\n  CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n    function clear(cm) {\n      if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) {\n        cm.state.matchBrackets.currentlyHighlighted();\n        cm.state.matchBrackets.currentlyHighlighted = null;\n      }\n    }\n\n    if (old && old != CodeMirror.Init) {\n      cm.off(\"cursorActivity\", doMatchBrackets);\n      cm.off(\"focus\", doMatchBrackets)\n      cm.off(\"blur\", clear)\n      clear(cm);\n    }\n    if (val) {\n      cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n      cm.on(\"cursorActivity\", doMatchBrackets);\n      cm.on(\"focus\", doMatchBrackets)\n      cm.on(\"blur\", clear)\n    }\n  });\n\n  CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n  CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, config, oldConfig){\n    // Backwards-compatibility kludge\n    if (oldConfig || typeof config == \"boolean\") {\n      if (!oldConfig) {\n        config = config ? {strict: true} : null\n      } else {\n        oldConfig.strict = config\n        config = oldConfig\n      }\n    }\n    return findMatchingBracket(this, pos, config)\n  });\n  CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n    return scanForBracket(this, pos, dir, style, config);\n  });\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), \"cjs\");\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], function(CM) { mod(CM, \"amd\"); });\n  else // Plain browser env\n    mod(CodeMirror, \"plain\");\n})(function(CodeMirror, env) {\n  if (!CodeMirror.modeURL) CodeMirror.modeURL = \"../mode/%N/%N.js\";\n\n  var loading = {};\n  function splitCallback(cont, n) {\n    var countDown = n;\n    return function() { if (--countDown == 0) cont(); };\n  }\n  function ensureDeps(mode, cont, options) {\n    var modeObj = CodeMirror.modes[mode], deps = modeObj && modeObj.dependencies;\n    if (!deps) return cont();\n    var missing = [];\n    for (var i = 0; i < deps.length; ++i) {\n      if (!CodeMirror.modes.hasOwnProperty(deps[i]))\n        missing.push(deps[i]);\n    }\n    if (!missing.length) return cont();\n    var split = splitCallback(cont, missing.length);\n    for (var i = 0; i < missing.length; ++i)\n      CodeMirror.requireMode(missing[i], split, options);\n  }\n\n  CodeMirror.requireMode = function(mode, cont, options) {\n    if (typeof mode != \"string\") mode = mode.name;\n    if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options);\n    if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);\n\n    var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode);\n    if (options && options.loadMode) {\n      options.loadMode(file, function() { ensureDeps(mode, cont, options) })\n    } else if (env == \"plain\") {\n      var script = document.createElement(\"script\");\n      script.src = file;\n      var others = document.getElementsByTagName(\"script\")[0];\n      var list = loading[mode] = [cont];\n      CodeMirror.on(script, \"load\", function() {\n        ensureDeps(mode, function() {\n          for (var i = 0; i < list.length; ++i) list[i]();\n        }, options);\n      });\n      others.parentNode.insertBefore(script, others);\n    } else if (env == \"cjs\") {\n      require(file);\n      cont();\n    } else if (env == \"amd\") {\n      requirejs([file], cont);\n    }\n  };\n\n  CodeMirror.autoLoadMode = function(instance, mode, options) {\n    if (!CodeMirror.modes.hasOwnProperty(mode))\n      CodeMirror.requireMode(mode, function() {\n        instance.setOption(\"mode\", instance.getOption(\"mode\"));\n      }, options);\n  };\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.multiplexingMode = function(outer /*, others */) {\n  // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects\n  var others = Array.prototype.slice.call(arguments, 1);\n\n  function indexOf(string, pattern, from, returnEnd) {\n    if (typeof pattern == \"string\") {\n      var found = string.indexOf(pattern, from);\n      return returnEnd && found > -1 ? found + pattern.length : found;\n    }\n    var m = pattern.exec(from ? string.slice(from) : string);\n    return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;\n  }\n\n  return {\n    startState: function() {\n      return {\n        outer: CodeMirror.startState(outer),\n        innerActive: null,\n        inner: null\n      };\n    },\n\n    copyState: function(state) {\n      return {\n        outer: CodeMirror.copyState(outer, state.outer),\n        innerActive: state.innerActive,\n        inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)\n      };\n    },\n\n    token: function(stream, state) {\n      if (!state.innerActive) {\n        var cutOff = Infinity, oldContent = stream.string;\n        for (var i = 0; i < others.length; ++i) {\n          var other = others[i];\n          var found = indexOf(oldContent, other.open, stream.pos);\n          if (found == stream.pos) {\n            if (!other.parseDelimiters) stream.match(other.open);\n            state.innerActive = other;\n\n            // Get the outer indent, making sure to handle CodeMirror.Pass\n            var outerIndent = 0;\n            if (outer.indent) {\n              var possibleOuterIndent = outer.indent(state.outer, \"\", \"\");\n              if (possibleOuterIndent !== CodeMirror.Pass) outerIndent = possibleOuterIndent;\n            }\n\n            state.inner = CodeMirror.startState(other.mode, outerIndent);\n            return other.delimStyle && (other.delimStyle + \" \" + other.delimStyle + \"-open\");\n          } else if (found != -1 && found < cutOff) {\n            cutOff = found;\n          }\n        }\n        if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);\n        var outerToken = outer.token(stream, state.outer);\n        if (cutOff != Infinity) stream.string = oldContent;\n        return outerToken;\n      } else {\n        var curInner = state.innerActive, oldContent = stream.string;\n        if (!curInner.close && stream.sol()) {\n          state.innerActive = state.inner = null;\n          return this.token(stream, state);\n        }\n        var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;\n        if (found == stream.pos && !curInner.parseDelimiters) {\n          stream.match(curInner.close);\n          state.innerActive = state.inner = null;\n          return curInner.delimStyle && (curInner.delimStyle + \" \" + curInner.delimStyle + \"-close\");\n        }\n        if (found > -1) stream.string = oldContent.slice(0, found);\n        var innerToken = curInner.mode.token(stream, state.inner);\n        if (found > -1) stream.string = oldContent;\n\n        if (found == stream.pos && curInner.parseDelimiters)\n          state.innerActive = state.inner = null;\n\n        if (curInner.innerStyle) {\n          if (innerToken) innerToken = innerToken + \" \" + curInner.innerStyle;\n          else innerToken = curInner.innerStyle;\n        }\n\n        return innerToken;\n      }\n    },\n\n    indent: function(state, textAfter, line) {\n      var mode = state.innerActive ? state.innerActive.mode : outer;\n      if (!mode.indent) return CodeMirror.Pass;\n      return mode.indent(state.innerActive ? state.inner : state.outer, textAfter, line);\n    },\n\n    blankLine: function(state) {\n      var mode = state.innerActive ? state.innerActive.mode : outer;\n      if (mode.blankLine) {\n        mode.blankLine(state.innerActive ? state.inner : state.outer);\n      }\n      if (!state.innerActive) {\n        for (var i = 0; i < others.length; ++i) {\n          var other = others[i];\n          if (other.open === \"\\n\") {\n            state.innerActive = other;\n            state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, \"\", \"\") : 0);\n          }\n        }\n      } else if (state.innerActive.close === \"\\n\") {\n        state.innerActive = state.inner = null;\n      }\n    },\n\n    electricChars: outer.electricChars,\n\n    innerMode: function(state) {\n      return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};\n    }\n  };\n};\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Utility function that allows modes to be combined. The mode given\n// as the base argument takes care of most of the normal mode\n// functionality, but a second (typically simple) mode is used, which\n// can override the style of text. Both modes get to parse all of the\n// text, but when both assign a non-null style to a piece of code, the\n// overlay wins, unless the combine argument was true and not overridden,\n// or state.overlay.combineTokens was true, in which case the styles are\n// combined.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.overlayMode = function(base, overlay, combine) {\n  return {\n    startState: function() {\n      return {\n        base: CodeMirror.startState(base),\n        overlay: CodeMirror.startState(overlay),\n        basePos: 0, baseCur: null,\n        overlayPos: 0, overlayCur: null,\n        streamSeen: null\n      };\n    },\n    copyState: function(state) {\n      return {\n        base: CodeMirror.copyState(base, state.base),\n        overlay: CodeMirror.copyState(overlay, state.overlay),\n        basePos: state.basePos, baseCur: null,\n        overlayPos: state.overlayPos, overlayCur: null\n      };\n    },\n\n    token: function(stream, state) {\n      if (stream != state.streamSeen ||\n          Math.min(state.basePos, state.overlayPos) < stream.start) {\n        state.streamSeen = stream;\n        state.basePos = state.overlayPos = stream.start;\n      }\n\n      if (stream.start == state.basePos) {\n        state.baseCur = base.token(stream, state.base);\n        state.basePos = stream.pos;\n      }\n      if (stream.start == state.overlayPos) {\n        stream.pos = stream.start;\n        state.overlayCur = overlay.token(stream, state.overlay);\n        state.overlayPos = stream.pos;\n      }\n      stream.pos = Math.min(state.basePos, state.overlayPos);\n\n      // state.overlay.combineTokens always takes precedence over combine,\n      // unless set to null\n      if (state.overlayCur == null) return state.baseCur;\n      else if (state.baseCur != null &&\n               state.overlay.combineTokens ||\n               combine && state.overlay.combineTokens == null)\n        return state.baseCur + \" \" + state.overlayCur;\n      else return state.overlayCur;\n    },\n\n    indent: base.indent && function(state, textAfter, line) {\n      return base.indent(state.base, textAfter, line);\n    },\n    electricChars: base.electricChars,\n\n    innerMode: function(state) { return {state: state.base, mode: base}; },\n\n    blankLine: function(state) {\n      var baseToken, overlayToken;\n      if (base.blankLine) baseToken = base.blankLine(state.base);\n      if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay);\n\n      return overlayToken == null ?\n        baseToken :\n        (combine && baseToken != null ? baseToken + \" \" + overlayToken : overlayToken);\n    }\n  };\n};\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineSimpleMode = function(name, states) {\n    CodeMirror.defineMode(name, function(config) {\n      return CodeMirror.simpleMode(config, states);\n    });\n  };\n\n  CodeMirror.simpleMode = function(config, states) {\n    ensureState(states, \"start\");\n    var states_ = {}, meta = states.meta || {}, hasIndentation = false;\n    for (var state in states) if (state != meta && states.hasOwnProperty(state)) {\n      var list = states_[state] = [], orig = states[state];\n      for (var i = 0; i < orig.length; i++) {\n        var data = orig[i];\n        list.push(new Rule(data, states));\n        if (data.indent || data.dedent) hasIndentation = true;\n      }\n    }\n    var mode = {\n      startState: function() {\n        return {state: \"start\", pending: null,\n                local: null, localState: null,\n                indent: hasIndentation ? [] : null};\n      },\n      copyState: function(state) {\n        var s = {state: state.state, pending: state.pending,\n                 local: state.local, localState: null,\n                 indent: state.indent && state.indent.slice(0)};\n        if (state.localState)\n          s.localState = CodeMirror.copyState(state.local.mode, state.localState);\n        if (state.stack)\n          s.stack = state.stack.slice(0);\n        for (var pers = state.persistentStates; pers; pers = pers.next)\n          s.persistentStates = {mode: pers.mode,\n                                spec: pers.spec,\n                                state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),\n                                next: s.persistentStates};\n        return s;\n      },\n      token: tokenFunction(states_, config),\n      innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },\n      indent: indentFunction(states_, meta)\n    };\n    if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))\n      mode[prop] = meta[prop];\n    return mode;\n  };\n\n  function ensureState(states, name) {\n    if (!states.hasOwnProperty(name))\n      throw new Error(\"Undefined state \" + name + \" in simple mode\");\n  }\n\n  function toRegex(val, caret) {\n    if (!val) return /(?:)/;\n    var flags = \"\";\n    if (val instanceof RegExp) {\n      if (val.ignoreCase) flags = \"i\";\n      val = val.source;\n    } else {\n      val = String(val);\n    }\n    return new RegExp((caret === false ? \"\" : \"^\") + \"(?:\" + val + \")\", flags);\n  }\n\n  function asToken(val) {\n    if (!val) return null;\n    if (val.apply) return val\n    if (typeof val == \"string\") return val.replace(/\\./g, \" \");\n    var result = [];\n    for (var i = 0; i < val.length; i++)\n      result.push(val[i] && val[i].replace(/\\./g, \" \"));\n    return result;\n  }\n\n  function Rule(data, states) {\n    if (data.next || data.push) ensureState(states, data.next || data.push);\n    this.regex = toRegex(data.regex);\n    this.token = asToken(data.token);\n    this.data = data;\n  }\n\n  function tokenFunction(states, config) {\n    return function(stream, state) {\n      if (state.pending) {\n        var pend = state.pending.shift();\n        if (state.pending.length == 0) state.pending = null;\n        stream.pos += pend.text.length;\n        return pend.token;\n      }\n\n      if (state.local) {\n        if (state.local.end && stream.match(state.local.end)) {\n          var tok = state.local.endToken || null;\n          state.local = state.localState = null;\n          return tok;\n        } else {\n          var tok = state.local.mode.token(stream, state.localState), m;\n          if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))\n            stream.pos = stream.start + m.index;\n          return tok;\n        }\n      }\n\n      var curState = states[state.state];\n      for (var i = 0; i < curState.length; i++) {\n        var rule = curState[i];\n        var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);\n        if (matches) {\n          if (rule.data.next) {\n            state.state = rule.data.next;\n          } else if (rule.data.push) {\n            (state.stack || (state.stack = [])).push(state.state);\n            state.state = rule.data.push;\n          } else if (rule.data.pop && state.stack && state.stack.length) {\n            state.state = state.stack.pop();\n          }\n\n          if (rule.data.mode)\n            enterLocalMode(config, state, rule.data.mode, rule.token);\n          if (rule.data.indent)\n            state.indent.push(stream.indentation() + config.indentUnit);\n          if (rule.data.dedent)\n            state.indent.pop();\n          var token = rule.token\n          if (token && token.apply) token = token(matches)\n          if (matches.length > 2 && rule.token && typeof rule.token != \"string\") {\n            state.pending = [];\n            for (var j = 2; j < matches.length; j++)\n              if (matches[j])\n                state.pending.push({text: matches[j], token: rule.token[j - 1]});\n            stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));\n            return token[0];\n          } else if (token && token.join) {\n            return token[0];\n          } else {\n            return token;\n          }\n        }\n      }\n      stream.next();\n      return null;\n    };\n  }\n\n  function cmp(a, b) {\n    if (a === b) return true;\n    if (!a || typeof a != \"object\" || !b || typeof b != \"object\") return false;\n    var props = 0;\n    for (var prop in a) if (a.hasOwnProperty(prop)) {\n      if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;\n      props++;\n    }\n    for (var prop in b) if (b.hasOwnProperty(prop)) props--;\n    return props == 0;\n  }\n\n  function enterLocalMode(config, state, spec, token) {\n    var pers;\n    if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)\n      if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;\n    var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);\n    var lState = pers ? pers.state : CodeMirror.startState(mode);\n    if (spec.persistent && !pers)\n      state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};\n\n    state.localState = lState;\n    state.local = {mode: mode,\n                   end: spec.end && toRegex(spec.end),\n                   endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),\n                   endToken: token && token.join ? token[token.length - 1] : token};\n  }\n\n  function indexOf(val, arr) {\n    for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;\n  }\n\n  function indentFunction(states, meta) {\n    return function(state, textAfter, line) {\n      if (state.local && state.local.mode.indent)\n        return state.local.mode.indent(state.localState, textAfter, line);\n      if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)\n        return CodeMirror.Pass;\n\n      var pos = state.indent.length - 1, rules = states[state.state];\n      scan: for (;;) {\n        for (var i = 0; i < rules.length; i++) {\n          var rule = rules[i];\n          if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {\n            var m = rule.regex.exec(textAfter);\n            if (m && m[0]) {\n              pos--;\n              if (rule.next || rule.push) rules = states[rule.next || rule.push];\n              textAfter = textAfter.slice(m[0].length);\n              continue scan;\n            }\n          }\n        }\n        break;\n      }\n      return pos < 0 ? 0 : state.indent[pos];\n    };\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.runMode = function(string, modespec, callback, options) {\n  var mode = CodeMirror.getMode(CodeMirror.defaults, modespec);\n  var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize;\n\n  // Create a tokenizing callback function if passed-in callback is a DOM element.\n  if (callback.appendChild) {\n    var ie = /MSIE \\d/.test(navigator.userAgent);\n    var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);\n    var node = callback, col = 0;\n    node.innerHTML = \"\";\n    callback = function(text, style) {\n      if (text == \"\\n\") {\n        // Emitting LF or CRLF on IE8 or earlier results in an incorrect display.\n        // Emitting a carriage return makes everything ok.\n        node.appendChild(document.createTextNode(ie_lt9 ? '\\r' : text));\n        col = 0;\n        return;\n      }\n      var content = \"\";\n      // replace tabs\n      for (var pos = 0;;) {\n        var idx = text.indexOf(\"\\t\", pos);\n        if (idx == -1) {\n          content += text.slice(pos);\n          col += text.length - pos;\n          break;\n        } else {\n          col += idx - pos;\n          content += text.slice(pos, idx);\n          var size = tabSize - col % tabSize;\n          col += size;\n          for (var i = 0; i < size; ++i) content += \" \";\n          pos = idx + 1;\n        }\n      }\n      // Create a node with token style and append it to the callback DOM element.\n      if (style) {\n        var sp = node.appendChild(document.createElement(\"span\"));\n        sp.className = \"cm-\" + style.replace(/ +/g, \" cm-\");\n        sp.appendChild(document.createTextNode(content));\n      } else {\n        node.appendChild(document.createTextNode(content));\n      }\n    };\n  }\n\n  var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode);\n  for (var i = 0, e = lines.length; i < e; ++i) {\n    if (i) callback(\"\\n\");\n    var stream = new CodeMirror.StringStream(lines[i], null, {\n      lookAhead: function(n) { return lines[i + n] },\n      baseToken: function() {}\n    });\n    if (!stream.string && mode.blankLine) mode.blankLine(state);\n    while (!stream.eol()) {\n      var style = mode.token(stream, state);\n      callback(stream.current(), style, i, stream.start, state);\n      stream.start = stream.pos;\n    }\n  }\n};\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Defines jumpToLine command. Uses dialog.js if present.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});\n    else f(prompt(shortText, deflt));\n  }\n\n  function getJumpDialog(cm) {\n    return cm.phrase(\"Jump to line:\") + ' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">' + cm.phrase(\"(Use line:column or scroll% syntax)\") + '</span>';\n  }\n\n  function interpretLine(cm, string) {\n    var num = Number(string)\n    if (/^[-+]/.test(string)) return cm.getCursor().line + num\n    else return num - 1\n  }\n\n  CodeMirror.commands.jumpToLine = function(cm) {\n    var cur = cm.getCursor();\n    dialog(cm, getJumpDialog(cm), cm.phrase(\"Jump to line:\"), (cur.line + 1) + \":\" + cur.ch, function(posStr) {\n      if (!posStr) return;\n\n      var match;\n      if (match = /^\\s*([\\+\\-]?\\d+)\\s*\\:\\s*(\\d+)\\s*$/.exec(posStr)) {\n        cm.setCursor(interpretLine(cm, match[1]), Number(match[2]))\n      } else if (match = /^\\s*([\\+\\-]?\\d+(\\.\\d+)?)\\%\\s*/.exec(posStr)) {\n        var line = Math.round(cm.lineCount() * Number(match[1]) / 100);\n        if (/^[-+]/.test(match[1])) line = cur.line + line + 1;\n        cm.setCursor(line - 1, cur.ch);\n      } else if (match = /^\\s*\\:?\\s*([\\+\\-]?\\d+)\\s*/.exec(posStr)) {\n        cm.setCursor(interpretLine(cm, match[1]), cur.ch);\n      }\n    });\n  };\n\n  CodeMirror.keyMap[\"default\"][\"Alt-G\"] = \"jumpToLine\";\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../scroll/annotatescrollbar\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../scroll/annotatescrollbar\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineExtension(\"showMatchesOnScrollbar\", function(query, caseFold, options) {\n    if (typeof options == \"string\") options = {className: options};\n    if (!options) options = {};\n    return new SearchAnnotation(this, query, caseFold, options);\n  });\n\n  function SearchAnnotation(cm, query, caseFold, options) {\n    this.cm = cm;\n    this.options = options;\n    var annotateOptions = {listenForChanges: false};\n    for (var prop in options) annotateOptions[prop] = options[prop];\n    if (!annotateOptions.className) annotateOptions.className = \"CodeMirror-search-match\";\n    this.annotation = cm.annotateScrollbar(annotateOptions);\n    this.query = query;\n    this.caseFold = caseFold;\n    this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1};\n    this.matches = [];\n    this.update = null;\n\n    this.findMatches();\n    this.annotation.update(this.matches);\n\n    var self = this;\n    cm.on(\"change\", this.changeHandler = function(_cm, change) { self.onChange(change); });\n  }\n\n  var MAX_MATCHES = 1000;\n\n  SearchAnnotation.prototype.findMatches = function() {\n    if (!this.gap) return;\n    for (var i = 0; i < this.matches.length; i++) {\n      var match = this.matches[i];\n      if (match.from.line >= this.gap.to) break;\n      if (match.to.line >= this.gap.from) this.matches.splice(i--, 1);\n    }\n    var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), {caseFold: this.caseFold, multiline: this.options.multiline});\n    var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES;\n    while (cursor.findNext()) {\n      var match = {from: cursor.from(), to: cursor.to()};\n      if (match.from.line >= this.gap.to) break;\n      this.matches.splice(i++, 0, match);\n      if (this.matches.length > maxMatches) break;\n    }\n    this.gap = null;\n  };\n\n  function offsetLine(line, changeStart, sizeChange) {\n    if (line <= changeStart) return line;\n    return Math.max(changeStart, line + sizeChange);\n  }\n\n  SearchAnnotation.prototype.onChange = function(change) {\n    var startLine = change.from.line;\n    var endLine = CodeMirror.changeEnd(change).line;\n    var sizeChange = endLine - change.to.line;\n    if (this.gap) {\n      this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line);\n      this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line);\n    } else {\n      this.gap = {from: change.from.line, to: endLine + 1};\n    }\n\n    if (sizeChange) for (var i = 0; i < this.matches.length; i++) {\n      var match = this.matches[i];\n      var newFrom = offsetLine(match.from.line, startLine, sizeChange);\n      if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch);\n      var newTo = offsetLine(match.to.line, startLine, sizeChange);\n      if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch);\n    }\n    clearTimeout(this.update);\n    var self = this;\n    this.update = setTimeout(function() { self.updateAfterChange(); }, 250);\n  };\n\n  SearchAnnotation.prototype.updateAfterChange = function() {\n    this.findMatches();\n    this.annotation.update(this.matches);\n  };\n\n  SearchAnnotation.prototype.clear = function() {\n    this.cm.off(\"change\", this.changeHandler);\n    this.annotation.clear();\n  };\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"))\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod)\n  else // Plain browser env\n    mod(CodeMirror)\n})(function(CodeMirror) {\n  \"use strict\"\n  var Pos = CodeMirror.Pos\n\n  function regexpFlags(regexp) {\n    var flags = regexp.flags\n    return flags != null ? flags : (regexp.ignoreCase ? \"i\" : \"\")\n      + (regexp.global ? \"g\" : \"\")\n      + (regexp.multiline ? \"m\" : \"\")\n  }\n\n  function ensureFlags(regexp, flags) {\n    var current = regexpFlags(regexp), target = current\n    for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1)\n      target += flags.charAt(i)\n    return current == target ? regexp : new RegExp(regexp.source, target)\n  }\n\n  function maybeMultiline(regexp) {\n    return /\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(regexp.source)\n  }\n\n  function searchRegexpForward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) {\n      regexp.lastIndex = ch\n      var string = doc.getLine(line), match = regexp.exec(string)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpForwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start)\n\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunk = 1\n    for (var line = start.line, last = doc.lastLine(); line <= last;) {\n      // This grows the search buffer in exponentially-sized chunks\n      // between matches, so that nearby matches are fast and don't\n      // require concatenating the whole document (in case we're\n      // searching for something that has tons of matches), but at the\n      // same time, the amount of retries is limited.\n      for (var i = 0; i < chunk; i++) {\n        if (line > last) break\n        var curLine = doc.getLine(line++)\n        string = string == null ? curLine : string + \"\\n\" + curLine\n      }\n      chunk = chunk * 2\n      regexp.lastIndex = start.ch\n      var match = regexp.exec(string)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  function lastMatchIn(string, regexp, endMargin) {\n    var match, from = 0\n    while (from <= string.length) {\n      regexp.lastIndex = from\n      var newMatch = regexp.exec(string)\n      if (!newMatch) break\n      var end = newMatch.index + newMatch[0].length\n      if (end > string.length - endMargin) break\n      if (!match || end > match.index + match[0].length)\n        match = newMatch\n      from = newMatch.index + 1\n    }\n    return match\n  }\n\n  function searchRegexpBackward(doc, regexp, start) {\n    regexp = ensureFlags(regexp, \"g\")\n    for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) {\n      var string = doc.getLine(line)\n      var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch)\n      if (match)\n        return {from: Pos(line, match.index),\n                to: Pos(line, match.index + match[0].length),\n                match: match}\n    }\n  }\n\n  function searchRegexpBackwardMultiline(doc, regexp, start) {\n    if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start)\n    regexp = ensureFlags(regexp, \"gm\")\n    var string, chunkSize = 1, endMargin = doc.getLine(start.line).length - start.ch\n    for (var line = start.line, first = doc.firstLine(); line >= first;) {\n      for (var i = 0; i < chunkSize && line >= first; i++) {\n        var curLine = doc.getLine(line--)\n        string = string == null ? curLine : curLine + \"\\n\" + string\n      }\n      chunkSize *= 2\n\n      var match = lastMatchIn(string, regexp, endMargin)\n      if (match) {\n        var before = string.slice(0, match.index).split(\"\\n\"), inside = match[0].split(\"\\n\")\n        var startLine = line + before.length, startCh = before[before.length - 1].length\n        return {from: Pos(startLine, startCh),\n                to: Pos(startLine + inside.length - 1,\n                        inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length),\n                match: match}\n      }\n    }\n  }\n\n  var doFold, noFold\n  if (String.prototype.normalize) {\n    doFold = function(str) { return str.normalize(\"NFD\").toLowerCase() }\n    noFold = function(str) { return str.normalize(\"NFD\") }\n  } else {\n    doFold = function(str) { return str.toLowerCase() }\n    noFold = function(str) { return str }\n  }\n\n  // Maps a position in a case-folded line back to a position in the original line\n  // (compensating for codepoints increasing in number during folding)\n  function adjustPos(orig, folded, pos, foldFunc) {\n    if (orig.length == folded.length) return pos\n    for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) {\n      if (min == max) return min\n      var mid = (min + max) >> 1\n      var len = foldFunc(orig.slice(0, mid)).length\n      if (len == pos) return mid\n      else if (len > pos) max = mid\n      else min = mid + 1\n    }\n  }\n\n  function searchStringForward(doc, query, start, caseFold) {\n    // Empty string would match anything and never progress, so we\n    // define it to match nothing instead.\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) {\n      var orig = doc.getLine(line).slice(ch), string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.indexOf(lines[0])\n        if (found == -1) continue search\n        var start = adjustPos(orig, string, found, fold) + ch\n        return {from: Pos(line, adjustPos(orig, string, found, fold) + ch),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)}\n      } else {\n        var cutFrom = string.length - lines[0].length\n        if (string.slice(cutFrom) != lines[0]) continue search\n        for (var i = 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(line + i)) != lines[i]) continue search\n        var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1]\n        if (endString.slice(0, lastLine.length) != lastLine) continue search\n        return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch),\n                to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function searchStringBackward(doc, query, start, caseFold) {\n    if (!query.length) return null\n    var fold = caseFold ? doFold : noFold\n    var lines = fold(query).split(/\\r|\\n\\r?/)\n\n    search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) {\n      var orig = doc.getLine(line)\n      if (ch > -1) orig = orig.slice(0, ch)\n      var string = fold(orig)\n      if (lines.length == 1) {\n        var found = string.lastIndexOf(lines[0])\n        if (found == -1) continue search\n        return {from: Pos(line, adjustPos(orig, string, found, fold)),\n                to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))}\n      } else {\n        var lastLine = lines[lines.length - 1]\n        if (string.slice(0, lastLine.length) != lastLine) continue search\n        for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++)\n          if (fold(doc.getLine(start + i)) != lines[i]) continue search\n        var top = doc.getLine(line + 1 - lines.length), topString = fold(top)\n        if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search\n        return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)),\n                to: Pos(line, adjustPos(orig, string, lastLine.length, fold))}\n      }\n    }\n  }\n\n  function SearchCursor(doc, query, pos, options) {\n    this.atOccurrence = false\n    this.doc = doc\n    pos = pos ? doc.clipPos(pos) : Pos(0, 0)\n    this.pos = {from: pos, to: pos}\n\n    var caseFold\n    if (typeof options == \"object\") {\n      caseFold = options.caseFold\n    } else { // Backwards compat for when caseFold was the 4th argument\n      caseFold = options\n      options = null\n    }\n\n    if (typeof query == \"string\") {\n      if (caseFold == null) caseFold = false\n      this.matches = function(reverse, pos) {\n        return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold)\n      }\n    } else {\n      query = ensureFlags(query, \"gm\")\n      if (!options || options.multiline !== false)\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos)\n        }\n      else\n        this.matches = function(reverse, pos) {\n          return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos)\n        }\n    }\n  }\n\n  SearchCursor.prototype = {\n    findNext: function() {return this.find(false)},\n    findPrevious: function() {return this.find(true)},\n\n    find: function(reverse) {\n      var result = this.matches(reverse, this.doc.clipPos(reverse ? this.pos.from : this.pos.to))\n\n      // Implements weird auto-growing behavior on null-matches for\n      // backwards-compatibility with the vim code (unfortunately)\n      while (result && CodeMirror.cmpPos(result.from, result.to) == 0) {\n        if (reverse) {\n          if (result.from.ch) result.from = Pos(result.from.line, result.from.ch - 1)\n          else if (result.from.line == this.doc.firstLine()) result = null\n          else result = this.matches(reverse, this.doc.clipPos(Pos(result.from.line - 1)))\n        } else {\n          if (result.to.ch < this.doc.getLine(result.to.line).length) result.to = Pos(result.to.line, result.to.ch + 1)\n          else if (result.to.line == this.doc.lastLine()) result = null\n          else result = this.matches(reverse, Pos(result.to.line + 1, 0))\n        }\n      }\n\n      if (result) {\n        this.pos = result\n        this.atOccurrence = true\n        return this.pos.match || true\n      } else {\n        var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0)\n        this.pos = {from: end, to: end}\n        return this.atOccurrence = false\n      }\n    },\n\n    from: function() {if (this.atOccurrence) return this.pos.from},\n    to: function() {if (this.atOccurrence) return this.pos.to},\n\n    replace: function(newText, origin) {\n      if (!this.atOccurrence) return\n      var lines = CodeMirror.splitLines(newText)\n      this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin)\n      this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0))\n    }\n  }\n\n  CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this.doc, query, pos, caseFold)\n  })\n  CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this, query, pos, caseFold)\n  })\n\n  CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n    var ranges = []\n    var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold)\n    while (cur.findNext()) {\n      if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break\n      ranges.push({anchor: cur.from(), head: cur.to()})\n    }\n    if (ranges.length)\n      this.setSelections(ranges, 0)\n  })\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Define search commands. Depends on dialog.js or another\n// implementation of the openDialog method.\n\n// Replace works a little oddly -- it will do the replace on the next\n// Ctrl-G (or whatever is bound to findNext) press. You prevent a\n// replace by making sure the match is no longer selected when hitting\n// Ctrl-G.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function searchOverlay(query, caseInsensitive) {\n    if (typeof query == \"string\")\n      query = new RegExp(query.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\"), caseInsensitive ? \"gi\" : \"g\");\n    else if (!query.global)\n      query = new RegExp(query.source, query.ignoreCase ? \"gi\" : \"g\");\n\n    return {token: function(stream) {\n      query.lastIndex = stream.pos;\n      var match = query.exec(stream.string);\n      if (match && match.index == stream.pos) {\n        stream.pos += match[0].length || 1;\n        return \"searching\";\n      } else if (match) {\n        stream.pos = match.index;\n      } else {\n        stream.skipToEnd();\n      }\n    }};\n  }\n\n  function SearchState() {\n    this.posFrom = this.posTo = this.lastQuery = this.query = null;\n    this.overlay = null;\n  }\n\n  function getSearchState(cm) {\n    return cm.state.search || (cm.state.search = new SearchState());\n  }\n\n  function queryCaseInsensitive(query) {\n    return typeof query == \"string\" && query == query.toLowerCase();\n  }\n\n  function getSearchCursor(cm, query, pos) {\n    // Heuristic: if the query string is all lowercase, do a case insensitive search.\n    return cm.getSearchCursor(query, pos, {caseFold: queryCaseInsensitive(query), multiline: true});\n  }\n\n  function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {\n    cm.openDialog(text, onEnter, {\n      value: deflt,\n      selectValueOnOpen: true,\n      closeOnEnter: false,\n      onClose: function() { clearSearch(cm); },\n      onKeyDown: onKeyDown\n    });\n  }\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});\n    else f(prompt(shortText, deflt));\n  }\n\n  function confirmDialog(cm, text, shortText, fs) {\n    if (cm.openConfirm) cm.openConfirm(text, fs);\n    else if (confirm(shortText)) fs[0]();\n  }\n\n  function parseString(string) {\n    return string.replace(/\\\\([nrt\\\\])/g, function(match, ch) {\n      if (ch == \"n\") return \"\\n\"\n      if (ch == \"r\") return \"\\r\"\n      if (ch == \"t\") return \"\\t\"\n      if (ch == \"\\\\\") return \"\\\\\"\n      return match\n    })\n  }\n\n  function parseQuery(query) {\n    var isRE = query.match(/^\\/(.*)\\/([a-z]*)$/);\n    if (isRE) {\n      try { query = new RegExp(isRE[1], isRE[2].indexOf(\"i\") == -1 ? \"\" : \"i\"); }\n      catch(e) {} // Not a regular expression after all, do a string search\n    } else {\n      query = parseString(query)\n    }\n    if (typeof query == \"string\" ? query == \"\" : query.test(\"\"))\n      query = /x^/;\n    return query;\n  }\n\n  function startSearch(cm, state, query) {\n    state.queryText = query;\n    state.query = parseQuery(query);\n    cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));\n    state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));\n    cm.addOverlay(state.overlay);\n    if (cm.showMatchesOnScrollbar) {\n      if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n      state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));\n    }\n  }\n\n  function doSearch(cm, rev, persistent, immediate) {\n    var state = getSearchState(cm);\n    if (state.query) return findNext(cm, rev);\n    var q = cm.getSelection() || state.lastQuery;\n    if (q instanceof RegExp && q.source == \"x^\") q = null\n    if (persistent && cm.openDialog) {\n      var hiding = null\n      var searchNext = function(query, event) {\n        CodeMirror.e_stop(event);\n        if (!query) return;\n        if (query != state.queryText) {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n        }\n        if (hiding) hiding.style.opacity = 1\n        findNext(cm, event.shiftKey, function(_, to) {\n          var dialog\n          if (to.line < 3 && document.querySelector &&\n              (dialog = cm.display.wrapper.querySelector(\".CodeMirror-dialog\")) &&\n              dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, \"window\").top)\n            (hiding = dialog).style.opacity = .4\n        })\n      };\n      persistentDialog(cm, getQueryDialog(cm), q, searchNext, function(event, query) {\n        var keyName = CodeMirror.keyName(event)\n        var extra = cm.getOption('extraKeys'), cmd = (extra && extra[keyName]) || CodeMirror.keyMap[cm.getOption(\"keyMap\")][keyName]\n        if (cmd == \"findNext\" || cmd == \"findPrev\" ||\n          cmd == \"findPersistentNext\" || cmd == \"findPersistentPrev\") {\n          CodeMirror.e_stop(event);\n          startSearch(cm, getSearchState(cm), query);\n          cm.execCommand(cmd);\n        } else if (cmd == \"find\" || cmd == \"findPersistent\") {\n          CodeMirror.e_stop(event);\n          searchNext(query, event);\n        }\n      });\n      if (immediate && q) {\n        startSearch(cm, state, q);\n        findNext(cm, rev);\n      }\n    } else {\n      dialog(cm, getQueryDialog(cm), \"Search for:\", q, function(query) {\n        if (query && !state.query) cm.operation(function() {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n          findNext(cm, rev);\n        });\n      });\n    }\n  }\n\n  function findNext(cm, rev, callback) {cm.operation(function() {\n    var state = getSearchState(cm);\n    var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);\n    if (!cursor.find(rev)) {\n      cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));\n      if (!cursor.find(rev)) return;\n    }\n    cm.setSelection(cursor.from(), cursor.to());\n    cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);\n    state.posFrom = cursor.from(); state.posTo = cursor.to();\n    if (callback) callback(cursor.from(), cursor.to())\n  });}\n\n  function clearSearch(cm) {cm.operation(function() {\n    var state = getSearchState(cm);\n    state.lastQuery = state.query;\n    if (!state.query) return;\n    state.query = state.queryText = null;\n    cm.removeOverlay(state.overlay);\n    if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n  });}\n\n\n  function getQueryDialog(cm)  {\n    return '<span class=\"CodeMirror-search-label\">' + cm.phrase(\"Search:\") + '</span> <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">' + cm.phrase(\"(Use /re/ syntax for regexp search)\") + '</span>';\n  }\n  function getReplaceQueryDialog(cm) {\n    return ' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">' + cm.phrase(\"(Use /re/ syntax for regexp search)\") + '</span>';\n  }\n  function getReplacementQueryDialog(cm) {\n    return '<span class=\"CodeMirror-search-label\">' + cm.phrase(\"With:\") + '</span> <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/>';\n  }\n  function getDoReplaceConfirm(cm) {\n    return '<span class=\"CodeMirror-search-label\">' + cm.phrase(\"Replace?\") + '</span> <button>' + cm.phrase(\"Yes\") + '</button> <button>' + cm.phrase(\"No\") + '</button> <button>' + cm.phrase(\"All\") + '</button> <button>' + cm.phrase(\"Stop\") + '</button> ';\n  }\n\n  function replaceAll(cm, query, text) {\n    cm.operation(function() {\n      for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {\n        if (typeof query != \"string\") {\n          var match = cm.getRange(cursor.from(), cursor.to()).match(query);\n          cursor.replace(text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n        } else cursor.replace(text);\n      }\n    });\n  }\n\n  function replace(cm, all) {\n    if (cm.getOption(\"readOnly\")) return;\n    var query = cm.getSelection() || getSearchState(cm).lastQuery;\n    var dialogText = '<span class=\"CodeMirror-search-label\">' + (all ? cm.phrase(\"Replace all:\") : cm.phrase(\"Replace:\")) + '</span>';\n    dialog(cm, dialogText + getReplaceQueryDialog(cm), dialogText, query, function(query) {\n      if (!query) return;\n      query = parseQuery(query);\n      dialog(cm, getReplacementQueryDialog(cm), cm.phrase(\"Replace with:\"), \"\", function(text) {\n        text = parseString(text)\n        if (all) {\n          replaceAll(cm, query, text)\n        } else {\n          clearSearch(cm);\n          var cursor = getSearchCursor(cm, query, cm.getCursor(\"from\"));\n          var advance = function() {\n            var start = cursor.from(), match;\n            if (!(match = cursor.findNext())) {\n              cursor = getSearchCursor(cm, query);\n              if (!(match = cursor.findNext()) ||\n                  (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;\n            }\n            cm.setSelection(cursor.from(), cursor.to());\n            cm.scrollIntoView({from: cursor.from(), to: cursor.to()});\n            confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase(\"Replace?\"),\n                          [function() {doReplace(match);}, advance,\n                           function() {replaceAll(cm, query, text)}]);\n          };\n          var doReplace = function(match) {\n            cursor.replace(typeof query == \"string\" ? text :\n                           text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n            advance();\n          };\n          advance();\n        }\n      });\n    });\n  }\n\n  CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};\n  CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);};\n  CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);};\n  CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);};\n  CodeMirror.commands.findNext = doSearch;\n  CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};\n  CodeMirror.commands.clearSearch = clearSearch;\n  CodeMirror.commands.replace = replace;\n  CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var WRAP_CLASS = \"CodeMirror-activeline\";\n  var BACK_CLASS = \"CodeMirror-activeline-background\";\n  var GUTT_CLASS = \"CodeMirror-activeline-gutter\";\n\n  CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n    var prev = old == CodeMirror.Init ? false : old;\n    if (val == prev) return\n    if (prev) {\n      cm.off(\"beforeSelectionChange\", selectionChange);\n      clearActiveLines(cm);\n      delete cm.state.activeLines;\n    }\n    if (val) {\n      cm.state.activeLines = [];\n      updateActiveLines(cm, cm.listSelections());\n      cm.on(\"beforeSelectionChange\", selectionChange);\n    }\n  });\n\n  function clearActiveLines(cm) {\n    for (var i = 0; i < cm.state.activeLines.length; i++) {\n      cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n      cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n      cm.removeLineClass(cm.state.activeLines[i], \"gutter\", GUTT_CLASS);\n    }\n  }\n\n  function sameArray(a, b) {\n    if (a.length != b.length) return false;\n    for (var i = 0; i < a.length; i++)\n      if (a[i] != b[i]) return false;\n    return true;\n  }\n\n  function updateActiveLines(cm, ranges) {\n    var active = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      var option = cm.getOption(\"styleActiveLine\");\n      if (typeof option == \"object\" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())\n        continue\n      var line = cm.getLineHandleVisualStart(range.head.line);\n      if (active[active.length - 1] != line) active.push(line);\n    }\n    if (sameArray(cm.state.activeLines, active)) return;\n    cm.operation(function() {\n      clearActiveLines(cm);\n      for (var i = 0; i < active.length; i++) {\n        cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n        cm.addLineClass(active[i], \"background\", BACK_CLASS);\n        cm.addLineClass(active[i], \"gutter\", GUTT_CLASS);\n      }\n      cm.state.activeLines = active;\n    });\n  }\n\n  function selectionChange(cm, sel) {\n    updateActiveLines(cm, sel.ranges);\n  }\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.defineExtension(\"annotateScrollbar\", function(options) {\n    if (typeof options == \"string\") options = {className: options};\n    return new Annotation(this, options);\n  });\n\n  CodeMirror.defineOption(\"scrollButtonHeight\", 0);\n\n  function Annotation(cm, options) {\n    this.cm = cm;\n    this.options = options;\n    this.buttonHeight = options.scrollButtonHeight || cm.getOption(\"scrollButtonHeight\");\n    this.annotations = [];\n    this.doRedraw = this.doUpdate = null;\n    this.div = cm.getWrapperElement().appendChild(document.createElement(\"div\"));\n    this.div.style.cssText = \"position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none\";\n    this.computeScale();\n\n    function scheduleRedraw(delay) {\n      clearTimeout(self.doRedraw);\n      self.doRedraw = setTimeout(function() { self.redraw(); }, delay);\n    }\n\n    var self = this;\n    cm.on(\"refresh\", this.resizeHandler = function() {\n      clearTimeout(self.doUpdate);\n      self.doUpdate = setTimeout(function() {\n        if (self.computeScale()) scheduleRedraw(20);\n      }, 100);\n    });\n    cm.on(\"markerAdded\", this.resizeHandler);\n    cm.on(\"markerCleared\", this.resizeHandler);\n    if (options.listenForChanges !== false)\n      cm.on(\"changes\", this.changeHandler = function() {\n        scheduleRedraw(250);\n      });\n  }\n\n  Annotation.prototype.computeScale = function() {\n    var cm = this.cm;\n    var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /\n      cm.getScrollerElement().scrollHeight\n    if (hScale != this.hScale) {\n      this.hScale = hScale;\n      return true;\n    }\n  };\n\n  Annotation.prototype.update = function(annotations) {\n    this.annotations = annotations;\n    this.redraw();\n  };\n\n  Annotation.prototype.redraw = function(compute) {\n    if (compute !== false) this.computeScale();\n    var cm = this.cm, hScale = this.hScale;\n\n    var frag = document.createDocumentFragment(), anns = this.annotations;\n\n    var wrapping = cm.getOption(\"lineWrapping\");\n    var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;\n    var curLine = null, curLineObj = null;\n\n    function getY(pos, top) {\n      if (curLine != pos.line) {\n        curLine = pos.line\n        curLineObj = cm.getLineHandle(pos.line)\n        var visual = cm.getLineHandleVisualStart(curLineObj)\n        if (visual != curLineObj) {\n          curLine = cm.getLineNumber(visual)\n          curLineObj = visual\n        }\n      }\n      if ((curLineObj.widgets && curLineObj.widgets.length) ||\n          (wrapping && curLineObj.height > singleLineH))\n        return cm.charCoords(pos, \"local\")[top ? \"top\" : \"bottom\"];\n      var topY = cm.heightAtLine(curLineObj, \"local\");\n      return topY + (top ? 0 : curLineObj.height);\n    }\n\n    var lastLine = cm.lastLine()\n    if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) {\n      var ann = anns[i];\n      if (ann.to.line > lastLine) continue;\n      var top = nextTop || getY(ann.from, true) * hScale;\n      var bottom = getY(ann.to, false) * hScale;\n      while (i < anns.length - 1) {\n        if (anns[i + 1].to.line > lastLine) break;\n        nextTop = getY(anns[i + 1].from, true) * hScale;\n        if (nextTop > bottom + .9) break;\n        ann = anns[++i];\n        bottom = getY(ann.to, false) * hScale;\n      }\n      if (bottom == top) continue;\n      var height = Math.max(bottom - top, 3);\n\n      var elt = frag.appendChild(document.createElement(\"div\"));\n      elt.style.cssText = \"position: absolute; right: 0px; width: \" + Math.max(cm.display.barWidth - 1, 2) + \"px; top: \"\n        + (top + this.buttonHeight) + \"px; height: \" + height + \"px\";\n      elt.className = this.options.className;\n      if (ann.id) {\n        elt.setAttribute(\"annotation-id\", ann.id);\n      }\n    }\n    this.div.textContent = \"\";\n    this.div.appendChild(frag);\n  };\n\n  Annotation.prototype.clear = function() {\n    this.cm.off(\"refresh\", this.resizeHandler);\n    this.cm.off(\"markerAdded\", this.resizeHandler);\n    this.cm.off(\"markerCleared\", this.resizeHandler);\n    if (this.changeHandler) this.cm.off(\"changes\", this.changeHandler);\n    this.div.parentNode.removeChild(this.div);\n  };\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function Bar(cls, orientation, scroll) {\n    this.orientation = orientation;\n    this.scroll = scroll;\n    this.screen = this.total = this.size = 1;\n    this.pos = 0;\n\n    this.node = document.createElement(\"div\");\n    this.node.className = cls + \"-\" + orientation;\n    this.inner = this.node.appendChild(document.createElement(\"div\"));\n\n    var self = this;\n    CodeMirror.on(this.inner, \"mousedown\", function(e) {\n      if (e.which != 1) return;\n      CodeMirror.e_preventDefault(e);\n      var axis = self.orientation == \"horizontal\" ? \"pageX\" : \"pageY\";\n      var start = e[axis], startpos = self.pos;\n      function done() {\n        CodeMirror.off(document, \"mousemove\", move);\n        CodeMirror.off(document, \"mouseup\", done);\n      }\n      function move(e) {\n        if (e.which != 1) return done();\n        self.moveTo(startpos + (e[axis] - start) * (self.total / self.size));\n      }\n      CodeMirror.on(document, \"mousemove\", move);\n      CodeMirror.on(document, \"mouseup\", done);\n    });\n\n    CodeMirror.on(this.node, \"click\", function(e) {\n      CodeMirror.e_preventDefault(e);\n      var innerBox = self.inner.getBoundingClientRect(), where;\n      if (self.orientation == \"horizontal\")\n        where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0;\n      else\n        where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0;\n      self.moveTo(self.pos + where * self.screen);\n    });\n\n    function onWheel(e) {\n      var moved = CodeMirror.wheelEventPixels(e)[self.orientation == \"horizontal\" ? \"x\" : \"y\"];\n      var oldPos = self.pos;\n      self.moveTo(self.pos + moved);\n      if (self.pos != oldPos) CodeMirror.e_preventDefault(e);\n    }\n    CodeMirror.on(this.node, \"mousewheel\", onWheel);\n    CodeMirror.on(this.node, \"DOMMouseScroll\", onWheel);\n  }\n\n  Bar.prototype.setPos = function(pos, force) {\n    if (pos < 0) pos = 0;\n    if (pos > this.total - this.screen) pos = this.total - this.screen;\n    if (!force && pos == this.pos) return false;\n    this.pos = pos;\n    this.inner.style[this.orientation == \"horizontal\" ? \"left\" : \"top\"] =\n      (pos * (this.size / this.total)) + \"px\";\n    return true\n  };\n\n  Bar.prototype.moveTo = function(pos) {\n    if (this.setPos(pos)) this.scroll(pos, this.orientation);\n  }\n\n  var minButtonSize = 10;\n\n  Bar.prototype.update = function(scrollSize, clientSize, barSize) {\n    var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize\n    if (sizeChanged) {\n      this.screen = clientSize;\n      this.total = scrollSize;\n      this.size = barSize;\n    }\n\n    var buttonSize = this.screen * (this.size / this.total);\n    if (buttonSize < minButtonSize) {\n      this.size -= minButtonSize - buttonSize;\n      buttonSize = minButtonSize;\n    }\n    this.inner.style[this.orientation == \"horizontal\" ? \"width\" : \"height\"] =\n      buttonSize + \"px\";\n    this.setPos(this.pos, sizeChanged);\n  };\n\n  function SimpleScrollbars(cls, place, scroll) {\n    this.addClass = cls;\n    this.horiz = new Bar(cls, \"horizontal\", scroll);\n    place(this.horiz.node);\n    this.vert = new Bar(cls, \"vertical\", scroll);\n    place(this.vert.node);\n    this.width = null;\n  }\n\n  SimpleScrollbars.prototype.update = function(measure) {\n    if (this.width == null) {\n      var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle;\n      if (style) this.width = parseInt(style.height);\n    }\n    var width = this.width || 0;\n\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    this.vert.node.style.display = needsV ? \"block\" : \"none\";\n    this.horiz.node.style.display = needsH ? \"block\" : \"none\";\n\n    if (needsV) {\n      this.vert.update(measure.scrollHeight, measure.clientHeight,\n                       measure.viewHeight - (needsH ? width : 0));\n      this.vert.node.style.bottom = needsH ? width + \"px\" : \"0\";\n    }\n    if (needsH) {\n      this.horiz.update(measure.scrollWidth, measure.clientWidth,\n                        measure.viewWidth - (needsV ? width : 0) - measure.barLeft);\n      this.horiz.node.style.right = needsV ? width + \"px\" : \"0\";\n      this.horiz.node.style.left = measure.barLeft + \"px\";\n    }\n\n    return {right: needsV ? width : 0, bottom: needsH ? width : 0};\n  };\n\n  SimpleScrollbars.prototype.setScrollTop = function(pos) {\n    this.vert.setPos(pos);\n  };\n\n  SimpleScrollbars.prototype.setScrollLeft = function(pos) {\n    this.horiz.setPos(pos);\n  };\n\n  SimpleScrollbars.prototype.clear = function() {\n    var parent = this.horiz.node.parentNode;\n    parent.removeChild(this.horiz.node);\n    parent.removeChild(this.vert.node);\n  };\n\n  CodeMirror.scrollbarModel.simple = function(place, scroll) {\n    return new SimpleScrollbars(\"CodeMirror-simplescroll\", place, scroll);\n  };\n  CodeMirror.scrollbarModel.overlay = function(place, scroll) {\n    return new SimpleScrollbars(\"CodeMirror-overlayscroll\", place, scroll);\n  };\n});\n","/* global CodeMirror */\n/* global define */\n\n(function(mod) {\n    'use strict';\n    \n    if (typeof exports === 'object' && typeof module === 'object') // CommonJS\n        mod(require('../../lib/codemirror'));\n    else if (typeof define === 'function' && define.amd) // AMD\n        define(['../../lib/codemirror'], mod);\n    else\n        mod(CodeMirror);\n})(function(CodeMirror) {\n    'use strict';\n    \n    CodeMirror.defineOption('showInvisibles', false, function(cm, val, prev) {\n        var Count   = 0,\n            Maximum = cm.getOption('maxInvisibles') || 16;\n        \n        if (prev === CodeMirror.Init)\n            prev = false;\n        \n        if (prev && !val) {\n            cm.removeOverlay('invisibles');\n            rm();\n        } else if (!prev && val) {\n            add(Maximum);\n            \n            cm.addOverlay({\n                name: 'invisibles',\n                token:  function nextToken(stream) {\n                    var ret,\n                        spaces  = 0,\n                        peek    = stream.peek() === ' ';\n                    \n                    if (peek) {\n                        while (peek && spaces < Maximum) {\n                            ++spaces;\n                            \n                            stream.next();\n                            peek = stream.peek() === ' ';\n                        }\n                        \n                        ret = 'whitespace whitespace-' + spaces;\n                        \n                        /*\n                         * styles should be different\n                         * could not be two same styles\n                         * beside because of this check in runmode\n                         * function in `codemirror.js`:\n                         *\n                         * 6624: if (!flattenSpans || curStyle != style) {}\n                         */\n                        if (spaces === Maximum)\n                            ret += ' whitespace-rand-' + Count++;\n                        \n                    } else {\n                        while (!stream.eol() && !peek) {\n                            stream.next();\n                            \n                            peek = stream.peek() === ' ';\n                        }\n                        \n                        ret = 'cm-eol';\n                    }\n                    \n                    return ret;\n                }\n            });\n        }\n    });\n    \n    function add(max) {\n        var i, rule,\n            classBase   = '.CodeMirror .cm-whitespace-',\n            spaceChars  = '',\n            rules       = '',\n            spaceChar   = '·',\n            style       = document.createElement('style');\n        \n        style.setAttribute('data-name', 'js-show-invisibles');\n        \n        for (i = 1; i <= max; ++i) {\n            spaceChars += spaceChar;\n            \n            rule    = classBase + i + '::before { content: \"' + spaceChars + '\";}\\n';\n            rules   += rule;\n        }\n        \n        style.textContent = getStyle() + '\\n' + getEOL() + '\\n' + rules;\n        \n        document.head.appendChild(style);\n    }\n    \n    function rm() {\n        var style = document.querySelector('[data-name=\"js-show-invisibles\"]');\n        \n        document.head.removeChild(style);\n    }\n    \n    function getStyle() {\n        var style = [\n            '.cm-whitespace::before {',\n                'position: absolute;',\n                'pointer-events: none;',\n                'color: #404F7D;',\n            '}'\n        ].join('');\n        \n        return style;\n    }\n    \n    function getEOL() {\n         var style = [\n            '.CodeMirror-code > div > pre > span::after {',\n                'pointer-events: none;',\n                'color: #404F7D;',\n                'content: \"¬\"',\n            '}',\n             \n        ].join('');\n        \n        return style;\n    }\n});\n","/**\n * CodeMirror plugin for DokuWiki\n *\n * @author Albert Gasset <albertgasset@fsfe.org>\n * @license GNU GPL version 2 or later\n */\n\n/* global CodeMirror */\n\nCodeMirror.defineMode('doku', function(config, parserConfig) {\n    'use strict';\n\n    var dokuModes;\n    var mode = {\n\n        blankLine: function(state) {\n            if (state.current.patterns) {\n                // Search for exit patterns of empty strings and start of line\n                for (var i = 0; i < state.current.patterns.length; i += 1) {\n                    var p = state.current.patterns[i];\n                    if (p.sol && !p.match && p.exit) {\n                        state.exit = true;\n                        return;\n                    }\n                }\n            }\n            if (state.innerMode && state.innerMode.blankLine) {\n                return state.innerMode.blankLine(state.innerState);\n            }\n        },\n\n        copyState: function(state) {\n            return {\n                current: state.current,\n                exit: state.exit,\n                codeFilename: state.codeFilename,\n                codeLang: state.codeLang,\n                innerMode: state.innerMode,\n                innerState: state.innerState ?\n                    CodeMirror.copyState(state.innerMode, state.innerState) :\n                    null,\n                linkParam: state.linkParam,\n                linkTitle: state.linkTitle,\n                stack: state.stack.slice(0),\n            };\n        },\n\n        indent: function(state, textAfter) {\n            if (state.innerMode && state.innerMode.indent) {\n                return state.innerMode.indent(state.innerState, textAfter);\n            }\n        },\n\n        innerMode: function(state) {\n            return {\n                mode: state.innerMode || mode,\n                state: state.innerMode ? state.innerState : state,\n            };\n        },\n\n        startState: function() {\n            return {\n                codeFilename: false,\n                codeLang: null,\n                current: dokuModes[0],\n                exit: false,\n                innerMode: null,\n                innerState: null,\n                linkParam: null,\n                linkTitle: false,\n                stack: [],\n            };\n        },\n\n        token: function (stream, state) {\n            var style;\n\n            if (state.exit) {\n                // Previous match was an exit pattern\n                exitInnerMode(state);\n                state.current = state.stack.pop();\n                state.exit = false;\n            }\n\n            style = dokuToken(stream, state);\n\n            if (!stream.current() && !state.exit) {\n                // No pattern matched\n                if (state.innerMode) {\n                    style = state.innerMode.token(stream, state.innerState);\n                } else {\n                    stream.next();\n                }\n            }\n\n            return style;\n        },\n    };\n\n    dokuModes = [{\n        name: 'base', // 0\n        allowedTypes: ['container', 'baseonly', 'formatting',\n                       'substition', 'protected', 'disabled'],\n    }, {\n        name: 'listblock', // 10\n        type: 'container',\n        allowedTypes: ['formatting', 'substition', 'disabled', 'protected'],\n        entries: [\n            {sol: true, match: /^ {2,}[\\-\\*]/, style: 'def'},\n            {sol: true, match: /^\\t{1,}[\\-\\*]/, style: 'def'},\n        ],\n        patterns: [\n            {sol: true, match: /^ {2,}[\\-\\*]/, style: 'def'},\n            {sol: true, match: /^\\t{1,}[\\-\\*]/, style: 'def'},\n            {sol: true, exit: true},\n        ],\n    }, {\n        name: 'preformatted', // 20\n        type: 'protected',\n        entries: [\n            {sol: true, match: /^  (?![\\*\\-])/},\n            {sol: true, match: /^\\t(?![\\*\\-])/},\n        ],\n        patterns: [\n            {sol: true, match: '  '},\n            {sol: true, match: '\\t'},\n            {sol: true, exit: true},\n        ],\n        style: 'string',\n    }, {\n        name: 'notoc', // 30\n        type: 'substition',\n        entries: [{match: '~~NOTOC~~', exit: true}],\n        style: 'meta',\n    }, {\n        name: 'nocache', // 40\n        type: 'substition',\n        entries: [{match: '~~NOCACHE~~', exit: true}],\n        style: 'meta',\n    }, {\n        name: 'header', // 50\n        type: 'baseonly',\n        entries: [{match: /^[ \\t]*={2}.+={2,}[ \\t]*$/, exit: true}],\n        style: 'header',\n    }, {\n        name: 'table', // 60\n        type: 'container',\n        allowedTypes: ['formatting', 'substition', 'disabled', 'protected'],\n        entries: [\n            {sol: true, match: '^', style: 'def'},\n            {sol: true, match: '|', style: 'def'},\n        ],\n        patterns: [\n            {match: '^', style: 'def'},\n            {match: '|', style: 'def'},\n            {match: /^[\\t ]*:::[\\t ]*(?=[\\|\\^])/, style: 'def'},\n            {match: /^[\\t ]+/},\n            {sol: true, exit: true},\n        ],\n    }, {\n        name: 'strong', // 70\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: '**'}],\n        patterns: [{match: '**', exit: true}],\n        style: 'strong',\n    }, {\n        name: 'emphasis', // 80\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: /^\\/\\/(?=[^\\x00]*[^:])/}],\n        patterns: [{match: '//', exit: true}],\n        style: 'em',\n    }, {\n        name: 'underline', // 90\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: '__'}],\n        patterns: [{match: '__', exit: true}],\n        style: 'underline',\n    }, {\n        name: 'monospace', // 100\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: '\\'\\''}],\n        patterns: [{match: '\\'\\'', exit: true}],\n        style: 'quote',\n    }, {\n        name: 'subscript', // 110\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: '<sub>', style: 'tag'}],\n        patterns: [{match: '</sub>', exit: true, style: 'tag'}],\n    }, {\n        name: 'superscript', // 120\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: '<sup>', style: 'tag'}],\n        patterns: [{match: '</sup>',  exit: true, style: 'tag'}],\n    }, {\n        name: 'deleted', // 130\n        type: 'formatting',\n        allowedTypes: ['formatting', 'substition', 'disabled'],\n        entries: [{match: '<del>', style: 'tag'}],\n        patterns: [{match: '</del>', exit: true, style: 'tag'}],\n    }, {\n        name: 'linebreak', // 140\n        type: 'substition',\n        entries: [{match: /^\\\\\\\\(?:[ \\t]|$)/, exit: true}],\n        style: 'tag',\n    }, {\n        name: 'footnote', // 150\n        type: 'formatting',\n        allowedTypes: ['container', 'formatting', 'substition',\n                       'protected', 'disabled'],\n        entries: [{match: '((', style: 'tag'}],\n        patterns: [{match: '))', exit: true, style: 'tag'}],\n    }, {\n        name: 'hr', // 160\n        type: 'container',\n        entries: [{sol: true, match: /^[ \\t]*-{4,}[ \\t]*$/, exit: true}],\n        style: 'hr',\n    }, {\n        name: 'unformatted', // 170\n        type: 'disabled',\n        entries: [{match: '<nowiki>', style: 'tag'}],\n        patterns: [{match: '</nowiki>', exit: true, style: 'tag'}],\n    }, {\n        name: 'unformattedalt', // 170\n        type: 'disabled',\n        entries: [{match: '%%'}],\n        patterns: [{match: '%%', exit: true}],\n        style: 'string',\n    }, {\n        name: 'php', // 180\n        type: 'protected',\n        entries: [{match: '<php>', style: 'tag', lang: 'php'}],\n        patterns: [{match: '</php>', exit: true, style: 'tag'}],\n    }, {\n        name: 'phpblock', // 180\n        type: 'protected',\n        entries: [{match: '<PHP>', style: 'tag', lang: 'php'}],\n        patterns: [{match: '</PHP>', exit: true, style: 'tag'}],\n    }, {\n        name: 'html', // 190\n        type: 'protected',\n        entries: [{match: '<html>', style: 'tag', lang: 'html'}],\n        patterns: [{match: '</html>', exit: true, style: 'tag'}],\n    }, {\n        name: 'htmlblock', // 190\n        type: 'protected',\n        entries: [{match: '<HTML>', style: 'tag', lang: 'html'}],\n        patterns: [{match: '</HTML>', exit: true, style: 'tag'}],\n    }, {\n        name: 'code', // 200\n        type: 'protected',\n        entries: [{match: /^<code(?=\\s|>|$)/, style: 'tag'}],\n        patterns: [{match: '</code>', exit: true, style: 'tag'}],\n        token: codeToken,\n    }, {\n        name: 'file', // 210\n        type: 'protected',\n        entries: [{match: /^<file(?=\\s|>|$)/, style: 'tag'}],\n        patterns: [{match: '</file>', exit: true, style: 'tag'}],\n        token: codeToken,\n    }, {\n        name: 'quote', // 220,\n        type: 'container',\n        allowedTypess: ['formatting', 'substition', 'disabled', 'protected'],\n        entries: [{sol: true, match: /^>{1,}/, style: 'def'}],\n        patterns: [\n            {sol: true, match: /^>{1,}/, style: 'def'},\n            {sol: true, exit: true},\n        ],\n    }];\n\n    if (parserConfig.smileys.length > 0) {\n        dokuModes.push({\n            name: 'smiley', // 230\n            type: 'substition',\n            entries: [{\n                behind: /\\B$/,\n                match: wordsRegExp(parserConfig.smileys, '(?=\\\\W|$)'),\n                exit: true,\n            }],\n            style: 'keyword',\n        });\n    }\n    if (parserConfig.acronyms.length > 0) {\n        dokuModes.push({\n            name: 'acronym', // 240\n            type: 'substition',\n            entries: [{\n                behind: /\\B$/,\n                match: wordsRegExp(parserConfig.acronyms, '(?=\\\\W|$)'),\n                exit: true,\n            }],\n            style: 'keyword',\n        });\n    }\n\n    if (parserConfig.entities.length > 0) {\n        dokuModes.push({\n            name: 'entity', // 260\n            type: 'substition',\n            entries: [{match: wordsRegExp(parserConfig.entities), exit: true}],\n            style: 'keyword',\n        });\n    }\n\n    dokuModes.push({\n        name: 'multipluentity', // 270\n        type: 'substition',\n        sort: 270,\n        entries: [{behind: /\\B$/, match: /^(?:[1-9]|\\d{2,})(?=[xX]\\d+\\b)/}],\n        patterns: [\n            {match: /^[xX]/, style: 'keyword'},\n            {match: /^\\d+\\b/, exit: true},\n        ],\n    });\n\n    if (parserConfig.camelcase) {\n        dokuModes.push({\n            name: 'camelcaselink', // 290\n            type: 'substition',\n            emtry: [{\n                behind: /\\B$/,\n                match: /^[A-Z]+[a-z]+[A-Z][A-Za-z]*\\b/,\n                exit: true,\n            }],\n            style: 'link',\n        });\n    }\n\n    dokuModes.push({\n        name: 'internallink', // 300\n        type: 'substition',\n        entries: [{match: '[['}],\n        token: function(stream, state) {\n            var style;\n            if (stream.match(']]')) {\n                state.current = state.stack.pop();\n                state.linkTitle = false;\n            } else if (!state.linkTitle && stream.match('|')) {\n                state.linkTitle = true;\n            } else {\n                stream.next();\n                style = state.linkTitle ? 'string' : 'link';\n            }\n            return tokenStyles(state, style);\n        },\n    }, {\n        name: 'rss', // 310\n        type: 'substition',\n        entries: [{match: '{{rss>', style: 'tag'}],\n        patterns: [{match: '}}', exit: true, style: 'tag'}],\n    }, {\n        name: 'media', // 320\n        type: 'substition',\n        entries: [{match: /^\\{\\{ */}],\n        token: function(stream, state) {\n            var style;\n            if (stream.match(/^ *\\}\\}/)) {\n                state.current = state.stack.pop();\n                state.linkParam = false;\n                state.linkTitle = false;\n            } else if (state.linkTitle) {\n                style = 'string';\n                stream.next();\n            } else if (stream.match(/^\\s*\\|/)) {\n                state.linkTitle = true;\n            } else if (state.linkParam) {\n                if (stream.match(/^(?:nolink|direct|linkonly)/)) {\n                    style = 'keyword';\n                } else if (stream.match(/^(?:nocache|recache)/)) {\n                    style = 'meta';\n                } else if (stream.match(/^\\d+(?:[xX]\\d+)?/)) {\n                    style = 'number';\n                } else if (!stream.match(/^\\s+/)) {\n                    stream.next();\n                    style = 'error';\n                }\n            } else if (stream.match(/^\\?(?=[^\\?]*$)/)) {\n                state.linkParam = true;\n            } else {\n                stream.next();\n                style = 'link';\n            }\n            return tokenStyles(state, style);\n        },\n    }, {\n        name: 'externallink', // 330\n        type: 'substition',\n        entries: [{\n            behind: /\\B$/,\n            match: externalLinkRegExp(parserConfig.schemes),\n            exit: true,\n        }],\n        style: 'link',\n    }, {\n        name: 'emaillink', // 340\n        type: 'substition',\n        entries: [{match: emailLinkRegExp(), exit: true}],\n        style: 'link',\n    }, {\n        name: 'windowssharelink', // 350\n        type: 'substition',\n        entries: [{match: /^\\\\\\\\\\w+?(?:\\\\[\\w-$]+)+/, exit: true}],\n        style: 'link',\n    }, {\n        name: 'filelink', // 360\n        type: 'substition',\n        entries: [{behind: /\\B$/, match: fileLinkRegExp(), exit: true}],\n        style: 'link',\n    });\n\n    connectDokuModes();\n\n    return mode;\n\n\n    function escapeRegExp(string) {\n        return string.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n    }\n\n    function wordsRegExp(words, end, flags) {\n        var escapedWords = [];\n        for (var i = 0; i < words.length; i += 1) {\n            escapedWords.push(escapeRegExp(words[i]));\n        }\n        end = end || '';\n        flags = flags || '';\n        return new RegExp('^(?:' + escapedWords.join('|') + ')' + end, flags);\n    }\n\n    function emailLinkRegExp() {\n        var text = '[0-9a-zA-Z!#$%&\\'*+/=?^_`{|}~-]+';\n        var email = (text + '(?:\\\\.' + text + ')*@' +\n                     '(?:[0-9a-z][0-9a-z-]*\\\\.)+(?:[a-z]{2,4}|museum|travel)');\n        return new RegExp('^<' + email + '>', 'i');\n    }\n\n    function externalLinkRegExp(schemes) {\n        var punc = '.:?\\\\-;,';\n        var host = '\\\\w' + punc;\n        var any = '\\\\w/\\\\#~:.?+=&%@!\\\\-\\\\[\\\\]' + punc;\n        var patterns = [];\n        for (var i = 0; i < schemes.length; i += 1) {\n            patterns.push(schemes[i] + '://[' + any + ']+?(?=[' +\n                          punc + ']*[^' + any + ']|$)');\n        }\n        patterns.push('www?\\\\.[' + host + ']+?\\\\.[' + host + ']+?[' +\n                      any + ']+?(?=[' + punc + ']*[^' + any + ']|$)');\n        patterns.push('ftp?\\\\.[' + host + ']+?\\\\.[' + host + ']+?[' +\n                      any + ']+?(?=[' + punc + ']*[^' + any + ']|$)');\n        return new RegExp('^(?:' + patterns.join('|') + ')', 'i');\n    }\n\n    function fileLinkRegExp() {\n        var punc = '.:?\\\\-;,';\n        var any = '\\\\w/\\\\#~:.?+=&%@!\\\\-\\\\[\\\\]' + punc;\n        return new RegExp('^file://[' + any + ']+?(?=[' + punc + ']*[^' +\n                          any + ']|$)', 'i');\n    }\n\n    function enterInnerMode(state, lang) {\n        state.innerMode = parserConfig.loadMode(lang);\n        if (state.innerMode.startState) {\n            state.innerState = state.innerMode.startState();\n        }\n        state.blockCommentStart = state.innerMode.blockCommentStart;\n        state.blockCommentEnd = state.innerMode.blockCommentEnd;\n        state.lineComment = state.innerMode.lineComment;\n        state.electricChars = state.innerMode.electricChars;\n        state.electricInput = state.innerMode.electricInput;\n    }\n\n    function exitInnerMode(state) {\n        state.innerMode = null;\n        state.innerState = null;\n        state.blockCommentStart = null;\n        state.blockCommentEnd = null;\n        state.lineComment = null;\n        state.electricChars = null;\n        state.electricInput = null;\n    }\n\n    function matchPatterns(stream, state, patterns) {\n        if (!patterns) {\n            return null;\n        }\n\n        var behind = stream.string.slice(stream.lineStart, stream.pos);\n\n        for (var i = 0; i < patterns.length; i += 1) {\n            var p = patterns[i];\n            if (p.sol && !stream.sol()) {\n                continue;\n            }\n            if (p.behind && !p.behind.test(behind)) {\n                continue;\n            }\n            if (p.match && !stream.match(p.match)) {\n                continue;\n            }\n            return patterns[i];\n        }\n\n        return null;\n    }\n\n    function codeToken(stream, state) {\n        // Token function that parses code/file parameters\n\n        if (state.innerMode) {\n            return;\n        }\n\n        if (stream.match('>')) {\n            enterInnerMode(state, state.codeLang);\n            state.codeLang = null;\n            state.codeFilename = false;\n            return tokenStyles(state, 'tag');\n        }\n\n        if (stream.match(/^\\s+/)) {\n            return tokenStyles(state);\n        }\n\n        if (stream.match(/^[^\\s>]+/)) {\n            var style;\n            if (!state.codeLang) {\n                state.codeLang  = stream.current();\n                if (parserConfig.validLang(state.codeLang)) {\n                    style = 'keyword';\n                } else {\n                    style = 'error';\n                }\n            } else if (!state.codeFilename) {\n                state.codeFilename = true;\n                style = 'string';\n            } else {\n                style = 'error';\n            }\n            return tokenStyles(state, style);\n        }\n    }\n\n    function dokuToken(stream, state) {\n        var allowed = state.current.allowedModes;\n        var pattern, style;\n\n        // Match patterns\n        for (var i = 0; !pattern && i < allowed.length; i += 1) {\n            if (allowed[i] === state.current) {\n                // Try custom function first\n                if (state.current.token) {\n                    style = state.current.token(stream, state);\n                    if (stream.current()) {\n                        return style;\n                    }\n                }\n                pattern = matchPatterns(stream, state, allowed[i].patterns);\n            } else {\n                pattern = matchPatterns(stream, state, allowed[i].entries);\n                if (pattern) {\n                    state.stack.push(state.current);\n                    state.current = allowed[i];\n                    if (pattern.lang) {\n                        enterInnerMode(state, pattern.lang);\n                    }\n                }\n            }\n        }\n\n        if (pattern) {\n            if (pattern.exit) {\n                state.exit = true;\n            }\n            return tokenStyles(state, pattern.style);\n        } else {\n            return tokenStyles(state);\n        }\n    }\n\n    function tokenStyles(state, style) {\n        var styles = [];\n\n        for (var i = 0; i < state.stack.length; i += 1) {\n            if (state.stack[i].style) {\n                styles.push(state.stack[i].style);\n            }\n        }\n\n        if (state.current.style) {\n            styles.push(state.current.style);\n        }\n\n        if (style) {\n            styles.push(style);\n        }\n\n        return styles.join(' ') || null;\n    }\n\n    function connectDokuModes() {\n        for (var i = 0; i < dokuModes.length; i += 1) {\n            var src = dokuModes[i];\n            src.allowedModes = [];\n            if (src.allowedTypes) {\n                connectMode(src);\n            } else {\n                src.allowedModes.push(src);\n            }\n        }\n\n        function connectMode(src) {\n            for (var i = 0; i < dokuModes.length; i += 1) {\n                var dest = dokuModes[i];\n                if (src === dest || allowsType(src, dest.type)) {\n                    src.allowedModes.push(dest);\n                }\n            }\n        }\n\n        function allowsType(mode, type) {\n            for (var i = 0; i < mode.allowedTypes.length; i += 1) {\n                if (mode.allowedTypes[i] === type) {\n                    return true;\n                }\n            }\n            return false;\n        }\n    }\n\n});\n","/**\n * CodeMirror plugin for DokuWiki\n *\n * @author Albert Gasset <albertgasset@fsfe.org>\n * @license GNU GPL version 2 or later\n */\n\n/* global CodeMirror, DokuCookie, dw_editor, dw_locktimer, jQuery,\n          JSINFO, LANG */\n\njQuery(function() {\n    'use strict';\n\n    var cm, dokuMode;\n\n    var codeModes = {\n        apl: {name: 'apl'},\n        asciiarmor: {name: 'asciiarmor'},\n        'asn.1': {name: 'asn.1', mime: 'text/x-ttcn-asn'},\n        asterisk: {name: 'asterisk'},\n        aspx: {name: 'htmlembedded', mime: 'application/x-aspx',\n               deps: ['clike']},\n        bash: {name: 'shell'},\n        brainfuck: {name: 'brainfuck'},\n        c: {name: 'clike', mime: 'text/x-csrc'},\n        cassandra: {name: 'sql', mime: 'text/x-cassandra'},\n        ceylon: {name: 'clike', mime: 'text/x-ceylon'},\n        clojure: {name: 'clojure'},\n        cmake: {name: 'cmake'},\n        cobol: {name: 'cobol'},\n        coffeescript: {name: 'coffeescript'},\n        cpp: {name: 'clike', mime: 'text/x-c++src'},\n        crystal: {name: 'crystal'},\n        csharp: {name: 'clike', mime: 'text/x-csharp'},\n        css: {name: 'css', mime: 'text/css'},\n        cypher: {name: 'cypher'},\n        cython: {name: 'python', mime: 'text/x-cython'},\n        diff: {name: 'diff'},\n        d: {name: 'd', mime: 'text/x-d'},\n        dart: {name: 'dart'},\n        django: {name: 'django', deps: ['htmlmixed']},\n        dockerfile: {name: 'dockerfile'},\n        dtd: {name: 'dtd'},\n        dylan: {name: 'dylan'},\n        ebnf: {name: 'ebnf'},\n        ecl: {name: 'ecl'},\n        ecmascript: {name: 'javascript', mime: 'application/ecmascript'},\n        elm: {name: 'elm'},\n        erb: {name: 'htmlembedded', mime: 'application/x-erb',\n              deps: ['ruby']},\n        eiffel: {name: 'eiffel'},\n        ejs: {name: 'htmlembedded', mime: 'application/x-ejs',\n              deps: ['javascript']},\n        erlang: {name: 'erlang'},\n        factor: {name: 'factor'},\n        fcl: {name: 'fcl'},\n        forth: {name: 'forth'},\n        fortran: {name: 'fortran'},\n        fsharp: {name: 'mllike', mime: 'text/x-fsharp'},\n        gfm: {name: 'gfm'},\n        gherkin: {name: 'gherkin'},\n        glsl: {name: 'clike', mime: 'x-shader/x-vertex'},\n        go: {name: 'go'},\n        gql: {name: 'sql', mime: 'text/x-gql'},\n        groovy: {name: 'groovy'},\n        gss: {name: 'css', mime: 'text/x-gss'},\n        haml: {name: 'haml'},\n        handlebars: {name: 'handlebars'},\n        haskell: {name: 'haskell'},\n        'haskell-literate': {name: 'haskell-literate'},\n        haxe: {name: 'haxe', mime: 'text/x-haxe'},\n        hive: {name: 'sql', mime: 'text/x-hive'},\n        html: {name: 'htmlmixed'},\n        html5: {name: 'htmlmixed'},\n        http: {name: 'http'},\n        hxml: {name: 'haxe', mime: 'text/x-hxml'},\n        idl: {name: 'idl'},\n        ini: {name: 'properties'},\n        jade: {name: 'pug', deps: ['javascript']},\n        java5: {name: 'clike', mime: 'text/x-java'},\n        java: {name: 'clike', mime: 'text/x-java'},\n        javascript: {name: 'javascript', mime: 'application/javascript'},\n        jinja2: {name: 'jinja2'},\n        json: {name: 'javascript', mime: 'application/json'},\n        jsonld: {name: 'javascript', mime: 'application/ld+json'},\n        jsp: {name: 'htmlembedded', mime: 'application/x-jsp',\n              deps: ['clike']},\n        jsx: {name: 'jsx'},\n        julia: {name: 'julia'},\n        kotlin: {name: 'clike', mime: 'text/x-kotlin'},\n        latex: {name: 'stex'},\n        less: {name: 'css', mime: 'text/x-less'},\n        lisp: {name: 'commonlisp'},\n        livescript: {name: 'livescript'},\n        lua: {name: 'lua'},\n        mariadb: {name: 'sql', mime: 'text/x-mariadb'},\n        markdown: {name: 'markdown'},\n        matlab: {name: 'octave'},\n        mbox: {name: 'mbox'},\n        modelica: {name: 'modelica', mime: 'text/x-modelica'},\n        mscgen: {name: 'mscgen'},\n        mscgenny: {name: 'mscgen', mime: 'text/x-msgenny'},\n        mssql: {name: 'sql', mime: 'text/x-mssql'},\n        mumps: {name: 'mumps'},\n        mysql: {name: 'sql', mime: 'text/x-sql'},\n        nginx: {name: 'nginx'},\n        nsis: {name: 'nsis'},\n        ntriples: {name: 'ntriples'},\n        objc: {name: 'clike', mime: 'text/x-objectivec'},\n        ocaml: {name: 'mllike', mime: 'text/x-ocaml'},\n        octave: {name: 'octave'},\n        oz: {name: 'oz'},\n        pascal: {name: 'pascal'},\n        pgp: {name: 'asciiarmor'},\n        pegjs: {name: 'pegjs'},\n        perl: {name: 'perl'},\n        pgsql: {name: 'sql', mime: 'text/x-pgsql'},\n        php: {name: 'php', mime: 'application/x-httpd-php-open',\n              deps: ['htmlmixed']},\n        pig: {name: 'pig', mime: 'text/x-pig'},\n        plsql: {name: 'sql', mime: 'text/x-plsql'},\n        postgresql: {name: 'sql', mime: 'text/x-pgsql'},\n        powershell: {name: 'powershell'},\n        properties: {name: 'properties'},\n        protobuf: {name: 'protobuf'},\n        python: {name: 'python', mime: 'text/x-python'},\n        pug: {name: 'pug', deps: ['javascript']},\n        puppet: {name: 'puppet'},\n        q: {name: 'q'},\n        r: {name: 'r'},\n        rpmchanges: {name: 'rpm', mime: 'text/x-rpm-changes'},\n        rpmspec: {name: 'rpm', mime: 'text/x-rpm-spec'},\n        rst: {name: 'rst'},\n        ruby: {name: 'ruby'},\n        rust: {name: 'rust'},\n        sas: {name: 'sas'},\n        sass: {name: 'sass'},\n        scala: {name: 'clike', mime: 'text/x-scala'},\n        scheme: {name: 'scheme'},\n        scss: {name: 'css', mime: 'text/x-scss'},\n        sieve: {name: 'sieve'},\n        slim: {name: 'slim'},\n        smalltalk: {name: 'smalltalk'},\n        smarty: {name: 'smarty', options: {version: 2}},\n        smarty3: {name: 'smarty', options: {version: 3}},\n        solr: {name: 'solr'},\n        soy: {name: 'soy'},\n        sparql: {name: 'sparql'},\n        spreadsheet: {name: 'spreadsheet'},\n        sql: {name: 'sql', mime: 'text/x-sql'},\n        squirrel: {name: 'clike', mime: 'text/x-squirrel'},\n        stylus: {name: 'stylus'},\n        swift: {name: 'swift'},\n        tcl: {name: 'tcl'},\n        text: {name: 'doku-null'},\n        textile: {name: 'textile'},\n        tiddlywiki: {name: 'tiddlywiki'},\n        tiki: {name: 'tiki'},\n        toml: {name: 'toml'},\n        tornado: {name: 'tornado', deps: ['htmlmixed']},\n        troff: {name: 'troff'},\n        ttcn: {name: 'ttcn', mime: 'text/x-ttcn'},\n        'ttcn-cfg': {name: 'ttcn-cfg', mime: 'text/x-ttcn-cfg'},\n        turtle: {name: 'turtle'},\n        twig: {name: 'twig'},\n        typescript: {name: 'javascript', mime: 'application/typescript'},\n        vbnet: {name: 'vb'},\n        vbscript: {name: 'vbscript'},\n        velocity: {name: 'velocity'},\n        verilog: {name: 'verilog'},\n        vhdl: {name: 'vhdl'},\n        vue: {name: 'vue'},\n        webidl: {name: 'webidl'},\n        xml: {name: 'xml'},\n        xquery: {name: 'xquery'},\n        xu: {name: 'mscgen', mime: 'text/x-xu'},\n        yacas: {name: 'yacas'},\n        yaml: {name: 'yaml'},\n        'yaml-frontmatter': {name: 'yaml-frontmatter', deps: ['gfm']},\n        z80: {name: 'z80'},\n    };\n\n    var settings = {\n        activeline: {\n            default_: '0',\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('styleActiveLine', value === '1');\n                }\n            }\n        },\n        closebrackets: {\n            default_: '0',\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('autoCloseBrackets', value === '1');\n                }\n            }\n        },\n        fontsize: {\n            default_: '14',\n            choices: ['10', '11',  '12', '13', '14', '16', '18', '20', '24'],\n            callback: function(value) {\n                if (cm) {\n                    var wrapper = cm.getWrapperElement();\n                    jQuery(wrapper).css('font-size', value + 'px');\n                    cm.refresh();\n                }\n            }\n        },\n        keymap: {\n            default_: 'default',\n            choices: ['default', 'emacs', 'sublime', 'vim'],\n            callback: function(value) {\n                if (cm) {\n                    requireKeyMap(value, function() {\n                        cm.setOption('vimMode', value === 'vim');\n                        cm.setOption('keyMap', value);\n                    });\n                }\n            }\n        },\n        linenumbers: {\n            default_: '0',\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('lineNumbers', value === '1');\n                }\n            }\n        },\n        matchbrackets: {\n            default_: '1',\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('matchBrackets', value === '1');\n                }\n            }\n        },\n        nativeeditor: {\n            default_: JSINFO.plugin_codemirror.nativeeditor.toString(),\n            callback: function(value) {\n                if (!cm && value === '0') {\n                    initCodeMirror();\n                } else if (cm && value === '1') {\n                    destroyCodeMirror();\n                }\n            }\n        },\n        syntax: {\n            default_: '1',\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('mode', value === '1' ? dokuMode : 'null');\n                }\n            }\n        },\n        showinvisibles: {\n            default_: '0',\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('showInvisibles', value === '1');\n                }\n            }\n        },\n        theme: {\n            default_: 'default',\n            choices: [\n                '3024-day',\n                '3024-night',\n                'abcdef',\n                'ambiance',\n                'ambiance-mobile',\n                'base16-dark',\n                'base16-light',\n                'bespin',\n                'blackboard',\n                'cobalt',\n                'colorforth',\n                'default',\n                'dracula',\n                'eclipse',\n                'elegant',\n                'erlang-dark',\n                'hopscotch',\n                'icecoder',\n                'isotope',\n                'lesser-dark',\n                'liquidbyte',\n                'material',\n                'mbo',\n                'mdn-like',\n                'midnight',\n                'monokai',\n                'neat',\n                'neo',\n                'night',\n                'panda-syntax',\n                'paraiso-dark',\n                'paraiso-light',\n                'pastel-on-dark',\n                'railscasts',\n                'rubyblue',\n                'seti',\n                'solarized',\n                'the-matrix',\n                'tomorrow-night-bright',\n                'tomorrow-night-eighties',\n                'ttcn',\n                'twilight',\n                'vibrant-ink',\n                'xq-dark',\n                'xq-light',\n                'yeti',\n                'zenburn',\n            ],\n            callback: function(value) {\n                if (cm) {\n                    cm.setOption('theme', value);\n                }\n            }\n        },\n    };\n\n    var textarea = jQuery('#wiki__text');\n\n    CodeMirror.modeURL = url('/dist/modes/%N.min.js');\n\n    if (textarea.length) {\n        initMode();\n        initHooks();\n        initSettingsMenu();\n\n        if (getSetting('nativeeditor') === '0') {\n            initCodeMirror();\n        }\n    }\n\n    if (JSINFO.plugin_codemirror.codesyntax.toString() === '1') {\n        jQuery('#dokuwiki__content pre.code').each(function(index, element) {\n            var classNames = element.className.split(' ');\n            jQuery.each(classNames, function(index, className) {\n                if (!codeModes[className]) {\n                    return;\n                }\n                element.className = element.className + ' cm-s-default';\n                var mode = codeModes[className];\n                var value = jQuery(element).text();\n                var spec = mode.options || {};\n                spec.name = mode.mime || mode.name;\n                getCodeMode(className, {}, function() {\n                    CodeMirror.runMode(value, spec, element);\n                });\n                CodeMirror.runMode(value, spec, element);\n            });\n        });\n    }\n\n    function getCodeMode(lang, options, onLoadedAsync) {\n        var mode = codeModes[lang] || {name: 'doku-null'};\n        var deps = [mode.name].concat(mode.deps || []);\n        var loadNextDep = function() {\n            if (deps.length > 0) {\n                CodeMirror.requireMode(deps.pop(), loadNextDep);\n            } else {\n                onLoadedAsync();\n            }\n        };\n        do {\n            var dep = deps.pop();\n            if (!CodeMirror.modes.hasOwnProperty(dep)) {\n                CodeMirror.requireMode(dep, loadNextDep);\n                return CodeMirror.getMode(options, {name: 'doku-null'});\n            }\n        } while (deps.length > 0);\n\n        var spec = mode.options || {};\n        spec.name = mode.mime || mode.name;\n\n        return CodeMirror.getMode(options, spec);\n    }\n\n    function destroyCodeMirror() {\n        var selection = window.DWgetSelection(textarea.get(0));\n        cm.toTextArea();\n        cm = null;\n        window.DWsetSelection(selection);\n        textarea.focus();\n\n        if(JSINFO.plugin_codemirror.autoheight.toString() === '1') {\n            jQuery(\n                '#size__ctl img[src$=\"/larger.gif\"], ' +\n                '#size__ctl img[src$=\"/smaller.gif\"]'\n            ).show();\n        }\n    }\n\n    function initCodeMirror() {\n        var selection = window.DWgetSelection(textarea.get(0));\n        cm = CodeMirror.fromTextArea(textarea.get(0), {mode: 'null'});\n        cm.setOption('lineWrapping', textarea.prop('wrap') !== 'off');\n        cm.setOption('readOnly', textarea.prop('readonly'));\n        cm.setOption('tabSize', 8);\n        cm.setOption('extraKeys', {\n            'Enter': function(cm) {\n                return indentCommand(cm, 'Enter');\n            },\n            'Space': function(cm) {\n                return indentCommand(cm, 'Space');\n            },\n            'Backspace' : function(cm) {\n                return indentCommand(cm, 'Backspace');\n            },\n            'Ctrl-Enter': function() {\n                jQuery('#edbtn__save').click();\n            },\n        });\n        cm.setOption(\n            'scrollbarStyle',\n            JSINFO.plugin_codemirror.usenativescroll.toString() === '1' ?\n                'native' : 'overlay'\n        );\n        cm.setSize(null, textarea.css('height'));\n        cm.getDoc().on('change', function() {\n            var now = new Date();\n            if (now.getTime() - dw_locktimer.lasttime.getTime() > 30000) {\n                textarea.val(cm.getDoc().getValue());\n                dw_locktimer.refresh();\n            }\n        });\n        jQuery.each(settings, function(name, setting) {\n            if (name !== 'nativeeditor') {\n                var value = getSetting(name);\n                setting.callback(value);\n            }\n        });\n        window.DWsetSelection(selection);\n\n        if(JSINFO.plugin_codemirror.autoheight.toString() === '1') {\n            jQuery('form#dw__editform .CodeMirror').css({ height: 'auto' });\n            jQuery(\n                '#size__ctl img[src$=\"/larger.gif\"], ' +\n                '#size__ctl img[src$=\"/smaller.gif\"]'\n            ).hide();\n            // Tell CodeMirror to render ALL lines of text.\n            // Needed when no lines get scrolled out of the CodeMirror frame.\n            cm.setOption('viewportMargin', Infinity);\n        }\n    }\n\n    function initMode() {\n        dokuMode = JSINFO.plugin_codemirror;\n\n        dokuMode.name = 'doku';\n\n        dokuMode.loadMode = function(lang) {\n            var onLoadedAsync = function() {\n                // Reset syntax highlighting\n                cm.setOption('mode', dokuMode);\n            };\n            return getCodeMode(lang, cm.options, onLoadedAsync);\n        };\n\n        dokuMode.validLang = function(lang) {\n            return codeModes[lang] !== undefined;\n        };\n\n        CodeMirror.defineMode('doku-null', function() {\n            return {\n                token: function(stream) {\n                    stream.next();\n                }\n            };\n        });\n    }\n\n    function initHooks() {\n        var dw = {\n            setWrap: dw_editor.setWrap,\n            sizeCtl: dw_editor.sizeCtl,\n            currentHeadlineLevel: window.currentHeadlineLevel,\n            selection_class: window.selection_class,\n            DWgetSelection: window.DWgetSelection || window.getSelection,\n            DWsetSelection: window.DWsetSelection || window.setSelection,\n            pasteText: window.pasteText,\n        };\n\n        dw_editor.setWrap = function(editor, value) {\n            dw.setWrap(editor, value);\n            if (cm && textarea.is(editor)) {\n                cm.setOption('lineWrapping', value !== 'off');\n            }\n        };\n\n        dw_editor.sizeCtl = function(editor, value) {\n            dw.sizeCtl(editor, value);\n            if (cm && textarea.is(editor)) {\n                cm.setSize(null, textarea.css('height'));\n            }\n        };\n\n        window.currentHeadlineLevel = function(id) {\n            if (cm && textarea.is('#' + id)) {\n                textarea.val(cm.getDoc().getValue());\n            }\n            return dw.currentHeadlineLevel(id);\n        };\n\n        window.selection_class = function() {\n            dw.selection_class.apply(this);\n            var dw_getText = this.getText;\n            this.geText = function() {\n                if (cm && textarea.is(this.obj)) {\n                    var doc = cm.getDoc();\n                    var from = doc.indexFromPos(this.start);\n                    var to = doc.indexFromPos(this.end);\n                    return doc.getRange(from, to);\n                } else {\n                    return dw_getText.apply(this);\n                }\n            };\n        };\n\n        window.DWgetSelection = function(editor) {\n            if (cm && textarea.is(editor)) {\n                var doc = cm.getDoc();\n                var selection = new window.selection_class();\n                selection.obj = editor;\n                selection.start = doc.indexFromPos(doc.getCursor('from'));\n                selection.end = doc.indexFromPos(doc.getCursor('to'));\n                // workaround for edittable plugin\n                textarea.val(doc.getValue());\n                return selection;\n            } else {\n                return dw.DWgetSelection(editor);\n            }\n        };\n\n        window.DWsetSelection = function(selection) {\n            if (cm && textarea.is(selection.obj)) {\n                var doc = cm.getDoc();\n                var anchor = doc.posFromIndex(selection.start);\n                var head = doc.posFromIndex(selection.end);\n                doc.setSelection(anchor, head);\n                cm.focus();\n            } else {\n                dw.DWsetSelection(selection);\n            }\n        };\n\n        window.pasteText = function(selection, text, opts) {\n            if (cm && textarea.is(selection.obj)) {\n                var doc = cm.getDoc();\n                textarea.val(doc.getValue());\n                var from = doc.posFromIndex(selection.start);\n                var to = doc.posFromIndex(selection.end);\n                doc.replaceRange(text, from, to);\n                dw.pasteText(selection, text, opts);\n                cm.focus();\n            } else {\n                dw.pasteText(selection, text, opts);\n            }\n        };\n    }\n\n    function initSettingsButton(menu) {\n        var button = jQuery('<img>').attr('class', 'cm-settings-button');\n\n        button.attr('src', JSINFO.plugin_codemirror.iconURL);\n        button.on('click', function() {\n            var btnOffset = jQuery(this).offset();\n            var btnWidth = jQuery(this).outerWidth();\n            var menuWidth = menu.outerWidth();\n            var menuHeight = menu.outerHeight();\n            menu.css('top', btnOffset.top - menuHeight);\n            menu.css('left', btnOffset.left + btnWidth - menuWidth);\n            menu.toggle();\n            return false;\n        });\n\n        if (jQuery('#size__ctl').length > 0) {\n            button.appendTo('#size__ctl');\n        } else {\n            button.appendTo('#draft__status');\n        }\n    }\n\n    function initSettingsMenu() {\n        var menu = jQuery('<ul>').addClass('cm-settings-menu');\n        var items = [\n            'theme',\n            'fontsize',\n            'keymap',\n            'closebrackets',\n            'linenumbers',\n            'activeline',\n            'matchbrackets',\n            'syntax',\n            'showinvisibles',\n            '-',\n            'nativeeditor',\n        ];\n\n        jQuery.each(items, function(index, name) {\n            var setting = settings[name];\n            var title = LANG.plugins.codemirror['setting_' + name];\n\n            // Separator\n            if (name === '-') {\n                menu.append('<li>-</li>');\n                return;\n            }\n\n            var item = jQuery('<li>');\n            var link = jQuery('<a>').html(title);\n            var value = getSetting(name);\n            var disabled = getSetting('nativeeditor') === '1';\n\n            if (setting.choices) {\n                // Choice setting\n                var submenu = jQuery('<ul>');\n                jQuery.each(setting.choices, function(index, choice) {\n                    var item = jQuery('<li>');\n                    item.data('setting', name);\n                    item.data('choice', choice);\n                    var link = jQuery('<a>').html(choice);\n                    var icon = jQuery('<span>').addClass('ui-icon');\n                    if (value === choice) {\n                        icon.addClass('ui-icon-check');\n                    } else {\n                        icon.addClass('ui-icon-blank');\n                    }\n                    link.append(icon);\n                    item.append(link);\n                    submenu.append(item);\n                });\n                item.append(submenu);\n            } else {\n                // Boolean setting\n                item.data('setting', name);\n                var icon = jQuery('<span>').addClass('ui-icon');\n                if (value === '1') {\n                    icon.addClass('ui-icon-check');\n                } else {\n                    icon.addClass('ui-icon-blank');\n                }\n                link.append(icon);\n            }\n\n            if (disabled && name !== 'nativeeditor') {\n                item.addClass('ui-state-disabled');\n            }\n\n            item.append(link);\n            menu.append(item);\n        });\n\n        menu.menu({position: {my: 'right top', at: 'left top'}});\n\n        jQuery('body').on('click', function() {\n            // Hide menu and collapse submenus\n            setTimeout(function() {\n                menu.menu('collapseAll', null, true);\n            }, 200);\n            menu.hide();\n        });\n\n        menu.on('menuselect', function(event, ui) {\n            var name = ui.item.data('setting');\n            var value = ui.item.data('choice');\n            var icon = ui.item.find('.ui-icon');\n\n            if (!name) {\n                // Submenu, do nothing and prevent hiding\n                return false;\n            }\n\n            if (value) {\n                // Choice setting\n                var icons = ui.item.siblings().find('.ui-icon');\n                icons.removeClass('ui-icon-check');\n                icons.addClass('ui-icon-blank');\n                icon.removeClass('ui-icon-blank');\n                icon.addClass('ui-icon-check');\n            } else {\n                // Boolean setting\n                value = icon.hasClass('ui-icon-check') ? '0' : '1';\n                icon.removeClass('ui-icon-blank ui-icon-check');\n                if (value === '1') {\n                    icon.addClass('ui-icon-check');\n                } else {\n                    icon.addClass('ui-icon-blank');\n                }\n            }\n\n            if (name === 'nativeeditor') {\n                if (value === '1') {\n                    ui.item.siblings().addClass('ui-state-disabled');\n                } else {\n                    ui.item.siblings().removeClass('ui-state-disabled');\n                }\n            }\n\n            setSetting(name, value);\n        });\n\n        menu.appendTo('body');\n        initSettingsButton(menu);\n    }\n\n    function getSetting(name) {\n        var value = DokuCookie.getValue('cm-' + name);\n        var setting = settings[name];\n\n        if (setting.choices) {\n            // Choice setting\n            if (!value || jQuery.inArray(value, setting.choices) < 0) {\n                value = setting.default_;\n            }\n        } else {\n            // Boolean setting\n            if (value !== '0' && value !== '1') {\n                value = setting.default_;\n            }\n        }\n\n        DokuCookie.setValue('cm-' + name, value);\n\n        return value;\n    }\n\n    function setSetting(name, value) {\n        DokuCookie.setValue('cm-' + name, value);\n        settings[name].callback(value);\n    }\n\n    function requireKeyMap(name, callback) {\n        var intervalID;\n\n        if (CodeMirror.keyMap[name]) {\n            callback();\n            return;\n        }\n\n        var count = 0;\n\n        jQuery('<script>')\n            .attr('src', url('/dist/keymaps/' + name + '.min.js'))\n            .appendTo('head');\n\n        function check() {\n            count += 1;\n\n            // stop checking after 20s\n            if (count > 100) {\n                clearInterval(intervalID);\n            }\n\n            if (CodeMirror.keyMap[name]) {\n                clearInterval(intervalID);\n                callback();\n            }\n        }\n\n        intervalID = setInterval(check, 200);\n    }\n\n    function indentCommand(cm, key) {\n        var doc = cm.getDoc();\n        if (doc.somethingSelected()) {\n            return CodeMirror.Pass;\n        }\n        var pos = doc.getCursor();\n        if (cm.getModeAt(pos) !== doc.getMode()) {\n            // Cursor on inner mode\n            return CodeMirror.Pass;\n        }\n        var line = doc.getLine(pos.line);\n        var before = line.slice(0, pos.ch);\n        var match = before.match(/^(  +)([-*] )?/);\n        if (!match) {\n            return CodeMirror.Pass;\n        }\n        if (key !== 'Enter' && pos.ch > match[0].length) {\n            // Space and Backspace only work before content\n            return CodeMirror.Pass;\n        }\n        if (key === 'Enter') {\n            if (match[2] && match[0] === line) {\n                // List item is empty, cancel list\n                doc.replaceRange('\\n',  {line: pos.line, ch: 0}, pos);\n            } else {\n                doc.replaceRange('\\n' + match[0], pos);\n            }\n        } else if (key === 'Space') {\n            doc.replaceRange('  ' + before, {line: pos.line, ch: 0}, pos);\n        } else if (key === 'Backspace') {\n            if (match[1].length >= 4) {\n                before = before.slice(2);\n            } else {\n                // Cancel list or preformatted block\n                before = '';\n            }\n            doc.replaceRange(before, {line: pos.line, ch: 0}, pos);\n        }\n    }\n\n    function url(path) {\n        return (JSINFO.plugin_codemirror.baseURL + '/' + path +\n                '?v=' + JSINFO.plugin_codemirror.version);\n    }\n});\n"]}