{"version":3,"sources":["../../../../../../plugins/flow/web_external/js/lib/ace-builds/src-noconflict/ace.js","../../../../../../plugins/flow/web_external/js/lib/ace-builds/src-noconflict/mode-python.js","../../../../../../plugins/flow/web_external/js/lib/ace-builds/src-noconflict/mode-r.js","../../../../../../plugins/flow/web_external/js/lib/ace-builds/src-noconflict/theme-chrome.js","../../../../../../plugins/flow/web_external/js/lib/ace-builds/src-noconflict/theme-github.js","../../../../../../plugins/flow/web_external/js/lib/ace-builds/src-noconflict/theme-monokai.js"],"names":["ACE_NAMESPACE","global","this","requirejs","_define","module","deps","payload","original","apply","window","arguments","console","error","trace","length","modules","payloads","_require","parentId","callback","Object","prototype","toString","call","params","i","l","dep","lookup","push","normalizeModule","moduleName","indexOf","chunks","split","charAt","base","slice","join","previous","replace","exports","mod","id","uri","packaged","req","returnValue","exportAce","ns","require","root","define","ace","dom","event","Editor","EditSession","UndoManager","Renderer","VirtualRenderer","MultiSelect","config","edit","el","_id","document","getElementById","Error","env","editor","doc","createEditSession","getInnerText","innerHTML","setSession","onResize","resize","bind","addListener","on","removeListener","text","mode","setUndoManager","Behaviour","$behaviours","add","name","action","undefined","addBehaviours","behaviours","key","remove","inherit","filter","getBehaviours","ret","packages","addUnicodePackage","L","Ll","Lu","Lt","Lm","Lo","M","Mn","Mc","Me","N","Nd","Nl","No","P","Pd","Ps","Pe","Pi","Pf","Pc","Po","S","Sm","Sc","Sk","So","Z","Zs","Zl","Zp","C","Cc","Cf","Co","Cs","Cn","pack","codePoint","TokenIterator","session","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","token","getTokenAt","$tokenIndex","index","stepBackward","stepForward","rowCount","getLength","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","column","start","value","lang","TextHighlightRules","$rules","regex","defaultToken","addRules","rules","prefix","state","rule","next","nextState","getRules","embedRules","HighlightRules","escapeRules","states","append","Array","deepCopy","$embeds","getEmbeds","pushState","currentState","stack","unshift","popState","shift","normalizeRules","processState","processed","end","isArray","stateName","r","include","includeName","toInsert","args","concat","noEscape","x","splice","keywordMap","createKeywordMapper","caseInsensitive","keys","forEach","map","ignoreCase","splitChar","keywords","create","className","a","toLowerCase","list","getPrototypeOf","__proto__","$keywordList","getKeywords","$keywords","oop","EventEmitter","Anchor","row","$onChange","onChange","attach","setPosition","implement","getPosition","$clipPositionToDocument","getDocument","$insertRight","e","delta","data","range","Math","max","noClip","pos","old","_signal","detach","removeEventListener","getLine","min","BackgroundTokenizer","tokenizer","running","lines","currentLine","self","$worker","workerStart","Date","endLine","startLine","len","processedLines","$tokenizeRow","setTimeout","fireUpdateEvent","setTokenizer","setDocument","stop","firstRow","lastRow","first","last","startRow","scheduleStart","$updateOnChange","clearTimeout","getState","line","getLineTokens","tokens","Range","SearchHighlight","regExp","clazz","type","setRegexp","MAX_RANGES","cache","update","html","markerLayer","ranges","getMatchOffsets","match","offset","j","drawSingleLineMarker","toScreenRange","FoldLine","Fold","Folding","getFoldAt","side","foldLine","getFoldLine","folds","fold","contains","isEnd","isStart","getFoldsInRange","foldLines","$foldData","foundFolds","cmp","compareRange","getFoldsInRangeList","getAllFolds","getFoldStringAt","trim","lastFold","str","compareEnd","substring","docRow","startFoldLine","foldData","getNextFoldLine","getFoldedRowCount","$addFoldLine","sort","b","addFold","placeholder","added","collapseChildren","$clipRangeToDocument","startColumn","endRow","endColumn","startFold","endFold","addSubFold","removeFolds","subFold","sameRow","foldLineNext","merge","$useWrapMode","$updateWrapData","$updateRowLengthCache","$modified","_emit","addFolds","removeFold","pop","newFoldLine","$updating","cloneFolds","expandFold","subFolds","restoreRange","foldAll","expandFolds","unfold","location","expandInner","fromPoints","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","walk","lastColumn","getDisplayLine","$cloneFoldData","fd","clone","toggleFold","tryToUnfold","selection","getRange","bracketPos","isEmpty","cursor","findMatchingBracket","comparePoint","getCommentFoldRange","isMultiLine","getTextRange","dir","iterator","test","re","RegExp","depth","foldWidgets","getFoldWidget","getFoldWidgetRange","$foldStyles","manual","markbegin","markbeginend","$foldStyle","setFoldStyle","style","$foldMode","$setFolding","foldMode","$updateFoldWidgets","updateFoldWidgets","getParentFoldRangeData","ignoreCurrent","fw","firstRange","c","onFoldWidgetClick","domEvent","options","children","shiftKey","all","ctrlKey","metaKey","siblings","altKey","$toggleFoldWidget","target","srcElement","isEqual","toggleFoldWidget","toggleParent","getCursor","setFoldLine","shiftRow","compareStart","containsRow","lastEnd","comp","isNewRow","getNextFoldTo","kind","addRemoveChars","log","foldBefore","idxToPosition","idx","lastFoldEndColumn","MAX_TOKEN_COUNT","Tokenizer","regExps","matchMappings","ruleRegExps","matchTotal","mapping","flag","splitterRurles","adjustedregex","matchcount","exec","tokenArray","onMatch","$arrayTokens","$applyToken","digit","parseInt","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","m","values","types","src","y","inChClass","lastCapture","esc","parenOpen","parenClose","square","substr","startState","lastIndex","skipped","RangeList","inherits","containsRange","consumeRange","compare","afterStart","afterEnd","consumedFolds","consumePoint","point","anchor","restorePoint","unicode","Mode","$behaviour","tokenRe","nonTokenRe","getTokenizer","$tokenizer","$highlightRules","lineCommentStart","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","tabSize","getTabSize","insertAtTabStop","lineCommentEnd","regexpStart","escapeRegExp","regexpEnd","comment","testRemove","insertInLine","uncomment","removeInLine","getUseSoftTabs","shouldInsertSpace","commentWithSpace","before","after","spaces","iter","fun","minEmptyLength","indent","search","floor","toggleBlockComment","sel","initialRange","toOrientedRange","colDiff","startRange","endRange","insert","fromOrientedRange","getNextLineIndent","tab","$getIndent","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","$modes","delegations","scope","functionName","defaultHandler","$delegator","method","transformAction","param","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","word","score","meta","$id","comparePoints","pointIndex","excludeEdges","startIndex","cmpEnd","cmpStart","endIndex","addList","removed","substractPoint","containsPoint","rangeAtPoint","clipRows","clipped","removeAll","changeRange","lineDif","n","p1","p2","p","intersects","setStart","setEnd","inside","insideStart","insideEnd","compareInside","extend","collapseRows","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","BracketMatch","position","chr","charBeforeCursor","$findClosingBracket","$findOpeningBracket","getBracketRange","$brackets",")","(","]","[","{","}","bracket","typeRe","openBracket","valueIndex","closingBracket","valueLength","Selection","clearSelection","lead","selectionLead","createAnchor","selectionAnchor","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","setSelectionAnchor","getSelectionAnchor","getSelectionLead","shiftSelection","columns","moveCursorTo","isBackwards","$moveSelection","selectAll","setRange","setSelectionRange","reverse","selectTo","mover","selectToPosition","moveCursorToPosition","moveTo","moveToPosition","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","getWordRange","selectWord","selectAWord","getAWordRange","getLineRange","excludeLastChar","rowStart","rowEnd","selectLine","moveCursorBy","isTabStop","screenRow","documentToScreenRow","firstColumnPosition","screenToDocumentPosition","beforeCursor","leadingSpace","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","moveCursorLongWordRight","rightOfCursor","moveCursorLongWordLeft","leftOfCursor","stringReverse","$shortWordEndIndex","ch","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","chars","screenPos","docPos","lineWidgets","keepDesiredColumn","moveCursorToScreen","desiredColumn","toJSON","rangeCount","r1","fromJSON","rangeList","toSingleRange","addRange","Search","$options","set","mixin","getOptions","copyObject","setOptions","find","$matchIterator","findAll","needle","$assembleRegExp","getLines","getAllLines","$isMultiLine","maxRow","prevRange","outer","matches","replacement","preserveCase","toUpperCase","backwards","matchIterator","Number","MAX_VALUE","_callback","$lineIterator","$disableFakeMultiline","wholeWord","modifier","caseSensitive","$assembleMultilineRegExp","parts","skipCurrent","wrap","TextMode","Document","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","onChangeFold","resetOptions","setMode","bgTokenizer","resetCaches","$resetRowCache","$docRowCache","$screenRowCache","$getRowCacheIndex","cacheArray","val","low","hi","mid","$wrapData","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","$undoManager","ignore","$deltasDoc","$deltasFold","$informUndoManager","schedule","setValue","$deltas","getUndoManager","reset","getValue","getSelection","undoManager","cancel","$syncInformUndoManager","group","deltas","execute","mergeUndoDeltas","delayedCall","markUndoGroup","$defaultUndoManager","undo","redo","getTabString","stringRepeat","setUseSoftTabs","setOption","$useSoftTabs","$mode","$indentWithTabs","setTabSize","$tabSize","$overwrite","setOverwrite","overwrite","getOverwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","addMarker","inFront","marker","renderer","addDynamicMarker","removeMarker","markerId","markers","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","$annotations","getAnnotations","clearAnnotations","$detectNewLine","$autoNewLine","inToken","wordRange","setNewLineMode","newLineMode","getNewLineMode","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","cb","$onChangeMode","path","loadModule","$isPlaceholder","$stopWorker","$startWorker","addEventListener","_self","wrapMethod","$wrapMethod","foldingRules","terminate","Worker","noWorker","getMode","$scrollTop","setScrollTop","scrollTop","isNaN","getScrollTop","$scrollLeft","setScrollLeft","scrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","width","w","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","lastUndoRange","revertDeltas","$getUndoSelection","foldDelta","redoChanges","applyDeltas","setUndoSelect","enable","isUndo","isInsert","lastDeltaIsInsert","moveText","fromRange","toPosition","copy","toRange","rowDiff","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","size","$moveLines","diff","$clipRowToDocument","removeLines","insertLines","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","getUseWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","arr","abs","wrapData","$getDisplayTokens","$computeWrapSplits","walkTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","CHAR","CHAR_EXT","PUNCTUATION","SPACE","TAB","TAB_SPACE","splits","displayLength","lastSplit","lastDocSplit","isCode","$wrapAsCode","addSplit","displayed","minSplit","charCodeAt","getScreenTabSize","isFullWidth","maxScreenColumn","screenColumn","getRowLength","h","getRowLineCount","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","rowCache","doCache","splitIndex","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","defineOptions","$wrap","col","get","handlesSet","initialValue","firstLineNumber","useSoftTabs","HashHandler","CommandManager","platform","commands","byName","setDefaultHandler","command","$readOnly","readOnly","retvalue","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","keyUtil","KeyBinding","$editor","$data","$handlers","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","handleKeyboard","getKeyboardHandler","$callKeyboardHandlers","hashId","keyString","keyCode","toExecute","success","passEvent","stopEvent","onCommandKey","keyCodeToString","onTextInput","useragent","isMac","commandKeyBinding","__defineGetter__","__defineSetter__","warned","warn","commmandKeyBinding","addCommands","addCommand","removeCommand","bindKey","_buildKeyHash","ckb","keyPart","binding","parseKeys","removeCommands","bindKeys","keyList","FUNCTION_KEYS","KEY_MODS","findKeyCommand","ckbr","FoldHandler","getDocumentPosition","getAccelKey","gutterRegion","$gutterLayer","getRegion","isFocused","focus","scrollCursorIntoView","win","mac","init","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","prompt","gotoLine","getAllRanges","findNext","findPrevious","multiSelectAction","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","scrollBy","layerConfig","lineHeight","jumpToMatching","getSelectionRange","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","stopPropagation","propagationStopped","preventDefault","defaultPrevented","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","once","newCallback","handlers","_disabled_","disabled","removeDefaultHandler","capturing","off","removeAllListeners","$doc","hasUndo","dirtyCounter","$undoStack","$redoStack","NaN","undoSelectionRange","redoSelectionRange","hasRedo","markClean","isClean","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","head","getDocumentHead","s","createElement","appendChild","onload","_","isAbort","GutterLayer","Gutter","MarkerLayer","Marker","TextLayer","Text","CursorLayer","Cursor","HScrollBar","VScrollBar","RenderLoop","FontMetrics","editorCss","importCssString","container","theme","$keepTextAreaAtCursor","addCssClass","setTheme","$gutter","scroller","content","onGutterResize","$markerBack","textLayer","$textLayer","canvas","element","$markerFront","$cursorLayer","$horizScroll","$vScroll","scrollBar","scrollBarV","scrollBarH","$scrollAnimation","scrollMargin","top","left","cursorPos","$fontMetrics","updateCharacterSize","gutterWidth","$size","height","scrollerHeight","scrollerWidth","$dirty","padding","firstRowScreen","characterWidth","minHeight","maxHeight","gutterOffset","right","bottom","v","$loop","$renderChanges","ownerDocument","defaultView","CHANGE_FULL","setPadding","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_GUTTER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","allowBoldFonts","$allowBoldFonts","setStyle","getCharacterWidth","getLineHeight","$updatePrintMargin","onChangeNewLineMode","updateLines","$changedLines","$updateEolChar","onChangeTabSize","updateText","updateFull","updateFontSize","checkForSizeChanges","$changes","$updateSizeAsync","pending","resizing","clientHeight","scrollHeight","clientWidth","scrollWidth","changes","$updateCachedSize","$padding","$extraHeight","oldSize","getHeight","$showGutter","offsetWidth","getWidth","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","setAnimatedScroll","shouldAnimate","getAnimatedScroll","$animatedScroll","setShowInvisibles","showInvisibles","getShowInvisibles","getOption","getDisplayIndentGuides","setDisplayIndentGuides","display","setShowPrintMargin","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","getShowGutter","setShowGutter","show","getFadeFoldWidgets","setFadeFoldWidgets","setHighlightGutterLine","shouldHighlight","getHighlightGutterLine","$updateGutterLineHighlight","$pixelPos","getPixelPosition","$gutterLineHighlight","$printMarginEl","containerEl","insertBefore","firstChild","visibility","getContainerElement","getMouseEventTarget","getTextAreaContainer","$moveTextAreaToCursor","posTop","posLeft","$composition","textarea","getFirstVisibleRow","getFirstFullyVisibleRow","getLastFullyVisibleRow","flint","getLastVisibleRow","setScrollMargin","sm","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","setScrollHeight","$updateScrollBarH","setScrollWidth","$frozen","freeze","unfreeze","marginTop","marginLeft","$highlightGutterLine","scrollLines","$updateLines","$autosize","$maxLines","desiredHeight","$minLines","vScroll","setVisible","$gutterWidth","hideScrollbars","screenLines","longestLine","$getLongestLine","horizScroll","hScrollChanged","$scrollPastEnd","$vScrollBarAlwaysVisible","vScrollChanged","lineCount","ceil","round","firstRowHeight","charCount","updateFrontMarkers","setMarkers","updateBackMarkers","updateBreakpoints","updateCursor","hideCursor","showCursor","scrollSelectionIntoView","$viewMargin","topMargin","bottomMargin","getScrollTopRow","getScrollBottomRow","scrollToRow","alignCursor","alignment","STEPS","$calcSteps","fromValue","toValue","steps","func","t","x_min","dx","pow","scrollToLine","center","animate","initialScroll","animateScrolling","oldSteps","from","to","clearInterval","$timer","setInterval","scrollToY","scrollToX","scrollTo","deltaX","deltaY","isScrollableBy","pixelToScreenCoordinates","canvasPos","getBoundingClientRect","screenToTextCoordinates","textToScreenCoordinates","pageX","pageY","visualizeFocus","visualizeBlur","removeCssClass","showComposition","keepTextAreaAtCursor","cssText","setCompositionText","hideComposition","$themeId","afterLoad","cssClass","$theme","setCssClass","isDark","getTheme","unsetStyle","setCursorStyle","setMouseCursor","cursorStyle","destroy","animatedScroll","printMarginColumn","printMargin","showGutter","fadeFoldWidgets","showFoldWidgets","setShowFoldWidgets","showLineNumbers","setShowLineNumbers","displayIndentGuides","highlightGutterLine","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","fontSize","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","$fixedWidth","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","hasOwnProperty","moduleUrl","component","sep","setModuleUrl","subst","$loading","onLoad","moduleType","scriptOptions","scriptUrl","scripts","getElementsByTagName","script","getAttribute","attributes","attr","deHyphenate","m1","optionsProvider","optList","optionNames","result","opt","forwardTo","defaultOptions","obj","setDefaultValue","opts","setDefaultValues","optionHash","parentEl","$showFoldWidgets","$updateAnnotations","$cells","annotation","rowInfo","annoText","escapeHTML","breakpoints","decorations","$firstLineNumber","lastLineNumber","gutterRenderer","$renderer","cell","removeChild","textNode","foldWidget","createTextNode","getText","$computePadding","$showLineNumbers","getShowLineNumbers","getShowFoldWidgets","computedStyle","paddingLeft","paddingRight","rect","AUTOSCROLL_DELAY","SCROLL_CURSOR_DELAY","SCROLL_CURSOR_HYSTERESIS","DragdropHandler","mouseHandler","blankImage","isOpera","onMouseDown","mouseTarget","dragSelectionMarker","timerId","dragCursor","counter","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","onDragStart","cancelDrag","draggable","startSelect","captureMouse","dataTransfer","effectAllowed","getReadOnly","_top","offsetTop","setDragImage","clearData","setData","setState","onDragEnd","dropEffect","setBlinking","onDragEnter","canAccept","addDragMarker","getDropEffect","onDragOver","onMouseMoveTimer","clientX","clientY","onDragLeave","clearDragMarker","onDrop","dropData","getData","prevCursor","now","vMovement","hMovement","$blockScrolling","distance","calcDistance","autoScroll","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","hScroll","onDragInterval","getSelectionStyle","onMouseMove","some","copyAllowed","moveAllowed","copyModifierState","dragWait","interval","mousedownEvent","time","getDragDelay","startDrag","dragWaitEnd","selectEnd","dragReadyEnd","onMouseDrag","isIE","dragDrop","$dragEnabled","inSelection","button","getButton","clickCount","detail","inMultiSelectMode","getShiftKey","eventTarget","unselectable","isWebKit","ax","ay","bx","by","sqrt","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","setInnerHtml","stringBuilder","extraStyle","lineRange","extraLength","MouseEvent","$pos","$inSelection","selectionRange","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","getNewLineCharacter","$characterSize","measure","$pollSizeChanges","$pollSizeChangesTimer","$computeTabString","$tabStrings","tabStr","$indentGuideRe","spaceContent","tabContent","lineElements","childNodes","lineElementsIdx","lineElement","$renderLine","$useLineGroups","oldConfig","lastChild","fragment","$renderLinesFragment","createDocumentFragment","$textToken","rparen","lparen","$renderToken","replaceReg","replaceFunc","tabIdx","idx4","classToUse","space","output","classes","renderIndentGuide","cols","$renderWrappedLine","onlyContents","splitChars","$renderSimpleLine","$getFoldLineTokens","renderTokens","addTokens","$measureNode","parentNode","Tooltip","isOpen","$element","$parentNode","$init","getElement","setText","setInnerText","setHtml","setClassName","hide","offsetHeight","IE8","isVisible","isBlinking","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateVisibility","$updateOpacity","opacity","blinking","restartTimer","setBlinkInterval","setSmoothBlinking","removeCursor","intervalId","timeoutId","blink","onScreen","cursorLeft","cursorTop","selections","$selectionMarkers","cursorIndex","pixelPos","$setOverwrite","GutterHandler","gutter","tooltip","GutterTooltip","$clickSelection","tooltipTimeout","mouseEvent","tooltipAnnotation","showTooltip","hideTooltip","$tooltipFollowsMouse","moveTooltip","gutterElement","hasCssClass","isMousePressed","windowWidth","innerWidth","documentElement","windowHeight","innerHeight","ScrollBar","parent","classSuffix","inner","skipEvent","onScroll","$scrollbarWidth","scrollbarWidth","setHeight","setInnerHeight","setWidth","setInnerWidth","ScrollBarV","ScrollBarH","DRAG_OFFSET","DefaultHandlers","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","selectByLines","extendSelectionBy","selectByWords","ev","selectionEmpty","textInput","onContextMenu","$focusTimout","shiftPressed","setCapture","select","orientedRange","calcRangeOrientation","unitName","selectAllEnd","selectByWordsEnd","selectByLinesEnd","releaseCapture","focusWait","wheelY","wheelX","timeStamp","dt","$lastScrollTime","isScrolable","speed","onRender","change","nextFrame","DefaultGutterHandler","MouseHandler","onMouseEvent","addMultiMouseDownListener","addMouseWheelListener","gutterEl","mousemove","$scrollSpeed","mouseMoveHandler","$mouseMoved","onCaptureEnd","onCaptureInterval","$onCaptureMouseMove","releaseMouse","isOldIE","capture","scrollSpeed","dragDelay","dragEnabled","focusTimout","tooltipFollowsMouse","CHAR_COUNT","$setMeasureNodeStyles","$main","$testFractionalRect","textContent","isRoot","whiteSpace","font","overflow","$measureSizes","fontWeight","boldSize","charSizes","setPolling","$measureCharWidth","BROKEN_SETDATA","isChrome","TextInput","host","isTouchPad","setAttribute","autocorrect","autocapitalize","spellcheck","PLACEHOLDER","cut","copied","pasted","inComposition","tempStyle","isSelectionEmpty","activeElement","onBlur","onFocus","resetSelection","blur","syncSelection","syncValue","inputHandler","selectionStart","selectionEnd","resetValue","isAllSelected","createTextRange","collapse","moveStart","moveEnd","createRange","parentElement","inPropertyChange","onPropertyChange","syncProperty","sendText","keytable","13","27","onCompositionEnd","onCompositionUpdate","onCompositionStart","onSelect","setInputHandler","getInputHandler","afterContextMenu","onPaste","execCommand","source","onInput","onCut","getCopyText","clipboardData","supported","onCopy","addCommandKeyListener","lastValue","timer","compositionInputHandler","syncComposition","isGecko","setReadOnly","borderTopWidth","borderLeftWidth","maxTop","move","isWin","onContextMenuClose","string","count","trimBeginRegexp","trimEndRegexp","stringTrimLeft","stringTrimRight","copyArray","array","cons","constructor","arrayToMap","createMap","props","arrayRemove","deferredCall","fcn","deferred","timeout","isPending","defaultTimeout","delay","defaultCommands","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","oldRange","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","splitIntoLines","rectSel","toggleBlockSelection","rectangularRangeBlock","screenCursor","screenAnchor","includeEmptyLines","xBackwards","yBackwards","docEnd","isSamePoint","updateSelectionMarkers","addSelectionMarker","selectionMarkerCount","removeSelectionMarker","removeSelectionMarkers","markerList","$onMultiSelect","keyBinding","keyboardHandler","$onMultiSelectExec","$onSingleSelect","multiSelect","inVirtualMode","forEachSelection","exitMultiSelectMode","cmd","$byLines","inVirtualSelectionMode","reg","tmpSel","cmdResult","anim","onCursorChange","onSelectionChange","getSelectedText","buf","nl","additive","$search","selectMoreLines","skip","screenLead","newRange","toRemove","tmp","words","selectMore","alignCursors","fr","lr","guessRange","$reAlignText","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","d","forceLeft","isLeftAligned","isRightAligned","startW","textW","endW","alignLeft","alignRight","unAlign","onSessionChange","oldSession","$multiselectOnSessionChange","addAltCursorListeners","altCursor","enableMultiselect","$mouseHandler","$historyTracker","$initOperationListeners","_$emitInputEvent","startOperation","prev","prevOp","lastFileJumpPos","curOp","selectionChanged","endOperation","$opResetTimer","docChanged","commadEvent","previousCommand","$mergeUndoDeltas","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","$keybindingId","handler","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onScrollTopChange","onScrollLeftChange","oldEditor","getSession","getFontSize","setFontSize","$highlightBrackets","$bracketHighlight","$highlightPending","getCursorPosition","getMatching","$isFocused","$cursorChange","$updateHighlightActiveLine","$highlightActiveLine","$selectionStyle","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","startOuter","endOuter","lineCols","getBehavioursEnabled","transform","$mergeNextCommand","lineState","shouldOutdent","isNewLine","lineIndent","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","getHighlightActiveLine","setHighlightSelectedWord","getHighlightSelectedWord","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","getWrapBehavioursEnabled","fade","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","number","amount","charRange","parseFloat","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","endPoint","linesMoved","rangeIndex","isRowVisible","isRowFullyVisible","$getVisibleRowCount","$moveByPage","getCursorPositionScreen","preventScroll","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","$resetCursorStyle","$cursorStyle","cursorLayer","selectionStyle","highlightActiveLine","highlightSelectedWord","behavioursEnabled","wrapBehavioursEnabled","autoScrollEditorIntoView","foldStyle","alt","ctrl","isMultiSelect","mouseX","mouseY","onMouseSelection","blockSelect","newCursor","onMouseSelectionEnd","onSelectionInterval","OS","LINUX","MAC","WINDOWS","getOS","isLinux","navigator","os","ua","userAgent","appName","isMozilla","controllers","product","isOldGecko","opera","isAIR","isIPad","readonly","isAvailable","ctor","superCtor","super_","enumerable","writable","configurable","proto","WorkerClient","topLevelNamespaces","classname","workerUrl","$sendDeltaQueue","changeListener","onMessage","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","DOMException","blob","$workerBlob","URL","webkitURL","blobURL","createObjectURL","revokeObjectURL","postMessage","callbackId","callbacks","onmessage","msg","protocol","pathname","deltaQueue","emit","ex","attachToDocument","q","Blob","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","blobBuilder","getBlob","UIWorkerClient","messageBuffer","main","emitSync","sender","processNext","setEmitSync","Main","Keys","MODIFIER_KEYS","16","17","18","224","option","super","8","9","19","32","33","34","35","36","37","38","39","40","44","45","46","96","97","98","99","100","101","102","103","104","105","-13","112","113","114","115","116","117","118","119","120","121","122","123","144","145","PRINTABLE_KEYS","48","49","50","51","52","53","54","55","56","57","59","61","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","107","109","110","188","190","191","192","219","220","221","222","enter","escape","del","mods","String","fromCharCode","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","other","showOtherMarkers","othersActive","hideOtherMarkers","lengthDiff","distanceFromStart","otherPos","newPos","undosRequired","elem","attachEvent","wrapper","_wrapper","detachEvent","cancelBubble","1","2","4","eventHandler","releaseCaptureHandler","onMouseUp","factor","wheelDeltaX","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","timeouts","callbackName","clicks","startX","startY","eventNames","3","isNewClick","getModifierHash","getModifierString","normalizeCommandKeys","pressedKeys","altGr","keyLocation","ts","lastKeyDownKeyCode","lastDefaultPrevented","postMessageId","nextTick","messageName","listener","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","level","openingBracketBlock","closingBracketBlock","XHTML_NS","tag","createElementNS","toggleCssClass","node","hasCssString","sheets","createStyleSheet","styleSheets","owningElement","importCssStylsheet","link","rel","href","getInnerWidth","getInnerHeight","pageYOffset","getPageScrollTop","getPageScrollLeft","pageXOffset","body","getComputedStyle","currentStyle","minWidth","noScrollbar","withScrollbar","innerHtml","cloneNode","replaceChild","innerText","getParentWindow","parentWindow","Empty","Function","that","TypeError","bound","prototypeOfArray","prototypeOfObject","_toString","owns","defineGetter","defineSetter","lookupGetter","lookupSetter","supportsAccessors","__lookupGetter__","__lookupSetter__","makeArray","lengthBefore","array_splice","deleteCount","removeCount","tailOldPos","tailNewPos","tailCount","lengthAfterRemove","boxedString","splitString","object","toObject","thisp","every","reduce","reduceRight","sought","toInteger","lastIndexOf","getOwnPropertyDescriptor","ERR_NON_OBJECT","property","descriptor","getter","setter","getOwnPropertyNames","createEmpty","empty","propertyIsEnumerable","isPrototypeOf","toLocaleString","valueOf","properties","Type","defineProperties","doesDefinePropertyWork","defineProperty","exception","definePropertyWorksOnObject","definePropertyWorksOnDom","definePropertyFallback","ERR_NON_OBJECT_DESCRIPTOR","ERR_NON_OBJECT_TARGET","ERR_ACCESSORS_NOT_SUPPORTED","seal","freezeObject","preventExtensions","isSealed","isFrozen","isExtensible","hasDontEnumBug","dontEnums","dontEnumsLength","ii","dontEnum","getTime","ws","isPrimitive","toPrimitive","o","real","compliantExecNpcg","compliantLastIndexIncrement","r2","getNativeFlags","_xregexp","captureNames","multiline","extended","sticky","item","LineWidgets","binarySearch","comparator","findAnnotations","matched","widgetManager","oldWidget","gutterAnno","sc","fixedWidth","coverGutter","arrow","removeLineWidget","addLineWidget","onmousedown","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","_inDocument","$updateRows","noWidgets","zIndex","pixelHeight","onWidgetChanged","changedWidgets","coverLine","$lines","_insertLines","$split","$newLineMode","$clipPosition","firstLine","lastLine","insertNewLine","firstFullRow","lastFullRow","_removeLines","removeNewLine","newLine","secondLine","indexToPosition","newlineLength","positionToIndex","PythonHighlightRules","PythonFoldMode","tokenizedLine","outdents","pass","return","raise","break","continue","builtinConstants","builtinFunctions","keywordMapper","invalid.deprecated","support.function","constant.language","keyword","strPre","decimalInteger","octInteger","hexInteger","binInteger","integer","exponent","fraction","intPart","pointFloat","exponentFloat","floatNumber","stringEscape","qqstring3","qstring3","qqstring","qstring","BaseFoldMode","RHighlightRules","MatchingBraceOutdent","$outdent","TexHighlightRules","buildinConstants","rdRules","textClass","nospell","openBracePos"],"mappings":"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","file":"ace.min.js","sourcesContent":["/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() {\n return this;\n})();\n\n\nif (!ACE_NAMESPACE && typeof requirejs !== \"undefined\")\n return;\n\n\nvar _define = function(module, deps, payload) {\n if (typeof module !== 'string') {\n if (_define.original)\n _define.original.apply(window, arguments);\n else {\n console.error('dropping module because define wasn\\'t a string.');\n console.trace();\n }\n return;\n }\n\n if (arguments.length == 2)\n payload = deps;\n\n if (!_define.modules) {\n _define.modules = {};\n _define.payloads = {};\n }\n \n _define.payloads[module] = payload;\n _define.modules[module] = null;\n};\nvar _require = function(parentId, module, callback) {\n if (Object.prototype.toString.call(module) === \"[object Array]\") {\n var params = [];\n for (var i = 0, l = module.length; i < l; ++i) {\n var dep = lookup(parentId, module[i]);\n if (!dep && _require.original)\n return _require.original.apply(window, arguments);\n params.push(dep);\n }\n if (callback) {\n callback.apply(null, params);\n }\n }\n else if (typeof module === 'string') {\n var payload = lookup(parentId, module);\n if (!payload && _require.original)\n return _require.original.apply(window, arguments);\n\n if (callback) {\n callback();\n }\n\n return payload;\n }\n else {\n if (_require.original)\n return _require.original.apply(window, arguments);\n }\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n }\n if (moduleName.charAt(0) == \".\") {\n var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n moduleName = base + \"/\" + moduleName;\n\n while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n var previous = moduleName;\n moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n }\n }\n\n return moduleName;\n};\nvar lookup = function(parentId, moduleName) {\n\n moduleName = normalizeModule(parentId, moduleName);\n\n var module = _define.modules[moduleName];\n if (!module) {\n module = _define.payloads[moduleName];\n if (typeof module === 'function') {\n var exports = {};\n var mod = {\n id: moduleName,\n uri: '',\n exports: exports,\n packaged: true\n };\n\n var req = function(module, callback) {\n return _require(moduleName, module, callback);\n };\n\n var returnValue = module(req, exports, mod);\n exports = returnValue || mod.exports;\n _define.modules[moduleName] = exports;\n delete _define.payloads[moduleName];\n }\n module = _define.modules[moduleName] = exports || module;\n }\n return module;\n};\n\nfunction exportAce(ns) {\n var require = function(module, callback) {\n return _require(\"\", module, callback);\n }; \n\n var root = global;\n if (ns) {\n if (!global[ns])\n global[ns] = {};\n root = global[ns];\n }\n\n if (!root.define || !root.define.packaged) {\n _define.original = root.define;\n root.define = _define;\n root.define.packaged = true;\n }\n\n if (!root.require || !root.require.packaged) {\n _require.original = root.require;\n root.require = require;\n root.require.packaged = true;\n }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/placeholder', 'ace/mode/folding/fold_mode', 'ace/theme/textmate', 'ace/ext/error_marker', 'ace/config'], function(require, exports, module) {\n\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar MultiSelect = require(\"./multi_select\").MultiSelect;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\nrequire(\"./ext/error_marker\");\n\nexports.config = require(\"./config\");\nexports.require = require;\nexports.edit = function(el) {\n if (typeof(el) == \"string\") {\n var _id = el;\n var el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var doc = exports.createEditSession(dom.getInnerText(el));\n el.innerHTML = '';\n\n var editor = new Editor(new Renderer(el));\n new MultiSelect(editor);\n editor.setSession(doc);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n });\n el.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n}\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\n});\n\nace.define('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar Behaviour = function() {\n this.$behaviours = {};\n};\n\n(function () {\n\n this.add = function (name, action, callback) {\n switch (undefined) {\n case this.$behaviours:\n this.$behaviours = {};\n case this.$behaviours[name]:\n this.$behaviours[name] = {};\n }\n this.$behaviours[name][action] = callback;\n }\n \n this.addBehaviours = function (behaviours) {\n for (var key in behaviours) {\n for (var action in behaviours[key]) {\n this.add(key, action, behaviours[key][action]);\n }\n }\n }\n \n this.remove = function (name) {\n if (this.$behaviours && this.$behaviours[name]) {\n delete this.$behaviours[name];\n }\n }\n \n this.inherit = function (mode, filter) {\n if (typeof mode === \"function\") {\n var behaviours = new mode().getBehaviours(filter);\n } else {\n var behaviours = mode.getBehaviours(filter);\n }\n this.addBehaviours(behaviours);\n }\n \n this.getBehaviours = function (filter) {\n if (!filter) {\n return this.$behaviours;\n } else {\n var ret = {}\n for (var i = 0; i < filter.length; i++) {\n if (this.$behaviours[filter[i]]) {\n ret[filter[i]] = this.$behaviours[filter[i]];\n }\n }\n return ret;\n }\n }\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\nace.define('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) {\nexports.packages = {};\n\naddUnicodePackage({\n L: \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n M: \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n N: \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n P: \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n S: \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n Z: \"002000A01680180E2000-200A20282029202F205F3000\",\n Zs: \"002000A01680180E2000-200A202F205F3000\",\n Zl: \"2028\",\n Zp: \"2029\",\n C: \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n Cc: \"0000-001F007F-009F\",\n Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n Co: \"E000-F8FF\",\n Cs: \"D800-DFFF\",\n Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n var codePoint = /\\w{4}/g;\n for (var name in pack)\n exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n};\n\n});\n\nace.define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar TokenIterator = function(session, initialRow, initialColumn) {\n this.$session = session;\n this.$row = initialRow;\n this.$rowTokens = session.getTokens(initialRow);\n\n var token = session.getTokenAt(initialRow, initialColumn);\n this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n this.stepBackward = function() {\n this.$tokenIndex -= 1;\n \n while (this.$tokenIndex < 0) {\n this.$row -= 1;\n if (this.$row < 0) {\n this.$row = 0;\n return null;\n }\n \n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = this.$rowTokens.length - 1;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.stepForward = function() {\n this.$tokenIndex += 1;\n var rowCount;\n while (this.$tokenIndex >= this.$rowTokens.length) {\n this.$row += 1;\n if (!rowCount)\n rowCount = this.$session.getLength();\n if (this.$row >= rowCount) {\n this.$row = rowCount - 1;\n return null;\n }\n\n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = 0;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentToken = function () {\n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentTokenRow = function () {\n return this.$row;\n }; \n this.getCurrentTokenColumn = function() {\n var rowTokens = this.$rowTokens;\n var tokenIndex = this.$tokenIndex;\n var column = rowTokens[tokenIndex].start;\n if (column !== undefined)\n return column;\n \n column = 0;\n while (tokenIndex > 0) {\n tokenIndex -= 1;\n column += rowTokens[tokenIndex].value.length;\n }\n \n return column; \n };\n \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n this.$rules = {\n \"start\" : [{\n token : \"empty_line\",\n regex : '^$'\n }, {\n defaultToken : \"text\"\n }]\n };\n};\n\n(function() {\n\n this.addRules = function(rules, prefix) {\n if (!prefix) {\n for (var key in rules)\n this.$rules[key] = rules[key];\n return;\n }\n for (var key in rules) {\n var state = rules[key];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.next) {\n if (typeof rule.next != \"string\") {\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\n } else {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n\n }\n }\n this.$rules[prefix + key] = state;\n }\n };\n\n this.getRules = function() {\n return this.$rules;\n };\n\n this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n var embedRules = typeof HighlightRules == \"function\"\n ? new HighlightRules().getRules()\n : HighlightRules;\n if (states) {\n for (var i = 0; i < states.length; i++)\n states[i] = prefix + states[i];\n } else {\n states = [];\n for (var key in embedRules)\n states.push(prefix + key);\n }\n\n this.addRules(embedRules, prefix);\n\n if (escapeRules) {\n var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n for (var i = 0; i < states.length; i++)\n addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n }\n\n if (!this.$embeds)\n this.$embeds = [];\n this.$embeds.push(prefix);\n };\n\n this.getEmbeds = function() {\n return this.$embeds;\n };\n\n var pushState = function(currentState, stack) {\n if (currentState != \"start\" || stack.length)\n stack.unshift(this.nextState, currentState);\n return this.nextState;\n };\n var popState = function(currentState, stack) {\n stack.shift();\n return stack.shift() || \"start\";\n };\n\n this.normalizeRules = function() {\n var id = 0;\n var rules = this.$rules;\n function processState(key) {\n var state = rules[key];\n state.processed = true;\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (!rule.regex && rule.start) {\n rule.regex = rule.start;\n if (!rule.next)\n rule.next = [];\n rule.next.push({\n defaultToken: rule.token\n }, {\n token: rule.token + \".end\",\n regex: rule.end || rule.start,\n next: \"pop\"\n });\n rule.token = rule.token + \".start\";\n rule.push = true;\n }\n var next = rule.next || rule.push;\n if (next && Array.isArray(next)) {\n var stateName = rule.stateName;\n if (!stateName) {\n stateName = rule.token;\n if (typeof stateName != \"string\")\n stateName = stateName[0] || \"\";\n if (rules[stateName])\n stateName += id++;\n }\n rules[stateName] = next;\n rule.next = stateName;\n processState(stateName);\n } else if (next == \"pop\") {\n rule.next = popState;\n }\n\n if (rule.push) {\n rule.nextState = rule.next || rule.push;\n rule.next = pushState;\n delete rule.push;\n }\n\n if (rule.rules) {\n for (var r in rule.rules) {\n if (rules[r]) {\n if (rules[r].push)\n rules[r].push.apply(rules[r], rule.rules[r]);\n } else {\n rules[r] = rule.rules[r];\n }\n }\n }\n if (rule.include || typeof rule == \"string\") {\n var includeName = rule.include || rule;\n var toInsert = rules[includeName];\n } else if (Array.isArray(rule))\n toInsert = rule;\n\n if (toInsert) {\n var args = [i, 1].concat(toInsert);\n if (rule.noEscape)\n args = args.filter(function(x) {return !x.next;});\n state.splice.apply(state, args);\n i--;\n toInsert = null\n }\n \n if (rule.keywordMap) {\n rule.token = this.createKeywordMapper(\n rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n );\n delete rule.defaultToken;\n }\n }\n };\n Object.keys(rules).forEach(processState, this);\n };\n\n this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n var keywords = Object.create(null);\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n if (ignoreCase)\n a = a.toLowerCase();\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; )\n keywords[list[i]] = className;\n });\n if (Object.getPrototypeOf(keywords)) {\n keywords.__proto__ = null;\n }\n this.$keywordList = Object.keys(keywords);\n map = null;\n return ignoreCase\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n : function(value) {return keywords[value] || defaultToken };\n }\n\n this.getKeywords = function() {\n return this.$keywords;\n };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n \n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.getPosition = function() {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n this.getDocument = function() {\n return this.document;\n };\n this.$insertRight = false;\n this.onChange = function(e) {\n var delta = e.data;\n var range = delta.range;\n\n if (range.start.row == range.end.row && range.start.row != this.row)\n return;\n\n if (range.start.row > this.row)\n return;\n\n if (range.start.row == this.row && range.start.column > this.column)\n return;\n\n var row = this.row;\n var column = this.column;\n var start = range.start;\n var end = range.end;\n\n if (delta.action === \"insertText\") {\n if (start.row === row && start.column <= column) {\n if (start.column === column && this.$insertRight) {\n } else if (start.row === end.row) {\n column += end.column - start.column;\n } else {\n column -= start.column;\n row += end.row - start.row;\n }\n } else if (start.row !== end.row && start.row < row) {\n row += end.row - start.row;\n }\n } else if (delta.action === \"insertLines\") {\n if (start.row <= row) {\n row += end.row - start.row;\n }\n } else if (delta.action === \"removeText\") {\n if (start.row === row && start.column < column) {\n if (end.column >= column)\n column = start.column;\n else\n column = Math.max(0, column - (end.column - start.column));\n\n } else if (start.row !== end.row && start.row < row) {\n if (end.row === row)\n column = Math.max(0, column - end.column) + start.column;\n row -= (end.row - start.row);\n } else if (end.row === row) {\n row -= end.row - start.row;\n column = Math.max(0, column - end.column) + start.column;\n }\n } else if (delta.action == \"removeLines\") {\n if (start.row <= row) {\n if (end.row <= row)\n row -= end.row - start.row;\n else {\n row = start.row;\n column = 0;\n }\n }\n }\n\n this.setPosition(row, column, true);\n };\n this.setPosition = function(row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n } else {\n pos = this.$clipPositionToDocument(row, column);\n }\n\n if (this.row == pos.row && this.column == pos.column)\n return;\n\n var old = {\n row: this.row,\n column: this.column\n };\n\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n this.detach = function() {\n this.document.removeEventListener(\"change\", this.$onChange);\n };\n this.attach = function(doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n this.$clipPositionToDocument = function(row, column) {\n var pos = {};\n\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n\n if (column < 0)\n pos.column = 0;\n\n return pos;\n };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n this.running = false;\n this.lines = [];\n this.states = [];\n this.currentLine = 0;\n this.tokenizer = tokenizer;\n\n var self = this;\n\n this.$worker = function() {\n if (!self.running) { return; }\n\n var workerStart = new Date();\n var currentLine = self.currentLine;\n var endLine = -1;\n var doc = self.doc;\n\n while (self.lines[currentLine])\n currentLine++;\n\n var startLine = currentLine;\n\n var len = doc.getLength();\n var processedLines = 0;\n self.running = false;\n while (currentLine < len) {\n self.$tokenizeRow(currentLine);\n endLine = currentLine;\n do {\n currentLine++;\n } while (self.lines[currentLine]);\n processedLines ++;\n if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) { \n self.running = setTimeout(self.$worker, 20);\n self.currentLine = currentLine;\n return;\n }\n }\n self.currentLine = currentLine;\n \n if (startLine <= endLine)\n self.fireUpdateEvent(startLine, endLine);\n };\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n this.setTokenizer = function(tokenizer) {\n this.tokenizer = tokenizer;\n this.lines = [];\n this.states = [];\n\n this.start(0);\n };\n this.setDocument = function(doc) {\n this.doc = doc;\n this.lines = [];\n this.states = [];\n\n this.stop();\n };\n this.fireUpdateEvent = function(firstRow, lastRow) {\n var data = {\n first: firstRow,\n last: lastRow\n };\n this._signal(\"update\", {data: data});\n };\n this.start = function(startRow) {\n this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n this.lines.splice(this.currentLine, this.lines.length);\n this.states.splice(this.currentLine, this.states.length);\n\n this.stop();\n this.running = setTimeout(this.$worker, 700);\n };\n \n this.scheduleStart = function() {\n if (!this.running)\n this.running = setTimeout(this.$worker, 700);\n }\n\n this.$updateOnChange = function(delta) {\n var range = delta.range;\n var startRow = range.start.row;\n var len = range.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n this.lines.splice(startRow, len + 1, null);\n this.states.splice(startRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(startRow, 1);\n this.lines.splice.apply(this.lines, args);\n this.states.splice.apply(this.states, args);\n }\n\n this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n this.stop();\n };\n this.stop = function() {\n if (this.running)\n clearTimeout(this.running);\n this.running = false;\n };\n this.getTokens = function(row) {\n return this.lines[row] || this.$tokenizeRow(row);\n };\n this.getState = function(row) {\n if (this.currentLine == row)\n this.$tokenizeRow(row);\n return this.states[row] || \"start\";\n };\n\n this.$tokenizeRow = function(row) {\n var line = this.doc.getLine(row);\n var state = this.states[row - 1];\n\n var data = this.tokenizer.getLineTokens(line, state, row);\n\n if (this.states[row] + \"\" !== data.state + \"\") {\n this.states[row] = data.state;\n this.lines[row + 1] = null;\n if (this.currentLine > row + 1)\n this.currentLine = row + 1;\n } else if (this.currentLine == row) {\n this.currentLine = row + 1;\n }\n\n return this.lines[row] = data.tokens;\n };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {\n\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n this.setRegexp(regExp);\n this.clazz = clazz;\n this.type = type || \"text\";\n};\n\n(function() {\n this.MAX_RANGES = 500;\n \n this.setRegexp = function(regExp) {\n if (this.regExp+\"\" == regExp+\"\")\n return;\n this.regExp = regExp;\n this.cache = [];\n };\n\n this.update = function(html, markerLayer, session, config) {\n if (!this.regExp)\n return;\n var start = config.firstRow, end = config.lastRow;\n\n for (var i = start; i <= end; i++) {\n var ranges = this.cache[i];\n if (ranges == null) {\n ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n if (ranges.length > this.MAX_RANGES)\n ranges = ranges.slice(0, this.MAX_RANGES);\n ranges = ranges.map(function(match) {\n return new Range(i, match.offset, i, match.offset + match.length);\n });\n this.cache[i] = ranges.length ? ranges : \"\";\n }\n\n for (var j = ranges.length; j --; ) {\n markerLayer.drawSingleLineMarker(\n html, ranges[j].toScreenRange(session), this.clazz, config);\n }\n }\n };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar FoldLine = require(\"./fold_line\").FoldLine;\nvar Fold = require(\"./fold\").Fold;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n this.getFoldAt = function(row, column, side) {\n var foldLine = this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var folds = foldLine.folds;\n for (var i = 0; i < folds.length; i++) {\n var fold = folds[i];\n if (fold.range.contains(row, column)) {\n if (side == 1 && fold.range.isEnd(row, column)) {\n continue;\n } else if (side == -1 && fold.range.isStart(row, column)) {\n continue;\n }\n return fold;\n }\n }\n };\n this.getFoldsInRange = function(range) {\n var start = range.start;\n var end = range.end;\n var foldLines = this.$foldData;\n var foundFolds = [];\n\n start.column += 1;\n end.column -= 1;\n\n for (var i = 0; i < foldLines.length; i++) {\n var cmp = foldLines[i].range.compareRange(range);\n if (cmp == 2) {\n continue;\n }\n else if (cmp == -2) {\n break;\n }\n\n var folds = foldLines[i].folds;\n for (var j = 0; j < folds.length; j++) {\n var fold = folds[j];\n cmp = fold.range.compareRange(range);\n if (cmp == -2) {\n break;\n } else if (cmp == 2) {\n continue;\n } else\n if (cmp == 42) {\n break;\n }\n foundFolds.push(fold);\n }\n }\n start.column -= 1;\n end.column += 1;\n\n return foundFolds;\n };\n\n this.getFoldsInRangeList = function(ranges) {\n if (Array.isArray(ranges)) {\n var folds = [];\n ranges.forEach(function(range) {\n folds = folds.concat(this.getFoldsInRange(range));\n }, this);\n } else {\n var folds = this.getFoldsInRange(ranges);\n }\n return folds;\n }\n this.getAllFolds = function() {\n var folds = [];\n var foldLines = this.$foldData;\n \n for (var i = 0; i < foldLines.length; i++)\n for (var j = 0; j < foldLines[i].folds.length; j++)\n folds.push(foldLines[i].folds[j]);\n\n return folds;\n };\n this.getFoldStringAt = function(row, column, trim, foldLine) {\n foldLine = foldLine || this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var lastFold = {\n end: { column: 0 }\n };\n var str, fold;\n for (var i = 0; i < foldLine.folds.length; i++) {\n fold = foldLine.folds[i];\n var cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n str = this\n .getLine(fold.start.row)\n .substring(lastFold.end.column, fold.start.column);\n break;\n }\n else if (cmp === 0) {\n return null;\n }\n lastFold = fold;\n }\n if (!str)\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n if (trim == -1)\n return str.substring(0, column - lastFold.end.column);\n else if (trim == 1)\n return str.substring(column - lastFold.end.column);\n else\n return str;\n };\n\n this.getFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n return foldLine;\n } else if (foldLine.end.row > docRow) {\n return null;\n }\n }\n return null;\n };\n this.getNextFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.end.row >= docRow) {\n return foldLine;\n }\n }\n return null;\n };\n\n this.getFoldedRowCount = function(first, last) {\n var foldData = this.$foldData, rowCount = last-first+1;\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i],\n end = foldLine.end.row,\n start = foldLine.start.row;\n if (end >= last) {\n if(start < last) {\n if(start >= first)\n rowCount -= last-start;\n else\n rowCount = 0;//in one fold\n }\n break;\n } else if(end >= first){\n if (start >= first) //fold inside range\n rowCount -= end-start;\n else\n rowCount -= end-first+1;\n }\n }\n return rowCount;\n };\n\n this.$addFoldLine = function(foldLine) {\n this.$foldData.push(foldLine);\n this.$foldData.sort(function(a, b) {\n return a.start.row - b.start.row;\n });\n return foldLine;\n };\n this.addFold = function(placeholder, range) {\n var foldData = this.$foldData;\n var added = false;\n var fold;\n \n if (placeholder instanceof Fold)\n fold = placeholder;\n else {\n fold = new Fold(range, placeholder);\n fold.collapseChildren = range.collapseChildren;\n }\n this.$clipRangeToDocument(fold.range);\n\n var startRow = fold.start.row;\n var startColumn = fold.start.column;\n var endRow = fold.end.row;\n var endColumn = fold.end.column;\n if (!(startRow < endRow || \n startRow == endRow && startColumn <= endColumn - 2))\n throw new Error(\"The range has to be at least 2 characters width\");\n\n var startFold = this.getFoldAt(startRow, startColumn, 1);\n var endFold = this.getFoldAt(endRow, endColumn, -1);\n if (startFold && endFold == startFold)\n return startFold.addSubFold(fold);\n\n if (\n (startFold && !startFold.range.isStart(startRow, startColumn))\n || (endFold && !endFold.range.isEnd(endRow, endColumn))\n ) {\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + startFold.range);\n }\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\n }\n\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (endRow == foldLine.start.row) {\n foldLine.addFold(fold);\n added = true;\n break;\n } else if (startRow == foldLine.end.row) {\n foldLine.addFold(fold);\n added = true;\n if (!fold.sameRow) {\n var foldLineNext = foldData[i + 1];\n if (foldLineNext && foldLineNext.start.row == endRow) {\n foldLine.merge(foldLineNext);\n break;\n }\n }\n break;\n } else if (endRow <= foldLine.start.row) {\n break;\n }\n }\n\n if (!added)\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n if (this.$useWrapMode)\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n else\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n this.$modified = true;\n this._emit(\"changeFold\", { data: fold, action: \"add\" });\n\n return fold;\n };\n\n this.addFolds = function(folds) {\n folds.forEach(function(fold) {\n this.addFold(fold);\n }, this);\n };\n\n this.removeFold = function(fold) {\n var foldLine = fold.foldLine;\n var startRow = foldLine.start.row;\n var endRow = foldLine.end.row;\n\n var foldLines = this.$foldData;\n var folds = foldLine.folds;\n if (folds.length == 1) {\n foldLines.splice(foldLines.indexOf(foldLine), 1);\n } else\n if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n folds.pop();\n foldLine.end.row = folds[folds.length - 1].end.row;\n foldLine.end.column = folds[folds.length - 1].end.column;\n } else\n if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n folds.shift();\n foldLine.start.row = folds[0].start.row;\n foldLine.start.column = folds[0].start.column;\n } else\n if (fold.sameRow) {\n folds.splice(folds.indexOf(fold), 1);\n } else\n {\n var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n folds = newFoldLine.folds;\n folds.shift();\n newFoldLine.start.row = folds[0].start.row;\n newFoldLine.start.column = folds[0].start.column;\n }\n\n if (!this.$updating) {\n if (this.$useWrapMode)\n this.$updateWrapData(startRow, endRow);\n else\n this.$updateRowLengthCache(startRow, endRow);\n }\n this.$modified = true;\n this._emit(\"changeFold\", { data: fold, action: \"remove\" });\n };\n\n this.removeFolds = function(folds) {\n var cloneFolds = [];\n for (var i = 0; i < folds.length; i++) {\n cloneFolds.push(folds[i]);\n }\n\n cloneFolds.forEach(function(fold) {\n this.removeFold(fold);\n }, this);\n this.$modified = true;\n };\n\n this.expandFold = function(fold) {\n this.removeFold(fold);\n fold.subFolds.forEach(function(subFold) {\n fold.restoreRange(subFold);\n this.addFold(subFold);\n }, this);\n if (fold.collapseChildren > 0) {\n this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n }\n fold.subFolds = [];\n };\n\n this.expandFolds = function(folds) {\n folds.forEach(function(fold) {\n this.expandFold(fold);\n }, this);\n };\n\n this.unfold = function(location, expandInner) {\n var range, folds;\n if (location == null) {\n range = new Range(0, 0, this.getLength(), 0);\n expandInner = true;\n } else if (typeof location == \"number\")\n range = new Range(location, 0, location, this.getLine(location).length);\n else if (\"row\" in location)\n range = Range.fromPoints(location, location);\n else\n range = location;\n \n folds = this.getFoldsInRangeList(range);\n if (expandInner) {\n this.removeFolds(folds);\n } else {\n var subFolds = folds;\n while (subFolds.length) {\n this.expandFolds(subFolds);\n subFolds = this.getFoldsInRangeList(range);\n }\n }\n if (folds.length)\n return folds;\n };\n this.isRowFolded = function(docRow, startFoldRow) {\n return !!this.getFoldLine(docRow, startFoldRow);\n };\n\n this.getRowFoldEnd = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.end.row : docRow;\n };\n\n this.getRowFoldStart = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.start.row : docRow;\n };\n\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n if (startRow == null) {\n startRow = foldLine.start.row;\n startColumn = 0;\n }\n\n if (endRow == null) {\n endRow = foldLine.end.row;\n endColumn = this.getLine(endRow).length;\n }\n var doc = this.doc;\n var textLine = \"\";\n\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n if (row < startRow)\n return;\n if (row == startRow) {\n if (column < startColumn)\n return;\n lastColumn = Math.max(startColumn, lastColumn);\n }\n\n if (placeholder != null) {\n textLine += placeholder;\n } else {\n textLine += doc.getLine(row).substring(lastColumn, column);\n }\n }, endRow, endColumn);\n return textLine;\n };\n\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n var foldLine = this.getFoldLine(row);\n\n if (!foldLine) {\n var line;\n line = this.doc.getLine(row);\n return line.substring(startColumn || 0, endColumn || line.length);\n } else {\n return this.getFoldDisplayLine(\n foldLine, row, endColumn, startRow, startColumn);\n }\n };\n\n this.$cloneFoldData = function() {\n var fd = [];\n fd = this.$foldData.map(function(foldLine) {\n var folds = foldLine.folds.map(function(fold) {\n return fold.clone();\n });\n return new FoldLine(fd, folds);\n });\n\n return fd;\n };\n\n this.toggleFold = function(tryToUnfold) {\n var selection = this.selection;\n var range = selection.getRange();\n var fold;\n var bracketPos;\n\n if (range.isEmpty()) {\n var cursor = range.start;\n fold = this.getFoldAt(cursor.row, cursor.column);\n\n if (fold) {\n this.expandFold(fold);\n return;\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\n if (range.comparePoint(bracketPos) == 1) {\n range.end = bracketPos;\n } else {\n range.start = bracketPos;\n range.start.column++;\n range.end.column--;\n }\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n if (range.comparePoint(bracketPos) == 1)\n range.end = bracketPos;\n else\n range.start = bracketPos;\n\n range.start.column++;\n } else {\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n }\n } else {\n var folds = this.getFoldsInRange(range);\n if (tryToUnfold && folds.length) {\n this.expandFolds(folds);\n return;\n } else if (folds.length == 1 ) {\n fold = folds[0];\n }\n }\n\n if (!fold)\n fold = this.getFoldAt(range.start.row, range.start.column);\n\n if (fold && fold.range.toString() == range.toString()) {\n this.expandFold(fold);\n return;\n }\n\n var placeholder = \"...\";\n if (!range.isMultiLine()) {\n placeholder = this.getTextRange(range);\n if(placeholder.length < 4)\n return;\n placeholder = placeholder.trim().substring(0, 2) + \"..\";\n }\n\n this.addFold(placeholder, range);\n };\n\n this.getCommentFoldRange = function(row, column, dir) {\n var iterator = new TokenIterator(this, row, column);\n var token = iterator.getCurrentToken();\n if (token && /^comment|string/.test(token.type)) {\n var range = new Range();\n var re = new RegExp(token.type.replace(/\\..*/, \"\\\\.\"));\n if (dir != 1) {\n do {\n token = iterator.stepBackward();\n } while(token && re.test(token.type));\n iterator.stepForward();\n }\n \n range.start.row = iterator.getCurrentTokenRow();\n range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n iterator = new TokenIterator(this, row, column);\n \n if (dir != -1) {\n do {\n token = iterator.stepForward();\n } while(token && re.test(token.type));\n token = iterator.stepBackward();\n } else\n token = iterator.getCurrentToken();\n\n range.end.row = iterator.getCurrentTokenRow();\n range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n return range;\n }\n };\n\n this.foldAll = function(startRow, endRow, depth) {\n if (depth == undefined)\n depth = 100000; // JSON.stringify doesn't hanle Infinity\n var foldWidgets = this.foldWidgets;\n if (!foldWidgets)\n return; // mode doesn't support folding\n endRow = endRow || this.getLength();\n startRow = startRow || 0;\n for (var row = startRow; row < endRow; row++) {\n if (foldWidgets[row] == null)\n foldWidgets[row] = this.getFoldWidget(row);\n if (foldWidgets[row] != \"start\")\n continue;\n\n var range = this.getFoldWidgetRange(row);\n if (range && range.isMultiLine()\n && range.end.row <= endRow\n && range.start.row >= startRow\n ) {\n row = range.end.row;\n try {\n var fold = this.addFold(\"...\", range);\n if (fold)\n fold.collapseChildren = depth;\n } catch(e) {}\n }\n }\n };\n this.$foldStyles = {\n \"manual\": 1,\n \"markbegin\": 1,\n \"markbeginend\": 1\n };\n this.$foldStyle = \"markbegin\";\n this.setFoldStyle = function(style) {\n if (!this.$foldStyles[style])\n throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n \n if (this.$foldStyle == style)\n return;\n\n this.$foldStyle = style;\n \n if (style == \"manual\")\n this.unfold();\n var mode = this.$foldMode;\n this.$setFolding(null);\n this.$setFolding(mode);\n };\n\n this.$setFolding = function(foldMode) {\n if (this.$foldMode == foldMode)\n return;\n \n this.$foldMode = foldMode;\n \n this.removeListener('change', this.$updateFoldWidgets);\n this._emit(\"changeAnnotation\");\n \n if (!foldMode || this.$foldStyle == \"manual\") {\n this.foldWidgets = null;\n return;\n }\n \n this.foldWidgets = [];\n this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n \n this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n \n };\n\n this.getParentFoldRangeData = function (row, ignoreCurrent) {\n var fw = this.foldWidgets;\n if (!fw || (ignoreCurrent && fw[row]))\n return {};\n\n var i = row - 1, firstRange;\n while (i >= 0) {\n var c = fw[i];\n if (c == null)\n c = fw[i] = this.getFoldWidget(i);\n\n if (c == \"start\") {\n var range = this.getFoldWidgetRange(i);\n if (!firstRange)\n firstRange = range;\n if (range && range.end.row >= row)\n break;\n }\n i--;\n }\n\n return {\n range: i !== -1 && range,\n firstRange: firstRange\n };\n }\n\n this.onFoldWidgetClick = function(row, e) {\n e = e.domEvent;\n var options = {\n children: e.shiftKey,\n all: e.ctrlKey || e.metaKey,\n siblings: e.altKey\n };\n \n var range = this.$toggleFoldWidget(row, options);\n if (!range) {\n var el = (e.target || e.srcElement)\n if (el && /ace_fold-widget/.test(el.className))\n el.className += \" ace_invalid\";\n }\n };\n \n this.$toggleFoldWidget = function(row, options) {\n if (!this.getFoldWidget)\n return;\n var type = this.getFoldWidget(row);\n var line = this.getLine(row);\n\n var dir = type === \"end\" ? -1 : 1;\n var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n if (fold) {\n if (options.children || options.all)\n this.removeFold(fold);\n else\n this.expandFold(fold);\n return;\n }\n\n var range = this.getFoldWidgetRange(row, true);\n if (range && !range.isMultiLine()) {\n fold = this.getFoldAt(range.start.row, range.start.column, 1);\n if (fold && range.isEqual(fold.range)) {\n this.removeFold(fold);\n return;\n }\n }\n \n if (options.siblings) {\n var data = this.getParentFoldRangeData(row);\n if (data.range) {\n var startRow = data.range.start.row + 1;\n var endRow = data.range.end.row;\n }\n this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n } else if (options.children) {\n endRow = range ? range.end.row : this.getLength();\n this.foldAll(row + 1, range.end.row, options.all ? 10000 : 0);\n } else if (range) {\n if (options.all) \n range.collapseChildren = 10000;\n this.addFold(\"...\", range);\n }\n \n return range;\n };\n \n \n \n this.toggleFoldWidget = function(toggleParent) {\n var row = this.selection.getCursor().row;\n row = this.getRowFoldStart(row);\n var range = this.$toggleFoldWidget(row, {});\n \n if (range)\n return;\n var data = this.getParentFoldRangeData(row, true);\n range = data.range || data.firstRange;\n \n if (range) {\n row = range.start.row;\n var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n if (fold) {\n this.removeFold(fold);\n } else {\n this.addFold(\"...\", range);\n }\n }\n };\n\n this.updateFoldWidgets = function(e) {\n var delta = e.data;\n var range = delta.range;\n var firstRow = range.start.row;\n var len = range.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n this.foldWidgets.splice(firstRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(firstRow, 1);\n this.foldWidgets.splice.apply(this.foldWidgets, args);\n }\n };\n\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n this.foldData = foldData;\n if (Array.isArray(folds)) {\n this.folds = folds;\n } else {\n folds = this.folds = [ folds ];\n }\n\n var last = folds[folds.length - 1]\n this.range = new Range(folds[0].start.row, folds[0].start.column,\n last.end.row, last.end.column);\n this.start = this.range.start;\n this.end = this.range.end;\n\n this.folds.forEach(function(fold) {\n fold.setFoldLine(this);\n }, this);\n}\n\n(function() {\n this.shiftRow = function(shift) {\n this.start.row += shift;\n this.end.row += shift;\n this.folds.forEach(function(fold) {\n fold.start.row += shift;\n fold.end.row += shift;\n });\n }\n\n this.addFold = function(fold) {\n if (fold.sameRow) {\n if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n }\n this.folds.push(fold);\n this.folds.sort(function(a, b) {\n return -a.range.compareEnd(b.start.row, b.start.column);\n });\n if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n }\n } else if (fold.start.row == this.end.row) {\n this.folds.push(fold);\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (fold.end.row == this.start.row) {\n this.folds.unshift(fold);\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n } else {\n throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n }\n fold.foldLine = this;\n }\n\n this.containsRow = function(row) {\n return row >= this.start.row && row <= this.end.row;\n }\n\n this.walk = function(callback, endRow, endColumn) {\n var lastEnd = 0,\n folds = this.folds,\n fold,\n comp, stop, isNewRow = true;\n\n if (endRow == null) {\n endRow = this.end.row;\n endColumn = this.end.column;\n }\n\n for (var i = 0; i < folds.length; i++) {\n fold = folds[i];\n\n comp = fold.range.compareStart(endRow, endColumn);\n if (comp == -1) {\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n return;\n }\n\n stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n if (stop || comp == 0) {\n return;\n }\n isNewRow = !fold.sameRow;\n lastEnd = fold.end.column;\n }\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n }\n\n this.getNextFoldTo = function(row, column) {\n var fold, cmp;\n for (var i = 0; i < this.folds.length; i++) {\n fold = this.folds[i];\n cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n return {\n fold: fold,\n kind: \"after\"\n };\n } else if (cmp == 0) {\n return {\n fold: fold,\n kind: \"inside\"\n }\n }\n }\n return null;\n }\n\n this.addRemoveChars = function(row, column, len) {\n var ret = this.getNextFoldTo(row, column),\n fold, folds;\n if (ret) {\n fold = ret.fold;\n if (ret.kind == \"inside\"\n && fold.start.column != column\n && fold.start.row != row)\n {\n window.console && window.console.log(row, column, fold);\n } else if (fold.start.row == row) {\n folds = this.folds;\n var i = folds.indexOf(fold);\n if (i == 0) {\n this.start.column += len;\n }\n for (i; i < folds.length; i++) {\n fold = folds[i];\n fold.start.column += len;\n if (!fold.sameRow) {\n return;\n }\n fold.end.column += len;\n }\n this.end.column += len;\n }\n }\n }\n\n this.split = function(row, column) {\n var fold = this.getNextFoldTo(row, column).fold;\n var folds = this.folds;\n var foldData = this.foldData;\n\n if (!fold)\n return null;\n\n var i = folds.indexOf(fold);\n var foldBefore = folds[i - 1];\n this.end.row = foldBefore.end.row;\n this.end.column = foldBefore.end.column;\n folds = folds.splice(i, folds.length - i);\n\n var newFoldLine = new FoldLine(foldData, folds);\n foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n return newFoldLine;\n }\n\n this.merge = function(foldLineNext) {\n var folds = foldLineNext.folds;\n for (var i = 0; i < folds.length; i++) {\n this.addFold(folds[i]);\n }\n var foldData = this.foldData;\n foldData.splice(foldData.indexOf(foldLineNext), 1);\n }\n\n this.toString = function() {\n var ret = [this.range.toString() + \": [\" ];\n\n this.folds.forEach(function(fold) {\n ret.push(\" \" + fold.toString());\n });\n ret.push(\"]\")\n return ret.join(\"\\n\");\n }\n\n this.idxToPosition = function(idx) {\n var lastFoldEndColumn = 0;\n var fold;\n\n for (var i = 0; i < this.folds.length; i++) {\n var fold = this.folds[i];\n\n idx -= fold.start.column - lastFoldEndColumn;\n if (idx < 0) {\n return {\n row: fold.start.row,\n column: fold.start.column + idx\n };\n }\n\n idx -= fold.placeholder.length;\n if (idx < 0) {\n return fold.start;\n }\n\n lastFoldEndColumn = fold.end.column;\n }\n\n return {\n row: this.end.row,\n column: this.end.column + idx\n };\n }\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar MAX_TOKEN_COUNT = 1000;\nvar Tokenizer = function(rules) {\n this.states = rules;\n\n this.regExps = {};\n this.matchMappings = {};\n for (var key in this.states) {\n var state = this.states[key];\n var ruleRegExps = [];\n var matchTotal = 0;\n var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n var flag = \"g\";\n\n var splitterRurles = [];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.defaultToken)\n mapping.defaultToken = rule.defaultToken;\n if (rule.caseInsensitive)\n flag = \"gi\";\n if (rule.regex == null)\n continue;\n\n if (rule.regex instanceof RegExp)\n rule.regex = rule.regex.toString().slice(1, -1);\n var adjustedregex = rule.regex;\n var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n if (Array.isArray(rule.token)) {\n if (rule.token.length == 1 || matchcount == 1) {\n rule.token = rule.token[0];\n } else if (matchcount - 1 != rule.token.length) {\n throw new Error(\"number of classes and regexp groups in '\" + \n rule.token + \"'\\n'\" + rule.regex + \"' doesn't match\\n\"\n + (matchcount - 1) + \"!=\" + rule.token.length);\n } else {\n rule.tokenArray = rule.token;\n rule.token = null;\n rule.onMatch = this.$arrayTokens;\n }\n } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n if (matchcount > 1)\n rule.onMatch = this.$applyToken;\n else\n rule.onMatch = rule.token;\n }\n\n if (matchcount > 1) {\n if (/\\\\\\d/.test(rule.regex)) {\n adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n });\n } else {\n matchcount = 1;\n adjustedregex = this.removeCapturingGroups(rule.regex);\n }\n if (!rule.splitRegex && typeof rule.token != \"string\")\n splitterRurles.push(rule); // flag will be known only at the very end\n }\n\n mapping[matchTotal] = i;\n matchTotal += matchcount;\n\n ruleRegExps.push(adjustedregex);\n if (!rule.onMatch)\n rule.onMatch = null;\n rule.__proto__ = null;\n }\n \n splitterRurles.forEach(function(rule) {\n rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n }, this);\n\n this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n }\n};\n\n(function() {\n this.$setMaxTokenCount = function(m) {\n MAX_TOKEN_COUNT = m | 0;\n };\n \n this.$applyToken = function(str) {\n var values = this.splitRegex.exec(str).slice(1);\n var types = this.token.apply(this, values);\n if (typeof types === \"string\")\n return [{type: types, value: str}];\n\n var tokens = [];\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i]\n };\n }\n return tokens;\n },\n\n this.$arrayTokens = function(str) {\n if (!str)\n return [];\n var values = this.splitRegex.exec(str);\n if (!values)\n return \"text\";\n var tokens = [];\n var types = this.tokenArray;\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i + 1])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i + 1]\n };\n }\n return tokens;\n };\n\n this.removeCapturingGroups = function(src) {\n var r = src.replace(\n /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n function(x, y) {return y ? \"(?:\" : x;}\n );\n return r;\n };\n\n this.createSplitterRegexp = function(src, flag) {\n if (src.indexOf(\"(?=\") != -1) {\n var stack = 0;\n var inChClass = false;\n var lastCapture = {};\n src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n m, esc, parenOpen, parenClose, square, index\n ) {\n if (inChClass) {\n inChClass = square != \"]\";\n } else if (square) {\n inChClass = true;\n } else if (parenClose) {\n if (stack == lastCapture.stack) {\n lastCapture.end = index+1;\n lastCapture.stack = -1;\n }\n stack--;\n } else if (parenOpen) {\n stack++;\n if (parenOpen.length != 1) {\n lastCapture.stack = stack\n lastCapture.start = index;\n }\n }\n return m;\n });\n\n if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n }\n return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n };\n this.getLineTokens = function(line, startState) {\n if (startState && typeof startState != \"string\") {\n var stack = startState.slice(0);\n startState = stack[0];\n } else\n var stack = [];\n\n var currentState = startState || \"start\";\n var state = this.states[currentState];\n if (!state) {\n currentState = \"start\";\n state = this.states[currentState];\n }\n var mapping = this.matchMappings[currentState];\n var re = this.regExps[currentState];\n re.lastIndex = 0;\n\n var match, tokens = [];\n var lastIndex = 0;\n\n var token = {type: null, value: \"\"};\n\n while (match = re.exec(line)) {\n var type = mapping.defaultToken;\n var rule = null;\n var value = match[0];\n var index = re.lastIndex;\n\n if (index - value.length > lastIndex) {\n var skipped = line.substring(lastIndex, index - value.length);\n if (token.type == type) {\n token.value += skipped;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: skipped};\n }\n }\n\n for (var i = 0; i < match.length-2; i++) {\n if (match[i + 1] === undefined)\n continue;\n\n rule = state[mapping[i]];\n\n if (rule.onMatch)\n type = rule.onMatch(value, currentState, stack);\n else\n type = rule.token;\n\n if (rule.next) {\n if (typeof rule.next == \"string\")\n currentState = rule.next;\n else\n currentState = rule.next(currentState, stack);\n\n state = this.states[currentState];\n if (!state) {\n window.console && console.error && console.error(currentState, \"doesn't exist\");\n currentState = \"start\";\n state = this.states[currentState];\n }\n mapping = this.matchMappings[currentState];\n lastIndex = index;\n re = this.regExps[currentState];\n re.lastIndex = index;\n }\n break;\n }\n\n if (value) {\n if (typeof type == \"string\") {\n if ((!rule || rule.merge !== false) && token.type === type) {\n token.value += value;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: value};\n }\n } else if (type) {\n if (token.type)\n tokens.push(token);\n token = {type: null, value: \"\"};\n for (var i = 0; i < type.length; i++)\n tokens.push(type[i]);\n }\n }\n\n if (lastIndex == line.length)\n break;\n\n lastIndex = index;\n\n if (tokens.length > MAX_TOKEN_COUNT) {\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 2000),\n type: \"overflow\"\n };\n }\n currentState = \"start\";\n stack = [];\n break;\n }\n }\n\n if (token.type)\n tokens.push(token);\n \n if (stack.length > 1) {\n if (stack[0] !== currentState)\n stack.unshift(currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n\n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar RangeList = require(\"../range_list\").RangeList;\nvar oop = require(\"../lib/oop\")\nvar Fold = exports.Fold = function(range, placeholder) {\n this.foldLine = null;\n this.placeholder = placeholder;\n this.range = range;\n this.start = range.start;\n this.end = range.end;\n\n this.sameRow = range.start.row == range.end.row;\n this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n this.toString = function() {\n return '\"' + this.placeholder + '\" ' + this.range.toString();\n };\n\n this.setFoldLine = function(foldLine) {\n this.foldLine = foldLine;\n this.subFolds.forEach(function(fold) {\n fold.setFoldLine(foldLine);\n });\n };\n\n this.clone = function() {\n var range = this.range.clone();\n var fold = new Fold(range, this.placeholder);\n this.subFolds.forEach(function(subFold) {\n fold.subFolds.push(subFold.clone());\n });\n fold.collapseChildren = this.collapseChildren;\n return fold;\n };\n\n this.addSubFold = function(fold) {\n if (this.range.isEqual(fold))\n return;\n\n if (!this.range.containsRange(fold))\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n consumeRange(fold, this.start);\n\n var row = fold.start.row, column = fold.start.column;\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n cmp = this.subFolds[i].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterStart = this.subFolds[i];\n\n if (cmp == 0)\n return afterStart.addSubFold(fold);\n var row = fold.range.end.row, column = fold.range.end.column;\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n cmp = this.subFolds[j].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterEnd = this.subFolds[j];\n\n if (cmp == 0)\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n fold.setFoldLine(this.foldLine);\n\n return fold;\n };\n \n this.restoreRange = function(range) {\n return restoreRange(range, this.start);\n };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n point.row -= anchor.row;\n if (point.row == 0)\n point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n consumePoint(range.start, anchor);\n consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n if (point.row == 0)\n point.column += anchor.column;\n point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n restorePoint(range.start, anchor);\n restorePoint(range.end, anchor);\n}\n\n});\n\nace.define('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) {\n\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar Behaviour = require(\"./behaviour\").Behaviour;\nvar unicode = require(\"../unicode\");\nvar lang = require(\"../lib/lang\");\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = TextHighlightRules;\n this.$behaviour = new Behaviour();\n};\n\n(function() {\n\n this.tokenRe = new RegExp(\"^[\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n );\n\n this.nonTokenRe = new RegExp(\"^(?:[^\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n );\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = new this.HighlightRules();\n this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n }\n return this.$tokenizer;\n };\n\n this.lineCommentStart = \"\";\n this.blockComment = \"\";\n\n this.toggleCommentLines = function(state, session, startRow, endRow) {\n var doc = session.doc;\n\n var ignoreBlankLines = true;\n var shouldRemove = true;\n var minIndent = Infinity;\n var tabSize = session.getTabSize();\n var insertAtTabStop = false;\n\n if (!this.lineCommentStart) {\n if (!this.blockComment)\n return false;\n var lineCommentStart = this.blockComment.start;\n var lineCommentEnd = this.blockComment.end;\n var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n var comment = function(line, i) {\n if (testRemove(line, i))\n return;\n if (!ignoreBlankLines || /\\S/.test(line)) {\n doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n\n var uncomment = function(line, i) {\n var m;\n if (m = line.match(regexpEnd))\n doc.removeInLine(i, line.length - m[0].length, line.length);\n if (m = line.match(regexpStart))\n doc.removeInLine(i, m[1].length, m[0].length);\n };\n\n var testRemove = function(line, row) {\n if (regexpStart.test(line))\n return true;\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].type === 'comment')\n return true;\n }\n };\n } else {\n if (Array.isArray(this.lineCommentStart)) {\n var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n var lineCommentStart = this.lineCommentStart[0];\n } else {\n var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n var lineCommentStart = this.lineCommentStart;\n }\n regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n \n insertAtTabStop = session.getUseSoftTabs();\n\n var uncomment = function(line, i) {\n var m = line.match(regexpStart);\n if (!m) return;\n var start = m[1].length, end = m[0].length;\n if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n end--;\n doc.removeInLine(i, start, end);\n };\n var commentWithSpace = lineCommentStart + \" \";\n var comment = function(line, i) {\n if (!ignoreBlankLines || /\\S/.test(line)) {\n if (shouldInsertSpace(line, minIndent, minIndent))\n doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n else\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n var testRemove = function(line, i) {\n return regexpStart.test(line);\n };\n \n var shouldInsertSpace = function(line, before, after) {\n var spaces = 0;\n while (before-- && line.charAt(before) == \" \")\n spaces++;\n if (spaces % tabSize != 0)\n return false;\n var spaces = 0;\n while (line.charAt(after++) == \" \")\n spaces++;\n if (tabSize > 2)\n return spaces % tabSize != tabSize - 1;\n else\n return spaces % tabSize == 0;\n return true;\n };\n }\n\n function iter(fun) {\n for (var i = startRow; i <= endRow; i++)\n fun(doc.getLine(i), i);\n }\n\n\n var minEmptyLength = Infinity;\n iter(function(line, i) {\n var indent = line.search(/\\S/);\n if (indent !== -1) {\n if (indent < minIndent)\n minIndent = indent;\n if (shouldRemove && !testRemove(line, i))\n shouldRemove = false;\n } else if (minEmptyLength > line.length) {\n minEmptyLength = line.length;\n }\n });\n\n if (minIndent == Infinity) {\n minIndent = minEmptyLength;\n ignoreBlankLines = false;\n shouldRemove = false;\n }\n\n if (insertAtTabStop && minIndent % tabSize != 0)\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n iter(shouldRemove ? uncomment : comment);\n };\n\n this.toggleBlockComment = function(state, session, range, cursor) {\n var comment = this.blockComment;\n if (!comment)\n return;\n if (!comment.start && comment[0])\n comment = comment[0];\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n\n var sel = session.selection;\n var initialRange = session.selection.toOrientedRange();\n var startRow, colDiff;\n\n if (token && /comment/.test(token.type)) {\n var startRange, endRange;\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.start);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n startRange = new Range(row, column, row, column + comment.start.length);\n break;\n }\n token = iterator.stepBackward();\n }\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.end);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n endRange = new Range(row, column, row, column + comment.end.length);\n break;\n }\n token = iterator.stepForward();\n }\n if (endRange)\n session.remove(endRange);\n if (startRange) {\n session.remove(startRange);\n startRow = startRange.start.row;\n colDiff = -comment.start.length;\n }\n } else {\n colDiff = comment.start.length;\n startRow = range.start.row;\n session.insert(range.end, comment.end);\n session.insert(range.start, comment.start);\n }\n if (initialRange.start.row == startRow)\n initialRange.start.column += colDiff;\n if (initialRange.end.row == startRow)\n initialRange.end.column += colDiff;\n session.selection.fromOrientedRange(initialRange);\n };\n\n this.getNextLineIndent = function(state, line, tab) {\n return this.$getIndent(line);\n };\n\n this.checkOutdent = function(state, line, input) {\n return false;\n };\n\n this.autoOutdent = function(state, doc, row) {\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n this.createWorker = function(session) {\n return null;\n };\n\n this.createModeDelegates = function (mapping) {\n this.$embeds = [];\n this.$modes = {};\n for (var i in mapping) {\n if (mapping[i]) {\n this.$embeds.push(i);\n this.$modes[i] = new mapping[i]();\n }\n }\n\n var delegations = ['toggleBlockComment', 'toggleCommentLines', 'getNextLineIndent', \n 'checkOutdent', 'autoOutdent', 'transformAction', 'getCompletions'];\n\n for (var i = 0; i < delegations.length; i++) {\n (function(scope) {\n var functionName = delegations[i];\n var defaultHandler = scope[functionName];\n scope[delegations[i]] = function() {\n return this.$delegator(functionName, arguments, defaultHandler);\n };\n } (this));\n }\n };\n\n this.$delegator = function(method, args, defaultHandler) {\n var state = args[0];\n if (typeof state != \"string\")\n state = state[0];\n for (var i = 0; i < this.$embeds.length; i++) {\n if (!this.$modes[this.$embeds[i]]) continue;\n\n var split = state.split(this.$embeds[i]);\n if (!split[0] && split[1]) {\n args[0] = split[1];\n var mode = this.$modes[this.$embeds[i]];\n return mode[method].apply(mode, args);\n }\n }\n var ret = defaultHandler.apply(this, args);\n return defaultHandler ? ret : undefined;\n };\n\n this.transformAction = function(state, action, editor, session, param) {\n if (this.$behaviour) {\n var behaviours = this.$behaviour.getBehaviours();\n for (var key in behaviours) {\n if (behaviours[key][action]) {\n var ret = behaviours[key][action].apply(this, arguments);\n if (ret) {\n return ret;\n }\n }\n }\n }\n };\n \n this.getKeywords = function(append) {\n if (!this.completionKeywords) {\n var rules = this.$tokenizer.rules;\n var completionKeywords = [];\n for (var rule in rules) {\n var ruleItr = rules[rule];\n for (var r = 0, l = ruleItr.length; r < l; r++) {\n if (typeof ruleItr[r].token === \"string\") {\n if (/keyword|support|storage/.test(ruleItr[r].token))\n completionKeywords.push(ruleItr[r].regex);\n }\n else if (typeof ruleItr[r].token === \"object\") {\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n completionKeywords.push(rule.substr(1, rule.length - 2));\n }\n }\n }\n }\n }\n this.completionKeywords = completionKeywords;\n }\n if (!append)\n return this.$keywordList;\n return completionKeywords.concat(this.$keywordList || []);\n };\n \n this.$createKeywordList = function() {\n if (!this.$highlightRules)\n this.getTokenizer();\n return this.$keywordList = this.$highlightRules.$keywordList || [];\n };\n\n this.getCompletions = function(state, session, pos, prefix) {\n var keywords = this.$keywordList || this.$createKeywordList();\n return keywords.map(function(word) {\n return {\n name: word,\n value: word,\n score: 0,\n meta: \"keyword\"\n };\n });\n };\n\n this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\nvar Range = require(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n};\n\n(function() {\n this.comparePoints = comparePoints;\n\n this.pointIndex = function(pos, excludeEdges, startIndex) {\n var list = this.ranges;\n\n for (var i = startIndex || 0; i < list.length; i++) {\n var range = list[i];\n var cmpEnd = comparePoints(pos, range.end);\n if (cmpEnd > 0)\n continue;\n var cmpStart = comparePoints(pos, range.start);\n if (cmpEnd === 0)\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n return i;\n\n return -i-1;\n }\n return -i - 1;\n };\n\n this.add = function(range) {\n var excludeEdges = !range.isEmpty();\n var startIndex = this.pointIndex(range.start, excludeEdges);\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n else\n endIndex++;\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\n };\n\n this.addList = function(list) {\n var removed = [];\n for (var i = list.length; i--; ) {\n removed.push.call(removed, this.add(list[i]));\n }\n return removed;\n };\n\n this.substractPoint = function(pos) {\n var i = this.pointIndex(pos);\n\n if (i >= 0)\n return this.ranges.splice(i, 1);\n };\n this.merge = function() {\n var removed = [];\n var list = this.ranges;\n \n list = list.sort(function(a, b) {\n return comparePoints(a.start, b.start);\n });\n \n var next = list[0], range;\n for (var i = 1; i < list.length; i++) {\n range = next;\n next = list[i];\n var cmp = comparePoints(range.end, next.start);\n if (cmp < 0)\n continue;\n\n if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n continue;\n\n if (comparePoints(range.end, next.end) < 0) {\n range.end.row = next.end.row;\n range.end.column = next.end.column;\n }\n\n list.splice(i, 1);\n removed.push(next);\n next = range;\n i--;\n }\n \n this.ranges = list;\n\n return removed;\n };\n\n this.contains = function(row, column) {\n return this.pointIndex({row: row, column: column}) >= 0;\n };\n\n this.containsPoint = function(pos) {\n return this.pointIndex(pos) >= 0;\n };\n\n this.rangeAtPoint = function(pos) {\n var i = this.pointIndex(pos);\n if (i >= 0)\n return this.ranges[i];\n };\n\n\n this.clipRows = function(startRow, endRow) {\n var list = this.ranges;\n if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n return [];\n\n var startIndex = this.pointIndex({row: startRow, column: 0});\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n\n var clipped = [];\n for (var i = startIndex; i < endIndex; i++) {\n clipped.push(list[i]);\n }\n return clipped;\n };\n\n this.removeAll = function() {\n return this.ranges.splice(0, this.ranges.length);\n };\n\n this.attach = function(session) {\n if (this.session)\n this.detach();\n\n this.session = session;\n this.onChange = this.$onChange.bind(this);\n\n this.session.on('change', this.onChange);\n };\n\n this.detach = function() {\n if (!this.session)\n return;\n this.session.removeListener('change', this.onChange);\n this.session = null;\n };\n\n this.$onChange = function(e) {\n var changeRange = e.data.range;\n if (e.data.action[0] == \"i\"){\n var start = changeRange.start;\n var end = changeRange.end;\n } else {\n var end = changeRange.start;\n var start = changeRange.end;\n }\n var startRow = start.row;\n var endRow = end.row;\n var lineDif = endRow - startRow;\n\n var colDiff = -start.column + end.column;\n var ranges = this.ranges;\n\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row < startRow)\n continue;\n if (r.start.row > startRow)\n break;\n\n if (r.start.row == startRow && r.start.column >= start.column ) {\n if (r.start.column == start.column && this.$insertRight) {\n } else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n if (r.end.row == startRow && r.end.column >= start.column) {\n if (r.end.column == start.column && this.$insertRight) {\n continue;\n }\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n r.end.column -= colDiff;\n }\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n\n if (lineDif != 0 && i < n) {\n for (; i < n; i++) {\n var r = ranges[i];\n r.start.row += lineDif;\n r.end.row += lineDif;\n }\n }\n };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nvar comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n this.start = {\n row: startRow,\n column: startColumn\n };\n\n this.end = {\n row: endRow,\n column: endColumn\n };\n};\n\n(function() {\n this.isEqual = function(range) {\n return this.start.row === range.start.row &&\n this.end.row === range.end.row &&\n this.start.column === range.start.column &&\n this.end.column === range.end.column;\n };\n this.toString = function() {\n return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n };\n\n this.contains = function(row, column) {\n return this.compare(row, column) == 0;\n };\n this.compareRange = function(range) {\n var cmp,\n end = range.end,\n start = range.start;\n\n cmp = this.compare(end.row, end.column);\n if (cmp == 1) {\n cmp = this.compare(start.row, start.column);\n if (cmp == 1) {\n return 2;\n } else if (cmp == 0) {\n return 1;\n } else {\n return 0;\n }\n } else if (cmp == -1) {\n return -2;\n } else {\n cmp = this.compare(start.row, start.column);\n if (cmp == -1) {\n return -1;\n } else if (cmp == 1) {\n return 42;\n } else {\n return 0;\n }\n }\n };\n this.comparePoint = function(p) {\n return this.compare(p.row, p.column);\n };\n this.containsRange = function(range) {\n return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n };\n this.intersects = function(range) {\n var cmp = this.compareRange(range);\n return (cmp == -1 || cmp == 0 || cmp == 1);\n };\n this.isEnd = function(row, column) {\n return this.end.row == row && this.end.column == column;\n };\n this.isStart = function(row, column) {\n return this.start.row == row && this.start.column == column;\n };\n this.setStart = function(row, column) {\n if (typeof row == \"object\") {\n this.start.column = row.column;\n this.start.row = row.row;\n } else {\n this.start.row = row;\n this.start.column = column;\n }\n };\n this.setEnd = function(row, column) {\n if (typeof row == \"object\") {\n this.end.column = row.column;\n this.end.row = row.row;\n } else {\n this.end.row = row;\n this.end.column = column;\n }\n };\n this.inside = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column) || this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideStart = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideEnd = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.compare = function(row, column) {\n if (!this.isMultiLine()) {\n if (row === this.start.row) {\n return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n };\n }\n\n if (row < this.start.row)\n return -1;\n\n if (row > this.end.row)\n return 1;\n\n if (this.start.row === row)\n return column >= this.start.column ? 0 : -1;\n\n if (this.end.row === row)\n return column <= this.end.column ? 0 : 1;\n\n return 0;\n };\n this.compareStart = function(row, column) {\n if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareEnd = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareInside = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.clipRows = function(firstRow, lastRow) {\n if (this.end.row > lastRow)\n var end = {row: lastRow + 1, column: 0};\n else if (this.end.row < firstRow)\n var end = {row: firstRow, column: 0};\n\n if (this.start.row > lastRow)\n var start = {row: lastRow + 1, column: 0};\n else if (this.start.row < firstRow)\n var start = {row: firstRow, column: 0};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n this.extend = function(row, column) {\n var cmp = this.compare(row, column);\n\n if (cmp == 0)\n return this;\n else if (cmp == -1)\n var start = {row: row, column: column};\n else\n var end = {row: row, column: column};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n\n this.isEmpty = function() {\n return (this.start.row === this.end.row && this.start.column === this.end.column);\n };\n this.isMultiLine = function() {\n return (this.start.row !== this.end.row);\n };\n this.clone = function() {\n return Range.fromPoints(this.start, this.end);\n };\n this.collapseRows = function() {\n if (this.end.column == 0)\n return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n else\n return new Range(this.start.row, 0, this.end.row, 0)\n };\n this.toScreenRange = function(session) {\n var screenPosStart = session.documentToScreenPosition(this.start);\n var screenPosEnd = session.documentToScreenPosition(this.end);\n\n return new Range(\n screenPosStart.row, screenPosStart.column,\n screenPosEnd.row, screenPosEnd.column\n );\n };\n this.moveBy = function(row, column) {\n this.start.row += row;\n this.start.column += column;\n this.end.row += row;\n this.end.column += column;\n };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) {\n\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n this.findMatchingBracket = function(position, chr) {\n if (position.column == 0) return null;\n\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n if (charBeforeCursor == \"\") return null;\n\n var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match)\n return null;\n\n if (match[1])\n return this.$findClosingBracket(match[1], position);\n else\n return this.$findOpeningBracket(match[2], position);\n };\n \n this.getBracketRange = function(pos) {\n var line = this.getLine(pos.row);\n var before = true, range;\n\n var chr = line.charAt(pos.column-1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n before = false;\n }\n if (!match)\n return null;\n\n if (match[1]) {\n var bracketPos = this.$findClosingBracket(match[1], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(pos, bracketPos);\n if (!before) {\n range.end.column++;\n range.start.column--;\n }\n range.cursor = range.end;\n } else {\n var bracketPos = this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(bracketPos, pos);\n if (!before) {\n range.start.column++;\n range.end.column--;\n }\n range.cursor = range.start;\n }\n \n return range;\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\n \"]\": \"[\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"}\": \"{\"\n };\n\n this.$findOpeningBracket = function(bracket, position, typeRe) {\n var openBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n \n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n var value = token.value;\n \n while (true) {\n \n while (valueIndex >= 0) {\n var chr = value.charAt(valueIndex);\n if (chr == openBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex -= 1;\n }\n do {\n token = iterator.stepBackward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n \n value = token.value;\n valueIndex = value.length - 1;\n }\n \n return null;\n };\n\n this.$findClosingBracket = function(bracket, position, typeRe) {\n var closingBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n\n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n while (true) {\n\n var value = token.value;\n var valueLength = value.length;\n while (valueIndex < valueLength) {\n var chr = value.charAt(valueIndex);\n if (chr == closingBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex += 1;\n }\n do {\n token = iterator.stepForward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n\n valueIndex = 0;\n }\n \n return null;\n };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Selection = function(session) {\n this.session = session;\n this.doc = session.getDocument();\n\n this.clearSelection();\n this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n var self = this;\n this.lead.on(\"change\", function(e) {\n self._emit(\"changeCursor\");\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.selectionAnchor.on(\"change\", function() {\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n });\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.isEmpty = function() {\n return (this.$isEmpty || (\n this.anchor.row == this.lead.row &&\n this.anchor.column == this.lead.column\n ));\n };\n this.isMultiLine = function() {\n if (this.isEmpty()) {\n return false;\n }\n\n return this.getRange().isMultiLine();\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.anchor.setPosition(row, column);\n\n if (this.$isEmpty) {\n this.$isEmpty = false;\n this._emit(\"changeSelection\");\n }\n };\n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead()\n else\n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\n };\n this.shiftSelection = function(columns) {\n if (this.$isEmpty) {\n this.moveCursorTo(this.lead.row, this.lead.column + columns);\n return;\n };\n\n var anchor = this.getSelectionAnchor();\n var lead = this.getSelectionLead();\n\n var isBackwards = this.isBackwards();\n\n if (!isBackwards || anchor.column !== 0)\n this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n if (isBackwards || lead.column !== 0) {\n this.$moveSelection(function() {\n this.moveCursorTo(lead.row, lead.column + columns);\n });\n }\n };\n this.isBackwards = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n };\n this.getRange = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n\n if (this.isEmpty())\n return Range.fromPoints(lead, lead);\n\n if (this.isBackwards()) {\n return Range.fromPoints(lead, anchor);\n }\n else {\n return Range.fromPoints(anchor, lead);\n }\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n var lastRow = this.doc.getLength() - 1;\n this.setSelectionAnchor(0, 0);\n this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n if (reverse) {\n this.setSelectionAnchor(range.end.row, range.end.column);\n this.selectTo(range.start.row, range.start.column);\n } else {\n this.setSelectionAnchor(range.start.row, range.start.column);\n this.selectTo(range.end.row, range.end.column);\n }\n if (this.getRange().isEmpty())\n this.$isEmpty = true;\n this.$desiredColumn = null;\n };\n\n this.$moveSelection = function(mover) {\n var lead = this.lead;\n if (this.$isEmpty)\n this.setSelectionAnchor(lead.row, lead.column);\n\n mover.call(this);\n };\n this.selectTo = function(row, column) {\n this.$moveSelection(function() {\n this.moveCursorTo(row, column);\n });\n };\n this.selectToPosition = function(pos) {\n this.$moveSelection(function() {\n this.moveCursorToPosition(pos);\n });\n };\n this.moveTo = function(row, column) {\n this.clearSelection();\n this.moveCursorTo(row, column);\n };\n this.moveToPosition = function(pos) {\n this.clearSelection();\n this.moveCursorToPosition(pos);\n };\n this.selectUp = function() {\n this.$moveSelection(this.moveCursorUp);\n };\n this.selectDown = function() {\n this.$moveSelection(this.moveCursorDown);\n };\n this.selectRight = function() {\n this.$moveSelection(this.moveCursorRight);\n };\n this.selectLeft = function() {\n this.$moveSelection(this.moveCursorLeft);\n };\n this.selectLineStart = function() {\n this.$moveSelection(this.moveCursorLineStart);\n };\n this.selectLineEnd = function() {\n this.$moveSelection(this.moveCursorLineEnd);\n };\n this.selectFileEnd = function() {\n this.$moveSelection(this.moveCursorFileEnd);\n };\n this.selectFileStart = function() {\n this.$moveSelection(this.moveCursorFileStart);\n };\n this.selectWordRight = function() {\n this.$moveSelection(this.moveCursorWordRight);\n };\n this.selectWordLeft = function() {\n this.$moveSelection(this.moveCursorWordLeft);\n };\n this.getWordRange = function(row, column) {\n if (typeof column == \"undefined\") {\n var cursor = row || this.lead;\n row = cursor.row;\n column = cursor.column;\n }\n return this.session.getWordRange(row, column);\n };\n this.selectWord = function() {\n this.setSelectionRange(this.getWordRange());\n };\n this.selectAWord = function() {\n var cursor = this.getCursor();\n var range = this.session.getAWordRange(cursor.row, cursor.column);\n this.setSelectionRange(range);\n };\n\n this.getLineRange = function(row, excludeLastChar) {\n var rowStart = typeof row == \"number\" ? row : this.lead.row;\n var rowEnd;\n\n var foldLine = this.session.getFoldLine(rowStart);\n if (foldLine) {\n rowStart = foldLine.start.row;\n rowEnd = foldLine.end.row;\n } else {\n rowEnd = rowStart;\n }\n if (excludeLastChar === true)\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n else\n return new Range(rowStart, 0, rowEnd + 1, 0);\n };\n this.selectLine = function() {\n this.setSelectionRange(this.getLineRange());\n };\n this.moveCursorUp = function() {\n this.moveCursorBy(-1, 0);\n };\n this.moveCursorDown = function() {\n this.moveCursorBy(1, 0);\n };\n this.moveCursorLeft = function() {\n var cursor = this.lead.getPosition(),\n fold;\n\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n } else if (cursor.column == 0) {\n if (cursor.row > 0) {\n this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(\" \").length-1 == tabSize)\n this.moveCursorBy(0, -tabSize);\n else\n this.moveCursorBy(0, -1);\n }\n };\n this.moveCursorRight = function() {\n var cursor = this.lead.getPosition(),\n fold;\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n }\n else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n if (this.lead.row < this.doc.getLength() - 1) {\n this.moveCursorTo(this.lead.row + 1, 0);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n var cursor = this.lead;\n if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(\" \").length-1 == tabSize)\n this.moveCursorBy(0, tabSize);\n else\n this.moveCursorBy(0, 1);\n }\n };\n this.moveCursorLineStart = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var screenRow = this.session.documentToScreenRow(row, column);\n var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n var beforeCursor = this.session.getDisplayLine(\n row, null, firstColumnPosition.row,\n firstColumnPosition.column\n );\n\n var leadingSpace = beforeCursor.match(/^\\s*/);\n if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n firstColumnPosition.column += leadingSpace[0].length;\n this.moveCursorToPosition(firstColumnPosition);\n };\n this.moveCursorLineEnd = function() {\n var lead = this.lead;\n var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n if (this.lead.column == lineEnd.column) {\n var line = this.session.getLine(lineEnd.row);\n if (lineEnd.column == line.length) {\n var textEnd = line.search(/\\s+$/);\n if (textEnd > 0)\n lineEnd.column = textEnd;\n }\n }\n\n this.moveCursorTo(lineEnd.row, lineEnd.column);\n };\n this.moveCursorFileEnd = function() {\n var row = this.doc.getLength() - 1;\n var column = this.doc.getLine(row).length;\n this.moveCursorTo(row, column);\n };\n this.moveCursorFileStart = function() {\n this.moveCursorTo(0, 0);\n };\n this.moveCursorLongWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n return;\n }\n if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n column += this.session.nonTokenRe.lastIndex;\n this.session.nonTokenRe.lastIndex = 0;\n rightOfCursor = line.substring(column);\n }\n if (column >= line.length) {\n this.moveCursorTo(row, line.length);\n this.moveCursorRight();\n if (row < this.doc.getLength() - 1)\n this.moveCursorWordRight();\n return;\n }\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n column += this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n this.moveCursorLongWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n return;\n }\n\n var str = this.session.getFoldStringAt(row, column, -1);\n if (str == null) {\n str = this.doc.getLine(row).substring(0, column)\n }\n\n var leftOfCursor = lang.stringReverse(str);\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n column -= this.session.nonTokenRe.lastIndex;\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n this.session.nonTokenRe.lastIndex = 0;\n }\n if (column <= 0) {\n this.moveCursorTo(row, 0);\n this.moveCursorLeft();\n if (row > 0)\n this.moveCursorWordLeft();\n return;\n }\n if (match = this.session.tokenRe.exec(leftOfCursor)) {\n column -= this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n\n this.$shortWordEndIndex = function(rightOfCursor) {\n var match, index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n index = this.session.tokenRe.lastIndex;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n\n if (index < 1) {\n tokenRe.lastIndex = 0;\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n tokenRe.lastIndex = 0;\n index ++;\n if (whitespaceRe.test(ch)) {\n if (index > 2) {\n index--\n break;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n if (index > 2)\n break\n }\n }\n }\n }\n }\n tokenRe.lastIndex = 0;\n\n return index;\n };\n\n this.moveCursorShortWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold)\n return this.moveCursorTo(fold.end.row, fold.end.column);\n\n if (column == line.length) {\n var l = this.doc.getLength();\n do {\n row++;\n rightOfCursor = this.doc.getLine(row)\n } while (row < l && /^\\s*$/.test(rightOfCursor))\n\n if (!/^\\s+/.test(rightOfCursor))\n rightOfCursor = \"\"\n column = 0;\n }\n\n var index = this.$shortWordEndIndex(rightOfCursor);\n\n this.moveCursorTo(row, column + index);\n };\n\n this.moveCursorShortWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1))\n return this.moveCursorTo(fold.start.row, fold.start.column);\n\n var line = this.session.getLine(row).substring(0, column);\n if (column == 0) {\n do {\n row--;\n line = this.doc.getLine(row);\n } while (row > 0 && /^\\s*$/.test(line))\n\n column = line.length;\n if (!/\\s+$/.test(line))\n line = \"\"\n }\n\n var leftOfCursor = lang.stringReverse(line);\n var index = this.$shortWordEndIndex(leftOfCursor);\n\n return this.moveCursorTo(row, column - index);\n };\n\n this.moveCursorWordRight = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordRight();\n else\n this.moveCursorShortWordRight();\n };\n\n this.moveCursorWordLeft = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordLeft();\n else\n this.moveCursorShortWordLeft();\n };\n this.moveCursorBy = function(rows, chars) {\n var screenPos = this.session.documentToScreenPosition(\n this.lead.row,\n this.lead.column\n );\n\n if (chars === 0) {\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n\n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n if (this.session.lineWidgets && this.session.lineWidgets[docPos.row])\n docPos.row++;\n }\n this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n };\n this.moveCursorToPosition = function(position) {\n this.moveCursorTo(position.row, position.column);\n };\n this.moveCursorTo = function(row, column, keepDesiredColumn) {\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n row = fold.start.row;\n column = fold.start.column;\n }\n\n this.$keepDesiredColumnOnChange = true;\n this.lead.setPosition(row, column);\n this.$keepDesiredColumnOnChange = false;\n\n if (!keepDesiredColumn)\n this.$desiredColumn = null;\n };\n this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n var pos = this.session.screenToDocumentPosition(row, column);\n this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n };\n this.detach = function() {\n this.lead.detach();\n this.anchor.detach();\n this.session = this.doc = null;\n }\n\n this.fromOrientedRange = function(range) {\n this.setSelectionRange(range, range.cursor == range.start);\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n }\n\n this.toOrientedRange = function(range) {\n var r = this.getRange();\n if (range) {\n range.start.column = r.start.column;\n range.start.row = r.start.row;\n range.end.column = r.end.column;\n range.end.row = r.end.row;\n } else {\n range = r;\n }\n\n range.cursor = this.isBackwards() ? range.start : range.end;\n range.desiredColumn = this.$desiredColumn;\n return range;\n }\n\n this.toJSON = function() {\n if (this.rangeCount) {\n var data = this.ranges.map(function(r) {\n var r1 = r.clone();\n r1.isBackwards = r.cursor == r.start;\n return r1;\n });\n } else {\n var data = this.getRange();\n data.isBackwards = this.isBackwards();\n }\n return data;\n };\n\n this.fromJSON = function(data) {\n if (data.start == undefined) {\n if (this.rangeList) {\n this.toSingleRange(data[0]);\n for (var i = data.length; i--; ) {\n var r = Range.fromPoints(data[i].start, data[i].end);\n if (data.isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else\n data = data[0];\n }\n if (this.rangeList)\n this.toSingleRange(data);\n this.setSelectionRange(data, data.isBackwards);\n };\n\n this.isEqual = function(data) {\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n return false;\n if (!data.length || !this.ranges)\n return this.getRange().isEqual(data);\n\n for (var i = this.ranges.length; i--; ) {\n if (!this.ranges[i].isEqual(data[i]))\n return false\n }\n return true;\n }\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {\n\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar Search = function() {\n this.$options = {};\n};\n\n(function() {\n this.set = function(options) {\n oop.mixin(this.$options, options);\n return this;\n };\n this.getOptions = function() {\n return lang.copyObject(this.$options);\n };\n this.setOptions = function(options) {\n this.$options = options;\n };\n this.find = function(session) {\n var iterator = this.$matchIterator(session, this.$options);\n\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(range, row, offset) {\n if (!range.start) {\n var column = range.offset + (offset || 0);\n firstRange = new Range(row, column, row, column+range.length);\n } else\n firstRange = range;\n return true;\n });\n\n return firstRange;\n };\n this.findAll = function(session) {\n var options = this.$options;\n if (!options.needle)\n return [];\n this.$assembleRegExp(options);\n\n var range = options.range;\n var lines = range\n ? session.getLines(range.start.row, range.end.row)\n : session.doc.getAllLines();\n\n var ranges = [];\n var re = options.re;\n if (options.$isMultiLine) {\n var len = re.length;\n var maxRow = lines.length - len;\n var prevRange;\n outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n for (var j = 0; j < len; j++)\n if (lines[row + j].search(re[j]) == -1)\n continue outer;\n \n var startLine = lines[row];\n var line = lines[row + len - 1];\n var startIndex = startLine.length - startLine.match(re[0])[0].length;\n var endIndex = line.match(re[len - 1])[0].length;\n \n if (prevRange && prevRange.end.row === row &&\n prevRange.end.column > startIndex\n ) {\n continue;\n }\n ranges.push(prevRange = new Range(\n row, startIndex, row + len - 1, endIndex\n ));\n if (len > 2)\n row = row + len - 2;\n }\n } else {\n for (var i = 0; i < lines.length; i++) {\n var matches = lang.getMatchOffsets(lines[i], re);\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n }\n }\n }\n\n if (range) {\n var startColumn = range.start.column;\n var endColumn = range.start.column;\n var i = 0, j = ranges.length - 1;\n while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n i++;\n\n while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n j--;\n \n ranges = ranges.slice(i, j + 1);\n for (i = 0, j = ranges.length; i < j; i++) {\n ranges[i].start.row += range.start.row;\n ranges[i].end.row += range.start.row;\n }\n }\n\n return ranges;\n };\n this.replace = function(input, replacement) {\n var options = this.$options;\n\n var re = this.$assembleRegExp(options);\n if (options.$isMultiLine)\n return replacement;\n\n if (!re)\n return;\n\n var match = re.exec(input);\n if (!match || match[0].length != input.length)\n return null;\n \n replacement = input.replace(re, replacement);\n if (options.preserveCase) {\n replacement = replacement.split(\"\");\n for (var i = Math.min(input.length, input.length); i--; ) {\n var ch = input[i];\n if (ch && ch.toLowerCase() != ch)\n replacement[i] = replacement[i].toUpperCase();\n else\n replacement[i] = replacement[i].toLowerCase();\n }\n replacement = replacement.join(\"\");\n }\n \n return replacement;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\n\n var self = this, callback, backwards = options.backwards;\n\n if (options.$isMultiLine) {\n var len = re.length;\n var matchIterator = function(line, row, offset) {\n var startIndex = line.search(re[0]);\n if (startIndex == -1)\n return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(row + i);\n if (line.search(re[i]) == -1)\n return;\n }\n\n var endIndex = line.match(re[len - 1])[0].length;\n\n var range = new Range(row, startIndex, row + len - 1, endIndex);\n if (re.offset == 1) {\n range.start.row--;\n range.start.column = Number.MAX_VALUE;\n } else if (offset)\n range.start.column += offset;\n\n if (callback(range))\n return true;\n };\n } else if (backwards) {\n var matchIterator = function(line, row, startIndex) {\n var matches = lang.getMatchOffsets(line, re);\n for (var i = matches.length-1; i >= 0; i--)\n if (callback(matches[i], row, startIndex))\n return true;\n };\n } else {\n var matchIterator = function(line, row, startIndex) {\n var matches = lang.getMatchOffsets(line, re);\n for (var i = 0; i < matches.length; i++)\n if (callback(matches[i], row, startIndex))\n return true;\n };\n }\n\n return {\n forEach: function(_callback) {\n callback = _callback;\n self.$lineIterator(session, options).forEach(matchIterator);\n }\n };\n };\n\n this.$assembleRegExp = function(options, $disableFakeMultiline) {\n if (options.needle instanceof RegExp)\n return options.re = options.needle;\n\n var needle = options.needle;\n\n if (!options.needle)\n return options.re = false;\n\n if (!options.regExp)\n needle = lang.escapeRegExp(needle);\n\n if (options.wholeWord)\n needle = \"\\\\b\" + needle + \"\\\\b\";\n\n var modifier = options.caseSensitive ? \"g\" : \"gi\";\n\n options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n if (options.$isMultiLine)\n return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n try {\n var re = new RegExp(needle, modifier);\n } catch(e) {\n re = false;\n }\n return options.re = re;\n };\n\n this.$assembleMultilineRegExp = function(needle, modifier) {\n var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n var re = [];\n for (var i = 0; i < parts.length; i++) try {\n re.push(new RegExp(parts[i], modifier));\n } catch(e) {\n return false;\n }\n if (parts[0] == \"\") {\n re.shift();\n re.offset = 1;\n } else {\n re.offset = 0;\n }\n return re;\n };\n\n this.$lineIterator = function(session, options) {\n var backwards = options.backwards == true;\n var skipCurrent = options.skipCurrent != false;\n\n var range = options.range;\n var start = options.start;\n if (!start)\n start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n \n if (start.start)\n start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n var firstRow = range ? range.start.row : 0;\n var lastRow = range ? range.end.row : session.getLength() - 1;\n\n var forEach = backwards ? function(callback) {\n var row = start.row;\n\n var line = session.getLine(row).substring(0, start.column);\n if (callback(line, row))\n return;\n\n for (row--; row >= firstRow; row--)\n if (callback(session.getLine(row), row))\n return;\n\n if (options.wrap == false)\n return;\n\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (callback(session.getLine(row), row))\n return;\n } : function(callback) {\n var row = start.row;\n\n var line = session.getLine(row).substr(start.column);\n if (callback(line, row, start.column))\n return;\n\n for (row = row+1; row <= lastRow; row++)\n if (callback(session.getLine(row), row))\n return;\n\n if (options.wrap == false)\n return;\n\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (callback(session.getLine(row), row))\n return;\n };\n \n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nexports.Search = Search;\n});\n\nace.define('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/config', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/search_highlight', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar config = require(\"./config\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Selection = require(\"./selection\").Selection;\nvar TextMode = require(\"./mode/text\").Mode;\nvar Range = require(\"./range\").Range;\nvar Document = require(\"./document\").Document;\nvar BackgroundTokenizer = require(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n this.$breakpoints = [];\n this.$decorations = [];\n this.$frontMarkers = {};\n this.$backMarkers = {};\n this.$markerId = 1;\n this.$undoSelect = true;\n\n this.$foldData = [];\n this.$foldData.toString = function() {\n return this.join(\"\\n\");\n }\n this.on(\"changeFold\", this.onChangeFold.bind(this));\n this.$onChange = this.onChange.bind(this);\n\n if (typeof text != \"object\" || !text.getLine)\n text = new Document(text);\n\n this.setDocument(text);\n this.selection = new Selection(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.removeListener(\"change\", this.$onChange);\n\n this.doc = doc;\n doc.on(\"change\", this.$onChange);\n\n if (this.bgTokenizer)\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.resetCaches();\n };\n this.getDocument = function() {\n return this.doc;\n };\n this.$resetRowCache = function(docRow) {\n if (!docRow) {\n this.$docRowCache = [];\n this.$screenRowCache = [];\n return;\n }\n var l = this.$docRowCache.length;\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n if (l > i) {\n this.$docRowCache.splice(i, l);\n this.$screenRowCache.splice(i, l);\n }\n };\n\n this.$getRowCacheIndex = function(cacheArray, val) {\n var low = 0;\n var hi = cacheArray.length - 1;\n\n while (low <= hi) {\n var mid = (low + hi) >> 1;\n var c = cacheArray[mid];\n\n if (val > c)\n low = mid + 1;\n else if (val < c)\n hi = mid - 1;\n else\n return mid;\n }\n\n return low -1;\n };\n\n this.resetCaches = function() {\n this.$modified = true;\n this.$wrapData = [];\n this.$rowLengthCache = [];\n this.$resetRowCache(0);\n if (this.bgTokenizer)\n this.bgTokenizer.start(0);\n };\n\n this.onChangeFold = function(e) {\n var fold = e.data;\n this.$resetRowCache(fold.start.row);\n };\n\n this.onChange = function(e) {\n var delta = e.data;\n this.$modified = true;\n\n this.$resetRowCache(delta.range.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(e);\n if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n this.$deltasDoc.push(delta);\n if (removedFolds && removedFolds.length != 0) {\n this.$deltasFold.push({\n action: \"removeFolds\",\n folds: removedFolds\n });\n }\n\n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", e);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n this.setUndoManager(this.$undoManager);\n this.getUndoManager().reset();\n };\n this.getValue =\n this.toString = function() {\n return this.doc.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.getState = function(row) {\n return this.bgTokenizer.getState(row);\n };\n this.getTokens = function(row) {\n return this.bgTokenizer.getTokens(row);\n };\n this.getTokenAt = function(row, column) {\n var tokens = this.bgTokenizer.getTokens(row);\n var token, c = 0;\n if (column == null) {\n i = tokens.length - 1;\n c = this.getLine(row).length;\n } else {\n for (var i = 0; i < tokens.length; i++) {\n c += tokens[i].value.length;\n if (c >= column)\n break;\n }\n }\n token = tokens[i];\n if (!token)\n return null;\n token.index = i;\n token.start = c - token.value.length;\n return token;\n };\n this.setUndoManager = function(undoManager) {\n this.$undoManager = undoManager;\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n\n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n\n if (undoManager) {\n var self = this;\n\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n\n if (self.$deltasFold.length) {\n self.$deltas.push({\n group: \"fold\",\n deltas: self.$deltasFold\n });\n self.$deltasFold = [];\n }\n\n if (self.$deltasDoc.length) {\n self.$deltas.push({\n group: \"doc\",\n deltas: self.$deltasDoc\n });\n self.$deltasDoc = [];\n }\n\n if (self.$deltas.length > 0) {\n undoManager.execute({\n action: \"aceupdate\",\n args: [self.$deltas, self],\n merge: self.mergeUndoDeltas\n });\n }\n self.mergeUndoDeltas = false;\n self.$deltas = [];\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n }\n };\n this.markUndoGroup = function() {\n if (this.$syncInformUndoManager)\n this.$syncInformUndoManager();\n };\n \n this.$defaultUndoManager = {\n undo: function() {},\n redo: function() {},\n reset: function() {}\n };\n this.getUndoManager = function() {\n return this.$undoManager || this.$defaultUndoManager;\n };\n this.getTabString = function() {\n if (this.getUseSoftTabs()) {\n return lang.stringRepeat(\" \", this.getTabSize());\n } else {\n return \"\\t\";\n }\n };\n this.setUseSoftTabs = function(val) {\n this.setOption(\"useSoftTabs\", val);\n };\n this.getUseSoftTabs = function() {\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n };\n this.setTabSize = function(tabSize) {\n this.setOption(\"tabSize\", tabSize);\n };\n this.getTabSize = function() {\n return this.$tabSize;\n };\n this.isTabStop = function(position) {\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n };\n\n this.$overwrite = false;\n this.setOverwrite = function(overwrite) {\n this.setOption(\"overwrite\", overwrite);\n };\n this.getOverwrite = function() {\n return this.$overwrite;\n };\n this.toggleOverwrite = function() {\n this.setOverwrite(!this.$overwrite);\n };\n this.addGutterDecoration = function(row, className) {\n if (!this.$decorations[row])\n this.$decorations[row] = \"\";\n this.$decorations[row] += \" \" + className;\n this._signal(\"changeBreakpoint\", {});\n };\n this.removeGutterDecoration = function(row, className) {\n this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n this._signal(\"changeBreakpoint\", {});\n };\n this.getBreakpoints = function() {\n return this.$breakpoints;\n };\n this.setBreakpoints = function(rows) {\n this.$breakpoints = [];\n for (var i=0; i 0)\n inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n if (!inToken)\n inToken = !!line.charAt(column).match(this.tokenRe);\n\n if (inToken)\n var re = this.tokenRe;\n else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n var re = /\\s/;\n else\n var re = this.nonTokenRe;\n\n var start = column;\n if (start > 0) {\n do {\n start--;\n }\n while (start >= 0 && line.charAt(start).match(re));\n start++;\n }\n\n var end = column;\n while (end < line.length && line.charAt(end).match(re)) {\n end++;\n }\n\n return new Range(row, start, row, end);\n };\n this.getAWordRange = function(row, column) {\n var wordRange = this.getWordRange(row, column);\n var line = this.getLine(wordRange.end.row);\n\n while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n wordRange.end.column += 1;\n }\n return wordRange;\n };\n this.setNewLineMode = function(newLineMode) {\n this.doc.setNewLineMode(newLineMode);\n };\n this.getNewLineMode = function() {\n return this.doc.getNewLineMode();\n };\n this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n this.getUseWorker = function() { return this.$useWorker; };\n this.onReloadTokenizer = function(e) {\n var rows = e.data;\n this.bgTokenizer.start(rows.first);\n this._signal(\"tokenizerUpdate\", e);\n };\n\n this.$modes = {};\n this.$mode = null;\n this.$modeId = null;\n this.setMode = function(mode, cb) {\n if (mode && typeof mode === \"object\") {\n if (mode.getTokenizer)\n return this.$onChangeMode(mode);\n var options = mode;\n var path = options.path;\n } else {\n path = mode || \"ace/mode/text\";\n }\n if (!this.$modes[\"ace/mode/text\"])\n this.$modes[\"ace/mode/text\"] = new TextMode();\n\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n cb && cb();\n return;\n }\n this.$modeId = path;\n config.loadModule([\"mode\", path], function(m) {\n if (this.$modeId !== path)\n return cb && cb();\n if (this.$modes[path] && !options)\n return this.$onChangeMode(this.$modes[path]);\n if (m && m.Mode) {\n m = new m.Mode(options);\n if (!options) {\n this.$modes[path] = m;\n m.$id = path;\n }\n this.$onChangeMode(m);\n cb && cb();\n }\n }.bind(this));\n if (!this.$mode)\n this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n };\n\n this.$onChangeMode = function(mode, $isPlaceholder) {\n if (!$isPlaceholder)\n this.$modeId = mode.$id;\n if (this.$mode === mode) \n return;\n\n this.$mode = mode;\n\n this.$stopWorker();\n\n if (this.$useWorker)\n this.$startWorker();\n\n var tokenizer = mode.getTokenizer();\n\n if(tokenizer.addEventListener !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.addEventListener(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.addEventListener(\"update\", function(e) {\n _self._signal(\"tokenizerUpdate\", e);\n });\n } else {\n this.bgTokenizer.setTokenizer(tokenizer);\n }\n\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.tokenRe = mode.tokenRe;\n this.nonTokenRe = mode.nonTokenRe;\n\n \n if (!$isPlaceholder) {\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\");\n }\n };\n\n\n this.$stopWorker = function() {\n if (this.$worker)\n this.$worker.terminate();\n\n this.$worker = null;\n };\n\n this.$startWorker = function() {\n if (typeof Worker !== \"undefined\" && !require.noWorker) {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n console.log(\"Could not load worker\");\n console.log(e);\n this.$worker = null;\n }\n }\n else\n this.$worker = null;\n };\n this.getMode = function() {\n return this.$mode;\n };\n\n this.$scrollTop = 0;\n this.setScrollTop = function(scrollTop) {\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n return;\n\n this.$scrollTop = scrollTop;\n this._signal(\"changeScrollTop\", scrollTop);\n };\n this.getScrollTop = function() {\n return this.$scrollTop;\n };\n\n this.$scrollLeft = 0;\n this.setScrollLeft = function(scrollLeft) {\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n return;\n\n this.$scrollLeft = scrollLeft;\n this._signal(\"changeScrollLeft\", scrollLeft);\n };\n this.getScrollLeft = function() {\n return this.$scrollLeft;\n };\n this.getScreenWidth = function() {\n this.$computeWidth();\n if (this.lineWidgets) \n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n return this.screenWidth;\n };\n \n this.getLineWidgetMaxWidth = function() {\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n var width = 0;\n this.lineWidgets.forEach(function(w) {\n if (w && w.screenWidth > width)\n width = w.screenWidth;\n });\n return this.lineWidgetWidth = width;\n };\n\n this.$computeWidth = function(force) {\n if (this.$modified || force) {\n this.$modified = false;\n\n if (this.$useWrapMode)\n return this.screenWidth = this.$wrapLimit;\n\n var lines = this.doc.getAllLines();\n var cache = this.$rowLengthCache;\n var longestScreenLine = 0;\n var foldIndex = 0;\n var foldLine = this.$foldData[foldIndex];\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n var len = lines.length;\n\n for (var i = 0; i < len; i++) {\n if (i > foldStart) {\n i = foldLine.end.row + 1;\n if (i >= len)\n break;\n foldLine = this.$foldData[foldIndex++];\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n\n if (cache[i] == null)\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n if (cache[i] > longestScreenLine)\n longestScreenLine = cache[i];\n }\n this.screenWidth = longestScreenLine;\n }\n };\n this.getLine = function(row) {\n return this.doc.getLine(row);\n };\n this.getLines = function(firstRow, lastRow) {\n return this.doc.getLines(firstRow, lastRow);\n };\n this.getLength = function() {\n return this.doc.getLength();\n };\n this.getTextRange = function(range) {\n return this.doc.getTextRange(range || this.selection.getRange());\n };\n this.insert = function(position, text) {\n return this.doc.insert(position, text);\n };\n this.remove = function(range) {\n return this.doc.remove(range);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.revertDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n } else {\n delta.deltas.forEach(function(foldDelta) {\n this.addFolds(foldDelta.folds);\n }, this);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.applyDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n function isInsert(delta) {\n var insert =\n delta.action === \"insertText\" || delta.action === \"insertLines\";\n return isUndo ? !insert : insert;\n }\n\n var delta = deltas[0];\n var range, point;\n var lastDeltaIsInsert = false;\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.range.start, delta.range.end);\n lastDeltaIsInsert = true;\n } else {\n range = Range.fromPoints(delta.range.start, delta.range.start);\n lastDeltaIsInsert = false;\n }\n\n for (var i = 1; i < deltas.length; i++) {\n delta = deltas[i];\n if (isInsert(delta)) {\n point = delta.range.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(delta.range.start);\n }\n point = delta.range.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(delta.range.end);\n }\n lastDeltaIsInsert = true;\n } else {\n point = delta.range.start;\n if (range.compare(point.row, point.column) == -1) {\n range =\n Range.fromPoints(delta.range.start, delta.range.start);\n }\n lastDeltaIsInsert = false;\n }\n }\n if (lastUndoRange != null) {\n if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n lastUndoRange.start.column += range.end.column - range.start.column;\n lastUndoRange.end.column += range.end.column - range.start.column;\n }\n\n var cmp = lastUndoRange.compareRange(range);\n if (cmp == 1) {\n range.setStart(lastUndoRange.start);\n } else if (cmp == -1) {\n range.setEnd(lastUndoRange.end);\n }\n }\n\n return range;\n };\n this.replace = function(range, text) {\n return this.doc.replace(range, text);\n };\n this.moveText = function(fromRange, toPosition, copy) {\n var text = this.getTextRange(fromRange);\n var folds = this.getFoldsInRange(fromRange);\n\n var toRange = Range.fromPoints(toPosition, toPosition);\n if (!copy) {\n this.remove(fromRange);\n var rowDiff = fromRange.start.row - fromRange.end.row;\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n if (collDiff) {\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n toRange.start.column += collDiff;\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n toRange.end.column += collDiff;\n }\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\n toRange.start.row += rowDiff;\n toRange.end.row += rowDiff;\n }\n }\n\n toRange.end = this.insert(toRange.start, text);\n if (folds.length) {\n var oldStart = fromRange.start;\n var newStart = toRange.start;\n var rowDiff = newStart.row - oldStart.row;\n var collDiff = newStart.column - oldStart.column;\n this.addFolds(folds.map(function(x) {\n x = x.clone();\n if (x.start.row == oldStart.row)\n x.start.column += collDiff;\n if (x.end.row == oldStart.row)\n x.end.column += collDiff;\n x.start.row += rowDiff;\n x.end.row += rowDiff;\n return x;\n }));\n }\n\n return toRange;\n };\n this.indentRows = function(startRow, endRow, indentString) {\n indentString = indentString.replace(/\\t/g, this.getTabString());\n for (var row=startRow; row<=endRow; row++)\n this.insert({row: row, column:0}, indentString);\n };\n this.outdentRows = function (range) {\n var rowRange = range.collapseRows();\n var deleteRange = new Range(0, 0, 0, 0);\n var size = this.getTabSize();\n\n for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n var line = this.getLine(i);\n\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n for (var j = 0; j < size; ++j)\n if (line.charAt(j) != ' ')\n break;\n if (j < size && line.charAt(j) == '\\t') {\n deleteRange.start.column = j;\n deleteRange.end.column = j + 1;\n } else {\n deleteRange.start.column = 0;\n deleteRange.end.column = j;\n }\n this.remove(deleteRange);\n }\n };\n\n this.$moveLines = function(firstRow, lastRow, dir) {\n firstRow = this.getRowFoldStart(firstRow);\n lastRow = this.getRowFoldEnd(lastRow);\n if (dir < 0) {\n var row = this.getRowFoldStart(firstRow + dir);\n if (row < 0) return 0;\n var diff = row-firstRow;\n } else if (dir > 0) {\n var row = this.getRowFoldEnd(lastRow + dir);\n if (row > this.doc.getLength()-1) return 0;\n var diff = row-lastRow;\n } else {\n firstRow = this.$clipRowToDocument(firstRow);\n lastRow = this.$clipRowToDocument(lastRow);\n var diff = lastRow - firstRow + 1;\n }\n\n var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n var folds = this.getFoldsInRange(range).map(function(x){\n x = x.clone();\n x.start.row += diff;\n x.end.row += diff;\n return x;\n });\n\n var lines = dir == 0\n ? this.doc.getLines(firstRow, lastRow)\n : this.doc.removeLines(firstRow, lastRow);\n this.doc.insertLines(firstRow+diff, lines);\n folds.length && this.addFolds(folds);\n return diff;\n };\n this.moveLinesUp = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, -1);\n };\n this.moveLinesDown = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 1);\n };\n this.duplicateLines = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 0);\n };\n\n\n this.$clipRowToDocument = function(row) {\n return Math.max(0, Math.min(row, this.doc.getLength()-1));\n };\n\n this.$clipColumnToRow = function(row, column) {\n if (column < 0)\n return 0;\n return Math.min(this.doc.getLine(row).length, column);\n };\n\n\n this.$clipPositionToDocument = function(row, column) {\n column = Math.max(0, column);\n\n if (row < 0) {\n row = 0;\n column = 0;\n } else {\n var len = this.doc.getLength();\n if (row >= len) {\n row = len - 1;\n column = this.doc.getLine(len-1).length;\n } else {\n column = Math.min(this.doc.getLine(row).length, column);\n }\n }\n\n return {\n row: row,\n column: column\n };\n };\n\n this.$clipRangeToDocument = function(range) {\n if (range.start.row < 0) {\n range.start.row = 0;\n range.start.column = 0;\n } else {\n range.start.column = this.$clipColumnToRow(\n range.start.row,\n range.start.column\n );\n }\n\n var len = this.doc.getLength() - 1;\n if (range.end.row > len) {\n range.end.row = len;\n range.end.column = this.doc.getLine(len).length;\n } else {\n range.end.column = this.$clipColumnToRow(\n range.end.row,\n range.end.column\n );\n }\n return range;\n };\n this.$wrapLimit = 80;\n this.$useWrapMode = false;\n this.$wrapLimitRange = {\n min : null,\n max : null\n };\n this.setUseWrapMode = function(useWrapMode) {\n if (useWrapMode != this.$useWrapMode) {\n this.$useWrapMode = useWrapMode;\n this.$modified = true;\n this.$resetRowCache(0);\n if (useWrapMode) {\n var len = this.getLength();\n this.$wrapData = Array(len);\n this.$updateWrapData(0, len - 1);\n }\n\n this._signal(\"changeWrapMode\");\n }\n };\n this.getUseWrapMode = function() {\n return this.$useWrapMode;\n };\n this.setWrapLimitRange = function(min, max) {\n if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n this.$wrapLimitRange = {\n min: min,\n max: max\n };\n this.$modified = true;\n this._signal(\"changeWrapMode\");\n }\n };\n this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n var limits = this.$wrapLimitRange\n if (limits.max < 0)\n limits = {min: $printMargin, max: $printMargin};\n var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n this.$wrapLimit = wrapLimit;\n this.$modified = true;\n if (this.$useWrapMode) {\n this.$updateWrapData(0, this.getLength() - 1);\n this.$resetRowCache(0);\n this._signal(\"changeWrapLimit\");\n }\n return true;\n }\n return false;\n };\n\n this.$constrainWrapLimit = function(wrapLimit, min, max) {\n if (min)\n wrapLimit = Math.max(min, wrapLimit);\n\n if (max)\n wrapLimit = Math.min(max, wrapLimit);\n\n return wrapLimit;\n };\n this.getWrapLimit = function() {\n return this.$wrapLimit;\n };\n this.setWrapLimit = function (limit) {\n this.setWrapLimitRange(limit, limit);\n };\n this.getWrapLimitRange = function() {\n return {\n min : this.$wrapLimitRange.min,\n max : this.$wrapLimitRange.max\n };\n };\n\n this.$updateInternalDataOnChange = function(e) {\n var useWrapMode = this.$useWrapMode;\n var len;\n var action = e.data.action;\n var firstRow = e.data.range.start.row;\n var lastRow = e.data.range.end.row;\n var start = e.data.range.start;\n var end = e.data.range.end;\n var removedFolds = null;\n\n if (action.indexOf(\"Lines\") != -1) {\n if (action == \"insertLines\") {\n lastRow = firstRow + (e.data.lines.length);\n } else {\n lastRow = firstRow;\n }\n len = e.data.lines ? e.data.lines.length : lastRow - firstRow;\n } else {\n len = lastRow - firstRow;\n }\n\n this.$updating = true;\n if (len != 0) {\n if (action.indexOf(\"remove\") != -1) {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(e.data.range);\n this.removeFolds(removedFolds);\n\n var foldLine = this.getFoldLine(end.row);\n var idx = 0;\n if (foldLine) {\n foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n foldLine.shiftRow(-len);\n\n var foldLineBefore = this.getFoldLine(firstRow);\n if (foldLineBefore && foldLineBefore !== foldLine) {\n foldLineBefore.merge(foldLine);\n foldLine = foldLineBefore;\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= end.row) {\n foldLine.shiftRow(-len);\n }\n }\n\n lastRow = firstRow;\n } else {\n var args = Array(len);\n args.unshift(firstRow, 0);\n var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache\n arr.splice.apply(arr, args);\n var foldLines = this.$foldData;\n var foldLine = this.getFoldLine(firstRow);\n var idx = 0;\n if (foldLine) {\n var cmp = foldLine.range.compareInside(start.row, start.column)\n if (cmp == 0) {\n foldLine = foldLine.split(start.row, start.column);\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(\n lastRow, 0, end.column - start.column);\n } else\n if (cmp == -1) {\n foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n foldLine.shiftRow(len);\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= firstRow) {\n foldLine.shiftRow(len);\n }\n }\n }\n } else {\n len = Math.abs(e.data.range.start.column - e.data.range.end.column);\n if (action.indexOf(\"remove\") != -1) {\n removedFolds = this.getFoldsInRange(e.data.range);\n this.removeFolds(removedFolds);\n\n len = -len;\n }\n var foldLine = this.getFoldLine(firstRow);\n if (foldLine) {\n foldLine.addRemoveChars(firstRow, start.column, len);\n }\n }\n\n if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n }\n this.$updating = false;\n\n if (useWrapMode)\n this.$updateWrapData(firstRow, lastRow);\n else\n this.$updateRowLengthCache(firstRow, lastRow);\n\n return removedFolds;\n };\n\n this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n this.$rowLengthCache[firstRow] = null;\n this.$rowLengthCache[lastRow] = null;\n };\n\n this.$updateWrapData = function(firstRow, lastRow) {\n var lines = this.doc.getAllLines();\n var tabSize = this.getTabSize();\n var wrapData = this.$wrapData;\n var wrapLimit = this.$wrapLimit;\n var tokens;\n var foldLine;\n\n var row = firstRow;\n lastRow = Math.min(lastRow, lines.length - 1);\n while (row <= lastRow) {\n foldLine = this.getFoldLine(row, foldLine);\n if (!foldLine) {\n tokens = this.$getDisplayTokens(lines[row]);\n wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row ++;\n } else {\n tokens = [];\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n var walkTokens;\n if (placeholder != null) {\n walkTokens = this.$getDisplayTokens(\n placeholder, tokens.length);\n walkTokens[0] = PLACEHOLDER_START;\n for (var i = 1; i < walkTokens.length; i++) {\n walkTokens[i] = PLACEHOLDER_BODY;\n }\n } else {\n walkTokens = this.$getDisplayTokens(\n lines[row].substring(lastColumn, column),\n tokens.length);\n }\n tokens = tokens.concat(walkTokens);\n }.bind(this),\n foldLine.end.row,\n lines[foldLine.end.row].length + 1\n );\n\n wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row = foldLine.end.row + 1;\n }\n }\n };\n var CHAR = 1,\n CHAR_EXT = 2,\n PLACEHOLDER_START = 3,\n PLACEHOLDER_BODY = 4,\n PUNCTUATION = 9,\n SPACE = 10,\n TAB = 11,\n TAB_SPACE = 12;\n\n\n this.$computeWrapSplits = function(tokens, wrapLimit) {\n if (tokens.length == 0) {\n return [];\n }\n\n var splits = [];\n var displayLength = tokens.length;\n var lastSplit = 0, lastDocSplit = 0;\n\n var isCode = this.$wrapAsCode;\n\n function addSplit(screenPos) {\n var displayed = tokens.slice(lastSplit, screenPos);\n var len = displayed.length;\n displayed.join(\"\").\n replace(/12/g, function() {\n len -= 1;\n }).\n replace(/2/g, function() {\n len -= 1;\n });\n\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n\n while (displayLength - lastSplit > wrapLimit) {\n var split = lastSplit + wrapLimit;\n if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n addSplit(split);\n continue;\n }\n if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n for (split; split != lastSplit - 1; split--) {\n if (tokens[split] == PLACEHOLDER_START) {\n break;\n }\n }\n if (split > lastSplit) {\n addSplit(split);\n continue;\n }\n split = lastSplit + wrapLimit;\n for (split; split < tokens.length; split++) {\n if (tokens[split] != PLACEHOLDER_BODY) {\n break;\n }\n }\n if (split == tokens.length) {\n break; // Breaks the while-loop.\n }\n addSplit(split);\n continue;\n }\n var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1);\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n if (isCode) {\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n while (split > minSplit && tokens[split] == PUNCTUATION) {\n split --;\n }\n } else {\n while (split > minSplit && tokens[split] < SPACE) {\n split --;\n }\n }\n if (split > minSplit) {\n addSplit(++split);\n continue;\n }\n split = lastSplit + wrapLimit;\n addSplit(split);\n }\n return splits;\n };\n this.$getDisplayTokens = function(str, offset) {\n var arr = [];\n var tabSize;\n offset = offset || 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charCodeAt(i);\n if (c == 9) {\n tabSize = this.getScreenTabSize(arr.length + offset);\n arr.push(TAB);\n for (var n = 1; n < tabSize; n++) {\n arr.push(TAB_SPACE);\n }\n }\n else if (c == 32) {\n arr.push(SPACE);\n } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n arr.push(PUNCTUATION);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n arr.push(CHAR, CHAR_EXT);\n } else {\n arr.push(CHAR);\n }\n }\n return arr;\n };\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn == 0)\n return [0, 0];\n if (maxScreenColumn == null)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n\n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charCodeAt(column);\n if (c == 9) {\n screenColumn += this.getScreenTabSize(screenColumn);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n screenColumn += 2;\n } else {\n screenColumn += 1;\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n\n return [screenColumn, column];\n };\n\n this.lineWidgets = null;\n this.getRowLength = function(row) {\n if (this.lineWidgets)\n var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n this.getRowLineCount = function(row) {\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1;\n } else {\n return this.$wrapData[row].length + 1;\n }\n };\n this.getScreenLastRowColumn = function(screenRow) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n return this.documentToScreenColumn(pos.row, pos.column);\n };\n this.getDocumentLastRowColumn = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.getScreenLastRowColumn(screenRow);\n };\n this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n };\n this.getRowSplitData = function(row) {\n if (!this.$useWrapMode) {\n return undefined;\n } else {\n return this.$wrapData[row];\n }\n };\n this.getScreenTabSize = function(screenColumn) {\n return this.$tabSize - screenColumn % this.$tabSize;\n };\n\n\n this.screenToDocumentRow = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).row;\n };\n\n\n this.screenToDocumentColumn = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).column;\n };\n this.screenToDocumentPosition = function(screenRow, screenColumn) {\n if (screenRow < 0)\n return {row: 0, column: 0};\n\n var line;\n var docRow = 0;\n var docColumn = 0;\n var column;\n var row = 0;\n var rowLength = 0;\n\n var rowCache = this.$screenRowCache;\n var i = this.$getRowCacheIndex(rowCache, screenRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var docRow = this.$docRowCache[i];\n var doCache = screenRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var maxRow = this.getLength() - 1;\n var foldLine = this.getNextFoldLine(docRow);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (row <= screenRow) {\n rowLength = this.getRowLength(docRow);\n if (row + rowLength > screenRow || docRow >= maxRow) {\n break;\n } else {\n row += rowLength;\n docRow++;\n if (docRow > foldStart) {\n docRow = foldLine.end.row+1;\n foldLine = this.getNextFoldLine(docRow, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n }\n\n if (doCache) {\n this.$docRowCache.push(docRow);\n this.$screenRowCache.push(row);\n }\n }\n\n if (foldLine && foldLine.start.row <= docRow) {\n line = this.getFoldDisplayLine(foldLine);\n docRow = foldLine.start.row;\n } else if (row + rowLength <= screenRow || docRow > maxRow) {\n return {\n row: maxRow,\n column: this.getLine(maxRow).length\n }\n } else {\n line = this.getLine(docRow);\n foldLine = null;\n }\n\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n var splitIndex = Math.floor(screenRow - row);\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n docColumn += this.$getStringScreenWidth(line, screenColumn)[1];\n if (this.$useWrapMode && docColumn >= column)\n docColumn = column - 1;\n\n if (foldLine)\n return foldLine.idxToPosition(docColumn);\n\n return {row: docRow, column: docColumn};\n };\n this.documentToScreenPosition = function(docRow, docColumn) {\n if (typeof docColumn === \"undefined\")\n var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n else\n pos = this.$clipPositionToDocument(docRow, docColumn);\n\n docRow = pos.row;\n docColumn = pos.column;\n\n var screenRow = 0;\n var foldStartRow = null;\n var fold = null;\n fold = this.getFoldAt(docRow, docColumn, 1);\n if (fold) {\n docRow = fold.start.row;\n docColumn = fold.start.column;\n }\n\n var rowEnd, row = 0;\n\n\n var rowCache = this.$docRowCache;\n var i = this.$getRowCacheIndex(rowCache, docRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var screenRow = this.$screenRowCache[i];\n var doCache = docRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var foldLine = this.getNextFoldLine(row);\n var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n while (row < docRow) {\n if (row >= foldStart) {\n rowEnd = foldLine.end.row + 1;\n if (rowEnd > docRow)\n break;\n foldLine = this.getNextFoldLine(rowEnd, foldLine);\n foldStart = foldLine ?foldLine.start.row :Infinity;\n }\n else {\n rowEnd = row + 1;\n }\n\n screenRow += this.getRowLength(row);\n row = rowEnd;\n\n if (doCache) {\n this.$docRowCache.push(row);\n this.$screenRowCache.push(screenRow);\n }\n }\n var textLine = \"\";\n if (foldLine && row >= foldStart) {\n textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n foldStartRow = foldLine.start.row;\n } else {\n textLine = this.getLine(docRow).substring(0, docColumn);\n foldStartRow = docRow;\n }\n if (this.$useWrapMode) {\n var wrapRow = this.$wrapData[foldStartRow];\n if (wrapRow) {\n var screenRowOffset = 0;\n while (textLine.length >= wrapRow[screenRowOffset]) {\n screenRow ++;\n screenRowOffset++;\n }\n textLine = textLine.substring(\n wrapRow[screenRowOffset - 1] || 0, textLine.length\n );\n }\n }\n\n return {\n row: screenRow,\n column: this.$getStringScreenWidth(textLine)[0]\n };\n };\n this.documentToScreenColumn = function(row, docColumn) {\n return this.documentToScreenPosition(row, docColumn).column;\n };\n this.documentToScreenRow = function(docRow, docColumn) {\n return this.documentToScreenPosition(docRow, docColumn).row;\n };\n this.getScreenLength = function() {\n var screenRows = 0;\n var fold = null;\n if (!this.$useWrapMode) {\n screenRows = this.getLength();\n var foldData = this.$foldData;\n for (var i = 0; i < foldData.length; i++) {\n fold = foldData[i];\n screenRows -= fold.end.row - fold.start.row;\n }\n } else {\n var lastRow = this.$wrapData.length;\n var row = 0, i = 0;\n var fold = this.$foldData[i++];\n var foldStart = fold ? fold.start.row :Infinity;\n\n while (row < lastRow) {\n var splits = this.$wrapData[row];\n screenRows += splits ? splits.length + 1 : 1;\n row ++;\n if (row > foldStart) {\n row = fold.end.row+1;\n fold = this.$foldData[i++];\n foldStart = fold ?fold.start.row :Infinity;\n }\n }\n }\n if (this.lineWidgets)\n screenRows += this.$getWidgetScreenLength();\n\n return screenRows;\n };\n this.$setFontMetrics = function(fm) {\n }\n function isFullWidth(c) {\n if (c < 0x1100)\n return false;\n return c >= 0x1100 && c <= 0x115F ||\n c >= 0x11A3 && c <= 0x11A7 ||\n c >= 0x11FA && c <= 0x11FF ||\n c >= 0x2329 && c <= 0x232A ||\n c >= 0x2E80 && c <= 0x2E99 ||\n c >= 0x2E9B && c <= 0x2EF3 ||\n c >= 0x2F00 && c <= 0x2FD5 ||\n c >= 0x2FF0 && c <= 0x2FFB ||\n c >= 0x3000 && c <= 0x303E ||\n c >= 0x3041 && c <= 0x3096 ||\n c >= 0x3099 && c <= 0x30FF ||\n c >= 0x3105 && c <= 0x312D ||\n c >= 0x3131 && c <= 0x318E ||\n c >= 0x3190 && c <= 0x31BA ||\n c >= 0x31C0 && c <= 0x31E3 ||\n c >= 0x31F0 && c <= 0x321E ||\n c >= 0x3220 && c <= 0x3247 ||\n c >= 0x3250 && c <= 0x32FE ||\n c >= 0x3300 && c <= 0x4DBF ||\n c >= 0x4E00 && c <= 0xA48C ||\n c >= 0xA490 && c <= 0xA4C6 ||\n c >= 0xA960 && c <= 0xA97C ||\n c >= 0xAC00 && c <= 0xD7A3 ||\n c >= 0xD7B0 && c <= 0xD7C6 ||\n c >= 0xD7CB && c <= 0xD7FB ||\n c >= 0xF900 && c <= 0xFAFF ||\n c >= 0xFE10 && c <= 0xFE19 ||\n c >= 0xFE30 && c <= 0xFE52 ||\n c >= 0xFE54 && c <= 0xFE66 ||\n c >= 0xFE68 && c <= 0xFE6B ||\n c >= 0xFF01 && c <= 0xFF60 ||\n c >= 0xFFE0 && c <= 0xFFE6;\n };\n\n}).call(EditSession.prototype);\n\nrequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nrequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n wrap: {\n set: function(value) {\n if (!value || value == \"off\")\n value = false;\n else if (value == \"free\")\n value = true;\n else if (value == \"printMargin\")\n value = -1;\n else if (typeof value == \"string\")\n value = parseInt(value, 10) || false;\n\n if (this.$wrap == value)\n return;\n if (!value) {\n this.setUseWrapMode(false);\n } else {\n var col = typeof value == \"number\" ? value : null;\n this.setWrapLimitRange(col, col);\n this.setUseWrapMode(true);\n }\n this.$wrap = value;\n },\n get: function() {\n if (this.getUseWrapMode()) {\n if (this.$wrap == -1)\n return \"printMargin\";\n if (!this.getWrapLimitRange().min)\n return \"free\";\n return this.$wrap;\n }\n return \"off\";\n },\n handlesSet: true\n }, \n wrapMethod: {\n set: function(val) {\n val = val == \"auto\"\n ? this.$mode.type != \"text\"\n : val != \"text\";\n if (val != this.$wrapAsCode) {\n this.$wrapAsCode = val;\n if (this.$useWrapMode) {\n this.$modified = true;\n this.$resetRowCache(0);\n this.$updateWrapData(0, this.getLength() - 1);\n }\n }\n },\n initialValue: \"auto\"\n },\n firstLineNumber: {\n set: function() {this._signal(\"changeBreakpoint\");},\n initialValue: 1\n },\n useWorker: {\n set: function(useWorker) {\n this.$useWorker = useWorker;\n\n this.$stopWorker();\n if (useWorker)\n this.$startWorker();\n },\n initialValue: true\n },\n useSoftTabs: {initialValue: true},\n tabSize: {\n set: function(tabSize) {\n if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n },\n initialValue: 4,\n handlesSet: true\n },\n overwrite: {\n set: function(val) {this._signal(\"changeOverwrite\");},\n initialValue: false\n },\n newLineMode: {\n set: function(val) {this.doc.setNewLineMode(val)},\n get: function() {return this.doc.getNewLineMode()},\n handlesSet: true\n },\n mode: {\n set: function(val) { this.setMode(val) },\n get: function() { return this.$modeId }\n }\n});\n\nexports.EditSession = EditSession;\n});\nace.define('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n HashHandler.call(this, commands, platform);\n this.byName = this.commands;\n this.setDefaultHandler(\"exec\", function(e) {\n return e.command.exec(e.editor, e.args || {});\n });\n};\n\noop.inherits(CommandManager, HashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (typeof command === 'string')\n command = this.commands[command];\n\n if (!command)\n return false;\n\n if (editor && editor.$readOnly && !command.readOnly)\n return false;\n\n var e = {editor: editor, command: command, args: args};\n var retvalue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return retvalue === false ? false : true;\n };\n\n this.toggleRecording = function(editor) {\n if (this.$inReplay)\n return;\n\n editor && editor._emit(\"changeStatus\");\n if (this.recording) {\n this.macro.pop();\n this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n if (!this.macro.length)\n this.macro = this.oldMacro;\n\n return this.recording = false;\n }\n if (!this.$addCommandToMacro) {\n this.$addCommandToMacro = function(e) {\n this.macro.push([e.command, e.args]);\n }.bind(this);\n }\n\n this.oldMacro = this.macro;\n this.macro = [];\n this.on(\"exec\", this.$addCommandToMacro);\n return this.recording = true;\n };\n\n this.replay = function(editor) {\n if (this.$inReplay || !this.macro)\n return;\n\n if (this.recording)\n return this.toggleRecording(editor);\n\n try {\n this.$inReplay = true;\n this.macro.forEach(function(x) {\n if (typeof x == \"string\")\n this.exec(x, editor);\n else\n this.exec(x[0], editor, x[1]);\n }, this);\n } finally {\n this.$inReplay = false;\n }\n };\n\n this.trimMacro = function(m) {\n return m.map(function(x){\n if (typeof x[0] != \"string\")\n x[0] = x[0].name;\n if (!x[1])\n x = x[0];\n return x;\n });\n };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define('ace/keyboard/keybinding', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/event'], function(require, exports, module) {\n\n\nvar keyUtil = require(\"../lib/keys\");\nvar event = require(\"../lib/event\");\n\nvar KeyBinding = function(editor) {\n this.$editor = editor;\n this.$data = {};\n this.$handlers = [];\n this.setDefaultHandler(editor.commands);\n};\n\n(function() {\n this.setDefaultHandler = function(kb) {\n this.removeKeyboardHandler(this.$defaultHandler);\n this.$defaultHandler = kb;\n this.addKeyboardHandler(kb, 0);\n this.$data = {editor: this.$editor};\n };\n\n this.setKeyboardHandler = function(kb) {\n var h = this.$handlers;\n if (h[h.length - 1] == kb)\n return;\n\n while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)\n this.removeKeyboardHandler(h[h.length - 1]);\n\n this.addKeyboardHandler(kb, 1);\n };\n\n this.addKeyboardHandler = function(kb, pos) {\n if (!kb)\n return;\n if (typeof kb == \"function\" && !kb.handleKeyboard)\n kb.handleKeyboard = kb;\n var i = this.$handlers.indexOf(kb);\n if (i != -1)\n this.$handlers.splice(i, 1);\n\n if (pos == undefined)\n this.$handlers.push(kb);\n else\n this.$handlers.splice(pos, 0, kb);\n\n if (i == -1 && kb.attach)\n kb.attach(this.$editor);\n };\n\n this.removeKeyboardHandler = function(kb) {\n var i = this.$handlers.indexOf(kb);\n if (i == -1)\n return false;\n this.$handlers.splice(i, 1);\n kb.detach && kb.detach(this.$editor);\n return true;\n };\n\n this.getKeyboardHandler = function() {\n return this.$handlers[this.$handlers.length - 1];\n };\n\n this.$callKeyboardHandlers = function (hashId, keyString, keyCode, e) {\n var toExecute;\n var success = false;\n var commands = this.$editor.commands;\n\n for (var i = this.$handlers.length; i--;) {\n toExecute = this.$handlers[i].handleKeyboard(\n this.$data, hashId, keyString, keyCode, e\n );\n if (!toExecute || !toExecute.command)\n continue;\n if (toExecute.command == \"null\") {\n success = true;\n } else {\n success = commands.exec(toExecute.command, this.$editor, toExecute.args, e); \n }\n if (success && e && hashId != -1 && \n toExecute.passEvent != true && toExecute.command.passEvent != true\n ) {\n event.stopEvent(e);\n }\n if (success)\n break;\n }\n return success;\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n var keyString = keyUtil.keyCodeToString(keyCode);\n this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n };\n\n this.onTextInput = function(text) {\n var success = this.$callKeyboardHandlers(-1, text);\n if (!success)\n this.$editor.commands.exec(\"insertstring\", this.$editor, text);\n };\n\n}).call(KeyBinding.prototype);\n\nexports.KeyBinding = KeyBinding;\n});\n\nace.define('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar keyUtil = require(\"../lib/keys\");\nvar useragent = require(\"../lib/useragent\");\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n if (this.__defineGetter__ && this.__defineSetter__ && typeof console != \"undefined\" && console.error) {\n var warned = false;\n var warn = function() {\n if (!warned) {\n warned = true;\n console.error(\"commmandKeyBinding has too many m's. use commandKeyBinding\");\n }\n };\n this.__defineGetter__(\"commmandKeyBinding\", function() {\n warn();\n return this.commandKeyBinding;\n });\n this.__defineSetter__(\"commmandKeyBinding\", function(val) {\n warn();\n return this.commandKeyBinding = val;\n });\n } else {\n this.commmandKeyBinding = this.commandKeyBinding;\n }\n\n this.addCommands(config);\n};\n\n(function() {\n\n this.addCommand = function(command) {\n if (this.commands[command.name])\n this.removeCommand(command);\n\n this.commands[command.name] = command;\n\n if (command.bindKey)\n this._buildKeyHash(command);\n };\n\n this.removeCommand = function(command) {\n var name = (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var hashId in ckb) {\n for (var key in ckb[hashId]) {\n if (ckb[hashId][key] == command)\n delete ckb[hashId][key];\n }\n }\n };\n\n this.bindKey = function(key, command) {\n if(!key)\n return;\n if (typeof command == \"function\") {\n this.addCommand({exec: command, bindKey: key, name: command.name || key});\n return;\n }\n\n var ckb = this.commandKeyBinding;\n key.split(\"|\").forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart, command);\n var hashId = binding.hashId;\n (ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command;\n }, this);\n };\n\n this.addCommands = function(commands) {\n commands && Object.keys(commands).forEach(function(name) {\n var command = commands[name];\n if (!command)\n return;\n \n if (typeof command === \"string\")\n return this.bindKey(command, name);\n\n if (typeof command === \"function\")\n command = { exec: command };\n\n if (typeof command !== \"object\")\n return;\n\n if (!command.name)\n command.name = name;\n\n this.addCommand(command);\n }, this);\n };\n\n this.removeCommands = function(commands) {\n Object.keys(commands).forEach(function(name) {\n this.removeCommand(commands[name]);\n }, this);\n };\n\n this.bindKeys = function(keyList) {\n Object.keys(keyList).forEach(function(key) {\n this.bindKey(key, keyList[key]);\n }, this);\n };\n\n this._buildKeyHash = function(command) {\n var binding = command.bindKey;\n if (!binding)\n return;\n\n var key = typeof binding == \"string\" ? binding: binding[this.platform];\n this.bindKey(key, command);\n };\n this.parseKeys = function(keys) {\n if (keys.indexOf(\" \") != -1)\n keys = keys.split(/\\s+/).pop();\n\n var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x});\n var key = parts.pop();\n\n var keyCode = keyUtil[key];\n if (keyUtil.FUNCTION_KEYS[keyCode])\n key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n else if (!parts.length)\n return {key: key, hashId: -1};\n else if (parts.length == 1 && parts[0] == \"shift\")\n return {key: key.toUpperCase(), hashId: -1};\n\n var hashId = 0;\n for (var i = parts.length; i--;) {\n var modifier = keyUtil.KEY_MODS[parts[i]];\n if (modifier == null) {\n if (typeof console != \"undefined\")\n console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n return false;\n }\n hashId |= modifier;\n }\n return {key: key, hashId: hashId};\n };\n\n this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n var ckbr = this.commandKeyBinding;\n return ckbr[hashId] && ckbr[hashId][keyString];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n return {\n command: this.findKeyCommand(hashId, keyString)\n };\n };\n\n}).call(HashHandler.prototype)\n\nexports.HashHandler = HashHandler;\n});\n\nace.define('ace/mouse/fold_handler', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction FoldHandler(editor) {\n\n editor.on(\"click\", function(e) {\n var position = e.getDocumentPosition();\n var session = editor.session;\n var fold = session.getFoldAt(position.row, position.column, 1);\n if (fold) {\n if (e.getAccelKey())\n session.removeFold(fold);\n else\n session.expandFold(fold);\n\n e.stop();\n }\n });\n\n editor.on(\"gutterclick\", function(e) {\n var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\") {\n var row = e.getDocumentPosition().row;\n var session = editor.session;\n if (session.foldWidgets && session.foldWidgets[row])\n editor.session.onFoldWidgetClick(row, e);\n if (!editor.isFocused())\n editor.focus();\n e.stop();\n }\n });\n\n editor.on(\"gutterdblclick\", function(e) {\n var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\") {\n var row = e.getDocumentPosition().row;\n var session = editor.session;\n var data = session.getParentFoldRangeData(row, true);\n var range = data.range || data.firstRange;\n\n if (range) {\n row = range.start.row;\n var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n\n if (fold) {\n session.removeFold(fold);\n } else {\n session.addFold(\"...\", range);\n editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});\n }\n }\n e.stop();\n }\n });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\nace.define('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\nvar config = require(\"../config\");\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/settings_menu\", function(module) {\n module.init(editor);\n editor.showSettingsMenu();\n });\n },\n readOnly: true\n}, {\n name: \"goToNextError\",\n bindKey: bindKey(\"Alt-E\", \"Ctrl-E\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Ctrl-Shift-E\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor) {\n var line = parseInt(prompt(\"Enter line number:\"), 10);\n if (!isNaN(line)) {\n editor.gotoLine(line);\n }\n },\n readOnly: true\n}, {\n name: \"fold\",\n bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n exec: function(editor) { editor.session.toggleFold(false); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfold\",\n bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n exec: function(editor) { editor.session.toggleFold(true); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n bindKey: bindKey(\"Ctrl-Alt-0\", \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n exec: function(editor) { \n editor.session.foldAll();\n editor.session.unfold(editor.selection.getAllRanges());\n },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfoldall\",\n bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n exec: function(editor) { editor.session.unfold(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findnext\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n readOnly: true\n}, {\n name: \"findprevious\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n bindKey: bindKey(\"ALt-K\", \"Ctrl-G\"),\n exec: function(editor) {\n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findNext(); \n },\n readOnly: true\n}, {\n name: \"selectOrFindPrevious\",\n bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n exec: function(editor) { \n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findPrevious();\n },\n readOnly: true\n}, {\n name: \"find\",\n bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor)});\n },\n readOnly: true\n}, {\n name: \"overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotostart\",\n bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n exec: function(editor) { editor.navigateFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectup\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"golineup\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotoend\",\n bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n exec: function(editor) { editor.navigateFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectdown\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n exec: function(editor, args) { editor.navigateDown(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordleft\",\n bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordleft\",\n bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n exec: function(editor) { editor.navigateWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolinestart\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n exec: function(editor) { editor.navigateLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectleft\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n exec: function(editor, args) { editor.navigateLeft(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordright\",\n bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordright\",\n bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n exec: function(editor) { editor.navigateWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolineend\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n exec: function(editor) { editor.navigateLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectright\",\n bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoright\",\n bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n exec: function(editor, args) { editor.navigateRight(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectpagedown\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n bindKey: bindKey(\"Ctrl-Up\", null),\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"scrolldown\",\n bindKey: bindKey(\"Ctrl-Down\", null),\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"selectlinestart\",\n bindKey: \"Shift-Home\",\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectlineend\",\n bindKey: \"Shift-End\",\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"togglerecording\",\n bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n exec: function(editor) { editor.commands.toggleRecording(editor); },\n readOnly: true\n}, {\n name: \"replaymacro\",\n bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n exec: function(editor) { editor.commands.replay(editor); },\n readOnly: true\n}, {\n name: \"jumptomatching\",\n bindKey: bindKey(\"Ctrl-P\", \"Ctrl-Shift-P\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n bindKey: bindKey(\"Ctrl-Shift-P\", null),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, \n{\n name: \"cut\",\n exec: function(editor) {\n var range = editor.getSelectionRange();\n editor._emit(\"cut\", range);\n\n if (!editor.selection.isEmpty()) {\n editor.session.remove(range);\n editor.clearSelection();\n }\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"removeline\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n exec: function(editor) { editor.duplicateSelection(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"sortlines\",\n bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n exec: function(editor) { editor.sortLines(); },\n scrollIntoView: \"selection\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"togglecomment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true)});\n }\n}, {\n name: \"undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n exec: function(editor) { editor.redo(); }\n}, {\n name: \"copylinesup\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n exec: function(editor) { editor.remove(\"right\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"backspace\",\n bindKey: bindKey(\n \"Shift-Backspace|Backspace\",\n \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n ),\n exec: function(editor) { editor.remove(\"left\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"cut_or_delete\",\n bindKey: bindKey(\"Shift-Delete\", null),\n exec: function(editor) { \n if (editor.selection.isEmpty()) {\n editor.remove(\"left\");\n } else {\n return false;\n }\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestart\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n exec: function(editor) { editor.removeWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordright\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n exec: function(editor, args) {\n editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"splitline\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n bindKey: bindKey(\"Ctrl-T\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}];\n\n});\n\nace.define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n\n if (typeof e != \"object\" || !e)\n e = {};\n\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n\n listeners = listeners.slice();\n for (var i=0; i 0;\n };\n this.hasRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.markClean = function() {\n this.dirtyCounter = 0;\n };\n this.isClean = function() {\n return this.dirtyCounter === 0;\n };\n\n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\nace.define('ace/lib/net', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\nvar dom = require(\"./dom\");\n\nexports.get = function (url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n callback(xhr.responseText);\n }\n };\n xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n var head = dom.getDocumentHead();\n var s = document.createElement('script');\n\n s.src = path;\n head.appendChild(s);\n\n s.onload = s.onreadystatechange = function(_, isAbort) {\n if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n s = s.onload = s.onreadystatechange = null;\n if (!isAbort)\n callback();\n }\n };\n};\n\n});\n\nace.define('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/config', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/layer/font_metrics', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar config = require(\"./config\");\nvar GutterLayer = require(\"./layer/gutter\").Gutter;\nvar MarkerLayer = require(\"./layer/marker\").Marker;\nvar TextLayer = require(\"./layer/text\").Text;\nvar CursorLayer = require(\"./layer/cursor\").Cursor;\nvar HScrollBar = require(\"./scrollbar\").HScrollBar;\nvar VScrollBar = require(\"./scrollbar\").VScrollBar;\nvar RenderLoop = require(\"./renderloop\").RenderLoop;\nvar FontMetrics = require(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\nfont-size: 12px;\\\nline-height: normal;\\\ndirection: ltr;\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: text;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging, .ace_dragging * {\\\ncursor: move !important;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: #f8f8f8;\\\ncolor: #111;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n/* setting pointer-events: auto; on node under the mouse, which changes\\\nduring scroll, will break mouse wheel scrolling in Safari */\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0px;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-moz-transition: opacity 0.18s;\\\n-webkit-transition: opacity 0.18s;\\\n-o-transition: opacity 0.18s;\\\n-ms-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_editor.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\n-moz-border-radius: 2px;\\\n-webkit-border-radius: 2px;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\ndisplay: block;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\n-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\n-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n/**\\\n* Dark version for fold widgets\\\n*/\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\n-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-moz-transition: opacity 0.4s ease 0.05s;\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\n-o-transition: opacity 0.4s ease 0.05s;\\\n-ms-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-moz-transition: opacity 0.05s ease 0.05s;\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\n-o-transition: opacity 0.05s ease 0.05s;\\\n-ms-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor\");\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n this.$keepTextAreaAtCursor = true;\n\n dom.addCssClass(this.container, \"ace_editor\");\n\n this.setTheme(theme);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container, 500);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._emit(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (!session)\n return;\n \n if (this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode()\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n\n if (this.$changedLines.firstRow > this.layerConfig.lastRow ||\n this.$changedLines.lastRow < this.layerConfig.firstRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n this.scrollBarH.element.style.left = \n this.scroller.style.left = gutterWidth + \"px\";\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \n \n this.scrollBarH.element.style.right = \n this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n changes |= this.CHANGE_FULL;\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function() {\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n this.$loop.schedule(this.CHANGE_MARKER);\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\")\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updateGutterLineHighlight = function() {\n var pos = this.$cursorLayer.$pixelPos;\n var height = this.layerConfig.lineHeight;\n if (this.session.getUseWrapMode()) {\n var cursor = this.session.selection.getCursor();\n cursor.column = 0;\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\n height *= this.session.getRowLength(cursor.row);\n }\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n this.$gutterLineHighlight.style.height = height + \"px\";\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.content;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (!this.$keepTextAreaAtCursor)\n return;\n var config = this.layerConfig;\n var posTop = this.$cursorLayer.$pixelPos.top;\n var posLeft = this.$cursorLayer.$pixelPos.left;\n posTop -= config.offset;\n\n var h = this.lineHeight;\n if (posTop < 0 || posTop > config.height - h)\n return;\n\n var w = this.characterWidth;\n if (this.$composition) {\n var val = this.textarea.value.replace(/^\\x01+/, \"\");\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\n h += 2;\n posTop -= 1;\n }\n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft -= this.scrollBar.width;\n\n this.textarea.style.height = h + \"px\";\n this.textarea.style.width = w + \"px\";\n this.textarea.style.right = Math.max(0, this.$size.scrollerWidth - posLeft - w) + \"px\";\n this.textarea.style.bottom = Math.max(0, this.$size.height - posTop - h) + \"px\";\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight);\n return this.layerConfig.firstRow - 1 + flint;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\");\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig();\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n this.content.style.marginTop = (-config.offset) + \"px\";\n this.content.style.width = config.width + 2 * this.$padding + \"px\";\n this.content.style.height = config.minHeight + \"px\";\n }\n if (changes & this.CHANGE_H_SCROLL) {\n this.content.style.marginLeft = -this.scrollLeft + \"px\";\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this._signal(\"afterRender\");\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\");\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\");\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.max(\n (this.$minLines||1) * this.lineHeight,\n Math.min(maxHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n var vScroll = height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n }\n };\n \n this.$computeLayerConfig = function() {\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var offset = this.scrollTop % this.lineHeight;\n var minHeight = size.scrollerHeight + this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n \n if (!this.$maxLines && this.$scrollPastEnd) {\n if (this.scrollTop > maxHeight - size.scrollerHeight)\n maxHeight += Math.min(\n (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd,\n this.scrollTop - maxHeight + size.scrollerHeight\n );\n }\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight < 0);\n var vScrollChanged = this.$vScroll !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n this.session.setScrollTop(Math.max(-this.scrollMargin.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + this.scrollMargin.bottom)));\n\n this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + this.scrollMargin.right)));\n\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)),\n height : this.$size.scrollerHeight\n };\n\n return changes;\n };\n\n this.$updateLines = function() {\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(y);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight - (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n\n var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n\n var col = Math.round(\n (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n );\n\n var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0));\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + Math.round(pos.column * this.characterWidth);\n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(position) {\n if (!this.$composition)\n this.$composition = {\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n cssText: this.textarea.style.cssText\n };\n\n this.$keepTextAreaAtCursor = true;\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n };\n this.setCompositionText = function(text) {\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n this.textarea.style.cssText = this.$composition.cssText;\n this.$composition = null;\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module.cssClass)\n return;\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container.ownerDocument\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n if (this.content.style.cursor != style)\n this.content.style.cursor = style;\n };\n this.setMouseCursor = function(cursorStyle) {\n this.content.style.cursor = cursorStyle;\n };\n this.destroy = function() {\n this.$textLayer.destroy();\n this.$cursorLayer.destroy();\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},\n initialValue: true\n },\n showLineNumbers: {\n set: function(show) {\n this.$gutterLayer.setShowLineNumbers(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n if (!this.$gutterLineHighlight) {\n this.$gutterLineHighlight = dom.createElement(\"div\");\n this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n this.$gutter.appendChild(this.$gutterLineHighlight);\n return;\n }\n\n this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n if (this.$cursorLayer.$pixelPos)\n this.$updateGutterLineHighlight();\n },\n initialValue: false,\n value: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val) },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) {\n\"no use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar net = require(\"./lib/net\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar global = (function() {\n return this;\n})();\n\nvar options = {\n packaged: false,\n workerPath: null,\n modePath: null,\n themePath: null,\n basePath: \"\",\n suffix: \".js\",\n $moduleUrls: {}\n};\n\nexports.get = function(key) {\n if (!options.hasOwnProperty(key))\n throw new Error(\"Unknown config key: \" + key);\n\n return options[key];\n};\n\nexports.set = function(key, value) {\n if (!options.hasOwnProperty(key))\n throw new Error(\"Unknown config key: \" + key);\n\n options[key] = value;\n};\n\nexports.all = function() {\n return lang.copyObject(options);\n};\noop.implement(exports, EventEmitter);\n\nexports.moduleUrl = function(name, component) {\n if (options.$moduleUrls[name])\n return options.$moduleUrls[name];\n\n var parts = name.split(\"/\");\n component = component || parts[parts.length - 2] || \"\";\n var sep = component == \"snippets\" ? \"/\" : \"-\";\n var base = parts[parts.length - 1]; \n if (sep == \"-\") {\n var re = new RegExp(\"^\" + component + \"[\\\\-_]|[\\\\-_]\" + component + \"$\", \"g\");\n base = base.replace(re, \"\");\n }\n\n if ((!base || base == component) && parts.length > 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = require(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n require([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);\n\n if (!global.document)\n return \"\";\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n\n var scripts = document.getElementsByTagName(\"script\");\n for (var i=0; i foldStart) {\n row = fold.end.row + 1;\n fold = session.getNextFoldLine(row, fold);\n foldStart = fold ? fold.start.row : Infinity;\n }\n if (row > lastRow) {\n while (this.$cells.length > index + 1) {\n cell = this.$cells.pop();\n this.element.removeChild(cell.element);\n }\n break;\n }\n\n cell = this.$cells[++index];\n if (!cell) {\n cell = {element: null, textNode: null, foldWidget: null};\n cell.element = dom.createElement(\"div\");\n cell.textNode = document.createTextNode('');\n cell.element.appendChild(cell.textNode);\n this.element.appendChild(cell.element);\n this.$cells[index] = cell;\n }\n\n var className = \"ace_gutter-cell \";\n if (breakpoints[row])\n className += breakpoints[row];\n if (decorations[row])\n className += decorations[row];\n if (this.$annotations[row])\n className += this.$annotations[row].className;\n if (cell.element.className != className)\n cell.element.className = className;\n\n var height = session.getRowLength(row) * config.lineHeight + \"px\";\n if (height != cell.element.style.height)\n cell.element.style.height = height;\n\n if (foldWidgets) {\n var c = foldWidgets[row];\n if (c == null)\n c = foldWidgets[row] = session.getFoldWidget(row);\n }\n\n if (c) {\n if (!cell.foldWidget) {\n cell.foldWidget = dom.createElement(\"span\");\n cell.element.appendChild(cell.foldWidget);\n }\n var className = \"ace_fold-widget ace_\" + c;\n if (c == \"start\" && row == foldStart && row < fold.end.row)\n className += \" ace_closed\";\n else\n className += \" ace_open\";\n if (cell.foldWidget.className != className)\n cell.foldWidget.className = className;\n\n var height = config.lineHeight + \"px\";\n if (cell.foldWidget.style.height != height)\n cell.foldWidget.style.height = height;\n } else {\n if (cell.foldWidget) {\n cell.element.removeChild(cell.foldWidget);\n cell.foldWidget = null;\n }\n }\n \n var text = lastLineNumber = gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber;\n if (text != cell.textNode.data)\n cell.textNode.data = text;\n\n row++;\n }\n\n this.element.style.height = config.minHeight + \"px\";\n\n if (this.$fixedWidth || session.$useWrapMode)\n lastLineNumber = session.getLength() + firstLineNumber;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineNumber, config)\n : lastLineNumber.toString().length * config.characterWidth;\n \n var padding = this.$padding || this.$computePadding();\n gutterWidth += padding.left + padding.right;\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n this.gutterWidth = gutterWidth;\n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._emit(\"changeGutterWidth\", gutterWidth);\n }\n };\n\n this.$fixedWidth = false;\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return \"\"},\n getText: function() {return \"\"}\n };\n };\n \n this.getShowLineNumbers = function() {\n return this.$showLineNumbers;\n };\n \n this.$showFoldWidgets = true;\n this.setShowFoldWidgets = function(show) {\n if (show)\n dom.addCssClass(this.element, \"ace_folding-enabled\");\n else\n dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n this.$showFoldWidgets = show;\n this.$padding = null;\n };\n \n this.getShowFoldWidgets = function() {\n return this.$showFoldWidgets;\n };\n\n this.$computePadding = function() {\n if (!this.element.firstChild)\n return {left: 0, right: 0};\n var style = dom.computedStyle(this.element.firstChild);\n this.$padding = {};\n this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n this.$padding.right = parseInt(style.paddingRight) || 0;\n return this.$padding;\n };\n\n this.getRegion = function(point) {\n var padding = this.$padding || this.$computePadding();\n var rect = this.element.getBoundingClientRect();\n if (point.x < padding.left + rect.left)\n return \"markers\";\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n return \"foldWidgets\";\n };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define('ace/mouse/dragdrop_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n var editor = mouseHandler.editor;\n\n var blankImage = dom.createElement(\"img\");\n blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (useragent.isOpera)\n blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n var mouseTarget = editor.container;\n var dragSelectionMarker, x, y;\n var timerId, range;\n var dragCursor, counter = 0;\n var dragOperation;\n var isInternal;\n var autoScrollStartTime;\n var cursorMovedTime;\n var cursorPointOnCaretMoved;\n\n this.onDragStart = function(e) {\n if (this.cancelDrag || !mouseTarget.draggable) {\n var self = this;\n setTimeout(function(){\n self.startSelect();\n self.captureMouse(e);\n }, 0);\n return e.preventDefault();\n }\n range = editor.getSelectionRange();\n\n var dataTransfer = e.dataTransfer;\n dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n if (useragent.isOpera) {\n editor.container.appendChild(blankImage);\n blankImage._top = blankImage.offsetTop;\n }\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n if (useragent.isOpera) {\n editor.container.removeChild(blankImage);\n }\n dataTransfer.clearData();\n dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n isInternal = true;\n this.setState(\"drag\");\n };\n\n this.onDragEnd = function(e) {\n mouseTarget.draggable = false;\n isInternal = false;\n this.setState(null);\n if (!editor.getReadOnly()) {\n var dropEffect = e.dataTransfer.dropEffect;\n if (!dragOperation && dropEffect == \"move\")\n editor.session.remove(editor.getSelectionRange());\n editor.renderer.$cursorLayer.setBlinking(true);\n }\n this.editor.unsetStyle(\"ace_dragging\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n if (!dragSelectionMarker)\n addDragMarker();\n counter++;\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragOver = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\n x = e.clientX;\n y = e.clientY;\n\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragLeave = function(e) {\n counter--;\n if (counter <= 0 && dragSelectionMarker) {\n clearDragMarker();\n dragOperation = null;\n return event.preventDefault(e);\n }\n };\n\n this.onDrop = function(e) {\n if (!dragSelectionMarker)\n return;\n var dataTransfer = e.dataTransfer;\n if (isInternal) {\n switch (dragOperation) {\n case \"move\":\n if (range.contains(dragCursor.row, dragCursor.column)) {\n range = {\n start: dragCursor,\n end: dragCursor\n };\n } else {\n range = editor.moveText(range, dragCursor);\n }\n break;\n case \"copy\":\n range = editor.moveText(range, dragCursor, true);\n break;\n }\n } else {\n var dropData = dataTransfer.getData('Text');\n range = {\n start: dragCursor,\n end: editor.session.insert(dragCursor, dropData)\n };\n editor.focus();\n dragOperation = null;\n }\n clearDragMarker();\n return event.preventDefault(e);\n };\n\n event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n function scrollCursorIntoView(cursor, prevCursor) {\n var now = Date.now();\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\n if (!cursorMovedTime || vMovement || hMovement) {\n editor.$blockScrolling += 1;\n editor.moveCursorToPosition(cursor);\n editor.$blockScrolling -= 1;\n cursorMovedTime = now;\n cursorPointOnCaretMoved = {x: x, y: y};\n } else {\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\n cursorMovedTime = null;\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n editor.renderer.scrollCursorIntoView();\n cursorMovedTime = null;\n }\n }\n }\n\n function autoScroll(cursor, prevCursor) {\n var now = Date.now();\n var lineHeight = editor.renderer.layerConfig.lineHeight;\n var characterWidth = editor.renderer.layerConfig.characterWidth;\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\n var offsets = {\n x: {\n left: x - editorRect.left,\n right: editorRect.right - x\n },\n y: {\n top: y - editorRect.top,\n bottom: editorRect.bottom - y\n }\n };\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n var scrollCursor = {row: cursor.row, column: cursor.column};\n if (nearestXOffset / characterWidth <= 2) {\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n }\n if (nearestYOffset / lineHeight <= 1) {\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n }\n var vScroll = cursor.row != scrollCursor.row;\n var hScroll = cursor.column != scrollCursor.column;\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n if (vScroll || (hScroll && !vMovement)) {\n if (!autoScrollStartTime)\n autoScrollStartTime = now;\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n editor.renderer.scrollCursorIntoView(scrollCursor);\n } else {\n autoScrollStartTime = null;\n }\n }\n\n function onDragInterval() {\n var prevCursor = dragCursor;\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n scrollCursorIntoView(dragCursor, prevCursor);\n autoScroll(dragCursor, prevCursor);\n }\n\n function addDragMarker() {\n range = editor.selection.toOrientedRange();\n dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n editor.clearSelection();\n if (editor.isFocused())\n editor.renderer.$cursorLayer.setBlinking(false);\n clearInterval(timerId);\n timerId = setInterval(onDragInterval, 20);\n counter = 0;\n event.addListener(document, \"mousemove\", onMouseMove);\n }\n\n function clearDragMarker() {\n clearInterval(timerId);\n editor.session.removeMarker(dragSelectionMarker);\n dragSelectionMarker = null;\n editor.$blockScrolling += 1;\n editor.selection.fromOrientedRange(range);\n editor.$blockScrolling -= 1;\n if (editor.isFocused() && !isInternal)\n editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n range = null;\n counter = 0;\n autoScrollStartTime = null;\n cursorMovedTime = null;\n event.removeListener(document, \"mousemove\", onMouseMove);\n }\n var onMouseMoveTimer = null;\n function onMouseMove() {\n if (onMouseMoveTimer == null) {\n onMouseMoveTimer = setTimeout(function() {\n if (onMouseMoveTimer != null && dragSelectionMarker)\n clearDragMarker();\n }, 20);\n }\n }\n\n function canAccept(dataTransfer) {\n var types = dataTransfer.types;\n return !types || Array.prototype.some.call(types, function(type) {\n return type == 'text/plain' || type == 'Text';\n });\n }\n\n function getDropEffect(e) {\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n var effectAllowed = \"uninitialized\";\n try {\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n } catch (e) {}\n var dropEffect = \"none\";\n\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"move\";\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n\n return dropEffect;\n }\n}\n\n(function() {\n\n this.dragWait = function() {\n var interval = Date.now() - this.mousedownEvent.time;\n if (interval > this.editor.getDragDelay())\n this.startDrag();\n };\n\n this.dragWaitEnd = function() {\n var target = this.editor.container;\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n this.selectEnd();\n };\n\n this.dragReadyEnd = function(e) {\n this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n this.editor.unsetStyle(\"ace_dragging\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var target = this.editor.container;\n target.draggable = true;\n this.editor.renderer.$cursorLayer.setBlinking(false);\n this.editor.setStyle(\"ace_dragging\");\n this.setState(\"dragReady\");\n };\n\n this.onMouseDrag = function(e) {\n var target = this.editor.container;\n if (useragent.isIE && this.state == \"dragReady\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 3)\n target.dragDrop();\n }\n if (this.state === \"dragWait\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 0) {\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n }\n }\n };\n\n this.onMouseDown = function(e) {\n if (!this.$dragEnabled)\n return;\n this.mousedownEvent = e;\n var editor = this.editor;\n\n var inSelection = e.inSelection();\n var button = e.getButton();\n var clickCount = e.domEvent.detail || 1;\n if (clickCount === 1 && button === 0 && inSelection) {\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n return;\n this.mousedownEvent.time = Date.now();\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n if (\"unselectable\" in eventTarget)\n eventTarget.unselectable = \"on\";\n if (editor.getDragDelay()) {\n if (useragent.isWebKit) {\n this.cancelDrag = true;\n var mouseTarget = editor.container;\n mouseTarget.draggable = true;\n }\n this.setState(\"dragWait\");\n } else {\n this.startDrag();\n }\n this.captureMouse(e, this.onMouseDrag.bind(this));\n e.defaultPrevented = true;\n }\n };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar dom = require(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_marker-layer\";\n parentEl.appendChild(this.element);\n};\n\n(function() {\n\n this.$padding = 0;\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n this.setSession = function(session) {\n this.session = session;\n };\n \n this.setMarkers = function(markers) {\n this.markers = markers;\n };\n\n this.update = function(config) {\n var config = config || this.config;\n if (!config)\n return;\n\n this.config = config;\n\n\n var html = [];\n for (var key in this.markers) {\n var marker = this.markers[key];\n\n if (!marker.range) {\n marker.update(html, this, this.session, config);\n continue;\n }\n\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\n if (range.isEmpty()) continue;\n\n range = range.toScreenRange(this.session);\n if (marker.renderer) {\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n marker.renderer(html, range, left, top, config);\n } else if (marker.type == \"fullLine\") {\n this.drawFullLineMarker(html, range, marker.clazz, config);\n } else if (marker.type == \"screenLine\") {\n this.drawScreenLineMarker(html, range, marker.clazz, config);\n } else if (range.isMultiLine()) {\n if (marker.type == \"text\")\n this.drawTextMarker(html, range, marker.clazz, config);\n else\n this.drawMultiLineMarker(html, range, marker.clazz, config);\n } else {\n this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\", config);\n }\n }\n this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var row = range.start.row;\n\n var lineRange = new Range(\n row, range.start.column,\n row, this.session.getScreenLastRowColumn(row)\n );\n this.drawSingleLineMarker(stringBuilder, lineRange, clazz + \" ace_start\", layerConfig, 1, extraStyle);\n row = range.end.row;\n lineRange = new Range(row, 0, row, range.end.column);\n this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle);\n\n for (row = range.start.row + 1; row < range.end.row; row++) {\n lineRange.start.row = row;\n lineRange.end.row = row;\n lineRange.end.column = this.session.getScreenLastRowColumn(row);\n this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle);\n }\n };\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var padding = this.$padding;\n var height = config.lineHeight;\n var top = this.$getTop(range.start.row, config);\n var left = padding + range.start.column * config.characterWidth;\n extraStyle = extraStyle || \"\";\n\n stringBuilder.push(\n \"
\"\n );\n top = this.$getTop(range.end.row, config);\n var width = range.end.column * config.characterWidth;\n\n stringBuilder.push(\n \"
\"\n );\n height = (range.end.row - range.start.row - 1) * config.lineHeight;\n if (height < 0)\n return;\n top = this.$getTop(range.start.row + 1, config);\n\n stringBuilder.push(\n \"
\"\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight;\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n\n stringBuilder.push(\n \"
\"\n );\n };\n\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n if (range.start.row != range.end.row)\n height += this.$getTop(range.end.row, config) - top;\n\n stringBuilder.push(\n \"
\"\n );\n };\n \n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n\n stringBuilder.push(\n \"
\"\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n this.domEvent = domEvent;\n this.editor = editor;\n \n this.x = this.clientX = domEvent.clientX;\n this.y = this.clientY = domEvent.clientY;\n\n this.$pos = null;\n this.$inSelection = null;\n \n this.propagationStopped = false;\n this.defaultPrevented = false;\n};\n\n(function() { \n \n this.stopPropagation = function() {\n event.stopPropagation(this.domEvent);\n this.propagationStopped = true;\n };\n \n this.preventDefault = function() {\n event.preventDefault(this.domEvent);\n this.defaultPrevented = true;\n };\n \n this.stop = function() {\n this.stopPropagation();\n this.preventDefault();\n };\n this.getDocumentPosition = function() {\n if (this.$pos)\n return this.$pos;\n \n this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n return this.$pos;\n };\n this.inSelection = function() {\n if (this.$inSelection !== null)\n return this.$inSelection;\n \n var editor = this.editor;\n \n\n var selectionRange = editor.getSelectionRange();\n if (selectionRange.isEmpty())\n this.$inSelection = false;\n else {\n var pos = this.getDocumentPosition();\n this.$inSelection = selectionRange.contains(pos.row, pos.column);\n }\n\n return this.$inSelection;\n };\n this.getButton = function() {\n return event.getButton(this.domEvent);\n };\n this.getShiftKey = function() {\n return this.domEvent.shiftKey;\n };\n \n this.getAccelKey = useragent.isMac\n ? function() { return this.domEvent.metaKey; }\n : function() { return this.domEvent.ctrlKey; };\n \n}).call(MouseEvent.prototype);\n\n});\n\nace.define('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_text-layer\";\n parentEl.appendChild(this.element);\n this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.EOF_CHAR = \"\\xB6\";\n this.EOL_CHAR_LF = \"\\xAC\";\n this.EOL_CHAR_CRLF = \"\\xa4\";\n this.EOL_CHAR = this.EOL_CHAR_LF;\n this.TAB_CHAR = \"\\u2192\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n\n this.$updateEolChar = function() {\n var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n ? this.EOL_CHAR_LF\n : this.EOL_CHAR_CRLF;\n if (this.EOL_CHAR != EOL_CHAR) {\n this.EOL_CHAR = EOL_CHAR;\n return true;\n }\n }\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.element.style.padding = \"0 \" + padding + \"px\";\n };\n\n this.getLineHeight = function() {\n return this.$fontMetrics.$characterSize.height || 0;\n };\n\n this.getCharacterWidth = function() {\n return this.$fontMetrics.$characterSize.width || 0;\n };\n \n this.$setFontMetrics = function(measure) {\n this.$fontMetrics = measure;\n this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n this._signal(\"changeCharacterSize\", e);\n }.bind(this));\n this.$pollSizeChanges();\n }\n\n this.checkForSizeChanges = function() {\n this.$fontMetrics.checkForSizeChanges();\n };\n this.$pollSizeChanges = function() {\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n };\n this.setSession = function(session) {\n this.session = session;\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n this.$computeTabString();\n return true;\n };\n\n this.displayIndentGuides = true;\n this.setDisplayIndentGuides = function(display) {\n if (this.displayIndentGuides == display)\n return false;\n\n this.displayIndentGuides = display;\n this.$computeTabString();\n return true;\n };\n\n this.$tabStrings = [];\n this.onChangeTabSize =\n this.$computeTabString = function() {\n var tabSize = this.session.getTabSize();\n this.tabSize = tabSize;\n var tabStr = this.$tabStrings = [0];\n for (var i = 1; i < tabSize + 1; i++) {\n if (this.showInvisibles) {\n tabStr.push(\"\"\n + this.TAB_CHAR\n + lang.stringRepeat(\"\\xa0\", i - 1)\n + \"\");\n } else {\n tabStr.push(lang.stringRepeat(\"\\xa0\", i));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n if (this.showInvisibles) {\n className += \" ace_invisible\";\n var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n var tabContent = this.TAB_CHAR + lang.stringRepeat(\"\\xa0\", this.tabSize - 1);\n } else{\n var spaceContent = lang.stringRepeat(\"\\xa0\", this.tabSize);\n var tabContent = spaceContent;\n }\n\n this.$tabStrings[\" \"] = \"\" + spaceContent + \"\";\n this.$tabStrings[\"\\t\"] = \"\" + tabContent + \"\";\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n this.scrollLines(config);\n }\n this.config = config;\n\n var first = Math.max(firstRow, config.firstRow);\n var last = Math.min(lastRow, config.lastRow);\n\n var lineElements = this.element.childNodes;\n var lineElementsIdx = 0;\n\n for (var row = config.firstRow; row < first; row++) {\n var foldLine = this.session.getFoldLine(row);\n if (foldLine) {\n if (foldLine.containsRow(first)) {\n first = foldLine.start.row;\n break;\n } else {\n row = foldLine.end.row;\n }\n }\n lineElementsIdx ++;\n }\n\n var row = first;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > last)\n break;\n\n var lineElement = lineElements[lineElementsIdx++];\n if (lineElement) {\n var html = [];\n this.$renderLine(\n html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n );\n lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n dom.setInnerHtml(lineElement, html.join(\"\"));\n }\n row++;\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\n return this.update(config);\n\n if (config.lastRow < oldConfig.firstRow)\n return this.update(config);\n\n var el = this.element;\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n el.removeChild(el.firstChild);\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n el.removeChild(el.lastChild);\n\n if (config.firstRow < oldConfig.firstRow) {\n var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n if (el.firstChild)\n el.insertBefore(fragment, el.firstChild);\n else\n el.appendChild(fragment);\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n el.appendChild(fragment);\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = this.element.ownerDocument.createDocumentFragment();\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var container = dom.createElement(\"div\");\n\n var html = [];\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n container.innerHTML = html.join(\"\");\n if (this.$useLineGroups()) {\n container.className = 'ace_line_group';\n fragment.appendChild(container);\n container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n } else {\n while(container.firstChild)\n fragment.appendChild(container.firstChild);\n }\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.config = config;\n\n var html = [];\n var firstRow = config.firstRow, lastRow = config.lastRow;\n\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > lastRow)\n break;\n\n if (this.$useLineGroups())\n html.push(\"
\")\n\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups())\n html.push(\"
\"); // end the line group\n\n row++;\n }\n this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n var self = this;\n var replaceReg = /\\t|&|<|( +)|([\\x00-\\x1f\\x80-\\xa0\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g;\n var replaceFunc = function(c, a, b, tabIdx, idx4) {\n if (a) {\n return self.showInvisibles ?\n \"\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"\" :\n lang.stringRepeat(\"\\xa0\", c.length);\n } else if (c == \"&\") {\n return \"&\";\n } else if (c == \"<\") {\n return \"<\";\n } else if (c == \"\\t\") {\n var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n screenColumn += tabSize - 1;\n return self.$tabStrings[tabSize];\n } else if (c == \"\\u3000\") {\n var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible\" : \"ace_cjk\";\n var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n screenColumn += 1;\n return \"\" + space + \"\";\n } else if (b) {\n return \"\" + self.SPACE_CHAR + \"\";\n } else {\n screenColumn += 1;\n return \"\" + c + \"\";\n }\n };\n\n var output = value.replace(replaceReg, replaceFunc);\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var style = \"\";\n if (token.type == \"fold\")\n style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n stringBuilder.push(\"\", output, \"\");\n }\n else {\n stringBuilder.push(output);\n }\n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(stringBuilder, value, max) {\n var cols = value.search(this.$indentGuideRe);\n if (cols <= 0 || cols >= max)\n return value;\n if (value[0] == \" \") {\n cols -= cols % this.tabSize;\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n return value.substr(cols);\n } else if (value[0] == \"\\t\") {\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n return value.substr(cols);\n }\n return value;\n };\n\n this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n var chars = 0;\n var split = 0;\n var splitChars = splits[0];\n var screenColumn = 0;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n var value = token.value;\n if (i == 0 && this.displayIndentGuides) {\n chars = value.length;\n value = this.renderIndentGuide(stringBuilder, value, splitChars);\n if (!value)\n continue;\n chars -= value.length;\n }\n\n if (chars + value.length < splitChars) {\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n chars += value.length;\n } else {\n while (chars + value.length >= splitChars) {\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n if (!onlyContents) {\n stringBuilder.push(\"\",\n \"
\"\n );\n }\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn, token, value\n );\n }\n }\n }\n };\n\n this.$renderSimpleLine = function(stringBuilder, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(stringBuilder, value);\n if (value)\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n }\n };\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n\n if (!onlyContents) {\n stringBuilder.push(\n \"
\"\n );\n }\n\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length)\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n else\n this.$renderSimpleLine(stringBuilder, tokens);\n }\n\n if (this.showInvisibles) {\n if (foldLine)\n row = foldLine.end.row\n\n stringBuilder.push(\n \"\",\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n \"\"\n );\n }\n if (!onlyContents)\n stringBuilder.push(\"
\");\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$measureNode)\n this.$measureNode.parentNode.removeChild(this.$measureNode);\n delete this.$measureNode;\n };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define('ace/tooltip', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n this.isOpen = false;\n this.$element = null;\n this.$parentNode = parentNode;\n}\n\n(function() {\n this.$init = function() {\n this.$element = dom.createElement(\"div\");\n this.$element.className = \"ace_tooltip\";\n this.$element.style.display = \"none\";\n this.$parentNode.appendChild(this.$element);\n return this.$element;\n };\n this.getElement = function() {\n return this.$element || this.$init();\n };\n this.setText = function(text) {\n dom.setInnerText(this.getElement(), text);\n };\n this.setHtml = function(html) {\n this.getElement().innerHTML = html;\n };\n this.setPosition = function(x, y) {\n this.getElement().style.left = x + \"px\";\n this.getElement().style.top = y + \"px\";\n };\n this.setClassName = function(className) {\n dom.addCssClass(this.getElement(), className);\n };\n this.show = function(text, x, y) {\n if (text != null)\n this.setText(text);\n if (x != null && y != null)\n this.setPosition(x, y);\n if (!this.isOpen) {\n this.getElement().style.display = \"block\";\n this.isOpen = true;\n }\n };\n\n this.hide = function() {\n if (this.isOpen) {\n this.getElement().style.display = \"none\";\n this.isOpen = false;\n }\n };\n this.getHeight = function() {\n return this.getElement().offsetHeight;\n };\n this.getWidth = function() {\n return this.getElement().offsetWidth;\n };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar IE8;\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n if (IE8 === undefined)\n IE8 = \"opacity\" in this.element;\n\n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = this.$updateVisibility.bind(this);\n};\n\n(function() {\n \n this.$updateVisibility = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.visibility = val ? \"\" : \"hidden\";\n };\n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.opacity = val ? \"\" : \"0\";\n };\n \n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking){\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval){\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking && !IE8) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.$updateCursors = (smoothBlinking \n ? this.$updateOpacity\n : this.$updateVisibility).bind(this);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n if (this.smoothBlinking) {\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n return;\n\n if (this.smoothBlinking) {\n setTimeout(function(){\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }.bind(this));\n }\n \n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n\n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n\n blink();\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + pos.column * this.config.characterWidth;\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n\n style.left = pixelPos.left + \"px\";\n style.top = pixelPos.top + \"px\";\n style.width = config.characterWidth + \"px\";\n style.height = config.lineHeight + \"px\";\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/event', 'ace/tooltip'], function(require, exports, module) {\n\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar event = require(\"../lib/event\");\nvar Tooltip = require(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n var editor = mouseHandler.editor;\n var gutter = editor.renderer.$gutterLayer;\n var tooltip = new GutterTooltip(editor.container);\n\n mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n if (!editor.isFocused() || e.getButton() != 0)\n return;\n var gutterRegion = gutter.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\")\n return;\n\n var row = e.getDocumentPosition().row;\n var selection = editor.session.selection;\n\n if (e.getShiftKey())\n selection.selectTo(row, 0);\n else {\n if (e.domEvent.detail == 2) {\n editor.selectAll();\n return e.preventDefault();\n }\n mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n }\n mouseHandler.setState(\"selectByLines\");\n mouseHandler.captureMouse(e);\n return e.preventDefault();\n });\n\n\n var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n function showTooltip() {\n var row = mouseEvent.getDocumentPosition().row;\n var annotation = gutter.$annotations[row];\n if (!annotation)\n return hideTooltip();\n\n var maxRow = editor.session.getLength();\n if (row == maxRow) {\n var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n var pos = mouseEvent.$pos;\n if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n return hideTooltip();\n }\n\n if (tooltipAnnotation == annotation)\n return;\n tooltipAnnotation = annotation.text.join(\"
\");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = gutter.$cells[row].element;\n var rect = gutterElement.getBoundingClientRect();\n var style = tooltip.getElement().style;\n style.left = rect.right + \"px\";\n style.top = rect.bottom + \"px\";\n }\n }\n\n function hideTooltip() {\n if (tooltipTimeout)\n tooltipTimeout = clearTimeout(tooltipTimeout);\n if (tooltipAnnotation) {\n tooltip.hide();\n tooltipAnnotation = null;\n editor.removeEventListener(\"mousewheel\", hideTooltip);\n }\n }\n\n function moveTooltip(e) {\n tooltip.setPosition(e.x, e.y);\n }\n\n mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n var target = e.domEvent.target || e.domEvent.srcElement;\n if (dom.hasCssClass(target, \"ace_fold-widget\"))\n return hideTooltip();\n\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n moveTooltip(e);\n\n mouseEvent = e;\n if (tooltipTimeout)\n return;\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n if (mouseEvent && !mouseHandler.isMousePressed)\n showTooltip();\n else\n hideTooltip();\n }, 50);\n });\n\n event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n mouseEvent = null;\n if (!tooltipAnnotation || tooltipTimeout)\n return;\n\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n hideTooltip();\n }, 50);\n });\n \n editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n this.setPosition = function(x, y) {\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n var width = this.getWidth();\n var height = this.getHeight();\n x += 15;\n y += 15;\n if (x + width > windowWidth) {\n x -= (x + width) - windowWidth;\n }\n if (y + height > windowHeight) {\n y -= 20 + height;\n }\n Tooltip.prototype.setPosition.call(this, x, y);\n };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return this.isVisible ? this.width : 0;\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight = function(height) {\n this.inner.style.height = height + \"px\";\n };\n this.setScrollHeight = function(height) {\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = this.element.scrollTop = scrollTop;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define('ace/mouse/default_handlers', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\n\nfunction DefaultHandlers(mouseHandler) {\n mouseHandler.$clickSelection = null;\n\n var editor = mouseHandler.editor;\n editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n\n var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n this.onMouseDown = function(ev) {\n var inSelection = ev.inSelection();\n var pos = ev.getDocumentPosition();\n this.mousedownEvent = ev;\n var editor = this.editor;\n\n var button = ev.getButton();\n if (button !== 0) {\n var selectionRange = editor.getSelectionRange();\n var selectionEmpty = selectionRange.isEmpty();\n\n if (selectionEmpty) {\n editor.selection.moveToPosition(pos);\n }\n editor.textInput.onContextMenu(ev.domEvent);\n return; // stopping event here breaks contextmenu on ff mac\n }\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n this.mousedownEvent.time = Date.now();\n this.setState(\"focusWait\");\n this.captureMouse(ev);\n return;\n }\n }\n\n this.captureMouse(ev);\n if (!inSelection || this.$clickSelection || ev.getShiftKey() || editor.inMultiSelectMode) {\n this.startSelect(pos);\n } else if (inSelection) {\n this.mousedownEvent.time = Date.now();\n this.startSelect(pos);\n }\n return ev.preventDefault();\n };\n\n this.startSelect = function(pos) {\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n var editor = this.editor;\n var shiftPressed = this.mousedownEvent.getShiftKey();\n if (shiftPressed) {\n editor.selection.selectToPosition(pos);\n }\n else if (!this.$clickSelection) {\n editor.selection.moveToPosition(pos);\n }\n if (editor.renderer.scroller.setCapture) {\n editor.renderer.scroller.setCapture();\n }\n editor.setStyle(\"ace_selecting\");\n this.setState(\"select\");\n };\n\n this.select = function() {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n\n if (this.$clickSelection) {\n var cmp = this.$clickSelection.comparePoint(cursor);\n\n if (cmp == -1) {\n anchor = this.$clickSelection.end;\n } else if (cmp == 1) {\n anchor = this.$clickSelection.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n\n editor.renderer.scrollCursorIntoView();\n };\n\n this.extendSelectionBy = function(unitName) {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n var range = editor.selection[unitName](cursor.row, cursor.column);\n\n if (this.$clickSelection) {\n var cmpStart = this.$clickSelection.comparePoint(range.start);\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n if (cmpStart == -1 && cmpEnd <= 0) {\n anchor = this.$clickSelection.end;\n if (range.end.row != cursor.row || range.end.column != cursor.column)\n cursor = range.start;\n } else if (cmpEnd == 1 && cmpStart >= 0) {\n anchor = this.$clickSelection.start;\n if (range.start.row != cursor.row || range.start.column != cursor.column)\n cursor = range.end;\n } else if (cmpStart == -1 && cmpEnd == 1) {\n cursor = range.end;\n anchor = range.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n\n editor.renderer.scrollCursorIntoView();\n };\n\n this.selectEnd =\n this.selectAllEnd =\n this.selectByWordsEnd =\n this.selectByLinesEnd = function() {\n this.editor.unsetStyle(\"ace_selecting\");\n if (this.editor.renderer.scroller.releaseCapture) {\n this.editor.renderer.scroller.releaseCapture();\n }\n };\n\n this.focusWait = function() {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n var time = Date.now();\n\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n };\n\n this.onDoubleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n var session = editor.session;\n\n var range = session.getBracketRange(pos);\n if (range) {\n if (range.isEmpty()) {\n range.start.column--;\n range.end.column++;\n }\n this.setState(\"select\");\n } else {\n range = editor.selection.getWordRange(pos.row, pos.column);\n this.setState(\"selectByWords\");\n }\n this.$clickSelection = range;\n this[this.state] && this[this.state](ev);\n };\n\n this.onTripleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n\n this.setState(\"selectByLines\");\n this.$clickSelection = editor.selection.getLineRange(pos.row);\n this[this.state] && this[this.state](ev);\n };\n\n this.onQuadClick = function(ev) {\n var editor = this.editor;\n\n editor.selectAll();\n this.$clickSelection = editor.getSelectionRange();\n this.setState(\"selectAll\");\n };\n\n this.onMouseWheel = function(ev) {\n if (ev.getAccelKey())\n return;\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n ev.wheelX = ev.wheelY;\n ev.wheelY = 0;\n }\n\n var t = ev.domEvent.timeStamp;\n var dt = t - (this.$lastScrollTime||0);\n \n var editor = this.editor;\n var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n if (isScrolable || dt < 200) {\n this.$lastScrollTime = t;\n editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n return ev.stop();\n }\n };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n if (range.start.row == range.end.row)\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n var cmp = cursor.column - 4;\n else\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n if (cmp < 0)\n return {cursor: range.start, anchor: range.end};\n else\n return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\n\nvar event = require(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.window = win || window;\n};\n\n(function() {\n\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (!this.pending && this.changes) {\n this.pending = true;\n var _self = this;\n event.nextFrame(function() {\n _self.pending = false;\n var changes;\n while (changes = _self.changes) {\n _self.changes = 0;\n _self.onRender(changes);\n }\n }, this.window);\n }\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define('ace/mouse/mouse_handler', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/mouse/default_handlers', 'ace/mouse/default_gutter_handler', 'ace/mouse/mouse_event', 'ace/mouse/dragdrop_handler', 'ace/config'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar DefaultHandlers = require(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = require(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = require(\"./dragdrop_handler\").DragdropHandler;\nvar config = require(\"../config\");\n\nvar MouseHandler = function(editor) {\n this.editor = editor;\n\n new DefaultHandlers(this);\n new DefaultGutterHandler(this);\n new DragdropHandler(this);\n\n var mouseTarget = editor.renderer.getMouseEventTarget();\n event.addListener(mouseTarget, \"click\", this.onMouseEvent.bind(this, \"click\"));\n event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"));\n event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, \"onMouseEvent\");\n if (editor.renderer.scrollBarV) {\n event.addMultiMouseDownListener(editor.renderer.scrollBarV.inner, [300, 300, 250], this, \"onMouseEvent\");\n event.addMultiMouseDownListener(editor.renderer.scrollBarH.inner, [300, 300, 250], this, \"onMouseEvent\");\n }\n event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"));\n\n var gutterEl = editor.renderer.$gutter;\n event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"));\n event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"));\n event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"));\n event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"));\n\n event.addListener(mouseTarget, \"mousedown\", function(e) {\n editor.focus();\n });\n\n event.addListener(gutterEl, \"mousedown\", function(e) {\n editor.focus();\n return event.preventDefault(e);\n });\n};\n\n(function() {\n this.onMouseEvent = function(name, e) {\n this.editor._emit(name, new MouseEvent(e, this.editor));\n };\n\n this.onMouseMove = function(name, e) {\n var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n if (!listeners || !listeners.length)\n return;\n\n this.editor._emit(name, new MouseEvent(e, this.editor));\n };\n\n this.onMouseWheel = function(name, e) {\n var mouseEvent = new MouseEvent(e, this.editor);\n mouseEvent.speed = this.$scrollSpeed * 2;\n mouseEvent.wheelX = e.wheelX;\n mouseEvent.wheelY = e.wheelY;\n\n this.editor._emit(name, mouseEvent);\n };\n\n this.setState = function(state) {\n this.state = state;\n };\n\n this.captureMouse = function(ev, mouseMoveHandler) {\n this.x = ev.x;\n this.y = ev.y;\n\n this.isMousePressed = true;\n var renderer = this.editor.renderer;\n if (renderer.$keepTextAreaAtCursor)\n renderer.$keepTextAreaAtCursor = null;\n\n var self = this;\n var onMouseMove = function(e) {\n self.x = e.clientX;\n self.y = e.clientY;\n mouseMoveHandler && mouseMoveHandler(e);\n self.mouseEvent = new MouseEvent(e, self.editor);\n self.$mouseMoved = true;\n };\n\n var onCaptureEnd = function(e) {\n clearInterval(timerId);\n onCaptureInterval();\n self[self.state + \"End\"] && self[self.state + \"End\"](e);\n self.$clickSelection = null;\n if (renderer.$keepTextAreaAtCursor == null) {\n renderer.$keepTextAreaAtCursor = true;\n renderer.$moveTextAreaToCursor();\n }\n self.isMousePressed = false;\n self.$onCaptureMouseMove = self.releaseMouse = null;\n self.onMouseEvent(\"mouseup\", e);\n };\n\n var onCaptureInterval = function() {\n self[self.state] && self[self.state]();\n self.$mouseMoved = false;\n };\n\n if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n return setTimeout(function() {onCaptureEnd(ev);});\n }\n\n self.$onCaptureMouseMove = onMouseMove;\n self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n var timerId = setInterval(onCaptureInterval, 20);\n };\n this.releaseMouse = null;\n}).call(MouseHandler.prototype);\n\nconfig.defineOptions(MouseHandler.prototype, \"mouseHandler\", {\n scrollSpeed: {initialValue: 2},\n dragDelay: {initialValue: 150},\n dragEnabled: {initialValue: true},\n focusTimout: {initialValue: 0},\n tooltipFollowsMouse: {initialValue: true}\n});\n\n\nexports.MouseHandler = MouseHandler;\n});\n\nace.define('ace/layer/font_metrics', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl, interval) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n if (!CHAR_COUNT)\n this.$testFractionalRect();\n this.$measureNode.textContent = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$testFractionalRect = function() {\n var el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(el.style);\n el.style.width = \"0.2px\";\n document.documentElement.appendChild(el);\n var w = el.getBoundingClientRect().width;\n if (w > 0 && w < 1)\n CHAR_COUNT = 1;\n else\n CHAR_COUNT = 100;\n el.parentNode.removeChild(el);\n };\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"-100px\";\n style.visibility = \"hidden\";\n style.position = \"fixed\";\n style.whiteSpace = \"pre\";\n style.font = \"inherit\";\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function() {\n var size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer)\n return this.$pollSizeChangesTimer;\n var self = this;\n return this.$pollSizeChangesTimer = setInterval(function() {\n self.checkForSizeChanges();\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else {\n if (this.$pollSizeChangesTimer)\n this.$pollSizeChangesTimer;\n }\n };\n\n this.$measureSizes = function() {\n var rect = this.$measureNode.getBoundingClientRect();\n var size = {\n height: rect.height,\n width: rect.width / CHAR_COUNT\n };\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define('ace/keyboard/textinput', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\n\nvar TextInput = function(parentNode, host) {\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\n\n if (useragent.isTouchPad)\n text.setAttribute(\"x-palm-disable-auto-cap\", true);\n\n text.wrap = \"off\";\n text.autocorrect = \"off\";\n text.autocapitalize = \"off\";\n text.spellcheck = false;\n\n text.style.opacity = \"0\";\n parentNode.insertBefore(text, parentNode.firstChild);\n\n var PLACEHOLDER = \"\\x01\\x01\";\n\n var cut = false;\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var tempStyle = '';\n var isSelectionEmpty = true;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function() {\n host.onBlur();\n isFocused = false;\n });\n event.addListener(text, \"focus\", function() {\n isFocused = true;\n host.onFocus();\n resetSelection();\n });\n this.focus = function() { text.focus(); };\n this.blur = function() { text.blur(); };\n this.isFocused = function() {\n return isFocused;\n };\n var syncSelection = lang.delayedCall(function() {\n isFocused && resetSelection(isSelectionEmpty);\n });\n var syncValue = lang.delayedCall(function() {\n if (!inComposition) {\n text.value = PLACEHOLDER;\n isFocused && resetSelection();\n }\n });\n\n function resetSelection(isEmpty) {\n if (inComposition)\n return;\n if (inputHandler) {\n selectionStart = 0;\n selectionEnd = isEmpty ? 0 : text.value.length - 1;\n } else {\n var selectionStart = isEmpty ? 2 : 1;\n var selectionEnd = 2;\n }\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n } catch(e){}\n }\n\n function resetValue() {\n if (inComposition)\n return;\n text.value = PLACEHOLDER;\n if (useragent.isWebKit)\n syncValue.schedule();\n }\n\n useragent.isWebKit || host.addEventListener('changeSelection', function() {\n if (host.selection.isEmpty() != isSelectionEmpty) {\n isSelectionEmpty = !isSelectionEmpty;\n syncSelection.schedule();\n }\n });\n\n resetValue();\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n };\n if (!text.setSelectionRange && text.createTextRange) {\n text.setSelectionRange = function(selectionStart, selectionEnd) {\n var range = this.createTextRange();\n range.collapse(true);\n range.moveStart('character', selectionStart);\n range.moveEnd('character', selectionEnd);\n range.select();\n };\n isAllSelected = function(text) {\n try {\n var range = text.ownerDocument.selection.createRange();\n }catch(e) {}\n if (!range || range.parentElement() != text) return false;\n return range.text == text.value;\n }\n }\n if (useragent.isOldIE) {\n var inPropertyChange = false;\n var onPropertyChange = function(e){\n if (inPropertyChange)\n return;\n var data = text.value;\n if (inComposition || !data || data == PLACEHOLDER)\n return;\n if (e && data == PLACEHOLDER[0])\n return syncProperty.schedule();\n\n sendText(data);\n inPropertyChange = true;\n resetValue();\n inPropertyChange = false;\n };\n var syncProperty = lang.delayedCall(onPropertyChange);\n event.addListener(text, \"propertychange\", onPropertyChange);\n\n var keytable = { 13:1, 27:1 };\n event.addListener(text, \"keyup\", function (e) {\n if (inComposition && (!text.value || keytable[e.keyCode]))\n setTimeout(onCompositionEnd, 0);\n if ((text.value.charCodeAt(0)||0) < 129) {\n return syncProperty.call();\n }\n inComposition ? onCompositionUpdate() : onCompositionStart();\n });\n event.addListener(text, \"keydown\", function (e) {\n syncProperty.schedule(50);\n });\n }\n\n var onSelect = function(e) {\n if (cut) {\n cut = false;\n } else if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (inputHandler) {\n resetSelection(host.selection.isEmpty());\n }\n };\n\n var inputHandler = null;\n this.setInputHandler = function(cb) {inputHandler = cb};\n this.getInputHandler = function() {return inputHandler};\n var afterContextMenu = false;\n \n var sendText = function(data) {\n if (inputHandler) {\n data = inputHandler(data);\n inputHandler = null;\n }\n if (pasted) {\n resetSelection();\n if (data)\n host.onPaste(data);\n pasted = false;\n } else if (data == PLACEHOLDER.charAt(0)) {\n if (afterContextMenu)\n host.execCommand(\"del\", {source: \"ace\"});\n else // some versions of android do not fire keydown when pressing backspace\n host.execCommand(\"backspace\", {source: \"ace\"});\n } else {\n if (data.substring(0, 2) == PLACEHOLDER)\n data = data.substr(2);\n else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n data = data.substr(1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n \n if (data)\n host.onTextInput(data);\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n\n var onCut = function(e) {\n var data = host.getCopyText();\n if (!data) {\n event.preventDefault(e);\n return;\n }\n\n var clipboardData = e.clipboardData || window.clipboardData;\n\n if (clipboardData && !BROKEN_SETDATA) {\n var supported = clipboardData.setData(\"Text\", data);\n if (supported) {\n host.onCut();\n event.preventDefault(e);\n }\n }\n\n if (!supported) {\n cut = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n cut = false;\n resetValue();\n resetSelection();\n host.onCut();\n });\n }\n };\n\n var onCopy = function(e) {\n var data = host.getCopyText();\n if (!data) {\n event.preventDefault(e);\n return;\n }\n\n var clipboardData = e.clipboardData || window.clipboardData;\n if (clipboardData && !BROKEN_SETDATA) {\n var supported = clipboardData.setData(\"Text\", data);\n if (supported) {\n host.onCopy();\n event.preventDefault(e);\n }\n }\n if (!supported) {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n host.onCopy();\n });\n }\n };\n\n var onPaste = function(e) {\n var clipboardData = e.clipboardData || window.clipboardData;\n\n if (clipboardData) {\n var data = clipboardData.getData(\"Text\");\n if (data)\n host.onPaste(data);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)){\n event.addListener(parentNode, \"keydown\", function(e) {\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n return;\n\n switch (e.keyCode) {\n case 67:\n onCopy(e);\n break;\n case 86:\n onPaste(e);\n break;\n case 88:\n onCut(e);\n break;\n }\n });\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart) return;\n inComposition = {};\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (!host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate) return;\n var val = text.value.replace(/\\x01/g, \"\");\n if (inComposition.lastValue === val) return;\n \n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\x01/g, \"\");\n if (inComposition)\n return\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\x01/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n };\n \n \n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule()});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule()});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule()});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n if (!tempStyle)\n tempStyle = text.style.cssText;\n\n text.style.cssText = \"z-index:100000;\" + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n function onContextMenuClose() {\n setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n if (!useragent.isGecko || useragent.isMac) {\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n }\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.last = function(a) {\n return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n var result = '';\n while (count > 0) {\n if (count & 1)\n result += string;\n\n if (count >>= 1)\n string += string;\n }\n return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n var copy = {};\n for (var key in obj) {\n copy[key] = obj[key];\n }\n return copy;\n};\n\nexports.copyArray = function(array){\n var copy = [];\n for (var i=0, l=array.length; i 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n else if(this.ranges[0])\n this.fromOrientedRange(this.ranges[0]);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount == 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n\n this.splitIntoLines = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var range = this.getRange();\n var isBackwards = this.isBackwards();\n var startRow = range.start.row;\n var endRow = range.end.row;\n if (startRow == endRow) {\n if (isBackwards)\n var start = range.end, end = range.start;\n else\n var start = range.start, end = range.end;\n \n this.addRange(Range.fromPoints(end, end));\n this.addRange(Range.fromPoints(start, start));\n return;\n }\n\n var rectSel = [];\n var r = this.getLineRange(startRow, true);\n r.start.column = range.start.column;\n rectSel.push(r);\n\n for (var i = startRow + 1; i < endRow; i++)\n rectSel.push(this.getLineRange(i, true));\n\n r = this.getLineRange(endRow, true);\n r.end.column = range.end.column;\n rectSel.push(r);\n\n rectSel.forEach(this.addRange, this);\n }\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn),\n this.session.screenToDocumentPosition(row, endColumn)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n var docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = require(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, $byLines) {\n if (this.inVirtualSelectionMode)\n return;\n\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var result;\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = rangeList.ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(rangeList.ranges[i]);\n tmpSel.id = rangeList.ranges[i].marker;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec(this, args || {});\n if (result !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(rangeList.ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n this.onPaste = function(text) {\n if (this.$readOnly)\n return;\n\n\n var e = {text: text};\n this._signal(\"paste\", e);\n text = e.text;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return this.insert(text);\n\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n\n if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n return this.commands.exec(\"insertstring\", this, text);\n\n for (var i = ranges.length; i--;) {\n var range = ranges[i];\n if (!range.isEmpty())\n this.session.remove(range);\n\n this.session.insert(range.start, lines[i]);\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n this.$search.set(options);\n\n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n this.$blockScrolling += 1;\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n\n this.$blockScrolling -= 1;\n\n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n };\n this.selectMore = function(dir, skip) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.$blockScrolling += 1;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.$blockScrolling -= 1;\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n\n if (!ranges.length) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.doc.removeLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.doc.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n sel.$onRemoveRange(sameRowRanges);\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \")\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW, \" \")\n + m[4].replace(/^([=:])\\s+/, \"$1 \")\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \")\n }\n }\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (!session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.removeEventListener(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.removeEventListener(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.removeEventListener(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.removeEventListener(\"singleSelect\", this.$onSingleSelect);\n }\n\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n\n if (this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n });\n\n event.addListener(el, \"keyup\", reset);\n event.addListener(el, \"blur\", reset);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nrequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n }\n})\n\n\n\n});\n\nace.define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) {\n\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar lang = require(\"./lib/lang\");\nvar useragent = require(\"./lib/useragent\");\nvar TextInput = require(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar Search = require(\"./search\").Search;\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = require(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = require(\"./commands/default_commands\").commands;\nvar config = require(\"./config\");\nvar Editor = function(renderer, session) {\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.keyBinding = new KeyBinding(this);\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n\n this.$blockScrolling = 0;\n this.$search = new Search().set({\n wrap: true\n });\n\n this.$historyTracker = this.$historyTracker.bind(this);\n this.commands.on(\"exec\", this.$historyTracker);\n\n this.$initOperationListeners();\n \n this._$emitInputEvent = lang.delayedCall(function() {\n this._signal(\"input\", {});\n this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart();\n }.bind(this));\n \n this.on(\"change\", function(_, _self) {\n _self._$emitInputEvent.schedule(31);\n });\n\n this.setSession(session || new EditSession(\"\"));\n config.resetOptions(this);\n config._signal(\"editor\", this);\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n function last(a) {return a[a.length - 1]}\n\n this.selections = [];\n this.commands.on(\"exec\", function(e) {\n this.startOperation(e);\n\n var command = e.command;\n if (command.aceCommandGroup == \"fileJump\") {\n var prev = this.prevOp;\n if (!prev || prev.command.aceCommandGroup != \"fileJump\") {\n this.lastFileJumpPos = last(this.selections);\n }\n } else {\n this.lastFileJumpPos = null;\n }\n }.bind(this), true);\n\n this.commands.on(\"afterExec\", function(e) {\n var command = e.command;\n\n if (command.aceCommandGroup == \"fileJump\") {\n if (this.lastFileJumpPos && !this.curOp.selectionChanged) {\n this.selection.fromJSON(this.lastFileJumpPos);\n }\n }\n this.endOperation(e);\n }.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n this.on(\"change\", function() {\n this.curOp || this.startOperation();\n this.curOp.docChanged = true;\n }.bind(this), true);\n\n this.on(\"changeSelection\", function() {\n this.curOp || this.startOperation();\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commadEvent) {\n if (this.curOp) {\n if (!commadEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commadEvent) {\n this.previousCommand = null;\n commadEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = {\n command: commadEvent.command || {},\n args: commadEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n \n var command = this.curOp.command;\n if (command && command.scrollIntoView)\n this.$blockScrolling++;\n\n this.selections.push(this.selection.toJSON());\n };\n\n this.endOperation = function() {\n if (this.curOp) {\n var command = this.curOp.command;\n if (command && command.scrollIntoView) {\n this.$blockScrolling--;\n switch (command.scrollIntoView) {\n case \"center\":\n this.renderer.scrollCursorIntoView(null, 0.5);\n break;\n case \"animate\":\n case \"cursor\":\n this.renderer.scrollCursorIntoView();\n break;\n case \"selectionPart\":\n var range = this.selection.getRange();\n var config = this.renderer.layerConfig;\n if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n }\n break;\n default:\n break;\n }\n if (command.scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n \n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n\n var prev = this.prevOp;\n var mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\n if (e.command.name == \"insertstring\") {\n var text = e.args;\n if (this.mergeNextCommand === undefined)\n this.mergeNextCommand = true;\n\n shouldMerge = shouldMerge\n && this.mergeNextCommand // previous command allows to coalesce with\n && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n this.mergeNextCommand = true;\n } else {\n shouldMerge = shouldMerge\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n }\n\n if (\n this.$mergeUndoDeltas != \"always\"\n && Date.now() - this.sequenceStartTime > 2000\n ) {\n shouldMerge = false; // the sequence is too long\n }\n\n if (shouldMerge)\n this.session.mergeUndoDeltas = true;\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\n this.sequenceStartTime = Date.now();\n };\n this.setKeyboardHandler = function(keyboardHandler) {\n if (!keyboardHandler) {\n this.keyBinding.setKeyboardHandler(null);\n } else if (typeof keyboardHandler === \"string\") {\n this.$keybindingId = keyboardHandler;\n var _self = this;\n config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n if (_self.$keybindingId == keyboardHandler)\n _self.keyBinding.setKeyboardHandler(module && module.handler);\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n }\n };\n this.getKeyboardHandler = function() {\n return this.keyBinding.getKeyboardHandler();\n };\n this.setSession = function(session) {\n if (this.session == session)\n return;\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.removeEventListener(\"change\", this.$onDocumentChange);\n this.session.removeEventListener(\"changeMode\", this.$onChangeMode);\n this.session.removeEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.removeEventListener(\"changeTabSize\", this.$onChangeTabSize);\n this.session.removeEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.removeEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.removeEventListener(\"onChangeFold\", this.$onChangeFold);\n this.session.removeEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.removeEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.removeEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.removeEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.removeEventListener(\"changeOverwrite\", this.$onCursorChange);\n this.session.removeEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.removeEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n selection.removeEventListener(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.addEventListener(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.addEventListener(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.addEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.addEventListener(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.addEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.addEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.addEventListener(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.addEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.addEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.addEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.addEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.addEventListener(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.addEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.addEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.addEventListener(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.addEventListener(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.$blockScrolling += 1;\n this.onCursorChange();\n this.$blockScrolling -= 1;\n \n this.onScrollTopChange();\n this.onScrollLeftChange();\n this.onSelectionChange();\n this.onChangeFrontMarker();\n this.onChangeBackMarker();\n this.onChangeBreakpoint();\n this.onChangeAnnotation();\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n this.renderer.updateFull();\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n };\n this.getSession = function() {\n return this.session;\n };\n this.setValue = function(val, cursorPos) {\n this.session.doc.setValue(val);\n\n if (!cursorPos)\n this.selectAll();\n else if (cursorPos == 1)\n this.navigateFileEnd();\n else if (cursorPos == -1)\n this.navigateFileStart();\n\n return val;\n };\n this.getValue = function() {\n return this.session.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.resize = function(force) {\n this.renderer.onResize(force);\n };\n this.setTheme = function(theme) {\n this.renderer.setTheme(theme);\n };\n this.getTheme = function() {\n return this.renderer.getTheme();\n };\n this.setStyle = function(style) {\n this.renderer.setStyle(style);\n };\n this.unsetStyle = function(style) {\n this.renderer.unsetStyle(style);\n };\n this.getFontSize = function () {\n return this.getOption(\"fontSize\") ||\n dom.computedStyle(this.container, \"fontSize\");\n };\n this.setFontSize = function(size) {\n this.setOption(\"fontSize\", size);\n };\n\n this.$highlightBrackets = function() {\n if (this.session.$bracketHighlight) {\n this.session.removeMarker(this.session.$bracketHighlight);\n this.session.$bracketHighlight = null;\n }\n\n if (this.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function() {\n self.$highlightPending = false;\n\n var pos = self.session.findMatchingBracket(self.getCursorPosition());\n if (pos) {\n var range = new Range(pos.row, pos.column, pos.row, pos.column+1);\n } else if (self.session.$mode.getMatching) {\n var range = self.session.$mode.getMatching(self.session);\n }\n if (range)\n self.session.$bracketHighlight = self.session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.focus = function() {\n var _self = this;\n setTimeout(function() {\n _self.textInput.focus();\n });\n this.textInput.focus();\n };\n this.isFocused = function() {\n return this.textInput.isFocused();\n };\n this.blur = function() {\n this.textInput.blur();\n };\n this.onFocus = function() {\n if (this.$isFocused)\n return;\n this.$isFocused = true;\n this.renderer.showCursor();\n this.renderer.visualizeFocus();\n this._emit(\"focus\");\n };\n this.onBlur = function() {\n if (!this.$isFocused)\n return;\n this.$isFocused = false;\n this.renderer.hideCursor();\n this.renderer.visualizeBlur();\n this._emit(\"blur\");\n };\n\n this.$cursorChange = function() {\n this.renderer.updateCursor();\n };\n this.onDocumentChange = function(e) {\n var delta = e.data;\n var range = delta.range;\n var lastRow;\n\n if (range.start.row == range.end.row && delta.action != \"insertLines\" && delta.action != \"removeLines\")\n lastRow = range.end.row;\n else\n lastRow = Infinity;\n this.renderer.updateLines(range.start.row, lastRow);\n\n this._signal(\"change\", e);\n this.$cursorChange();\n };\n\n this.onTokenizerUpdate = function(e) {\n var rows = e.data;\n this.renderer.updateLines(rows.first, rows.last);\n };\n\n\n this.onScrollTopChange = function() {\n this.renderer.scrollToY(this.session.getScrollTop());\n };\n\n this.onScrollLeftChange = function() {\n this.renderer.scrollToX(this.session.getScrollLeft());\n };\n this.onCursorChange = function() {\n this.$cursorChange();\n\n if (!this.$blockScrolling) {\n this.renderer.scrollCursorIntoView();\n }\n\n this.$highlightBrackets();\n this.$updateHighlightActiveLine();\n this._signal(\"changeSelection\");\n };\n\n this.$updateHighlightActiveLine = function() {\n var session = this.getSession();\n\n var highlight;\n if (this.$highlightActiveLine) {\n if ((this.$selectionStyle != \"line\" || !this.selection.isMultiLine()))\n highlight = this.getCursorPosition();\n if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))\n highlight = false;\n }\n\n if (session.$highlightLineMarker && !highlight) {\n session.removeMarker(session.$highlightLineMarker.id);\n session.$highlightLineMarker = null;\n } else if (!session.$highlightLineMarker && highlight) {\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n session.$highlightLineMarker = range;\n } else if (highlight) {\n session.$highlightLineMarker.start.row = highlight.row;\n session.$highlightLineMarker.end.row = highlight.row;\n session.$highlightLineMarker.start.column = highlight.column;\n session._signal(\"changeBackMarker\");\n }\n };\n\n this.onSelectionChange = function(e) {\n var session = this.session;\n\n if (session.$selectionMarker) {\n session.removeMarker(session.$selectionMarker);\n }\n session.$selectionMarker = null;\n\n if (!this.selection.isEmpty()) {\n var range = this.selection.getRange();\n var style = this.getSelectionStyle();\n session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n } else {\n this.$updateHighlightActiveLine();\n }\n\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n this.session.highlight(re);\n\n this._signal(\"changeSelection\");\n };\n\n this.$getSelectionHighLightRegexp = function() {\n var session = this.session;\n\n var selection = this.getSelectionRange();\n if (selection.isEmpty() || selection.isMultiLine())\n return;\n\n var startOuter = selection.start.column - 1;\n var endOuter = selection.end.column + 1;\n var line = session.getLine(selection.start.row);\n var lineCols = line.length;\n var needle = line.substring(Math.max(startOuter, 0),\n Math.min(endOuter, lineCols));\n if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n return;\n\n needle = line.substring(selection.start.column, selection.end.column);\n if (!/^[\\w\\d]+$/.test(needle))\n return;\n\n var re = this.$search.$assembleRegExp({\n wholeWord: true,\n caseSensitive: true,\n needle: needle\n });\n\n return re;\n };\n\n\n this.onChangeFrontMarker = function() {\n this.renderer.updateFrontMarkers();\n };\n\n this.onChangeBackMarker = function() {\n this.renderer.updateBackMarkers();\n };\n\n\n this.onChangeBreakpoint = function() {\n this.renderer.updateBreakpoints();\n };\n\n this.onChangeAnnotation = function() {\n this.renderer.setAnnotations(this.session.getAnnotations());\n };\n\n\n this.onChangeMode = function(e) {\n this.renderer.updateText();\n this._emit(\"changeMode\", e);\n };\n\n\n this.onChangeWrapLimit = function() {\n this.renderer.updateFull();\n };\n\n this.onChangeWrapMode = function() {\n this.renderer.onResize(true);\n };\n\n\n this.onChangeFold = function() {\n this.$updateHighlightActiveLine();\n this.renderer.updateFull();\n };\n this.getSelectedText = function() {\n return this.session.getTextRange(this.getSelectionRange());\n };\n this.getCopyText = function() {\n var text = this.getSelectedText();\n this._signal(\"copy\", text);\n return text;\n };\n this.onCopy = function() {\n this.commands.exec(\"copy\", this);\n };\n this.onCut = function() {\n this.commands.exec(\"cut\", this);\n };\n this.onPaste = function(text) {\n if (this.$readOnly)\n return;\n var e = {text: text};\n this._signal(\"paste\", e);\n this.insert(e.text, true);\n };\n\n\n this.execCommand = function(command, args) {\n this.commands.exec(command, this, args);\n };\n this.insert = function(text, pasted) {\n var session = this.session;\n var mode = session.getMode();\n var cursor = this.getCursorPosition();\n\n if (this.getBehavioursEnabled() && !pasted) {\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n if (transform) {\n if (text !== transform.text) {\n this.session.mergeUndoDeltas = false;\n this.$mergeNextCommand = false;\n }\n text = transform.text;\n\n }\n }\n \n if (text == \"\\t\")\n text = this.session.getTabString();\n if (!this.selection.isEmpty()) {\n var range = this.getSelectionRange();\n cursor = this.session.remove(range);\n this.clearSelection();\n }\n else if (this.session.getOverwrite()) {\n var range = new Range.fromPoints(cursor, cursor);\n range.end.column += text.length;\n this.session.remove(range);\n }\n\n if (text == \"\\n\" || text == \"\\r\\n\") {\n var line = session.getLine(cursor.row);\n if (cursor.column > line.search(/\\S|$/)) {\n var d = line.substr(cursor.column).search(/\\S|$/);\n session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n }\n }\n this.clearSelection();\n\n var start = cursor.column;\n var lineState = session.getState(cursor.row);\n var line = session.getLine(cursor.row);\n var shouldOutdent = mode.checkOutdent(lineState, line, text);\n var end = session.insert(cursor, text);\n\n if (transform && transform.selection) {\n if (transform.selection.length == 2) { // Transform relative to the current column\n this.selection.setSelectionRange(\n new Range(cursor.row, start + transform.selection[0],\n cursor.row, start + transform.selection[1]));\n } else { // Transform relative to the current row.\n this.selection.setSelectionRange(\n new Range(cursor.row + transform.selection[0],\n transform.selection[1],\n cursor.row + transform.selection[2],\n transform.selection[3]));\n }\n }\n\n if (session.getDocument().isNewLine(text)) {\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\n }\n if (shouldOutdent)\n mode.autoOutdent(lineState, session, cursor.row);\n };\n\n this.onTextInput = function(text) {\n this.keyBinding.onTextInput(text);\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n this.keyBinding.onCommandKey(e, hashId, keyCode);\n };\n this.setOverwrite = function(overwrite) {\n this.session.setOverwrite(overwrite);\n };\n this.getOverwrite = function() {\n return this.session.getOverwrite();\n };\n this.toggleOverwrite = function() {\n this.session.toggleOverwrite();\n };\n this.setScrollSpeed = function(speed) {\n this.setOption(\"scrollSpeed\", speed);\n };\n this.getScrollSpeed = function() {\n return this.getOption(\"scrollSpeed\");\n };\n this.setDragDelay = function(dragDelay) {\n this.setOption(\"dragDelay\", dragDelay);\n };\n this.getDragDelay = function() {\n return this.getOption(\"dragDelay\");\n };\n this.setSelectionStyle = function(val) {\n this.setOption(\"selectionStyle\", val);\n };\n this.getSelectionStyle = function() {\n return this.getOption(\"selectionStyle\");\n };\n this.setHighlightActiveLine = function(shouldHighlight) {\n this.setOption(\"highlightActiveLine\", shouldHighlight);\n };\n this.getHighlightActiveLine = function() {\n return this.getOption(\"highlightActiveLine\");\n };\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n this.setHighlightSelectedWord = function(shouldHighlight) {\n this.setOption(\"highlightSelectedWord\", shouldHighlight);\n };\n this.getHighlightSelectedWord = function() {\n return this.$highlightSelectedWord;\n };\n\n this.setAnimatedScroll = function(shouldAnimate){\n this.renderer.setAnimatedScroll(shouldAnimate);\n };\n\n this.getAnimatedScroll = function(){\n return this.renderer.getAnimatedScroll();\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.renderer.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.renderer.getShowInvisibles();\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.renderer.setDisplayIndentGuides(display);\n };\n\n this.getDisplayIndentGuides = function() {\n return this.renderer.getDisplayIndentGuides();\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.renderer.setShowPrintMargin(showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.renderer.getShowPrintMargin();\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.renderer.setPrintMarginColumn(showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.renderer.getPrintMarginColumn();\n };\n this.setReadOnly = function(readOnly) {\n this.setOption(\"readOnly\", readOnly);\n };\n this.getReadOnly = function() {\n return this.getOption(\"readOnly\");\n };\n this.setBehavioursEnabled = function (enabled) {\n this.setOption(\"behavioursEnabled\", enabled);\n };\n this.getBehavioursEnabled = function () {\n return this.getOption(\"behavioursEnabled\");\n };\n this.setWrapBehavioursEnabled = function (enabled) {\n this.setOption(\"wrapBehavioursEnabled\", enabled);\n };\n this.getWrapBehavioursEnabled = function () {\n return this.getOption(\"wrapBehavioursEnabled\");\n };\n this.setShowFoldWidgets = function(show) {\n this.setOption(\"showFoldWidgets\", show);\n\n };\n this.getShowFoldWidgets = function() {\n return this.getOption(\"showFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(fade) {\n this.setOption(\"fadeFoldWidgets\", fade);\n };\n\n this.getFadeFoldWidgets = function() {\n return this.getOption(\"fadeFoldWidgets\");\n };\n this.remove = function(dir) {\n if (this.selection.isEmpty()){\n if (dir == \"left\")\n this.selection.selectLeft();\n else\n this.selection.selectRight();\n }\n\n var range = this.getSelectionRange();\n if (this.getBehavioursEnabled()) {\n var session = this.session;\n var state = session.getState(range.start.row);\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n if (range.end.column === 0) {\n var text = session.getTextRange(range);\n if (text[text.length - 1] == \"\\n\") {\n var line = session.getLine(range.end.row);\n if (/^\\s+$/.test(line)) {\n range.end.column = line.length;\n }\n }\n }\n if (new_range)\n range = new_range;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.removeWordRight = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordRight();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeWordLeft = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordLeft();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineStart = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineStart();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineEnd = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineEnd();\n\n var range = this.getSelectionRange();\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\n range.end.column = 0;\n range.end.row++;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.splitLine = function() {\n if (!this.selection.isEmpty()) {\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n }\n\n var cursor = this.getCursorPosition();\n this.insert(\"\\n\");\n this.moveCursorToPosition(cursor);\n };\n this.transposeLetters = function() {\n if (!this.selection.isEmpty()) {\n return;\n }\n\n var cursor = this.getCursorPosition();\n var column = cursor.column;\n if (column === 0)\n return;\n\n var line = this.session.getLine(cursor.row);\n var swap, range;\n if (column < line.length) {\n swap = line.charAt(column) + line.charAt(column-1);\n range = new Range(cursor.row, column-1, cursor.row, column+1);\n }\n else {\n swap = line.charAt(column-1) + line.charAt(column-2);\n range = new Range(cursor.row, column-2, cursor.row, column);\n }\n this.session.replace(range, swap);\n };\n this.toLowerCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toLowerCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.toUpperCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toUpperCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.indent = function() {\n var session = this.session;\n var range = this.getSelectionRange();\n\n if (range.start.row < range.end.row) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n } else if (range.start.column < range.end.column) {\n var text = session.getTextRange(range);\n if (!/^\\s+$/.test(text)) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n }\n }\n \n var line = session.getLine(range.start.row);\n var position = range.start;\n var size = session.getTabSize();\n var column = session.documentToScreenColumn(position.row, position.column);\n\n if (this.session.getUseSoftTabs()) {\n var count = (size - column % size);\n var indentString = lang.stringRepeat(\" \", count);\n } else {\n var count = column % size;\n while (line[range.start.column] == \" \" && count) {\n range.start.column--;\n count--;\n }\n this.selection.setSelectionRange(range);\n indentString = \"\\t\";\n }\n return this.insert(indentString);\n };\n this.blockIndent = function() {\n var rows = this.$getSelectedRows();\n this.session.indentRows(rows.first, rows.last, \"\\t\");\n };\n this.blockOutdent = function() {\n var selection = this.session.getSelection();\n this.session.outdentRows(selection.getRange());\n };\n this.sortLines = function() {\n var rows = this.$getSelectedRows();\n var session = this.session;\n\n var lines = [];\n for (i = rows.first; i <= rows.last; i++)\n lines.push(session.getLine(i));\n\n lines.sort(function(a, b) {\n if (a.toLowerCase() < b.toLowerCase()) return -1;\n if (a.toLowerCase() > b.toLowerCase()) return 1;\n return 0;\n });\n\n var deleteRange = new Range(0, 0, 0, 0);\n for (var i = rows.first; i <= rows.last; i++) {\n var line = session.getLine(i);\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n deleteRange.end.column = line.length;\n session.replace(deleteRange, lines[i-rows.first]);\n }\n };\n this.toggleCommentLines = function() {\n var state = this.session.getState(this.getCursorPosition().row);\n var rows = this.$getSelectedRows();\n this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n };\n\n this.toggleBlockComment = function() {\n var cursor = this.getCursorPosition();\n var state = this.session.getState(cursor.row);\n var range = this.getSelectionRange();\n this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n };\n this.getNumberAt = function(row, column) {\n var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n _numberRx.lastIndex = 0;\n\n var s = this.session.getLine(row);\n while (_numberRx.lastIndex < column) {\n var m = _numberRx.exec(s);\n if(m.index <= column && m.index+m[0].length >= column){\n var number = {\n value: m[0],\n start: m.index,\n end: m.index+m[0].length\n };\n return number;\n }\n }\n return null;\n };\n this.modifyNumber = function(amount) {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n var charRange = new Range(row, column-1, row, column);\n\n var c = this.session.getTextRange(charRange);\n if (!isNaN(parseFloat(c)) && isFinite(c)) {\n var nr = this.getNumberAt(row, column);\n if (nr) {\n var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n var decimals = nr.start + nr.value.length - fp;\n\n var t = parseFloat(nr.value);\n t *= Math.pow(10, decimals);\n\n\n if(fp !== nr.end && column < fp){\n amount *= Math.pow(10, nr.end - column - 1);\n } else {\n amount *= Math.pow(10, nr.end - column);\n }\n\n t += amount;\n t /= Math.pow(10, decimals);\n var nnr = t.toFixed(decimals);\n var replaceRange = new Range(row, nr.start, row, nr.end);\n this.session.replace(replaceRange, nnr);\n this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n var range;\n if (rows.first === 0 || rows.last+1 < this.session.getLength())\n range = new Range(rows.first, 0, rows.last+1, 0);\n else\n range = new Range(\n rows.first-1, this.session.getLine(rows.first-1).length,\n rows.last, this.session.getLine(rows.last).length\n );\n this.session.remove(range);\n this.clearSelection();\n };\n\n this.duplicateSelection = function() {\n var sel = this.selection;\n var doc = this.session;\n var range = sel.getRange();\n var reverse = sel.isBackwards();\n if (range.isEmpty()) {\n var row = range.start.row;\n doc.duplicateLines(row, row);\n } else {\n var point = reverse ? range.start : range.end;\n var endPoint = doc.insert(point, doc.getTextRange(range), false);\n range.start = point;\n range.end = endPoint;\n\n sel.setSelectionRange(range, reverse);\n }\n };\n this.moveLinesDown = function() {\n this.$moveLines(function(firstRow, lastRow) {\n return this.session.moveLinesDown(firstRow, lastRow);\n });\n };\n this.moveLinesUp = function() {\n this.$moveLines(function(firstRow, lastRow) {\n return this.session.moveLinesUp(firstRow, lastRow);\n });\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(function(firstRow, lastRow) {\n this.session.duplicateLines(firstRow, lastRow);\n return 0;\n });\n };\n this.copyLinesDown = function() {\n this.$moveLines(function(firstRow, lastRow) {\n return this.session.duplicateLines(firstRow, lastRow);\n });\n };\n this.$moveLines = function(mover) {\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n var rows = this.$getSelectedRows(range);\n var linesMoved = mover.call(this, rows.first, rows.last);\n range.moveBy(linesMoved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n\n for (var i = ranges.length; i--; ) {\n var rangeIndex = i;\n var rows = ranges[i].collapseRows();\n var last = rows.end.row;\n var first = rows.start.row;\n while (i--) {\n rows = ranges[i].collapseRows();\n if (first - rows.end.row <= 1)\n first = rows.end.row;\n else\n break;\n }\n i++;\n\n var linesMoved = mover.call(this, first, last);\n while (rangeIndex >= i) {\n ranges[rangeIndex].moveBy(linesMoved, 0);\n rangeIndex--;\n }\n }\n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n }\n };\n this.$getSelectedRows = function() {\n var range = this.getSelectionRange().collapseRows();\n\n return {\n first: this.session.getRowFoldStart(range.start.row),\n last: this.session.getRowFoldEnd(range.end.row)\n };\n };\n\n this.onCompositionStart = function(text) {\n this.renderer.showComposition(this.getCursorPosition());\n };\n\n this.onCompositionUpdate = function(text) {\n this.renderer.setCompositionText(text);\n };\n\n this.onCompositionEnd = function() {\n this.renderer.hideComposition();\n };\n this.getFirstVisibleRow = function() {\n return this.renderer.getFirstVisibleRow();\n };\n this.getLastVisibleRow = function() {\n return this.renderer.getLastVisibleRow();\n };\n this.isRowVisible = function(row) {\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n };\n this.isRowFullyVisible = function(row) {\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n };\n this.$getVisibleRowCount = function() {\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n };\n\n this.$moveByPage = function(dir, select) {\n var renderer = this.renderer;\n var config = this.renderer.layerConfig;\n var rows = dir * Math.floor(config.height / config.lineHeight);\n\n this.$blockScrolling++;\n if (select === true) {\n this.selection.$moveSelection(function(){\n this.moveCursorBy(rows, 0);\n });\n } else if (select === false) {\n this.selection.moveCursorBy(rows, 0);\n this.selection.clearSelection();\n }\n this.$blockScrolling--;\n\n var scrollTop = renderer.scrollTop;\n\n renderer.scrollBy(0, rows * config.lineHeight);\n if (select != null)\n renderer.scrollCursorIntoView(null, 0.5);\n\n renderer.animateScrolling(scrollTop);\n };\n this.selectPageDown = function() {\n this.$moveByPage(1, true);\n };\n this.selectPageUp = function() {\n this.$moveByPage(-1, true);\n };\n this.gotoPageDown = function() {\n this.$moveByPage(1, false);\n };\n this.gotoPageUp = function() {\n this.$moveByPage(-1, false);\n };\n this.scrollPageDown = function() {\n this.$moveByPage(1);\n };\n this.scrollPageUp = function() {\n this.$moveByPage(-1);\n };\n this.scrollToRow = function(row) {\n this.renderer.scrollToRow(row);\n };\n this.scrollToLine = function(line, center, animate, callback) {\n this.renderer.scrollToLine(line, center, animate, callback);\n };\n this.centerSelection = function() {\n var range = this.getSelectionRange();\n var pos = {\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n };\n this.renderer.alignCursor(pos, 0.5);\n };\n this.getCursorPosition = function() {\n return this.selection.getCursor();\n };\n this.getCursorPositionScreen = function() {\n return this.session.documentToScreenPosition(this.getCursorPosition());\n };\n this.getSelectionRange = function() {\n return this.selection.getRange();\n };\n this.selectAll = function() {\n this.$blockScrolling += 1;\n this.selection.selectAll();\n this.$blockScrolling -= 1;\n };\n this.clearSelection = function() {\n this.selection.clearSelection();\n };\n this.moveCursorTo = function(row, column) {\n this.selection.moveCursorTo(row, column);\n };\n this.moveCursorToPosition = function(pos) {\n this.selection.moveCursorToPosition(pos);\n };\n this.jumpToMatching = function(select) {\n var cursor = this.getCursorPosition();\n\n var range = this.session.getBracketRange(cursor);\n if (!range) {\n range = this.find({\n needle: /[{}()\\[\\]]/g,\n preventScroll:true,\n start: {row: cursor.row, column: cursor.column - 1}\n });\n if (!range)\n return;\n var pos = range.start;\n if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)\n range = this.session.getBracketRange(pos);\n }\n\n pos = range && range.cursor || pos;\n if (pos) {\n if (select) {\n if (range && range.isEqual(this.getSelectionRange()))\n this.clearSelection();\n else\n this.selection.selectTo(pos.row, pos.column);\n } else {\n this.selection.moveTo(pos.row, pos.column);\n }\n }\n };\n this.gotoLine = function(lineNumber, column, animate) {\n this.selection.clearSelection();\n this.session.unfold({row: lineNumber - 1, column: column || 0});\n\n this.$blockScrolling += 1;\n this.exitMultiSelectMode && this.exitMultiSelectMode();\n this.moveCursorTo(lineNumber - 1, column || 0);\n this.$blockScrolling -= 1;\n\n if (!this.isRowFullyVisible(lineNumber - 1))\n this.scrollToLine(lineNumber - 1, true, animate);\n };\n this.navigateTo = function(row, column) {\n this.selection.moveTo(row, column);\n };\n this.navigateUp = function(times) {\n if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n var selectionStart = this.selection.anchor.getPosition();\n return this.moveCursorToPosition(selectionStart);\n }\n this.selection.clearSelection();\n this.selection.moveCursorBy(-times || -1, 0);\n };\n this.navigateDown = function(times) {\n if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n var selectionEnd = this.selection.anchor.getPosition();\n return this.moveCursorToPosition(selectionEnd);\n }\n this.selection.clearSelection();\n this.selection.moveCursorBy(times || 1, 0);\n };\n this.navigateLeft = function(times) {\n if (!this.selection.isEmpty()) {\n var selectionStart = this.getSelectionRange().start;\n this.moveCursorToPosition(selectionStart);\n }\n else {\n times = times || 1;\n while (times--) {\n this.selection.moveCursorLeft();\n }\n }\n this.clearSelection();\n };\n this.navigateRight = function(times) {\n if (!this.selection.isEmpty()) {\n var selectionEnd = this.getSelectionRange().end;\n this.moveCursorToPosition(selectionEnd);\n }\n else {\n times = times || 1;\n while (times--) {\n this.selection.moveCursorRight();\n }\n }\n this.clearSelection();\n };\n this.navigateLineStart = function() {\n this.selection.moveCursorLineStart();\n this.clearSelection();\n };\n this.navigateLineEnd = function() {\n this.selection.moveCursorLineEnd();\n this.clearSelection();\n };\n this.navigateFileEnd = function() {\n this.selection.moveCursorFileEnd();\n this.clearSelection();\n };\n this.navigateFileStart = function() {\n this.selection.moveCursorFileStart();\n this.clearSelection();\n };\n this.navigateWordRight = function() {\n this.selection.moveCursorWordRight();\n this.clearSelection();\n };\n this.navigateWordLeft = function() {\n this.selection.moveCursorWordLeft();\n this.clearSelection();\n };\n this.replace = function(replacement, options) {\n if (options)\n this.$search.set(options);\n\n var range = this.$search.find(this.session);\n var replaced = 0;\n if (!range)\n return replaced;\n\n if (this.$tryReplace(range, replacement)) {\n replaced = 1;\n }\n if (range !== null) {\n this.selection.setSelectionRange(range);\n this.renderer.scrollSelectionIntoView(range.start, range.end);\n }\n\n return replaced;\n };\n this.replaceAll = function(replacement, options) {\n if (options) {\n this.$search.set(options);\n }\n\n var ranges = this.$search.findAll(this.session);\n var replaced = 0;\n if (!ranges.length)\n return replaced;\n\n this.$blockScrolling += 1;\n\n var selection = this.getSelectionRange();\n this.selection.moveTo(0, 0);\n\n for (var i = ranges.length - 1; i >= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n this.$blockScrolling -= 1;\n\n return replaced;\n };\n\n this.$tryReplace = function(range, replacement) {\n var input = this.session.getTextRange(range);\n replacement = this.$search.replace(input, replacement);\n if (replacement !== null) {\n range.end = this.session.replace(range, replacement);\n return range;\n } else {\n return null;\n }\n };\n this.getLastSearchOptions = function() {\n return this.$search.getOptions();\n };\n this.find = function(needle, options, animate) {\n if (!options)\n options = {};\n\n if (typeof needle == \"string\" || needle instanceof RegExp)\n options.needle = needle;\n else if (typeof needle == \"object\")\n oop.mixin(options, needle);\n\n var range = this.selection.getRange();\n if (options.needle == null) {\n needle = this.session.getTextRange(range)\n || this.$search.$options.needle;\n if (!needle) {\n range = this.session.getWordRange(range.start.row, range.start.column);\n needle = this.session.getTextRange(range);\n }\n this.$search.set({needle: needle});\n }\n\n this.$search.set(options);\n if (!options.start)\n this.$search.set({start: range});\n\n var newRange = this.$search.find(this.session);\n if (options.preventScroll)\n return newRange;\n if (newRange) {\n this.revealRange(newRange, animate);\n return newRange;\n }\n if (options.backwards)\n range.start = range.end;\n else\n range.end = range.start;\n this.selection.setRange(range);\n };\n this.findNext = function(options, animate) {\n this.find({skipCurrent: true, backwards: false}, options, animate);\n };\n this.findPrevious = function(options, animate) {\n this.find(options, {skipCurrent: true, backwards: true}, animate);\n };\n\n this.revealRange = function(range, animate) {\n this.$blockScrolling += 1;\n this.session.unfold(range);\n this.selection.setSelectionRange(range);\n this.$blockScrolling -= 1;\n\n var scrollTop = this.renderer.scrollTop;\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n if (animate !== false)\n this.renderer.animateScrolling(scrollTop);\n };\n this.undo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().undo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().redo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n };\n this.setAutoScrollEditorIntoView = function(enable) {\n if (!enable)\n return;\n var rect;\n var self = this;\n var shouldScroll = false;\n if (!this.$scrollAnchor)\n this.$scrollAnchor = document.createElement(\"div\");\n var scrollAnchor = this.$scrollAnchor;\n scrollAnchor.style.cssText = \"position:absolute\";\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\n var onChangeSelection = this.on(\"changeSelection\", function() {\n shouldScroll = true;\n });\n var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n if (shouldScroll)\n rect = self.renderer.container.getBoundingClientRect();\n });\n var onAfterRender = this.renderer.on(\"afterRender\", function() {\n if (shouldScroll && rect && self.isFocused()) {\n var renderer = self.renderer;\n var pos = renderer.$cursorLayer.$pixelPos;\n var config = renderer.layerConfig;\n var top = pos.top - config.offset;\n if (pos.top >= 0 && top + rect.top < 0) {\n shouldScroll = true;\n } else if (pos.top < config.height &&\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\n shouldScroll = false;\n } else {\n shouldScroll = null;\n }\n if (shouldScroll != null) {\n scrollAnchor.style.top = top + \"px\";\n scrollAnchor.style.left = pos.left + \"px\";\n scrollAnchor.style.height = config.lineHeight + \"px\";\n scrollAnchor.scrollIntoView(shouldScroll);\n }\n shouldScroll = rect = null;\n }\n });\n this.setAutoScrollEditorIntoView = function(enable) {\n if (enable)\n return;\n delete this.setAutoScrollEditorIntoView;\n this.removeEventListener(\"changeSelection\", onChangeSelection);\n this.renderer.removeEventListener(\"afterRender\", onAfterRender);\n this.renderer.removeEventListener(\"beforeRender\", onBeforeRender);\n };\n };\n\n\n this.$resetCursorStyle = function() {\n var style = this.$cursorStyle || \"ace\";\n var cursorLayer = this.renderer.$cursorLayer;\n if (!cursorLayer)\n return;\n cursorLayer.setSmoothBlinking(style == \"smooth\");\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n selectionStyle: {\n set: function(style) {\n this.onSelectionChange();\n this._signal(\"changeSelectionStyle\", {data: style});\n },\n initialValue: \"line\"\n },\n highlightActiveLine: {\n set: function() {this.$updateHighlightActiveLine();},\n initialValue: true\n },\n highlightSelectedWord: {\n set: function(shouldHighlight) {this.$onSelectionChange();},\n initialValue: true\n },\n readOnly: {\n set: function(readOnly) {\n this.textInput.setReadOnly(readOnly); \n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n cursorStyle: {\n set: function(val) { this.$resetCursorStyle(); },\n values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n initialValue: \"ace\"\n },\n mergeUndoDeltas: {\n values: [false, true, \"always\"],\n initialValue: true\n },\n behavioursEnabled: {initialValue: true},\n wrapBehavioursEnabled: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val)}\n },\n\n hScrollBarAlwaysVisible: \"renderer\",\n vScrollBarAlwaysVisible: \"renderer\",\n highlightGutterLine: \"renderer\",\n animatedScroll: \"renderer\",\n showInvisibles: \"renderer\",\n showPrintMargin: \"renderer\",\n printMarginColumn: \"renderer\",\n printMargin: \"renderer\",\n fadeFoldWidgets: \"renderer\",\n showFoldWidgets: \"renderer\",\n showLineNumbers: \"renderer\",\n showGutter: \"renderer\",\n displayIndentGuides: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = e.getAccelKey();\n var button = e.getButton();\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);\n\n if (isSamePoint(screenCursor, newCursor)\n && isSamePoint(cursor, selection.selectionLead))\n return;\n screenCursor = newCursor;\n\n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n\n \n\n if (ctrl && !alt && !shift && button === 0) {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n editor.$blockScrolling++;\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.$blockScrolling--;\n });\n\n } else if (alt && button === 0) {\n e.stop();\n\n if (isMultiSelect && !ctrl)\n selection.toSingleRange();\n else if (!isMultiSelect && ctrl)\n selection.addRange();\n\n var rectSel = [];\n if (shift) {\n screenAnchor = session.documentToScreenPosition(selection.lead);\n blockSelect();\n } else {\n selection.moveToPosition(pos);\n }\n\n\n var onMouseSelectionEnd = function(e) {\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) {\nexports.OS = {\n LINUX: \"LINUX\",\n MAC: \"MAC\",\n WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n if (exports.isMac) {\n return exports.OS.MAC;\n } else if (exports.isLinux) {\n return exports.OS.LINUX;\n } else {\n return exports.OS.WINDOWS;\n }\n};\nif (typeof navigator != \"object\")\n return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n && parseFloat(navigator.userAgent.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:|MSIE )([0-9]+[\\.0-9]+)/)[1]);\n \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = window.controllers && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((navigator.userAgent.match(/rv\\:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isTouchPad = ua.indexOf(\"TouchPad\") >= 0;\n\n});\n\nace.define('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n readonly: true\n}, {\n name: \"addCursorBelow\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n readonly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n readonly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n readonly: true\n}, {\n name: \"selectMoreBefore\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n readonly: true\n}, {\n name: \"selectMoreAfter\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n readonly: true\n}, {\n name: \"selectNextBefore\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n readonly: true\n}, {\n name: \"selectNextAfter\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n readonly: true\n}, {\n name: \"splitIntoLines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readonly: true\n}, {\n name: \"alignCursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"}\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n readonly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode}\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = function(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n};\n\nexports.mixin = function(obj, mixin) {\n for (var key in mixin) {\n obj[key] = mixin[key];\n }\n return obj;\n};\n\nexports.implement = function(proto, mixin) {\n exports.mixin(proto, mixin);\n};\n\n});\n\nace.define('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n if (require.nameToUrl && !require.toUrl)\n require.toUrl = require.nameToUrl;\n \n if (config.get(\"packaged\") || !require.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(require.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(require.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n try {\n this.$worker = new Worker(workerUrl);\n } catch(e) {\n if (e instanceof window.DOMException) {\n var blob = this.$workerBlob(workerUrl);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n\n this.$worker = new Worker(blobURL);\n URL.revokeObjectURL(blobURL);\n } else {\n throw e;\n }\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod,\n classname : classname\n });\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch(msg.type) {\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n }\n };\n\n this.$normalizePath = function(path) {\n if (!location.host) // needed for file:// protocol\n return path;\n path = path.replace(/^[a-z]+:\\/\\/[^\\/]+/, \"\"); // Remove domain name and rebuild it\n path = location.protocol + \"//\" + location.host\n + (path.charAt(0) == \"/\" ? \"\" : location.pathname.replace(/\\/[^\\/]*$/, \"\"))\n + \"/\" + path.replace(/^[\\/]+/, \"\");\n return path;\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n this.$doc.removeEventListener(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {}\n };\n\n this.attachToDocument = function(doc) {\n if(this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(e) {\n if (!this.deltaQueue) {\n this.deltaQueue = [e.data];\n setTimeout(this.$sendDeltaQueue, 0);\n } else\n this.deltaQueue.push(e.data);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 20 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n this.$workerBlob = function(workerUrl) {\n var script = \"importScripts('\" + workerUrl + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.callbackId = 1;\n this.callbacks = {};\n this.messageBuffer = [];\n\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n var _self = this;\n\n this.$worker = {};\n this.$worker.terminate = function() {};\n this.$worker.postMessage = function(e) {\n _self.messageBuffer.push(e);\n if (main) {\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n };\n this.setEmitSync = function(val) { emitSync = val };\n\n var processNext = function() {\n var msg = _self.messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n _self.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (_self.messageBuffer.length)\n processNext();\n });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\n\n});\n\nace.define('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n },\n\n FUNCTION_KEYS : {\n 8 : \"Backspace\",\n 9 : \"Tab\",\n 13 : \"Return\",\n 19 : \"Pause\",\n 27 : \"Esc\",\n 32 : \"Space\",\n 33 : \"PageUp\",\n 34 : \"PageDown\",\n 35 : \"End\",\n 36 : \"Home\",\n 37 : \"Left\",\n 38 : \"Up\",\n 39 : \"Right\",\n 40 : \"Down\",\n 44 : \"Print\",\n 45 : \"Insert\",\n 46 : \"Delete\",\n 96 : \"Numpad0\",\n 97 : \"Numpad1\",\n 98 : \"Numpad2\",\n 99 : \"Numpad3\",\n 100: \"Numpad4\",\n 101: \"Numpad5\",\n 102: \"Numpad6\",\n 103: \"Numpad7\",\n 104: \"Numpad8\",\n 105: \"Numpad9\",\n '-13': \"NumpadEnter\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"Numlock\",\n 145: \"Scrolllock\"\n },\n\n PRINTABLE_KEYS: {\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\n 188: ',', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\\\',\n 221: ']', 222: '\\''\n }\n };\n var name, i;\n for (i in ret.FUNCTION_KEYS) {\n name = ret.FUNCTION_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n for (i in ret.PRINTABLE_KEYS) {\n name = ret.PRINTABLE_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n oop.mixin(ret, ret.MODIFIER_KEYS);\n oop.mixin(ret, ret.PRINTABLE_KEYS);\n oop.mixin(ret, ret.FUNCTION_KEYS);\n ret.enter = ret[\"return\"];\n ret.escape = ret.esc;\n ret.del = ret[\"delete\"];\n ret[173] = '-';\n \n (function() {\n var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n for (var i = Math.pow(2, mods.length); i--;) {\n ret.KEY_MODS[i] = mods.filter(function(x) {\n return i & ret.KEY_MODS[x];\n }).join(\"-\") + \"-\";\n }\n })();\n\n return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n return (Keys[keyCode] || String.fromCharCode(keyCode)).toLowerCase();\n};\n\n});\nace.define('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar oop = require(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n var pos = this.$pos;\n\n this.pos = doc.createAnchor(pos.row, pos.column);\n this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.pos.on(\"change\", function(event) {\n session.removeMarker(_self.markerId);\n _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false);\n });\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if(this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n anchor.on(\"change\", function(event) {\n session.removeMarker(anchor.markerId);\n anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false);\n });\n });\n };\n this.hideOtherMarkers = function() {\n if(!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(event) {\n var delta = event.data;\n var range = delta.range;\n if(range.start.row !== range.end.row) return;\n if(range.start.row !== this.pos.row) return;\n if (this.$updating) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insertText\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n \n if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) {\n var distanceFromStart = range.start.column - this.pos.column;\n this.length += lengthDiff;\n if(!this.session.$fromUndo) {\n if(delta.action === \"insertText\") {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n newPos.column += lengthDiff;\n this.doc.insert(newPos, delta.text);\n }\n } else if(delta.action === \"removeText\") {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n newPos.column += lengthDiff;\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n if(range.start.column === this.pos.column && delta.action === \"insertText\") {\n setTimeout(function() {\n this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff);\n for (var i = 0; i < this.others.length; i++) {\n var other = this.others[i];\n var newPos = {row: other.row, column: other.column - lengthDiff};\n if(other.row === range.start.row && range.start.column < other.column)\n newPos.column += lengthDiff;\n other.setPosition(newPos.row, newPos.column);\n }\n }.bind(this), 0);\n }\n else if(range.start.column === this.pos.column && delta.action === \"removeText\") {\n setTimeout(function() {\n for (var i = 0; i < this.others.length; i++) {\n var other = this.others[i];\n if(other.row === range.start.row && range.start.column < other.column) {\n other.setPosition(other.row, other.column - lengthDiff);\n }\n }\n }.bind(this), 0);\n }\n }\n this.pos._emit(\"change\", {value: this.pos});\n for (var i = 0; i < this.others.length; i++) {\n this.others[i]._emit(\"change\", {value: this.others[i]});\n }\n }\n this.$updating = false;\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating) return;\n var pos = this.session.selection.getCursor();\n if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.markerId);\n this.hideOtherMarkers();\n this.doc.removeEventListener(\"change\", this.$onUpdate);\n this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n this.pos.detach();\n for (var i = 0; i < this.others.length; i++) {\n this.others[i].detach();\n }\n this.session.setUndoSelect(true);\n };\n this.cancel = function() {\n if(this.$undoStackDepth === -1)\n throw Error(\"Canceling placeholders only supported with undo manager attached to session.\");\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(true);\n }\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\n\nexports.addListener = function(elem, type, callback) {\n if (elem.addEventListener) {\n return elem.addEventListener(type, callback, false);\n }\n if (elem.attachEvent) {\n var wrapper = function() {\n callback.call(elem, window.event);\n };\n callback._wrapper = wrapper;\n elem.attachEvent(\"on\" + type, wrapper);\n }\n};\n\nexports.removeListener = function(elem, type, callback) {\n if (elem.removeEventListener) {\n return elem.removeEventListener(type, callback, false);\n }\n if (elem.detachEvent) {\n elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n }\n};\nexports.stopEvent = function(e) {\n exports.stopPropagation(e);\n exports.preventDefault(e);\n return false;\n};\n\nexports.stopPropagation = function(e) {\n if (e.stopPropagation)\n e.stopPropagation();\n else\n e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\n else\n e.returnValue = false;\n};\nexports.getButton = function(e) {\n if (e.type == \"dblclick\")\n return 0;\n if (e.type == \"contextmenu\" || (e.ctrlKey && useragent.isMac))\n return 2;\n if (e.preventDefault) {\n return e.button;\n }\n else {\n return {1:0, 2:2, 4:1}[e.button];\n }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n exports.removeListener(document, \"mousemove\", eventHandler, true);\n exports.removeListener(document, \"mouseup\", onMouseUp, true);\n exports.removeListener(document, \"dragstart\", onMouseUp, true);\n }\n\n exports.addListener(document, \"mousemove\", eventHandler, true);\n exports.addListener(document, \"mouseup\", onMouseUp, true);\n exports.addListener(document, \"dragstart\", onMouseUp, true);\n \n return onMouseUp;\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n if (\"onmousewheel\" in el) {\n exports.addListener(el, \"mousewheel\", function(e) {\n var factor = 8;\n if (e.wheelDeltaX !== undefined) {\n e.wheelX = -e.wheelDeltaX / factor;\n e.wheelY = -e.wheelDeltaY / factor;\n } else {\n e.wheelX = 0;\n e.wheelY = -e.wheelDelta / factor;\n }\n callback(e);\n });\n } else if (\"onwheel\" in el) {\n exports.addListener(el, \"wheel\", function(e) {\n var factor = 0.35;\n switch (e.deltaMode) {\n case e.DOM_DELTA_PIXEL:\n e.wheelX = e.deltaX * factor || 0;\n e.wheelY = e.deltaY * factor || 0;\n break;\n case e.DOM_DELTA_LINE:\n case e.DOM_DELTA_PAGE:\n e.wheelX = (e.deltaX || 0) * 5;\n e.wheelY = (e.deltaY || 0) * 5;\n break;\n }\n \n callback(e);\n });\n } else {\n exports.addListener(el, \"DOMMouseScroll\", function(e) {\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n e.wheelX = (e.detail || 0) * 5;\n e.wheelY = 0;\n } else {\n e.wheelX = 0;\n e.wheelY = (e.detail || 0) * 5;\n }\n callback(e);\n });\n }\n};\n\nexports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {\n var clicks = 0;\n var startX, startY, timer;\n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n exports.addListener(el, \"mousedown\", function(e) {\n if (exports.getButton(e) !== 0) {\n clicks = 0;\n } else if (e.detail > 1) {\n clicks++;\n if (clicks > 4)\n clicks = 1;\n } else {\n clicks = 1;\n }\n if (useragent.isIE) {\n var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n if (isNewClick) {\n clicks = 1;\n }\n if (clicks == 1) {\n startX = e.clientX;\n startY = e.clientY;\n }\n }\n\n eventHandler[callbackName](\"mousedown\", e);\n\n if (clicks > 4)\n clicks = 0;\n else if (clicks > 1)\n return eventHandler[callbackName](eventNames[clicks], e);\n });\n\n if (useragent.isOldIE) {\n exports.addListener(el, \"dblclick\", function(e) {\n clicks = 2;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n eventHandler[callbackName](\"mousedown\", e);\n eventHandler[callbackName](eventNames[clicks], e);\n });\n }\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n ? function(e) {\n return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n }\n : function(e) {\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n };\n\nexports.getModifierString = function(e) {\n return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n var hashId = getModifierHash(e);\n\n if (!useragent.isMac && pressedKeys) {\n if (pressedKeys[91] || pressedKeys[92])\n hashId |= 8;\n if (pressedKeys.altGr) {\n if ((3 & hashId) != 3)\n pressedKeys.altGr = 0;\n else\n return;\n }\n if (keyCode === 18 || keyCode === 17) {\n var location = e.location || e.keyLocation;\n if (keyCode === 17 && location === 1) {\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = -ts;\n ts = e.timeStamp;\n dt += ts;\n if (dt < 3)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\n switch (keys.MODIFIER_KEYS[keyCode]) {\n case \"Alt\":\n hashId = 2;\n break;\n case \"Shift\":\n hashId = 4;\n break;\n case \"Ctrl\":\n hashId = 1;\n break;\n default:\n hashId = 8;\n break;\n }\n keyCode = -1;\n }\n\n if (hashId & 8 && (keyCode === 91 || keyCode === 93)) {\n keyCode = -1;\n }\n \n if (!hashId && keyCode === 13) {\n if (e.location || e.keyLocation === 3) {\n callback(e, hashId, -keyCode);\n if (e.defaultPrevented)\n return;\n }\n }\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n return false;\n }\n \n return callback(e, hashId, keyCode);\n}\n\nvar pressedKeys = null;\nvar ts = 0;\nexports.addCommandKeyListener = function(el, callback) {\n var addListener = exports.addListener;\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n });\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n });\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = true;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n });\n\n addListener(el, \"keypress\", function(e) {\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n exports.stopEvent(e);\n lastDefaultPrevented = null;\n }\n });\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n });\n\n if (!pressedKeys) {\n pressedKeys = Object.create(null);\n addListener(window, \"focus\", function(e) {\n pressedKeys = Object.create(null);\n });\n }\n }\n};\n\nif (window.postMessage && !useragent.isOldIE) {\n var postMessageId = 1;\n exports.nextTick = function(callback, win) {\n win = win || window;\n var messageName = \"zero-timeout-message-\" + postMessageId;\n exports.addListener(win, \"message\", function listener(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n exports.removeListener(win, \"message\", listener);\n callback();\n }\n });\n win.postMessage(messageName, \"*\");\n };\n}\n\n\nexports.nextFrame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n window.oRequestAnimationFrame;\n\nif (exports.nextFrame)\n exports.nextFrame = exports.nextFrame.bind(window);\nelse\n exports.nextFrame = function(callback) {\n setTimeout(callback, 17);\n };\n});\n\nace.define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel)\n break;\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nif (typeof document == \"undefined\")\n return;\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n if (!doc)\n doc = document;\n return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n}\n\nexports.createElement = function(tag, ns) {\n return document.createElementNS ?\n document.createElementNS(ns || XHTML_NS, tag) :\n document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g);\n return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n if (!exports.hasCssClass(el, name)) {\n el.className += \" \" + name;\n }\n};\nexports.removeCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g);\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n classes.splice(index, 1);\n }\n el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g), add = true;\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n add = false;\n classes.splice(index, 1);\n }\n if(add)\n classes.push(name);\n\n el.className = classes.join(\" \");\n return add;\n};\nexports.setCssClass = function(node, className, include) {\n if (include) {\n exports.addCssClass(node, className);\n } else {\n exports.removeCssClass(node, className);\n }\n};\n\nexports.hasCssString = function(id, doc) {\n var index = 0, sheets;\n doc = doc || document;\n\n if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n while (index < sheets.length)\n if (sheets[index++].owningElement.id === id) return true;\n } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id) return true;\n }\n\n return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n doc = doc || document;\n if (id && exports.hasCssString(id, doc))\n return null;\n \n var style;\n \n if (doc.createStyleSheet) {\n style = doc.createStyleSheet();\n style.cssText = cssText;\n if (id)\n style.owningElement.id = id;\n } else {\n style = doc.createElementNS\n ? doc.createElementNS(XHTML_NS, \"style\")\n : doc.createElement(\"style\");\n\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n exports.getDocumentHead(doc).appendChild(style);\n }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n if (doc.createStyleSheet) {\n doc.createStyleSheet(uri);\n } else {\n var link = exports.createElement('link');\n link.rel = 'stylesheet';\n link.href = uri;\n\n exports.getDocumentHead(doc).appendChild(link);\n }\n};\n\nexports.getInnerWidth = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n element.clientWidth\n );\n};\n\nexports.getInnerHeight = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n element.clientHeight\n );\n};\n\nif (window.pageYOffset !== undefined) {\n exports.getPageScrollTop = function() {\n return window.pageYOffset;\n };\n\n exports.getPageScrollLeft = function() {\n return window.pageXOffset;\n };\n}\nelse {\n exports.getPageScrollTop = function() {\n return document.body.scrollTop;\n };\n\n exports.getPageScrollLeft = function() {\n return document.body.scrollLeft;\n };\n}\n\nif (window.getComputedStyle)\n exports.computedStyle = function(element, style) {\n if (style)\n return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n return window.getComputedStyle(element, \"\") || {};\n };\nelse\n exports.computedStyle = function(element, style) {\n if (style)\n return element.currentStyle[style];\n return element.currentStyle;\n };\n\nexports.scrollbarWidth = function(document) {\n var inner = exports.createElement(\"ace_inner\");\n inner.style.width = \"100%\";\n inner.style.minWidth = \"0px\";\n inner.style.height = \"200px\";\n inner.style.display = \"block\";\n\n var outer = exports.createElement(\"ace_outer\");\n var style = outer.style;\n\n style.position = \"absolute\";\n style.left = \"-10000px\";\n style.overflow = \"hidden\";\n style.width = \"200px\";\n style.minWidth = \"0px\";\n style.height = \"150px\";\n style.display = \"block\";\n\n outer.appendChild(inner);\n\n var body = document.documentElement;\n body.appendChild(outer);\n\n var noScrollbar = inner.offsetWidth;\n\n style.overflow = \"scroll\";\n var withScrollbar = inner.offsetWidth;\n\n if (noScrollbar == withScrollbar) {\n withScrollbar = outer.clientWidth;\n }\n\n body.removeChild(outer);\n\n return noScrollbar-withScrollbar;\n};\nexports.setInnerHtml = function(el, innerHtml) {\n var element = el.cloneNode(false);//document.createElement(\"div\");\n element.innerHTML = innerHtml;\n el.parentNode.replaceChild(element, el);\n return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n exports.setInnerText = function(el, innerText) {\n el.textContent = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.textContent;\n };\n}\nelse {\n exports.setInnerText = function(el, innerText) {\n el.innerText = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.innerText;\n };\n}\n\nexports.getParentWindow = function(document) {\n return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n Function.prototype.bind = function bind(that) { // .length is 1\n var target = this;\n if (typeof target != \"function\") {\n throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n }\n var args = slice.call(arguments, 1); // for normal call\n var bound = function () {\n\n if (this instanceof bound) {\n\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n\n }\n\n };\n if(target.prototype) {\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n return bound;\n };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n if(function() { // test IE < 9 to splice bug - see issue #138\n function makeArray(l) {\n var a = new Array(l+2);\n a[0] = a[1] = 0;\n return a;\n }\n var array = [], lengthBefore;\n \n array.splice.apply(array, makeArray(20));\n array.splice.apply(array, makeArray(26));\n\n lengthBefore = array.length; //46\n array.splice(5, 0, \"XXX\"); // add one element\n\n lengthBefore + 1 == array.length\n\n if (lengthBefore + 1 == array.length) {\n return true;// has right splice implementation without bugs\n }\n }()) {//IE 6/7\n var array_splice = Array.prototype.splice;\n Array.prototype.splice = function(start, deleteCount) {\n if (!arguments.length) {\n return [];\n } else {\n return array_splice.apply(this, [\n start === void 0 ? 0 : start,\n deleteCount === void 0 ? (this.length - start) : deleteCount\n ].concat(slice.call(arguments, 2)))\n }\n };\n } else {//IE8\n Array.prototype.splice = function(pos, removeCount){\n var length = this.length;\n if (pos > 0) {\n if (pos > length)\n pos = length;\n } else if (pos == void 0) {\n pos = 0;\n } else if (pos < 0) {\n pos = Math.max(length + pos, 0);\n }\n\n if (!(pos+removeCount < length))\n removeCount = length - pos;\n\n var removed = this.slice(pos, pos+removeCount);\n var insert = slice.call(arguments, 2);\n var add = insert.length; \n if (pos === length) {\n if (add) {\n this.push.apply(this, insert);\n }\n } else {\n var remove = Math.min(removeCount, length - pos);\n var tailOldPos = pos + remove;\n var tailNewPos = tailOldPos + add - remove;\n var tailCount = length - tailOldPos;\n var lengthAfterRemove = length - remove;\n\n if (tailNewPos < tailOldPos) { // case A\n for (var i = 0; i < tailCount; ++i) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } else if (tailNewPos > tailOldPos) { // case B\n for (i = tailCount; i--; ) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } // else, add == remove (nothing to do)\n\n if (add && pos === lengthAfterRemove) {\n this.length = lengthAfterRemove; // truncate array\n this.push.apply(this, insert);\n } else {\n this.length = lengthAfterRemove + add; // reserves space\n for (i = 0; i < add; ++i) {\n this[pos+i] = insert[i];\n }\n }\n }\n return removed;\n };\n }\n}\nif (!Array.isArray) {\n Array.isArray = function isArray(obj) {\n return _toString(obj) == \"[object Array]\";\n };\n}\nvar boxedString = Object(\"a\"),\n splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n thisp = arguments[1],\n i = -1,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(); // TODO message\n }\n\n while (++i < length) {\n if (i in self) {\n fun.call(thisp, self[i], i, object);\n }\n }\n };\n}\nif (!Array.prototype.map) {\n Array.prototype.map = function map(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = Array(length),\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self)\n result[i] = fun.call(thisp, self[i], i, object);\n }\n return result;\n };\n}\nif (!Array.prototype.filter) {\n Array.prototype.filter = function filter(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = [],\n value,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self) {\n value = self[i];\n if (fun.call(thisp, value, i, object)) {\n result.push(value);\n }\n }\n }\n return result;\n };\n}\nif (!Array.prototype.every) {\n Array.prototype.every = function every(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && !fun.call(thisp, self[i], i, object)) {\n return false;\n }\n }\n return true;\n };\n}\nif (!Array.prototype.some) {\n Array.prototype.some = function some(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && fun.call(thisp, self[i], i, object)) {\n return true;\n }\n }\n return false;\n };\n}\nif (!Array.prototype.reduce) {\n Array.prototype.reduce = function reduce(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n\n var i = 0;\n var result;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i++];\n break;\n }\n if (++i >= length) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n } while (true);\n }\n\n for (; i < length; i++) {\n if (i in self) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n }\n\n return result;\n };\n}\nif (!Array.prototype.reduceRight) {\n Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n\n var result, i = length - 1;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i--];\n break;\n }\n if (--i < 0) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n } while (true);\n }\n\n do {\n if (i in this) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n } while (i--);\n\n return result;\n };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n\n var i = 0;\n if (arguments.length > 1) {\n i = toInteger(arguments[1]);\n }\n i = i >= 0 ? i : Math.max(0, length + i);\n for (; i < length; i++) {\n if (i in self && self[i] === sought) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n var i = length - 1;\n if (arguments.length > 1) {\n i = Math.min(i, toInteger(arguments[1]));\n }\n i = i >= 0 ? i : length - Math.abs(i);\n for (; i >= 0; i--) {\n if (i in self && sought === self[i]) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Object.getPrototypeOf) {\n Object.getPrototypeOf = function getPrototypeOf(object) {\n return object.__proto__ || (\n object.constructor ?\n object.constructor.prototype :\n prototypeOfObject\n );\n };\n}\nif (!Object.getOwnPropertyDescriptor) {\n var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n \"non-object: \";\n Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT + object);\n if (!owns(object, property))\n return;\n\n var descriptor, getter, setter;\n descriptor = { enumerable: true, configurable: true };\n if (supportsAccessors) {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n\n var getter = lookupGetter(object, property);\n var setter = lookupSetter(object, property);\n object.__proto__ = prototype;\n\n if (getter || setter) {\n if (getter) descriptor.get = getter;\n if (setter) descriptor.set = setter;\n return descriptor;\n }\n }\n descriptor.value = object[property];\n return descriptor;\n };\n}\nif (!Object.getOwnPropertyNames) {\n Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n return Object.keys(object);\n };\n}\nif (!Object.create) {\n var createEmpty;\n if (Object.prototype.__proto__ === null) {\n createEmpty = function () {\n return { \"__proto__\": null };\n };\n } else {\n createEmpty = function () {\n var empty = {};\n for (var i in empty)\n empty[i] = null;\n empty.constructor =\n empty.hasOwnProperty =\n empty.propertyIsEnumerable =\n empty.isPrototypeOf =\n empty.toLocaleString =\n empty.toString =\n empty.valueOf =\n empty.__proto__ = null;\n return empty;\n }\n }\n\n Object.create = function create(prototype, properties) {\n var object;\n if (prototype === null) {\n object = createEmpty();\n } else {\n if (typeof prototype != \"object\")\n throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n var Type = function () {};\n Type.prototype = prototype;\n object = new Type();\n object.__proto__ = prototype;\n }\n if (properties !== void 0)\n Object.defineProperties(object, properties);\n return object;\n };\n}\n\nfunction doesDefinePropertyWork(object) {\n try {\n Object.defineProperty(object, \"sentinel\", {});\n return \"sentinel\" in object;\n } catch (exception) {\n }\n}\nif (Object.defineProperty) {\n var definePropertyWorksOnObject = doesDefinePropertyWork({});\n var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n doesDefinePropertyWork(document.createElement(\"div\"));\n if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n var definePropertyFallback = Object.defineProperty;\n }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n \"on this javascript engine\";\n\n Object.defineProperty = function defineProperty(object, property, descriptor) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n if (definePropertyFallback) {\n try {\n return definePropertyFallback.call(Object, object, property, descriptor);\n } catch (exception) {\n }\n }\n if (owns(descriptor, \"value\")) {\n\n if (supportsAccessors && (lookupGetter(object, property) ||\n lookupSetter(object, property)))\n {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n delete object[property];\n object[property] = descriptor.value;\n object.__proto__ = prototype;\n } else {\n object[property] = descriptor.value;\n }\n } else {\n if (!supportsAccessors)\n throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n if (owns(descriptor, \"get\"))\n defineGetter(object, property, descriptor.get);\n if (owns(descriptor, \"set\"))\n defineSetter(object, property, descriptor.set);\n }\n\n return object;\n };\n}\nif (!Object.defineProperties) {\n Object.defineProperties = function defineProperties(object, properties) {\n for (var property in properties) {\n if (owns(properties, property))\n Object.defineProperty(object, property, properties[property]);\n }\n return object;\n };\n}\nif (!Object.seal) {\n Object.seal = function seal(object) {\n return object;\n };\n}\nif (!Object.freeze) {\n Object.freeze = function freeze(object) {\n return object;\n };\n}\ntry {\n Object.freeze(function () {});\n} catch (exception) {\n Object.freeze = (function freeze(freezeObject) {\n return function freeze(object) {\n if (typeof object == \"function\") {\n return object;\n } else {\n return freezeObject(object);\n }\n };\n })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n Object.preventExtensions = function preventExtensions(object) {\n return object;\n };\n}\nif (!Object.isSealed) {\n Object.isSealed = function isSealed(object) {\n return false;\n };\n}\nif (!Object.isFrozen) {\n Object.isFrozen = function isFrozen(object) {\n return false;\n };\n}\nif (!Object.isExtensible) {\n Object.isExtensible = function isExtensible(object) {\n if (Object(object) === object) {\n throw new TypeError(); // TODO message\n }\n var name = '';\n while (owns(object, name)) {\n name += '?';\n }\n object[name] = true;\n var returnValue = owns(object, name);\n delete object[name];\n return returnValue;\n };\n}\nif (!Object.keys) {\n var hasDontEnumBug = true,\n dontEnums = [\n \"toString\",\n \"toLocaleString\",\n \"valueOf\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"constructor\"\n ],\n dontEnumsLength = dontEnums.length;\n\n for (var key in {\"toString\": null}) {\n hasDontEnumBug = false;\n }\n\n Object.keys = function keys(object) {\n\n if (\n (typeof object != \"object\" && typeof object != \"function\") ||\n object === null\n ) {\n throw new TypeError(\"Object.keys called on a non-object\");\n }\n\n var keys = [];\n for (var name in object) {\n if (owns(object, name)) {\n keys.push(name);\n }\n }\n\n if (hasDontEnumBug) {\n for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n var dontEnum = dontEnums[i];\n if (owns(object, dontEnum)) {\n keys.push(dontEnum);\n }\n }\n }\n return keys;\n };\n\n}\nif (!Date.now) {\n Date.now = function now() {\n return new Date().getTime();\n };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n ws = \"[\" + ws + \"]\";\n var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n trimEndRegexp = new RegExp(ws + ws + \"*$\");\n String.prototype.trim = function trim() {\n return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n };\n}\n\nfunction toInteger(n) {\n n = +n;\n if (n !== n) { // isNaN\n n = 0;\n } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n return n;\n}\n\nfunction isPrimitive(input) {\n var type = typeof input;\n return (\n input === null ||\n type === \"undefined\" ||\n type === \"boolean\" ||\n type === \"number\" ||\n type === \"string\"\n );\n}\n\nfunction toPrimitive(input) {\n var val, valueOf, toString;\n if (isPrimitive(input)) {\n return input;\n }\n valueOf = input.valueOf;\n if (typeof valueOf === \"function\") {\n val = valueOf.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n toString = input.toString;\n if (typeof toString === \"function\") {\n val = toString.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n throw new TypeError();\n}\nvar toObject = function (o) {\n if (o == null) { // this matches both null and undefined\n throw new TypeError(\"can't convert \"+o+\" to object\");\n }\n return Object(o);\n};\n\n});\n \nace.define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n var real = {\n exec: RegExp.prototype.exec,\n test: RegExp.prototype.test,\n match: String.prototype.match,\n replace: String.prototype.replace,\n split: String.prototype.split\n },\n compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n compliantLastIndexIncrement = function () {\n var x = /^/g;\n real.test.call(x, \"\");\n return !x.lastIndex;\n }();\n\n if (compliantLastIndexIncrement && compliantExecNpcg)\n return;\n RegExp.prototype.exec = function (str) {\n var match = real.exec.apply(this, arguments),\n name, r2;\n if ( typeof(str) == 'string' && match) {\n if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n real.replace.call(str.slice(match.index), r2, function () {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined)\n match[i] = undefined;\n }\n });\n }\n if (this._xregexp && this._xregexp.captureNames) {\n for (var i = 1; i < match.length; i++) {\n name = this._xregexp.captureNames[i - 1];\n if (name)\n match[name] = match[i];\n }\n }\n if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n }\n return match;\n };\n if (!compliantLastIndexIncrement) {\n RegExp.prototype.test = function (str) {\n var match = real.exec.call(this, str);\n if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n return !!match;\n };\n }\n\n function getNativeFlags (regex) {\n return (regex.global ? \"g\" : \"\") +\n (regex.ignoreCase ? \"i\" : \"\") +\n (regex.multiline ? \"m\" : \"\") +\n (regex.extended ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n (regex.sticky ? \"y\" : \"\");\n }\n\n function indexOf (array, item, from) {\n if (Array.prototype.indexOf) // Use the native array method if available\n return array.indexOf(item, from);\n for (var i = from || 0; i < array.length; i++) {\n if (array[i] === item)\n return i;\n }\n return -1;\n }\n\n});\n\nace.define('ace/ext/error_marker', ['require', 'exports', 'module' , 'ace/line_widgets', 'ace/lib/dom', 'ace/range'], function(require, exports, module) {\n\nvar LineWidgets = require(\"ace/line_widgets\").LineWidgets;\nvar dom = require(\"ace/lib/dom\");\nvar Range = require(\"ace/range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length - 1)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.lineWidgets && session.lineWidgets[row];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\")\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
\");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"\");\n\n});// vim:set ts=4 sts=4 sw=4 st:\n\nace.define('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n\nace.define('ace/line_widgets', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar Range = require(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.detach = this.detach.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount)\n screenRows +=w.rowCount;\n });\n return screenRows;\n }; \n \n this.attach = function(editor) {\n if (editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n this.editor.on(\"changeSession\", this.detach);\n \n editor.widgetManager = this;\n\n editor.setOption(\"enableLineWidgets\", true);\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n };\n this.detach = function(e) {\n if (e && e.session == this.session)\n return; // sometimes attach can be called before setSession\n var editor = this.editor;\n if (!editor)\n return;\n\n editor.off(\"changeSession\", this.detach);\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnChange = function(e) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var delta = e.data;\n var range = delta.range;\n var startRow = range.start.row;\n var len = range.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n var removed = lineWidgets.splice(startRow + 1, len);\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.addLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n this.session.lineWidgets[w.row] = w;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n }\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (!w.pixelHeight) {\n w.pixelHeight = w.el.offsetHeight;\n }\n if (w.rowCount == null)\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets)\n this.session.lineWidgets[w.row] = undefined;\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n\n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n this.$lines = [];\n if (text.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(text)) {\n this._insertLines(0, text);\n } else {\n this.insert({row: 0, column:0}, text);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength();\n this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n this.insert({row: 0, column:0}, text);\n };\n this.getValue = function() {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n this.createAnchor = function(row, column) {\n return new Anchor(this, row, column);\n };\n if (\"aaa\".split(/a/).length === 0)\n this.$split = function(text) {\n return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n };\n else\n this.$split = function(text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n\n\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineCharacter = function() {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n\n this.$autoNewLine = \"\";\n this.$newLineMode = \"auto\";\n this.setNewLineMode = function(newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineMode = function() {\n return this.$newLineMode;\n };\n this.isNewLine = function(text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n this.getLine = function(row) {\n return this.$lines[row] || \"\";\n };\n this.getLines = function(firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n this.getAllLines = function() {\n return this.getLines(0, this.getLength());\n };\n this.getLength = function() {\n return this.$lines.length;\n };\n this.getTextRange = function(range) {\n if (range.start.row == range.end.row) {\n return this.getLine(range.start.row)\n .substring(range.start.column, range.end.column);\n }\n var lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n return lines.join(this.getNewLineCharacter());\n };\n\n this.$clipPosition = function(position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length-1).length;\n } else if (position.row < 0)\n position.row = 0;\n return position;\n };\n this.insert = function(position, text) {\n if (!text || text.length === 0)\n return position;\n\n position = this.$clipPosition(position);\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n\n var lines = this.$split(text);\n var firstLine = lines.splice(0, 1)[0];\n var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n position = this.insertInLine(position, firstLine);\n if (lastLine !== null) {\n position = this.insertNewLine(position); // terminate first line\n position = this._insertLines(position.row, lines);\n position = this.insertInLine(position, lastLine || \"\");\n }\n return position;\n };\n this.insertLines = function(row, lines) {\n if (row >= this.getLength())\n return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n return this._insertLines(Math.max(row, 0), lines);\n };\n this._insertLines = function(row, lines) {\n if (lines.length == 0)\n return {row: row, column: 0};\n while (lines.length > 0xF000) {\n var end = this._insertLines(row, lines.slice(0, 0xF000));\n lines = lines.slice(0xF000);\n row = end.row;\n }\n\n var args = [row, 0];\n args.push.apply(args, lines);\n this.$lines.splice.apply(this.$lines, args);\n\n var range = new Range(row, 0, row + lines.length, 0);\n var delta = {\n action: \"insertLines\",\n range: range,\n lines: lines\n };\n this._signal(\"change\", { data: delta });\n return range.end;\n };\n this.insertNewLine = function(position) {\n position = this.$clipPosition(position);\n var line = this.$lines[position.row] || \"\";\n\n this.$lines[position.row] = line.substring(0, position.column);\n this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n var end = {\n row : position.row + 1,\n column : 0\n };\n\n var delta = {\n action: \"insertText\",\n range: Range.fromPoints(position, end),\n text: this.getNewLineCharacter()\n };\n this._signal(\"change\", { data: delta });\n\n return end;\n };\n this.insertInLine = function(position, text) {\n if (text.length == 0)\n return position;\n\n var line = this.$lines[position.row] || \"\";\n\n this.$lines[position.row] = line.substring(0, position.column) + text\n + line.substring(position.column);\n\n var end = {\n row : position.row,\n column : position.column + text.length\n };\n\n var delta = {\n action: \"insertText\",\n range: Range.fromPoints(position, end),\n text: text\n };\n this._signal(\"change\", { data: delta });\n\n return end;\n };\n this.remove = function(range) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n range.start = this.$clipPosition(range.start);\n range.end = this.$clipPosition(range.end);\n\n if (range.isEmpty())\n return range.start;\n\n var firstRow = range.start.row;\n var lastRow = range.end.row;\n\n if (range.isMultiLine()) {\n var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n var lastFullRow = lastRow - 1;\n\n if (range.end.column > 0)\n this.removeInLine(lastRow, 0, range.end.column);\n\n if (lastFullRow >= firstFullRow)\n this._removeLines(firstFullRow, lastFullRow);\n\n if (firstFullRow != firstRow) {\n this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n this.removeNewLine(range.start.row);\n }\n }\n else {\n this.removeInLine(firstRow, range.start.column, range.end.column);\n }\n return range.start;\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n if (startColumn == endColumn)\n return;\n\n var range = new Range(row, startColumn, row, endColumn);\n var line = this.getLine(row);\n var removed = line.substring(startColumn, endColumn);\n var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n this.$lines.splice(row, 1, newLine);\n\n var delta = {\n action: \"removeText\",\n range: range,\n text: removed\n };\n this._signal(\"change\", { data: delta });\n return range.start;\n };\n this.removeLines = function(firstRow, lastRow) {\n if (firstRow < 0 || lastRow >= this.getLength())\n return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n return this._removeLines(firstRow, lastRow);\n };\n\n this._removeLines = function(firstRow, lastRow) {\n var range = new Range(firstRow, 0, lastRow + 1, 0);\n var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n var delta = {\n action: \"removeLines\",\n range: range,\n nl: this.getNewLineCharacter(),\n lines: removed\n };\n this._signal(\"change\", { data: delta });\n return removed;\n };\n this.removeNewLine = function(row) {\n var firstLine = this.getLine(row);\n var secondLine = this.getLine(row+1);\n\n var range = new Range(row, firstLine.length, row+1, 0);\n var line = firstLine + secondLine;\n\n this.$lines.splice(row, 2, line);\n\n var delta = {\n action: \"removeText\",\n range: range,\n text: this.getNewLineCharacter()\n };\n this._signal(\"change\", { data: delta });\n };\n this.replace = function(range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length == 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n\n this.remove(range);\n if (text) {\n var end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n\n return end;\n };\n this.applyDeltas = function(deltas) {\n for (var i=0; i=0; i--) {\n var delta = deltas[i];\n\n var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n if (delta.action == \"insertLines\")\n this._removeLines(range.start.row, range.end.row - 1);\n else if (delta.action == \"insertText\")\n this.remove(range);\n else if (delta.action == \"removeLines\")\n this._insertLines(range.start.row, delta.lines);\n else if (delta.action == \"removeText\")\n this.insert(range.start, delta.text);\n }\n };\n this.indexToPosition = function(index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return {row: i, column: index + lines[i].length + newlineLength};\n }\n return {row: l-1, column: lines[l-1].length};\n };\n this.positionToIndex = function(pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n\n return index + pos.column;\n };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n;\n (function() {\n ace.require([\"ace/ace\"], function(a) {\n a && a.config.init(true);\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n ace[key] = a[key];\n });\n })();\n ","/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\nace.define('ace/mode/python', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/python_highlight_rules', 'ace/mode/folding/pythonic', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar PythonHighlightRules = require(\"./python_highlight_rules\").PythonHighlightRules;\nvar PythonFoldMode = require(\"./folding/pythonic\").FoldMode;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = PythonHighlightRules;\n this.foldingRules = new PythonFoldMode(\"\\\\:\");\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n this.lineCommentStart = \"#\";\n\n this.getNextLineIndent = function(state, line, tab) {\n var indent = this.$getIndent(line);\n\n var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n var tokens = tokenizedLine.tokens;\n\n if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n return indent;\n }\n\n if (state == \"start\") {\n var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n if (match) {\n indent += tab;\n }\n }\n\n return indent;\n };\n\n var outdents = {\n \"pass\": 1,\n \"return\": 1,\n \"raise\": 1,\n \"break\": 1,\n \"continue\": 1\n };\n \n this.checkOutdent = function(state, line, input) {\n if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n return false;\n\n var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n \n if (!tokens)\n return false;\n do {\n var last = tokens.pop();\n } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n \n if (!last)\n return false;\n \n return (last.type == \"keyword\" && outdents[last.value]);\n };\n\n this.autoOutdent = function(state, doc, row) {\n \n row += 1;\n var indent = this.$getIndent(doc.getLine(row));\n var tab = doc.getTabString();\n if (indent.slice(-tab.length) == tab)\n doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n };\n\n this.$id = \"ace/mode/python\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define('ace/mode/python_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PythonHighlightRules = function() {\n\n var keywords = (\n \"and|as|assert|break|class|continue|def|del|elif|else|except|exec|\" +\n \"finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|\" +\n \"raise|return|try|while|with|yield\"\n );\n\n var builtinConstants = (\n \"True|False|None|NotImplemented|Ellipsis|__debug__\"\n );\n\n var builtinFunctions = (\n \"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|\" +\n \"eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|\" +\n \"binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|\" +\n \"float|list|raw_input|unichr|callable|format|locals|reduce|unicode|\" +\n \"chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|\" +\n \"cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|\" +\n \"__import__|complex|hash|min|set|apply|delattr|help|next|setattr|\" +\n \"buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\"\n );\n var keywordMapper = this.createKeywordMapper({\n \"invalid.deprecated\": \"debugger\",\n \"support.function\": builtinFunctions,\n \"constant.language\": builtinConstants,\n \"keyword\": keywords\n }, \"identifier\");\n\n var strPre = \"(?:r|u|ur|R|U|UR|Ur|uR)?\";\n\n var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n var octInteger = \"(?:0[oO]?[0-7]+)\";\n var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n var binInteger = \"(?:0[bB][01]+)\";\n var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n var exponent = \"(?:[eE][+-]?\\\\d+)\";\n var fraction = \"(?:\\\\.\\\\d+)\";\n var intPart = \"(?:\\\\d+)\";\n var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" + intPart + \")\" + exponent + \")\";\n var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n var stringEscape = \"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";\n\n this.$rules = {\n \"start\" : [ {\n token : \"comment\",\n regex : \"#.*$\"\n }, {\n token : \"string\", // multi line \"\"\" string start\n regex : strPre + '\"{3}',\n next : \"qqstring3\"\n }, {\n token : \"string\", // \" string\n regex : strPre + '\"(?=.)',\n next : \"qqstring\"\n }, {\n token : \"string\", // multi line ''' string start\n regex : strPre + \"'{3}\",\n next : \"qstring3\"\n }, {\n token : \"string\", // ' string\n regex : strPre + \"'(?=.)\",\n next : \"qstring\"\n }, {\n token : \"constant.numeric\", // imaginary\n regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n }, {\n token : \"constant.numeric\", // float\n regex : floatNumber\n }, {\n token : \"constant.numeric\", // long integer\n regex : integer + \"[lL]\\\\b\"\n }, {\n token : \"constant.numeric\", // integer\n regex : integer + \"\\\\b\"\n }, {\n token : keywordMapper,\n regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n }, {\n token : \"keyword.operator\",\n regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n }, {\n token : \"paren.lparen\",\n regex : \"[\\\\[\\\\(\\\\{]\"\n }, {\n token : \"paren.rparen\",\n regex : \"[\\\\]\\\\)\\\\}]\"\n }, {\n token : \"text\",\n regex : \"\\\\s+\"\n } ],\n \"qqstring3\" : [ {\n token : \"constant.language.escape\",\n regex : stringEscape\n }, {\n token : \"string\", // multi line \"\"\" string end\n regex : '\"{3}',\n next : \"start\"\n }, {\n defaultToken : \"string\"\n } ],\n \"qstring3\" : [ {\n token : \"constant.language.escape\",\n regex : stringEscape\n }, {\n token : \"string\", // multi line ''' string end\n regex : \"'{3}\",\n next : \"start\"\n }, {\n defaultToken : \"string\"\n } ],\n \"qqstring\" : [{\n token : \"constant.language.escape\",\n regex : stringEscape\n }, {\n token : \"string\",\n regex : \"\\\\\\\\$\",\n next : \"qqstring\"\n }, {\n token : \"string\",\n regex : '\"|$',\n next : \"start\"\n }, {\n defaultToken: \"string\"\n }],\n \"qstring\" : [{\n token : \"constant.language.escape\",\n regex : stringEscape\n }, {\n token : \"string\",\n regex : \"\\\\\\\\$\",\n next : \"qstring\"\n }, {\n token : \"string\",\n regex : \"'|$\",\n next : \"start\"\n }, {\n defaultToken: \"string\"\n }]\n };\n};\n\noop.inherits(PythonHighlightRules, TextHighlightRules);\n\nexports.PythonHighlightRules = PythonHighlightRules;\n});\n\nace.define('ace/mode/folding/pythonic', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(markers) {\n this.foldingStartMarker = new RegExp(\"([\\\\[{])(?:\\\\s*)$|(\" + markers + \")(?:\\\\s*)(?:#.*)?$\");\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n var line = session.getLine(row);\n var match = line.match(this.foldingStartMarker);\n if (match) {\n if (match[1])\n return this.openingBracketBlock(session, match[1], row, match.index);\n if (match[2])\n return this.indentationBlock(session, row, match.index + match[2].length);\n return this.indentationBlock(session, row);\n }\n }\n\n}).call(FoldMode.prototype);\n\n});\n","/*\n * r.js\n *\n * Copyright (C) 2009-11 by RStudio, Inc.\n *\n * The Initial Developer of the Original Code is\n * Ajax.org B.V.\n * Portions created by the Initial Developer are Copyright (C) 2010\n * the Initial Developer. All Rights Reserved.\n *\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n *\n */\nace.define('ace/mode/r', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/r_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/unicode'], function(require, exports, module) {\n \n\n var Range = require(\"../range\").Range;\n var oop = require(\"../lib/oop\");\n var TextMode = require(\"./text\").Mode;\n var Tokenizer = require(\"../tokenizer\").Tokenizer;\n var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n var RHighlightRules = require(\"./r_highlight_rules\").RHighlightRules;\n var MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n var unicode = require(\"../unicode\");\n\n var Mode = function()\n {\n this.HighlightRules = RHighlightRules;\n this.$outdent = new MatchingBraceOutdent();\n };\n oop.inherits(Mode, TextMode);\n\n (function()\n {\n this.lineCommentStart = \"#\";\n this.$id = \"ace/mode/r\";\n }).call(Mode.prototype);\n exports.Mode = Mode;\n});\nace.define('ace/mode/r_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/tex_highlight_rules'], function(require, exports, module) {\n\n var oop = require(\"../lib/oop\");\n var lang = require(\"../lib/lang\");\n var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n var TexHighlightRules = require(\"./tex_highlight_rules\").TexHighlightRules;\n\n var RHighlightRules = function()\n {\n\n var keywords = lang.arrayToMap(\n (\"function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass\")\n .split(\"|\")\n );\n\n var buildinConstants = lang.arrayToMap(\n (\"NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|\" +\n \"NA_complex_\").split(\"|\")\n );\n\n this.$rules = {\n \"start\" : [\n {\n token : \"comment.sectionhead\",\n regex : \"#+(?!').*(?:----|====|####)\\\\s*$\"\n },\n {\n token : \"comment\",\n regex : \"#+'\",\n next : \"rd-start\"\n },\n {\n token : \"comment\",\n regex : \"#.*$\"\n },\n {\n token : \"string\", // multi line string start\n regex : '[\"]',\n next : \"qqstring\"\n },\n {\n token : \"string\", // multi line string start\n regex : \"[']\",\n next : \"qstring\"\n },\n {\n token : \"constant.numeric\", // hex\n regex : \"0[xX][0-9a-fA-F]+[Li]?\\\\b\"\n },\n {\n token : \"constant.numeric\", // explicit integer\n regex : \"\\\\d+L\\\\b\"\n },\n {\n token : \"constant.numeric\", // number\n regex : \"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"\n },\n {\n token : \"constant.numeric\", // number with leading decimal\n regex : \"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"\n },\n {\n token : \"constant.language.boolean\",\n regex : \"(?:TRUE|FALSE|T|F)\\\\b\"\n },\n {\n token : \"identifier\",\n regex : \"`.*?`\"\n },\n {\n onMatch : function(value) {\n if (keywords[value])\n return \"keyword\";\n else if (buildinConstants[value])\n return \"constant.language\";\n else if (value == '...' || value.match(/^\\.\\.\\d+$/))\n return \"variable.language\";\n else\n return \"identifier\";\n },\n regex : \"[a-zA-Z.][a-zA-Z0-9._]*\\\\b\"\n },\n {\n token : \"keyword.operator\",\n regex : \"%%|>=|<=|==|!=|\\\\->|<\\\\-|\\\\|\\\\||&&|=|\\\\+|\\\\-|\\\\*|/|\\\\^|>|<|!|&|\\\\||~|\\\\$|:\"\n },\n {\n token : \"keyword.operator\", // infix operators\n regex : \"%.*?%\"\n },\n {\n token : \"paren.keyword.operator\",\n regex : \"[[({]\"\n },\n {\n token : \"paren.keyword.operator\",\n regex : \"[\\\\])}]\"\n },\n {\n token : \"text\",\n regex : \"\\\\s+\"\n }\n ],\n \"qqstring\" : [\n {\n token : \"string\",\n regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n next : \"start\"\n },\n {\n token : \"string\",\n regex : '.+'\n }\n ],\n \"qstring\" : [\n {\n token : \"string\",\n regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n next : \"start\"\n },\n {\n token : \"string\",\n regex : '.+'\n }\n ]\n };\n\n var rdRules = new TexHighlightRules(\"comment\").getRules();\n for (var i = 0; i < rdRules[\"start\"].length; i++) {\n rdRules[\"start\"][i].token += \".virtual-comment\";\n }\n\n this.addRules(rdRules, \"rd-\");\n this.$rules[\"rd-start\"].unshift({\n token: \"text\",\n regex: \"^\",\n next: \"start\"\n });\n this.$rules[\"rd-start\"].unshift({\n token : \"keyword\",\n regex : \"@(?!@)[^ ]*\"\n });\n this.$rules[\"rd-start\"].unshift({\n token : \"comment\",\n regex : \"@@\"\n });\n this.$rules[\"rd-start\"].push({\n token : \"comment\",\n regex : \"[^%\\\\\\\\[({\\\\])}]+\"\n });\n };\n\n oop.inherits(RHighlightRules, TextHighlightRules);\n\n exports.RHighlightRules = RHighlightRules;\n});\nace.define('ace/mode/tex_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TexHighlightRules = function(textClass) {\n\n if (!textClass)\n textClass = \"text\";\n\n this.$rules = {\n \"start\" : [\n\t {\n\t token : \"comment\",\n\t regex : \"%.*$\"\n\t }, {\n\t token : textClass, // non-command\n\t regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n\t }, {\n\t token : \"keyword\", // command\n\t regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",\n next : \"nospell\"\n\t }, {\n\t token : \"keyword\", // command\n\t regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"\n\t }, {\n token : \"paren.keyword.operator\",\n\t regex : \"[[({]\"\n\t }, {\n token : \"paren.keyword.operator\",\n\t regex : \"[\\\\])}]\"\n\t }, {\n\t token : textClass,\n\t regex : \"\\\\s+\"\n\t }\n ],\n \"nospell\" : [\n {\n token : \"comment\",\n regex : \"%.*$\",\n next : \"start\"\n }, {\n token : \"nospell.\" + textClass, // non-command\n regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n }, {\n token : \"keyword\", // command\n regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"\n }, {\n token : \"keyword\", // command\n regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",\n next : \"start\"\n }, {\n token : \"paren.keyword.operator\",\n regex : \"[[({]\"\n }, {\n token : \"paren.keyword.operator\",\n regex : \"[\\\\])]\"\n }, {\n token : \"paren.keyword.operator\",\n regex : \"}\",\n next : \"start\"\n }, {\n token : \"nospell.\" + textClass,\n regex : \"\\\\s+\"\n }, {\n token : \"nospell.\" + textClass,\n regex : \"\\\\w+\"\n }\n ]\n };\n};\n\noop.inherits(TexHighlightRules, TextHighlightRules);\n\nexports.TexHighlightRules = TexHighlightRules;\n});\n\nace.define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n this.checkOutdent = function(line, input) {\n if (! /^\\s+$/.test(line))\n return false;\n\n return /^\\s*\\}/.test(input);\n };\n\n this.autoOutdent = function(doc, row) {\n var line = doc.getLine(row);\n var match = line.match(/^(\\s*\\})/);\n\n if (!match) return 0;\n\n var column = match[1].length;\n var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n if (!openBracePos || openBracePos.row == row) return 0;\n\n var indent = this.$getIndent(doc.getLine(openBracePos.row));\n doc.replace(new Range(row, 0, row, column-1), indent);\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n","/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\nace.define('ace/theme/chrome', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-chrome\";\nexports.cssText = \".ace-chrome .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333;\\\noverflow : hidden;\\\n}\\\n.ace-chrome .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-chrome {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-chrome .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_invalid {\\\nbackground-color: rgb(153, 0, 0);\\\ncolor: white;\\\n}\\\n.ace-chrome .ace_fold {\\\n}\\\n.ace-chrome .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-chrome .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_support.ace_type,\\\n.ace-chrome .ace_support.ace_class\\\n.ace-chrome .ace_support.ace_other {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-chrome .ace_variable.ace_parameter {\\\nfont-style:italic;\\\ncolor:#FD971F;\\\n}\\\n.ace-chrome .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-chrome .ace_comment {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc.ace_tag {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-chrome .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-chrome .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-chrome .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-chrome .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-chrome .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-chrome .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-chrome .ace_storage,\\\n.ace-chrome .ace_keyword,\\\n.ace-chrome .ace_meta.ace_tag {\\\ncolor: rgb(147, 15, 128);\\\n}\\\n.ace-chrome .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-chrome .ace_string {\\\ncolor: #1A1AA6;\\\n}\\\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #994409;\\\n}\\\n.ace-chrome .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n","/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\nace.define('ace/theme/github', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-github\";\nexports.cssText = \"/* CSS style content from github's default pygments highlighter template.\\\nCursor and selection styles from textmate.css. */\\\n.ace-github .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #AAA;\\\n}\\\n.ace-github {\\\nbackground: #fff;\\\ncolor: #000;\\\n}\\\n.ace-github .ace_keyword {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_string {\\\ncolor: #D14;\\\n}\\\n.ace-github .ace_variable.ace_class {\\\ncolor: teal;\\\n}\\\n.ace-github .ace_constant.ace_numeric {\\\ncolor: #099;\\\n}\\\n.ace-github .ace_constant.ace_buildin {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_support.ace_function {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_comment {\\\ncolor: #998;\\\nfont-style: italic;\\\n}\\\n.ace-github .ace_variable.ace_language {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_paren {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_boolean {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_string.ace_regexp {\\\ncolor: #009926;\\\nfont-weight: normal;\\\n}\\\n.ace-github .ace_variable.ace_instance {\\\ncolor: teal;\\\n}\\\n.ace-github .ace_constant.ace_language {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-github .ace_marker-layer .ace_active-line {\\\nbackground: rgb(255, 255, 204);\\\n}\\\n.ace-github .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-github.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n/* bold keywords cause cursor issues for some fonts */\\\n/* this disables bold style for editor and keeps for static highlighter */\\\n.ace-github.ace_nobold .ace_line > span {\\\nfont-weight: normal !important;\\\n}\\\n.ace-github .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-github .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-github .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-github .ace_gutter-active-line {\\\nbackground-color : rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-github .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-github .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-github .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\n var dom = require(\"../lib/dom\");\n dom.importCssString(exports.cssText, exports.cssClass);\n});\n","/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\nace.define('ace/theme/monokai', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-monokai\";\nexports.cssText = \".ace-monokai .ace_gutter {\\\nbackground: #2F3129;\\\ncolor: #8F908A\\\n}\\\n.ace-monokai .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #555651\\\n}\\\n.ace-monokai {\\\nbackground-color: #272822;\\\ncolor: #F8F8F2\\\n}\\\n.ace-monokai .ace_cursor {\\\ncolor: #F8F8F0\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selection {\\\nbackground: #49483E\\\n}\\\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #272822;\\\nborder-radius: 2px\\\n}\\\n.ace-monokai .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-monokai .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_marker-layer .ace_active-line {\\\nbackground: #202020\\\n}\\\n.ace-monokai .ace_gutter-active-line {\\\nbackground-color: #272727\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_invisible {\\\ncolor: #52524d\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_tag,\\\n.ace-monokai .ace_keyword,\\\n.ace-monokai .ace_meta.ace_tag,\\\n.ace-monokai .ace_storage {\\\ncolor: #F92672\\\n}\\\n.ace-monokai .ace_punctuation,\\\n.ace-monokai .ace_punctuation.ace_tag {\\\ncolor: #fff\\\n}\\\n.ace-monokai .ace_constant.ace_character,\\\n.ace-monokai .ace_constant.ace_language,\\\n.ace-monokai .ace_constant.ace_numeric,\\\n.ace-monokai .ace_constant.ace_other {\\\ncolor: #AE81FF\\\n}\\\n.ace-monokai .ace_invalid {\\\ncolor: #F8F8F0;\\\nbackground-color: #F92672\\\n}\\\n.ace-monokai .ace_invalid.ace_deprecated {\\\ncolor: #F8F8F0;\\\nbackground-color: #AE81FF\\\n}\\\n.ace-monokai .ace_support.ace_constant,\\\n.ace-monokai .ace_support.ace_function {\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_fold {\\\nbackground-color: #A6E22E;\\\nborder-color: #F8F8F2\\\n}\\\n.ace-monokai .ace_storage.ace_type,\\\n.ace-monokai .ace_support.ace_class,\\\n.ace-monokai .ace_support.ace_type {\\\nfont-style: italic;\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_function,\\\n.ace-monokai .ace_entity.ace_other,\\\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\\\n.ace-monokai .ace_variable {\\\ncolor: #A6E22E\\\n}\\\n.ace-monokai .ace_variable.ace_parameter {\\\nfont-style: italic;\\\ncolor: #FD971F\\\n}\\\n.ace-monokai .ace_string {\\\ncolor: #E6DB74\\\n}\\\n.ace-monokai .ace_comment {\\\ncolor: #75715E\\\n}\\\n.ace-monokai .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"]}