{ "version": 3, "sources": ["../ui/libs/ace/ace.js", "../ui/libs/ace/mode-n1ql.js", "../ui/libs/ace/mode-javascript.js", "../ui/libs/ace/mode-json.js", "../ui/libs/ace/mode-sql-plus-plus.js", "../ui/libs/ace/query-formatter.js", "../ui/libs/ace/ext-cb-searchbox.js", "../ui/libs/ace/ext-language_tools.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/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (require, exports, module) params\n */\n\nvar ace_exports;\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\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(this, arguments);\n else {\n console.error(\"dropping module because define wasn\\'t a string.\");\n console.trace();\n }\n return;\n }\n if (arguments.length == 2)\n payload = deps;\n if (!define.modules[module]) {\n define.payloads[module] = payload;\n define.modules[module] = null;\n }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _require = function(parentId, module, callback) {\n if (typeof module === \"string\") {\n var payload = lookup(parentId, module);\n if (payload != undefined) {\n callback && callback();\n return payload;\n }\n } else 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 == undefined && require.original)\n return;\n params.push(dep);\n }\n return callback && callback.apply(null, params) || true;\n }\n};\n\nvar require = function(module, callback) {\n var packagedModule = _require(\"\", module, callback);\n if (packagedModule == undefined && require.original)\n return require.original.apply(this, arguments);\n return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n // normalize plugin requires\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n }\n // normalize relative requires\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 return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\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 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/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nif (typeof Element != \"undefined\" && !Element.prototype.remove) {\n Object.defineProperty(Element.prototype, \"remove\", {\n enumerable: false,\n writable: true,\n configurable: true,\n value: function() { this.parentNode && this.parentNode.removeChild(this); }\n });\n}\n\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\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};\nvar _navigator = typeof navigator == \"object\" ? navigator : {};\n\nvar os = (/mac|win|linux/i.exec(_navigator.platform) || [\"other\"])[0].toLowerCase();\nvar ua = _navigator.userAgent || \"\";\nvar appName = _navigator.appName || \"\";\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (appName == \"Microsoft Internet Explorer\" || appName.indexOf(\"MSAppHost\") >= 0)\n ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = ua.match(/ Gecko\\/\\d+/);\nexports.isOpera = typeof opera == \"object\" && 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.isEdge = parseFloat(ua.split(\" Edge/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isAndroid = ua.indexOf(\"Android\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\nexports.isMobile = exports.isIOS || exports.isAndroid;\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"./useragent\"); \nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.buildDom = function buildDom(arr, parent, refs) {\n if (typeof arr == \"string\" && arr) {\n var txt = document.createTextNode(arr);\n if (parent)\n parent.appendChild(txt);\n return txt;\n }\n \n if (!Array.isArray(arr)) {\n if (arr && arr.appendChild && parent)\n parent.appendChild(arr);\n return arr;\n }\n if (typeof arr[0] != \"string\" || !arr[0]) {\n var els = [];\n for (var i = 0; i < arr.length; i++) {\n var ch = buildDom(arr[i], parent, refs);\n ch && els.push(ch);\n }\n return els;\n }\n \n var el = document.createElement(arr[0]);\n var options = arr[1];\n var childIndex = 1;\n if (options && typeof options == \"object\" && !Array.isArray(options))\n childIndex = 2;\n for (var i = childIndex; i < arr.length; i++)\n buildDom(arr[i], el, refs);\n if (childIndex == 2) {\n Object.keys(options).forEach(function(n) {\n var val = options[n];\n if (n === \"class\") {\n el.className = Array.isArray(val) ? val.join(\" \") : val;\n } else if (typeof val == \"function\" || n == \"value\" || n[0] == \"$\") {\n el[n] = val;\n } else if (n === \"ref\") {\n if (refs) refs[val] = el;\n } else if (n === \"style\") {\n if (typeof val == \"string\") el.style.cssText = val;\n } else if (val != null) {\n el.setAttribute(n, val);\n }\n });\n }\n if (parent)\n parent.appendChild(el);\n return el;\n};\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.removeChildren = function(element) {\n element.innerHTML = \"\";\n};\n\nexports.createTextNode = function(textContent, element) {\n var doc = element ? element.ownerDocument : document;\n return doc.createTextNode(textContent);\n};\n\nexports.createFragment = function(element) {\n var doc = element ? element.ownerDocument : document;\n return doc.createDocumentFragment();\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 if ((sheets = doc.querySelectorAll(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id)\n return true;\n }\n};\n\nvar strictCSP;\nvar cssCache = [];\nexports.useStrictCSP = function(value) {\n strictCSP = value;\n if (value == false) insertPendingStyles();\n else if (!cssCache) cssCache = [];\n};\n\nfunction insertPendingStyles() {\n var cache = cssCache;\n cssCache = null;\n cache && cache.forEach(function(item) {\n importCssString(item[0], item[1]);\n });\n}\n\nfunction importCssString(cssText, id, target) {\n if (typeof document == \"undefined\")\n return;\n if (cssCache) {\n if (target) {\n insertPendingStyles();\n } else if (target === false) {\n return cssCache.push([cssText, id]);\n }\n }\n if (strictCSP) return;\n\n var container = target;\n if (!target || !target.getRootNode) {\n container = document;\n } else {\n container = target.getRootNode();\n if (!container || container == target)\n container = document;\n }\n \n var doc = container.ownerDocument || container;\n if (id && exports.hasCssString(id, container))\n return null;\n \n if (id)\n cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n \n var style = exports.createElement(\"style\");\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n if (container == doc)\n container = exports.getDocumentHead(doc);\n container.insertBefore(style, container.firstChild);\n}\nexports.importCssString = importCssString;\n\nexports.importCssStylsheet = function(uri, doc) {\n exports.buildDom([\"link\", {rel: \"stylesheet\", href: uri}], exports.getDocumentHead(doc));\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};\n\nexports.computedStyle = function(element, style) {\n return window.getComputedStyle(element, \"\") || {};\n};\n\nexports.setStyle = function(styles, property, value) {\n if (styles[property] !== value) {\n styles[property] = value;\n }\n};\n\nexports.HAS_CSS_ANIMATION = false;\nexports.HAS_CSS_TRANSFORMS = false;\nexports.HI_DPI = useragent.isWin\n ? typeof window !== \"undefined\" && window.devicePixelRatio >= 1.5\n : true;\n\nif (useragent.isChromeOS) exports.HI_DPI = false;\n\nif (typeof document !== \"undefined\") {\n var div = document.createElement(\"div\");\n if (exports.HI_DPI && div.style.transform !== undefined)\n exports.HAS_CSS_TRANSFORMS = true;\n if (!useragent.isEdge && typeof div.style.animationName !== \"undefined\")\n exports.HAS_CSS_ANIMATION = true;\n div = null;\n}\n\nif (exports.HAS_CSS_TRANSFORMS) {\n exports.translate = function(element, tx, ty) {\n element.style.transform = \"translate(\" + Math.round(tx) + \"px, \" + Math.round(ty) +\"px)\";\n };\n} else {\n exports.translate = function(element, tx, ty) {\n element.style.top = Math.round(ty) + \"px\";\n element.style.left = Math.round(tx) + \"px\";\n };\n}\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\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/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta',\n 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8, \n \"control\": 1\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 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\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 ret.KEY_MODS[0] = \"\";\n ret.KEY_MODS[-1] = \"input-\";\n\n return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n var keyString = Keys[keyCode];\n if (typeof keyString != \"string\")\n keyString = String.fromCharCode(keyCode);\n return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nvar activeListenerOptions;\nfunction detectListenerOptionsSupport() {\n activeListenerOptions = false;\n try {\n document.createComment(\"\").addEventListener(\"test\", function() {}, { \n get passive() { \n activeListenerOptions = {passive: false};\n }\n });\n } catch(e) {}\n}\n\nfunction getListenerOptions() {\n if (activeListenerOptions == undefined)\n detectListenerOptionsSupport();\n return activeListenerOptions;\n}\n\nfunction EventListener(elem, type, callback) {\n this.elem = elem;\n this.type = type;\n this.callback = callback;\n}\nEventListener.prototype.destroy = function() {\n removeListener(this.elem, this.type, this.callback);\n this.elem = this.type = this.callback = undefined;\n};\n\nvar addListener = exports.addListener = function(elem, type, callback, destroyer) {\n elem.addEventListener(type, callback, getListenerOptions());\n if (destroyer)\n destroyer.$toDestroy.push(new EventListener(elem, type, callback));\n};\n\nvar removeListener = exports.removeListener = function(elem, type, callback) {\n elem.removeEventListener(type, callback, getListenerOptions());\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};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\n};\nexports.getButton = function(e) {\n if (e.type == \"dblclick\")\n return 0;\n if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n return 2;\n return e.button;\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n var ownerDocument = el && el.ownerDocument || document;\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n removeListener(ownerDocument, \"mousemove\", eventHandler);\n removeListener(ownerDocument, \"mouseup\", onMouseUp);\n removeListener(ownerDocument, \"dragstart\", onMouseUp);\n }\n\n addListener(ownerDocument, \"mousemove\", eventHandler);\n addListener(ownerDocument, \"mouseup\", onMouseUp);\n addListener(ownerDocument, \"dragstart\", onMouseUp);\n \n return onMouseUp;\n};\n\nexports.addMouseWheelListener = function(el, callback, destroyer) {\n if (\"onmousewheel\" in el) {\n 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 }, destroyer);\n } else if (\"onwheel\" in el) {\n 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 }, destroyer);\n } else {\n 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 }, destroyer);\n }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) {\n var clicks = 0;\n var startX, startY, timer; \n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n function onMousedown(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 (!timer || isNewClick)\n clicks = 1;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n\n if (clicks == 1) {\n startX = e.clientX;\n startY = e.clientY;\n }\n }\n \n e._clicks = clicks;\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 if (!Array.isArray(elements))\n elements = [elements];\n elements.forEach(function(el) {\n addListener(el, \"mousedown\", onMousedown, destroyer);\n });\n};\n\nvar getModifierHash = 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 (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\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 = \"location\" in e ? e.location : e.keyLocation;\n if (keyCode === 17 && location === 1) {\n if (pressedKeys[keyCode] == 1)\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = e.timeStamp - ts;\n if (dt < 50)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\n keyCode = -1;\n }\n \n if (!hashId && keyCode === 13) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (location === 3) {\n callback(e, hashId, -keyCode);\n if (e.defaultPrevented)\n return;\n }\n }\n \n if (useragent.isChromeOS && hashId & 8) {\n callback(e, hashId, keyCode);\n if (e.defaultPrevented)\n return;\n else\n hashId &= ~8;\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\n\nexports.addCommandKeyListener = function(el, callback, destroyer) {\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n }, destroyer);\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n }, destroyer);\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n }, destroyer);\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 }, destroyer);\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n }, destroyer);\n\n if (!pressedKeys) {\n resetPressedKeys();\n addListener(window, \"focus\", resetPressedKeys);\n }\n }\n};\nfunction resetPressedKeys() {\n pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && 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 \n var listener = function(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n removeListener(win, \"message\", listener);\n callback();\n }\n };\n \n addListener(win, \"message\", listener);\n win.postMessage(messageName, \"*\");\n };\n}\n\nexports.$idleBlocked = false;\nexports.onIdle = function(cb, timeout) {\n return setTimeout(function handler() {\n if (!exports.$idleBlocked) {\n cb();\n } else {\n setTimeout(handler, 100);\n }\n }, timeout);\n};\n\nexports.$idleBlockId = null;\nexports.blockIdle = function(delay) {\n if (exports.$idleBlockId)\n clearTimeout(exports.$idleBlockId);\n \n exports.$idleBlocked = true;\n exports.$idleBlockId = setTimeout(function() {\n exports.$idleBlocked = false;\n }, delay || 100);\n};\n\nexports.nextFrame = typeof window == \"object\" && (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/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\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/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\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 Date.now() - 50)\n return true;\n return $cancelT = false;\n },\n cancel: function() {\n $cancelT = Date.now();\n }\n};\n\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/clipboard\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar clipboard = require(\"../clipboard\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE = useragent.isIE;\nvar HAS_FOCUS_ARGS = useragent.isChrome > 63;\nvar MAX_LINE_LENGTH = 400;\n\nvar KEYS = require(\"../lib/keys\");\nvar MODS = KEYS.KEY_MODS;\nvar isIOS = useragent.isIOS;\nvar valueResetRegex = isIOS ? /\\s/ : /\\n/;\nvar isMobile = useragent.isMobile;\n\nvar TextInput = function(parentNode, host) {\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\n\n text.setAttribute(\"wrap\", \"off\");\n text.setAttribute(\"autocorrect\", \"off\");\n text.setAttribute(\"autocapitalize\", \"off\");\n text.setAttribute(\"spellcheck\", false);\n\n text.style.opacity = \"0\";\n parentNode.insertBefore(text, parentNode.firstChild);\n\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var sendingText = false;\n var tempStyle = '';\n \n if (!isMobile)\n text.style.fontSize = \"1px\";\n\n var commandMode = false;\n var ignoreFocusEvents = false;\n \n var lastValue = \"\";\n var lastSelectionStart = 0;\n var lastSelectionEnd = 0;\n var lastRestoreEnd = 0;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function(e) {\n if (ignoreFocusEvents) return;\n host.onBlur(e);\n isFocused = false;\n }, host);\n event.addListener(text, \"focus\", function(e) {\n if (ignoreFocusEvents) return;\n isFocused = true;\n if (useragent.isEdge) {\n try {\n if (!document.hasFocus())\n return;\n } catch(e) {}\n }\n host.onFocus(e);\n if (useragent.isEdge)\n setTimeout(resetSelection);\n else\n resetSelection();\n }, host);\n this.$focusScroll = false;\n this.focus = function() {\n if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == \"browser\")\n return text.focus({ preventScroll: true });\n\n var top = text.style.top;\n text.style.position = \"fixed\";\n text.style.top = \"0px\";\n try {\n var isTransformed = text.getBoundingClientRect().top != 0;\n } catch(e) {\n return;\n }\n var ancestors = [];\n if (isTransformed) {\n var t = text.parentElement;\n while (t && t.nodeType == 1) {\n ancestors.push(t);\n t.setAttribute(\"ace_nocontext\", true);\n if (!t.parentElement && t.getRootNode)\n t = t.getRootNode().host;\n else\n t = t.parentElement;\n }\n }\n text.focus({ preventScroll: true });\n if (isTransformed) {\n ancestors.forEach(function(p) {\n p.removeAttribute(\"ace_nocontext\");\n });\n }\n setTimeout(function() {\n text.style.position = \"\";\n if (text.style.top == \"0px\")\n text.style.top = top;\n }, 0);\n };\n this.blur = function() {\n text.blur();\n };\n this.isFocused = function() {\n return isFocused;\n };\n \n host.on(\"beforeEndOperation\", function() {\n var curOp = host.curOp;\n var commandName = curOp && curOp.command && curOp.command.name;\n if (commandName == \"insertstring\")\n return;\n var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged);\n if (inComposition && isUserAction) {\n lastValue = text.value = \"\";\n onCompositionEnd();\n }\n resetSelection();\n });\n \n var resetSelection = isIOS\n ? function(value) {\n if (!isFocused || (copied && !value) || sendingText) return;\n if (!value) \n value = \"\";\n var newValue = \"\\n ab\" + value + \"cde fg\\n\";\n if (newValue != text.value)\n text.value = lastValue = newValue;\n \n var selectionStart = 4;\n var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1));\n\n if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) {\n text.setSelectionRange(selectionStart, selectionEnd);\n }\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n }\n : function() {\n if (inComposition || sendingText)\n return;\n if (!isFocused && !afterContextMenu)\n return;\n inComposition = true;\n \n var selectionStart = 0;\n var selectionEnd = 0;\n var line = \"\";\n\n if (host.session) {\n var selection = host.selection;\n var range = selection.getRange();\n var row = selection.cursor.row;\n selectionStart = range.start.column;\n selectionEnd = range.end.column;\n line = host.session.getLine(row);\n\n if (range.start.row != row) {\n var prevLine = host.session.getLine(row - 1);\n selectionStart = range.start.row < row - 1 ? 0 : selectionStart;\n selectionEnd += prevLine.length + 1;\n line = prevLine + \"\\n\" + line;\n }\n else if (range.end.row != row) {\n var nextLine = host.session.getLine(row + 1);\n selectionEnd = range.end.row > row + 1 ? nextLine.length : selectionEnd;\n selectionEnd += line.length + 1;\n line = line + \"\\n\" + nextLine;\n }\n else if (isMobile && row > 0) {\n line = \"\\n\" + line;\n selectionEnd += 1;\n selectionStart += 1;\n }\n\n if (line.length > MAX_LINE_LENGTH) {\n if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) {\n line = line.slice(0, MAX_LINE_LENGTH);\n } else {\n line = \"\\n\";\n if (selectionStart == selectionEnd) {\n selectionStart = selectionEnd = 0;\n }\n else {\n selectionStart = 0;\n selectionEnd = 1;\n }\n }\n }\n }\n\n var newValue = line + \"\\n\\n\";\n if (newValue != lastValue) {\n text.value = lastValue = newValue;\n lastSelectionStart = lastSelectionEnd = newValue.length;\n }\n if (afterContextMenu) {\n lastSelectionStart = text.selectionStart;\n lastSelectionEnd = text.selectionEnd;\n }\n if (\n lastSelectionEnd != selectionEnd \n || lastSelectionStart != selectionStart \n || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization\n ) {\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n } catch(e){}\n }\n inComposition = false;\n };\n this.resetSelection = resetSelection;\n\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd >= lastValue.length\n && text.value === lastValue && lastValue\n && text.selectionEnd !== lastSelectionEnd;\n };\n\n var onSelect = function(e) {\n if (inComposition)\n return;\n if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (isMobile && text.selectionStart != lastSelectionStart) {\n resetSelection();\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(value, fromInput) {\n if (afterContextMenu)\n afterContextMenu = false;\n if (pasted) {\n resetSelection();\n if (value)\n host.onPaste(value);\n pasted = false;\n return \"\";\n } else {\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n \n var extendLeft = lastSelectionStart;\n var extendRight = lastValue.length - lastSelectionEnd;\n \n var inserted = value;\n var restoreStart = value.length - selectionStart;\n var restoreEnd = value.length - selectionEnd;\n \n var i = 0;\n while (extendLeft > 0 && lastValue[i] == value[i]) {\n i++;\n extendLeft--;\n }\n inserted = inserted.slice(i);\n i = 1;\n while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) {\n i++;\n extendRight--;\n }\n restoreStart -= i-1;\n restoreEnd -= i-1;\n var endIndex = inserted.length - i + 1;\n if (endIndex < 0) {\n extendLeft = -endIndex;\n endIndex = 0;\n } \n inserted = inserted.slice(0, endIndex);\n if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd)\n return \"\";\n sendingText = true;\n var shouldReset = false;\n if (useragent.isAndroid && inserted == \". \") {\n inserted = \" \";\n shouldReset = true;\n }\n \n if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) {\n host.onTextInput(inserted);\n } else {\n host.onTextInput(inserted, {\n extendLeft: extendLeft,\n extendRight: extendRight,\n restoreStart: restoreStart,\n restoreEnd: restoreEnd\n });\n }\n sendingText = false;\n \n lastValue = value;\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n lastRestoreEnd = restoreEnd;\n return shouldReset ? \"\\n\" : inserted;\n }\n };\n var onInput = function(e) {\n if (inComposition)\n return onCompositionUpdate();\n if (e && e.inputType) {\n if (e.inputType == \"historyUndo\") return host.execCommand(\"undo\");\n if (e.inputType == \"historyRedo\") return host.execCommand(\"redo\");\n }\n var data = text.value;\n var inserted = sendText(data, true);\n if (\n data.length > MAX_LINE_LENGTH + 100 \n || valueResetRegex.test(inserted)\n || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd\n ) {\n resetSelection();\n }\n };\n \n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n if (isIOS) {\n resetSelection(data);\n copied = data;\n setTimeout(function () {\n copied = false;\n }, 10);\n }\n isCut ? host.onCut() : host.onCopy();\n event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n \n var onCut = function(e) {\n doCopy(e, true);\n };\n \n var onCopy = function(e) {\n doCopy(e, false);\n };\n \n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (clipboard.pasteCancelled())\n return;\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\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), host);\n\n event.addListener(text, \"select\", onSelect, host);\n event.addListener(text, \"input\", onInput, host);\n\n event.addListener(text, \"cut\", onCut, host);\n event.addListener(text, \"copy\", onCopy, host);\n event.addListener(text, \"paste\", onPaste, host);\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 }, host);\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly) \n return;\n \n inComposition = {};\n\n if (commandMode)\n return;\n \n if (e.data)\n inComposition.useTextareaForIME = false;\n \n setTimeout(onCompositionUpdate, 0);\n host._signal(\"compositionStart\");\n host.on(\"mousedown\", cancelComposition);\n \n var range = host.getSelectionRange();\n range.end.row = range.start.row;\n range.end.column = range.start.column;\n inComposition.markerRange = range;\n inComposition.selectionStart = lastSelectionStart;\n host.onCompositionStart(inComposition);\n \n if (inComposition.useTextareaForIME) {\n lastValue = text.value = \"\";\n lastSelectionStart = 0;\n lastSelectionEnd = 0;\n }\n else {\n if (text.msGetInputContext)\n inComposition.context = text.msGetInputContext();\n if (text.getInputContext)\n inComposition.context = text.getInputContext();\n }\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n if (commandMode)\n return cancelComposition();\n \n if (inComposition.useTextareaForIME) {\n host.onCompositionUpdate(text.value);\n }\n else {\n var data = text.value;\n sendText(data);\n if (inComposition.markerRange) {\n if (inComposition.context) {\n inComposition.markerRange.start.column = inComposition.selectionStart\n = inComposition.context.compositionStartOffset;\n }\n inComposition.markerRange.end.column = inComposition.markerRange.start.column\n + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd;\n }\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n inComposition = false;\n host.onCompositionEnd();\n host.off(\"mousedown\", cancelComposition);\n if (e) onInput();\n };\n \n\n function cancelComposition() {\n ignoreFocusEvents = true;\n text.blur();\n text.focus();\n ignoreFocusEvents = false;\n }\n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null);\n \n function onKeyup(e) {\n if (e.keyCode == 27 && text.value.length < text.selectionStart) {\n if (!inComposition)\n lastValue = text.value;\n lastSelectionStart = lastSelectionEnd = -1;\n resetSelection();\n }\n syncComposition();\n }\n\n event.addListener(text, \"compositionstart\", onCompositionStart, host);\n event.addListener(text, \"compositionupdate\", onCompositionUpdate, host);\n event.addListener(text, \"keyup\", onKeyup, host);\n event.addListener(text, \"keydown\", syncComposition, host);\n event.addListener(text, \"compositionend\", onCompositionEnd, host);\n\n this.getElement = function() {\n return text;\n };\n this.setCommandMode = function(value) {\n commandMode = value;\n text.readOnly = false;\n };\n \n this.setReadOnly = function(readOnly) {\n if (!commandMode)\n text.readOnly = readOnly;\n };\n\n this.setCopyWithEmptySelection = function(value) {\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection();\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n \n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + (useragent.isIE ? \"opacity:0.1;\" : \"\")\n + \"text-indent: -\" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + \"px;\";\n\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 -2;\n var move = function(e) {\n dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop));\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n host.renderer.$isMousePressed = true;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n host.renderer.$isMousePressed = false;\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$moveTextAreaToCursor();\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu, host);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n }, host);\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu, host);\n event.addListener(text, \"contextmenu\", onContextMenu, host);\n \n if (isIOS)\n addIosSelectionHandler(parentNode, host, text);\n\n function addIosSelectionHandler(parentNode, host, text) {\n var typingResetTimeout = null;\n var typing = false;\n \n text.addEventListener(\"keydown\", function (e) {\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\n typing = true;\n }, true);\n\n text.addEventListener(\"keyup\", function (e) {\n typingResetTimeout = setTimeout(function () {\n typing = false;\n }, 100);\n }, true);\n var detectArrowKeys = function(e) {\n if (document.activeElement !== text) return;\n if (typing || inComposition || host.$mouseHandler.isMousePressed) return;\n\n if (copied) {\n return;\n }\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n \n var key = null;\n var modifier = 0;\n if (selectionStart == 0) {\n key = KEYS.up;\n } else if (selectionStart == 1) {\n key = KEYS.home;\n } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == \"\\n\") {\n key = KEYS.end;\n } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == \" \") {\n key = KEYS.left;\n modifier = MODS.option;\n } else if (\n selectionStart < lastSelectionStart\n || (\n selectionStart == lastSelectionStart \n && lastSelectionEnd != lastSelectionStart\n && selectionStart == selectionEnd\n )\n ) {\n key = KEYS.left;\n } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split(\"\\n\").length > 2) {\n key = KEYS.down;\n } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == \" \") {\n key = KEYS.right;\n modifier = MODS.option;\n } else if (\n selectionEnd > lastSelectionEnd\n || (\n selectionEnd == lastSelectionEnd \n && lastSelectionEnd != lastSelectionStart\n && selectionStart == selectionEnd\n )\n ) {\n key = KEYS.right;\n }\n \n if (selectionStart !== selectionEnd)\n modifier |= MODS.shift;\n\n if (key) {\n var result = host.onCommandKey({}, modifier, key);\n if (!result && host.commands) {\n key = KEYS.keyCodeToString(key);\n var command = host.commands.findKeyCommand(modifier, key);\n if (command)\n host.execCommand(command);\n }\n lastSelectionStart = selectionStart;\n lastSelectionEnd = selectionEnd;\n resetSelection(\"\");\n }\n };\n document.addEventListener(\"selectionchange\", detectArrowKeys);\n host.on(\"destroy\", function() {\n document.removeEventListener(\"selectionchange\", detectArrowKeys);\n });\n }\n};\n\nexports.TextInput = TextInput;\nexports.$setUserAgentForTests = function(_isMobile, _isIOS) {\n isMobile = _isMobile;\n isIOS = _isIOS;\n};\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 550; // milliseconds\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 if (selectionEmpty || button == 1)\n editor.selection.moveToPosition(pos);\n if (button == 2) {\n editor.textInput.onContextMenu(ev.domEvent);\n if (!useragent.isMozilla)\n ev.preventDefault();\n }\n return;\n }\n\n this.mousedownEvent.time = Date.now();\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimeout && !this.$clickSelection && !editor.inMultiSelectMode) {\n this.setState(\"focusWait\");\n this.captureMouse(ev);\n return;\n }\n }\n\n this.captureMouse(ev);\n this.startSelect(pos, ev.domEvent._clicks > 1);\n return ev.preventDefault();\n };\n\n this.startSelect = function(pos, waitForClickSelection) {\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n var editor = this.editor;\n if (!this.mousedownEvent) return;\n if (this.mousedownEvent.getShiftKey())\n editor.selection.selectToPosition(pos);\n else if (!waitForClickSelection)\n editor.selection.moveToPosition(pos);\n if (!waitForClickSelection)\n this.select();\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 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 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 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 editor.renderer.scrollCursorIntoView();\n };\n\n this.selectEnd =\n this.selectAllEnd =\n this.selectByWordsEnd =\n this.selectByLinesEnd = function() {\n this.$clickSelection = null;\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.$focusTimeout)\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.select();\n };\n\n this.onTripleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n\n this.setState(\"selectByLines\");\n var range = editor.getSelectionRange();\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n } else {\n this.$clickSelection = editor.selection.getLineRange(pos.row);\n }\n this.select();\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 editor = this.editor;\n \n if (!this.$lastScroll)\n this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n \n var prevScroll = this.$lastScroll;\n var t = ev.domEvent.timeStamp;\n var dt = t - prevScroll.t;\n var vx = dt ? ev.wheelX / dt : prevScroll.vx;\n var vy = dt ? ev.wheelY / dt : prevScroll.vy;\n if (dt < SCROLL_COOLDOWN_T) {\n vx = (vx + prevScroll.vx) / 2;\n vy = (vy + prevScroll.vy) / 2;\n }\n \n var direction = Math.abs(vx / vy);\n \n var canScroll = false;\n if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n canScroll = true;\n if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n canScroll = true;\n \n if (canScroll) {\n prevScroll.allowed = t;\n } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx)\n && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy);\n if (isSlower) {\n canScroll = true;\n prevScroll.allowed = t;\n }\n else {\n prevScroll.allowed = 0;\n }\n }\n \n prevScroll.t = t;\n prevScroll.vx = vx;\n prevScroll.vy = vy;\n\n if (canScroll) {\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/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\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 this.getElement().textContent = 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 this.destroy = function() {\n this.isOpen = false;\n if (this.$element && this.$element.parentNode) {\n this.$element.parentNode.removeChild(this.$element);\n }\n };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\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\"use strict\";\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._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\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._signal(\"hideGutterTooltip\", tooltip);\n editor.off(\"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 }, editor);\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/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\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/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\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 dragImage = dom.createElement(\"div\");\n dragImage.style.cssText = \"top:-100px;position:absolute;z-index:2147483647;opacity:0.5\";\n dragImage.textContent = \"\\xa0\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.on(\"mousedown\", this.onMouseDown.bind(mouseHandler));\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 editor.container.appendChild(dragImage);\n\n dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0);\n setTimeout(function() {\n editor.container.removeChild(dragImage);\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.$resetCursorStyle();\n }\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\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 x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\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 (!dragCursor)\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), editor);\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler), editor);\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler), editor);\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.moveCursorToPosition(cursor);\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 onDragInterval();\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.selection.fromOrientedRange(range);\n if (editor.isFocused() && !isInternal)\n editor.$resetCursorStyle();\n range = null;\n dragCursor = 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.$resetCursorStyle();\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var editor = this.editor;\n var target = editor.container;\n target.draggable = true;\n editor.renderer.$cursorLayer.setBlinking(false);\n editor.setStyle(\"ace_dragging\");\n var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n editor.renderer.setCursorStyle(cursorStyle);\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/mouse/touch_handler\",[\"require\",\"exports\",\"module\",\"ace/mouse/mouse_event\",\"ace/lib/event\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar event = require(\"../lib/event\");\nvar dom = require(\"../lib/dom\");\n\nexports.addTouchListeners = function(el, editor) {\n var mode = \"scroll\";\n var startX;\n var startY;\n var touchStartT;\n var lastT;\n var longTouchTimer;\n var animationTimer;\n var animationSteps = 0;\n var pos;\n var clickCount = 0;\n var vX = 0;\n var vY = 0;\n var pressed;\n var contextMenu;\n \n function createContextMenu() {\n var clipboard = window.navigator && window.navigator.clipboard;\n var isOpen = false;\n var updateMenu = function() {\n var selected = editor.getCopyText();\n var hasUndo = editor.session.getUndoManager().hasUndo();\n contextMenu.replaceChild(\n dom.buildDom(isOpen ? [\"span\",\n !selected && [\"span\", { class: \"ace_mobile-button\", action: \"selectall\" }, \"Select All\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"copy\" }, \"Copy\"],\n selected && [\"span\", { class: \"ace_mobile-button\", action: \"cut\" }, \"Cut\"],\n clipboard && [\"span\", { class: \"ace_mobile-button\", action: \"paste\" }, \"Paste\"],\n hasUndo && [\"span\", { class: \"ace_mobile-button\", action: \"undo\" }, \"Undo\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"find\" }, \"Find\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"openCommandPallete\" }, \"Pallete\"]\n ] : [\"span\"]),\n contextMenu.firstChild\n );\n };\n var handleClick = function(e) {\n var action = e.target.getAttribute(\"action\");\n\n if (action == \"more\" || !isOpen) {\n isOpen = !isOpen;\n return updateMenu();\n }\n if (action == \"paste\") {\n clipboard.readText().then(function (text) {\n editor.execCommand(action, text);\n });\n }\n else if (action) {\n if (action == \"cut\" || action == \"copy\") {\n if (clipboard)\n clipboard.writeText(editor.getCopyText());\n else\n document.execCommand(\"copy\");\n }\n editor.execCommand(action);\n }\n contextMenu.firstChild.style.display = \"none\";\n isOpen = false;\n if (action != \"openCommandPallete\")\n editor.focus();\n };\n contextMenu = dom.buildDom([\"div\",\n {\n class: \"ace_mobile-menu\",\n ontouchstart: function(e) {\n mode = \"menu\";\n e.stopPropagation();\n e.preventDefault();\n editor.textInput.focus();\n },\n ontouchend: function(e) {\n e.stopPropagation();\n e.preventDefault();\n handleClick(e);\n },\n onclick: handleClick\n },\n [\"span\"],\n [\"span\", { class: \"ace_mobile-button\", action: \"more\" }, \"...\"]\n ], editor.container);\n }\n function showContextMenu() {\n if (!contextMenu) createContextMenu();\n var cursor = editor.selection.cursor;\n var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column);\n var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX;\n var scrollLeft = editor.renderer.scrollLeft;\n var rect = editor.container.getBoundingClientRect();\n contextMenu.style.top = pagePos.pageY - rect.top - 3 + \"px\";\n if (pagePos.pageX - rect.left < rect.width - 70) {\n contextMenu.style.left = \"\";\n contextMenu.style.right = \"10px\";\n } else {\n contextMenu.style.right = \"\";\n contextMenu.style.left = leftOffset + scrollLeft - rect.left + \"px\";\n }\n contextMenu.style.display = \"\";\n contextMenu.firstChild.style.display = \"none\";\n editor.on(\"input\", hideContextMenu);\n }\n function hideContextMenu(e) {\n if (contextMenu)\n contextMenu.style.display = \"none\";\n editor.off(\"input\", hideContextMenu);\n }\n\n function handleLongTap() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n var range = editor.selection.getRange();\n var inSelection = range.contains(pos.row, pos.column);\n if (range.isEmpty() || !inSelection) {\n editor.selection.moveToPosition(pos);\n editor.selection.selectWord();\n }\n mode = \"wait\";\n showContextMenu();\n }\n function switchToSelectionMode() {\n longTouchTimer = null;\n clearTimeout(longTouchTimer);\n editor.selection.moveToPosition(pos);\n var range = clickCount >= 2\n ? editor.selection.getLineRange(pos.row)\n : editor.session.getBracketRange(pos);\n if (range && !range.isEmpty()) {\n editor.selection.setRange(range);\n } else {\n editor.selection.selectWord();\n }\n mode = \"wait\";\n }\n event.addListener(el, \"contextmenu\", function(e) {\n if (!pressed) return;\n var textarea = editor.textInput.getElement();\n textarea.focus();\n }, editor);\n event.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n if (longTouchTimer || touches.length > 1) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n touchStartT = -1;\n mode = \"zoom\";\n return;\n }\n \n pressed = editor.$mouseHandler.isMousePressed = true;\n var h = editor.renderer.layerConfig.lineHeight;\n var w = editor.renderer.layerConfig.lineHeight;\n var t = e.timeStamp;\n lastT = t;\n var touchObj = touches[0];\n var x = touchObj.clientX;\n var y = touchObj.clientY;\n if (Math.abs(startX - x) + Math.abs(startY - y) > h)\n touchStartT = -1;\n \n startX = e.clientX = x;\n startY = e.clientY = y;\n vX = vY = 0;\n \n var ev = new MouseEvent(e, editor);\n pos = ev.getDocumentPosition();\n\n if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) {\n clickCount++;\n e.preventDefault();\n e.button = 0;\n switchToSelectionMode();\n } else {\n clickCount = 0;\n var cursor = editor.selection.cursor;\n var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor;\n \n var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true);\n var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true);\n var rect = editor.renderer.scroller.getBoundingClientRect();\n var offsetTop = editor.renderer.layerConfig.offset;\n var offsetLeft = editor.renderer.scrollLeft;\n var weightedDistance = function(x, y) {\n x = x / w;\n y = y / h - 0.75;\n return x * x + y * y;\n };\n \n if (e.clientX < rect.left) {\n mode = \"zoom\";\n return;\n }\n \n var diff1 = weightedDistance(\n e.clientX - rect.left - cursorPos.left + offsetLeft,\n e.clientY - rect.top - cursorPos.top + offsetTop\n );\n var diff2 = weightedDistance(\n e.clientX - rect.left - anchorPos.left + offsetLeft,\n e.clientY - rect.top - anchorPos.top + offsetTop\n );\n if (diff1 < 3.5 && diff2 < 3.5)\n mode = diff1 > diff2 ? \"cursor\" : \"anchor\";\n \n if (diff2 < 3.5)\n mode = \"anchor\";\n else if (diff1 < 3.5)\n mode = \"cursor\";\n else\n mode = \"scroll\";\n longTouchTimer = setTimeout(handleLongTap, 450);\n }\n touchStartT = t;\n }, editor);\n\n event.addListener(el, \"touchend\", function (e) {\n pressed = editor.$mouseHandler.isMousePressed = false;\n if (animationTimer) clearInterval(animationTimer);\n if (mode == \"zoom\") {\n mode = \"\";\n animationSteps = 0;\n } else if (longTouchTimer) {\n editor.selection.moveToPosition(pos);\n animationSteps = 0;\n showContextMenu();\n } else if (mode == \"scroll\") {\n animate();\n hideContextMenu();\n } else {\n showContextMenu();\n }\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }, editor);\n event.addListener(el, \"touchmove\", function (e) {\n if (longTouchTimer) {\n clearTimeout(longTouchTimer);\n longTouchTimer = null;\n }\n var touches = e.touches;\n if (touches.length > 1 || mode == \"zoom\") return;\n\n var touchObj = touches[0];\n\n var wheelX = startX - touchObj.clientX;\n var wheelY = startY - touchObj.clientY;\n\n if (mode == \"wait\") {\n if (wheelX * wheelX + wheelY * wheelY > 4)\n mode = \"cursor\";\n else\n return e.preventDefault();\n }\n\n startX = touchObj.clientX;\n startY = touchObj.clientY;\n\n e.clientX = touchObj.clientX;\n e.clientY = touchObj.clientY;\n\n var t = e.timeStamp;\n var dt = t - lastT;\n lastT = t;\n if (mode == \"scroll\") {\n var mouseEvent = new MouseEvent(e, editor);\n mouseEvent.speed = 1;\n mouseEvent.wheelX = wheelX;\n mouseEvent.wheelY = wheelY;\n if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0;\n if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0;\n if (dt != 0) {\n vX = wheelX / dt;\n vY = wheelY / dt;\n }\n editor._emit(\"mousewheel\", mouseEvent);\n if (!mouseEvent.propagationStopped) {\n vX = vY = 0;\n }\n }\n else {\n var ev = new MouseEvent(e, editor);\n var pos = ev.getDocumentPosition();\n if (mode == \"cursor\")\n editor.selection.moveCursorToPosition(pos);\n else if (mode == \"anchor\")\n editor.selection.setSelectionAnchor(pos.row, pos.column);\n editor.renderer.scrollCursorIntoView(pos);\n e.preventDefault();\n }\n }, editor);\n\n function animate() {\n animationSteps += 60;\n animationTimer = setInterval(function() {\n if (animationSteps-- <= 0) {\n clearInterval(animationTimer);\n animationTimer = null;\n }\n if (Math.abs(vX) < 0.01) vX = 0;\n if (Math.abs(vY) < 0.01) vY = 0;\n if (animationSteps < 20) vX = 0.9 * vX;\n if (animationSteps < 20) vY = 0.9 * vY;\n var oldScrollTop = editor.session.getScrollTop();\n editor.renderer.scrollBy(10 * vX, 10 * vY);\n if (oldScrollTop == editor.session.getScrollTop())\n animationSteps = 0;\n }, 10);\n }\n};\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\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};\nexports.qualifyURL = function(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.href;\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\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 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 \n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n reportErrorIfPathIsNotConfigured();\n};\n\nvar reportErrorIfPathIsNotConfigured = function() {\n if (\n !options.basePath && !options.workerPath \n && !options.modePath && !options.themePath\n && !Object.keys(options.$moduleUrls).length\n ) {\n console.error(\n \"Unable to infer path to ace from script src,\",\n \"use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes\",\n \"or with webpack use ace/webpack-resolver\"\n );\n reportErrorIfPathIsNotConfigured = function() {};\n }\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n var currentDocument = currentScript && currentScript.ownerDocument || document;\n \n var scripts = currentDocument.getElementsByTagName(\"script\");\n for (var i=0; i 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\t\t\t\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\t\t\t\t\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\t\t\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\t\n\tif (hi == 0) {\t\t\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\t\t\t\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\t\t\n\treturn ON;\t\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\nexports.RLE = 7;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\t\t\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = []; \n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) \n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\t\t\t\t\n\tif (chars[0] === '\\u202B')\n\t\tlevels[0] = exports.RLE;\n\t\t\t\t\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\t\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar bidiUtil = require(\"./lib/bidiutil\");\nvar lang = require(\"./lib/lang\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\u202B]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.$isRtl = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.EOF = \"\\xB6\";\n this.RLE = \"\\u202B\";\n this.contentWidth = 0;\n this.fontMetrics = null;\n this.rtlLineOffset = 0;\n this.wrapOffset = 0;\n this.isMoveLeftOperation = false;\n this.seenBidi = bidiRE.test(session.getValue());\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n } \n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n } else {\n splitIndex = this.currentRow;\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n \n var isLastRow = (docRow === this.session.getLength() - 1),\n endOfLine = isLastRow ? this.EOF : this.EOL;\n\n this.wrapIndent = 0;\n this.line = this.session.getLine(docRow);\n this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE;\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L];\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splitIndex]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n if (splitIndex == splits.length)\n this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT;\n } else {\n this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT;\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n\n if (this.isRtlDir) {\n this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line;\n this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width;\n }\n };\n \n this.updateBidiMap = function() {\n var textCharTypes = [];\n if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) {\n this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n this.fontMetrics = fontMetrics;\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0;\n\n this.currentRow = null;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar; \n };\n\n this.setContentWidth = function(width) {\n this.contentWidth = width;\n };\n\n this.isRtlLine = function(row) {\n if (this.$isRtl) return true;\n if (row != undefined)\n return (this.session.getLine(row).charAt(0) == this.RLE);\n else\n return this.isRtlDir; \n };\n\n this.setRtlDirection = function(editor, isRtlDir) {\n var cursor = editor.getCursorPosition(); \n for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) {\n if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE)\n editor.session.doc.removeInLine(row, 0, 1);\n else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE)\n editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE);\n }\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0;\n var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n \n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0))\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n if (this.isRtlDir)\n left += this.rtlLineOffset;\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0,\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n \n if (this.wrapIndent)\n offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n if(this.isRtlDir) {\n for (var i = 0; i < selections.length; i++) {\n selections[i].left += this.rtlLineOffset;\n }\n }\n return selections;\n };\n this.offsetToCol = function(posX) {\n if(this.isRtlDir)\n posX -= this.rtlLineOffset;\n\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset;\n \n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n \n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n if (logicalIdx === 0 && this.isRtlDir)\n logicalIdx++;\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\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\"use strict\";\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.cursor = this.lead = this.doc.createAnchor(0, 0);\n this.anchor = this.doc.createAnchor(0, 0);\n this.$silent = false;\n\n var self = this;\n this.cursor.on(\"change\", function(e) {\n self.$cursorChanged = true;\n if (!self.$silent)\n self._emit(\"changeCursor\");\n if (!self.$isEmpty && !self.$silent)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.anchor.on(\"change\", function() {\n self.$anchorChanged = true;\n if (!self.$isEmpty && !self.$silent)\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 return !this.$isEmpty && this.anchor.row != this.cursor.row;\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.$isEmpty = false;\n this.anchor.setPosition(row, column);\n };\n this.getAnchor = \n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n \n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\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 return this.isBackwards()\n ? Range.fromPoints(lead, anchor)\n : Range.fromPoints(anchor, lead);\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n var start = reverse ? range.end : range.start;\n var end = reverse ? range.start : range.end;\n this.$setSelection(start.row, start.column, end.row, end.column);\n };\n\n this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) {\n if (this.$silent)\n return;\n var wasEmpty = this.$isEmpty;\n var wasMultiselect = this.inMultiSelectMode;\n this.$silent = true;\n this.$cursorChanged = this.$anchorChanged = false;\n this.anchor.setPosition(anchorRow, anchorColumn);\n this.cursor.setPosition(cursorRow, cursorColumn);\n this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor);\n this.$silent = false;\n if (this.$cursorChanged)\n this._emit(\"changeCursor\");\n if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect)\n this._emit(\"changeSelection\");\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.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\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.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\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.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\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 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 (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 (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 this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (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 (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 index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (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 var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n \n if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) {\n var widget = this.session.lineWidgets[this.lead.row];\n if (rows < 0)\n rows -= widget.rowsAbove || 0;\n else if (rows > 0)\n rows += widget.rowCount - (widget.rowsAbove || 0);\n }\n \n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n \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 var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\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 };\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 this.getRangeOfMovements = function(func) {\n var start = this.getCursor();\n try {\n func(this);\n var end = this.getCursor();\n return Range.fromPoints(start, end);\n } catch(e) {\n return Range.fromPoints(start, start);\n } finally {\n this.moveCursorToPosition(start);\n }\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 && data.length > 1) {\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[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else {\n data = data[0];\n }\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/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar config = require(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\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 this.reportError(\"number of classes and regexp groups doesn't match\", { \n rule: rule,\n groupCount: matchcount - 1\n });\n rule.token = rule.token[0];\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 }\n \n if (!ruleRegExps.length) {\n mapping[0] = 0;\n ruleRegExps.push(\"$\");\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 if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\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 if (startState === \"#tmp\") {\n stack.shift();\n startState = stack.shift();\n }\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 var matchAttempts = 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, line);\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 \n state = this.states[currentState];\n if (!state) {\n this.reportError(\"state doesn't exist\", currentState);\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 if (rule.consumeLineEnd)\n lastIndex = index;\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 (matchAttempts++ > MAX_TOKEN_COUNT) {\n if (matchAttempts > 2 * line.length) {\n this.reportError(\"infinite loop with in ace tokenizer\", {\n startState: startState,\n line: line\n });\n }\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 500),\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(\"#tmp\", currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n \n this.reportError = config.reportError;\n \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\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 || rule.onMatch) {\n if (typeof rule.next == \"string\") {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\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 var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\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 var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\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 }\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 this.$keywordList = [];\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; ) {\n var word = list[i];\n this.$keywordList.push(word);\n if (ignoreCase)\n word = word.toLowerCase(); \n keywords[word] = className;\n }\n }, this);\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/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\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});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\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 this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"rparen\", \"paren\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\nvar initContext = function(editor) {\n var id = -1;\n if (editor.multiSelect) {\n id = editor.selection.index;\n if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n contextCache = {rangeCount: editor.multiSelect.rangeCount};\n }\n if (contextCache[id])\n return context = contextCache[id];\n context = contextCache[id] = {\n autoInsertedBrackets: 0,\n autoInsertedRow: -1,\n autoInsertedLineEnd: \"\",\n maybeInsertedBrackets: 0,\n maybeInsertedRow: -1,\n maybeInsertedLineStart: \"\",\n maybeInsertedLineEnd: \"\"\n };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\n this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (text == '{') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n return {\n text: '{}',\n selection: [1, 1]\n };\n } else {\n CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n return {\n text: '{',\n selection: [1, 1]\n };\n }\n }\n } else if (text == '}') {\n initContext(editor);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == '}') {\n var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n } else if (text == \"\\n\" || text == \"\\r\\n\") {\n initContext(editor);\n var closing = \"\";\n if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar === '}') {\n var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n if (!openBracePos)\n return null;\n var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n } else if (closing) {\n var next_indent = this.$getIndent(line);\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n return;\n }\n var indent = next_indent + session.getTabString();\n\n return {\n text: '\\n' + indent + '\\n' + next_indent + closing,\n selection: [1, indent.length, 1, indent.length]\n };\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n });\n\n this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '{') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.end.column, range.end.column + 1);\n if (rightChar == '}') {\n range.end.column++;\n return range;\n } else {\n context.maybeInsertedBrackets--;\n }\n }\n });\n\n this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '(') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '(', ')');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n return {\n text: '()',\n selection: [1, 1]\n };\n }\n } else if (text == ')') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ')') {\n var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '(') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ')') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '[') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '[', ']');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n return {\n text: '[]',\n selection: [1, 1]\n };\n }\n } else if (text == ']') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ']') {\n var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '[') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ']') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) \n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var leftChar = line.substring(cursor.column-1, cursor.column);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n \n var token = session.getTokenAt(cursor.row, cursor.column);\n var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n return null;\n \n var stringBefore = token && /string|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n \n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\n } else {\n if (stringBefore && !stringAfter)\n return null; // wrap string with different quote\n if (stringBefore && stringAfter)\n return null; // do not pair quotes inside strings\n var wordRe = session.$mode.tokenRe;\n wordRe.lastIndex = 0;\n var isWordBefore = wordRe.test(leftChar);\n wordRe.lastIndex = 0;\n var isWordAfter = wordRe.test(leftChar);\n if (isWordBefore || isWordAfter)\n return null; // before or after alphanumeric\n if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n return null; // there is rightChar and it isn't closing\n var charBefore = line[cursor.column - 2];\n if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore)))\n return null;\n pair = true;\n }\n return {\n text: pair ? quote + quote : \"\",\n selection: [1,1]\n };\n }\n }\n });\n\n this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == selected) {\n range.end.column++;\n return range;\n }\n }\n });\n\n};\n\n \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n var cursor = editor.getCursorPosition();\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n if (/[)}\\]]/.test(editor.session.getLine(cursor.row)[cursor.column]))\n return true;\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n return false;\n }\n iterator.stepForward();\n return iterator.getCurrentTokenRow() !== cursor.row ||\n this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n context.autoInsertedBrackets = 0;\n context.autoInsertedRow = cursor.row;\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isMaybeInsertedClosing(cursor, line))\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = cursor.row;\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n context.maybeInsertedLineEnd = line.substr(cursor.column);\n context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n return context.autoInsertedBrackets > 0 &&\n cursor.row === context.autoInsertedRow &&\n bracket === context.autoInsertedLineEnd[0] &&\n line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n return context.maybeInsertedBrackets > 0 &&\n cursor.row === context.maybeInsertedRow &&\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n if (context) {\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = -1;\n }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar wordChars = [48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2];\n\nvar code = 0;\nvar str = [];\nfor (var i = 0; i < wordChars.length; i += 2) {\n str.push(code += wordChars[i]);\n if (wordChars[i + 1])\n str.push(45, code += wordChars[i + 1]);\n}\n\nexports.wordChars = String.fromCharCode.apply(null, str);\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar config = require(\"../config\");\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\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};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\" + unicode.wordChars + \"\\\\$_]+\", \"g\");\n\n this.nonTokenRe = new RegExp(\"^(?:[^\" + unicode.wordChars + \"\\\\$_]|\\\\s])+\", \"g\");\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\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 };\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 var Mode = mapping[i];\n var id = Mode.prototype.$id;\n var mode = config.$modes[id];\n if (!mode)\n config.$modes[id] = mode = new Mode();\n if (!config.$modes[i])\n config.$modes[i] = mode;\n this.$embeds.push(i);\n this.$modes[i] = mode;\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] || \"start\";\n if (typeof state != \"string\") {\n if (Array.isArray(state[2])) {\n var language = state[2][state[2].length - 1];\n var mode = this.$modes[language];\n if (mode)\n return mode[method].apply(mode, [state[1]].concat([].slice.call(args, 1)));\n }\n state = state[0] || \"start\";\n }\n \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/apply_delta\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\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(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\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.off(\"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/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar applyDelta = require(\"./apply_delta\").applyDelta;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).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\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 return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n 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 }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\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 {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\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 var end;\n if (text) {\n 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 this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000) {\n this.$splitAndapplyLargeDelta(delta, 20000);\n }\n else {\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n }\n };\n \n this.$safeApplyDelta = function(delta) {\n var docLength = this.$lines.length;\n if (\n delta.action == \"remove\" && delta.start.row < docLength && delta.end.row < docLength\n || delta.action == \"insert\" && delta.start.row <= docLength\n ) {\n this.applyDelta(delta);\n }\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length - MAX + 1;\n var row = delta.start.row; \n var column = delta.start.column;\n for (var from = 0, to = 0; from < l; from = to) {\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n }\n delta.lines = lines.slice(from);\n delta.start.row = row + from;\n delta.start.column = column;\n this.applyDelta(delta, true);\n };\n this.revertDelta = function(delta) {\n this.$safeApplyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\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: index + lines[l-1].length + newlineLength};\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\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\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 var startLine = currentLine;\n while (self.lines[currentLine])\n 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 break;\n }\n }\n self.currentLine = currentLine;\n \n if (endLine == -1)\n endLine = 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 startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\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\"use strict\";\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/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\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 cmp, 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 cmp = fold.range.compareStart(endRow, endColumn);\n if (cmp == -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 || cmp === 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 pos = this.getNextFoldTo(row, column);\n \n if (!pos || pos.kind == \"inside\")\n return null;\n \n var fold = pos.fold;\n var folds = this.folds;\n var foldData = this.foldData;\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\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/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar Range = require(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n this.$bias = 1;\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.apply(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(delta) {\n var start = delta.start;\n var end = delta.end;\n var startRow = start.row;\n var endRow = end.row;\n var ranges = this.ranges;\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row >= startRow)\n break;\n }\n \n if (delta.action == \"insert\") {\n var lineDif = endRow - startRow;\n var colDiff = -start.column + end.column;\n for (; i < n; i++) {\n var r = ranges[i];\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.$bias <= 0) {\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.$bias < 0) {\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 } else {\n var lineDif = startRow - endRow;\n var colDiff = start.column - end.column;\n for (; i < n; i++) {\n var r = ranges[i];\n \n if (r.start.row > endRow)\n break;\n \n if (r.end.row < endRow\n && (\n startRow < r.end.row \n || startRow == r.end.row && start.column < r.end.column\n )\n ) {\n r.end.row = startRow;\n r.end.column = start.column;\n }\n else if (r.end.row == endRow) {\n if (r.end.column <= end.column) {\n if (lineDif || r.end.column > start.column) {\n r.end.column = start.column;\n r.end.row = start.row;\n }\n }\n else {\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n else if (r.end.row > endRow) {\n r.end.row += lineDif;\n }\n \n if (r.start.row < endRow\n && (\n startRow < r.start.row \n || startRow == r.start.row && start.column < r.start.column\n )\n ) {\n r.start.row = startRow;\n r.start.column = start.column;\n }\n else if (r.start.row == endRow) {\n if (r.start.column <= end.column) {\n if (lineDif || r.start.column > start.column) {\n r.start.column = start.column;\n r.start.row = start.row;\n }\n }\n else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n else if (r.start.row > endRow) {\n r.start.row += lineDif;\n }\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/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\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 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 var firstConsumed = 0;\n\n if (cmp == 0) {\n if (afterStart.range.containsRange(fold))\n return afterStart.addSubFold(fold);\n else\n firstConsumed = 1;\n }\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 if (cmp == 0) j++;\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length;\n for (var k = firstConsumed; k < last; k++) {\n fold.addSubFold(consumedFolds[k]);\n }\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/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\"use strict\";\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 range = folds[i].range;\n if (range.contains(row, column)) {\n if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) {\n continue;\n } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) {\n continue;\n }\n return folds[i];\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\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 (startFold && !startFold.range.isStart(startRow, startColumn))\n this.removeFold(startFold);\n \n if (endFold && !endFold.range.isEnd(endRow, endColumn))\n this.removeFold(endFold);\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n if (!fold.collapseChildren) {\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\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._signal(\"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._signal(\"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 if (expandInner == null) 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 if (Array.isArray(location)) {\n folds = [];\n location.forEach(function(range) {\n folds = folds.concat(this.unfold(range));\n }, this);\n return folds;\n } else {\n range = location;\n }\n \n folds = this.getFoldsInRangeList(range);\n var outermostFolds = folds;\n while (\n folds.length == 1\n && Range.comparePoints(folds[0].start, range.start) < 0 \n && Range.comparePoints(folds[0].end, range.end) > 0\n ) {\n this.expandFolds(folds);\n folds = this.getFoldsInRangeList(range);\n }\n \n if (expandInner != false) {\n this.removeFolds(folds);\n } else {\n this.expandFolds(folds);\n }\n if (outermostFolds.length)\n return outermostFolds;\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 if (startColumn == null)\n startColumn = 0;\n if (endRow == null)\n endRow = foldLine.end.row;\n if (endColumn == null)\n endColumn = this.getLine(endRow).length;\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 var type = token && token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\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 var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\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, test) {\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 if (test && !test(row)) 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 range.collapseChildren = depth;\n this.addFold(\"...\", range);\n }\n }\n };\n \n this.foldToLevel = function(level) {\n this.foldAll();\n while (level-- > 0)\n this.unfold(null, false);\n };\n \n this.foldAllComments = function() {\n var session = this;\n this.foldAll(null, null, null, function(row) {\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token.type == \"text\" && /^\\s+$/.test(token.value))\n continue;\n if (/comment/.test(token.type))\n return true;\n return false;\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.off('change', this.$updateFoldWidgets);\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n this._signal(\"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.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\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 fold;\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 fold;\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, endRow, 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(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\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 this.tokenizerUpdateFoldWidgets = function(e) {\n var rows = e.data;\n if (rows.first != rows.last) {\n if (this.foldWidgets.length > rows.first)\n this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n }\n };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\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 this.getMatchingBracketRanges = function(pos) {\n var line = this.getLine(pos.row);\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 }\n\n if (!match)\n return null;\n\n var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column);\n var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos)\n : this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return [startRange];\n var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1);\n\n return [startRange, endRange];\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\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 .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\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 .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\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/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/bidihandler\",\"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\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar BidiHandler = require(\"./bidihandler\").BidiHandler;\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.id = \"session\" + (++EditSession.$uid);\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 this.$bidiHandler = new BidiHandler(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.off(\"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(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager) {\n if (removedFolds && removedFolds.length) {\n this.$undoManager.add({\n action: \"removeFolds\",\n folds: removedFolds\n }, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n }\n this.$undoManager.add(delta, this.mergeUndoDeltas);\n this.mergeUndoDeltas = true;\n \n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\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 var 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 \n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n \n if (undoManager) {\n var self = this;\n undoManager.addSession(this);\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n self.mergeUndoDeltas = false;\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n } else {\n this.$syncInformUndoManager = function() {};\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 hasUndo: function() {},\n hasRedo: function() {},\n reset: function() {},\n add: function() {},\n addSelection: function() {},\n startNewGroup: function() {},\n addSession: 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 this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\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 = config.$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 this.$onChangeMode(this.$modes[path]);\n } else 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 }\n cb && cb();\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 var oldMode = this.$mode;\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.on !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.on(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.on(\"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 if (mode.attachToSession)\n mode.attachToSession(this);\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\", {oldMode: oldMode, mode: mode});\n }\n };\n\n this.$stopWorker = function() {\n if (this.$worker) {\n this.$worker.terminate();\n this.$worker = null;\n }\n };\n\n this.$startWorker = function() {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n config.warn(\"Could not load worker\", e);\n this.$worker = null;\n }\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.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.revertDelta(delta);\n } else if (delta.folds) {\n this.addFolds(delta.folds);\n }\n }\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionBefore)\n this.selection.fromJSON(deltas.selectionBefore);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, true));\n }\n this.$fromUndo = false;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.action == \"insert\" || delta.action == \"remove\") {\n this.doc.$safeApplyDelta(delta);\n }\n }\n\n if (!dontSelect && this.$undoSelect) {\n if (deltas.selectionAfter)\n this.selection.fromJSON(deltas.selectionAfter);\n else\n this.selection.setRange(this.$getUndoSelection(deltas, false));\n }\n this.$fromUndo = false;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var range, point;\n\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (!delta.start) continue; // skip folds\n if (!range) {\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n }\n continue;\n }\n \n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\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.doc.insertInLine({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.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(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 = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\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(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\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 if (foldLine) {\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n }\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(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\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, tabSize) {\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 var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var len = screenPos - lastSplit;\n for (var i = lastSplit; i < screenPos; i++) {\n var ch = tokens[i];\n if (ch === 12 || ch === 2) len -= 1;\n }\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\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 - (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 if (tokens[split] == CHAR_EXT)\n split--;\n addSplit(split - indent);\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 var h = 1;\n if (this.lineWidgets)\n h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n \n if (!this.$useWrapMode || !this.$wrapData[row])\n return h;\n else\n return this.$wrapData[row].length + h;\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\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\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 | 0);\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, offsetX) {\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 var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[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 var wrapIndent = 0;\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 wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n \n if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove)\n screenRow += this.lineWidgets[row].rowsAbove;\n\n return {\n row: screenRow,\n column: wrapIndent + 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 if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n this.removeAllListeners();\n if (this.doc) {\n this.doc.off(\"change\", this.$onChange);\n }\n this.selection.detach();\n };\n\n this.isFullWidth = isFullWidth;\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 this.$wrap = value;\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 },\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.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: {\n set: function() {\n if (this.$useWrapMode) {\n this.$useWrapMode = false;\n this.setUseWrapMode(true);\n }\n },\n initialValue: true \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 tabSize = parseInt(tabSize);\n if (tabSize > 0 && this.$tabSize !== tabSize) {\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n }\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n foldStyle: {\n set: function(val) {this.setFoldStyle(val);},\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 handlesSet: true\n }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\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 options = this.$options;\n var iterator = this.$matchIterator(session, options);\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n \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.$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 = addWordBoundary(needle, options);\n\n var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\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 return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\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 if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0 || startRow + len > session.getLength()) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var last;\n var m;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keyUtil = require(\"../lib/keys\");\nvar useragent = require(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n this.addCommands(config);\n this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n HashHandler.call(this, config, platform);\n this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n \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, keepCommand) {\n var name = command && (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n if (!keepCommand)\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var keyId in ckb) {\n var cmdGroup = ckb[keyId];\n if (cmdGroup == command) {\n delete ckb[keyId];\n } else if (Array.isArray(cmdGroup)) {\n var i = cmdGroup.indexOf(command);\n if (i != -1) {\n cmdGroup.splice(i, 1);\n if (cmdGroup.length == 1)\n ckb[keyId] = cmdGroup[0];\n }\n }\n }\n };\n\n this.bindKey = function(key, command, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\n if (!key)\n return;\n if (typeof command == \"function\")\n return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n \n key.split(\"|\").forEach(function(keyPart) {\n var chain = \"\";\n if (keyPart.indexOf(\" \") != -1) {\n var parts = keyPart.split(/\\s+/);\n keyPart = parts.pop();\n parts.forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n chain += (chain ? \" \" : \"\") + id;\n this._addCommandToBinding(chain, \"chainKeys\");\n }, this);\n chain += \" \";\n }\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n this._addCommandToBinding(chain + id, command, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position \n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\n var ckb = this.commandKeyBinding, i;\n if (!command) {\n delete ckb[keyId];\n } else if (!ckb[keyId] || this.$singleCommand) {\n ckb[keyId] = command;\n } else {\n if (!Array.isArray(ckb[keyId])) {\n ckb[keyId] = [ckb[keyId]];\n } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n ckb[keyId].splice(i, 1);\n }\n \n if (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, command);\n }\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 this.bindKey(command.bindKey, command);\n };\n this.parseKeys = function(keys) {\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 key = KEY_MODS[hashId] + keyString;\n return this.commandKeyBinding[key];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n if (keyCode < 0) return;\n var key = KEY_MODS[hashId] + keyString;\n var command = this.commandKeyBinding[key];\n if (data.$keyChain) {\n data.$keyChain += \" \" + key;\n command = this.commandKeyBinding[data.$keyChain] || command;\n }\n \n if (command) {\n if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n data.$keyChain = data.$keyChain || key;\n return {command: \"null\"};\n }\n }\n \n if (data.$keyChain) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\n };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\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\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar MultiHashHandler = require(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n MultiHashHandler.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, MultiHashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (Array.isArray(command)) {\n for (var i = command.length; i--; ) {\n if (this.exec(command[i], editor, args)) return true;\n }\n return false;\n }\n\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 if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor))\n return false;\n\n var e = {editor: editor, command: command, args: args};\n e.returnValue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return e.returnValue === 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.off(\"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/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\nvar config = require(\"../config\");\nvar Range = require(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n description: \"Show settings menu\",\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 description: \"Go to next error\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n description: \"Go to previous error\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"./ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n description: \"Select all\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n description: \"Center selection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n description: \"Go to line...\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor, line) {\n if (typeof line === \"number\" && !isNaN(line))\n editor.gotoLine(line);\n editor.prompt({ $type: \"gotoLine\" });\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 multiSelectAction: \"forEach\",\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 multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n description: \"Toggle fold widget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n description: \"Toggle parent fold widget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n description: \"Fold all\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldAllComments\",\n description: \"Fold all comments\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAllComments(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n description: \"Fold other\",\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 description: \"Unfold all\",\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 description: \"Find next\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findprevious\",\n description: \"Find previous\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n description: \"Select or find next\",\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 description: \"Select or find previous\",\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 description: \"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 description: \"Overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n description: \"Select to start\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-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 description: \"Go to start\",\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 description: \"Select up\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n description: \"Go line up\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n description: \"Select to end\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-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 description: \"Go to end\",\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 description: \"Select down\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n description: \"Go line down\",\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 description: \"Select word left\",\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 description: \"Go to word left\",\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 description: \"Select to line start\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n description: \"Go to line start\",\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 description: \"Select left\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n description: \"Go to left\",\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 description: \"Select word right\",\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 description: \"Go to word right\",\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 description: \"Select to line end\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n description: \"Go to line end\",\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 description: \"Select right\",\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 description: \"Go to right\",\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 description: \"Select page down\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n description: \"Page down\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n description: \"Go to page down\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n description: \"Select page up\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n description: \"Page up\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n description: \"Go to page up\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n description: \"Scroll up\",\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 description: \"Scroll down\",\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 description: \"Select line start\",\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 description: \"Select line end\",\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 description: \"Toggle recording\",\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 description: \"Replay macro\",\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 description: \"Jump to matching\",\n bindKey: bindKey(\"Ctrl-\\\\|Ctrl-P\", \"Command-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n description: \"Select to matching\",\n bindKey: bindKey(\"Ctrl-Shift-\\\\|Ctrl-Shift-P\", \"Command-Shift-\\\\\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n description: \"Expand to matching\",\n bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n exec: function(editor) { editor.jumpToMatching(true, true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"passKeysToBrowser\",\n description: \"Pass keys to browser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n description: \"Copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n description: \"Cut\",\n exec: function(editor) {\n var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty();\n var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange();\n editor._emit(\"cut\", range);\n\n if (!range.isEmpty())\n editor.session.remove(range);\n editor.clearSelection();\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n description: \"Paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n description: \"Remove line\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n description: \"Duplicate selection\",\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 description: \"Sort lines\",\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 description: \"Toggle comment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n description: \"Toggle block comment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n description: \"Modify number up\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n description: \"Modify number down\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n description: \"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 description: \"Undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n description: \"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 description: \"Copy lines up\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n description: \"Move lines up\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n description: \"Copy lines down\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n description: \"Move lines down\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n description: \"Delete\",\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 description: \"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 description: \"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 description: \"Remove to line start\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n description: \"Remove to line end\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n description: \"Remove to line start hard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n description: \"Remove to line end hard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n description: \"Remove word left\",\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 description: \"Remove word right\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n description: \"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 description: \"Indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n description: \"Block outdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n description: \"Block indent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n description: \"Insert string\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n description: \"Insert text\",\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 description: \"Split line\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n description: \"Transpose letters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n description: \"To uppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n description: \"To lowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"autoindent\",\n description: \"Auto Indent\",\n bindKey: bindKey(null, null),\n exec: function(editor) { editor.autoIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"animate\"\n}, {\n name: \"expandtoline\",\n description: \"Expand to line\",\n bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n exec: function(editor) {\n var range = editor.selection.getRange();\n\n range.start.column = range.end.column = 0;\n range.end.row++;\n editor.selection.setRange(range, false);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"joinlines\",\n description: \"Join lines\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var isBackwards = editor.selection.isBackwards();\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n if (curLine.length !== 0) {\n curLine = \" \" + curLine;\n }\n insertLine += curLine;\n }\n\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n insertLine += editor.session.doc.getNewLineCharacter();\n }\n\n editor.clearSelection();\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n if (selectedCount > 0) {\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n } else {\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n }\n },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"invertSelection\",\n description: \"Invert selection\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var endRow = editor.session.doc.getLength() - 1;\n var endCol = editor.session.doc.getLine(endRow).length;\n var ranges = editor.selection.rangeList.ranges;\n var newRanges = [];\n if (ranges.length < 1) {\n ranges = [editor.selection.getRange()];\n }\n\n for (var i = 0; i < ranges.length; i++) {\n if (i == (ranges.length - 1)) {\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n }\n }\n\n if (i === 0) {\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n }\n } else {\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n }\n }\n\n editor.exitMultiSelectMode();\n editor.clearSelection();\n\n for(var i = 0; i < newRanges.length; i++) {\n editor.selection.addRange(newRanges[i], false);\n }\n },\n readOnly: true,\n scrollIntoView: \"none\"\n}, {\n name: \"addLineAfter\",\n description: \"Add new line after the current line\",\n exec: function(editor) {\n editor.selection.clearSelection();\n editor.navigateLineEnd();\n editor.insert(\"\\n\");\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"addLineBefore\",\n description: \"Add new line before the current line\",\n exec: function(editor) {\n editor.selection.clearSelection();\n var cursor = editor.getCursorPosition();\n editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE);\n editor.insert(\"\\n\");\n if (cursor.row === 0) editor.navigateUp();\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"openCommandPallete\",\n description: \"Open command pallete\",\n bindKey: bindKey(\"F1\", \"F1\"),\n exec: function(editor) {\n editor.prompt({ $type: \"commands\" });\n },\n readOnly: true\n}, {\n name: \"modeSelect\",\n description: \"Change language mode...\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n editor.prompt({ $type: \"modes\" });\n },\n readOnly: true\n}];\n\nfor (var i = 1; i < 9; i++) {\n exports.commands.push({\n name: \"foldToLevel\" + i,\n description: \"Fold To Level \" + i,\n level: i,\n exec: function(editor) { editor.session.foldToLevel(this.level); },\n scrollIntoView: \"center\",\n readOnly: true\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\",\"ace/token_iterator\",\"ace/clipboard\"], function(require, exports, module) {\n\"use strict\";\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 TokenIterator = require(\"./token_iterator\").TokenIterator;\n\nvar clipboard = require(\"./clipboard\");\nvar Editor = function(renderer, session, options) {\n this.$toDestroy = [];\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\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 if (this.session && this.session.bgTokenizer)\n 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 || options && options.session || new EditSession(\"\"));\n config.resetOptions(this);\n if (options)\n this.setOptions(options);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n this.commands.on(\"exec\", this.startOperation.bind(this), true);\n this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true));\n this.on(\"change\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.docChanged = true;\n }.bind(this), true);\n \n this.on(\"changeSelection\", function() {\n if (!this.curOp) {\n this.startOperation();\n this.curOp.selectionBefore = this.$lastSel;\n }\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commandEvent) {\n if (this.curOp) {\n if (!commandEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commandEvent) {\n this.previousCommand = null;\n commandEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = this.session.curOp = {\n command: commandEvent.command || {},\n args: commandEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n this.curOp.selectionBefore = this.selection.toJSON();\n };\n\n this.endOperation = function(e) {\n if (this.curOp && this.session) {\n if (e && e.returnValue === false || !this.session)\n return (this.curOp = null);\n if (e == true && this.curOp.command && this.curOp.command.name == \"mouse\")\n return;\n this._signal(\"beforeEndOperation\");\n if (!this.curOp) return;\n var command = this.curOp.command;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\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 (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n var sel = this.selection.toJSON();\n this.curOp.selectionAfter = sel;\n this.$lastSel = this.selection.toJSON();\n this.session.getUndoManager().addSelection(sel);\n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n var prev = this.prevOp;\n var mergeableCommands = this.$mergeableCommands;\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, cb) {\n if (keyboardHandler && typeof keyboardHandler === \"string\" && keyboardHandler != \"ace\") {\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 cb && cb();\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n cb && cb();\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 if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.onCursorChange();\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 } else {\n this.selection = null;\n this.renderer.setSession(session);\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n \n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\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, cb) {\n this.renderer.setTheme(theme, cb);\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.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function () {\n self.$highlightPending = false;\n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n if (session.$bracketHighlight) {\n session.$bracketHighlight.markerIds.forEach(function(id) {\n session.removeMarker(id);\n });\n session.$bracketHighlight = null;\n }\n var ranges = session.getMatchingBracketRanges(self.getCursorPosition());\n if (!ranges && session.$mode.getMatching) \n ranges = session.$mode.getMatching(self.session);\n if (!ranges)\n return;\n\n var markerType = \"ace_bracket\";\n if (!Array.isArray(ranges)) {\n ranges = [ranges];\n } else if (ranges.length == 1) {\n markerType = \"ace_error_bracket\";\n }\n if (ranges.length == 2) {\n if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0)\n ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)];\n else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0)\n ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)];\n }\n\n session.$bracketHighlight = {\n ranges: ranges,\n markerIds: ranges.map(function(range) {\n return session.addMarker(range, markerType, \"text\");\n })\n };\n }, 50);\n };\n this.$highlightTags = function() {\n if (this.$highlightTagPending)\n return;\n var self = this;\n this.$highlightTagPending = true;\n setTimeout(function() {\n self.$highlightTagPending = false;\n \n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n \n var pos = self.getCursorPosition();\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n \n if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n if (token.type.indexOf(\"tag-open\") !== -1) {\n token = iterator.stepForward();\n if (!token)\n return;\n }\n \n var tag = token.value;\n var currentTag = token.value;\n var depth = 0;\n var prevToken = iterator.stepBackward();\n \n if (prevToken.value === '<'){\n do {\n prevToken = token;\n token = iterator.stepForward();\n\n if (token) {\n if (token.type.indexOf('tag-name') !== -1) {\n currentTag = token.value;\n if (tag === currentTag) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n depth--;\n }\n }\n \n } while (token && depth >= 0);\n } else {\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n\n if (token) {\n if (token.type.indexOf('tag-name') !== -1) {\n if (tag === token.value) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === '') { // self closing tag\n var stepCount = 0;\n var tmpToken = prevToken;\n while (tmpToken) {\n if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) {\n depth--;\n break;\n } else if (tmpToken.value === '<') {\n break;\n }\n tmpToken = iterator.stepBackward();\n stepCount++;\n }\n for (var i = 0; i < stepCount; i++) {\n iterator.stepForward();\n }\n }\n }\n } while (prevToken && depth <= 0);\n iterator.stepForward();\n }\n \n if (!token) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn();\n var range = new Range(row, column, row, column+token.value.length);\n var sbm = session.$backMarkers[session.$tagHighlight];\n if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n }\n \n if (!session.$tagHighlight)\n session.$tagHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.focus = function() {\n var _self = this;\n setTimeout(function() {\n if (!_self.isFocused())\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(e) {\n if (this.$isFocused)\n return;\n this.$isFocused = true;\n this.renderer.showCursor();\n this.renderer.visualizeFocus();\n this._emit(\"focus\", e);\n };\n this.onBlur = function(e) {\n if (!this.$isFocused)\n return;\n this.$isFocused = false;\n this.renderer.hideCursor();\n this.renderer.visualizeBlur();\n this._emit(\"blur\", e);\n };\n\n this.$cursorChange = function() {\n this.renderer.updateCursor();\n this.$highlightBrackets();\n this.$highlightTags();\n this.$updateHighlightActiveLine();\n };\n this.onDocumentChange = function(delta) {\n var wrap = this.session.$useWrapMode;\n var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);\n this.renderer.updateLines(delta.start.row, lastRow, wrap);\n\n this._signal(\"change\", delta);\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 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.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty())\n highlight = false;\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 startColumn = selection.start.column;\n var endColumn = selection.end.column;\n var line = session.getLine(selection.start.row);\n \n var needle = line.substring(startColumn, endColumn);\n if (needle.length > 5000 || !/[\\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 var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1);\n if (!re.test(wordWithBoundary))\n return;\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 var nl = this.session.doc.getNewLineCharacter();\n var copyLine= false;\n if (!text && this.$copyWithEmptySelection) {\n copyLine = true;\n var ranges = this.selection.getAllRanges();\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (i && ranges[i - 1].start.row == range.start.row)\n continue;\n text += this.session.getLine(range.start.row) + nl;\n }\n }\n var e = {text: text};\n this._signal(\"copy\", e);\n clipboard.lineMode = copyLine ? e.text : false;\n return e.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, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n\n var lineMode = text === clipboard.lineMode;\n var session = this.session;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n if (lineMode)\n session.insert({ row: this.selection.lead.row, column: 0 }, text);\n else\n this.insert(text);\n } else if (lineMode) {\n this.selection.rangeList.ranges.forEach(function(range) {\n session.insert({ row: range.start.row, column: 0 }, text);\n });\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]);\n if (lines.length != ranges.length || isFullLine)\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 session.remove(range);\n \n session.insert(range.start, lines[i]);\n }\n }\n };\n\n this.execCommand = function(command, args) {\n return 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 if (!this.inVirtualSelectionMode) {\n this.session.mergeUndoDeltas = false;\n this.mergeNextCommand = false;\n }\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() && text.indexOf(\"\\n\") == -1) {\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 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 if (this.$enableAutoIndent) {\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\n this.autoIndent = function () {\n var session = this.session;\n var mode = session.getMode();\n\n var startRow, endRow;\n if (this.selection.isEmpty()) {\n startRow = 0;\n endRow = session.doc.getLength() - 1;\n } else {\n var selectedRange = this.getSelectionRange();\n\n startRow = selectedRange.start.row;\n endRow = selectedRange.end.row;\n }\n\n var prevLineState = \"\";\n var prevLine = \"\";\n var lineIndent = \"\";\n var line, currIndent, range;\n var tab = session.getTabString();\n\n for (var row = startRow; row <= endRow; row++) {\n if (row > 0) {\n prevLineState = session.getState(row - 1);\n prevLine = session.getLine(row - 1);\n lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab);\n }\n\n line = session.getLine(row);\n currIndent = mode.$getIndent(line);\n if (lineIndent !== currIndent) {\n if (currIndent.length > 0) {\n range = new Range(row, 0, row, currIndent.length);\n session.remove(range);\n }\n if (lineIndent.length > 0) {\n session.insert({row: row, column: 0}, lineIndent);\n }\n }\n\n mode.autoOutdent(prevLineState, session, row);\n }\n };\n\n\n this.onTextInput = function(text, composition) {\n if (!composition)\n return this.keyBinding.onTextInput(text);\n \n this.startOperation({command: { name: \"insertstring\" }});\n var applyComposition = this.applyComposition.bind(this, text, composition);\n if (this.selection.rangeCount)\n this.forEachSelection(applyComposition);\n else\n applyComposition();\n this.endOperation();\n };\n \n this.applyComposition = function(text, composition) {\n if (composition.extendLeft || composition.extendRight) {\n var r = this.selection.getRange();\n r.start.column -= composition.extendLeft;\n r.end.column += composition.extendRight;\n if (r.start.column < 0) {\n r.start.row--;\n r.start.column += this.session.getLine(r.start.row).length + 1;\n }\n this.selection.setRange(r);\n if (!text && !r.isEmpty())\n this.remove();\n }\n if (text || !this.selection.isEmpty())\n this.insert(text, true);\n if (composition.restoreStart || composition.restoreEnd) {\n var r = this.selection.getRange();\n r.start.column -= composition.restoreStart;\n r.end.column -= composition.restoreEnd;\n this.selection.setRange(r);\n }\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n return 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 if (this.selection.isEmpty())\n this.selection.selectLeft();\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 this.session.selection.moveToPosition(range.end);\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 - 1] == \" \" && 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 (var 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 } else {\n this.toggleWord();\n }\n };\n\n this.$toggleWordPairs = [\n [\"first\", \"last\"],\n [\"true\", \"false\"],\n [\"yes\", \"no\"],\n [\"width\", \"height\"],\n [\"top\", \"bottom\"],\n [\"right\", \"left\"],\n [\"on\", \"off\"],\n [\"x\", \"y\"],\n [\"get\", \"set\"],\n [\"max\", \"min\"],\n [\"horizontal\", \"vertical\"],\n [\"show\", \"hide\"],\n [\"add\", \"remove\"],\n [\"up\", \"down\"],\n [\"before\", \"after\"],\n [\"even\", \"odd\"],\n [\"in\", \"out\"],\n [\"inside\", \"outside\"],\n [\"next\", \"previous\"],\n [\"increase\", \"decrease\"],\n [\"attach\", \"detach\"],\n [\"&&\", \"||\"],\n [\"==\", \"!=\"]\n ];\n\n this.toggleWord = function () {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n this.selection.selectWord();\n var currentState = this.getSelectedText();\n var currWordStart = this.selection.getWordRange().start.column;\n var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\\s/);\n var delta = column - currWordStart - 1;\n if (delta < 0) delta = 0;\n var curLength = 0, itLength = 0;\n var that = this;\n if (currentState.match(/[A-Za-z0-9_]+/)) {\n wordParts.forEach(function (item, i) {\n itLength = curLength + item.length;\n if (delta >= curLength && delta <= itLength) {\n currentState = item;\n that.selection.clearSelection();\n that.moveCursorTo(row, curLength + currWordStart);\n that.selection.selectTo(row, itLength + currWordStart);\n }\n curLength = itLength;\n });\n }\n\n var wordPairs = this.$toggleWordPairs;\n var reg;\n for (var i = 0; i < wordPairs.length; i++) {\n var item = wordPairs[i];\n for (var j = 0; j <= 1; j++) {\n var negate = +!j;\n var firstCondition = currentState.match(new RegExp('^\\\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\\\s?$', 'i'));\n if (firstCondition) {\n var secondCondition = currentState.match(new RegExp('([_]|^|\\\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\\\s)', 'g'));\n if (secondCondition) {\n reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) {\n var res = item[negate];\n if (result.toUpperCase() == result) {\n res = res.toUpperCase();\n } else if (result.charAt(0).toUpperCase() == result.charAt(0)) {\n res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1);\n }\n return res;\n });\n this.insert(reg);\n reg = \"\";\n }\n }\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\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(1, false);\n };\n this.moveLinesUp = function() {\n this.$moveLines(-1, false);\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(-1, true);\n };\n this.copyLinesDown = function() {\n this.$moveLines(1, true);\n };\n this.$moveLines = function(dir, copy) {\n var rows, moved;\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n rows = this.$getSelectedRows(range);\n moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n if (copy && dir == -1) moved = 0;\n range.moveBy(moved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n this.inVirtualSelectionMode = true;\n \n var diff = 0;\n var totalDiff = 0;\n var l = ranges.length;\n for (var i = 0; i < l; i++) {\n var rangeIndex = i;\n ranges[i].moveBy(diff, 0);\n rows = this.$getSelectedRows(ranges[i]);\n var first = rows.first;\n var last = rows.last;\n while (++i < l) {\n if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n var subRows = this.$getSelectedRows(ranges[i]);\n if (copy && subRows.first != last)\n break;\n else if (!copy && subRows.first > last + 1)\n break;\n last = subRows.last;\n }\n i--;\n diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n if (copy && dir == -1) rangeIndex = i + 1;\n while (rangeIndex <= i) {\n ranges[rangeIndex].moveBy(diff, 0);\n rangeIndex++;\n }\n if (!copy) diff = 0;\n totalDiff += diff;\n }\n \n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n this.inVirtualSelectionMode = false;\n }\n };\n this.$getSelectedRows = function(range) {\n range = (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(compositionState) {\n this.renderer.showComposition(compositionState);\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 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\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.selection.selectAll();\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, expand) {\n var cursor = this.getCursorPosition();\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n var prevToken = iterator.getCurrentToken();\n var token = prevToken || iterator.stepForward();\n\n if (!token) return;\n var matchType;\n var found = false;\n var depth = {};\n var i = cursor.column - token.start;\n var bracketType;\n var brackets = {\n \")\": \"(\",\n \"(\": \"(\",\n \"]\": \"[\",\n \"[\": \"[\",\n \"{\": \"{\",\n \"}\": \"{\"\n };\n \n do {\n if (token.value.match(/[{}()\\[\\]]/g)) {\n for (; i < token.value.length && !found; i++) {\n if (!brackets[token.value[i]]) {\n continue;\n }\n\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n if (isNaN(depth[bracketType])) {\n depth[bracketType] = 0;\n }\n\n switch (token.value[i]) {\n case '(':\n case '[':\n case '{':\n depth[bracketType]++;\n break;\n case ')':\n case ']':\n case '}':\n depth[bracketType]--;\n\n if (depth[bracketType] === -1) {\n matchType = 'bracket';\n found = true;\n }\n break;\n }\n }\n }\n else if (token.type.indexOf('tag-name') !== -1) {\n if (isNaN(depth[token.value])) {\n depth[token.value] = 0;\n }\n \n if (prevToken.value === '<') {\n depth[token.value]++;\n }\n else if (prevToken.value === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\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.session.unfold(range);\n this.selection.setSelectionRange(range);\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.session.getUndoManager().undo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.session.getUndoManager().redo(this.session);\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n if (this.$toDestroy) {\n this.$toDestroy.forEach(function(el) {\n el.destroy();\n });\n this.$toDestroy = null;\n }\n if (this.$mouseHandler)\n this.$mouseHandler.destroy();\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session)\n this.session.destroy();\n if (this._$emitInputEvent)\n this._$emitInputEvent.cancel();\n this.removeAllListeners();\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 || self.searchBox && self.searchBox.isFocused())\n ) {\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.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"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(/smooth/.test(style));\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n };\n this.prompt = function(message, options, callback) {\n var editor = this;\n config.loadModule(\"./ext/prompt\", function (module) {\n module.prompt(editor, message, options, callback);\n });\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 copyWithEmptySelection: {\n set: function(value) {\n this.textInput.setCopyWithEmptySelection(value);\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 enableAutoIndent: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.$keybindingId; },\n handlesSet: true\n },\n value: {\n set: function(val) { this.session.setValue(val); },\n get: function() { return this.getValue(); },\n handlesSet: true,\n hidden: true\n },\n session: {\n set: function(val) { this.setSession(val); },\n get: function() { return this.session; },\n handlesSet: true,\n hidden: true\n },\n \n showLineNumbers: {\n set: function(show) {\n this.renderer.$gutterLayer.setShowLineNumbers(show);\n this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER);\n if (show && this.$relativeLineNumbers)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n },\n initialValue: true\n },\n relativeLineNumbers: {\n set: function(value) {\n if (this.$showLineNumbers && value)\n relativeNumberRenderer.attach(this);\n else\n relativeNumberRenderer.detach(this);\n }\n },\n placeholder: {\n set: function(message) {\n if (!this.$updatePlaceholder) {\n this.$updatePlaceholder = function() {\n var value = this.session && (this.renderer.$composition || this.getValue());\n if (value && this.renderer.placeholderNode) {\n this.renderer.off(\"afterRender\", this.$updatePlaceholder);\n dom.removeCssClass(this.container, \"ace_hasPlaceholder\");\n this.renderer.placeholderNode.remove();\n this.renderer.placeholderNode = null;\n } else if (!value && !this.renderer.placeholderNode) {\n this.renderer.on(\"afterRender\", this.$updatePlaceholder);\n dom.addCssClass(this.container, \"ace_hasPlaceholder\");\n var el = dom.createElement(\"div\");\n el.className = \"ace_placeholder\";\n el.textContent = this.$placeholder || \"\";\n this.renderer.placeholderNode = el;\n this.renderer.content.appendChild(this.renderer.placeholderNode);\n } else if (!value && this.renderer.placeholderNode) {\n this.renderer.placeholderNode.textContent = this.$placeholder || \"\";\n }\n }.bind(this);\n this.on(\"input\", this.$updatePlaceholder);\n }\n this.$updatePlaceholder();\n }\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 displayIndentGuides: \"renderer\",\n showGutter: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n hasCssTransforms: \"renderer\",\n maxPixelHeight: \"renderer\",\n useTextareaForIME: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimeout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n navigateWithinSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\n\nvar relativeNumberRenderer = {\n getText: function(session, row) {\n return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? \"\\xb7\" : \"\"))) + \"\";\n },\n getWidth: function(session, lastLineNumber, config) {\n return Math.max(\n lastLineNumber.toString().length,\n (config.lastRow + 1).toString().length,\n 2\n ) * config.characterWidth;\n },\n update: function(e, editor) {\n editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);\n },\n attach: function(editor) {\n editor.renderer.$gutterLayer.$renderer = this;\n editor.on(\"changeSelection\", this.update);\n this.update(null, editor);\n },\n detach: function(editor) {\n if (editor.renderer.$gutterLayer.$renderer == this)\n editor.renderer.$gutterLayer.$renderer = null;\n editor.off(\"changeSelection\", this.update);\n this.update(null, editor);\n }\n};\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.$maxRev = 0;\n this.$fromUndo = false;\n this.reset();\n};\n\n(function() {\n \n this.addSession = function(session) {\n this.$session = session;\n };\n this.add = function(delta, allowMerge, session) {\n if (this.$fromUndo) return;\n if (delta == this.$lastDelta) return;\n if (!this.$keepRedoStack) this.$redoStack.length = 0;\n if (allowMerge === false || !this.lastDeltas) {\n this.lastDeltas = [];\n this.$undoStack.push(this.lastDeltas);\n delta.id = this.$rev = ++this.$maxRev;\n }\n if (delta.action == \"remove\" || delta.action == \"insert\")\n this.$lastDelta = delta;\n this.lastDeltas.push(delta);\n };\n \n this.addSelection = function(selection, rev) {\n this.selections.push({\n value: selection,\n rev: rev || this.$rev\n });\n };\n \n this.startNewGroup = function() {\n this.lastDeltas = null;\n return this.$rev;\n };\n \n this.markIgnored = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id <= from)\n break;\n if (delta.id < to)\n delta.ignore = true;\n }\n this.lastDeltas = null;\n };\n \n this.getSelection = function(rev, after) {\n var stack = this.selections;\n for (var i = stack.length; i--;) {\n var selection = stack[i];\n if (selection.rev < rev) {\n if (after)\n selection = stack[i + 1];\n return selection;\n }\n }\n };\n \n this.getRevision = function() {\n return this.$rev;\n };\n \n this.getDeltas = function(from, to) {\n if (to == null) to = this.$rev + 1;\n var stack = this.$undoStack;\n var end = null, start = 0;\n for (var i = stack.length; i--;) {\n var delta = stack[i][0];\n if (delta.id < to && !end)\n end = i+1;\n if (delta.id <= from) {\n start = i + 1;\n break;\n }\n }\n return stack.slice(start, end);\n };\n \n this.getChangedRanges = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n \n this.getChangedLines = function(from, to) {\n if (to == null) to = this.$rev + 1;\n \n };\n this.undo = function(session, dontSelect) {\n this.lastDeltas = null;\n var stack = this.$undoStack;\n \n if (!rearrangeUndoStack(stack, stack.length))\n return;\n \n if (!session)\n session = this.$session;\n \n if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length)\n this.$redoStack = [];\n \n this.$fromUndo = true;\n \n var deltaSet = stack.pop();\n var undoSelectionRange = null;\n if (deltaSet) {\n undoSelectionRange = session.undoChanges(deltaSet, dontSelect);\n this.$redoStack.push(deltaSet);\n this.$syncRev();\n }\n \n this.$fromUndo = false;\n\n return undoSelectionRange;\n };\n this.redo = function(session, dontSelect) {\n this.lastDeltas = null;\n \n if (!session)\n session = this.$session;\n \n this.$fromUndo = true;\n if (this.$redoStackBaseRev != this.$rev) {\n var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1);\n rebaseRedoStack(this.$redoStack, diff);\n this.$redoStackBaseRev = this.$rev;\n this.$redoStack.forEach(function(x) {\n x[0].id = ++this.$maxRev;\n }, this);\n }\n var deltaSet = this.$redoStack.pop();\n var redoSelectionRange = null;\n \n if (deltaSet) {\n redoSelectionRange = session.redoChanges(deltaSet, dontSelect);\n this.$undoStack.push(deltaSet);\n this.$syncRev();\n }\n this.$fromUndo = false;\n \n return redoSelectionRange;\n };\n \n this.$syncRev = function() {\n var stack = this.$undoStack;\n var nextDelta = stack[stack.length - 1];\n var id = nextDelta && nextDelta[0].id || 0;\n this.$redoStackBaseRev = id;\n this.$rev = id;\n };\n this.reset = function() {\n this.lastDeltas = null;\n this.$lastDelta = null;\n this.$undoStack = [];\n this.$redoStack = [];\n this.$rev = 0;\n this.mark = 0;\n this.$redoStackBaseRev = this.$rev;\n this.selections = [];\n };\n this.canUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.canRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.bookmark = function(rev) {\n if (rev == undefined)\n rev = this.$rev;\n this.mark = rev;\n };\n this.isAtBookmark = function() {\n return this.$rev === this.mark;\n };\n \n this.toJSON = function() {\n \n };\n \n this.fromJSON = function() {\n \n };\n \n this.hasUndo = this.canUndo;\n this.hasRedo = this.canRedo;\n this.isClean = this.isAtBookmark;\n this.markClean = this.bookmark;\n \n this.$prettyPrint = function(delta) {\n if (delta) return stringifyDelta(delta);\n return stringifyDelta(this.$undoStack) + \"\\n---\\n\" + stringifyDelta(this.$redoStack);\n };\n}).call(UndoManager.prototype);\n\nfunction rearrangeUndoStack(stack, pos) {\n for (var i = pos; i--; ) {\n var deltaSet = stack[i];\n if (deltaSet && !deltaSet[0].ignore) {\n while(i < pos - 1) {\n var swapped = swapGroups(stack[i], stack[i + 1]);\n stack[i] = swapped[0];\n stack[i + 1] = swapped[1];\n i++;\n }\n return true;\n }\n }\n}\n\nvar Range = require(\"./range\").Range;\nvar cmp = Range.comparePoints;\nvar comparePoints = Range.comparePoints;\n\nfunction $updateMarkers(delta) {\n var isInsert = delta.action == \"insert\";\n var start = delta.start;\n var end = delta.end;\n var rowShift = (end.row - start.row) * (isInsert ? 1 : -1);\n var colShift = (end.column - start.column) * (isInsert ? 1 : -1);\n if (isInsert) end = start;\n\n for (var i in this.marks) {\n var point = this.marks[i];\n var cmp = comparePoints(point, start);\n if (cmp < 0) {\n continue; // delta starts after the range\n }\n if (cmp === 0) {\n if (isInsert) {\n if (point.bias == 1) {\n cmp = 1;\n }\n else {\n point.bias == -1;\n continue;\n }\n }\n }\n var cmp2 = isInsert ? cmp : comparePoints(point, end);\n if (cmp2 > 0) {\n point.row += rowShift;\n point.column += point.row == end.row ? colShift : 0;\n continue;\n }\n if (!isInsert && cmp2 <= 0) {\n point.row = start.row;\n point.column = start.column;\n if (cmp2 === 0)\n point.bias = 1;\n }\n }\n}\n\n\n\nfunction clonePos(pos) {\n return {row: pos.row,column: pos.column};\n}\nfunction cloneDelta(d) {\n return {\n start: clonePos(d.start),\n end: clonePos(d.end),\n action: d.action,\n lines: d.lines.slice()\n };\n}\nfunction stringifyDelta(d) {\n d = d || this;\n if (Array.isArray(d)) {\n return d.map(stringifyDelta).join(\"\\n\");\n }\n var type = \"\";\n if (d.action) {\n type = d.action == \"insert\" ? \"+\" : \"-\";\n type += \"[\" + d.lines + \"]\";\n } else if (d.value) {\n if (Array.isArray(d.value)) {\n type = d.value.map(stringifyRange).join(\"\\n\");\n } else {\n type = stringifyRange(d.value);\n }\n }\n if (d.start) {\n type += stringifyRange(d);\n }\n if (d.id || d.rev) {\n type += \"\\t(\" + (d.id || d.rev) + \")\";\n }\n return type;\n}\nfunction stringifyRange(r) {\n return r.start.row + \":\" + r.start.column \n + \"=>\" + r.end.row + \":\" + r.end.column;\n}\n\nfunction swap(d1, d2) {\n var i1 = d1.action == \"insert\";\n var i2 = d2.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (i1 && !i2) {\n if (cmp(d2.start, d1.end) >= 0) {\n shift(d2, d1, -1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n } else if (!i1 && i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.start, d1.start) <= 0) {\n shift(d1, d2, +1);\n } else {\n return null;\n }\n } else if (!i1 && !i2) {\n if (cmp(d2.start, d1.start) >= 0) {\n shift(d2, d1, +1);\n } else if (cmp(d2.end, d1.start) <= 0) {\n shift(d1, d2, -1);\n } else {\n return null;\n }\n }\n return [d2, d1];\n}\nfunction swapGroups(ds1, ds2) {\n for (var i = ds1.length; i--; ) {\n for (var j = 0; j < ds2.length; j++) {\n if (!swap(ds1[i], ds2[j])) {\n while (i < ds1.length) {\n while (j--) {\n swap(ds2[j], ds1[i]);\n }\n j = ds2.length;\n i++;\n } \n return [ds1, ds2];\n }\n }\n }\n ds1.selectionBefore = ds2.selectionBefore = \n ds1.selectionAfter = ds2.selectionAfter = null;\n return [ds2, ds1];\n}\nfunction xform(d1, c1) {\n var i1 = d1.action == \"insert\";\n var i2 = c1.action == \"insert\";\n \n if (i1 && i2) {\n if (cmp(d1.start, c1.start) < 0) {\n shift(c1, d1, 1);\n } else {\n shift(d1, c1, 1);\n }\n } else if (i1 && !i2) {\n if (cmp(d1.start, c1.end) >= 0) {\n shift(d1, c1, -1);\n } else if (cmp(d1.start, c1.start) <= 0) {\n shift(c1, d1, +1);\n } else {\n shift(d1, Range.fromPoints(c1.start, d1.start), -1);\n shift(c1, d1, +1);\n }\n } else if (!i1 && i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.start, d1.start) <= 0) {\n shift(d1, c1, +1);\n } else {\n shift(c1, Range.fromPoints(d1.start, c1.start), -1);\n shift(d1, c1, +1);\n }\n } else if (!i1 && !i2) {\n if (cmp(c1.start, d1.end) >= 0) {\n shift(c1, d1, -1);\n } else if (cmp(c1.end, d1.start) <= 0) {\n shift(d1, c1, -1);\n } else {\n var before, after;\n if (cmp(d1.start, c1.start) < 0) {\n before = d1;\n d1 = splitDelta(d1, c1.start);\n }\n if (cmp(d1.end, c1.end) > 0) {\n after = splitDelta(d1, c1.end);\n }\n\n shiftPos(c1.end, d1.start, d1.end, -1);\n if (after && !before) {\n d1.lines = after.lines;\n d1.start = after.start;\n d1.end = after.end;\n after = d1;\n }\n\n return [c1, before, after].filter(Boolean);\n }\n }\n return [c1, d1];\n}\n \nfunction shift(d1, d2, dir) {\n shiftPos(d1.start, d2.start, d2.end, dir);\n shiftPos(d1.end, d2.start, d2.end, dir);\n}\nfunction shiftPos(pos, start, end, dir) {\n if (pos.row == (dir == 1 ? start : end).row) {\n pos.column += dir * (end.column - start.column);\n }\n pos.row += dir * (end.row - start.row);\n}\nfunction splitDelta(c, pos) {\n var lines = c.lines;\n var end = c.end;\n c.end = clonePos(pos); \n var rowsBefore = c.end.row - c.start.row;\n var otherLines = lines.splice(rowsBefore, lines.length);\n \n var col = rowsBefore ? pos.column : pos.column - c.start.column;\n lines.push(otherLines[0].substring(0, col));\n otherLines[0] = otherLines[0].substr(col) ; \n var rest = {\n start: clonePos(pos),\n end: end,\n lines: otherLines,\n action: c.action\n };\n return rest;\n}\n\nfunction moveDeltasByOne(redoStack, d) {\n d = cloneDelta(d);\n for (var j = redoStack.length; j--;) {\n var deltaSet = redoStack[j];\n for (var i = 0; i < deltaSet.length; i++) {\n var x = deltaSet[i];\n var xformed = xform(x, d);\n d = xformed[0];\n if (xformed.length != 2) {\n if (xformed[2]) {\n deltaSet.splice(i + 1, 1, xformed[1], xformed[2]);\n i++;\n } else if (!xformed[1]) {\n deltaSet.splice(i, 1);\n i--;\n }\n }\n }\n if (!deltaSet.length) {\n redoStack.splice(j, 1); \n }\n }\n return redoStack;\n}\nfunction rebaseRedoStack(redoStack, deltaSets) {\n for (var i = 0; i < deltaSets.length; i++) {\n var deltas = deltaSets[i];\n for (var j = 0; j < deltas.length; j++) {\n moveDeltasByOne(redoStack, deltas[j]);\n }\n }\n}\n\nexports.UndoManager = UndoManager;\n\n});\n\nace.define(\"ace/layer/lines\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\n\nvar Lines = function(element, canvasHeight) {\n this.element = element;\n this.canvasHeight = canvasHeight || 500000;\n this.element.style.height = (this.canvasHeight * 2) + \"px\";\n \n this.cells = [];\n this.cellCache = [];\n this.$offsetCoefficient = 0;\n};\n\n(function() {\n \n this.moveContainer = function(config) {\n dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient);\n }; \n \n this.pageChanged = function(oldConfig, newConfig) {\n return (\n Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !==\n Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)\n );\n };\n \n this.computeLineTop = function(row, config, session) {\n var screenTop = config.firstRowScreen * config.lineHeight;\n var screenPage = Math.floor(screenTop / this.canvasHeight);\n var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight;\n return lineTop - (screenPage * this.canvasHeight);\n };\n \n this.computeLineHeight = function(row, config, session) {\n return config.lineHeight * session.getRowLineCount(row);\n };\n \n this.getLength = function() {\n return this.cells.length;\n };\n \n this.get = function(index) {\n return this.cells[index];\n };\n \n this.shift = function() {\n this.$cacheCell(this.cells.shift());\n };\n \n this.pop = function() {\n this.$cacheCell(this.cells.pop());\n };\n \n this.push = function(cell) {\n if (Array.isArray(cell)) {\n this.cells.push.apply(this.cells, cell);\n var fragment = dom.createFragment(this.element);\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.$lines.getLength() > index + 1)\n this.$lines.pop();\n \n break;\n }\n\n cell = this.$lines.get(++index);\n if (cell) {\n cell.row = row;\n } else {\n cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$lines.push(cell);\n }\n\n this.$renderCell(cell, config, fold, row);\n row++;\n }\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$updateGutterWidth = function(config) {\n var session = this.session;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n \n var firstLineNumber = session.$firstLineNumber;\n var lastLineText = this.$lines.last() ? this.$lines.last().text : \"\";\n \n if (this.$fixedWidth || session.$useWrapMode)\n lastLineText = session.getLength() + firstLineNumber - 1;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineText, config)\n : lastLineText.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.parentNode.style.width = \n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._signal(\"changeGutterWidth\", gutterWidth);\n }\n };\n \n this.$updateCursorRow = function() {\n if (!this.$highlightGutterLine)\n return;\n \n var position = this.session.selection.getCursor();\n if (this.$cursorRow === position.row)\n return;\n \n this.$cursorRow = position.row;\n };\n \n this.updateLineHighlight = function() {\n if (!this.$highlightGutterLine)\n return;\n var row = this.session.selection.cursor.row;\n this.$cursorRow = row;\n\n if (this.$cursorCell && this.$cursorCell.row == row)\n return;\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n var cells = this.$lines.cells;\n this.$cursorCell = null;\n for (var i = 0; i < cells.length; i++) {\n var cell = cells[i];\n if (cell.row >= this.$cursorRow) {\n if (cell.row > this.$cursorRow) {\n var fold = this.session.getFoldLine(this.$cursorRow);\n if (i > 0 && fold && fold.start.row == cells[i - 1].row)\n cell = cells[i - 1];\n else\n break;\n }\n cell.element.className = \"ace_gutter-active-line \" + cell.element.className;\n this.$cursorCell = cell;\n break;\n }\n }\n };\n \n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n \n this.$updateCursorRow();\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n this.session.getLength() - 1);\n var oldLastRow = this.oldLastRow;\n this.oldLastRow = lastRow;\n \n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(config);\n\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldLastRow > lastRow)\n for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (lastRow > oldLastRow) {\n this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow));\n }\n \n this.updateLineHighlight();\n \n this._signal(\"afterRender\");\n this.$updateGutterWidth(config);\n };\n\n this.$renderLines = function(config, firstRow, lastRow) {\n var fragment = [];\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 cell = this.$lines.createCell(row, config, this.session, onCreateCell);\n this.$renderCell(cell, config, foldLine, row);\n fragment.push(cell);\n\n row++;\n }\n return fragment;\n };\n \n this.$renderCell = function(cell, config, fold, row) {\n var element = cell.element;\n \n var session = this.session;\n \n var textNode = element.childNodes[0];\n var foldWidget = element.childNodes[1];\n\n var firstLineNumber = session.$firstLineNumber;\n \n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var gutterRenderer = session.gutterRenderer || this.$renderer;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var foldStart = fold ? fold.start.row : Number.MAX_VALUE;\n \n var className = \"ace_gutter-cell \";\n if (this.$highlightGutterLine) {\n if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) {\n className += \"ace_gutter-active-line \";\n if (this.$cursorCell != cell) {\n if (this.$cursorCell)\n this.$cursorCell.element.className = this.$cursorCell.element.className.replace(\"ace_gutter-active-line \", \"\");\n this.$cursorCell = cell;\n }\n }\n }\n \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 (element.className != className)\n element.className = className;\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 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 (foldWidget.className != className)\n foldWidget.className = className;\n\n var foldHeight = config.lineHeight + \"px\";\n dom.setStyle(foldWidget.style, \"height\", foldHeight);\n dom.setStyle(foldWidget.style, \"display\", \"inline-block\");\n } else {\n if (foldWidget) {\n dom.setStyle(foldWidget.style, \"display\", \"none\");\n }\n }\n \n var text = (gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber).toString();\n \n if (text !== textNode.data) {\n textNode.data = text;\n }\n \n dom.setStyle(cell.element.style, \"height\", this.$lines.computeLineHeight(row, config, session) + \"px\");\n dom.setStyle(cell.element.style, \"top\", this.$lines.computeLineTop(row, config, session) + \"px\");\n \n cell.text = text;\n return cell;\n };\n\n this.$fixedWidth = false;\n \n this.$highlightGutterLine = true;\n this.$renderer = \"\";\n this.setHighlightGutterLine = function(highlightGutterLine) {\n this.$highlightGutterLine = highlightGutterLine;\n };\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return 0;},\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.borderLeftWidth) || 0)\n + (parseInt(style.paddingLeft) || 0) + 1;\n this.$padding.right = (parseInt(style.borderRightWidth) || 0)\n + (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\nfunction onCreateCell(element) {\n var textNode = document.createTextNode('');\n element.appendChild(textNode);\n \n var foldWidget = dom.createElement(\"span\");\n element.appendChild(foldWidget);\n \n return element;\n}\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\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.elt = function(className, css) {\n var x = this.i != -1 && this.element.childNodes[this.i];\n if (!x) {\n x = document.createElement(\"div\");\n this.element.appendChild(x);\n this.i = -1;\n } else {\n this.i++;\n }\n x.style.cssText = css;\n x.className = className;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n this.i = 0;\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\" + \" ace_br15\", config);\n }\n }\n if (this.i !=-1) {\n while (this.i < this.element.childElementCount)\n this.element.removeChild(this.element.lastChild);\n }\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n this.drawSingleLineMarker(stringBuilder, lineRange, \n clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),\n layerConfig, row == end ? 0 : 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 if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n this.elt(\n clazz + \" ace_br1 ace_start\",\n \"height:\"+ height+ \"px;\"+ \"right:0;\"+ \"top:\"+top+ \"px;left:\"+ left+ \"px;\" + (extraStyle || \"\")\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n top = this.$getTop(range.end.row, config);\n var width = range.end.column * config.characterWidth;\n\n this.elt(\n clazz + \" ace_br12\",\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\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 var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n this.elt(\n clazz + (radiusClass ? \" ace_br\" + radiusClass : \"\"),\n \"height:\"+ height+ \"px;\"+\n \"right:0;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ padding+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n if (this.session.$bidiHandler.isBidiRow(range.start.row))\n return this.drawBidiSingleLineMarker(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 this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"width:\"+ width+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:\"+ left+ \"px;\"+ (extraStyle || \"\")\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n this.elt(\n clazz,\n \"height:\" + height + \"px;\" +\n \"width:\" + selection.width + (extraLength || 0) + \"px;\" +\n \"top:\" + top + \"px;\" +\n \"left:\" + (padding + selection.left) + \"px;\" + (extraStyle || \"\")\n );\n }, this);\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 this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\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 this.elt(\n clazz,\n \"height:\"+ height+ \"px;\"+\n \"top:\"+ top+ \"px;\"+\n \"left:0;right:0;\"+ (extraStyle || \"\")\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/layer/lines\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar Lines = require(\"./lines\").Lines;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.dom = dom; \n this.element = this.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 this.$lines = new Lines(this.element);\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 = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n this.MAX_LINE_LENGTH = 10000;\n\n this.$updateEolChar = function() {\n var doc = this.session.doc;\n var unixMode = doc.getNewLineCharacter() == \"\\n\" && doc.getNewLineMode() != \"windows\";\n var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : 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.margin = \"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 if (session)\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.showSpaces = false;\n this.showTabs = false;\n this.showEOL = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n if (typeof showInvisibles == \"string\") {\n this.showSpaces = /tab/i.test(showInvisibles);\n this.showTabs = /space/i.test(showInvisibles);\n this.showEOL = /eol/i.test(showInvisibles);\n } else {\n this.showSpaces = this.showTabs = this.showEOL = showInvisibles;\n }\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.showTabs) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_tab\";\n span.textContent = lang.stringRepeat(this.TAB_CHAR, i);\n tabStr.push(span);\n } else {\n tabStr.push(this.dom.createTextNode(lang.stringRepeat(\" \", i), this.element));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = this.showSpaces ? \" ace_invisible ace_invisible_space\" : \"\";\n var spaceContent = this.showSpaces\n ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize)\n : lang.stringRepeat(\" \", this.tabSize);\n\n var tabClass = this.showTabs ? \" ace_invisible ace_invisible_tab\" : \"\";\n var tabContent = this.showTabs \n ? lang.stringRepeat(this.TAB_CHAR, this.tabSize)\n : spaceContent;\n\n var span = this.dom.createElement(\"span\");\n span.className = className + spaceClass;\n span.textContent = spaceContent;\n this.$tabStrings[\" \"] = span;\n \n var span = this.dom.createElement(\"span\");\n span.className = className + tabClass;\n span.textContent = tabContent;\n this.$tabStrings[\"\\t\"] = span;\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n return this.update(config);\n }\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 heightChanged = false;\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 this.dom.removeChildren(lineElement);\n this.$renderLine(\n lineElement, row, row == foldStart ? foldLine : false\n );\n\n if (heightChanged)\n lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + \"px\";\n\n var height = (config.lineHeight * this.session.getRowLength(row)) + \"px\";\n if (lineElement.style.height != height) {\n heightChanged = true;\n lineElement.style.height = height;\n }\n }\n row++;\n }\n if (heightChanged) {\n while (lineElementsIdx < this.$lines.cells.length) {\n var cell = this.$lines.cells[lineElementsIdx++];\n cell.element.style.top = this.$lines.computeLineTop(cell.row, config, this.session) + \"px\";\n }\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (this.$lines.pageChanged(oldConfig, config))\n return this.update(config);\n \n this.$lines.moveContainer(config);\n \n var lastRow = config.lastRow;\n var oldLastRow = oldConfig ? oldConfig.lastRow : -1;\n\n if (!oldConfig || oldLastRow < config.firstRow)\n return this.update(config);\n\n if (lastRow < oldConfig.firstRow)\n return this.update(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 if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n this.$lines.shift();\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n this.$lines.pop();\n\n if (config.firstRow < oldConfig.firstRow) {\n this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1));\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow));\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = [];\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 line = this.$lines.createCell(row, config, this.session);\n \n var lineEl = line.element;\n this.dom.removeChildren(lineEl);\n dom.setStyle(lineEl.style, \"height\", this.$lines.computeLineHeight(row, config, this.session) + \"px\");\n dom.setStyle(lineEl.style, \"top\", this.$lines.computeLineTop(row, config, this.session) + \"px\");\n this.$renderLine(lineEl, row, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups()) {\n lineEl.className = \"ace_line_group\";\n } else {\n lineEl.className = \"ace_line\";\n }\n fragment.push(line);\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.$lines.moveContainer(config);\n \n this.config = config;\n\n var firstRow = config.firstRow;\n var lastRow = config.lastRow;\n\n var lines = this.$lines;\n while (lines.getLength())\n lines.pop();\n \n lines.push(this.$renderLinesFragment(config, firstRow, lastRow));\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(parent, screenColumn, token, value) {\n var self = this;\n var re = /(\\t)|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\uFEFF\\uFFF9-\\uFFFC]+)|(\\u3000)|([\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3001-\\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]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/g;\n \n var valueFragment = this.dom.createFragment(this.element);\n\n var m;\n var i = 0;\n while (m = re.exec(value)) {\n var tab = m[1];\n var simpleSpace = m[2];\n var controlCharacter = m[3];\n var cjkSpace = m[4];\n var cjk = m[5];\n \n if (!self.showSpaces && simpleSpace)\n continue;\n\n var before = i != m.index ? value.slice(i, m.index) : \"\";\n\n i = m.index + m[0].length;\n \n if (before) {\n valueFragment.appendChild(this.dom.createTextNode(before, this.element));\n }\n \n if (tab) {\n var tabSize = self.session.getScreenTabSize(screenColumn + m.index);\n valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true));\n screenColumn += tabSize - 1;\n } else if (simpleSpace) {\n if (self.showSpaces) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length);\n valueFragment.appendChild(span);\n } else {\n valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element));\n }\n } else if (controlCharacter) {\n var span = this.dom.createElement(\"span\");\n span.className = \"ace_invisible ace_invisible_space ace_invalid\";\n span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length);\n valueFragment.appendChild(span);\n } else if (cjkSpace) {\n screenColumn += 1;\n \n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = self.showSpaces ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace;\n valueFragment.appendChild(span);\n } else if (cjk) {\n screenColumn += 1;\n var span = this.dom.createElement(\"span\");\n span.style.width = (self.config.characterWidth * 2) + \"px\";\n span.className = \"ace_cjk\";\n span.textContent = cjk;\n valueFragment.appendChild(span);\n }\n }\n \n valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element));\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var span = this.dom.createElement(\"span\");\n if (token.type == \"fold\")\n span.style.width = (token.value.length * this.config.characterWidth) + \"px\";\n \n span.className = classes;\n span.appendChild(valueFragment);\n \n parent.appendChild(span);\n }\n else {\n parent.appendChild(valueFragment);\n }\n \n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(parent, 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 var count = cols/this.tabSize;\n for (var i=0; i= splitChars) {\n screenColumn = this.$renderToken(\n lineEl, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n lineEl = this.$createLineElement();\n parent.appendChild(lineEl);\n\n lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat(\"\\xa0\", splits.indent), this.element));\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 lineEl, screenColumn, token, value\n );\n }\n }\n }\n \n if (splits[splits.length - 1] > this.MAX_LINE_LENGTH)\n this.$renderOverflowMessage(lineEl, screenColumn, null, \"\", true);\n };\n\n this.$renderSimpleLine = function(parent, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(parent, value);\n if (value)\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n if (screenColumn + value.length > this.MAX_LINE_LENGTH)\n return this.$renderOverflowMessage(parent, screenColumn, token, value);\n screenColumn = this.$renderToken(parent, screenColumn, token, value);\n }\n };\n \n this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) {\n token && this.$renderToken(parent, screenColumn, token,\n value.slice(0, this.MAX_LINE_LENGTH - screenColumn));\n \n var overflowEl = this.dom.createElement(\"span\");\n overflowEl.className = \"ace_inline_button ace_keyword ace_toggle_wrap\";\n overflowEl.textContent = hide ? \"\" : \"\";\n \n parent.appendChild(overflowEl); \n };\n this.$renderLine = function(parent, row, 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 var lastLineEl = parent;\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length) {\n this.$renderWrappedLine(parent, tokens, splits);\n var lastLineEl = parent.lastChild;\n } else {\n var lastLineEl = parent;\n if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n this.$renderSimpleLine(lastLineEl, tokens);\n }\n } else if (this.$useLineGroups()) {\n lastLineEl = this.$createLineElement();\n parent.appendChild(lastLineEl);\n }\n\n if (this.showEOL && lastLineEl) {\n if (foldLine)\n row = foldLine.end.row;\n\n var invisibleEl = this.dom.createElement(\"span\");\n invisibleEl.className = \"ace_invisible ace_invisible_eol\";\n invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR;\n \n lastLineEl.appendChild(invisibleEl);\n }\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}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\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 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.$updateOpacity.bind(this);\n};\n\n(function() {\n \n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n dom.setStyle(cursors[i].style, \"opacity\", val ? \"\" : \"0\");\n };\n\n this.$startCssAnimation = function() {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.animationDuration = this.blinkInterval + \"ms\";\n\n this.$isAnimating = true;\n setTimeout(function() {\n if (this.$isAnimating) {\n dom.addCssClass(this.element, \"ace_animate-blinking\");\n }\n }.bind(this));\n };\n \n this.$stopCssAnimation = function() {\n this.$isAnimating = false;\n dom.removeCssClass(this.element, \"ace_animate-blinking\");\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) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\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 this.$stopCssAnimation();\n\n if (this.smoothBlinking) {\n this.$isSmoothBlinking = false;\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible) {\n this.$stopCssAnimation();\n return;\n }\n\n if (this.smoothBlinking) {\n this.$isSmoothBlinking = true;\n setTimeout(function() {\n if (this.$isSmoothBlinking) {\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }\n }.bind(this));\n }\n \n if (dom.HAS_CSS_ANIMATION) {\n this.$startCssAnimation();\n } else {\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 blink();\n }\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 + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\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.isCursorInView = function(pixelPos, config) {\n return pixelPos.top >= 0 && pixelPos.top < config.maxHeight;\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 element = this.cursors[cursorIndex++] || this.addCursor();\n var style = element.style;\n \n if (!this.drawCursor) {\n if (!this.isCursorInView(pixelPos, config)) {\n dom.setStyle(style, \"display\", \"none\");\n } else {\n dom.setStyle(style, \"display\", \"block\");\n dom.translate(element, pixelPos.left, pixelPos.top);\n dom.setStyle(style, \"width\", Math.round(config.characterWidth) + \"px\");\n dom.setStyle(style, \"height\", config.lineHeight + \"px\");\n }\n } else {\n this.drawCursor(element, pixelPos, config, selections[i], this.session);\n }\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.drawCursor = null;\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/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\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.inner.textContent = \"\\xa0\";\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 this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 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 this.$minWidth = 0;\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 if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight = \n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\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 = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\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/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(require, exports, module) {\n\"use strict\";\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.$recursionLimit = 2;\n this.window = win || window;\n var _self = this;\n this._flush = function(ts) {\n _self.pending = false;\n var changes = _self.changes;\n\n if (changes) {\n event.blockIdle(100);\n _self.changes = 0;\n _self.onRender(changes);\n }\n \n if (_self.changes) {\n if (_self.$recursionLimit-- < 0) return;\n _self.schedule();\n } else {\n _self.$recursionLimit = 2;\n }\n };\n};\n\n(function() {\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (this.changes && !this.pending) {\n event.nextFrame(this._flush);\n this.pending = true;\n }\n };\n\n this.clear = function(change) {\n var changes = this.changes;\n this.changes = 0;\n return changes;\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/lib/useragent\",\"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 event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 256;\nvar USE_OBSERVER = typeof ResizeObserver == \"function\";\nvar L = 200;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\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 this.$measureNode.textContent = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n \n \n if (USE_OBSERVER)\n this.$addObserver();\n else\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function(size) {\n if (size === undefined)\n 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.$addObserver = function() {\n var self = this;\n this.$observer = new window.ResizeObserver(function(e) {\n self.checkForSizeChanges();\n });\n this.$observer.observe(this.$measureNode);\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer || this.$observer)\n return this.$pollSizeChangesTimer;\n var self = this;\n \n return this.$pollSizeChangesTimer = event.onIdle(function cb() {\n self.checkForSizeChanges();\n event.onIdle(cb, 500);\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function(node) {\n var size = {\n height: (node || this.$measureNode).clientHeight,\n width: (node || this.$measureNode).clientWidth / 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 w = 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.$observer)\n this.$observer.disconnect();\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n \n this.$getZoom = function getZoom(element) {\n if (!element || !element.parentElement) return 1;\n return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement);\n };\n this.$initTransformMeasureNodes = function() {\n var t = function(t, l) {\n return [\"div\", {\n style: \"position: absolute;top:\" + t + \"px;left:\" + l + \"px;\"\n }];\n };\n this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el);\n };\n this.transformCoordinates = function(clientPos, elPos) {\n if (clientPos) {\n var zoom = this.$getZoom(this.el);\n clientPos = mul(1 / zoom, clientPos);\n }\n function solve(l1, l2, r) {\n var det = l1[1] * l2[0] - l1[0] * l2[1];\n return [\n (-l2[1] * r[0] + l2[0] * r[1]) / det,\n (+l1[1] * r[0] - l1[0] * r[1]) / det\n ];\n }\n function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }\n function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; }\n function mul(a, b) { return [a * b[0], a * b[1]]; }\n\n if (!this.els)\n this.$initTransformMeasureNodes();\n \n function p(el) {\n var r = el.getBoundingClientRect();\n return [r.left, r.top];\n }\n\n var a = p(this.els[0]);\n var b = p(this.els[1]);\n var c = p(this.els[2]);\n var d = p(this.els[3]);\n\n var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a)));\n\n var m1 = mul(1 + h[0], sub(b, a));\n var m2 = mul(1 + h[1], sub(c, a));\n \n if (elPos) {\n var x = elPos;\n var k = h[0] * x[0] / L + h[1] * x[1] / L + 1;\n var ut = add(mul(x[0], m1), mul(x[1], m2));\n return add(mul(1 / k / L, ut), a);\n }\n var u = sub(clientPos, a);\n var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u);\n return mul(L, f);\n };\n \n}).call(FontMetrics.prototype);\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/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\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 = \"\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\npadding: 0;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\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;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\ncontain: style size layout;\\\nfont-variant-ligatures: no-common-ligatures;\\\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;\\\ncontain: style size layout;\\\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 {\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\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 {\\\ncontain: strict;\\\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;\\\ncontain: strict;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: transparent;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\n}\\\n.ace_composition_placeholder { color: transparent }\\\n.ace_composition_marker { \\\nborder-bottom: 1px solid;\\\nposition: absolute;\\\nborder-radius: 0;\\\nmargin-top: 1px;\\\n}\\\n[ace_nocontext=true] {\\\ntransform: none!important;\\\nfilter: none!important;\\\nclip-path: none!important;\\\nmask : none!important;\\\ncontain: none!important;\\\nperspective: none!important;\\\nmix-blend-mode: initial!important;\\\nz-index: auto;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\nheight: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\nposition: absolute;\\\nheight: 1000000px;\\\nwidth: 1000000px;\\\ncontain: style size layout;\\\n}\\\n.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\\\ncontain: style size layout;\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_hidpi .ace_text-layer,\\\n.ace_hidpi .ace_gutter-layer,\\\n.ace_hidpi .ace_content,\\\n.ace_hidpi .ace_gutter {\\\ncontain: strict;\\\nwill-change: transform;\\\n}\\\n.ace_hidpi .ace_text-layer > .ace_line, \\\n.ace_hidpi .ace_text-layer > .ace_line_group {\\\ncontain: strict;\\\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;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\\\nopacity: 0;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_animate-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: step-end;\\\nanimation-name: blink-ace-animate;\\\nanimation-iteration-count: infinite;\\\n}\\\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\\\nanimation-duration: 1000ms;\\\nanimation-timing-function: ease-in-out;\\\nanimation-name: blink-ace-animate-smooth;\\\n}\\\n@keyframes blink-ace-animate {\\\nfrom, to { opacity: 1; }\\\n60% { opacity: 0; }\\\n}\\\n@keyframes blink-ace-animate-smooth {\\\nfrom, to { opacity: 1; }\\\n45% { opacity: 1; }\\\n60% { opacity: 0; }\\\n85% { opacity: 0; }\\\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_error_bracket {\\\nposition: absolute;\\\nborder-bottom: 1px solid #DE5555;\\\nborder-radius: 0;\\\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;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\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;\\\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: 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;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\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 {\\\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);\\\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);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\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 {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_inline_button {\\\nborder: 1px solid lightgray;\\\ndisplay: inline-block;\\\nmargin: -1px 8px;\\\npadding: 0 5px;\\\npointer-events: auto;\\\ncursor: pointer;\\\n}\\\n.ace_inline_button:hover {\\\nborder-color: gray;\\\nbackground: rgba(200,200,200,0.2);\\\ndisplay: inline-block;\\\npointer-events: auto;\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\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.ace_mobile-menu {\\\nposition: absolute;\\\nline-height: 1.5;\\\nborder-radius: 4px;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\nbackground: white;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #dcdcdc;\\\ncolor: black;\\\n}\\\n.ace_dark > .ace_mobile-menu {\\\nbackground: #333;\\\ncolor: #ccc;\\\nbox-shadow: 1px 3px 2px grey;\\\nborder: 1px solid #444;\\\n}\\\n.ace_mobile-button {\\\npadding: 2px;\\\ncursor: pointer;\\\noverflow: hidden;\\\n}\\\n.ace_mobile-button:hover {\\\nbackground-color: #eee;\\\nopacity:1;\\\n}\\\n.ace_mobile-button:active {\\\nbackground-color: #ddd;\\\n}\\\n.ace_placeholder {\\\nfont-family: arial;\\\ntransform: scale(0.9);\\\ntransform-origin: left;\\\nwhite-space: pre;\\\nopacity: 0.7;\\\nmargin: 0 10px;\\\n}\";\n\nvar useragent = require(\"./lib/useragent\");\nvar HIDE_TEXTAREA = useragent.isIE;\n\ndom.importCssString(editorCss, \"ace_editor.css\", false);\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n\n dom.addCssClass(this.container, \"ace_editor\");\n if (dom.HI_DPI) dom.addCssClass(this.container, \"ace_hidpi\");\n\n this.setTheme(theme);\n if (config.get(\"useStrictCSP\") == null) \n config.set(\"useStrictCSP\", false);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n \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.on(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.on(\"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);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.on(\"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.margin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n \n this.$keepTextAreaAtCursor = !useragent.isIOS;\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._signal(\"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 dom.setStyle(this.scroller.style, \"line-height\", this.lineHeight + \"px\");\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 && 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 if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\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, force) {\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 if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\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 this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\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 \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 this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\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 dom.setStyle(this.scrollBarH.element.style, \"left\", gutterWidth + \"px\");\n dom.setStyle(this.scroller.style, \"left\", gutterWidth + this.margin.left + \"px\");\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h);\n dom.setStyle(this.$gutter.style, \"left\", this.margin.left + \"px\");\n \n var right = this.scrollBarV.getWidth() + \"px\";\n dom.setStyle(this.scrollBarH.element.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"right\", right);\n dom.setStyle(this.scroller.style, \"bottom\", this.scrollBarH.getHeight());\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) {\n changes |= this.CHANGE_FULL;\n }\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(width) {\n var gutterWidth = this.$showGutter ? width : 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 }\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 this.session.$bidiHandler.setShowInvisibles(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.$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 = Math.round(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.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (this.$isMousePressed) return;\n var style = this.textarea.style;\n var composition = this.$composition;\n if (!this.$keepTextAreaAtCursor && !composition) {\n dom.translate(this.textarea, -100, 0);\n return;\n }\n var pixelPos = this.$cursorLayer.$pixelPos;\n if (!pixelPos)\n return;\n if (composition && composition.markerRange)\n pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true);\n \n var config = this.layerConfig;\n var posTop = pixelPos.top;\n var posLeft = pixelPos.left;\n posTop -= config.offset;\n\n var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1;\n if (posTop < 0 || posTop > config.height - h) {\n dom.translate(this.textarea, 0, 0);\n return;\n }\n\n var w = 1;\n var maxTop = this.$size.height - h;\n if (!composition) {\n posTop += this.lineHeight;\n }\n else {\n if (composition.useTextareaForIME) {\n var val = this.textarea.value;\n w = this.characterWidth * (this.session.$getStringScreenWidth(val)[0]);\n }\n else {\n posTop += this.lineHeight + 2;\n }\n }\n \n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth + this.margin.left;\n\n dom.setStyle(style, \"height\", h + \"px\");\n dom.setStyle(style, \"width\", w + \"px\");\n dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop));\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 config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\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 \n this.setMargin = function(top, bottom, left, right) {\n var sm = this.margin;\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 this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height);\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.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + 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\", changes);\n \n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\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() | this.$loop.clear();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig() | this.$loop.clear();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n \n dom.translate(this.content, -this.scrollLeft, -config.offset);\n \n var width = config.width + 2 * this.$padding + \"px\";\n var height = config.minHeight + \"px\";\n \n dom.setStyle(this.content.style, \"width\", width);\n dom.setStyle(this.content.style, \"height\", height);\n }\n if (changes & this.CHANGE_H_SCROLL) {\n dom.translate(this.content, -this.scrollLeft, -config.offset);\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$changedLines = null;\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._signal(\"afterRender\", changes);\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n this.$changedLines = null;\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 if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES)\n this.$gutterLayer.update(config);\n else\n this.$gutterLayer.scrollLines(config);\n }\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\", changes);\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$changedLines = null;\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 else if (changes & this.CHANGE_CURSOR) {\n if (this.$highlightGutterLine)\n this.$gutterLayer.updateLineHighlight(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\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\", changes);\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.min(maxHeight, \n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n \n var hideScrollbars = desiredHeight <= 2 * this.lineHeight;\n var vScroll = !hideScrollbars && 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 this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\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 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 var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var offset = this.scrollTop % this.lineHeight;\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 || hScrollChanged) \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 : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n if (this.session.$bidiHandler)\n this.session.$bidiHandler.setContentWidth(longestLine - this.$padding);\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\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 if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH)\n charCount = this.$textLayer.MAX_LINE_LENGTH + 30;\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 && scrollTop + topMargin > top + this.lineHeight)\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 && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight + bottomMargin - 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 (!_self.session) \n return clearInterval(_self.$timer);\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(x);\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 < -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;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n \n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos;\n if (this.$hasCssTransforms) {\n canvasPos = {top:0, left: 0};\n var p = this.$fontMetrics.transformCoordinates([x, y]);\n x = p[1] - this.gutterWidth - this.margin.left;\n y = p[0];\n } else {\n canvasPos = this.scroller.getBoundingClientRect();\n }\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\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 + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n \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(composition) {\n this.$composition = composition;\n if (!composition.cssText) {\n composition.cssText = this.textarea.style.cssText;\n }\n if (composition.useTextareaForIME == undefined)\n composition.useTextareaForIME = this.$useTextareaForIME;\n \n if (this.$useTextareaForIME) {\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n this.$cursorLayer.element.style.display = \"none\";\n }\n else {\n composition.markerId = this.session.addMarker(composition.markerRange, \"ace_composition_marker\", \"text\");\n }\n };\n this.setCompositionText = function(text) {\n var cursor = this.session.selection.cursor;\n this.addToken(text, \"composition_placeholder\", cursor.row, cursor.column);\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n \n if (this.$composition.markerId)\n this.session.removeMarker(this.$composition.markerId);\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = this.$composition.cssText;\n var cursor = this.session.selection.cursor;\n this.removeExtraToken(cursor.row, cursor.column);\n this.$composition = null;\n this.$cursorLayer.element.style.display = \"\";\n };\n \n this.addToken = function(text, type, row, column) {\n var session = this.session;\n session.bgTokenizer.lines[row] = null;\n var newToken = {type: type, value: text};\n var tokens = session.getTokens(row);\n if (column == null) {\n tokens.push(newToken);\n } else {\n var l = 0;\n for (var i =0; i < tokens.length; i++) {\n var token = tokens[i];\n l += token.value.length;\n if (column <= l) {\n var diff = token.value.length - (l - column);\n var before = token.value.slice(0, diff);\n var after = token.value.slice(diff);\n \n tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after});\n break;\n }\n }\n }\n this.updateLines(row, row);\n };\n\n this.removeExtraToken = function(row, column) {\n this.updateLines(row, row);\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 || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n if (module.$id)\n _self.$themeId = module.$id;\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container\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 dom.setStyle(this.scroller.style, \"cursor\", style);\n };\n this.setMouseCursor = function(cursorStyle) {\n dom.setStyle(this.scroller.style, \"cursor\", cursorStyle);\n };\n \n this.attachToShadowRoot = function() {\n dom.importCssString(editorCss, \"ace_editor.css\", this.container);\n };\n this.destroy = function() {\n this.freeze();\n this.$fontMetrics.destroy();\n this.$cursorLayer.destroy();\n this.removeAllListeners();\n this.container.textContent = \"\";\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) {\n this.$gutterLayer.setShowFoldWidgets(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 this.$gutterLayer.setHighlightGutterLine(shouldHighlight);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: 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 if (!(this.$minLines < 0x1ffffffffffff))\n this.$minLines = 0;\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\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 hasCssTransforms: {\n },\n useTextareaForIME: {\n initialValue: !useragent.isMobile && !useragent.isIE\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar net = require(\"../lib/net\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nfunction $workerBlob(workerUrl) {\n var script = \"importScripts('\" + net.qualifyURL(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\nfunction createWorker(workerUrl) {\n if (typeof Worker == \"undefined\")\n return { postMessage: function() {}, terminate: function() {} };\n if (config.get(\"loadWorkerFromBlob\")) {\n var blob = $workerBlob(workerUrl);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n }\n return new Worker(workerUrl);\n}\n\nvar WorkerClient = function(worker) {\n if (!worker.postMessage)\n worker = this.$createWorkerFromOldConfig.apply(this, arguments);\n\n this.$worker = worker;\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\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.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\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 this.$worker = createWorker(workerUrl);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod,\n classname : classname\n });\n return this.$worker;\n };\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\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 case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"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 if (data.data && data.data.err)\n data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code};\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\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(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n\n var messageBuffer = [];\n var workerClient = new WorkerClient({\n messageBuffer: messageBuffer,\n terminate: function() {},\n postMessage: function(e) {\n messageBuffer.push(e);\n if (!main) return;\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n });\n\n workerClient.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = 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 workerClient.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 (messageBuffer.length)\n processNext();\n });\n\n return workerClient;\n};\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\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 \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\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 });\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(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = 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 \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\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 this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\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 this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) 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.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.off(\"change\", this.$onUpdate);\n this.session.selection.off(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\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(this.session, true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\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 = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\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 var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\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.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\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 (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\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 if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n };\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n blockSelect();\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\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/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(require, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n description: \"Add cursor above\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n description: \"Add cursor below\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n description: \"Add cursor above (skip current)\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n description: \"Add cursor below (skip current)\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n description: \"Select more before\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n description: \"Select more after\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n description: \"Select next before\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n description: \"Select next after\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"toggleSplitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) {\n if (editor.multiSelect.rangeCount > 1)\n editor.multiSelect.joinSelections();\n else\n editor.multiSelect.splitIntoLines();\n },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"splitSelectionIntoLines\",\n description: \"Split into lines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n readOnly: true\n}, {\n name: \"alignCursors\",\n description: \"Align cursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n description: \"Find all\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n description: \"Single selection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\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/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\nvar RangeList = require(\"./range_list\").RangeList;\nvar Range = require(\"./range\").Range;\nvar Selection = require(\"./selection\").Selection;\nvar onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar commands = require(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = require(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = require(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 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 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 };\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 this.splitIntoLines = function () {\n var ranges = this.ranges.length ? this.ranges : [this.getRange()];\n var newRanges = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n var row = range.start.row;\n var endRow = range.end.row;\n if (row === endRow) {\n newRanges.push(range.clone());\n } else {\n newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length));\n while (++row < endRow)\n newRanges.push(this.getLineRange(row, true));\n newRanges.push(new Range(endRow, 0, endRow, range.end.column));\n }\n if (i == 0 && !this.isBackwards())\n newRanges = newRanges.reverse();\n }\n this.toSingleRange();\n for (var i = newRanges.length; i--;)\n this.addRange(newRanges[i]);\n };\n \n this.joinSelections = function () {\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 };\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.cursor);\n var anchor = this.session.documentToScreenPosition(this.anchor);\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 var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\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 var docEnd;\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n 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, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(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 if (selection.ranges[0])\n selection.fromOrientedRange(selection.ranges[0]);\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 \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n else\n this.multiSelect.mergeOverlappingRanges();\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\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 if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\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 sel.fromOrientedRange(sel.ranges[0]);\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\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 if (stopAtFirst)\n return;\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.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\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 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 \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\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.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.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 sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\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 && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\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 session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && 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 editor.$checkMultiselectChange = editor.$checkMultiselectChange.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 if (!editor.textInput) return;\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n }, editor);\n\n event.addListener(el, \"keyup\", reset, editor);\n event.addListener(el, \"blur\", reset, editor);\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 enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\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 var token = session.getTokenAt(row, 0);\n if (!token || token.type !== \"string\")\n break;\n }\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/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\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;\\\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\";\nexports.$id = \"ace/theme/textmate\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass, false);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"./lib/dom\");\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.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\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 && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && 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 if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\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.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == \"remove\") {\n var removed = lineWidgets.splice(startRow + 1, len);\n if (!lineWidgets[startRow] && removed[removed.length - 1]) {\n lineWidgets[startRow] = removed.pop();\n }\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n if (lineWidgets[startRow] && lineWidgets[startRow].column != null) {\n if (delta.start.column > lineWidgets[startRow].column)\n startRow++;\n }\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 while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.$registerLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n return w;\n };\n \n this.addLineWidget = function(w) {\n this.$registerLineWidget(w);\n w.session = this.session;\n \n if (!this.editor) return 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 if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\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 var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\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 || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\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 if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n 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.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\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/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar LineWidgets = require(\"../line_widgets\").LineWidgets;\nvar dom = require(\"../lib/dom\");\nvar Range = require(\"../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)\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.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\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 type: \"errorMarker\"\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\", \"error_marker.css\", false);\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/range\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\nace_exports = exports;\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Range = require(\"./range\").Range;\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./multi_select\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\nrequire(\"./ext/error_marker\");\n\nexports.config = require(\"./config\");\nexports.require = require;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el, options) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = el.textContent;\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el), doc, options);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.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.Range = Range;\nexports.Editor = Editor;\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.VirtualRenderer = Renderer;\nexports.version = exports.config.version;\n}); (function() {\n ace.require([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n window.ace[\"default\"] = window.ace;\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = window.ace;\n }\n });\n })();\n\n\nexport default ace_exports;\n", "import ace from './ace.js';\nimport _ from \"lodash\";\n\nexport default \"mode-n1ql\";\n\n(function() {\n\n //\n // some globals used by both the highlighter and the autocompleter\n //\n\n var keywords = (\n \"ADVISE|ALL|ALTER|ANALYZE|AND|ANY|ARRAY|AS|ASC|BEGIN|BETWEEN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CASE|CAST|\" +\n \"CLUSTER|COLLATE|COLLECTION|COMMIT|CONNECT|CONTINUE|CORRELATED|CORRELATE|COVER|CREATE|CURRENT|DATABASE|DATASET|\" +\n \"DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|ELSE|END|EVERY|EXCEPT|\" +\n \"EXCLUDE|EXECUTE|EXISTS|EXPLAIN|FETCH|FIRST|FLATTEN|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|\" +\n \"GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|IN|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|\" +\n \"JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LIKE|LIMIT|LSM|MAP|MAPPING|MATCHED|\" +\n \"MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NAMESPACE_ID|NEST|NL|NO|NOT|NOT_A_TOKEN|NTH_VALUE|NULL|NULLS|NUMBER|\" +\n \"OBJECT|OFFSET|ON|OPTION|OR|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|\" +\n \"PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|\" +\n \"ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|THEN|TIES|TO|\" +\n \"TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|\" +\n \"VALIDATE|VALUE|VALUED|VALUES|VIA|VIEW|WHEN|WHERE|WHILE|WITH|WITHIN|WORK|XOR\"\n );\n var keywords_array = keywords.split('|');\n\n var sysCatalogs = (\n \"system:active_requests|system:applicable_roles|system:completed_requests|system:datastores|system:dual|\" +\n \"system:functions|system:functions_cache|system:indexes|system:keyspaces|system:my_user_info|system:namespaces|\" +\n \"system:nodes|system:prepareds|system:user_info\"\n );\n var sysCatalogs_array = sysCatalogs.split('|');\n\n var roles = (\n \"ADMIN|RO_ADMIN|CLUSTER_ADMIN|BUCKET_ADMIN|BUCKET_ADMIN|BUCKET_ADMIN|BUCKET_ADMIN|BUCKET_ADMIN|BUCKET_SASL|\" +\n \"BUCKET_SASL|BUCKET_SASL|BUCKET_SASL|BUCKET_SASL|VIEWS_ADMIN|VIEWS_ADMIN|VIEWS_ADMIN|VIEWS_ADMIN|VIEWS_ADMIN|\" +\n \"REPLICATION_ADMIN|DATA_READER|DATA_READER|DATA_READER|DATA_READER|DATA_READER|DATA_READER_WRITER|\" +\n \"DATA_READER_WRITER|DATA_READER_WRITER|DATA_READER_WRITER|DATA_READER_WRITER|DATA_DCP_READER|DATA_DCP_READER|\" +\n \"DATA_DCP_READER|DATA_DCP_READER|DATA_DCP_READER|DATA_BACKUP|DATA_BACKUP|DATA_BACKUP|DATA_BACKUP|DATA_BACKUP|\" +\n \"DATA_MONITORING|DATA_MONITORING|DATA_MONITORING|DATA_MONITORING|DATA_MONITORING|FTS_ADMIN|FTS_ADMIN|FTS_ADMIN|\" +\n \"FTS_ADMIN|FTS_ADMIN|FTS_SEARCHER|FTS_SEARCHER|FTS_SEARCHER|FTS_SEARCHER|FTS_SEARCHER|QUERY_SELECT|QUERY_SELECT|\" +\n \"QUERY_SELECT|QUERY_SELECT|QUERY_SELECT|QUERY_UPDATE|QUERY_UPDATE|QUERY_UPDATE|QUERY_UPDATE|QUERY_UPDATE|\" +\n \"QUERY_INSERT|QUERY_INSERT|QUERY_INSERT|QUERY_INSERT|QUERY_INSERT|QUERY_DELETE|QUERY_DELETE|QUERY_DELETE|\" +\n \"QUERY_DELETE|QUERY_DELETE|QUERY_MANAGE_INDEX|QUERY_MANAGE_INDEX|QUERY_MANAGE_INDEX|QUERY_MANAGE_INDEX|\" +\n \"QUERY_MANAGE_INDEX|QUERY_SYSTEM_CATALOG|QUERY_EXTERNAL_ACCESS\"\n );\n var roles_array = roles.split('|');\n\n var builtinConstants = (\n \"TRUE|FALSE|INDEXES|KEYSPACES\"\n );\n var builtinConstants_array = builtinConstants.split('|');\n\n // this list of functions should be updated w.r.t. https://github.com/couchbase/query/blob/master/expression/func_registry.go\n var Arithmetic = \"ADD|DIV|IDIV|IMOD|MOD|MULT|NEG|SUB\";\n var Comparison = \"BETWEEN|EQ|IS_KNOWN|IS_MISSING|IS_NOT_KNOWN|IS_NOT_MISSING|IS_NOT_NULL|IS_NOT_VALUED|IS_NOT_UNKNOWN|\" +\n \t\t\"IS_NULL|IS_VALUED|ISKNOWN|ISMISSING|ISNOTKNOWN|ISNOTMISSING|ISNOTNULL|ISNOTUNKNOWN|ISNOTVALUED|ISNULL|ISUNKNOWN|\" +\n \t\t\"ISVALUED|LE|LIKE|LT|LIKE_PREFIX|LIKE_STOP|LIKE_SUFFIX|REGEXP_PREFIX|REGEXP_STOP|REGEXP_SUFFIX\";\n var Concat = \"CONCAT|CONCAT2\";\n var Costruction = \"ARRAY\";\n var Navigation = \"ELEMENT|FIELD|SLICE\";\n var Curl = \"CURL\";\n var Date = \"CLOCK_LOCAL|CLOCK_MILLIS|CLOCK_STR|CLOCK_TZ|CLOCK_UTC|DATE_ADD_MILLIS|DATE_ADD_STR|DATE_DIFF_MILLIS|\" +\n \t\t\"DATE_DIFF_STR|DATE_DIFF_ABS_STR|DATE_DIFF_ABS_MILLIS|DATE_FORMAT_STR|DATE_PART_MILLIS|DATE_PART_STR|\" +\n \t\t\"DATE_RANGE_MILLIS|DATE_RANGE_STR|DATE_TRUNC_MILLIS|DATE_TRUNC_STR|DURATION_TO_STR|MILLIS|MILLIS_TO_LOCAL|\" +\n \t\t\"MILLIS_TO_STR|MILLIS_TO_TZ|MILLIS_TO_UTC|MILLIS_TO_ZONE_NAME|NOW_LOCAL|NOW_MILLIS|NOW_STR|NOW_TZ|NOW_UTC|\" +\n \t\t\"STR_TO_DURATION|STR_TO_MILLIS|STR_TO_TZ|STR_TO_UTC|STR_TO_ZONE_NAME|WEEKDAY_MILLIS|WEEKDAY_STR\";\n var String = \"CONTAINS|INITCAP|LENGTH|LOWER|LTRIM|POSITION|POS|POSITION0|POS0|POSITION1|POS1|REPEAT|REPLACE|REVERSE|\" +\n \t\t\"RTRIM|SPLIT|SUBSTR|SUBSTR0|SUBSTR1|SUFFIXES|TITLE|TRIM|UPPER\";\n var Regular_expressions = \"CONTAINS_REGEX|CONTAINS_REGEXP|REGEX_CONTAINS|REGEX_LIKE|REGEX_POSITION0|REGEX_POS0|\" +\n \t\t\"REGEXP_POSITION0|REGEXP_POS0|REGEX_POSITION1|REGEX_POS1|REGEXP_POSITION1|REGEXP_POS1|REGEX_POSITION|REGEX_POS|\" +\n \t\t\"REGEX_REPLACE|REGEXP_CONTAINS|REGEXP_LIKE|REGEXP_POSITION|REGEXP_POS|REGEXP_REPLACE|REGEXP_MATCHES|REGEXP_SPLIT\";\n var Numeric = \"ABS|ACOS|ASIN|ATAN|ATAN2|CEIL|COS|DEG|DEGREES|E|EXP|LN|LOG|FLOOR|INF|NAN|NEGINF|NEG_INF|PI|POSINF|\" +\n \t\t\"POS_INF|POWER|RAD|RADIANS|RANDOM|ROUND|SIGN|SIN|SQRT|TAN|TRUNC\";\n var Bitwise = \"BITAND|BITOR|BITXOR|BITNOT|BITSHIFT|BITSET|BITCLEAR|BITTEST|ISBITSET\";\n var Array = \"ARRAY_ADD|ARRAY_APPEND|ARRAY_AVG|ARRAY_CONCAT|ARRAY_CONTAINS|ARRAY_COUNT|ARRAY_DISTINCT|ARRAY_FLATTEN|\" +\n \t\t\"ARRAY_IFNULL|ARRAY_INSERT|ARRAY_INTERSECT|ARRAY_LENGTH|ARRAY_MAX|ARRAY_MIN|ARRAY_POSITION|ARRAY_POS|ARRAY_PREPEND|\" +\n \t\t\"ARRAY_PUT|ARRAY_RANGE|ARRAY_REMOVE|ARRAY_REPEAT|ARRAY_REPLACE|ARRAY_REVERSE|ARRAY_SORT|ARRAY_STAR|ARRAY_SUM|\" +\n \t\t\"ARRAY_SYMDIFF|ARRAY_SYMDIFF1|ARRAY_SYMDIFFN|ARRAY_UNION|ARRAY_SWAP|ARRAY_MOVE|ARRAY_EXCEPT|ARRAY_BINARY_SEARCH\";\n var Object = \"OBJECT_ADD|OBJECT_CONCAT|OBJECT_INNER_PAIRS|OBJECT_INNERPAIRS|OBJECT_INNER_VALUES|OBJECT_INNERVALUES|\" +\n \t\t\"OBJECT_LENGTH|OBJECT_NAMES|OBJECT_OUTER_PAIRS|OBJECT_OUTERPAIRS|OBJECT_OUTER_VALUES|OBJECT_OUTERVALUES|\" +\n \t\t\"OBJECT_PAIRS|OBJECT_PUT|OBJECT_REMOVE|OBJECT_RENAME|OBJECT_REPLACE|OBJECT_UNWRAP|OBJECT_VALUES\";\n var Json = \"DECODE_JSON|ENCODE_JSON|ENCODED_SIZE|JSON_DECODE|JSON_ENCODE|PAIRS|POLY_LENGTH\";\n var Base64 = \"BASE64|BASE64_DECODE|BASE64_ENCODE|DECODE_BASE64|ENCODE_BASE64\";\n var Comparison2 = \"GREATEST|LEAST|SUCCESSOR\";\n var Token = \"CONTAINS_TOKEN|CONTAINS_TOKEN_LIKE|CONTAINS_TOKEN_REGEX|CONTAINS_TOKEN_REGEXP|HAS_TOKEN|TOKENS\";\n var Conditional_for_unknowns = \"IF_MISSING|IF_MISSING_OR_NULL|IF_NULL|MISSING_IF|NULL_IF|IFMISSING|IFMISSINGORNULL|\" +\n \t\t\"IFNULL|MISSINGIF|NULLIF|COALESCE|NVL|NVL2\";\n var Conditional_for_numbers = \"IF_INF|IF_NAN|IF_NAN_OR_INF|NAN_IF|NEGINF_IF|POSINF_IF|IFINF|IFNAN|IFNANORINF|NANIF|\" +\n \t\t\"NEGINFIF|POSINFIF\";\n var Meta = \"META|MIN_VERSION|SELF|UUID|VERSION|CURRENT_USERS|DS_VERSION\";\n var Distributed = \"NODE_NAME\";\n var Type_checking = \"IS_ARRAY|IS_ATOM|IS_BIN|IS_BINARY|IS_BOOL|IS_BOOLEAN|IS_NUM|IS_NUMBER|IS_OBJ|IS_OBJECT|IS_STR|\" +\n \t\t\"IS_STRING|ISARRAY|ISATOM|ISBIN|ISBINARY|ISBOOL|ISBOOLEAN|ISNUM|ISNUMBER|ISOBJ|ISOBJECT|ISSTR|ISSTRING|TYPE|\" +\n \t\t\"TYPE_NAME|TYPENAME\";\n var Type_conversion = \"TO_ARRAY|TO_ATOM|TO_BOOL|TO_BOOLEAN|TO_NUM|TO_NUMBER|TO_OBJ|TO_OBJECT|TO_STR|TO_STRING|TOARRAY|\" +\n \t\t\"TOATOM|TOBOOL|TOBOOLEAN|TONUM|TONUMBER|TOOBJ|TOOBJECT|TOSTR|TOSTRING|DECODE\";\n var Unnest = \"UNNEST_POSITION|UNNEST_POS\";\n var Index_Advisor = \"ADVISOR\";\n\n // plus aggregates from https://github.com/couchbase/query/blob/master/algebra/agg_registry.go\n var Aggregates = \"ARRAY_AGG|AVG|COUNT|COUNTN|MAX|MEAN|MEDIAN|MIN|STDDEV|STDDEV_POP|STDDEV_SAMP|SUM|VARIANCE|VAR_POP|\" +\n \t\t\"VARIANCE_POP|VAR_SAMP|VARIANCE_SAMP|ROW_NUMBER|RANK|DENSE_RANK|PERCENT_RANK|CUME_DIST|RATIO_TO_REPORT|NTILE|\" +\n \t\t\"FIRST_VALUE|LAST_VALUE|NTH_VALUE|LAG|LEAD\";\n\n var builtinFunctions = (\n Arithmetic + \"|\" + Comparison + \"|\" + Concat + \"|\" + Costruction + \"|\" +\n Navigation + \"|\" + Curl + \"|\" + Date + \"|\" + String + \"|\" + Regular_expressions + \"|\" + Numeric + \"|\" +\n Bitwise + \"|\" + Array + \"|\" + Object + \"|\" + Json + \"|\" + Base64 + \"|\" + Comparison2 + \"|\" + Token + \"|\" +\n Conditional_for_unknowns + \"|\" + Conditional_for_numbers + \"|\" + Meta + \"|\" + Distributed + \"|\" +\n Type_checking + \"|\" + Type_conversion + \"|\" + Unnest + \"|\" + Index_Advisor + \"|\" + Aggregates\n );\n var builtinFunctions_array = builtinFunctions.split('|');\n\n //\n // put all categories of keywords in one data structure we can traverse\n //\n\n var terms = [\n {name:\"keyword\", tokens: keywords_array},\n {name:\"built-in\", tokens: builtinConstants_array},\n {name:\"function\", tokens: builtinFunctions_array},\n {name:\"role\", tokens: roles_array},\n {name:\"system-catalog\", tokens: sysCatalogs_array}\n ];\n\n //\n // language tokens\n //\n\n ace.define(\"ace/mode/n1ql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],\n function(require, exports, module) {\n \"use strict\";\n\n var oop = require(\"../lib/oop\");\n var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n var N1qlHighlightRules = function() {\n\n var keywordMapper = this.createKeywordMapper({\n \"support.function\": builtinFunctions,\n \"keyword\": keywords,\n \"constant.language\": builtinConstants,\n \"storage.type\": roles\n }, \"identifier\", true);\n\n this.$rules = {\n \"start\" : [ {\n token : \"comment\",\n start : \"/\\\\*\",\n end : \"\\\\*/\"\n }, {\n token : \"constant.numeric\", // \" string, make blue like numbers\n regex : '\".*?\"'\n }, {\n token : \"constant.numeric\", // ' string, make blue like numbers\n regex : \"'.*?'\"\n }, {\n token : \"identifier\", // ` quoted identifier, make like identifiers\n regex : \"[`](([`][`])|[^`])+[`]\"\n }, {\n token : \"constant.numeric\", // float\n regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\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 };\n this.normalizeRules();\n };\n\n oop.inherits(N1qlHighlightRules, TextHighlightRules);\n\n exports.N1qlHighlightRules = N1qlHighlightRules;\n });\n\n\n /*\n * Define the N1QL mode\n */\n\n ace.define(\"ace/mode/n1ql_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n \"use strict\";\n\n var TokenIterator = require(\"../token_iterator\").TokenIterator;\n\n\n function is(token, type) {\n return token.type.lastIndexOf(type + \".xml\") > -1;\n }\n\n function findTagName(session, pos) {\n var iterator = new TokenIterator(session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n while (token && !is(token, \"tag-name\")){\n token = iterator.stepBackward();\n }\n if (token)\n return token.value;\n }\n\n var N1qlCompletions = function() {\n };\n\n (function() {\n\n this.getCompletions = function(state, session, pos, prefix) {\n var token = session.getTokenAt(pos.row, pos.column);\n\n // return anything matching from the terms structure\n\n var results = [];\n var prefix_upper = prefix.toLocaleUpperCase();\n\n for (var i=0; i/,\n next : \"start\"\n }, {\n token : \"keyword.operator\",\n regex : /--|\\+\\+|\\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\\|\\||\\?:|[!$%&*+\\-~\\/^]=?/,\n next : \"start\"\n }, {\n token : \"punctuation.operator\",\n regex : /[?:,;.]/,\n next : \"start\"\n }, {\n token : \"paren.lparen\",\n regex : /[\\[({]/,\n next : \"start\"\n }, {\n token : \"paren.rparen\",\n regex : /[\\])}]/\n }, {\n token: \"comment\",\n regex: /^#!.*$/\n }\n ],\n property: [{\n token : \"text\",\n regex : \"\\\\s+\"\n }, {\n token : [\n \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n \"keyword.operator\", \"text\",\n \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n ],\n regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",\n next: \"function_arguments\"\n }, {\n token : \"punctuation.operator\",\n regex : /[.](?![.])/\n }, {\n token : \"support.function\",\n regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n }, {\n token : \"support.function.dom\",\n regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n }, {\n token : \"support.constant\",\n regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n }, {\n token : \"identifier\",\n regex : identifierRe\n }, {\n regex: \"\",\n token: \"empty\",\n next: \"no_regex\"\n }\n ],\n \"start\": [\n DocCommentHighlightRules.getStartRule(\"doc-start\"),\n comments(\"start\"),\n {\n token: \"string.regexp\",\n regex: \"\\\\/\",\n next: \"regex\"\n }, {\n token : \"text\",\n regex : \"\\\\s+|^$\",\n next : \"start\"\n }, {\n token: \"empty\",\n regex: \"\",\n next: \"no_regex\"\n }\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\",\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.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 \"function_arguments\": [\n {\n token: \"variable.parameter\",\n regex: identifierRe\n }, {\n token: \"punctuation.operator\",\n regex: \"[, ]+\"\n }, {\n token: \"punctuation.operator\",\n regex: \"$\"\n }, {\n token: \"empty\",\n regex: \"\",\n next: \"no_regex\"\n }\n ],\n \"qqstring\" : [\n {\n token : \"constant.language.escape\",\n regex : escapedRe\n }, {\n token : \"string\",\n regex : \"\\\\\\\\$\",\n consumeLineEnd : true\n }, {\n token : \"string\",\n regex : '\"|$',\n next : \"no_regex\"\n }, {\n defaultToken: \"string\"\n }\n ],\n \"qstring\" : [\n {\n token : \"constant.language.escape\",\n regex : escapedRe\n }, {\n token : \"string\",\n regex : \"\\\\\\\\$\",\n consumeLineEnd : true\n }, {\n token : \"string\",\n regex : \"'|$\",\n next : \"no_regex\"\n }, {\n defaultToken: \"string\"\n }\n ]\n };\n\n\n if (!options || !options.noES6) {\n this.$rules.no_regex.unshift({\n regex: \"[{}]\", onMatch: function(val, state, stack) {\n this.next = val == \"{\" ? this.nextState : \"\";\n if (val == \"{\" && stack.length) {\n stack.unshift(\"start\", state);\n }\n else if (val == \"}\" && stack.length) {\n stack.shift();\n this.next = stack.shift();\n if (this.next.indexOf(\"string\") != -1 || this.next.indexOf(\"jsx\") != -1)\n return \"paren.quasi.end\";\n }\n return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n },\n nextState: \"start\"\n }, {\n token : \"string.quasi.start\",\n regex : /`/,\n push : [{\n token : \"constant.language.escape\",\n regex : escapedRe\n }, {\n token : \"paren.quasi.start\",\n regex : /\\${/,\n push : \"start\"\n }, {\n token : \"string.quasi.end\",\n regex : /`/,\n next : \"pop\"\n }, {\n defaultToken: \"string.quasi\"\n }]\n });\n\n if (!options || options.jsx != false)\n JSX.call(this);\n }\n\n this.embedRules(DocCommentHighlightRules, \"doc-\",\n [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n\n this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nfunction JSX() {\n var tagRegex = identifierRe.replace(\"\\\\d\", \"\\\\d\\\\-\");\n var jsxTag = {\n onMatch : function(val, state, stack) {\n var offset = val.charAt(1) == \"/\" ? 2 : 1;\n if (offset == 1) {\n if (state != this.nextState)\n stack.unshift(this.next, this.nextState, 0);\n else\n stack.unshift(this.next);\n stack[2]++;\n } else if (offset == 2) {\n if (state == this.nextState) {\n stack[1]--;\n if (!stack[1] || stack[1] < 0) {\n stack.shift();\n stack.shift();\n }\n }\n }\n return [{\n type: \"meta.tag.punctuation.\" + (offset == 1 ? \"\" : \"end-\") + \"tag-open.xml\",\n value: val.slice(0, offset)\n }, {\n type: \"meta.tag.tag-name.xml\",\n value: val.substr(offset)\n }];\n },\n regex : \"\",\n onMatch : function(value, currentState, stack) {\n if (currentState == stack[0])\n stack.shift();\n if (value.length == 2) {\n if (stack[0] == this.nextState)\n stack[1]--;\n if (!stack[1] || stack[1] < 0) {\n stack.splice(0, 2);\n }\n }\n this.next = stack[0] || \"start\";\n return [{type: this.token, value: value}];\n },\n nextState: \"jsx\"\n },\n jsxJsRule,\n comments(\"jsxAttributes\"),\n {\n token : \"entity.other.attribute-name.xml\",\n regex : tagRegex\n }, {\n token : \"keyword.operator.attribute-equals.xml\",\n regex : \"=\"\n }, {\n token : \"text.tag-whitespace.xml\",\n regex : \"\\\\s+\"\n }, {\n token : \"string.attribute-value.xml\",\n regex : \"'\",\n stateName : \"jsx_attr_q\",\n push : [\n {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n {include : \"reference\"},\n {defaultToken : \"string.attribute-value.xml\"}\n ]\n }, {\n token : \"string.attribute-value.xml\",\n regex : '\"',\n stateName : \"jsx_attr_qq\",\n push : [\n {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n {include : \"reference\"},\n {defaultToken : \"string.attribute-value.xml\"}\n ]\n },\n jsxTag\n ];\n this.$rules.reference = [{\n token : \"constant.language.escape.reference.xml\",\n regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n }];\n}\n\nfunction comments(next) {\n return [\n {\n token : \"comment\", // multi line comment\n regex : /\\/\\*/,\n next: [\n DocCommentHighlightRules.getTagRule(),\n {token : \"comment\", regex : \"\\\\*\\\\/\", next : next || \"pop\"},\n {defaultToken : \"comment\", caseInsensitive: true}\n ]\n }, {\n token : \"comment\",\n regex : \"\\\\/\\\\/\",\n next: [\n DocCommentHighlightRules.getTagRule(),\n {token : \"comment\", regex : \"$|^\", next : next || \"pop\"},\n {defaultToken : \"comment\", caseInsensitive: true}\n ]\n }\n ];\n}\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\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\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n if (commentRegex) {\n this.foldingStartMarker = new RegExp(\n this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n );\n this.foldingStopMarker = new RegExp(\n this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n );\n }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n \n this.foldingStartMarker = /([\\{\\[\\(])[^\\}\\]\\)]*$|^\\s*(\\/\\*)/;\n this.foldingStopMarker = /^[^\\[\\{\\(]*([\\}\\]\\)])|^[\\s\\*]*(\\*\\/)/;\n this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n this._getFoldWidgetBase = this.getFoldWidget;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n \n if (this.singleLineBlockCommentRe.test(line)) {\n if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n return \"\";\n }\n \n var fw = this._getFoldWidgetBase(session, foldStyle, row);\n \n if (!fw && this.startRegionRe.test(line))\n return \"start\"; // lineCommentRegionStart\n \n return fw;\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n var line = session.getLine(row);\n \n if (this.startRegionRe.test(line))\n return this.getCommentRegionBlock(session, line, row);\n \n var match = line.match(this.foldingStartMarker);\n if (match) {\n var i = match.index;\n\n if (match[1])\n return this.openingBracketBlock(session, match[1], row, i);\n \n var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n \n if (range && !range.isMultiLine()) {\n if (forceMultiline) {\n range = this.getSectionRange(session, row);\n } else if (foldStyle != \"all\")\n range = null;\n }\n \n return range;\n }\n\n if (foldStyle === \"markbegin\")\n return;\n\n var match = line.match(this.foldingStopMarker);\n if (match) {\n var i = match.index + match[0].length;\n\n if (match[1])\n return this.closingBracketBlock(session, match[1], row, i);\n\n return session.getCommentFoldRange(row, i, -1);\n }\n };\n \n this.getSectionRange = function(session, row) {\n var line = session.getLine(row);\n var startIndent = line.search(/\\S/);\n var startRow = row;\n var startColumn = line.length;\n row = row + 1;\n var endRow = row;\n var maxRow = session.getLength();\n while (++row < maxRow) {\n line = session.getLine(row);\n var indent = line.search(/\\S/);\n if (indent === -1)\n continue;\n if (startIndent > indent)\n break;\n var subRange = this.getFoldWidgetRange(session, \"all\", row);\n \n if (subRange) {\n if (subRange.start.row <= startRow) {\n break;\n } else if (subRange.isMultiLine()) {\n row = subRange.end.row;\n } else if (startIndent == indent) {\n break;\n }\n }\n endRow = row;\n }\n \n return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n };\n this.getCommentRegionBlock = function(session, line, row) {\n var startColumn = line.search(/\\s*$/);\n var maxRow = session.getLength();\n var startRow = row;\n \n var re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/;\n var depth = 1;\n while (++row < maxRow) {\n line = session.getLine(row);\n var m = re.exec(line);\n if (!m) continue;\n if (m[1]) depth--;\n else depth++;\n\n if (!depth) break;\n }\n\n var endRow = row;\n if (endRow > startRow) {\n return new Range(startRow, startColumn, endRow, line.length);\n }\n };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n this.HighlightRules = JavaScriptHighlightRules;\n \n this.$outdent = new MatchingBraceOutdent();\n this.$behaviour = new CstyleBehaviour();\n this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n this.lineCommentStart = \"//\";\n this.blockComment = {start: \"/*\", end: \"*/\"};\n this.$quotes = {'\"': '\"', \"'\": \"'\", \"`\": \"`\"};\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 var endState = tokenizedLine.state;\n\n if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n return indent;\n }\n\n if (state == \"start\" || state == \"no_regex\") {\n var match = line.match(/^.*(?:\\bcase\\b.*:|[\\{\\(\\[])\\s*$/);\n if (match) {\n indent += tab;\n }\n } else if (state == \"doc-start\") {\n if (endState == \"start\" || endState == \"no_regex\") {\n return \"\";\n }\n var match = line.match(/^\\s*(\\/?)\\*/);\n if (match) {\n if (match[1]) {\n indent += \" \";\n }\n indent += \"* \";\n }\n }\n\n return indent;\n };\n\n this.checkOutdent = function(state, line, input) {\n return this.$outdent.checkOutdent(line, input);\n };\n\n this.autoOutdent = function(state, doc, row) {\n this.$outdent.autoOutdent(doc, row);\n };\n\n this.createWorker = function(session) {\n var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n worker.attachToDocument(session.getDocument());\n\n worker.on(\"annotate\", function(results) {\n session.setAnnotations(results.data);\n });\n\n worker.on(\"terminate\", function() {\n session.clearAnnotations();\n });\n\n return worker;\n };\n\n this.$id = \"ace/mode/javascript\";\n this.snippetFileId = \"ace/snippets/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n}); (function() {\n ace.require([\"ace/mode/javascript\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n \n", "import ace from './ace.js';\n\nexport default \"mode-json\";\n\nace.define(\"ace/mode/json_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 JsonHighlightRules = function() {\n this.$rules = {\n \"start\" : [\n {\n token : \"variable\", // single line\n regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n }, {\n token : \"string\", // single line\n regex : '\"',\n next : \"string\"\n }, {\n token : \"constant.numeric\", // hex\n regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n }, {\n token : \"constant.numeric\", // float\n regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n }, {\n token : \"constant.language.boolean\",\n regex : \"(?:true|false)\\\\b\"\n }, {\n token : \"text\", // single quoted strings are not allowed\n regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n }, {\n token : \"comment\", // comments are not allowed, but who cares?\n regex : \"\\\\/\\\\/.*$\"\n }, {\n token : \"comment.start\", // comments are not allowed, but who cares?\n regex : \"\\\\/\\\\*\",\n next : \"comment\"\n }, {\n token : \"paren.lparen\",\n regex : \"[[({]\"\n }, {\n token : \"paren.rparen\",\n regex : \"[\\\\])}]\"\n }, {\n token : \"text\",\n regex : \"\\\\s+\"\n }\n ],\n \"string\" : [\n {\n token : \"constant.language.escape\",\n regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n }, {\n token : \"string\",\n regex : '\"|$',\n next : \"start\"\n }, {\n defaultToken : \"string\"\n }\n ],\n \"comment\" : [\n {\n token : \"comment.end\", // comments are not allowed, but who cares?\n regex : \"\\\\*\\\\/\",\n next : \"start\"\n }, {\n defaultToken: \"comment\"\n }\n ]\n };\n \n};\n\noop.inherits(JsonHighlightRules, TextHighlightRules);\n\nexports.JsonHighlightRules = JsonHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\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\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n if (commentRegex) {\n this.foldingStartMarker = new RegExp(\n this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n );\n this.foldingStopMarker = new RegExp(\n this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n );\n }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n \n this.foldingStartMarker = /([\\{\\[\\(])[^\\}\\]\\)]*$|^\\s*(\\/\\*)/;\n this.foldingStopMarker = /^[^\\[\\{\\(]*([\\}\\]\\)])|^[\\s\\*]*(\\*\\/)/;\n this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n this._getFoldWidgetBase = this.getFoldWidget;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n \n if (this.singleLineBlockCommentRe.test(line)) {\n if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n return \"\";\n }\n \n var fw = this._getFoldWidgetBase(session, foldStyle, row);\n \n if (!fw && this.startRegionRe.test(line))\n return \"start\"; // lineCommentRegionStart\n \n return fw;\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n var line = session.getLine(row);\n \n if (this.startRegionRe.test(line))\n return this.getCommentRegionBlock(session, line, row);\n \n var match = line.match(this.foldingStartMarker);\n if (match) {\n var i = match.index;\n\n if (match[1])\n return this.openingBracketBlock(session, match[1], row, i);\n \n var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n \n if (range && !range.isMultiLine()) {\n if (forceMultiline) {\n range = this.getSectionRange(session, row);\n } else if (foldStyle != \"all\")\n range = null;\n }\n \n return range;\n }\n\n if (foldStyle === \"markbegin\")\n return;\n\n var match = line.match(this.foldingStopMarker);\n if (match) {\n var i = match.index + match[0].length;\n\n if (match[1])\n return this.closingBracketBlock(session, match[1], row, i);\n\n return session.getCommentFoldRange(row, i, -1);\n }\n };\n \n this.getSectionRange = function(session, row) {\n var line = session.getLine(row);\n var startIndent = line.search(/\\S/);\n var startRow = row;\n var startColumn = line.length;\n row = row + 1;\n var endRow = row;\n var maxRow = session.getLength();\n while (++row < maxRow) {\n line = session.getLine(row);\n var indent = line.search(/\\S/);\n if (indent === -1)\n continue;\n if (startIndent > indent)\n break;\n var subRange = this.getFoldWidgetRange(session, \"all\", row);\n \n if (subRange) {\n if (subRange.start.row <= startRow) {\n break;\n } else if (subRange.isMultiLine()) {\n row = subRange.end.row;\n } else if (startIndent == indent) {\n break;\n }\n }\n endRow = row;\n }\n \n return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n };\n this.getCommentRegionBlock = function(session, line, row) {\n var startColumn = line.search(/\\s*$/);\n var maxRow = session.getLength();\n var startRow = row;\n \n var re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/;\n var depth = 1;\n while (++row < maxRow) {\n line = session.getLine(row);\n var m = re.exec(line);\n if (!m) continue;\n if (m[1]) depth--;\n else depth++;\n\n if (!depth) break;\n }\n\n var endRow = row;\n if (endRow > startRow) {\n return new Range(startRow, startColumn, endRow, line.length);\n }\n };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/json\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/json_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HighlightRules = require(\"./json_highlight_rules\").JsonHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\nvar Mode = function() {\n this.HighlightRules = HighlightRules;\n this.$outdent = new MatchingBraceOutdent();\n this.$behaviour = new CstyleBehaviour();\n this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n this.lineCommentStart = \"//\";\n this.blockComment = {start: \"/*\", end: \"*/\"};\n \n this.getNextLineIndent = function(state, line, tab) {\n var indent = this.$getIndent(line);\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 this.checkOutdent = function(state, line, input) {\n return this.$outdent.checkOutdent(line, input);\n };\n\n this.autoOutdent = function(state, doc, row) {\n this.$outdent.autoOutdent(doc, row);\n };\n\n this.createWorker = function(session) {\n var worker = new WorkerClient([\"ace\"], \"ace/mode/json_worker\", \"JsonWorker\");\n worker.attachToDocument(session.getDocument());\n\n worker.on(\"annotate\", function(e) {\n session.setAnnotations(e.data);\n });\n\n worker.on(\"terminate\", function() {\n session.clearAnnotations();\n });\n\n return worker;\n };\n\n\n this.$id = \"ace/mode/json\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n}); (function() {\n ace.require([\"ace/mode/json\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n \n", "import ace from './ace.js';\nimport _ from \"lodash\";\n\nexport default \"mode-sql-plus-plus\";\n\n(function() {\n\n // some globals used by both the highlighter and the autocompleter\n var keywords = (\n \"adapter|all|alter|analytics|and|any|apply|args|as|asc|at|autogenerated|between|btree|by|case|cast|closed|collection|compact|compaction|connect|connected|correlate|create|cross|cube|current|dataset|dataverse|declare|definition|delete|desc|disable|disconnect|distinct|div|drop|element|else|enable|end|enforced|every|except|exclude|exists|explain|external|feed|filter|first|flatten|following|for|foreign|from|full|fulltext|function|group|grouping|groups|having|hints|if|ignore|in|include|index|ingestion|inner|insert|internal|intersect|into|is|join|key|keyword|known|last|left|let|letting|like|limit|link|load|missing|mod|ngram|no|nodegroup|not|null|nulls|offset|on|open|or|order|others|outer|output|over|partition|path|policy|preceding|primary|range|raw|references|refresh|replace|respect|return|returning|returns|right|rollup|row|rows|rtree|run|satisfies|scope|secondary|select|set|sets|some|start|stop|synonym|temporary|then|ties|to|type|unbounded|union all|union|unknown|unnest|update|upsert|use|using|value|valued|view|when|where|with|write\"\n );\n var keywords_array = keywords.split('|');\n\n var builtinConstants = (\n \"true|false\"\n );\n var builtinConstants_array = builtinConstants.split('|');\n\n var builtinFunctions = (\n \"ABS|ACOS|ARRAY_APPEND|ARRAY_AVG|ARRAY_CONCAT|ARRAY_CONTAINS|ARRAY_COUNT|ARRAY_DISTINCT|ARRAY_FLATTEN|ARRAY_IFNULL|ARRAY_INSERT|ARRAY_INTERSECT|ARRAY_LENGTH|ARRAY_MAX|ARRAY_MIN|ARRAY_POSITION|ARRAY_PREPEND|ARRAY_PUT|ARRAY_RANGE|ARRAY_REMOVE|ARRAY_REPEAT|ARRAY_REPLACE|ARRAY_REVERSE|ARRAY_SORT|ARRAY_STAR|ARRAY_SUM|ARRAY_SYMDIFF|ARRAY_SYMDIFF1|ARRAY_SYMDIFFN|ARRAY_UNION|ASIN|ATAN|ATAN2|AVG|CEIL|CLOCK_LOCAL|CLOCK_MILLIS|CLOCK_STR|CLOCK_TZ|CLOCK_UTC|CONCAT|CONTAINS|COS|COUNT|DATE_ADD_MILLIS|DATE_ADD_STR|DATE_DIFF_MILLIS|DATE_DIFF_STR|DATE_FORMAT_STR|DATE_PART_MILLIS|DATE_PART_STR|DATE_RANGE_MILLIS|DATE_RANGE_STR|DATE_TRUNC_MILLIS|DATE_TRUNC_STR|DECODE_JSON|DEGREES|DURATION_TO_STR|E|ENCODE_JSON|ENCODED_SIZE|EXP|FLOOR|GREATEST|IF_INF|IF_MISSING|IF_MISSING_OR_NULL|IF_NAN|IF_NAN_OR_INF|IF_NULL|IFINF|IFMISSING|IFMISSINGORNULL|IFNAN|IFNANORINF|IFNULL|INITCAP|IS_ARRAY|IS_ATOM|IS_BOOL|IS_BOOLEAN|IS_NUM|IS_NUMBER|IS_OBJ|IS_OBJECT|IS_STR|IS_STRING|ISARRAY|ISATOM|ISBOOL|ISBOOLEAN|ISNUM|ISNUMBER|ISOBJ|ISOBJECT|ISSTR|ISSTRING|LEAST|LENGTH|LN|LOG|LOWER|LTRIM|MAX|META|MILLIS|MILLIS_TO_LOCAL|MILLIS_TO_STR|MILLIS_TO_TZ|MILLIS_TO_UTC|MILLIS_TO_ZONE_NAME|MIN|MISSING_IF|MISSINGIF|NAN_IF|NANIF|NEGINF_IF|NEGINFIF|NOW_LOCAL|NOW_MILLIS|NOW_STR|NOW_TZ|NOW_UTC|NULL_IF|NULLIF|OBJECT_ADD|OBJECT_CONCAT|OBJECT_INNER_VALUES|OBJECT_LENGTH|OBJECT_NAMES|OBJECT_PAIRS|OBJECT_PUT|OBJECT_REMOVE|OBJECT_RENAME|OBJECT_REPLACE|OBJECT_UNWRAP|OBJECT_VALUES|PAIRS|PI|POSINF_IF|POSINFIF|POSITION|POWER|RADIANS|RANDOM|REGEXP_CONTAINS|REGEXP_LIKE|REGEXP_POSITION|REGEXP_REPLACE|REPEAT|REPLACE|REVERSE|ROUND|RTRIM|SIGN|SIN|SPLIT|SQRT|STR_TO_DURATION|STR_TO_MILLIS|STR_TO_TZ|STR_TO_UTC|STR_TO_ZONE_NAME|SUBSTR|SUM|TAN|TITLE|TO_ARRAY|TO_ATOM|TO_BOOL|TO_BOOLEAN|TO_NUM|TO_NUMBER|TO_OBJ|TO_OBJECT|TO_STR|TO_STRING|TOARRAY|TOATOM|TOBOOL|TOBOOLEAN|TONUM|TONUMBER|TOOBJ|TOOBJECT|TOSTR|TOSTRING|TRIM|TRUNC|TYPE|TYPENAME|UPPER|UUID|WEEKDAY_MILLIS|WEEKDAY_STR\"\n );\n var builtinFunctions_array = builtinFunctions.split('|');\n\n var dataTypes = (\n \"\"\n );\n var dataTypes_array = dataTypes.split('|');\n\n var terms = [\n {name:\"keyword\", tokens: keywords_array},\n {name:\"built-in\", tokens: builtinConstants_array},\n {name:\"function\", tokens: builtinFunctions_array}\n ];\n\n ace.define(\"ace/mode/sql-plus-plus_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"],\n function(require, exports, module) {\n \"use strict\";\n\n var oop = require(\"../lib/oop\");\n var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n var SqlPlusPlusHighlightRules = function() {\n\n var keywordMapper = this.createKeywordMapper({\n \"support.function\": builtinFunctions,\n \"keyword\": keywords,\n \"constant.language\": builtinConstants,\n \"storage.type\": dataTypes\n }, \"identifier\", true);\n\n this.$rules = {\n \"start\" : [ {\n token : \"comment\",\n regex : \"--.*$\"\n }, {\n token : \"comment\",\n start : \"/\\\\*\",\n end : \"\\\\*/\"\n }, {\n token : \"constant.numeric\", // \" string, make blue like numbers\n regex : '\".*?\"'\n }, {\n token : \"constant.numeric\", // ' string, make blue like numbers\n regex : \"'.*?'\"\n }, {\n token : \"identifier\", // ` quoted identifier, make like identifiers\n regex : \"[`](([`][`])|[^`])+[`]\"\n }, {\n token : \"constant.numeric\", // float\n regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\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 };\n this.normalizeRules();\n };\n\n oop.inherits(SqlPlusPlusHighlightRules, TextHighlightRules);\n\n exports.SqlPlusPlusHighlightRules = SqlPlusPlusHighlightRules;\n });\n\n\n /*\n * Define the SQL++ mode\n */\n\n ace.define(\"ace/mode/sql-plus-plus_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n \"use strict\";\n\n var TokenIterator = require(\"../token_iterator\").TokenIterator;\n\n\n function is(token, type) {\n return token.type.lastIndexOf(type + \".xml\") > -1;\n }\n\n function findTagName(session, pos) {\n var iterator = new TokenIterator(session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n while (token && !is(token, \"tag-name\")){\n token = iterator.stepBackward();\n }\n if (token)\n return token.value;\n }\n\n var SqlPlusPlusCompletions = function() {\n };\n\n (function() {\n\n this.getCompletions = function(state, session, pos, prefix) {\n var token = session.getTokenAt(pos.row, pos.column);\n var results = [];\n var prefix_upper = prefix.toLocaleUpperCase();\n for (var i = 0; i < terms.length; i++) {\n for (var t = 0; t < terms[i].tokens.length; t++) {\n if (_.startsWith(terms[i].tokens[t].toLocaleUpperCase(), prefix_upper)) {\n results.push({ value: terms[i].tokens[t], meta: terms[i].name, score: 1 });\n }\n }\n }\n return results;\n };\n }).call(SqlPlusPlusCompletions.prototype);\n\n exports.SqlPlusPlusCompletions = SqlPlusPlusCompletions;\n });\n\n ace.define(\"ace/mode/sql-plus-plus\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\n \"ace/mode/sql-plus-plus_highlight_rules\",\"ace/mode/query-formatter\"],\n function(require, exports, module) {\n \"use strict\";\n\n var oop = require(\"../lib/oop\");\n var TextMode = require(\"./text\").Mode;\n var SqlPlusPlusHighlightRules = require(\"./sql-plus-plus_highlight_rules\").SqlPlusPlusHighlightRules;\n var SqlPlusPlusCompletions = require(\"./sql-plus-plus_completions\").SqlPlusPlusCompletions;\n\n //////////////////////////////////////////////////////////////////////////////////////\n // build a SQL++ formatter from the more generic formatter package\n //\n // it needs to know keywords or function names (to be upper cased)\n //////////////////////////////////////////////////////////////////////////////////////\n\n var kw_regex_str = '\\\\b(' + keywords + '|' + builtinConstants + ')\\\\b';\n var function_regex_str = '\\\\b(' + builtinFunctions + ')\\\\s*\\\\(';\n\n var formatter = require(\"ace/mode/query-formatter\").create(kw_regex_str,function_regex_str);\n\n //////////////////////////////////////////////////////////////////////////////////////\n\n var Mode = function() {\n this.HighlightRules = SqlPlusPlusHighlightRules;\n this.$completer = new SqlPlusPlusCompletions();\n this.format = formatter;\n };\n oop.inherits(Mode, TextMode);\n\n (function() {\n\n this.lineCommentStart = \"--\";\n\n this.getCompletions = function(state, session, pos, prefix) {\n return this.$completer.getCompletions(state, session, pos, prefix);\n };\n\n this.$id = \"ace/mode/sql-plus-plus\";\n }).call(Mode.prototype);\n\n exports.Mode = Mode;\n exports.Instance = new Mode();\n\n });\n\n})();\n", "import ace from \"./ace.js\";\n\nexport default \"query-formatter\";\n\n(function() {\n\n ace.define(\"ace/mode/query-formatter\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\"],\n function(require, exports, module) {\n \"use strict\";\n\n// var oop = require(\"../lib/oop\");\n\n //////////////////////////////////////////////////////////////////////////////////////\n // format Sql_plus_plus queries. Code borrowed and extended from vkbeautify\n //\n // Step 1: strip out newlines and extra spaces\n // Step 2: add back newlines before or after certain keywords (e.g. SELECT, WHERE...),\n // this ensures that any nested subqueries are not on the line as their parent\n // Step 3: add further newlines in any top-level comma-delimited lists, e.g.\n // select a, b, c from ...\n // but *not*:\n // select max(a,b)\n // Step 4: figure out indentation for each line. We will have a stack of indentations\n // so that the indents will accumulate\n // if a line increases the count of parentheses, we increase the indentation\n // if a line ends in a comma, align subsequent lines with the first space on\n // the first line with the comma\n // if a line starts with a keyword needing extra indentation, indent that\n // one line only\n //////////////////////////////////////////////////////////////////////////////////////\n\n exports.create = function(kw_regex_str,function_regex_str) {\n\n // regexes must ignore keywords inside strings or comments, make a prefix to match strings or comments\n var prefix = \"\\\"(?:[^\\\"\\\\\\\\]|\\\\\\\\.)*\\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'|(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)|`(?:[^`])*`\";\n var match_string = new RegExp(prefix,'ig');\n\n // we want to detect all keywords or functions, so make a regex that matches them\n var kw_regex = new RegExp(kw_regex_str,'ig');\n var function_regex = new RegExp(function_regex_str,'ig');\n\n // detect keywords that need newlines before and/or after\n var newline_before = \"FROM|WHERE|GROUP BY|HAVING|OUTER JOIN|INNER JOIN|JOIN|LIMIT|ORDER BY|OFFSET|OUTER JOIN|ROWS|\" +\n \"RANGE|GROUPS|EXCLUDE|UNNEST|SET|LET\";\n var newline_before_and_after = \"UNION ALL|UNION\";\n var newline_before_plus_indent = \"AND|OR|JOIN\";\n var newline_after_regex = new RegExp(\"(;)\",\"ig\");\n\n var newline_before_regex =\n new RegExp('(?:\\\\bBETWEEN\\\\b.+?\\\\bAND\\\\b)' + // don't want newline before AND in \"BETWEEN ... AND\"\n '|\\\\b(' + newline_before + '|' + newline_before_plus_indent + ')\\\\b','ig');\n var newline_before_and_after_regex = new RegExp(prefix + '|\\\\b(' + newline_before_and_after + ')\\\\b','ig');\n var newline_after_over_paren_regex = /(\\bOVER[\\s]*\\([\\s]*\\))|(\\bOVER[\\s]*\\([\\s]*)/ig;\n var newline_after_create_analytics_regex = /(CREATE\\s+ANALYTICS\\s+VIEW\\s+[a-zA-Z_][a-zA-Z0-9_]*\\s*\\()(.*)$/ig;\n // we need an indent if the line starts with one of these\n var needs_indent_regex = new RegExp('^(' + newline_before_plus_indent + ')\\\\b','ig');\n\n //\n //\n //\n\n function isSubquery(str, parenthesisLevel) {\n return parenthesisLevel - (str.replace(/\\(/g,'').length - str.replace(/\\)/g,'').length )\n }\n\n // some text is special: comments, quoted strings, and we don't want to look inside them for formatting\n function isSpecialString(str) {\n return((str.startsWith('\"') || str.startsWith(\"'\") ||\n (str.startsWith('/*') && str.endsWith('*/')) ||\n (str.startsWith('`') && str.endsWith('`'))));\n }\n\n //\n // if we have commas delimiting projection lists, let statements, etc, we want a newline\n // and indentation after each comma. But we don't want newlines for comma-delimited items in function\n // calls, e.g. max(a,b,c)\n //\n\n function replace_top_level_commas(text,parenDepth) {\n var items = [];\n var start = 0;\n\n for (var i=0; i < text.length; i++) {\n switch (text.charAt(i)) {\n case '(':\n case '{':\n case '[':\n parenDepth.depth++; break;\n case ')':\n case '}':\n case ']':\n parenDepth.depth--; break;\n case ',':\n if (parenDepth.depth <= 0) {\n items.push(text.substring(start,i+1));\n while (i++ < text.length && /\\s/.exec(text.charAt(i))); // skip any whitespace after the comma\n start = i;\n i--; // don't overshoot\n }\n break;\n }\n }\n\n // get the last one\n items.push(text.substring(start,text.length));\n return(items);\n }\n\n // split query into an array of lines, with strings separate entries so we won't try to\n // parse their contents\n function split_query(str, tab, specials) {\n\n var str2 = str.replace(/\\s{1,}/g,\" \"); // simplify whitespace to single spaces\n str2 = str2.replace(match_string, function(match) {specials.push(match); return \"^&&^\"});\n str2 = str2.replace(kw_regex, function(match,p1) {if (p1) return p1.toUpperCase(); else return match}); // upper case all keywords\n str2 = str2.replace(function_regex, function(match,p1) {if (p1) return p1.toUpperCase() + '('; else return match}); // upper case all keywords\n str2 = str2.replace(newline_before_regex, function(match,p1) {if (p1) return \"~::~\" + p1; else return match});\n str2 = str2.replace(newline_before_and_after_regex, function(match,p1) {if (p1) return \"~::~\" + p1 + \"~::~\"; else return match});\n str2 = str2.replace(newline_after_regex, function(match,p1) {if (p1) return p1 + \"~::~\"; else return match});\n str2 = str2.replace(newline_after_over_paren_regex, function(match,p1) {if (p1) return p1; else return 'OVER (~::~';}); // put a newline after ( in \"OVER (\"\n str2 = str2.replace(newline_after_create_analytics_regex, function(match, p1, p2) {if (p2.startsWith(')')) return match; else return p1 + '~::~' + p2}); // put a newline after ( in \"CREATE ANALYTICS VIEW *identifier* (\"\n str2 = str2.replace(/\\([\\s]*SELECT\\b/ig, function(match) {return '(~::~SELECT'}); // put a newline after ( in \"( SELECT\"\n str2 = str2.replace(/\\)[\\s]*SELECT\\b/ig, function(match) {return ')~::~SELECT'}); // put a newline after ) in \") SELECT\"\n str2 = str2.replace(/\\)[\\s]*,/ig,function(match) {return '),'}); // remove any whitespace between ) and ,\n str2 = str2.replace(/~::~w{1,}/g,\"~::~\"); // remove blank lines\n str2 = str2.replace(/~::~ /ig,'~::~');\n\n // get an array of lines, based on the above breaks, then make a new array where we also split on comma-delimited lists\n var arr = str2.split('~::~');\n var arr2 = [];\n\n arr.forEach(function (s) {\n var parenDepth = {depth:0};\n arr2 = arr2.concat(replace_top_level_commas(s,parenDepth));\n });\n\n return(arr2);\n }\n\n // function to format queries based on the parameters above\n\n var formatter = function(text, step) {\n var tab = ' '.repeat(step),\n ar,\n deep = 0,\n paren_level = 0,\n str = '',\n ix = 0,\n specials = [],\n indents = [''], // stack of indentation strings\n parens_in_lists = []; // are nested queries part of comma-delimited lists\n\n ar = split_query(text,tab,specials);\n\n // now we have an array of either:\n // - things that should start on a newline, as indicated by starting with a special keyword\n // - things that should start on a newline, as indicated by the previous element ending with a comma\n // - strings or comments, which we can't look inside\n //\n // loop through the array of query elements.\n // we need to add appropriate indentation for each, based on this element and the previous\n // non-special element\n\n var comma_prev = false;\n var paren_prev = false;\n var prev_paren_level = 0;\n var inside_case = false; // are we part of a multi-line CASE statement?\n\n // Some will be specials, so we will just add those to the query string\n // Others need to be checked for nesting level\n var len = ar.length;\n\n for(ix=0;ix0?indents[indents.length - 1]:'');\n\n var needs_indent = !!needs_indent_regex.exec(ar[ix]);\n var after = !!newline_before_and_after_regex.exec(ar[ix]) || !!newline_after_over_paren_regex.exec(ar[ix]);\n var ends_with_comma = ar[ix].endsWith(',');\n var ends_with_paren_comma = ar[ix].endsWith('),');\n var ends_with_paren = ar[ix].endsWith('(');\n\n// console.log(\"Got string: \" + ar[ix]);\n// console.log(\"bfore indents len: \" + indents.length + \" paren_level \" + paren_level +\n// \" prev_paren_level \" + prev_paren_level +\n// \" ends_with_comma \" + ends_with_comma +\n// \" comma_prev \" + comma_prev +\n// \" parens_in_lists \" + JSON.stringify(parens_in_lists)\n// );\n\n // each array element should start a new line, add appropriate indent\n str += '\\n' + indent;\n\n // do we need a special indent for just this line?\n if (needs_indent)\n str += tab;\n\n // add the string\n str += ar[ix];\n\n // should there be a newline after?\n if (after)\n str += '\\n';\n\n // if this is the first in a comma-delimited list, we need an appropriate indent.\n // if the line starts \"SELECT\" then we want 8 spaces indent\n // if the list starts \"ORDER BY\" or \"GROUP BY\" then we want 9 spaces indent\n // otherwise find the *last* space in the line for subsequent alignment\n if (ends_with_comma && !comma_prev && (paren_level == prev_paren_level)) {\n var fs;\n if (ar[ix].startsWith(\"SELECT \"))\n fs = 7;\n else if (ar[ix].startsWith(\"GROUP BY\") || ar[ix].startsWith(\"ORDER BY\"))\n fs = 9;\n else if (ar[ix].startsWith(\"PARTITION BY\"))\n fs = 13;\n else if (ar[ix].startsWith(\"LET\"))\n fs = 4;\n else if (ar[ix].startsWith(\"INSERT INTO \"))\n fs = 12;\n else for (fs = ar[ix].length - 1; fs >= 0; fs--)\n if (ar[ix].charAt(fs) == ' ') {\n fs++;\n break;\n }\n // subsequent lines should be indented by this much\n if (fs > 0) {\n indents.push(indent + ' '.repeat(fs));\n }\n }\n\n // if the nesting level goes up, add elements to the indent array,\n // if it goes down, pop them\n if (paren_level > prev_paren_level) {\n var curIndent = indent;\n for (var i=prev_paren_level; i < paren_level; i++) {\n curIndent = curIndent + tab;\n indents.push(curIndent);\n }\n parens_in_lists.push(comma_prev); // is the paren scope part of a comma list?\n }\n else if (paren_level < prev_paren_level) {\n // get rid of indentation for the parens\n for (var i=prev_paren_level; i > paren_level; i--)\n indents.pop();\n\n // if our paren scope had a comma list, pop that indent\n if (comma_prev)\n indents.pop();\n\n // go back to comma status from outside paren scope\n comma_prev = parens_in_lists.pop();\n if (comma_prev && !ends_with_comma)\n indents.pop();\n }\n // if the previous item had a comma, but this doesn't, pop the comma indent\n else if (comma_prev && !ends_with_comma)\n indents.pop();\n\n comma_prev = ends_with_comma; // remember comma status\n paren_prev = ends_with_paren;\n }\n\n // insert the special strings back into the string\n while (/\\^\\&\\&\\^/ig.exec(str)) {\n if (!specials.length)\n break;\n str = str.replace(/\\^\\&\\&\\^/ig, function(match) {return(specials.shift());});\n }\n\n str = str.replace(/^\\n{1,}/,'').replace(/\\n{1,}/g,\"\\n\");\n return str;\n };\n\n return formatter;\n }\n\n\n //////////////////////////////////////////////////////////////////////////////////////\n\n });\n\n})();\n\n", "//\n// A modified version of the Ace searchbox\n//\n\nimport ace from './ace.js';\n\nexport default \"cb-searchbox\";\n\nace.define(\"ace/ext/cb-searchbox\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar event = require(\"../lib/event\");\n//var searchboxCss = \"\"\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar keyUtil = require(\"../lib/keys\");\n\n//dom.importCssString(searchboxCss, \"ace_searchbox\");\n\nvar html = ``.replace(/>\\s+/g, \">\");\n\nvar SearchBox = function(editor, range, showReplaceForm) {\n var div = dom.createElement(\"div\");\n div.innerHTML = html;\n this.element = div.firstChild;\n\n this.$init();\n this.setEditor(editor);\n};\n\n(function() {\n this.setEditor = function(editor) {\n editor.searchBox = this;\n editor.container.appendChild(this.element);\n this.editor = editor;\n };\n\n this.$initElements = function(sb) {\n this.searchBox = sb.querySelector(\".ace-search-form\");\n this.replaceBox = sb.querySelector(\".ace-replace-form\");\n this.searchOptions = sb.querySelector(\".ace-search-options\");\n this.regExpOption = sb.querySelector(\"[action=toggleRegexpMode]\");\n this.caseSensitiveOption = sb.querySelector(\"[action=toggleCaseSensitive]\");\n this.wholeWordOption = sb.querySelector(\"[action=toggleWholeWords]\");\n this.searchInput = this.searchBox.querySelector(\".ace-search-field\");\n this.replaceInput = this.replaceBox.querySelector(\".ace-search-field\");\n };\n\n this.$init = function() {\n var sb = this.element;\n\n this.$initElements(sb);\n\n var _this = this;\n event.addListener(sb, \"mousedown\", function(e) {\n setTimeout(function(){\n _this.activeInput.focus();\n }, 0);\n event.stopPropagation(e);\n });\n event.addListener(sb, \"click\", function(e) {\n var t = e.target || e.srcElement;\n var action = t.getAttribute(\"action\");\n if (action && _this[action])\n _this[action]();\n else if (_this.$searchBarKb.commands[action])\n _this.$searchBarKb.commands[action].exec(_this);\n event.stopPropagation(e);\n });\n\n event.addCommandKeyListener(sb, function(e, hashId, keyCode) {\n var keyString = keyUtil.keyCodeToString(keyCode);\n var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);\n if (command && command.exec) {\n command.exec(_this);\n event.stopEvent(e);\n }\n });\n\n this.$onChange = lang.delayedCall(function() {\n _this.find(false, false);\n });\n\n event.addListener(this.searchInput, \"input\", function() {\n _this.$onChange.schedule(20);\n });\n event.addListener(this.searchInput, \"focus\", function() {\n _this.activeInput = _this.searchInput;\n _this.searchInput.value && _this.highlight();\n });\n event.addListener(this.replaceInput, \"focus\", function() {\n _this.activeInput = _this.replaceInput;\n _this.searchInput.value && _this.highlight();\n });\n };\n this.$closeSearchBarKb = new HashHandler([{\n bindKey: \"Esc\",\n name: \"closeSearchBar\",\n exec: function(editor) {\n editor.searchBox.hide();\n }\n }]);\n this.$searchBarKb = new HashHandler();\n this.$searchBarKb.bindKeys({\n \"Ctrl-G|Command-G\": function(sb) {\n sb.findNext();\n },\n \"Ctrl-Shift-G|Command-Shift-G\": function(sb) {\n sb.findPrev();\n },\n \"esc\": function(sb) {\n setTimeout(function() { sb.hide();});\n },\n \"Return\": function(sb) {\n if (sb.activeInput == sb.replaceInput)\n sb.replace();\n sb.findNext();\n },\n \"Shift-Return\": function(sb) {\n if (sb.activeInput == sb.replaceInput)\n sb.replace();\n sb.findPrev();\n },\n \"Alt-Return\": function(sb) {\n if (sb.activeInput == sb.replaceInput)\n sb.replaceAll();\n sb.findAll();\n },\n \"Tab\": function(sb) {\n (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();\n }\n });\n\n this.$searchBarKb.addCommands([{\n name: \"toggleRegexpMode\",\n bindKey: {win: \"Alt-R|Alt-/\", mac: \"Ctrl-Alt-R|Ctrl-Alt-/\"},\n exec: function(sb) {\n sb.regExpOption.checked = !sb.regExpOption.checked;\n sb.$syncOptions();\n }\n }, {\n name: \"toggleCaseSensitive\",\n bindKey: {win: \"Alt-C|Alt-I\", mac: \"Ctrl-Alt-R|Ctrl-Alt-I\"},\n exec: function(sb) {\n sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;\n sb.$syncOptions();\n }\n }, {\n name: \"toggleWholeWords\",\n bindKey: {win: \"Alt-B|Alt-W\", mac: \"Ctrl-Alt-B|Ctrl-Alt-W\"},\n exec: function(sb) {\n sb.wholeWordOption.checked = !sb.wholeWordOption.checked;\n sb.$syncOptions();\n }\n }]);\n\n this.$syncOptions = function() {\n dom.setCssClass(this.regExpOption, \"checked\", this.regExpOption.checked);\n dom.setCssClass(this.wholeWordOption, \"checked\", this.wholeWordOption.checked);\n dom.setCssClass(this.caseSensitiveOption, \"checked\", this.caseSensitiveOption.checked);\n this.find(false, false);\n };\n\n this.highlight = function(re) {\n this.editor.session.highlight(re || this.editor.$search.$options.re);\n this.editor.renderer.updateBackMarkers()\n };\n this.find = function(skipCurrent, backwards, preventScroll) {\n var range = this.editor.find(this.searchInput.value, {\n skipCurrent: skipCurrent,\n backwards: backwards,\n wrap: true,\n regExp: this.regExpOption.checked,\n caseSensitive: this.caseSensitiveOption.checked,\n wholeWord: this.wholeWordOption.checked,\n preventScroll: preventScroll\n });\n var noMatch = !range && this.searchInput.value;\n dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n this.editor._emit(\"findSearchBox\", { match: !noMatch });\n this.highlight();\n };\n this.findNext = function() {\n this.find(true, false);\n };\n this.findPrev = function() {\n this.find(true, true);\n };\n this.findAll = function(){\n var range = this.editor.findAll(this.searchInput.value, {\n regExp: this.regExpOption.checked,\n caseSensitive: this.caseSensitiveOption.checked,\n wholeWord: this.wholeWordOption.checked\n });\n var noMatch = !range && this.searchInput.value;\n dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n this.editor._emit(\"findSearchBox\", { match: !noMatch });\n this.highlight();\n this.hide();\n };\n this.replace = function() {\n if (!this.editor.getReadOnly())\n this.editor.replace(this.replaceInput.value);\n };\n this.replaceAndFindNext = function() {\n if (!this.editor.getReadOnly()) {\n this.editor.replace(this.replaceInput.value);\n this.findNext()\n }\n };\n this.replaceAll = function() {\n if (!this.editor.getReadOnly())\n this.editor.replaceAll(this.replaceInput.value);\n };\n\n this.hide = function() {\n this.element.style.display = \"none\";\n this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);\n this.editor.focus();\n };\n this.show = function(value, isReplace, showOptions) {\n this.element.style.display = \"\";\n this.replaceBox.style.display = isReplace ? \"\" : \"none\";\n this.searchOptions.style.display = isReplace && showOptions ? \"\" : \"none\";\n\n this.isReplace = isReplace;\n\n if (value)\n this.searchInput.value = value;\n\n this.find(false, false, true);\n\n this.searchInput.focus();\n this.searchInput.select();\n\n this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);\n };\n\n this.isFocused = function() {\n var el = document.activeElement;\n return el == this.searchInput || el == this.replaceInput;\n }\n}).call(SearchBox.prototype);\n\nexports.SearchBox = SearchBox;\n\nexports.Search = function(editor, isReplace, showOptions) {\n var sb = editor.searchBox || new SearchBox(editor);\n sb.show(editor.session.getTextRange(), isReplace, showOptions);\n};\n\n});\n (function() {\n ace.require([\"ace/ext/searchbox\"], function() {});\n })();\n", "import ace from './ace.js';\n\nexport default \"languageTools\";\n\nace.define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/range_list\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/clipboard\",\"ace/editor\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"./lib/dom\");\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\ndom.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}\", \"snippets.css\", false);\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\", false);\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 var detachIfFinished = function(results) {\n if (!results.finished) return;\n return this.detach();\n }.bind(this);\n\n var processResults = function(results) {\n var prefix = results.prefix;\n var matches = results.matches;\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(results);\n if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)\n return detachIfFinished(results);\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 var isImmediate = true;\n var immediateResults = null;\n this.gatherCompletions(this.editor, function(err, results) {\n var prefix = results.prefix;\n var matches = results && results.matches;\n\n if (!matches || !matches.length)\n return detachIfFinished(results);\n if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)\n return;\n if (isImmediate) {\n immediateResults = results;\n return;\n }\n\n processResults(results);\n }.bind(this));\n \n isImmediate = false;\n if (immediateResults) {\n var results = immediateResults;\n immediateResults = null;\n processResults(results);\n }\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 \n"], "mappings": "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,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG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", "names": [] }