All Downloads are FREE. Search and download functionalities are using the official Maven repository.

web-interface.assets.6e61897c-67.472622149827c1587209.js.map Maven / Gradle / Ivy

There is a newer version: 6.0.2
Show newest version
{"version":3,"sources":["webpack:///./node_modules/ace-builds/src-noconflict/ext-language_tools.js","webpack:///./node_modules/ace-builds/src-noconflict/mode-lucene.js"],"names":["ace","oop","require","EventEmitter","lang","Range","RangeList","HashHandler","Tokenizer","clipboard","VARIABLES","CURRENT_WORD","editor","session","getTextRange","getWordRange","SELECTION","name","indentation","text","replace","CURRENT_LINE","getLine","getCursorPosition","row","PREV_LINE","LINE_INDEX","LINE_NUMBER","SOFT_TABS","getUseSoftTabs","TAB_SIZE","getTabSize","CLIPBOARD","getText","FILENAME","exec","this","FILEPATH","FILENAME_BASE","DIRECTORY","WORKSPACE_NAME","FULLNAME","BLOCK_COMMENT_START","mode","$mode","blockComment","start","BLOCK_COMMENT_END","end","LINE_COMMENT","lineCommentStart","CURRENT_YEAR","date","bind","year","CURRENT_YEAR_SHORT","CURRENT_MONTH","month","CURRENT_MONTH_NAME","CURRENT_MONTH_NAME_SHORT","CURRENT_DATE","day","CURRENT_DAY_NAME","weekday","CURRENT_DAY_NAME_SHORT","CURRENT_HOUR","hour","hour12","CURRENT_MINUTE","minute","CURRENT_SECOND","second","dateFormat","str","Date","toLocaleString","length","SELECTED_TEXT","SnippetManager","snippetMap","snippetNameMap","implement","getTokenizer","$tokenizer","createTokenizer","TabstopToken","substr","test","tabstopId","parseInt","escape","ch","formatMatcher","regex","onMatch","val","state","stack","ts","fmtString","guard","slice","flag","next","indexOf","shift","t","unshift","token","merge","snippetVar","choices","operator","split","map","value","formatString","expectElse","ifEnd","elseEnd","changeCase","local","formatStringVar","formatFunction","tokenizeTmSnippet","startState","getLineTokens","tokens","x","getVariableValue","variables","__","hasOwnProperty","tmStrFormat","fmt","re","RegExp","fmtTokens","_self","oldArgs","call","arguments","fmtParts","resolveVariables","gChangeCase","i","toUpperCase","toLowerCase","join","tmFormatFunction","snippet","result","afterNewLine","j","push","gotoNext","i1","insertSnippetForSelection","snippetText","cursor","line","tabString","getTabString","indentString","match","column","tabstops","forEach","p","id","index","parents","some","expanding","copyValue","copy","lastIndexOf","Object","keys","parentId","splice","apply","Math","max","concat","lines","range","getSelectionRange","tabstopManager","TabstopManager","selectionId","inVirtualSelectionMode","selection","addTabstops","insertSnippet","self","forEachSelection","keepOrder","tabNext","$getScope","scope","$id","pop","inlinePhp","c","getState","substring","getActiveScopes","scopes","includeScopes","expandWithTab","options","expandSnippetForSelection","before","after","snippets","findMatchingSnippet","dryRun","doc","removeInLine","replaceBefore","replaceAfter","M__","matchBefore","T__","matchAfter","content","snippetList","s","startRe","endRe","triggerRe","endTriggerRe","register","wrapRegexp","src","guardedRegexp","opening","addSnippet","old","unregister","prefix","tabTrigger","body","Array","isArray","trigger","escapeRegExp","endTrigger","endGuard","key","_signal","removeSnippet","nameMap","parseSnippetFile","m","list","JSON","parse","e","guardRe","getSnippetByName","prototype","$onChange","onChange","$onChangeSelection","delayedCall","onChangeSelection","schedule","$onChangeSession","onChangeSession","$onAfterExec","onAfterExec","attach","ranges","$openTabstops","selectedTabstop","on","commands","keyBinding","addKeyboardHandler","keyboardHandler","detach","removeTabstopMarkers","removeListener","removeKeyboardHandler","delta","isRemove","action","active","rangeList","$bias","parentActive","startIndex","pointIndex","endIndex","toRemove","removeRange","$inChange","getLength","getValue","updateLinkedFields","hasLinkedRanges","firstNonLinked","linked","original","exports","snippetManager","command","readOnly","lead","anchor","isEmpty","containsLead","contains","containsAnchor","dir","min","selectTabstop","addTabstopMarkers","fromOrientedRange","sel","multiSelect","toSingleRange","addRange","clone","execCommand","matches","useLink","getOption","fromPoints","moveRelative","arg","dest","movePoint","tabstop","addList","markerId","addMarker","removeMarker","bindKeys","renderer","scrollCursorIntoView","point","diff","importCssString","Editor","expandSnippet","define","module","Renderer","VirtualRenderer","event","dom","$singleLineEditor","el","$maxLines","setHighlightActiveLine","setShowPrintMargin","setShowGutter","setHighlightGutterLine","$mouseHandler","$focusTimeout","$highlightTagPending","AcePopup","parentNode","createElement","popup","appendChild","style","display","setStyle","setOption","lastMouseEvent","noop","focus","$isFocused","$cursorLayer","restartTimer","element","opacity","$keepTextAreaAtCursor","highlight","$searchHighlight","clazz","pos","getDocumentPosition","moveToPosition","selectionMarker","stop","hoverMarker","Infinity","setSelectOnHover","y","scrollTop","setRow","setHoverMarker","$pos","getRow","$textLayer","selected","childNodes","config","firstRow","selectedNode","removeCssClass","addCssClass","hideHoverMarker","suppressRedraw","_emit","getHoveredRow","addListener","container","data","bgTokenizer","$tokenizeRow","caption","addToken","className","type","lower","filterText","lastIndex","lastI","matchMask","sub","meta","message","$updateOnChange","$computeWidth","screenWidth","isOpen","isTopdown","autoSelect","setData","setValue","stringRepeat","getData","clearSelection","moveCursorTo","hide","show","lineHeight","topdownOnly","screenHeight","window","innerHeight","innerWidth","maxH","top","$borderSize","$maxPixelHeight","bottom","left","offsetWidth","goTo","where","getTextLeftOffset","$padding","$imageSize","parForEach","array","fn","callback","completed","arLength","err","ID_REGEX","retrievePrecedingIdentifier","buf","reverse","retrieveFollowingIdentifier","getCompletionPrefix","completers","completer","identifierRegexps","identifierRegex","util","Autocomplete","autoInsert","exactMatch","gatherCompletionsId","blurListener","changeListener","mousedownListener","mousewheelListener","changeTimer","updateCompletions","tooltipTimer","updateDocTooltip","$init","document","documentElement","insertMatch","getPopup","openPopup","keepPopupPosition","completions","filtered","setTheme","getTheme","setFontSize","getFontSize","layerConfig","getPixelPosition","base","rect","getBoundingClientRect","offset","scrollLeft","gutterWidth","cancel","off","hideDocTooltip","activated","activeElement","textInput","getElement","fromTooltip","relatedTarget","tooltipNode","startOperation","getAllRanges","remove","endOperation","deleteSuffix","gotoPageUp","gotoPageDown","gatherCompletions","getSession","createAnchor","$insertRight","total","getCompletions","results","finished","showPopup","setFilter","FilteredList","_id","detachIfFinished","cancelContextMenu","all","getDocTooltip","docText","docHTML","showDocTooltip","item","margin","pointerEvents","tabIndex","onblur","onclick","onTooltipClick","innerHTML","textContent","right","offsetTop","offsetHeight","isFocused","removeChild","a","target","nodeName","href","rel","destroy","for","get","$shared","$sharedInstance","once","startCommand","bindKey","filterCompletions","sort","b","$score","localeCompare","prev","filter","items","needle","upper","loop","distance","penalty","fullMatchIndex","i2","score","splitRegex","wordDistance","prefixPos","getWordIndex","words","wordScores","create","currentWord","word","idx","abs","wordScore","textCompleter","keyWordCompleter","snippetCompleter","getTokenAt","escapeHTML","setCompleters","addCompleter","onChangeMode","loadSnippetsForMode","$modes","files","loadSnippetFile","snippetFileId","modes","snippetFilePath","loadModule","doLiveAutocomplete","hasCompleter","defineOptions","enableBasicAutocompletion","set","addCommand","removeCommand","enableLiveAutocompletion","enableSnippets","TextHighlightRules","LuceneHighlightRules","$rules","defaultToken","inherits","TextMode","Mode","HighlightRules","$behaviour","$defaultBehaviour"],"mappings":"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","file":"6e61897c-67.472622149827c1587209.js","sourcesContent":["ace.define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/range_list\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/clipboard\",\"ace/lib/dom\",\"ace/editor\"], function(require, exports, module) {\n\"use strict\";\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar lang = require(\"./lib/lang\");\nvar Range = require(\"./range\").Range;\nvar RangeList = require(\"./range_list\").RangeList;\nvar HashHandler = require(\"./keyboard/hash_handler\").HashHandler;\nvar Tokenizer = require(\"./tokenizer\").Tokenizer;\nvar clipboard = require(\"./clipboard\");\n\nvar VARIABLES = {\n    CURRENT_WORD: function(editor) {\n        return editor.session.getTextRange(editor.session.getWordRange());\n    },\n    SELECTION: function(editor, name, indentation) {\n        var text = editor.session.getTextRange();\n        if (indentation)\n            return text.replace(/\\n\\r?([ \\t]*\\S)/g, \"\\n\" + indentation + \"$1\");\n        return text;\n    },\n    CURRENT_LINE: function(editor) {\n        return editor.session.getLine(editor.getCursorPosition().row);\n    },\n    PREV_LINE: function(editor) {\n        return editor.session.getLine(editor.getCursorPosition().row - 1);\n    },\n    LINE_INDEX: function(editor) {\n        return editor.getCursorPosition().row;\n    },\n    LINE_NUMBER: function(editor) {\n        return editor.getCursorPosition().row + 1;\n    },\n    SOFT_TABS: function(editor) {\n        return editor.session.getUseSoftTabs() ? \"YES\" : \"NO\";\n    },\n    TAB_SIZE: function(editor) {\n        return editor.session.getTabSize();\n    },\n    CLIPBOARD: function(editor) {\n        return clipboard.getText && clipboard.getText();\n    },\n    FILENAME: function(editor) {\n        return /[^/\\\\]*$/.exec(this.FILEPATH(editor))[0];\n    },\n    FILENAME_BASE: function(editor) {\n        return /[^/\\\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\\.[^.]*$/, \"\");\n    },\n    DIRECTORY: function(editor) {\n        return this.FILEPATH(editor).replace(/[^/\\\\]*$/, \"\");\n    },\n    FILEPATH: function(editor) { return \"/not implemented.txt\"; },\n    WORKSPACE_NAME: function() { return \"Unknown\"; },\n    FULLNAME: function() { return \"Unknown\"; },\n    BLOCK_COMMENT_START: function(editor) {\n        var mode = editor.session.$mode || {};\n        return mode.blockComment && mode.blockComment.start || \"\";\n    },\n    BLOCK_COMMENT_END: function(editor) {\n        var mode = editor.session.$mode || {};\n        return mode.blockComment && mode.blockComment.end || \"\";\n    },\n    LINE_COMMENT: function(editor) {\n        var mode = editor.session.$mode || {};\n        return mode.lineCommentStart || \"\";\n    },\n    CURRENT_YEAR: date.bind(null, {year: \"numeric\"}),\n    CURRENT_YEAR_SHORT: date.bind(null, {year: \"2-digit\"}),\n    CURRENT_MONTH: date.bind(null, {month: \"numeric\"}),\n    CURRENT_MONTH_NAME: date.bind(null, {month: \"long\"}),\n    CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: \"short\"}),\n    CURRENT_DATE: date.bind(null, {day: \"2-digit\"}),\n    CURRENT_DAY_NAME: date.bind(null, {weekday: \"long\"}),\n    CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: \"short\"}),\n    CURRENT_HOUR: date.bind(null, {hour: \"2-digit\", hour12: false}),\n    CURRENT_MINUTE: date.bind(null, {minute: \"2-digit\"}),\n    CURRENT_SECOND: date.bind(null, {second: \"2-digit\"})\n};\n\nVARIABLES.SELECTED_TEXT = VARIABLES.SELECTION;\n\nfunction date(dateFormat) {\n    var str = new Date().toLocaleString(\"en-us\", dateFormat);\n    return str.length == 1 ? \"0\" + str : str;\n}\n\nvar SnippetManager = function() {\n    this.snippetMap = {};\n    this.snippetNameMap = {};\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n    \n    this.getTokenizer = function() {\n        return SnippetManager.$tokenizer || this.createTokenizer();\n    };\n    \n    this.createTokenizer = function() {\n        function TabstopToken(str) {\n            str = str.substr(1);\n            if (/^\\d+$/.test(str))\n                return [{tabstopId: parseInt(str, 10)}];\n            return [{text: str}];\n        }\n        function escape(ch) {\n            return \"(?:[^\\\\\\\\\" + ch + \"]|\\\\\\\\.)\";\n        }\n        var formatMatcher = {\n            regex: \"/(\" + escape(\"/\") + \"+)/\", \n            onMatch: function(val, state, stack) {\n                var ts = stack[0];\n                ts.fmtString = true;\n                ts.guard = val.slice(1, -1);\n                ts.flag = \"\";\n                return \"\";\n            },\n            next: \"formatString\"\n        };\n        \n        SnippetManager.$tokenizer = new Tokenizer({\n            start: [\n                {regex: /\\\\./, onMatch: function(val, state, stack) {\n                    var ch = val[1];\n                    if (ch == \"}\" && stack.length) {\n                        val = ch;\n                    } else if (\"`$\\\\\".indexOf(ch) != -1) {\n                        val = ch;\n                    }\n                    return [val];\n                }},\n                {regex: /}/, onMatch: function(val, state, stack) {\n                    return [stack.length ? stack.shift() : val];\n                }},\n                {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n                {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n                    var t = TabstopToken(str.substr(1));\n                    stack.unshift(t[0]);\n                    return t;\n                }, next: \"snippetVar\"},\n                {regex: /\\n/, token: \"newline\", merge: false}\n            ],\n            snippetVar: [\n                {regex: \"\\\\|\" + escape(\"\\\\|\") + \"*\\\\|\", onMatch: function(val, state, stack) {\n                    var choices = val.slice(1, -1).replace(/\\\\[,|\\\\]|,/g, function(operator) {\n                        return operator.length == 2 ? operator[1] : \"\\x00\";\n                    }).split(\"\\x00\").map(function(value){\n                        return {value: value};\n                    });\n                    stack[0].choices = choices;\n                    return [choices[0]];\n                }, next: \"start\"},\n                formatMatcher,\n                {regex: \"([^:}\\\\\\\\]|\\\\\\\\.)*:?\", token: \"\", next: \"start\"}\n            ],\n            formatString: [\n                {regex: /:/, onMatch: function(val, state, stack) {\n                    if (stack.length && stack[0].expectElse) {\n                        stack[0].expectElse = false;\n                        stack[0].ifEnd = {elseEnd: stack[0]};\n                        return [stack[0].ifEnd];\n                    }\n                    return \":\";\n                }},\n                {regex: /\\\\./, onMatch: function(val, state, stack) {\n                    var ch = val[1];\n                    if (ch == \"}\" && stack.length)\n                        val = ch;\n                    else if (\"`$\\\\\".indexOf(ch) != -1)\n                        val = ch;\n                    else if (ch == \"n\")\n                        val = \"\\n\";\n                    else if (ch == \"t\")\n                        val = \"\\t\";\n                    else if (\"ulULE\".indexOf(ch) != -1)\n                        val = {changeCase: ch, local: ch > \"a\"};\n                    return [val];\n                }},\n                {regex: \"/\\\\w*}\", onMatch: function(val, state, stack) {\n                    var next = stack.shift();\n                    if (next)\n                        next.flag = val.slice(1, -1);\n                    this.next = next && next.tabstopId ? \"start\" : \"\";\n                    return [next || val];\n                }, next: \"start\"},\n                {regex: /\\$(?:\\d+|\\w+)/, onMatch: function(val, state, stack) {\n                    return [{text: val.slice(1)}];\n                }},\n                {regex: /\\${\\w+/, onMatch: function(val, state, stack) {\n                    var token = {text: val.slice(2)};\n                    stack.unshift(token);\n                    return [token];\n                }, next: \"formatStringVar\"},\n                {regex: /\\n/, token: \"newline\", merge: false},\n                {regex: /}/, onMatch: function(val, state, stack) {\n                    var next = stack.shift();\n                    this.next = next && next.tabstopId ? \"start\" : \"\";\n                    return [next || val];\n                }, next: \"start\"}\n            ],\n            formatStringVar: [\n                {regex: /:\\/\\w+}/, onMatch: function(val, state, stack) {\n                    var ts = stack[0];\n                    ts.formatFunction = val.slice(2, -1);\n                    return [stack.shift()];\n                }, next: \"formatString\"},\n                formatMatcher,\n                {regex: /:[\\?\\-+]?/, onMatch: function(val, state, stack) {\n                    if (val[1] == \"+\")\n                        stack[0].ifEnd = stack[0];\n                    if (val[1] == \"?\")\n                        stack[0].expectElse = true;\n                }, next: \"formatString\"},\n                {regex: \"([^:}\\\\\\\\]|\\\\\\\\.)*:?\", token: \"\", next: \"formatString\"}\n            ]\n        });\n        return SnippetManager.$tokenizer;\n    };\n\n    this.tokenizeTmSnippet = function(str, startState) {\n        return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n            return x.value || x;\n        });\n    };\n    \n    this.getVariableValue = function(editor, name, indentation) {\n        if (/^\\d+$/.test(name))\n            return (this.variables.__ || {})[name] || \"\";\n        if (/^[A-Z]\\d+$/.test(name))\n            return (this.variables[name[0] + \"__\"] || {})[name.substr(1)] || \"\";\n        \n        name = name.replace(/^TM_/, \"\");\n        if (!this.variables.hasOwnProperty(name))\n            return \"\";\n        var value = this.variables[name];\n        if (typeof value == \"function\")\n            value = this.variables[name](editor, name, indentation);\n        return value == null ? \"\" : value;\n    };\n    \n    this.variables = VARIABLES;\n    this.tmStrFormat = function(str, ch, editor) {\n        if (!ch.fmt) return str;\n        var flag = ch.flag || \"\";\n        var re = ch.guard;\n        re = new RegExp(re, flag.replace(/[^gim]/g, \"\"));\n        var fmtTokens = typeof ch.fmt == \"string\" ? this.tokenizeTmSnippet(ch.fmt, \"formatString\") : ch.fmt;\n        var _self = this;\n        var formatted = str.replace(re, function() {\n            var oldArgs = _self.variables.__;\n            _self.variables.__ = [].slice.call(arguments);\n            var fmtParts = _self.resolveVariables(fmtTokens, editor);\n            var gChangeCase = \"E\";\n            for (var i  = 0; i < fmtParts.length; i++) {\n                var ch = fmtParts[i];\n                if (typeof ch == \"object\") {\n                    fmtParts[i] = \"\";\n                    if (ch.changeCase && ch.local) {\n                        var next = fmtParts[i + 1];\n                        if (next && typeof next == \"string\") {\n                            if (ch.changeCase == \"u\")\n                                fmtParts[i] = next[0].toUpperCase();\n                            else\n                                fmtParts[i] = next[0].toLowerCase();\n                            fmtParts[i + 1] = next.substr(1);\n                        }\n                    } else if (ch.changeCase) {\n                        gChangeCase = ch.changeCase;\n                    }\n                } else if (gChangeCase == \"U\") {\n                    fmtParts[i] = ch.toUpperCase();\n                } else if (gChangeCase == \"L\") {\n                    fmtParts[i] = ch.toLowerCase();\n                }\n            }\n            _self.variables.__ = oldArgs;\n            return fmtParts.join(\"\");\n        });\n        return formatted;\n    };\n    \n    this.tmFormatFunction = function(str, ch, editor) {\n        if (ch.formatFunction == \"upcase\")\n            return str.toUpperCase();\n        if (ch.formatFunction == \"downcase\")\n            return str.toLowerCase();\n        return str;\n    };\n\n    this.resolveVariables = function(snippet, editor) {\n        var result = [];\n        var indentation = \"\";\n        var afterNewLine = true;\n        for (var i = 0; i < snippet.length; i++) {\n            var ch = snippet[i];\n            if (typeof ch == \"string\") {\n                result.push(ch);\n                if (ch == \"\\n\") {\n                    afterNewLine = true;\n                    indentation = \"\";\n                }\n                else if (afterNewLine) {\n                    indentation = /^\\t*/.exec(ch)[0];\n                    afterNewLine = /\\S/.test(ch);\n                }\n                continue;\n            }\n            if (!ch)  continue;\n            afterNewLine = false;\n            \n            if (ch.fmtString) {\n                var j = snippet.indexOf(ch, i + 1);\n                if (j == -1) j = snippet.length;\n                ch.fmt = snippet.slice(i + 1, j);\n                i = j;\n            }\n            \n            if (ch.text) {\n                var value = this.getVariableValue(editor, ch.text, indentation) + \"\";\n                if (ch.fmtString)\n                    value = this.tmStrFormat(value, ch, editor);\n                if (ch.formatFunction)\n                    value = this.tmFormatFunction(value, ch, editor);\n                \n                if (value && !ch.ifEnd) {\n                    result.push(value);\n                    gotoNext(ch);\n                } else if (!value && ch.ifEnd) {\n                    gotoNext(ch.ifEnd);\n                }\n            } else if (ch.elseEnd) {\n                gotoNext(ch.elseEnd);\n            } else if (ch.tabstopId != null) {\n                result.push(ch);\n            } else if (ch.changeCase != null) {\n                result.push(ch);\n            }\n        }\n        function gotoNext(ch) {\n            var i1 = snippet.indexOf(ch, i + 1);\n            if (i1 != -1)\n                i = i1;\n        }\n        return result;\n    };\n\n    this.insertSnippetForSelection = function(editor, snippetText) {\n        var cursor = editor.getCursorPosition();\n        var line = editor.session.getLine(cursor.row);\n        var tabString = editor.session.getTabString();\n        var indentString = line.match(/^\\s*/)[0];\n        \n        if (cursor.column < indentString.length)\n            indentString = indentString.slice(0, cursor.column);\n\n        snippetText = snippetText.replace(/\\r/g, \"\");\n        var tokens = this.tokenizeTmSnippet(snippetText);\n        tokens = this.resolveVariables(tokens, editor);\n        tokens = tokens.map(function(x) {\n            if (x == \"\\n\")\n                return x + indentString;\n            if (typeof x == \"string\")\n                return x.replace(/\\t/g, tabString);\n            return x;\n        });\n        var tabstops = [];\n        tokens.forEach(function(p, i) {\n            if (typeof p != \"object\")\n                return;\n            var id = p.tabstopId;\n            var ts = tabstops[id];\n            if (!ts) {\n                ts = tabstops[id] = [];\n                ts.index = id;\n                ts.value = \"\";\n                ts.parents = {};\n            }\n            if (ts.indexOf(p) !== -1)\n                return;\n            if (p.choices && !ts.choices)\n                ts.choices = p.choices;\n            ts.push(p);\n            var i1 = tokens.indexOf(p, i + 1);\n            if (i1 === -1)\n                return;\n\n            var value = tokens.slice(i + 1, i1);\n            var isNested = value.some(function(t) {return typeof t === \"object\";});\n            if (isNested && !ts.value) {\n                ts.value = value;\n            } else if (value.length && (!ts.value || typeof ts.value !== \"string\")) {\n                ts.value = value.join(\"\");\n            }\n        });\n        tabstops.forEach(function(ts) {ts.length = 0;});\n        var expanding = {};\n        function copyValue(val) {\n            var copy = [];\n            for (var i = 0; i < val.length; i++) {\n                var p = val[i];\n                if (typeof p == \"object\") {\n                    if (expanding[p.tabstopId])\n                        continue;\n                    var j = val.lastIndexOf(p, i - 1);\n                    p = copy[j] || {tabstopId: p.tabstopId};\n                }\n                copy[i] = p;\n            }\n            return copy;\n        }\n        for (var i = 0; i < tokens.length; i++) {\n            var p = tokens[i];\n            if (typeof p != \"object\")\n                continue;\n            var id = p.tabstopId;\n            var ts = tabstops[id];\n            var i1 = tokens.indexOf(p, i + 1);\n            if (expanding[id]) {\n                if (expanding[id] === p) {\n                    delete expanding[id];\n                    Object.keys(expanding).forEach(function(parentId) {\n                        ts.parents[parentId] = true;\n                    });\n                }\n                continue;\n            }\n            expanding[id] = p;\n            var value = ts.value;\n            if (typeof value !== \"string\")\n                value = copyValue(value);\n            else if (p.fmt)\n                value = this.tmStrFormat(value, p, editor);\n            tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p));\n\n            if (ts.indexOf(p) === -1)\n                ts.push(p);\n        }\n        var row = 0, column = 0;\n        var text = \"\";\n        tokens.forEach(function(t) {\n            if (typeof t === \"string\") {\n                var lines = t.split(\"\\n\");\n                if (lines.length > 1){\n                    column = lines[lines.length - 1].length;\n                    row += lines.length - 1;\n                } else\n                    column += t.length;\n                text += t;\n            } else if (t) {\n                if (!t.start)\n                    t.start = {row: row, column: column};\n                else\n                    t.end = {row: row, column: column};\n            }\n        });\n        var range = editor.getSelectionRange();\n        var end = editor.session.replace(range, text);\n\n        var tabstopManager = new TabstopManager(editor);\n        var selectionId = editor.inVirtualSelectionMode && editor.selection.index;\n        tabstopManager.addTabstops(tabstops, range.start, end, selectionId);\n    };\n    \n    this.insertSnippet = function(editor, snippetText) {\n        var self = this;\n        if (editor.inVirtualSelectionMode)\n            return self.insertSnippetForSelection(editor, snippetText);\n        \n        editor.forEachSelection(function() {\n            self.insertSnippetForSelection(editor, snippetText);\n        }, null, {keepOrder: true});\n        \n        if (editor.tabstopManager)\n            editor.tabstopManager.tabNext();\n    };\n\n    this.$getScope = function(editor) {\n        var scope = editor.session.$mode.$id || \"\";\n        scope = scope.split(\"/\").pop();\n        if (scope === \"html\" || scope === \"php\") {\n            if (scope === \"php\" && !editor.session.$mode.inlinePhp) \n                scope = \"html\";\n            var c = editor.getCursorPosition();\n            var state = editor.session.getState(c.row);\n            if (typeof state === \"object\") {\n                state = state[0];\n            }\n            if (state.substring) {\n                if (state.substring(0, 3) == \"js-\")\n                    scope = \"javascript\";\n                else if (state.substring(0, 4) == \"css-\")\n                    scope = \"css\";\n                else if (state.substring(0, 4) == \"php-\")\n                    scope = \"php\";\n            }\n        }\n        \n        return scope;\n    };\n\n    this.getActiveScopes = function(editor) {\n        var scope = this.$getScope(editor);\n        var scopes = [scope];\n        var snippetMap = this.snippetMap;\n        if (snippetMap[scope] && snippetMap[scope].includeScopes) {\n            scopes.push.apply(scopes, snippetMap[scope].includeScopes);\n        }\n        scopes.push(\"_\");\n        return scopes;\n    };\n\n    this.expandWithTab = function(editor, options) {\n        var self = this;\n        var result = editor.forEachSelection(function() {\n            return self.expandSnippetForSelection(editor, options);\n        }, null, {keepOrder: true});\n        if (result && editor.tabstopManager)\n            editor.tabstopManager.tabNext();\n        return result;\n    };\n    \n    this.expandSnippetForSelection = function(editor, options) {\n        var cursor = editor.getCursorPosition();\n        var line = editor.session.getLine(cursor.row);\n        var before = line.substring(0, cursor.column);\n        var after = line.substr(cursor.column);\n\n        var snippetMap = this.snippetMap;\n        var snippet;\n        this.getActiveScopes(editor).some(function(scope) {\n            var snippets = snippetMap[scope];\n            if (snippets)\n                snippet = this.findMatchingSnippet(snippets, before, after);\n            return !!snippet;\n        }, this);\n        if (!snippet)\n            return false;\n        if (options && options.dryRun)\n            return true;\n        editor.session.doc.removeInLine(cursor.row,\n            cursor.column - snippet.replaceBefore.length,\n            cursor.column + snippet.replaceAfter.length\n        );\n\n        this.variables.M__ = snippet.matchBefore;\n        this.variables.T__ = snippet.matchAfter;\n        this.insertSnippetForSelection(editor, snippet.content);\n\n        this.variables.M__ = this.variables.T__ = null;\n        return true;\n    };\n\n    this.findMatchingSnippet = function(snippetList, before, after) {\n        for (var i = snippetList.length; i--;) {\n            var s = snippetList[i];\n            if (s.startRe && !s.startRe.test(before))\n                continue;\n            if (s.endRe && !s.endRe.test(after))\n                continue;\n            if (!s.startRe && !s.endRe)\n                continue;\n\n            s.matchBefore = s.startRe ? s.startRe.exec(before) : [\"\"];\n            s.matchAfter = s.endRe ? s.endRe.exec(after) : [\"\"];\n            s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : \"\";\n            s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : \"\";\n            return s;\n        }\n    };\n\n    this.snippetMap = {};\n    this.snippetNameMap = {};\n    this.register = function(snippets, scope) {\n        var snippetMap = this.snippetMap;\n        var snippetNameMap = this.snippetNameMap;\n        var self = this;\n        \n        if (!snippets) \n            snippets = [];\n        \n        function wrapRegexp(src) {\n            if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n                src = \"(?:\" + src + \")\";\n\n            return src || \"\";\n        }\n        function guardedRegexp(re, guard, opening) {\n            re = wrapRegexp(re);\n            guard = wrapRegexp(guard);\n            if (opening) {\n                re = guard + re;\n                if (re && re[re.length - 1] != \"$\")\n                    re = re + \"$\";\n            } else {\n                re = re + guard;\n                if (re && re[0] != \"^\")\n                    re = \"^\" + re;\n            }\n            return new RegExp(re);\n        }\n\n        function addSnippet(s) {\n            if (!s.scope)\n                s.scope = scope || \"_\";\n            scope = s.scope;\n            if (!snippetMap[scope]) {\n                snippetMap[scope] = [];\n                snippetNameMap[scope] = {};\n            }\n\n            var map = snippetNameMap[scope];\n            if (s.name) {\n                var old = map[s.name];\n                if (old)\n                    self.unregister(old);\n                map[s.name] = s;\n            }\n            snippetMap[scope].push(s);\n\n            if (s.prefix)\n                s.tabTrigger = s.prefix;\n\n            if (!s.content && s.body)\n                s.content = Array.isArray(s.body) ? s.body.join(\"\\n\") : s.body;\n\n            if (s.tabTrigger && !s.trigger) {\n                if (!s.guard && /^\\w/.test(s.tabTrigger))\n                    s.guard = \"\\\\b\";\n                s.trigger = lang.escapeRegExp(s.tabTrigger);\n            }\n            \n            if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard)\n                return;\n            \n            s.startRe = guardedRegexp(s.trigger, s.guard, true);\n            s.triggerRe = new RegExp(s.trigger);\n\n            s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n            s.endTriggerRe = new RegExp(s.endTrigger);\n        }\n\n        if (Array.isArray(snippets)) {\n            snippets.forEach(addSnippet);\n        } else {\n            Object.keys(snippets).forEach(function(key) {\n                addSnippet(snippets[key]);\n            });\n        }\n        \n        this._signal(\"registerSnippets\", {scope: scope});\n    };\n    this.unregister = function(snippets, scope) {\n        var snippetMap = this.snippetMap;\n        var snippetNameMap = this.snippetNameMap;\n\n        function removeSnippet(s) {\n            var nameMap = snippetNameMap[s.scope||scope];\n            if (nameMap && nameMap[s.name]) {\n                delete nameMap[s.name];\n                var map = snippetMap[s.scope||scope];\n                var i = map && map.indexOf(s);\n                if (i >= 0)\n                    map.splice(i, 1);\n            }\n        }\n        if (snippets.content)\n            removeSnippet(snippets);\n        else if (Array.isArray(snippets))\n            snippets.forEach(removeSnippet);\n    };\n    this.parseSnippetFile = function(str) {\n        str = str.replace(/\\r/g, \"\");\n        var list = [], snippet = {};\n        var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n        var m;\n        while (m = re.exec(str)) {\n            if (m[1]) {\n                try {\n                    snippet = JSON.parse(m[1]);\n                    list.push(snippet);\n                } catch (e) {}\n            } if (m[4]) {\n                snippet.content = m[4].replace(/^\\t/gm, \"\");\n                list.push(snippet);\n                snippet = {};\n            } else {\n                var key = m[2], val = m[3];\n                if (key == \"regex\") {\n                    var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n                    snippet.guard = guardRe.exec(val)[1];\n                    snippet.trigger = guardRe.exec(val)[1];\n                    snippet.endTrigger = guardRe.exec(val)[1];\n                    snippet.endGuard = guardRe.exec(val)[1];\n                } else if (key == \"snippet\") {\n                    snippet.tabTrigger = val.match(/^\\S*/)[0];\n                    if (!snippet.name)\n                        snippet.name = val;\n                } else if (key) {\n                    snippet[key] = val;\n                }\n            }\n        }\n        return list;\n    };\n    this.getSnippetByName = function(name, editor) {\n        var snippetMap = this.snippetNameMap;\n        var snippet;\n        this.getActiveScopes(editor).some(function(scope) {\n            var snippets = snippetMap[scope];\n            if (snippets)\n                snippet = snippets[name];\n            return !!snippet;\n        }, this);\n        return snippet;\n    };\n\n}).call(SnippetManager.prototype);\n\n\nvar TabstopManager = function(editor) {\n    if (editor.tabstopManager)\n        return editor.tabstopManager;\n    editor.tabstopManager = this;\n    this.$onChange = this.onChange.bind(this);\n    this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n    this.$onChangeSession = this.onChangeSession.bind(this);\n    this.$onAfterExec = this.onAfterExec.bind(this);\n    this.attach(editor);\n};\n(function() {\n    this.attach = function(editor) {\n        this.index = 0;\n        this.ranges = [];\n        this.tabstops = [];\n        this.$openTabstops = null;\n        this.selectedTabstop = null;\n\n        this.editor = editor;\n        this.editor.on(\"change\", this.$onChange);\n        this.editor.on(\"changeSelection\", this.$onChangeSelection);\n        this.editor.on(\"changeSession\", this.$onChangeSession);\n        this.editor.commands.on(\"afterExec\", this.$onAfterExec);\n        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n    };\n    this.detach = function() {\n        this.tabstops.forEach(this.removeTabstopMarkers, this);\n        this.ranges = null;\n        this.tabstops = null;\n        this.selectedTabstop = null;\n        this.editor.removeListener(\"change\", this.$onChange);\n        this.editor.removeListener(\"changeSelection\", this.$onChangeSelection);\n        this.editor.removeListener(\"changeSession\", this.$onChangeSession);\n        this.editor.commands.removeListener(\"afterExec\", this.$onAfterExec);\n        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n        this.editor.tabstopManager = null;\n        this.editor = null;\n    };\n\n    this.onChange = function(delta) {\n        var isRemove = delta.action[0] == \"r\";\n        var selectedTabstop = this.selectedTabstop || {};\n        var parents = selectedTabstop.parents || {};\n        var tabstops = (this.tabstops || []).slice();\n        for (var i = 0; i < tabstops.length; i++) {\n            var ts = tabstops[i];\n            var active = ts == selectedTabstop || parents[ts.index];\n            ts.rangeList.$bias = active ? 0 : 1;\n            \n            if (delta.action == \"remove\" && ts !== selectedTabstop) {\n                var parentActive = ts.parents && ts.parents[selectedTabstop.index];\n                var startIndex = ts.rangeList.pointIndex(delta.start, parentActive);\n                startIndex = startIndex < 0 ? -startIndex - 1 : startIndex + 1;\n                var endIndex = ts.rangeList.pointIndex(delta.end, parentActive);\n                endIndex = endIndex < 0 ? -endIndex - 1 : endIndex - 1;\n                var toRemove = ts.rangeList.ranges.slice(startIndex, endIndex);\n                for (var j = 0; j < toRemove.length; j++)\n                    this.removeRange(toRemove[j]);\n            }\n            ts.rangeList.$onChange(delta);\n        }\n        var session = this.editor.session;\n        if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue())\n            this.detach();\n    };\n    this.updateLinkedFields = function() {\n        var ts = this.selectedTabstop;\n        if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked)\n            return;\n        this.$inChange = true;\n        var session = this.editor.session;\n        var text = session.getTextRange(ts.firstNonLinked);\n        for (var i = 0; i < ts.length; i++) {\n            var range = ts[i];\n            if (!range.linked)\n                continue;\n            var original = range.original;\n            var fmt = exports.snippetManager.tmStrFormat(text, original, this.editor);\n            session.replace(range, fmt);\n        }\n        this.$inChange = false;\n    };\n    this.onAfterExec = function(e) {\n        if (e.command && !e.command.readOnly)\n            this.updateLinkedFields();\n    };\n    this.onChangeSelection = function() {\n        if (!this.editor)\n            return;\n        var lead = this.editor.selection.lead;\n        var anchor = this.editor.selection.anchor;\n        var isEmpty = this.editor.selection.isEmpty();\n        for (var i = 0; i < this.ranges.length; i++) {\n            if (this.ranges[i].linked)\n                continue;\n            var containsLead = this.ranges[i].contains(lead.row, lead.column);\n            var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n            if (containsLead && containsAnchor)\n                return;\n        }\n        this.detach();\n    };\n    this.onChangeSession = function() {\n        this.detach();\n    };\n    this.tabNext = function(dir) {\n        var max = this.tabstops.length;\n        var index = this.index + (dir || 1);\n        index = Math.min(Math.max(index, 1), max);\n        if (index == max)\n            index = 0;\n        this.selectTabstop(index);\n        if (index === 0)\n            this.detach();\n    };\n    this.selectTabstop = function(index) {\n        this.$openTabstops = null;\n        var ts = this.tabstops[this.index];\n        if (ts)\n            this.addTabstopMarkers(ts);\n        this.index = index;\n        ts = this.tabstops[this.index];\n        if (!ts || !ts.length)\n            return;\n        \n        this.selectedTabstop = ts;\n        var range = ts.firstNonLinked || ts;\n        if (ts.choices) range.cursor = range.start;\n        if (!this.editor.inVirtualSelectionMode) {\n            var sel = this.editor.multiSelect;\n            sel.toSingleRange(range);\n            for (var i = 0; i < ts.length; i++) {\n                if (ts.hasLinkedRanges && ts[i].linked)\n                    continue;\n                sel.addRange(ts[i].clone(), true);\n            }\n        } else {\n            this.editor.selection.fromOrientedRange(range);\n        }\n        \n        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n        if (this.selectedTabstop && this.selectedTabstop.choices)\n            this.editor.execCommand(\"startAutocomplete\", {matches: this.selectedTabstop.choices});\n    };\n    this.addTabstops = function(tabstops, start, end) {\n        var useLink = this.useLink || !this.editor.getOption(\"enableMultiselect\");\n        \n        if (!this.$openTabstops)\n            this.$openTabstops = [];\n        if (!tabstops[0]) {\n            var p = Range.fromPoints(end, end);\n            moveRelative(p.start, start);\n            moveRelative(p.end, start);\n            tabstops[0] = [p];\n            tabstops[0].index = 0;\n        }\n\n        var i = this.index;\n        var arg = [i + 1, 0];\n        var ranges = this.ranges;\n        tabstops.forEach(function(ts, index) {\n            var dest = this.$openTabstops[index] || ts;\n            \n            for (var i = 0; i < ts.length; i++) {\n                var p = ts[i];\n                var range = Range.fromPoints(p.start, p.end || p.start);\n                movePoint(range.start, start);\n                movePoint(range.end, start);\n                range.original = p;\n                range.tabstop = dest;\n                ranges.push(range);\n                if (dest != ts)\n                    dest.unshift(range);\n                else\n                    dest[i] = range;\n                if (p.fmtString || (dest.firstNonLinked && useLink)) {\n                    range.linked = true;\n                    dest.hasLinkedRanges = true;\n                } else if (!dest.firstNonLinked)\n                    dest.firstNonLinked = range;\n            }\n            if (!dest.firstNonLinked)\n                dest.hasLinkedRanges = false;\n            if (dest === ts) {\n                arg.push(dest);\n                this.$openTabstops[index] = dest;\n            }\n            this.addTabstopMarkers(dest);\n            dest.rangeList = dest.rangeList || new RangeList();\n            dest.rangeList.$bias = 0;\n            dest.rangeList.addList(dest);\n        }, this);\n        \n        if (arg.length > 2) {\n            if (this.tabstops.length)\n                arg.push(arg.splice(2, 1)[0]);\n            this.tabstops.splice.apply(this.tabstops, arg);\n        }\n    };\n\n    this.addTabstopMarkers = function(ts) {\n        var session = this.editor.session;\n        ts.forEach(function(range) {\n            if  (!range.markerId)\n                range.markerId = session.addMarker(range, \"ace_snippet-marker\", \"text\");\n        });\n    };\n    this.removeTabstopMarkers = function(ts) {\n        var session = this.editor.session;\n        ts.forEach(function(range) {\n            session.removeMarker(range.markerId);\n            range.markerId = null;\n        });\n    };\n    this.removeRange = function(range) {\n        var i = range.tabstop.indexOf(range);\n        if (i != -1) range.tabstop.splice(i, 1);\n        i = this.ranges.indexOf(range);\n        if (i != -1) this.ranges.splice(i, 1);\n        i = range.tabstop.rangeList.ranges.indexOf(range);\n        if (i != -1) range.tabstop.splice(i, 1);\n        this.editor.session.removeMarker(range.markerId);\n        if (!range.tabstop.length) {\n            i = this.tabstops.indexOf(range.tabstop);\n            if (i != -1)\n                this.tabstops.splice(i, 1);\n            if (!this.tabstops.length)\n                this.detach();\n        }\n    };\n\n    this.keyboardHandler = new HashHandler();\n    this.keyboardHandler.bindKeys({\n        \"Tab\": function(editor) {\n            if (exports.snippetManager && exports.snippetManager.expandWithTab(editor))\n                return;\n            editor.tabstopManager.tabNext(1);\n            editor.renderer.scrollCursorIntoView();\n        },\n        \"Shift-Tab\": function(editor) {\n            editor.tabstopManager.tabNext(-1);\n            editor.renderer.scrollCursorIntoView();\n        },\n        \"Esc\": function(editor) {\n            editor.tabstopManager.detach();\n        }\n    });\n}).call(TabstopManager.prototype);\n\n\n\nvar movePoint = function(point, diff) {\n    if (point.row == 0)\n        point.column += diff.column;\n    point.row += diff.row;\n};\n\nvar moveRelative = function(point, start) {\n    if (point.row == start.row)\n        point.column -= start.column;\n    point.row -= start.row;\n};\n\n\nrequire(\"./lib/dom\").importCssString(\"\\\n.ace_snippet-marker {\\\n    -moz-box-sizing: border-box;\\\n    box-sizing: border-box;\\\n    background: rgba(194, 193, 208, 0.09);\\\n    border: 1px dotted rgba(211, 208, 235, 0.62);\\\n    position: absolute;\\\n}\");\n\nexports.snippetManager = new SnippetManager();\n\n\nvar Editor = require(\"./editor\").Editor;\n(function() {\n    this.insertSnippet = function(content, options) {\n        return exports.snippetManager.insertSnippet(this, content, options);\n    };\n    this.expandSnippet = function(options) {\n        return exports.snippetManager.expandWithTab(this, options);\n    };\n}).call(Editor.prototype);\n\n});\n\nace.define(\"ace/autocomplete/popup\",[\"require\",\"exports\",\"module\",\"ace/virtual_renderer\",\"ace/editor\",\"ace/range\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar Renderer = require(\"../virtual_renderer\").VirtualRenderer;\nvar Editor = require(\"../editor\").Editor;\nvar Range = require(\"../range\").Range;\nvar event = require(\"../lib/event\");\nvar lang = require(\"../lib/lang\");\nvar dom = require(\"../lib/dom\");\n\nvar $singleLineEditor = function(el) {\n    var renderer = new Renderer(el);\n\n    renderer.$maxLines = 4;\n\n    var editor = new Editor(renderer);\n\n    editor.setHighlightActiveLine(false);\n    editor.setShowPrintMargin(false);\n    editor.renderer.setShowGutter(false);\n    editor.renderer.setHighlightGutterLine(false);\n\n    editor.$mouseHandler.$focusTimeout = 0;\n    editor.$highlightTagPending = true;\n\n    return editor;\n};\n\nvar AcePopup = function(parentNode) {\n    var el = dom.createElement(\"div\");\n    var popup = new $singleLineEditor(el);\n\n    if (parentNode)\n        parentNode.appendChild(el);\n    el.style.display = \"none\";\n    popup.renderer.content.style.cursor = \"default\";\n    popup.renderer.setStyle(\"ace_autocomplete\");\n\n    popup.setOption(\"displayIndentGuides\", false);\n    popup.setOption(\"dragDelay\", 150);\n\n    var noop = function(){};\n\n    popup.focus = noop;\n    popup.$isFocused = true;\n\n    popup.renderer.$cursorLayer.restartTimer = noop;\n    popup.renderer.$cursorLayer.element.style.opacity = 0;\n\n    popup.renderer.$maxLines = 8;\n    popup.renderer.$keepTextAreaAtCursor = false;\n\n    popup.setHighlightActiveLine(false);\n    popup.session.highlight(\"\");\n    popup.session.$searchHighlight.clazz = \"ace_highlight-marker\";\n\n    popup.on(\"mousedown\", function(e) {\n        var pos = e.getDocumentPosition();\n        popup.selection.moveToPosition(pos);\n        selectionMarker.start.row = selectionMarker.end.row = pos.row;\n        e.stop();\n    });\n\n    var lastMouseEvent;\n    var hoverMarker = new Range(-1,0,-1,Infinity);\n    var selectionMarker = new Range(-1,0,-1,Infinity);\n    selectionMarker.id = popup.session.addMarker(selectionMarker, \"ace_active-line\", \"fullLine\");\n    popup.setSelectOnHover = function(val) {\n        if (!val) {\n            hoverMarker.id = popup.session.addMarker(hoverMarker, \"ace_line-hover\", \"fullLine\");\n        } else if (hoverMarker.id) {\n            popup.session.removeMarker(hoverMarker.id);\n            hoverMarker.id = null;\n        }\n    };\n    popup.setSelectOnHover(false);\n    popup.on(\"mousemove\", function(e) {\n        if (!lastMouseEvent) {\n            lastMouseEvent = e;\n            return;\n        }\n        if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {\n            return;\n        }\n        lastMouseEvent = e;\n        lastMouseEvent.scrollTop = popup.renderer.scrollTop;\n        var row = lastMouseEvent.getDocumentPosition().row;\n        if (hoverMarker.start.row != row) {\n            if (!hoverMarker.id)\n                popup.setRow(row);\n            setHoverMarker(row);\n        }\n    });\n    popup.renderer.on(\"beforeRender\", function() {\n        if (lastMouseEvent && hoverMarker.start.row != -1) {\n            lastMouseEvent.$pos = null;\n            var row = lastMouseEvent.getDocumentPosition().row;\n            if (!hoverMarker.id)\n                popup.setRow(row);\n            setHoverMarker(row, true);\n        }\n    });\n    popup.renderer.on(\"afterRender\", function() {\n        var row = popup.getRow();\n        var t = popup.renderer.$textLayer;\n        var selected = t.element.childNodes[row - t.config.firstRow];\n        if (selected !== t.selectedNode && t.selectedNode)\n            dom.removeCssClass(t.selectedNode, \"ace_selected\");\n        t.selectedNode = selected;\n        if (selected)\n            dom.addCssClass(selected, \"ace_selected\");\n    });\n    var hideHoverMarker = function() { setHoverMarker(-1); };\n    var setHoverMarker = function(row, suppressRedraw) {\n        if (row !== hoverMarker.start.row) {\n            hoverMarker.start.row = hoverMarker.end.row = row;\n            if (!suppressRedraw)\n                popup.session._emit(\"changeBackMarker\");\n            popup._emit(\"changeHoverMarker\");\n        }\n    };\n    popup.getHoveredRow = function() {\n        return hoverMarker.start.row;\n    };\n\n    event.addListener(popup.container, \"mouseout\", hideHoverMarker);\n    popup.on(\"hide\", hideHoverMarker);\n    popup.on(\"changeSelection\", hideHoverMarker);\n\n    popup.session.doc.getLength = function() {\n        return popup.data.length;\n    };\n    popup.session.doc.getLine = function(i) {\n        var data = popup.data[i];\n        if (typeof data == \"string\")\n            return data;\n        return (data && data.value) || \"\";\n    };\n\n    var bgTokenizer = popup.session.bgTokenizer;\n    bgTokenizer.$tokenizeRow = function(row) {\n        var data = popup.data[row];\n        var tokens = [];\n        if (!data)\n            return tokens;\n        if (typeof data == \"string\")\n            data = {value: data};\n        var caption = data.caption || data.value || data.name;\n\n        function addToken(value, className) {\n            value && tokens.push({\n                type: (data.className || \"\") + (className || \"\"), \n                value: value\n            });\n        }\n        \n        var lower = caption.toLowerCase();\n        var filterText = (popup.filterText || \"\").toLowerCase();\n        var lastIndex = 0;\n        var lastI = 0;\n        for (var i = 0; i <= filterText.length; i++) {\n            if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) {\n                var sub = filterText.slice(lastI, i);\n                lastI = i;\n                var index = lower.indexOf(sub, lastIndex);\n                if (index == -1) continue;\n                addToken(caption.slice(lastIndex, index), \"\");\n                lastIndex = index + sub.length;\n                addToken(caption.slice(index, lastIndex), \"completion-highlight\");\n            }\n        }\n        addToken(caption.slice(lastIndex, caption.length), \"\");\n        \n        if (data.meta)\n            tokens.push({type: \"completion-meta\", value: data.meta});\n        if (data.message)\n            tokens.push({type: \"completion-message\", value: data.message});\n\n        return tokens;\n    };\n    bgTokenizer.$updateOnChange = noop;\n    bgTokenizer.start = noop;\n\n    popup.session.$computeWidth = function() {\n        return this.screenWidth = 0;\n    };\n    popup.isOpen = false;\n    popup.isTopdown = false;\n    popup.autoSelect = true;\n    popup.filterText = \"\";\n\n    popup.data = [];\n    popup.setData = function(list, filterText) {\n        popup.filterText = filterText || \"\";\n        popup.setValue(lang.stringRepeat(\"\\n\", list.length), -1);\n        popup.data = list || [];\n        popup.setRow(0);\n    };\n    popup.getData = function(row) {\n        return popup.data[row];\n    };\n\n    popup.getRow = function() {\n        return selectionMarker.start.row;\n    };\n    popup.setRow = function(line) {\n        line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line));\n        if (selectionMarker.start.row != line) {\n            popup.selection.clearSelection();\n            selectionMarker.start.row = selectionMarker.end.row = line || 0;\n            popup.session._emit(\"changeBackMarker\");\n            popup.moveCursorTo(line || 0, 0);\n            if (popup.isOpen)\n                popup._signal(\"select\");\n        }\n    };\n\n    popup.on(\"changeSelection\", function() {\n        if (popup.isOpen)\n            popup.setRow(popup.selection.lead.row);\n        popup.renderer.scrollCursorIntoView();\n    });\n\n    popup.hide = function() {\n        this.container.style.display = \"none\";\n        this._signal(\"hide\");\n        popup.isOpen = false;\n    };\n    popup.show = function(pos, lineHeight, topdownOnly) {\n        var el = this.container;\n        var screenHeight = window.innerHeight;\n        var screenWidth = window.innerWidth;\n        var renderer = this.renderer;\n        var maxH = renderer.$maxLines * lineHeight * 1.4;\n        var top = pos.top + this.$borderSize;\n        var allowTopdown = top > screenHeight / 2 && !topdownOnly;\n        if (allowTopdown && top + lineHeight + maxH > screenHeight) {\n            renderer.$maxPixelHeight = top - 2 * this.$borderSize;\n            el.style.top = \"\";\n            el.style.bottom = screenHeight - top + \"px\";\n            popup.isTopdown = false;\n        } else {\n            top += lineHeight;\n            renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight;\n            el.style.top = top + \"px\";\n            el.style.bottom = \"\";\n            popup.isTopdown = true;\n        }\n\n        el.style.display = \"\";\n\n        var left = pos.left;\n        if (left + el.offsetWidth > screenWidth)\n            left = screenWidth - el.offsetWidth;\n\n        el.style.left = left + \"px\";\n\n        this._signal(\"show\");\n        lastMouseEvent = null;\n        popup.isOpen = true;\n    };\n\n    popup.goTo = function(where) {\n        var row = this.getRow();\n        var max = this.session.getLength() - 1;\n\n        switch(where) {\n            case \"up\": row = row <= 0 ? max : row - 1; break;\n            case \"down\": row = row >= max ? -1 : row + 1; break;\n            case \"start\": row = 0; break;\n            case \"end\": row = max; break;\n        }\n\n        this.setRow(row);\n    };\n\n\n    popup.getTextLeftOffset = function() {\n        return this.$borderSize + this.renderer.$padding + this.$imageSize;\n    };\n\n    popup.$imageSize = 0;\n    popup.$borderSize = 1;\n\n    return popup;\n};\n\ndom.importCssString(\"\\\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\\\n    background-color: #CAD6FA;\\\n    z-index: 1;\\\n}\\\n.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\\\n    background-color: #3a674e;\\\n}\\\n.ace_editor.ace_autocomplete .ace_line-hover {\\\n    border: 1px solid #abbffe;\\\n    margin-top: -1px;\\\n    background: rgba(233,233,253,0.4);\\\n    position: absolute;\\\n    z-index: 2;\\\n}\\\n.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\\\n    border: 1px solid rgba(109, 150, 13, 0.8);\\\n    background: rgba(58, 103, 78, 0.62);\\\n}\\\n.ace_completion-meta {\\\n    opacity: 0.5;\\\n    margin: 0.9em;\\\n}\\\n.ace_completion-message {\\\n    color: blue;\\\n}\\\n.ace_editor.ace_autocomplete .ace_completion-highlight{\\\n    color: #2d69c7;\\\n}\\\n.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\\\n    color: #93ca12;\\\n}\\\n.ace_editor.ace_autocomplete {\\\n    width: 300px;\\\n    z-index: 200000;\\\n    border: 1px lightgray solid;\\\n    position: fixed;\\\n    box-shadow: 2px 3px 5px rgba(0,0,0,.2);\\\n    line-height: 1.4;\\\n    background: #fefefe;\\\n    color: #111;\\\n}\\\n.ace_dark.ace_editor.ace_autocomplete {\\\n    border: 1px #484747 solid;\\\n    box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\\\n    line-height: 1.4;\\\n    background: #25282c;\\\n    color: #c1c1c1;\\\n}\", \"autocompletion.css\");\n\nexports.AcePopup = AcePopup;\nexports.$singleLineEditor = $singleLineEditor;\n});\n\nace.define(\"ace/autocomplete/util\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.parForEach = function(array, fn, callback) {\n    var completed = 0;\n    var arLength = array.length;\n    if (arLength === 0)\n        callback();\n    for (var i = 0; i < arLength; i++) {\n        fn(array[i], function(result, err) {\n            completed++;\n            if (completed === arLength)\n                callback(result, err);\n        });\n    }\n};\n\nvar ID_REGEX = /[a-zA-Z_0-9\\$\\-\\u00A2-\\u2000\\u2070-\\uFFFF]/;\n\nexports.retrievePrecedingIdentifier = function(text, pos, regex) {\n    regex = regex || ID_REGEX;\n    var buf = [];\n    for (var i = pos-1; i >= 0; i--) {\n        if (regex.test(text[i]))\n            buf.push(text[i]);\n        else\n            break;\n    }\n    return buf.reverse().join(\"\");\n};\n\nexports.retrieveFollowingIdentifier = function(text, pos, regex) {\n    regex = regex || ID_REGEX;\n    var buf = [];\n    for (var i = pos; i < text.length; i++) {\n        if (regex.test(text[i]))\n            buf.push(text[i]);\n        else\n            break;\n    }\n    return buf;\n};\n\nexports.getCompletionPrefix = function (editor) {\n    var pos = editor.getCursorPosition();\n    var line = editor.session.getLine(pos.row);\n    var prefix;\n    editor.completers.forEach(function(completer) {\n        if (completer.identifierRegexps) {\n            completer.identifierRegexps.forEach(function(identifierRegex) {\n                if (!prefix && identifierRegex)\n                    prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex);\n            }.bind(this));\n        }\n    }.bind(this));\n    return prefix || this.retrievePrecedingIdentifier(line, pos.column);\n};\n\n});\n\nace.define(\"ace/autocomplete\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/autocomplete/popup\",\"ace/autocomplete/util\",\"ace/lib/lang\",\"ace/lib/dom\",\"ace/snippets\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar HashHandler = require(\"./keyboard/hash_handler\").HashHandler;\nvar AcePopup = require(\"./autocomplete/popup\").AcePopup;\nvar util = require(\"./autocomplete/util\");\nvar lang = require(\"./lib/lang\");\nvar dom = require(\"./lib/dom\");\nvar snippetManager = require(\"./snippets\").snippetManager;\nvar config = require(\"./config\");\n\nvar Autocomplete = function() {\n    this.autoInsert = false;\n    this.autoSelect = true;\n    this.exactMatch = false;\n    this.gatherCompletionsId = 0;\n    this.keyboardHandler = new HashHandler();\n    this.keyboardHandler.bindKeys(this.commands);\n\n    this.blurListener = this.blurListener.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.mousedownListener = this.mousedownListener.bind(this);\n    this.mousewheelListener = this.mousewheelListener.bind(this);\n\n    this.changeTimer = lang.delayedCall(function() {\n        this.updateCompletions(true);\n    }.bind(this));\n\n    this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50);\n};\n\n(function() {\n\n    this.$init = function() {\n        this.popup = new AcePopup(document.body || document.documentElement);\n        this.popup.on(\"click\", function(e) {\n            this.insertMatch();\n            e.stop();\n        }.bind(this));\n        this.popup.focus = this.editor.focus.bind(this.editor);\n        this.popup.on(\"show\", this.tooltipTimer.bind(null, null));\n        this.popup.on(\"select\", this.tooltipTimer.bind(null, null));\n        this.popup.on(\"changeHoverMarker\", this.tooltipTimer.bind(null, null));\n        return this.popup;\n    };\n\n    this.getPopup = function() {\n        return this.popup || this.$init();\n    };\n\n    this.openPopup = function(editor, prefix, keepPopupPosition) {\n        if (!this.popup)\n            this.$init();\n\n        this.popup.autoSelect = this.autoSelect;\n\n        this.popup.setData(this.completions.filtered, this.completions.filterText);\n\n        editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n        \n        var renderer = editor.renderer;\n        this.popup.setRow(this.autoSelect ? 0 : -1);\n        if (!keepPopupPosition) {\n            this.popup.setTheme(editor.getTheme());\n            this.popup.setFontSize(editor.getFontSize());\n\n            var lineHeight = renderer.layerConfig.lineHeight;\n\n            var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);\n            pos.left -= this.popup.getTextLeftOffset();\n\n            var rect = editor.container.getBoundingClientRect();\n            pos.top += rect.top - renderer.layerConfig.offset;\n            pos.left += rect.left - editor.renderer.scrollLeft;\n            pos.left += renderer.gutterWidth;\n\n            this.popup.show(pos, lineHeight);\n        } else if (keepPopupPosition && !prefix) {\n            this.detach();\n        }\n        this.changeTimer.cancel();\n    };\n\n    this.detach = function() {\n        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n        this.editor.off(\"changeSelection\", this.changeListener);\n        this.editor.off(\"blur\", this.blurListener);\n        this.editor.off(\"mousedown\", this.mousedownListener);\n        this.editor.off(\"mousewheel\", this.mousewheelListener);\n        this.changeTimer.cancel();\n        this.hideDocTooltip();\n\n        this.gatherCompletionsId += 1;\n        if (this.popup && this.popup.isOpen)\n            this.popup.hide();\n\n        if (this.base)\n            this.base.detach();\n        this.activated = false;\n        this.completions = this.base = null;\n    };\n\n    this.changeListener = function(e) {\n        var cursor = this.editor.selection.lead;\n        if (cursor.row != this.base.row || cursor.column < this.base.column) {\n            this.detach();\n        }\n        if (this.activated)\n            this.changeTimer.schedule();\n        else\n            this.detach();\n    };\n\n    this.blurListener = function(e) {\n        var el = document.activeElement;\n        var text = this.editor.textInput.getElement();\n        var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget);\n        var container = this.popup && this.popup.container;\n        if (el != text && el.parentNode != container && !fromTooltip\n            && el != this.tooltipNode && e.relatedTarget != text\n        ) {\n            this.detach();\n        }\n    };\n\n    this.mousedownListener = function(e) {\n        this.detach();\n    };\n\n    this.mousewheelListener = function(e) {\n        this.detach();\n    };\n\n    this.goTo = function(where) {\n        this.popup.goTo(where);\n    };\n\n    this.insertMatch = function(data, options) {\n        if (!data)\n            data = this.popup.getData(this.popup.getRow());\n        if (!data)\n            return false;\n\n        var completions = this.completions;\n        this.editor.startOperation({command: {name: \"insertMatch\"}});\n        if (data.completer && data.completer.insertMatch) {\n            data.completer.insertMatch(this.editor, data);\n        } else {\n            if (completions.filterText) {\n                var ranges = this.editor.selection.getAllRanges();\n                for (var i = 0, range; range = ranges[i]; i++) {\n                    range.start.column -= completions.filterText.length;\n                    this.editor.session.remove(range);\n                }\n            }\n            if (data.snippet)\n                snippetManager.insertSnippet(this.editor, data.snippet);\n            else\n                this.editor.execCommand(\"insertstring\", data.value || data);\n        }\n        if (this.completions == completions)\n            this.detach();\n        this.editor.endOperation();\n    };\n\n\n    this.commands = {\n        \"Up\": function(editor) { editor.completer.goTo(\"up\"); },\n        \"Down\": function(editor) { editor.completer.goTo(\"down\"); },\n        \"Ctrl-Up|Ctrl-Home\": function(editor) { editor.completer.goTo(\"start\"); },\n        \"Ctrl-Down|Ctrl-End\": function(editor) { editor.completer.goTo(\"end\"); },\n\n        \"Esc\": function(editor) { editor.completer.detach(); },\n        \"Return\": function(editor) { return editor.completer.insertMatch(); },\n        \"Shift-Return\": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); },\n        \"Tab\": function(editor) {\n            var result = editor.completer.insertMatch();\n            if (!result && !editor.tabstopManager)\n                editor.completer.goTo(\"down\");\n            else\n                return result;\n        },\n\n        \"PageUp\": function(editor) { editor.completer.popup.gotoPageUp(); },\n        \"PageDown\": function(editor) { editor.completer.popup.gotoPageDown(); }\n    };\n\n    this.gatherCompletions = function(editor, callback) {\n        var session = editor.getSession();\n        var pos = editor.getCursorPosition();\n\n        var prefix = util.getCompletionPrefix(editor);\n\n        this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);\n        this.base.$insertRight = true;\n\n        var matches = [];\n        var total = editor.completers.length;\n        editor.completers.forEach(function(completer, i) {\n            completer.getCompletions(editor, session, pos, prefix, function(err, results) {\n                if (!err && results)\n                    matches = matches.concat(results);\n                callback(null, {\n                    prefix: util.getCompletionPrefix(editor),\n                    matches: matches,\n                    finished: (--total === 0)\n                });\n            });\n        });\n        return true;\n    };\n\n    this.showPopup = function(editor, options) {\n        if (this.editor)\n            this.detach();\n\n        this.activated = true;\n\n        this.editor = editor;\n        if (editor.completer != this) {\n            if (editor.completer)\n                editor.completer.detach();\n            editor.completer = this;\n        }\n\n        editor.on(\"changeSelection\", this.changeListener);\n        editor.on(\"blur\", this.blurListener);\n        editor.on(\"mousedown\", this.mousedownListener);\n        editor.on(\"mousewheel\", this.mousewheelListener);\n\n        this.updateCompletions(false, options);\n    };\n\n    this.updateCompletions = function(keepPopupPosition, options) {\n        if (keepPopupPosition && this.base && this.completions) {\n            var pos = this.editor.getCursorPosition();\n            var prefix = this.editor.session.getTextRange({start: this.base, end: pos});\n            if (prefix == this.completions.filterText)\n                return;\n            this.completions.setFilter(prefix);\n            if (!this.completions.filtered.length)\n                return this.detach();\n            if (this.completions.filtered.length == 1\n            && this.completions.filtered[0].value == prefix\n            && !this.completions.filtered[0].snippet)\n                return this.detach();\n            this.openPopup(this.editor, prefix, keepPopupPosition);\n            return;\n        }\n        \n        if (options && options.matches) {\n            var pos = this.editor.getSelectionRange().start;\n            this.base = this.editor.session.doc.createAnchor(pos.row, pos.column);\n            this.base.$insertRight = true;\n            this.completions = new FilteredList(options.matches);\n            return this.openPopup(this.editor, \"\", keepPopupPosition);\n        }\n        var _id = this.gatherCompletionsId;\n        this.gatherCompletions(this.editor, function(err, results) {\n            var detachIfFinished = function() {\n                if (!results.finished) return;\n                return this.detach();\n            }.bind(this);\n\n            var prefix = results.prefix;\n            var matches = results && results.matches;\n\n            if (!matches || !matches.length)\n                return detachIfFinished();\n            if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)\n                return;\n\n            this.completions = new FilteredList(matches);\n\n            if (this.exactMatch)\n                this.completions.exactMatch = true;\n\n            this.completions.setFilter(prefix);\n            var filtered = this.completions.filtered;\n            if (!filtered.length)\n                return detachIfFinished();\n            if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)\n                return detachIfFinished();\n            if (this.autoInsert && filtered.length == 1 && results.finished)\n                return this.insertMatch(filtered[0]);\n\n            this.openPopup(this.editor, prefix, keepPopupPosition);\n        }.bind(this));\n    };\n\n    this.cancelContextMenu = function() {\n        this.editor.$mouseHandler.cancelContextMenu();\n    };\n\n    this.updateDocTooltip = function() {\n        var popup = this.popup;\n        var all = popup.data;\n        var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]);\n        var doc = null;\n        if (!selected || !this.editor || !this.popup.isOpen)\n            return this.hideDocTooltip();\n        this.editor.completers.some(function(completer) {\n            if (completer.getDocTooltip)\n                doc = completer.getDocTooltip(selected);\n            return doc;\n        });\n        if (!doc && typeof selected != \"string\")\n            doc = selected;\n\n        if (typeof doc == \"string\")\n            doc = {docText: doc};\n        if (!doc || !(doc.docHTML || doc.docText))\n            return this.hideDocTooltip();\n        this.showDocTooltip(doc);\n    };\n\n    this.showDocTooltip = function(item) {\n        if (!this.tooltipNode) {\n            this.tooltipNode = dom.createElement(\"div\");\n            this.tooltipNode.className = \"ace_tooltip ace_doc-tooltip\";\n            this.tooltipNode.style.margin = 0;\n            this.tooltipNode.style.pointerEvents = \"auto\";\n            this.tooltipNode.tabIndex = -1;\n            this.tooltipNode.onblur = this.blurListener.bind(this);\n            this.tooltipNode.onclick = this.onTooltipClick.bind(this);\n        }\n\n        var tooltipNode = this.tooltipNode;\n        if (item.docHTML) {\n            tooltipNode.innerHTML = item.docHTML;\n        } else if (item.docText) {\n            tooltipNode.textContent = item.docText;\n        }\n\n        if (!tooltipNode.parentNode)\n            document.body.appendChild(tooltipNode);\n        var popup = this.popup;\n        var rect = popup.container.getBoundingClientRect();\n        tooltipNode.style.top = popup.container.style.top;\n        tooltipNode.style.bottom = popup.container.style.bottom;\n\n        tooltipNode.style.display = \"block\";\n        if (window.innerWidth - rect.right < 320) {\n            if (rect.left < 320) {\n                if(popup.isTopdown) {\n                    tooltipNode.style.top = rect.bottom + \"px\";\n                    tooltipNode.style.left = rect.left + \"px\";\n                    tooltipNode.style.right = \"\";\n                    tooltipNode.style.bottom = \"\";\n                } else {\n                    tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + \"px\";\n                    tooltipNode.style.left = rect.left + \"px\";\n                    tooltipNode.style.right = \"\";\n                    tooltipNode.style.bottom = \"\";\n                }\n            } else {\n                tooltipNode.style.right = window.innerWidth - rect.left + \"px\";\n                tooltipNode.style.left = \"\";\n            }\n        } else {\n            tooltipNode.style.left = (rect.right + 1) + \"px\";\n            tooltipNode.style.right = \"\";\n        }\n    };\n\n    this.hideDocTooltip = function() {\n        this.tooltipTimer.cancel();\n        if (!this.tooltipNode) return;\n        var el = this.tooltipNode;\n        if (!this.editor.isFocused() && document.activeElement == el)\n            this.editor.focus();\n        this.tooltipNode = null;\n        if (el.parentNode)\n            el.parentNode.removeChild(el);\n    };\n    \n    this.onTooltipClick = function(e) {\n        var a = e.target;\n        while (a && a != this.tooltipNode) {\n            if (a.nodeName == \"A\" && a.href) {\n                a.rel = \"noreferrer\";\n                a.target = \"_blank\";\n                break;\n            }\n            a = a.parentNode;\n        }\n    };\n\n    this.destroy = function() {\n        this.detach();\n        if (this.popup) {\n            this.popup.destroy();\n            var el = this.popup.container;\n            if (el && el.parentNode)\n                el.parentNode.removeChild(el);\n        }\n        if (this.editor && this.editor.completer == this)\n            this.editor.completer == null;\n        this.popup = null;\n    };\n\n}).call(Autocomplete.prototype);\n\n\nAutocomplete.for = function(editor) {\n    if (editor.completer) {\n        return editor.completer;\n    }\n    if (config.get(\"sharedPopups\")) {\n        if (!Autocomplete.$shared)\n            Autocomplete.$sharedInstance = new Autocomplete();\n        editor.completer = Autocomplete.$sharedInstance;\n    } else {\n        editor.completer = new Autocomplete();\n        editor.once(\"destroy\", function(e, editor) {\n            editor.completer.destroy();\n        });\n    }\n    return editor.completer;\n};\n\nAutocomplete.startCommand = {\n    name: \"startAutocomplete\",\n    exec: function(editor, options) {\n        var completer = Autocomplete.for(editor);\n        completer.autoInsert = false;\n        completer.autoSelect = true;\n        completer.showPopup(editor, options);\n        completer.cancelContextMenu();\n    },\n    bindKey: \"Ctrl-Space|Ctrl-Shift-Space|Alt-Space\"\n};\n\nvar FilteredList = function(array, filterText) {\n    this.all = array;\n    this.filtered = array;\n    this.filterText = filterText || \"\";\n    this.exactMatch = false;\n};\n(function(){\n    this.setFilter = function(str) {\n        if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)\n            var matches = this.filtered;\n        else\n            var matches = this.all;\n\n        this.filterText = str;\n        matches = this.filterCompletions(matches, this.filterText);\n        matches = matches.sort(function(a, b) {\n            return b.exactMatch - a.exactMatch || b.$score - a.$score \n                || (a.caption || a.value).localeCompare(b.caption || b.value);\n        });\n        var prev = null;\n        matches = matches.filter(function(item){\n            var caption = item.snippet || item.caption || item.value;\n            if (caption === prev) return false;\n            prev = caption;\n            return true;\n        });\n\n        this.filtered = matches;\n    };\n    this.filterCompletions = function(items, needle) {\n        var results = [];\n        var upper = needle.toUpperCase();\n        var lower = needle.toLowerCase();\n        loop: for (var i = 0, item; item = items[i]; i++) {\n            var caption = item.caption || item.value || item.snippet;\n            if (!caption) continue;\n            var lastIndex = -1;\n            var matchMask = 0;\n            var penalty = 0;\n            var index, distance;\n\n            if (this.exactMatch) {\n                if (needle !== caption.substr(0, needle.length))\n                    continue loop;\n            } else {\n                var fullMatchIndex = caption.toLowerCase().indexOf(lower);\n                if (fullMatchIndex > -1) {\n                    penalty = fullMatchIndex;\n                } else {\n                    for (var j = 0; j < needle.length; j++) {\n                        var i1 = caption.indexOf(lower[j], lastIndex + 1);\n                        var i2 = caption.indexOf(upper[j], lastIndex + 1);\n                        index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;\n                        if (index < 0)\n                            continue loop;\n                        distance = index - lastIndex - 1;\n                        if (distance > 0) {\n                            if (lastIndex === -1)\n                                penalty += 10;\n                            penalty += distance;\n                            matchMask = matchMask | (1 << j);\n                        }\n                        lastIndex = index;\n                    }\n                }\n            }\n            item.matchMask = matchMask;\n            item.exactMatch = penalty ? 0 : 1;\n            item.$score = (item.score || 0) - penalty;\n            results.push(item);\n        }\n        return results;\n    };\n}).call(FilteredList.prototype);\n\nexports.Autocomplete = Autocomplete;\nexports.FilteredList = FilteredList;\n\n});\n\nace.define(\"ace/autocomplete/text_completer\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n    var Range = require(\"../range\").Range;\n    \n    var splitRegex = /[^a-zA-Z_0-9\\$\\-\\u00C0-\\u1FFF\\u2C00-\\uD7FF\\w]+/;\n\n    function getWordIndex(doc, pos) {\n        var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));\n        return textBefore.split(splitRegex).length - 1;\n    }\n    function wordDistance(doc, pos) {\n        var prefixPos = getWordIndex(doc, pos);\n        var words = doc.getValue().split(splitRegex);\n        var wordScores = Object.create(null);\n        \n        var currentWord = words[prefixPos];\n\n        words.forEach(function(word, idx) {\n            if (!word || word === currentWord) return;\n\n            var distance = Math.abs(prefixPos - idx);\n            var score = words.length - distance;\n            if (wordScores[word]) {\n                wordScores[word] = Math.max(score, wordScores[word]);\n            } else {\n                wordScores[word] = score;\n            }\n        });\n        return wordScores;\n    }\n\n    exports.getCompletions = function(editor, session, pos, prefix, callback) {\n        var wordScore = wordDistance(session, pos);\n        var wordList = Object.keys(wordScore);\n        callback(null, wordList.map(function(word) {\n            return {\n                caption: word,\n                value: word,\n                score: wordScore[word],\n                meta: \"local\"\n            };\n        }));\n    };\n});\n\nace.define(\"ace/ext/language_tools\",[\"require\",\"exports\",\"module\",\"ace/snippets\",\"ace/autocomplete\",\"ace/config\",\"ace/lib/lang\",\"ace/autocomplete/util\",\"ace/autocomplete/text_completer\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar snippetManager = require(\"../snippets\").snippetManager;\nvar Autocomplete = require(\"../autocomplete\").Autocomplete;\nvar config = require(\"../config\");\nvar lang = require(\"../lib/lang\");\nvar util = require(\"../autocomplete/util\");\n\nvar textCompleter = require(\"../autocomplete/text_completer\");\nvar keyWordCompleter = {\n    getCompletions: function(editor, session, pos, prefix, callback) {\n        if (session.$mode.completer) {\n            return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);\n        }\n        var state = editor.session.getState(pos.row);\n        var completions = session.$mode.getCompletions(state, session, pos, prefix);\n        callback(null, completions);\n    }\n};\n\nvar snippetCompleter = {\n    getCompletions: function(editor, session, pos, prefix, callback) {\n        var scopes = [];\n        var token = session.getTokenAt(pos.row, pos.column);\n        if (token && token.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\\.xml$/))\n            scopes.push('html-tag');\n        else\n            scopes = snippetManager.getActiveScopes(editor);\n\n        var snippetMap = snippetManager.snippetMap;\n        var completions = [];\n        scopes.forEach(function(scope) {\n            var snippets = snippetMap[scope] || [];\n            for (var i = snippets.length; i--;) {\n                var s = snippets[i];\n                var caption = s.name || s.tabTrigger;\n                if (!caption)\n                    continue;\n                completions.push({\n                    caption: caption,\n                    snippet: s.content,\n                    meta: s.tabTrigger && !s.name ? s.tabTrigger + \"\\u21E5 \" : \"snippet\",\n                    type: \"snippet\"\n                });\n            }\n        }, this);\n        callback(null, completions);\n    },\n    getDocTooltip: function(item) {\n        if (item.type == \"snippet\" && !item.docHTML) {\n            item.docHTML = [\n                \"\", lang.escapeHTML(item.caption), \"\", \"
\",\n lang.escapeHTML(item.snippet)\n ].join(\"\");\n }\n }\n};\n\nvar completers = [snippetCompleter, textCompleter, keyWordCompleter];\nexports.setCompleters = function(val) {\n completers.length = 0;\n if (val) completers.push.apply(completers, val);\n};\nexports.addCompleter = function(completer) {\n completers.push(completer);\n};\nexports.textCompleter = textCompleter;\nexports.keyWordCompleter = keyWordCompleter;\nexports.snippetCompleter = snippetCompleter;\n\nvar expandSnippet = {\n name: \"expandSnippet\",\n exec: function(editor) {\n return snippetManager.expandWithTab(editor);\n },\n bindKey: \"Tab\"\n};\n\nvar onChangeMode = function(e, editor) {\n loadSnippetsForMode(editor.session.$mode);\n};\n\nvar loadSnippetsForMode = function(mode) {\n if (typeof mode == \"string\")\n mode = config.$modes[mode];\n if (!mode)\n return;\n if (!snippetManager.files)\n snippetManager.files = {};\n \n loadSnippetFile(mode.$id, mode.snippetFileId);\n if (mode.modes)\n mode.modes.forEach(loadSnippetsForMode);\n};\n\nvar loadSnippetFile = function(id, snippetFilePath) {\n if (!snippetFilePath || !id || snippetManager.files[id])\n return;\n snippetManager.files[id] = {};\n config.loadModule(snippetFilePath, function(m) {\n if (!m) return;\n snippetManager.files[id] = m;\n if (!m.snippets && m.snippetText)\n m.snippets = snippetManager.parseSnippetFile(m.snippetText);\n snippetManager.register(m.snippets || [], m.scope);\n if (m.includeScopes) {\n snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;\n m.includeScopes.forEach(function(x) {\n loadSnippetsForMode(\"ace/mode/\" + x);\n });\n }\n });\n};\n\nvar doLiveAutocomplete = function(e) {\n var editor = e.editor;\n var hasCompleter = editor.completer && editor.completer.activated;\n if (e.command.name === \"backspace\") {\n if (hasCompleter && !util.getCompletionPrefix(editor))\n editor.completer.detach();\n }\n else if (e.command.name === \"insertstring\") {\n var prefix = util.getCompletionPrefix(editor);\n if (prefix && !hasCompleter) {\n var completer = Autocomplete.for(editor);\n completer.autoInsert = false;\n completer.showPopup(editor);\n }\n }\n};\n\nvar Editor = require(\"../editor\").Editor;\nrequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n enableBasicAutocompletion: {\n set: function(val) {\n if (val) {\n if (!this.completers)\n this.completers = Array.isArray(val)? val: completers;\n this.commands.addCommand(Autocomplete.startCommand);\n } else {\n this.commands.removeCommand(Autocomplete.startCommand);\n }\n },\n value: false\n },\n enableLiveAutocompletion: {\n set: function(val) {\n if (val) {\n if (!this.completers)\n this.completers = Array.isArray(val)? val: completers;\n this.commands.on('afterExec', doLiveAutocomplete);\n } else {\n this.commands.removeListener('afterExec', doLiveAutocomplete);\n }\n },\n value: false\n },\n enableSnippets: {\n set: function(val) {\n if (val) {\n this.commands.addCommand(expandSnippet);\n this.on(\"changeMode\", onChangeMode);\n onChangeMode(null, this);\n } else {\n this.commands.removeCommand(expandSnippet);\n this.off(\"changeMode\", onChangeMode);\n }\n },\n value: false\n }\n});\n}); (function() {\n ace.require([\"ace/ext/language_tools\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","ace.define(\"ace/mode/lucene_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LuceneHighlightRules = function() {\n this.$rules = {\n \"start\" : [\n {\n token: \"constant.language.escape\",\n regex: /\\\\[\\-+&|!(){}\\[\\]^\"~*?:\\\\]/\n }, {\n token: \"constant.character.negation\",\n regex: \"\\\\-\"\n }, {\n token: \"constant.character.interro\",\n regex: \"\\\\?\"\n }, {\n token: \"constant.character.required\",\n regex: \"\\\\+\"\n }, {\n token: \"constant.character.asterisk\",\n regex: \"\\\\*\"\n }, {\n token: 'constant.character.proximity',\n regex: '~(?:0\\\\.[0-9]+|[0-9]+)?'\n }, {\n token: 'keyword.operator',\n regex: '(AND|OR|NOT|TO)\\\\b'\n }, {\n token: \"paren.lparen\",\n regex: \"[\\\\(\\\\{\\\\[]\"\n }, {\n token: \"paren.rparen\",\n regex: \"[\\\\)\\\\}\\\\]]\"\n }, {\n token: \"keyword.operator\",\n regex: /[><=^]/\n }, {\n token: \"constant.numeric\",\n regex: /\\d[\\d.-]*/\n }, {\n token: \"string\",\n regex: /\"(?:\\\\\"|[^\"])*\"/\n }, {\n token: \"keyword\",\n regex: /(?:\\\\.|[^\\s\\-+&|!(){}\\[\\]^\"~*?:\\\\])+:/,\n next: \"maybeRegex\"\n }, {\n token: \"term\",\n regex: /\\w+/\n }, {\n token: \"text\",\n regex: /\\s+/\n }\n ],\n \"maybeRegex\": [{\n token: \"text\",\n regex: /\\s+/\n }, {\n token: \"string.regexp.start\",\n regex: \"/\",\n next: \"regex\"\n }, {\n regex: \"\",\n next: \"start\"\n }],\n \"regex\": [\n {\n token: \"regexp.keyword.operator\",\n regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n }, {\n token: \"string.regexp.end\",\n regex: \"/[sxngimy]*\",\n next: \"no_regex\"\n }, {\n token : \"invalid\",\n regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n }, {\n token : \"constant.language.escape\",\n regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n }, {\n token: \"constant.language.escape\",\n regex: \"<\\d+-\\d+>|[~&@]\"\n }, {\n token : \"constant.language.delimiter\",\n regex: /\\|/\n }, {\n token: \"constant.language.escape\",\n regex: /\\[\\^?/,\n next: \"regex_character_class\"\n }, {\n token: \"empty\",\n regex: \"$\",\n next: \"no_regex\"\n }, {\n defaultToken: \"string.regexp\"\n }\n ],\n \"regex_character_class\": [\n {\n token: \"regexp.charclass.keyword.operator\",\n regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n }, {\n token: \"constant.language.escape\",\n regex: \"]\",\n next: \"regex\"\n }, {\n token: \"constant.language.escape\",\n regex: \"-\"\n }, {\n token: \"empty\",\n regex: \"$\",\n next: \"no_regex\"\n }, {\n defaultToken: \"string.regexp.charachterclass\"\n }\n ]\n };\n};\n\noop.inherits(LuceneHighlightRules, TextHighlightRules);\n\nexports.LuceneHighlightRules = LuceneHighlightRules;\n});\n\nace.define(\"ace/mode/lucene\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lucene_highlight_rules\"], function(require, exports, module) {\n'use strict';\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LuceneHighlightRules = require(\"./lucene_highlight_rules\").LuceneHighlightRules;\n\nvar Mode = function() {\n this.HighlightRules = LuceneHighlightRules;\n this.$behaviour = this.$defaultBehaviour;\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n this.$id = \"ace/mode/lucene\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n}); (function() {\n ace.require([\"ace/mode/lucene\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n "],"sourceRoot":""}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy