@openmrs/esm-implementer-tools-app 3.3.2-pre.5 → 3.3.2-pre.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +38 -38
- package/dist/1.js +1 -2
- package/dist/105.js +1 -2
- package/dist/25.js +1 -2
- package/dist/280.js +1 -2
- package/dist/284.js +1 -2
- package/dist/350.js +1 -0
- package/dist/458.js +1 -2
- package/dist/475.js +1 -2
- package/dist/531.js +1 -2
- package/dist/620.js +1 -2
- package/dist/652.js +1 -2
- package/dist/735.js +1 -2
- package/dist/743.js +1 -2
- package/dist/769.js +1 -2
- package/dist/788.js +1 -2
- package/dist/811.js +1 -2
- package/dist/860.js +1 -2
- package/dist/889.js +1 -2
- package/dist/890.js +1 -2
- package/dist/openmrs-esm-implementer-tools-app.js +1 -1
- package/dist/openmrs-esm-implementer-tools-app.js.buildmanifest.json +75 -115
- package/dist/openmrs-esm-implementer-tools-app.old +1 -2
- package/package.json +4 -4
- package/dist/1.js.map +0 -1
- package/dist/105.js.map +0 -1
- package/dist/25.js.map +0 -1
- package/dist/280.js.map +0 -1
- package/dist/284.js.map +0 -1
- package/dist/458.js.map +0 -1
- package/dist/475.js.map +0 -1
- package/dist/531.js.map +0 -1
- package/dist/620.js.map +0 -1
- package/dist/652.js.map +0 -1
- package/dist/735.js.map +0 -1
- package/dist/743.js.map +0 -1
- package/dist/769.js.map +0 -1
- package/dist/788.js.map +0 -1
- package/dist/811.js.map +0 -1
- package/dist/839.js +0 -2
- package/dist/839.js.map +0 -1
- package/dist/860.js.map +0 -1
- package/dist/889.js.map +0 -1
- package/dist/890.js.map +0 -1
- package/dist/openmrs-esm-implementer-tools-app.js.map +0 -1
package/dist/620.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"620.js","mappings":"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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,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,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","sources":["webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/ace-builds/src-noconflict/ace.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/ace-builds/src-noconflict/ext-split.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/ace-builds/src-noconflict/mode-java.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/ace-builds/src-noconflict/theme-github.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/diff-match-patch/index.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/lodash.get/index.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/react-ace/lib/ace.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/react-ace/lib/diff.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/react-ace/lib/editorOptions.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/react-ace/lib/index.js","webpack://@openmrs/esm-implementer-tools-app/../../../node_modules/react-ace/lib/split.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\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<l; i++) {\n if (array[i] && typeof array[i] == \"object\")\n copy[i] = this.copyObject(array[i]);\n else \n copy[i] = array[i];\n }\n return copy;\n};\n\nexports.deepCopy = function deepCopy(obj) {\n if (typeof obj !== \"object\" || !obj)\n return obj;\n var copy;\n if (Array.isArray(obj)) {\n copy = [];\n for (var key = 0; key < obj.length; key++) {\n copy[key] = deepCopy(obj[key]);\n }\n return copy;\n }\n if (Object.prototype.toString.call(obj) !== \"[object Object]\")\n return obj;\n \n copy = {};\n for (var key in obj)\n copy[key] = deepCopy(obj[key]);\n return copy;\n};\n\nexports.arrayToMap = function(arr) {\n var map = {};\n for (var i=0; i<arr.length; i++) {\n map[arr[i]] = 1;\n }\n return map;\n\n};\n\nexports.createMap = function(props) {\n var map = Object.create(null);\n for (var i in props) {\n map[i] = props[i];\n }\n return map;\n};\nexports.arrayRemove = function(array, value) {\n for (var i = 0; i <= array.length; i++) {\n if (value === array[i]) {\n array.splice(i, 1);\n }\n }\n};\n\nexports.escapeRegExp = function(str) {\n return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n return (\"\" + str).replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/'/g, \"'\").replace(/</g, \"<\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n var matches = [];\n\n string.replace(regExp, function(str) {\n matches.push({\n offset: arguments[arguments.length-2],\n length: str.length\n });\n });\n\n return matches;\n};\nexports.deferredCall = function(fcn) {\n var timer = null;\n var callback = function() {\n timer = null;\n fcn();\n };\n\n var deferred = function(timeout) {\n deferred.cancel();\n timer = setTimeout(callback, timeout || 0);\n return deferred;\n };\n\n deferred.schedule = deferred;\n\n deferred.call = function() {\n this.cancel();\n fcn();\n return deferred;\n };\n\n deferred.cancel = function() {\n clearTimeout(timer);\n timer = null;\n return deferred;\n };\n \n deferred.isPending = function() {\n return timer;\n };\n\n return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n var timer = null;\n var callback = function() {\n timer = null;\n fcn();\n };\n\n var _self = function(timeout) {\n if (timer == null)\n timer = setTimeout(callback, timeout || defaultTimeout);\n };\n\n _self.delay = function(timeout) {\n timer && clearTimeout(timer);\n timer = setTimeout(callback, timeout || defaultTimeout);\n };\n _self.schedule = _self;\n\n _self.call = function() {\n this.cancel();\n fcn();\n };\n\n _self.cancel = function() {\n timer && clearTimeout(timer);\n timer = null;\n };\n\n _self.isPending = function() {\n return timer;\n };\n\n return _self;\n};\n});\n\nace.define(\"ace/clipboard\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar $cancelT;\nmodule.exports = { \n lineMode: false,\n pasteCancelled: function() {\n if ($cancelT && $cancelT > 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(\"<br/>\");\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<listeners.length; i++) {\n listeners[i](e, this);\n if (e.propagationStopped)\n break;\n }\n \n if (defaultHandler && !e.defaultPrevented)\n return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n var listeners = (this._eventRegistry || {})[eventName];\n if (!listeners)\n return;\n listeners = listeners.slice();\n for (var i=0; i<listeners.length; i++)\n listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n var _self = this;\n this.on(eventName, function newCallback() {\n _self.off(eventName, newCallback);\n callback.apply(null, arguments);\n });\n if (!callback) {\n return new Promise(function(resolve) {\n callback = resolve;\n });\n }\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n var handlers = this._defaultHandlers;\n if (!handlers)\n handlers = this._defaultHandlers = {_disabled_: {}};\n \n if (handlers[eventName]) {\n var old = handlers[eventName];\n var disabled = handlers._disabled_[eventName];\n if (!disabled)\n handlers._disabled_[eventName] = disabled = [];\n disabled.push(old);\n var i = disabled.indexOf(callback);\n if (i != -1) \n disabled.splice(i, 1);\n }\n handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n var handlers = this._defaultHandlers;\n if (!handlers)\n return;\n var disabled = handlers._disabled_[eventName];\n \n if (handlers[eventName] == callback) {\n if (disabled)\n this.setDefaultHandler(eventName, disabled.pop());\n } else if (disabled) {\n var i = disabled.indexOf(callback);\n if (i != -1)\n disabled.splice(i, 1);\n }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n this._eventRegistry = this._eventRegistry || {};\n\n var listeners = this._eventRegistry[eventName];\n if (!listeners)\n listeners = this._eventRegistry[eventName] = [];\n\n if (listeners.indexOf(callback) == -1)\n listeners[capturing ? \"unshift\" : \"push\"](callback);\n return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n this._eventRegistry = this._eventRegistry || {};\n\n var listeners = this._eventRegistry[eventName];\n if (!listeners)\n return;\n\n var index = listeners.indexOf(callback);\n if (index !== -1)\n listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n if (!eventName) this._eventRegistry = this._defaultHandlers = undefined;\n if (this._eventRegistry) this._eventRegistry[eventName] = undefined;\n if (this._defaultHandlers) this._defaultHandlers[eventName] = undefined;\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/lib/app_config\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"no use strict\";\n\nvar oop = require(\"./oop\");\nvar EventEmitter = require(\"./event_emitter\").EventEmitter;\n\nvar optionsProvider = {\n setOptions: function(optList) {\n Object.keys(optList).forEach(function(key) {\n this.setOption(key, optList[key]);\n }, this);\n },\n getOptions: function(optionNames) {\n var result = {};\n if (!optionNames) {\n var options = this.$options;\n optionNames = Object.keys(options).filter(function(key) {\n return !options[key].hidden;\n });\n } else if (!Array.isArray(optionNames)) {\n result = optionNames;\n optionNames = Object.keys(result);\n }\n optionNames.forEach(function(key) {\n result[key] = this.getOption(key);\n }, this);\n return result;\n },\n setOption: function(name, value) {\n if (this[\"$\" + name] === value)\n return;\n var opt = this.$options[name];\n if (!opt) {\n return warn('misspelled option \"' + name + '\"');\n }\n if (opt.forwardTo)\n return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);\n\n if (!opt.handlesSet)\n this[\"$\" + name] = value;\n if (opt && opt.set)\n opt.set.call(this, value);\n },\n getOption: function(name) {\n var opt = this.$options[name];\n if (!opt) {\n return warn('misspelled option \"' + name + '\"');\n }\n if (opt.forwardTo)\n return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);\n return opt && opt.get ? opt.get.call(this) : this[\"$\" + name];\n }\n};\n\nfunction warn(message) {\n if (typeof console != \"undefined\" && console.warn)\n console.warn.apply(console, arguments);\n}\n\nfunction reportError(msg, data) {\n var e = new Error(msg);\n e.data = data;\n if (typeof console == \"object\" && console.error)\n console.error(e);\n setTimeout(function() { throw e; });\n}\n\nvar AppConfig = function() {\n this.$defaultOptions = {};\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n this.defineOptions = function(obj, path, options) {\n if (!obj.$options)\n this.$defaultOptions[path] = obj.$options = {};\n\n Object.keys(options).forEach(function(key) {\n var opt = options[key];\n if (typeof opt == \"string\")\n opt = {forwardTo: opt};\n\n opt.name || (opt.name = key);\n obj.$options[opt.name] = opt;\n if (\"initialValue\" in opt)\n obj[\"$\" + opt.name] = opt.initialValue;\n });\n oop.implement(obj, optionsProvider);\n\n return this;\n };\n\n this.resetOptions = function(obj) {\n Object.keys(obj.$options).forEach(function(key) {\n var opt = obj.$options[key];\n if (\"value\" in opt)\n obj.setOption(key, opt.value);\n });\n };\n\n this.setDefaultValue = function(path, name, value) {\n if (!path) {\n for (path in this.$defaultOptions)\n if (this.$defaultOptions[path][name])\n break;\n if (!this.$defaultOptions[path][name])\n return false;\n }\n var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {});\n if (opts[name]) {\n if (opts.forwardTo)\n this.setDefaultValue(opts.forwardTo, name, value);\n else\n opts[name].value = value;\n }\n };\n\n this.setDefaultValues = function(path, optionHash) {\n Object.keys(optionHash).forEach(function(key) {\n this.setDefaultValue(path, key, optionHash[key]);\n }, this);\n };\n \n this.warn = warn;\n this.reportError = reportError;\n \n}).call(AppConfig.prototype);\n\nexports.AppConfig = AppConfig;\n\n});\n\nace.define(\"ace/config\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/dom\",\"ace/lib/app_config\"], function(require, exports, module) {\n\"no use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar net = require(\"./lib/net\");\nvar dom = require(\"./lib/dom\");\nvar AppConfig = require(\"./lib/app_config\").AppConfig;\n\nmodule.exports = exports = new AppConfig();\n\nvar global = (function() {\n return this || typeof window != \"undefined\" && window;\n})();\n\nvar options = {\n packaged: false,\n workerPath: null,\n modePath: null,\n themePath: null,\n basePath: \"\",\n suffix: \".js\",\n $moduleUrls: {},\n loadWorkerFromBlob: true,\n sharedPopups: false,\n useStrictCSP: null\n};\n\nexports.get = function(key) {\n if (!options.hasOwnProperty(key))\n throw new Error(\"Unknown config key: \" + key);\n return options[key];\n};\n\nexports.set = function(key, value) {\n if (options.hasOwnProperty(key))\n options[key] = value;\n else if (this.setDefaultValue(\"\", key, value) == false)\n throw new Error(\"Unknown config key: \" + key);\n if (key == \"useStrictCSP\")\n dom.useStrictCSP(value);\n};\n\nexports.all = function() {\n return lang.copyObject(options);\n};\n\nexports.$modes = {};\nexports.moduleUrl = function(name, component) {\n if (options.$moduleUrls[name])\n return options.$moduleUrls[name];\n\n var parts = name.split(\"/\");\n component = component || parts[parts.length - 2] || \"\";\n var sep = component == \"snippets\" ? \"/\" : \"-\";\n var base = parts[parts.length - 1];\n if (component == \"worker\" && sep == \"-\") {\n var re = new RegExp(\"^\" + component + \"[\\\\-_]|[\\\\-_]\" + component + \"$\", \"g\");\n base = base.replace(re, \"\");\n }\n\n if ((!base || base == component) && parts.length > 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = require(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n require([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n \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<scripts.length; i++) {\n var script = scripts[i];\n\n var src = script.src || script.getAttribute(\"src\");\n if (!src)\n continue;\n\n var attributes = script.attributes;\n for (var j=0, l=attributes.length; j < l; j++) {\n var attr = attributes[j];\n if (attr.name.indexOf(\"data-ace-\") === 0) {\n scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, \"\"))] = attr.value;\n }\n }\n\n var m = src.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);\n if (m)\n scriptUrl = m[1];\n }\n\n if (scriptUrl) {\n scriptOptions.base = scriptOptions.base || scriptUrl;\n scriptOptions.packaged = true;\n }\n\n scriptOptions.basePath = scriptOptions.base;\n scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;\n scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;\n scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;\n delete scriptOptions.base;\n\n for (var key in scriptOptions)\n if (typeof scriptOptions[key] !== \"undefined\")\n exports.set(key, scriptOptions[key]);\n}\n\nexports.init = init;\n\nfunction deHyphenate(str) {\n return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });\n}\n\nexports.version = \"1.4.14\";\n\n});\n\nace.define(\"ace/mouse/mouse_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/mouse/default_handlers\",\"ace/mouse/default_gutter_handler\",\"ace/mouse/mouse_event\",\"ace/mouse/dragdrop_handler\",\"ace/mouse/touch_handler\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar DefaultHandlers = require(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = require(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = require(\"./dragdrop_handler\").DragdropHandler;\nvar addTouchListeners = require(\"./touch_handler\").addTouchListeners;\nvar config = require(\"../config\");\n\nvar MouseHandler = function(editor) {\n var _self = this;\n this.editor = editor;\n\n new DefaultHandlers(this);\n new DefaultGutterHandler(this);\n new DragdropHandler(this);\n\n var focusEditor = function(e) {\n var windowBlurred = !document.hasFocus || !document.hasFocus()\n || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement());\n if (windowBlurred)\n window.focus();\n editor.focus();\n };\n\n var mouseTarget = editor.renderer.getMouseEventTarget();\n event.addListener(mouseTarget, \"click\", this.onMouseEvent.bind(this, \"click\"), editor);\n event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"), editor);\n event.addMultiMouseDownListener([\n mouseTarget,\n editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner,\n editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner,\n editor.textInput && editor.textInput.getElement()\n ].filter(Boolean), [400, 300, 250], this, \"onMouseEvent\", editor);\n event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"), editor);\n addTouchListeners(editor.container, editor);\n\n var gutterEl = editor.renderer.$gutter;\n event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"), editor);\n event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"), editor);\n event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"), editor);\n event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"), editor);\n\n event.addListener(mouseTarget, \"mousedown\", focusEditor, editor);\n event.addListener(gutterEl, \"mousedown\", focusEditor, editor);\n if (useragent.isIE && editor.renderer.scrollBarV) {\n event.addListener(editor.renderer.scrollBarV.element, \"mousedown\", focusEditor, editor);\n event.addListener(editor.renderer.scrollBarH.element, \"mousedown\", focusEditor, editor);\n }\n\n editor.on(\"mousemove\", function(e){\n if (_self.state || _self.$dragDelay || !_self.$dragEnabled)\n return;\n\n var character = editor.renderer.screenToTextCoordinates(e.x, e.y);\n var range = editor.session.selection.getRange();\n var renderer = editor.renderer;\n\n if (!range.isEmpty() && range.insideStart(character.row, character.column)) {\n renderer.setCursorStyle(\"default\");\n } else {\n renderer.setCursorStyle(\"\");\n }\n }, editor);\n};\n\n(function() {\n this.onMouseEvent = function(name, e) {\n if (!this.editor.session) return;\n this.editor._emit(name, new MouseEvent(e, this.editor));\n };\n\n this.onMouseMove = function(name, e) {\n var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n if (!listeners || !listeners.length)\n return;\n\n this.editor._emit(name, new MouseEvent(e, this.editor));\n };\n\n this.onMouseWheel = function(name, e) {\n var mouseEvent = new MouseEvent(e, this.editor);\n mouseEvent.speed = this.$scrollSpeed * 2;\n mouseEvent.wheelX = e.wheelX;\n mouseEvent.wheelY = e.wheelY;\n\n this.editor._emit(name, mouseEvent);\n };\n \n this.setState = function(state) {\n this.state = state;\n };\n\n this.captureMouse = function(ev, mouseMoveHandler) {\n this.x = ev.x;\n this.y = ev.y;\n\n this.isMousePressed = true;\n var editor = this.editor;\n var renderer = this.editor.renderer;\n renderer.$isMousePressed = true;\n\n var self = this;\n var onMouseMove = function(e) {\n if (!e) return;\n if (useragent.isWebKit && !e.which && self.releaseMouse)\n return self.releaseMouse();\n\n self.x = e.clientX;\n self.y = e.clientY;\n mouseMoveHandler && mouseMoveHandler(e);\n self.mouseEvent = new MouseEvent(e, self.editor);\n self.$mouseMoved = true;\n };\n\n var onCaptureEnd = function(e) {\n editor.off(\"beforeEndOperation\", onOperationEnd);\n clearInterval(timerId);\n if (editor.session) onCaptureInterval();\n self[self.state + \"End\"] && self[self.state + \"End\"](e);\n self.state = \"\";\n self.isMousePressed = renderer.$isMousePressed = false;\n if (renderer.$keepTextAreaAtCursor)\n renderer.$moveTextAreaToCursor();\n self.$onCaptureMouseMove = self.releaseMouse = null;\n e && self.onMouseEvent(\"mouseup\", e);\n editor.endOperation();\n };\n\n var onCaptureInterval = function() {\n self[self.state] && self[self.state]();\n self.$mouseMoved = false;\n };\n\n if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n return setTimeout(function() {onCaptureEnd(ev);});\n }\n\n var onOperationEnd = function(e) {\n if (!self.releaseMouse) return;\n if (editor.curOp.command.name && editor.curOp.selectionChanged) {\n self[self.state + \"End\"] && self[self.state + \"End\"]();\n self.state = \"\";\n self.releaseMouse();\n }\n };\n\n editor.on(\"beforeEndOperation\", onOperationEnd);\n editor.startOperation({command: {name: \"mouse\"}});\n\n self.$onCaptureMouseMove = onMouseMove;\n self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n var timerId = setInterval(onCaptureInterval, 20);\n };\n this.releaseMouse = null;\n this.cancelContextMenu = function() {\n var stop = function(e) {\n if (e && e.domEvent && e.domEvent.type != \"contextmenu\")\n return;\n this.editor.off(\"nativecontextmenu\", stop);\n if (e && e.domEvent)\n event.stopEvent(e.domEvent);\n }.bind(this);\n setTimeout(stop, 10);\n this.editor.on(\"nativecontextmenu\", stop);\n };\n this.destroy = function() {\n if (this.releaseMouse) this.releaseMouse();\n };\n}).call(MouseHandler.prototype);\n\nconfig.defineOptions(MouseHandler.prototype, \"mouseHandler\", {\n scrollSpeed: {initialValue: 2},\n dragDelay: {initialValue: (useragent.isMac ? 150 : 0)},\n dragEnabled: {initialValue: true},\n focusTimeout: {initialValue: 0},\n tooltipFollowsMouse: {initialValue: true}\n});\n\n\nexports.MouseHandler = MouseHandler;\n});\n\nace.define(\"ace/mouse/fold_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"../lib/dom\");\n\nfunction FoldHandler(editor) {\n\n editor.on(\"click\", function(e) {\n var position = e.getDocumentPosition();\n var session = editor.session;\n var fold = session.getFoldAt(position.row, position.column, 1);\n if (fold) {\n if (e.getAccelKey())\n session.removeFold(fold);\n else\n session.expandFold(fold);\n\n e.stop();\n }\n \n var target = e.domEvent && e.domEvent.target;\n if (target && dom.hasCssClass(target, \"ace_inline_button\")) {\n if (dom.hasCssClass(target, \"ace_toggle_wrap\")) {\n session.setOption(\"wrap\", !session.getUseWrapMode());\n editor.renderer.scrollCursorIntoView();\n }\n }\n });\n\n editor.on(\"gutterclick\", function(e) {\n var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\") {\n var row = e.getDocumentPosition().row;\n var session = editor.session;\n if (session.foldWidgets && session.foldWidgets[row])\n editor.session.onFoldWidgetClick(row, e);\n if (!editor.isFocused())\n editor.focus();\n e.stop();\n }\n });\n\n editor.on(\"gutterdblclick\", function(e) {\n var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\") {\n var row = e.getDocumentPosition().row;\n var session = editor.session;\n var data = session.getParentFoldRangeData(row, true);\n var range = data.range || data.firstRange;\n\n if (range) {\n row = range.start.row;\n var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n\n if (fold) {\n session.removeFold(fold);\n } else {\n session.addFold(\"...\", range);\n editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});\n }\n }\n e.stop();\n }\n });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\nace.define(\"ace/keyboard/keybinding\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/event\"], function(require, exports, module) {\n\"use strict\";\n\nvar keyUtil = require(\"../lib/keys\");\nvar event = require(\"../lib/event\");\n\nvar KeyBinding = function(editor) {\n this.$editor = editor;\n this.$data = {editor: editor};\n this.$handlers = [];\n this.setDefaultHandler(editor.commands);\n};\n\n(function() {\n this.setDefaultHandler = function(kb) {\n this.removeKeyboardHandler(this.$defaultHandler);\n this.$defaultHandler = kb;\n this.addKeyboardHandler(kb, 0);\n };\n\n this.setKeyboardHandler = function(kb) {\n var h = this.$handlers;\n if (h[h.length - 1] == kb)\n return;\n\n while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)\n this.removeKeyboardHandler(h[h.length - 1]);\n\n this.addKeyboardHandler(kb, 1);\n };\n\n this.addKeyboardHandler = function(kb, pos) {\n if (!kb)\n return;\n if (typeof kb == \"function\" && !kb.handleKeyboard)\n kb.handleKeyboard = kb;\n var i = this.$handlers.indexOf(kb);\n if (i != -1)\n this.$handlers.splice(i, 1);\n\n if (pos == undefined)\n this.$handlers.push(kb);\n else\n this.$handlers.splice(pos, 0, kb);\n\n if (i == -1 && kb.attach)\n kb.attach(this.$editor);\n };\n\n this.removeKeyboardHandler = function(kb) {\n var i = this.$handlers.indexOf(kb);\n if (i == -1)\n return false;\n this.$handlers.splice(i, 1);\n kb.detach && kb.detach(this.$editor);\n return true;\n };\n\n this.getKeyboardHandler = function() {\n return this.$handlers[this.$handlers.length - 1];\n };\n \n this.getStatusText = function() {\n var data = this.$data;\n var editor = data.editor;\n return this.$handlers.map(function(h) {\n return h.getStatusText && h.getStatusText(editor, data) || \"\";\n }).filter(Boolean).join(\" \");\n };\n\n this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) {\n var toExecute;\n var success = false;\n var commands = this.$editor.commands;\n\n for (var i = this.$handlers.length; i--;) {\n toExecute = this.$handlers[i].handleKeyboard(\n this.$data, hashId, keyString, keyCode, e\n );\n if (!toExecute || !toExecute.command)\n continue;\n if (toExecute.command == \"null\") {\n success = true;\n } else {\n success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);\n }\n if (success && e && hashId != -1 && \n toExecute.passEvent != true && toExecute.command.passEvent != true\n ) {\n event.stopEvent(e);\n }\n if (success)\n break;\n }\n \n if (!success && hashId == -1) {\n toExecute = {command: \"insertstring\"};\n success = commands.exec(\"insertstring\", this.$editor, keyString);\n }\n \n if (success && this.$editor._signal)\n this.$editor._signal(\"keyboardActivity\", toExecute);\n \n return success;\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n var keyString = keyUtil.keyCodeToString(keyCode);\n return this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n };\n\n this.onTextInput = function(text) {\n return this.$callKeyboardHandlers(-1, text);\n };\n\n}).call(KeyBinding.prototype);\n\nexports.KeyBinding = KeyBinding;\n});\n\nace.define(\"ace/lib/bidiutil\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar ArabicAlefBetIntervalsBegine = ['\\u0621', '\\u0641'];\nvar ArabicAlefBetIntervalsEnd = ['\\u063A', '\\u064a'];\nvar dir = 0, hiLevel = 0;\nvar lastArabic = false, hasUBAT_AL = false, hasUBAT_B = false, hasUBAT_S = false, hasBlockSep = false, hasSegSep = false;\n\nvar impTab_LTR = [\t[\t0,\t\t3,\t\t0,\t\t1,\t\t0,\t\t0,\t\t0\t],\t[\t0,\t\t3,\t\t0,\t\t1,\t\t2,\t\t2,\t\t0\t],\t[\t0,\t\t3,\t\t0,\t\t0x11,\t\t2,\t\t0,\t\t1\t],\t[\t0,\t\t3,\t\t5,\t\t5,\t\t4,\t\t1,\t\t0\t],\t[\t0,\t\t3,\t\t0x15,\t\t0x15,\t\t4,\t\t0,\t\t1\t],\t[\t0,\t\t3,\t\t5,\t\t5,\t\t4,\t\t2,\t\t0\t]\n];\n\nvar impTab_RTL = [\t[\t2,\t\t0,\t\t1,\t\t1,\t\t0,\t\t1,\t\t0\t],\t[\t2,\t\t0,\t\t1,\t\t1,\t\t0,\t\t2,\t\t0\t],\t[\t2,\t\t0,\t\t2,\t\t1,\t\t3,\t\t2,\t\t0\t],\t[\t2,\t\t0,\t\t2,\t\t0x21,\t\t3,\t\t1,\t\t1\t]\n];\n\nvar LTR = 0, RTL = 1;\n\nvar L = 0;\nvar R = 1;\nvar EN = 2;\nvar AN = 3;\nvar ON = 4;\nvar B = 5;\nvar S = 6;\nvar AL = 7;\nvar WS = 8;\nvar CS = 9;\nvar ES = 10;\nvar ET = 11;\nvar NSM = 12;\nvar LRE = 13;\nvar RLE = 14;\nvar PDF = 15;\nvar LRO = 16;\nvar RLO = 17;\nvar BN = 18;\n\nvar UnicodeTBL00 = [\nBN,BN,BN,BN,BN,BN,BN,BN,BN,S,B,S,WS,B,BN,BN,\nBN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,B,B,B,S,\nWS,ON,ON,ET,ET,ET,ON,ON,ON,ON,ON,ES,CS,ES,CS,CS,\nEN,EN,EN,EN,EN,EN,EN,EN,EN,EN,CS,ON,ON,ON,ON,ON,\nON,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,\nL,L,L,L,L,L,L,L,L,L,L,ON,ON,ON,ON,ON,\nON,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,\nL,L,L,L,L,L,L,L,L,L,L,ON,ON,ON,ON,BN,\nBN,BN,BN,BN,BN,B,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,\nBN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,\nCS,ON,ET,ET,ET,ET,ON,ON,ON,ON,L,ON,ON,BN,ON,ON,\nET,ET,EN,EN,ON,L,ON,ON,ON,EN,L,ON,ON,ON,ON,ON\n];\n\nvar UnicodeTBL20 = [\nWS,WS,WS,WS,WS,WS,WS,WS,WS,WS,WS,BN,BN,BN,L,R\t,\nON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,\nON,ON,ON,ON,ON,ON,ON,ON,WS,B,LRE,RLE,PDF,LRO,RLO,CS,\nET,ET,ET,ET,ET,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,\nON,ON,ON,ON,CS,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,\nON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,WS\n];\n\nfunction _computeLevels(chars, levels, len, charTypes) {\n\tvar impTab = dir ? impTab_RTL : impTab_LTR\n\t\t, prevState = null, newClass = null, newLevel = null, newState = 0\n\t\t, action = null, cond = null, condPos = -1, i = null, ix = null, classes = [];\n\n\tif (!charTypes) {\n\t\tfor (i = 0, charTypes = []; i < len; i++) {\n\t\t\tcharTypes[i] = _getCharacterType(chars[i]);\n\t\t}\n\t}\n\thiLevel = dir;\n\tlastArabic = false;\n\thasUBAT_AL = false;\n\thasUBAT_B = false;\n\thasUBAT_S = false;\n\tfor (ix = 0; ix < len; ix++){\n\t\tprevState = newState;\n\t\tclasses[ix] = newClass = _getCharClass(chars, charTypes, classes, ix);\n\t\tnewState = impTab[prevState][newClass];\n\t\taction = newState & 0xF0;\n\t\tnewState &= 0x0F;\n\t\tlevels[ix] = newLevel = impTab[newState][5];\n\t\tif (action > 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<deltas.length; i++) {\n this.applyDelta(deltas[i]);\n }\n };\n this.revertDeltas = function(deltas) {\n for (var i=deltas.length-1; 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<rows.length; i++) {\n this.$breakpoints[rows[i]] = \"ace_breakpoint\";\n }\n this._signal(\"changeBreakpoint\", {});\n };\n this.clearBreakpoints = function() {\n this.$breakpoints = [];\n this._signal(\"changeBreakpoint\", {});\n };\n this.setBreakpoint = function(row, className) {\n if (className === undefined)\n className = \"ace_breakpoint\";\n if (className)\n this.$breakpoints[row] = className;\n else\n delete this.$breakpoints[row];\n this._signal(\"changeBreakpoint\", {});\n };\n this.clearBreakpoint = function(row) {\n delete this.$breakpoints[row];\n this._signal(\"changeBreakpoint\", {});\n };\n this.addMarker = function(range, clazz, type, inFront) {\n var id = this.$markerId++;\n\n var marker = {\n range : range,\n type : type || \"line\",\n renderer: typeof type == \"function\" ? type : null,\n clazz : clazz,\n inFront: !!inFront,\n id: id\n };\n\n if (inFront) {\n this.$frontMarkers[id] = marker;\n this._signal(\"changeFrontMarker\");\n } else {\n this.$backMarkers[id] = marker;\n this._signal(\"changeBackMarker\");\n }\n\n return id;\n };\n this.addDynamicMarker = function(marker, inFront) {\n if (!marker.update)\n return;\n var id = this.$markerId++;\n marker.id = id;\n marker.inFront = !!inFront;\n\n if (inFront) {\n this.$frontMarkers[id] = marker;\n this._signal(\"changeFrontMarker\");\n } else {\n this.$backMarkers[id] = marker;\n this._signal(\"changeBackMarker\");\n }\n\n return marker;\n };\n this.removeMarker = function(markerId) {\n var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];\n if (!marker)\n return;\n\n var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;\n delete (markers[markerId]);\n this._signal(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n };\n this.getMarkers = function(inFront) {\n return inFront ? this.$frontMarkers : this.$backMarkers;\n };\n\n this.highlight = function(re) {\n if (!this.$searchHighlight) {\n var highlight = new SearchHighlight(null, \"ace_selected-word\", \"text\");\n this.$searchHighlight = this.addDynamicMarker(highlight);\n }\n this.$searchHighlight.setRegexp(re);\n };\n this.highlightLines = function(startRow, endRow, clazz, inFront) {\n if (typeof endRow != \"number\") {\n clazz = endRow;\n endRow = startRow;\n }\n if (!clazz)\n clazz = \"ace_step\";\n\n var range = new Range(startRow, 0, endRow, Infinity);\n range.id = this.addMarker(range, clazz, \"fullLine\", inFront);\n return range;\n };\n this.setAnnotations = function(annotations) {\n this.$annotations = annotations;\n this._signal(\"changeAnnotation\", {});\n };\n this.getAnnotations = function() {\n return this.$annotations || [];\n };\n this.clearAnnotations = function() {\n this.setAnnotations([]);\n };\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r?\\n)/m);\n if (match) {\n this.$autoNewLine = match[1];\n } else {\n this.$autoNewLine = \"\\n\";\n }\n };\n this.getWordRange = function(row, column) {\n var line = this.getLine(row);\n\n var inToken = false;\n if (column > 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 === '</') {\n depth--;\n }\n }\n } else if (tag === currentTag && token.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 === '</') {\n depth--;\n }\n }\n } else if (token.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 === '</') {\n depth[token.value]--;\n }\n \n if (depth[token.value] === -1) {\n matchType = 'tag';\n found = true;\n }\n }\n\n if (!found) {\n prevToken = token;\n token = iterator.stepForward();\n i = 0;\n }\n } while (token && !found);\n if (!matchType)\n return;\n\n var range, pos;\n if (matchType === 'bracket') {\n range = this.session.getBracketRange(cursor);\n if (!range) {\n range = new Range(\n iterator.getCurrentTokenRow(),\n iterator.getCurrentTokenColumn() + i - 1,\n iterator.getCurrentTokenRow(),\n iterator.getCurrentTokenColumn() + i - 1\n );\n pos = range.start;\n if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2)\n range = this.session.getBracketRange(pos);\n }\n }\n else if (matchType === 'tag') {\n if (token && token.type.indexOf('tag-name') !== -1) \n var tag = token.value;\n else\n return;\n\n range = new Range(\n iterator.getCurrentTokenRow(),\n iterator.getCurrentTokenColumn() - 2,\n iterator.getCurrentTokenRow(),\n iterator.getCurrentTokenColumn() - 2\n );\n if (range.compare(cursor.row, cursor.column) === 0) {\n found = false;\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n \n if (prevToken) {\n if (prevToken.type.indexOf('tag-close') !== -1) {\n range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1);\n }\n\n if (token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<') {\n depth[tag]++;\n }\n else if (prevToken.value === '</') {\n depth[tag]--;\n }\n \n if (depth[tag] === 0)\n found = true;\n }\n }\n } while (prevToken && !found);\n }\n if (token && token.type.indexOf('tag-name')) {\n pos = range.start;\n if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)\n pos = range.end;\n }\n }\n\n pos = range && range.cursor || pos;\n if (pos) {\n if (select) {\n if (range && expand) {\n this.selection.setRange(range);\n } else if (range && range.isEqual(this.getSelectionRange())) {\n this.clearSelection();\n } else {\n this.selection.selectTo(pos.row, pos.column);\n }\n } else {\n this.selection.moveTo(pos.row, pos.column);\n }\n }\n };\n this.gotoLine = function(lineNumber, column, animate) {\n this.selection.clearSelection();\n this.session.unfold({row: lineNumber - 1, column: column || 0});\n this.exitMultiSelectMode && this.exitMultiSelectMode();\n this.moveCursorTo(lineNumber - 1, column || 0);\n\n if (!this.isRowFullyVisible(lineNumber - 1))\n this.scrollToLine(lineNumber - 1, true, animate);\n };\n this.navigateTo = function(row, column) {\n this.selection.moveTo(row, column);\n };\n this.navigateUp = function(times) {\n if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n var selectionStart = this.selection.anchor.getPosition();\n return this.moveCursorToPosition(selectionStart);\n }\n this.selection.clearSelection();\n this.selection.moveCursorBy(-times || -1, 0);\n };\n this.navigateDown = function(times) {\n if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n var selectionEnd = this.selection.anchor.getPosition();\n return this.moveCursorToPosition(selectionEnd);\n }\n this.selection.clearSelection();\n this.selection.moveCursorBy(times || 1, 0);\n };\n this.navigateLeft = function(times) {\n if (!this.selection.isEmpty()) {\n var selectionStart = this.getSelectionRange().start;\n this.moveCursorToPosition(selectionStart);\n }\n else {\n times = times || 1;\n while (times--) {\n this.selection.moveCursorLeft();\n }\n }\n this.clearSelection();\n };\n this.navigateRight = function(times) {\n if (!this.selection.isEmpty()) {\n var selectionEnd = this.getSelectionRange().end;\n this.moveCursorToPosition(selectionEnd);\n }\n else {\n times = times || 1;\n while (times--) {\n this.selection.moveCursorRight();\n }\n }\n this.clearSelection();\n };\n this.navigateLineStart = function() {\n this.selection.moveCursorLineStart();\n this.clearSelection();\n };\n this.navigateLineEnd = function() {\n this.selection.moveCursorLineEnd();\n this.clearSelection();\n };\n this.navigateFileEnd = function() {\n this.selection.moveCursorFileEnd();\n this.clearSelection();\n };\n this.navigateFileStart = function() {\n this.selection.moveCursorFileStart();\n this.clearSelection();\n };\n this.navigateWordRight = function() {\n this.selection.moveCursorWordRight();\n this.clearSelection();\n };\n this.navigateWordLeft = function() {\n this.selection.moveCursorWordLeft();\n this.clearSelection();\n };\n this.replace = function(replacement, options) {\n if (options)\n this.$search.set(options);\n\n var range = this.$search.find(this.session);\n var replaced = 0;\n if (!range)\n return replaced;\n\n if (this.$tryReplace(range, replacement)) {\n replaced = 1;\n }\n\n this.selection.setSelectionRange(range);\n this.renderer.scrollSelectionIntoView(range.start, range.end);\n\n return replaced;\n };\n this.replaceAll = function(replacement, options) {\n if (options) {\n this.$search.set(options);\n }\n\n var ranges = this.$search.findAll(this.session);\n var replaced = 0;\n if (!ranges.length)\n return replaced;\n\n var selection = this.getSelectionRange();\n this.selection.moveTo(0, 0);\n\n for (var i = ranges.length - 1; i >= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n\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<cell.length; i++) {\n fragment.appendChild(cell[i].element);\n }\n this.element.appendChild(fragment);\n } else {\n this.cells.push(cell);\n this.element.appendChild(cell.element);\n }\n };\n \n this.unshift = function(cell) {\n if (Array.isArray(cell)) {\n this.cells.unshift.apply(this.cells, cell);\n var fragment = dom.createFragment(this.element);\n for (var i=0; i<cell.length; i++) {\n fragment.appendChild(cell[i].element);\n }\n if (this.element.firstChild)\n this.element.insertBefore(fragment, this.element.firstChild);\n else\n this.element.appendChild(fragment);\n } else {\n this.cells.unshift(cell);\n this.element.insertAdjacentElement(\"afterbegin\", cell.element);\n }\n };\n \n this.last = function() {\n if (this.cells.length)\n return this.cells[this.cells.length-1];\n else\n return null;\n };\n \n this.$cacheCell = function(cell) {\n if (!cell)\n return;\n \n cell.element.remove();\n this.cellCache.push(cell);\n };\n \n this.createCell = function(row, config, session, initElement) {\n var cell = this.cellCache.pop();\n if (!cell) {\n var element = dom.createElement(\"div\");\n if (initElement)\n initElement(element);\n \n this.element.appendChild(element);\n \n cell = {\n element: element,\n text: \"\",\n row: row\n };\n }\n cell.row = row;\n \n return cell;\n };\n \n}).call(Lines.prototype);\n\nexports.Lines = Lines;\n\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/layer/lines\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar Lines = require(\"./lines\").Lines;\n\nvar Gutter = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_gutter-layer\";\n parentEl.appendChild(this.element);\n this.setShowFoldWidgets(this.$showFoldWidgets);\n \n this.gutterWidth = 0;\n\n this.$annotations = [];\n this.$updateAnnotations = this.$updateAnnotations.bind(this);\n \n this.$lines = new Lines(this.element);\n this.$lines.$offsetCoefficient = 1;\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.setSession = function(session) {\n if (this.session)\n this.session.off(\"change\", this.$updateAnnotations);\n this.session = session;\n if (session)\n session.on(\"change\", this.$updateAnnotations);\n };\n\n this.addGutterDecoration = function(row, className) {\n if (window.console)\n console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n this.session.addGutterDecoration(row, className);\n };\n\n this.removeGutterDecoration = function(row, className) {\n if (window.console)\n console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n this.session.removeGutterDecoration(row, className);\n };\n\n this.setAnnotations = function(annotations) {\n this.$annotations = [];\n for (var i = 0; i < annotations.length; i++) {\n var annotation = annotations[i];\n var row = annotation.row;\n var rowInfo = this.$annotations[row];\n if (!rowInfo)\n rowInfo = this.$annotations[row] = {text: []};\n \n var annoText = annotation.text;\n annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n if (rowInfo.text.indexOf(annoText) === -1)\n rowInfo.text.push(annoText);\n\n var type = annotation.type;\n if (type == \"error\")\n rowInfo.className = \" ace_error\";\n else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n rowInfo.className = \" ace_warning\";\n else if (type == \"info\" && (!rowInfo.className))\n rowInfo.className = \" ace_info\";\n }\n };\n\n this.$updateAnnotations = function (delta) {\n if (!this.$annotations.length)\n return;\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n if (len === 0) {\n } else if (delta.action == 'remove') {\n this.$annotations.splice(firstRow, len + 1, null);\n } else {\n var args = new Array(len + 1);\n args.unshift(firstRow, 1);\n this.$annotations.splice.apply(this.$annotations, args);\n }\n };\n\n this.update = function(config) {\n this.config = config;\n \n var session = this.session;\n var firstRow = config.firstRow;\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n session.getLength() - 1);\n \n this.oldLastRow = lastRow;\n this.config = config;\n \n this.$lines.moveContainer(config);\n this.$updateCursorRow();\n \n var fold = session.getNextFoldLine(firstRow);\n var foldStart = fold ? fold.start.row : Infinity;\n\n var cell = null;\n var index = -1;\n var row = firstRow;\n \n while (true) {\n if (row > 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<count; i++) {\n parent.appendChild(this.$tabStrings[\" \"].cloneNode(true));\n }\n return value.substr(cols);\n } else if (value[0] == \"\\t\") {\n for (var i=0; i<cols; i++) {\n parent.appendChild(this.$tabStrings[\"\\t\"].cloneNode(true));\n }\n return value.substr(cols);\n }\n return value;\n };\n\n this.$createLineElement = function(parent) {\n var lineEl = this.dom.createElement(\"div\");\n lineEl.className = \"ace_line\";\n lineEl.style.height = this.config.lineHeight + \"px\";\n \n return lineEl;\n };\n\n this.$renderWrappedLine = function(parent, tokens, splits) {\n var chars = 0;\n var split = 0;\n var splitChars = splits[0];\n var screenColumn = 0;\n\n var lineEl = this.$createLineElement();\n parent.appendChild(lineEl);\n \n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n var value = token.value;\n if (i == 0 && this.displayIndentGuides) {\n chars = value.length;\n value = this.renderIndentGuide(lineEl, value, splitChars);\n if (!value)\n continue;\n chars -= value.length;\n }\n\n if (chars + value.length < splitChars) {\n screenColumn = this.$renderToken(lineEl, screenColumn, token, value);\n chars += value.length;\n } else {\n while (chars + value.length >= 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 ? \"<hide>\" : \"<click to see more...>\";\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(\"<br>\");\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\");\n\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 ","ace.define(\"ace/split\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/editor\",\"ace/virtual_renderer\",\"ace/edit_session\"], 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;\n\nvar Editor = require(\"./editor\").Editor;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar EditSession = require(\"./edit_session\").EditSession;\n\n\nvar Split = function(container, theme, splits) {\n this.BELOW = 1;\n this.BESIDE = 0;\n\n this.$container = container;\n this.$theme = theme;\n this.$splits = 0;\n this.$editorCSS = \"\";\n this.$editors = [];\n this.$orientation = this.BESIDE;\n\n this.setSplits(splits || 1);\n this.$cEditor = this.$editors[0];\n\n\n this.on(\"focus\", function(editor) {\n this.$cEditor = editor;\n }.bind(this));\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$createEditor = function() {\n var el = document.createElement(\"div\");\n el.className = this.$editorCSS;\n el.style.cssText = \"position: absolute; top:0px; bottom:0px\";\n this.$container.appendChild(el);\n var editor = new Editor(new Renderer(el, this.$theme));\n\n editor.on(\"focus\", function() {\n this._emit(\"focus\", editor);\n }.bind(this));\n\n this.$editors.push(editor);\n editor.setFontSize(this.$fontSize);\n return editor;\n };\n\n this.setSplits = function(splits) {\n var editor;\n if (splits < 1) {\n throw \"The number of splits have to be > 0!\";\n }\n\n if (splits == this.$splits) {\n return;\n } else if (splits > this.$splits) {\n while (this.$splits < this.$editors.length && this.$splits < splits) {\n editor = this.$editors[this.$splits];\n this.$container.appendChild(editor.container);\n editor.setFontSize(this.$fontSize);\n this.$splits ++;\n }\n while (this.$splits < splits) {\n this.$createEditor();\n this.$splits ++;\n }\n } else {\n while (this.$splits > splits) {\n editor = this.$editors[this.$splits - 1];\n this.$container.removeChild(editor.container);\n this.$splits --;\n }\n }\n this.resize();\n };\n this.getSplits = function() {\n return this.$splits;\n };\n this.getEditor = function(idx) {\n return this.$editors[idx];\n };\n this.getCurrentEditor = function() {\n return this.$cEditor;\n };\n this.focus = function() {\n this.$cEditor.focus();\n };\n this.blur = function() {\n this.$cEditor.blur();\n };\n this.setTheme = function(theme) {\n this.$editors.forEach(function(editor) {\n editor.setTheme(theme);\n });\n };\n this.setKeyboardHandler = function(keybinding) {\n this.$editors.forEach(function(editor) {\n editor.setKeyboardHandler(keybinding);\n });\n };\n this.forEach = function(callback, scope) {\n this.$editors.forEach(callback, scope);\n };\n\n\n this.$fontSize = \"\";\n this.setFontSize = function(size) {\n this.$fontSize = size;\n this.forEach(function(editor) {\n editor.setFontSize(size);\n });\n };\n\n this.$cloneSession = function(session) {\n var s = new EditSession(session.getDocument(), session.getMode());\n\n var undoManager = session.getUndoManager();\n s.setUndoManager(undoManager);\n s.setTabSize(session.getTabSize());\n s.setUseSoftTabs(session.getUseSoftTabs());\n s.setOverwrite(session.getOverwrite());\n s.setBreakpoints(session.getBreakpoints());\n s.setUseWrapMode(session.getUseWrapMode());\n s.setUseWorker(session.getUseWorker());\n s.setWrapLimitRange(session.$wrapLimitRange.min,\n session.$wrapLimitRange.max);\n s.$foldData = session.$cloneFoldData();\n\n return s;\n };\n this.setSession = function(session, idx) {\n var editor;\n if (idx == null) {\n editor = this.$cEditor;\n } else {\n editor = this.$editors[idx];\n }\n var isUsed = this.$editors.some(function(editor) {\n return editor.session === session;\n });\n\n if (isUsed) {\n session = this.$cloneSession(session);\n }\n editor.setSession(session);\n return session;\n };\n this.getOrientation = function() {\n return this.$orientation;\n };\n this.setOrientation = function(orientation) {\n if (this.$orientation == orientation) {\n return;\n }\n this.$orientation = orientation;\n this.resize();\n };\n this.resize = function() {\n var width = this.$container.clientWidth;\n var height = this.$container.clientHeight;\n var editor;\n\n if (this.$orientation == this.BESIDE) {\n var editorWidth = width / this.$splits;\n for (var i = 0; i < this.$splits; i++) {\n editor = this.$editors[i];\n editor.container.style.width = editorWidth + \"px\";\n editor.container.style.top = \"0px\";\n editor.container.style.left = i * editorWidth + \"px\";\n editor.container.style.height = height + \"px\";\n editor.resize();\n }\n } else {\n var editorHeight = height / this.$splits;\n for (var i = 0; i < this.$splits; i++) {\n editor = this.$editors[i];\n editor.container.style.width = width + \"px\";\n editor.container.style.top = i * editorHeight + \"px\";\n editor.container.style.left = \"0px\";\n editor.container.style.height = editorHeight + \"px\";\n editor.resize();\n }\n }\n };\n\n}).call(Split.prototype);\n\nexports.Split = Split;\n});\n\nace.define(\"ace/ext/split\",[\"require\",\"exports\",\"module\",\"ace/split\"], function(require, exports, module) {\n\"use strict\";\nmodule.exports = require(\"../split\");\n\n}); (function() {\n ace.require([\"ace/ext/split\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","ace.define(\"ace/mode/doc_comment_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 DocCommentHighlightRules = function() {\n this.$rules = {\n \"start\" : [ {\n token : \"comment.doc.tag\",\n regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n }, \n DocCommentHighlightRules.getTagRule(),\n {\n defaultToken : \"comment.doc\",\n caseInsensitive: true\n }]\n };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n return {\n token : \"comment.doc.tag.storage.type\",\n regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n };\n};\n\nDocCommentHighlightRules.getStartRule = function(start) {\n return {\n token : \"comment.doc\", // doc comment\n regex : \"\\\\/\\\\*(?=\\\\*)\",\n next : start\n };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n return {\n token : \"comment.doc\", // closing comment\n regex : \"\\\\*\\\\/\",\n next : start\n };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\";\n\nvar JavaScriptHighlightRules = function(options) {\n var keywordMapper = this.createKeywordMapper({\n \"variable.language\":\n \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\" + // Constructors\n \"Namespace|QName|XML|XMLList|\" + // E4X\n \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\" +\n \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\" +\n \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\" + // Errors\n \"SyntaxError|TypeError|URIError|\" +\n \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n \"isNaN|parseFloat|parseInt|\" +\n \"JSON|Math|\" + // Other\n \"this|arguments|prototype|window|document\" , // Pseudo\n \"keyword\":\n \"const|yield|import|get|set|async|await|\" +\n \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n \"if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n \"storage.type\":\n \"const|let|var|function\",\n \"constant.language\":\n \"null|Infinity|NaN|undefined\",\n \"support.function\":\n \"alert\",\n \"constant.language.boolean\": \"true|false\"\n }, \"identifier\");\n var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n\n var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n \"u[0-9a-fA-F]{4}|\" + // unicode\n \"u{[0-9a-fA-F]{1,6}}|\" + // es6 unicode\n \"[0-2][0-7]{0,2}|\" + // oct\n \"3[0-7][0-7]?|\" + // oct\n \"[4-7][0-7]?|\" + //oct\n \".)\";\n\n this.$rules = {\n \"no_regex\" : [\n DocCommentHighlightRules.getStartRule(\"doc-start\"),\n comments(\"no_regex\"),\n {\n token : \"string\",\n regex : \"'(?=.)\",\n next : \"qstring\"\n }, {\n token : \"string\",\n regex : '\"(?=.)',\n next : \"qqstring\"\n }, {\n token : \"constant.numeric\", // hexadecimal, octal and binary\n regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\\b/\n }, {\n token : \"constant.numeric\", // decimal integers and floats\n regex : /(?:\\d\\d*(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+\\b)?/\n }, {\n token : [\n \"storage.type\", \"punctuation.operator\", \"support.function\",\n \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n ],\n regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n next: \"function_arguments\"\n }, {\n token : [\n \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n ],\n regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n next: \"function_arguments\"\n }, {\n token : [\n \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n \"text\", \"paren.lparen\"\n ],\n regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n next: \"function_arguments\"\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 : [\n \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n ],\n regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n next: \"function_arguments\"\n }, {\n token : [\n \"entity.name.function\", \"text\", \"punctuation.operator\",\n \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n ],\n regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n next: \"function_arguments\"\n }, {\n token : [\n \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n ],\n regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n next: \"function_arguments\"\n }, {\n token : \"keyword\",\n regex : \"from(?=\\\\s*('|\\\"))\"\n }, {\n token : \"keyword\",\n regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n next : \"start\"\n }, {\n token : [\"support.constant\"],\n regex : /that\\b/\n }, {\n token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n }, {\n token : keywordMapper,\n regex : identifierRe\n }, {\n token : \"punctuation.operator\",\n regex : /[.](?![.])/,\n next : \"property\"\n }, {\n token : \"storage.type\",\n regex : /=>/,\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 : \"</?\" + tagRegex + \"\",\n next: \"jsxAttributes\",\n nextState: \"jsx\"\n };\n this.$rules.start.unshift(jsxTag);\n var jsxJsRule = {\n regex: \"{\",\n token: \"paren.quasi.start\",\n push: \"start\"\n };\n this.$rules.jsx = [\n jsxJsRule,\n jsxTag,\n {include : \"reference\"},\n {defaultToken: \"string\"}\n ];\n this.$rules.jsxAttributes = [{\n token : \"meta.tag.punctuation.tag-close.xml\",\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});\n\nace.define(\"ace/mode/java_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaHighlightRules = function() {\n var keywords = (\n \"abstract|continue|for|new|switch|\" +\n \"assert|default|goto|package|synchronized|\" +\n \"boolean|do|if|private|this|\" +\n \"break|double|implements|protected|throw|\" +\n \"byte|else|import|public|throws|\" +\n \"case|enum|instanceof|return|transient|\" +\n \"catch|extends|int|short|try|\" +\n \"char|final|interface|static|void|\" +\n \"class|finally|long|strictfp|volatile|\" +\n \"const|float|native|super|while|\" +\n \"var\"\n );\n\n var buildinConstants = (\"null|Infinity|NaN|undefined\");\n\n\n var langClasses = (\n \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n \"ExceptionInInitializerError|IllegalAccessError|\"+\n \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n \"InstantiationException|IndexOutOfBoundsException|\"+\n \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n \"ArrayStoreException|ClassCastException|LinkageError|\"+\n \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n );\n\n var keywordMapper = this.createKeywordMapper({\n \"variable.language\": \"this\",\n \"keyword\": keywords,\n \"constant.language\": buildinConstants,\n \"support.function\": langClasses\n }, \"identifier\");\n\n this.$rules = {\n \"start\" : [\n {\n token : \"comment\",\n regex : \"\\\\/\\\\/.*$\"\n },\n DocCommentHighlightRules.getStartRule(\"doc-start\"),\n {\n token : \"comment\", // multi line comment\n regex : \"\\\\/\\\\*\",\n next : \"comment\"\n }, {\n token : \"string\", // single line\n regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n }, {\n token : \"string\", // single line\n regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n }, {\n token : \"constant.numeric\", // hex\n regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\\b/\n }, {\n token : \"constant.numeric\", // float\n regex : /[+-]?\\d[\\d_]*(?:(?:\\.[\\d_]*)?(?:[eE][+-]?[\\d_]+)?)?[LlSsDdFfYy]?\\b/\n }, {\n token : \"constant.language.boolean\",\n regex : \"(?:true|false)\\\\b\"\n }, {\n regex: \"(open(?:\\\\s+))?module(?=\\\\s*\\\\w)\",\n token: \"keyword\",\n next: [{\n regex: \"{\",\n token: \"paren.lparen\",\n next: [{\n regex: \"}\",\n token: \"paren.rparen\",\n next: \"start\"\n }, {\n regex: \"\\\\b(requires|transitive|exports|opens|to|uses|provides|with)\\\\b\",\n token: \"keyword\" \n }]\n }, {\n token : \"text\",\n regex : \"\\\\s+\"\n }, {\n token : \"identifier\",\n regex : \"\\\\w+\"\n }, {\n token : \"punctuation.operator\",\n regex : \".\"\n }, {\n token : \"text\",\n regex : \"\\\\s+\"\n }, {\n regex: \"\", // exit if there is anything else\n next: \"start\"\n }]\n }, {\n token : keywordMapper,\n regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n }, {\n token : \"keyword.operator\",\n regex : \"!|\\\\$|%|&|\\\\||\\\\^|\\\\*|\\\\/|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?|\\\\:|\\\\*=|\\\\/=|%=|\\\\+=|\\\\-=|&=|\\\\|=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n }, {\n token : \"lparen\",\n regex : \"[[({]\"\n }, {\n token : \"rparen\",\n regex : \"[\\\\])}]\"\n }, {\n token : \"text\",\n regex : \"\\\\s+\"\n }\n ],\n \"comment\" : [\n {\n token : \"comment\", // closing comment\n regex : \"\\\\*\\\\/\",\n next : \"start\"\n }, {\n defaultToken : \"comment\"\n }\n ]\n };\n\n \n this.embedRules(DocCommentHighlightRules, \"doc-\",\n [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n this.normalizeRules();\n};\n\noop.inherits(JavaHighlightRules, TextHighlightRules);\n\nexports.JavaHighlightRules = JavaHighlightRules;\n});\n\nace.define(\"ace/mode/folding/java\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/cstyle\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, CStyleFoldMode);\n\n(function() {\n this.importRegex = /^import /;\n this.getCStyleFoldWidget = this.getFoldWidget;\n this.getFoldWidget = function(session, foldStyle, row) {\n if (foldStyle === \"markbegin\") {\n var line = session.getLine(row);\n if (this.importRegex.test(line)) {\n if (row == 0 || !this.importRegex.test(session.getLine(row - 1)))\n return \"start\";\n }\n }\n\n return this.getCStyleFoldWidget(session, foldStyle, row);\n };\n \n this.getCstyleFoldWidgetRange = this.getFoldWidgetRange;\n this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n var line = session.getLine(row);\n var match = line.match(this.importRegex);\n if (!match || foldStyle !== \"markbegin\")\n return this.getCstyleFoldWidgetRange(session, foldStyle, row, forceMultiline);\n\n var startColumn = match[0].length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var line = session.getLine(row);\n if (line.match(/^\\s*$/))\n continue;\n\n if (!line.match(this.importRegex))\n break;\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/java\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/java_highlight_rules\",\"ace/mode/folding/java\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar JavaHighlightRules = require(\"./java_highlight_rules\").JavaHighlightRules;\nvar JavaFoldMode = require(\"./folding/java\").FoldMode;\n\nvar Mode = function() {\n JavaScriptMode.call(this);\n this.HighlightRules = JavaHighlightRules;\n this.foldingRules = new JavaFoldMode();\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n \n this.createWorker = function(session) {\n return null;\n };\n\n this.$id = \"ace/mode/java\";\n this.snippetFileId = \"ace/snippets/java\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n}); (function() {\n ace.require([\"ace/mode/java\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","ace.define(\"ace/theme/github\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-github\";\nexports.cssText = \"\\\n.ace-github .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #AAA;\\\n}\\\n.ace-github {\\\nbackground: #fff;\\\ncolor: #000;\\\n}\\\n.ace-github .ace_keyword {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_string {\\\ncolor: #D14;\\\n}\\\n.ace-github .ace_variable.ace_class {\\\ncolor: teal;\\\n}\\\n.ace-github .ace_constant.ace_numeric {\\\ncolor: #099;\\\n}\\\n.ace-github .ace_constant.ace_buildin {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_support.ace_function {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_comment {\\\ncolor: #998;\\\nfont-style: italic;\\\n}\\\n.ace-github .ace_variable.ace_language {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_paren {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_boolean {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_string.ace_regexp {\\\ncolor: #009926;\\\nfont-weight: normal;\\\n}\\\n.ace-github .ace_variable.ace_instance {\\\ncolor: teal;\\\n}\\\n.ace-github .ace_constant.ace_language {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-github.ace_focus .ace_marker-layer .ace_active-line {\\\nbackground: rgb(255, 255, 204);\\\n}\\\n.ace-github .ace_marker-layer .ace_active-line {\\\nbackground: rgb(245, 245, 245);\\\n}\\\n.ace-github .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-github.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-github.ace_nobold .ace_line > span {\\\nfont-weight: normal !important;\\\n}\\\n.ace-github .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-github .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-github .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-github .ace_gutter-active-line {\\\nbackground-color : rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-github .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-github .ace_invisible {\\\ncolor: #BFBFBF\\\n}\\\n.ace-github .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-github .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\n var dom = require(\"../lib/dom\");\n dom.importCssString(exports.cssText, exports.cssClass, false);\n}); (function() {\n ace.require([\"ace/theme/github\"], function(m) {\n if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n module.exports = m;\n }\n });\n })();\n ","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')\n .replace(pattern_gt, '>').replace(pattern_para, '¶<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n symbolTag = '[object Symbol]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n splice = arrayProto.splice;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ace_builds_1 = require(\"ace-builds\");\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = (0, editorOptions_1.getAceInstance)();\nvar ReactAce = /** @class */ (function (_super) {\n __extends(ReactAce, _super);\n function ReactAce(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n ReactAce.prototype.isInShadow = function (node) {\n var parent = node && node.parentNode;\n while (parent) {\n if (parent.toString() === \"[object ShadowRoot]\") {\n return true;\n }\n parent = parent.parentNode;\n }\n return false;\n };\n ReactAce.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, onValidate = _a.onValidate, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, placeholder = _a.placeholder;\n this.editor = ace.edit(this.refEditor);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n for (var i = 0; i < editorProps.length; i++) {\n this.editor[editorProps[i]] = this.props.editorProps[editorProps[i]];\n }\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n this.editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n if (this.isInShadow(this.refEditor)) {\n this.editor.renderer.attachToShadowRoot();\n }\n this.editor\n .getSession()\n .setMode(typeof mode === \"string\" ? \"ace/mode/\" + mode : mode);\n if (theme && theme !== \"\")\n this.editor.setTheme(\"ace/theme/\" + theme);\n this.editor.setFontSize(typeof fontSize === \"number\" ? fontSize + \"px\" : fontSize);\n this.editor\n .getSession()\n .setValue(!defaultValue ? value || \"\" : defaultValue);\n if (this.props.navigateToFileEnd) {\n this.editor.navigateFileEnd();\n }\n this.editor.renderer.setShowGutter(showGutter);\n this.editor.getSession().setUseWrapMode(wrapEnabled);\n this.editor.setShowPrintMargin(showPrintMargin);\n this.editor.on(\"focus\", this.onFocus);\n this.editor.on(\"blur\", this.onBlur);\n this.editor.on(\"copy\", this.onCopy);\n this.editor.on(\"paste\", this.onPaste);\n this.editor.on(\"change\", this.onChange);\n this.editor.on(\"input\", this.onInput);\n if (placeholder) {\n this.updatePlaceholder();\n }\n this.editor\n .getSession()\n .selection.on(\"changeSelection\", this.onSelectionChange);\n this.editor.getSession().selection.on(\"changeCursor\", this.onCursorChange);\n if (onValidate) {\n // @ts-ignore types don't include\n this.editor.getSession().on(\"changeAnnotation\", function () {\n // tslint:disable-next-line:no-shadowed-variable\n var annotations = _this.editor.getSession().getAnnotations();\n _this.props.onValidate(annotations);\n });\n }\n this.editor.session.on(\"changeScrollTop\", this.onScroll);\n this.editor.getSession().setAnnotations(annotations || []);\n if (markers && markers.length > 0) {\n this.handleMarkers(markers);\n }\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.editor.$options;\n editorOptions_1.editorOptions.forEach(function (option) {\n if (availableOptions.hasOwnProperty(option)) {\n // @ts-ignore\n _this.editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReactAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n });\n this.handleOptions(this.props);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n _this.editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n _this.editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (onLoad) {\n onLoad(this.editor);\n }\n this.editor.resize();\n if (focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.componentDidUpdate = function (prevProps) {\n var oldProps = prevProps;\n var nextProps = this.props;\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n // @ts-ignore\n this.editor.setOption(option, nextProps[option]);\n }\n }\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n // First process editor value, as it may create a new session (see issue #300)\n if (this.editor &&\n nextProps.value != null &&\n this.editor.getValue() !== nextProps.value) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n this.silent = true;\n var pos = this.editor.session.selection.toJSON();\n this.editor.setValue(nextProps.value, nextProps.cursorStart);\n this.editor.session.selection.fromJSON(pos);\n this.silent = false;\n }\n if (nextProps.placeholder !== oldProps.placeholder) {\n this.updatePlaceholder();\n }\n if (nextProps.mode !== oldProps.mode) {\n this.editor\n .getSession()\n .setMode(typeof nextProps.mode === \"string\"\n ? \"ace/mode/\" + nextProps.mode\n : nextProps.mode);\n }\n if (nextProps.theme !== oldProps.theme) {\n this.editor.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n this.editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n this.editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n this.editor.setFontSize(typeof nextProps.fontSize === \"number\"\n ? nextProps.fontSize + \"px\"\n : nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n this.editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n this.editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n this.editor.renderer.setShowGutter(nextProps.showGutter);\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n this.handleOptions(nextProps);\n }\n if (!isEqual(nextProps.annotations, oldProps.annotations)) {\n this.editor.getSession().setAnnotations(nextProps.annotations || []);\n }\n if (!isEqual(nextProps.markers, oldProps.markers) &&\n Array.isArray(nextProps.markers)) {\n this.handleMarkers(nextProps.markers);\n }\n // this doesn't look like it works at all....\n if (!isEqual(nextProps.scrollMargin, oldProps.scrollMargin)) {\n this.handleScrollMargins(nextProps.scrollMargin);\n }\n if (prevProps.height !== this.props.height ||\n prevProps.width !== this.props.width) {\n this.editor.resize();\n }\n if (this.props.focus && !prevProps.focus) {\n this.editor.focus();\n }\n };\n ReactAce.prototype.handleScrollMargins = function (margins) {\n if (margins === void 0) { margins = [0, 0, 0, 0]; }\n this.editor.renderer.setScrollMargin(margins[0], margins[1], margins[2], margins[3]);\n };\n ReactAce.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n ReactAce.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value = this.editor.getValue();\n this.props.onChange(value, event);\n }\n };\n ReactAce.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value = this.editor.getSelection();\n this.props.onSelectionChange(value, event);\n }\n };\n ReactAce.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value = this.editor.getSelection();\n this.props.onCursorChange(value, event);\n }\n };\n ReactAce.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n if (this.props.placeholder) {\n this.updatePlaceholder();\n }\n };\n ReactAce.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event, this.editor);\n }\n };\n ReactAce.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event, this.editor);\n }\n };\n ReactAce.prototype.onCopy = function (_a) {\n var text = _a.text;\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n ReactAce.prototype.onPaste = function (_a) {\n var text = _a.text;\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n ReactAce.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n ReactAce.prototype.handleOptions = function (props) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n // @ts-ignore\n this.editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n ReactAce.prototype.handleMarkers = function (markers) {\n var _this = this;\n // remove foreground markers\n var currentMarkers = this.editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers except active line marker and selected word marker\n currentMarkers = this.editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i) &&\n currentMarkers[i].clazz !== \"ace_active-line\" &&\n currentMarkers[i].clazz !== \"ace_selected-word\") {\n this.editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new ace_builds_1.Range(startRow, startCol, endRow, endCol);\n _this.editor.getSession().addMarker(range, className, type, inFront);\n });\n };\n ReactAce.prototype.updatePlaceholder = function () {\n // Adapted from https://stackoverflow.com/questions/26695708/how-can-i-add-placeholder-text-when-the-editor-is-empty\n var editor = this.editor;\n var placeholder = this.props.placeholder;\n var showPlaceholder = !editor.session.getValue().length;\n var node = editor.renderer.placeholderNode;\n if (!showPlaceholder && node) {\n editor.renderer.scroller.removeChild(editor.renderer.placeholderNode);\n editor.renderer.placeholderNode = null;\n }\n else if (showPlaceholder && !node) {\n node = editor.renderer.placeholderNode = document.createElement(\"div\");\n node.textContent = placeholder || \"\";\n node.className = \"ace_comment ace_placeholder\";\n node.style.padding = \"0 9px\";\n node.style.position = \"absolute\";\n node.style.zIndex = \"3\";\n editor.renderer.scroller.appendChild(node);\n }\n else if (showPlaceholder && node) {\n node.textContent = placeholder;\n }\n };\n ReactAce.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n ReactAce.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n ReactAce.propTypes = {\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n focus: PropTypes.bool,\n theme: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n height: PropTypes.string,\n width: PropTypes.string,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n showGutter: PropTypes.bool,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onPaste: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onBlur: PropTypes.func,\n onScroll: PropTypes.func,\n value: PropTypes.string,\n defaultValue: PropTypes.string,\n onLoad: PropTypes.func,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n onValidate: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n debounceChangePeriod: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableSnippets: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n navigateToFileEnd: PropTypes.bool,\n commands: PropTypes.array,\n placeholder: PropTypes.string\n };\n ReactAce.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n fontSize: 12,\n enableSnippets: false,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n placeholder: null,\n navigateToFileEnd: true\n };\n return ReactAce;\n}(React.Component));\nexports.default = ReactAce;\n//# sourceMappingURL=ace.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar split_1 = require(\"./split\");\nvar DiffMatchPatch = require(\"diff-match-patch\");\nvar DiffComponent = /** @class */ (function (_super) {\n __extends(DiffComponent, _super);\n function DiffComponent(props) {\n var _this = _super.call(this, props) || this;\n _this.state = {\n value: _this.props.value\n };\n _this.onChange = _this.onChange.bind(_this);\n _this.diff = _this.diff.bind(_this);\n return _this;\n }\n DiffComponent.prototype.componentDidUpdate = function () {\n var value = this.props.value;\n if (value !== this.state.value) {\n this.setState({ value: value });\n }\n };\n DiffComponent.prototype.onChange = function (value) {\n this.setState({\n value: value\n });\n if (this.props.onChange) {\n this.props.onChange(value);\n }\n };\n DiffComponent.prototype.diff = function () {\n var dmp = new DiffMatchPatch();\n var lhString = this.state.value[0];\n var rhString = this.state.value[1];\n if (lhString.length === 0 && rhString.length === 0) {\n return [];\n }\n var diff = dmp.diff_main(lhString, rhString);\n dmp.diff_cleanupSemantic(diff);\n var diffedLines = this.generateDiffedLines(diff);\n var codeEditorSettings = this.setCodeMarkers(diffedLines);\n return codeEditorSettings;\n };\n DiffComponent.prototype.generateDiffedLines = function (diff) {\n var C = {\n DIFF_EQUAL: 0,\n DIFF_DELETE: -1,\n DIFF_INSERT: 1\n };\n var diffedLines = {\n left: [],\n right: []\n };\n var cursor = {\n left: 1,\n right: 1\n };\n diff.forEach(function (chunk) {\n var chunkType = chunk[0];\n var text = chunk[1];\n var lines = text.split(\"\\n\").length - 1;\n // diff-match-patch sometimes returns empty strings at random\n if (text.length === 0) {\n return;\n }\n var firstChar = text[0];\n var lastChar = text[text.length - 1];\n var linesToHighlight = 0;\n switch (chunkType) {\n case C.DIFF_EQUAL:\n cursor.left += lines;\n cursor.right += lines;\n break;\n case C.DIFF_DELETE:\n // If the deletion starts with a newline, push the cursor down to that line\n if (firstChar === \"\\n\") {\n cursor.left++;\n lines--;\n }\n linesToHighlight = lines;\n // If the deletion does not include a newline, highlight the same line on the right\n if (linesToHighlight === 0) {\n diffedLines.right.push({\n startLine: cursor.right,\n endLine: cursor.right\n });\n }\n // If the last character is a newline, we don't want to highlight that line\n if (lastChar === \"\\n\") {\n linesToHighlight -= 1;\n }\n diffedLines.left.push({\n startLine: cursor.left,\n endLine: cursor.left + linesToHighlight\n });\n cursor.left += lines;\n break;\n case C.DIFF_INSERT:\n // If the insertion starts with a newline, push the cursor down to that line\n if (firstChar === \"\\n\") {\n cursor.right++;\n lines--;\n }\n linesToHighlight = lines;\n // If the insertion does not include a newline, highlight the same line on the left\n if (linesToHighlight === 0) {\n diffedLines.left.push({\n startLine: cursor.left,\n endLine: cursor.left\n });\n }\n // If the last character is a newline, we don't want to highlight that line\n if (lastChar === \"\\n\") {\n linesToHighlight -= 1;\n }\n diffedLines.right.push({\n startLine: cursor.right,\n endLine: cursor.right + linesToHighlight\n });\n cursor.right += lines;\n break;\n default:\n throw new Error(\"Diff type was not defined.\");\n }\n });\n return diffedLines;\n };\n // Receives a collection of line numbers and iterates through them to highlight appropriately\n // Returns an object that tells the render() method how to display the code editors\n DiffComponent.prototype.setCodeMarkers = function (diffedLines) {\n if (diffedLines === void 0) { diffedLines = { left: [], right: [] }; }\n var codeEditorSettings = [];\n var newMarkerSet = {\n left: [],\n right: []\n };\n for (var i = 0; i < diffedLines.left.length; i++) {\n var markerObj = {\n startRow: diffedLines.left[i].startLine - 1,\n endRow: diffedLines.left[i].endLine,\n type: \"text\",\n className: \"codeMarker\"\n };\n newMarkerSet.left.push(markerObj);\n }\n for (var i = 0; i < diffedLines.right.length; i++) {\n var markerObj = {\n startRow: diffedLines.right[i].startLine - 1,\n endRow: diffedLines.right[i].endLine,\n type: \"text\",\n className: \"codeMarker\"\n };\n newMarkerSet.right.push(markerObj);\n }\n codeEditorSettings[0] = newMarkerSet.left;\n codeEditorSettings[1] = newMarkerSet.right;\n return codeEditorSettings;\n };\n DiffComponent.prototype.render = function () {\n var markers = this.diff();\n return (React.createElement(split_1.default, { name: this.props.name, className: this.props.className, focus: this.props.focus, orientation: this.props.orientation, splits: this.props.splits, mode: this.props.mode, theme: this.props.theme, height: this.props.height, width: this.props.width, fontSize: this.props.fontSize, showGutter: this.props.showGutter, onChange: this.onChange, onPaste: this.props.onPaste, onLoad: this.props.onLoad, onScroll: this.props.onScroll, minLines: this.props.minLines, maxLines: this.props.maxLines, readOnly: this.props.readOnly, highlightActiveLine: this.props.highlightActiveLine, showPrintMargin: this.props.showPrintMargin, tabSize: this.props.tabSize, cursorStart: this.props.cursorStart, editorProps: this.props.editorProps, style: this.props.style, scrollMargin: this.props.scrollMargin, setOptions: this.props.setOptions, wrapEnabled: this.props.wrapEnabled, enableBasicAutocompletion: this.props.enableBasicAutocompletion, enableLiveAutocompletion: this.props.enableLiveAutocompletion, value: this.state.value, markers: markers }));\n };\n DiffComponent.propTypes = {\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n enableBasicAutocompletion: PropTypes.bool,\n enableLiveAutocompletion: PropTypes.bool,\n focus: PropTypes.bool,\n fontSize: PropTypes.number,\n height: PropTypes.string,\n highlightActiveLine: PropTypes.bool,\n maxLines: PropTypes.number,\n minLines: PropTypes.number,\n mode: PropTypes.string,\n name: PropTypes.string,\n className: PropTypes.string,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n onChange: PropTypes.func,\n orientation: PropTypes.string,\n readOnly: PropTypes.bool,\n scrollMargin: PropTypes.array,\n setOptions: PropTypes.object,\n showGutter: PropTypes.bool,\n showPrintMargin: PropTypes.bool,\n splits: PropTypes.number,\n style: PropTypes.object,\n tabSize: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.array,\n width: PropTypes.string,\n wrapEnabled: PropTypes.bool\n };\n DiffComponent.defaultProps = {\n cursorStart: 1,\n editorProps: {},\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false,\n focus: false,\n fontSize: 12,\n height: \"500px\",\n highlightActiveLine: true,\n maxLines: null,\n minLines: null,\n mode: \"\",\n name: \"ace-editor\",\n onLoad: null,\n onScroll: null,\n onPaste: null,\n onChange: null,\n orientation: \"beside\",\n readOnly: false,\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n showGutter: true,\n showPrintMargin: true,\n splits: 2,\n style: {},\n tabSize: 4,\n theme: \"github\",\n value: [\"\", \"\"],\n width: \"500px\",\n wrapEnabled: true\n };\n return DiffComponent;\n}(React.Component));\nexports.default = DiffComponent;\n//# sourceMappingURL=diff.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAceInstance = exports.debounce = exports.editorEvents = exports.editorOptions = void 0;\nvar editorOptions = [\n \"minLines\",\n \"maxLines\",\n \"readOnly\",\n \"highlightActiveLine\",\n \"tabSize\",\n \"enableBasicAutocompletion\",\n \"enableLiveAutocompletion\",\n \"enableSnippets\"\n];\nexports.editorOptions = editorOptions;\nvar editorEvents = [\n \"onChange\",\n \"onFocus\",\n \"onInput\",\n \"onBlur\",\n \"onCopy\",\n \"onPaste\",\n \"onSelectionChange\",\n \"onCursorChange\",\n \"onScroll\",\n \"handleOptions\",\n \"updateRef\"\n];\nexports.editorEvents = editorEvents;\nvar getAceInstance = function () {\n var ace;\n if (typeof window === \"undefined\") {\n // ace-builds just needs some window object to attach ace to.\n // During SSR even just an empty object will work.\n global.window = {};\n ace = require(\"ace-builds\");\n // And it can be discarded immediately afterward to avoid confusing\n // other libraries that might detect SSR the same way we did.\n delete global.window;\n }\n else if (window.ace) {\n // Fallback for ace.require when vanilla ACE is hosted over a CDN\n ace = window.ace;\n ace.acequire = window.ace.require || window.ace.acequire;\n }\n else {\n ace = require(\"ace-builds\");\n }\n return ace;\n};\nexports.getAceInstance = getAceInstance;\nvar debounce = function (fn, delay) {\n var timer = null;\n // tslint:disable-next-line\n return function () {\n var context = this;\n var args = arguments;\n clearTimeout(timer);\n timer = setTimeout(function () {\n fn.apply(context, args);\n }, delay);\n };\n};\nexports.debounce = debounce;\n//# sourceMappingURL=editorOptions.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diff = exports.split = void 0;\nvar ace_1 = require(\"./ace\");\nvar diff_1 = require(\"./diff\");\nexports.diff = diff_1.default;\nvar split_1 = require(\"./split\");\nexports.split = split_1.default;\nexports.default = ace_1.default;\n//# sourceMappingURL=index.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar editorOptions_1 = require(\"./editorOptions\");\nvar ace = (0, editorOptions_1.getAceInstance)();\nvar ace_builds_1 = require(\"ace-builds\");\nvar ext_split_1 = require(\"ace-builds/src-noconflict/ext-split\");\nvar PropTypes = require(\"prop-types\");\nvar React = require(\"react\");\nvar isEqual = require(\"lodash.isequal\");\nvar get = require(\"lodash.get\");\nvar SplitComponent = /** @class */ (function (_super) {\n __extends(SplitComponent, _super);\n function SplitComponent(props) {\n var _this = _super.call(this, props) || this;\n editorOptions_1.editorEvents.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n _this.debounce = editorOptions_1.debounce;\n return _this;\n }\n SplitComponent.prototype.isInShadow = function (node) {\n var parent = node && node.parentNode;\n while (parent) {\n if (parent.toString() === \"[object ShadowRoot]\") {\n return true;\n }\n parent = parent.parentNode;\n }\n return false;\n };\n SplitComponent.prototype.componentDidMount = function () {\n var _this = this;\n var _a = this.props, className = _a.className, onBeforeLoad = _a.onBeforeLoad, mode = _a.mode, focus = _a.focus, theme = _a.theme, fontSize = _a.fontSize, value = _a.value, defaultValue = _a.defaultValue, cursorStart = _a.cursorStart, showGutter = _a.showGutter, wrapEnabled = _a.wrapEnabled, showPrintMargin = _a.showPrintMargin, _b = _a.scrollMargin, scrollMargin = _b === void 0 ? [0, 0, 0, 0] : _b, keyboardHandler = _a.keyboardHandler, onLoad = _a.onLoad, commands = _a.commands, annotations = _a.annotations, markers = _a.markers, splits = _a.splits;\n this.editor = ace.edit(this.refEditor);\n if (this.isInShadow(this.refEditor)) {\n this.editor.renderer.attachToShadowRoot();\n }\n this.editor.setTheme(\"ace/theme/\" + theme);\n if (onBeforeLoad) {\n onBeforeLoad(ace);\n }\n var editorProps = Object.keys(this.props.editorProps);\n var split = new ext_split_1.Split(this.editor.container, \"ace/theme/\" + theme, splits);\n this.editor.env.split = split;\n this.splitEditor = split.getEditor(0);\n this.split = split;\n // in a split scenario we don't want a print margin for the entire application\n this.editor.setShowPrintMargin(false);\n this.editor.renderer.setShowGutter(false);\n // get a list of possible options to avoid 'misspelled option errors'\n var availableOptions = this.splitEditor.$options;\n if (this.props.debounceChangePeriod) {\n this.onChange = this.debounce(this.onChange, this.props.debounceChangePeriod);\n }\n split.forEach(function (editor, index) {\n for (var i = 0; i < editorProps.length; i++) {\n editor[editorProps[i]] = _this.props.editorProps[editorProps[i]];\n }\n var defaultValueForEditor = get(defaultValue, index);\n var valueForEditor = get(value, index, \"\");\n editor.session.setUndoManager(new ace.UndoManager());\n editor.setTheme(\"ace/theme/\" + theme);\n editor.renderer.setScrollMargin(scrollMargin[0], scrollMargin[1], scrollMargin[2], scrollMargin[3]);\n editor.getSession().setMode(\"ace/mode/\" + mode);\n editor.setFontSize(fontSize);\n editor.renderer.setShowGutter(showGutter);\n editor.getSession().setUseWrapMode(wrapEnabled);\n editor.setShowPrintMargin(showPrintMargin);\n editor.on(\"focus\", _this.onFocus);\n editor.on(\"blur\", _this.onBlur);\n editor.on(\"input\", _this.onInput);\n editor.on(\"copy\", _this.onCopy);\n editor.on(\"paste\", _this.onPaste);\n editor.on(\"change\", _this.onChange);\n editor\n .getSession()\n .selection.on(\"changeSelection\", _this.onSelectionChange);\n editor.getSession().selection.on(\"changeCursor\", _this.onCursorChange);\n editor.session.on(\"changeScrollTop\", _this.onScroll);\n editor.setValue(defaultValueForEditor === undefined\n ? valueForEditor\n : defaultValueForEditor, cursorStart);\n var newAnnotations = get(annotations, index, []);\n var newMarkers = get(markers, index, []);\n editor.getSession().setAnnotations(newAnnotations);\n if (newMarkers && newMarkers.length > 0) {\n _this.handleMarkers(newMarkers, editor);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (availableOptions.hasOwnProperty(option)) {\n editor.setOption(option, _this.props[option]);\n }\n else if (_this.props[option]) {\n console.warn(\"ReaceAce: editor option \" + option + \" was activated but not found. Did you need to import a related tool or did you possibly mispell the option?\");\n }\n }\n _this.handleOptions(_this.props, editor);\n if (Array.isArray(commands)) {\n commands.forEach(function (command) {\n if (typeof command.exec === \"string\") {\n editor.commands.bindKey(command.bindKey, command.exec);\n }\n else {\n editor.commands.addCommand(command);\n }\n });\n }\n if (keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + keyboardHandler);\n }\n });\n if (className) {\n this.refEditor.className += \" \" + className;\n }\n if (focus) {\n this.splitEditor.focus();\n }\n var sp = this.editor.env.split;\n sp.setOrientation(this.props.orientation === \"below\" ? sp.BELOW : sp.BESIDE);\n sp.resize(true);\n if (onLoad) {\n onLoad(sp);\n }\n };\n SplitComponent.prototype.componentDidUpdate = function (prevProps) {\n var _this = this;\n var oldProps = prevProps;\n var nextProps = this.props;\n var split = this.editor.env.split;\n if (nextProps.splits !== oldProps.splits) {\n split.setSplits(nextProps.splits);\n }\n if (nextProps.orientation !== oldProps.orientation) {\n split.setOrientation(nextProps.orientation === \"below\" ? split.BELOW : split.BESIDE);\n }\n split.forEach(function (editor, index) {\n if (nextProps.mode !== oldProps.mode) {\n editor.getSession().setMode(\"ace/mode/\" + nextProps.mode);\n }\n if (nextProps.keyboardHandler !== oldProps.keyboardHandler) {\n if (nextProps.keyboardHandler) {\n editor.setKeyboardHandler(\"ace/keyboard/\" + nextProps.keyboardHandler);\n }\n else {\n editor.setKeyboardHandler(null);\n }\n }\n if (nextProps.fontSize !== oldProps.fontSize) {\n editor.setFontSize(nextProps.fontSize);\n }\n if (nextProps.wrapEnabled !== oldProps.wrapEnabled) {\n editor.getSession().setUseWrapMode(nextProps.wrapEnabled);\n }\n if (nextProps.showPrintMargin !== oldProps.showPrintMargin) {\n editor.setShowPrintMargin(nextProps.showPrintMargin);\n }\n if (nextProps.showGutter !== oldProps.showGutter) {\n editor.renderer.setShowGutter(nextProps.showGutter);\n }\n for (var i = 0; i < editorOptions_1.editorOptions.length; i++) {\n var option = editorOptions_1.editorOptions[i];\n if (nextProps[option] !== oldProps[option]) {\n editor.setOption(option, nextProps[option]);\n }\n }\n if (!isEqual(nextProps.setOptions, oldProps.setOptions)) {\n _this.handleOptions(nextProps, editor);\n }\n var nextValue = get(nextProps.value, index, \"\");\n if (editor.getValue() !== nextValue) {\n // editor.setValue is a synchronous function call, change event is emitted before setValue return.\n _this.silent = true;\n var pos = editor.session.selection.toJSON();\n editor.setValue(nextValue, nextProps.cursorStart);\n editor.session.selection.fromJSON(pos);\n _this.silent = false;\n }\n var newAnnotations = get(nextProps.annotations, index, []);\n var oldAnnotations = get(oldProps.annotations, index, []);\n if (!isEqual(newAnnotations, oldAnnotations)) {\n editor.getSession().setAnnotations(newAnnotations);\n }\n var newMarkers = get(nextProps.markers, index, []);\n var oldMarkers = get(oldProps.markers, index, []);\n if (!isEqual(newMarkers, oldMarkers) && Array.isArray(newMarkers)) {\n _this.handleMarkers(newMarkers, editor);\n }\n });\n if (nextProps.className !== oldProps.className) {\n var appliedClasses = this.refEditor.className;\n var appliedClassesArray_1 = appliedClasses.trim().split(\" \");\n var oldClassesArray = oldProps.className.trim().split(\" \");\n oldClassesArray.forEach(function (oldClass) {\n var index = appliedClassesArray_1.indexOf(oldClass);\n appliedClassesArray_1.splice(index, 1);\n });\n this.refEditor.className =\n \" \" + nextProps.className + \" \" + appliedClassesArray_1.join(\" \");\n }\n if (nextProps.theme !== oldProps.theme) {\n split.setTheme(\"ace/theme/\" + nextProps.theme);\n }\n if (nextProps.focus && !oldProps.focus) {\n this.splitEditor.focus();\n }\n if (nextProps.height !== this.props.height ||\n nextProps.width !== this.props.width) {\n this.editor.resize();\n }\n };\n SplitComponent.prototype.componentWillUnmount = function () {\n this.editor.destroy();\n this.editor = null;\n };\n SplitComponent.prototype.onChange = function (event) {\n if (this.props.onChange && !this.silent) {\n var value_1 = [];\n this.editor.env.split.forEach(function (editor) {\n value_1.push(editor.getValue());\n });\n this.props.onChange(value_1, event);\n }\n };\n SplitComponent.prototype.onSelectionChange = function (event) {\n if (this.props.onSelectionChange) {\n var value_2 = [];\n this.editor.env.split.forEach(function (editor) {\n value_2.push(editor.getSelection());\n });\n this.props.onSelectionChange(value_2, event);\n }\n };\n SplitComponent.prototype.onCursorChange = function (event) {\n if (this.props.onCursorChange) {\n var value_3 = [];\n this.editor.env.split.forEach(function (editor) {\n value_3.push(editor.getSelection());\n });\n this.props.onCursorChange(value_3, event);\n }\n };\n SplitComponent.prototype.onFocus = function (event) {\n if (this.props.onFocus) {\n this.props.onFocus(event);\n }\n };\n SplitComponent.prototype.onInput = function (event) {\n if (this.props.onInput) {\n this.props.onInput(event);\n }\n };\n SplitComponent.prototype.onBlur = function (event) {\n if (this.props.onBlur) {\n this.props.onBlur(event);\n }\n };\n SplitComponent.prototype.onCopy = function (text) {\n if (this.props.onCopy) {\n this.props.onCopy(text);\n }\n };\n SplitComponent.prototype.onPaste = function (text) {\n if (this.props.onPaste) {\n this.props.onPaste(text);\n }\n };\n SplitComponent.prototype.onScroll = function () {\n if (this.props.onScroll) {\n this.props.onScroll(this.editor);\n }\n };\n SplitComponent.prototype.handleOptions = function (props, editor) {\n var setOptions = Object.keys(props.setOptions);\n for (var y = 0; y < setOptions.length; y++) {\n editor.setOption(setOptions[y], props.setOptions[setOptions[y]]);\n }\n };\n SplitComponent.prototype.handleMarkers = function (markers, editor) {\n // remove foreground markers\n var currentMarkers = editor.getSession().getMarkers(true);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // remove background markers\n currentMarkers = editor.getSession().getMarkers(false);\n for (var i in currentMarkers) {\n if (currentMarkers.hasOwnProperty(i)) {\n editor.getSession().removeMarker(currentMarkers[i].id);\n }\n }\n // add new markers\n markers.forEach(function (_a) {\n var startRow = _a.startRow, startCol = _a.startCol, endRow = _a.endRow, endCol = _a.endCol, className = _a.className, type = _a.type, _b = _a.inFront, inFront = _b === void 0 ? false : _b;\n var range = new ace_builds_1.Range(startRow, startCol, endRow, endCol);\n editor\n .getSession()\n .addMarker(range, className, type, inFront);\n });\n };\n SplitComponent.prototype.updateRef = function (item) {\n this.refEditor = item;\n };\n SplitComponent.prototype.render = function () {\n var _a = this.props, name = _a.name, width = _a.width, height = _a.height, style = _a.style;\n var divStyle = __assign({ width: width, height: height }, style);\n return React.createElement(\"div\", { ref: this.updateRef, id: name, style: divStyle });\n };\n SplitComponent.propTypes = {\n className: PropTypes.string,\n debounceChangePeriod: PropTypes.number,\n defaultValue: PropTypes.arrayOf(PropTypes.string),\n focus: PropTypes.bool,\n fontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n height: PropTypes.string,\n mode: PropTypes.string,\n name: PropTypes.string,\n onBlur: PropTypes.func,\n onChange: PropTypes.func,\n onCopy: PropTypes.func,\n onFocus: PropTypes.func,\n onInput: PropTypes.func,\n onLoad: PropTypes.func,\n onPaste: PropTypes.func,\n onScroll: PropTypes.func,\n orientation: PropTypes.string,\n showGutter: PropTypes.bool,\n splits: PropTypes.number,\n theme: PropTypes.string,\n value: PropTypes.arrayOf(PropTypes.string),\n width: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onCursorChange: PropTypes.func,\n onBeforeLoad: PropTypes.func,\n minLines: PropTypes.number,\n maxLines: PropTypes.number,\n readOnly: PropTypes.bool,\n highlightActiveLine: PropTypes.bool,\n tabSize: PropTypes.number,\n showPrintMargin: PropTypes.bool,\n cursorStart: PropTypes.number,\n editorProps: PropTypes.object,\n setOptions: PropTypes.object,\n style: PropTypes.object,\n scrollMargin: PropTypes.array,\n annotations: PropTypes.array,\n markers: PropTypes.array,\n keyboardHandler: PropTypes.string,\n wrapEnabled: PropTypes.bool,\n enableBasicAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n enableLiveAutocompletion: PropTypes.oneOfType([\n PropTypes.bool,\n PropTypes.array\n ]),\n commands: PropTypes.array\n };\n SplitComponent.defaultProps = {\n name: \"ace-editor\",\n focus: false,\n orientation: \"beside\",\n splits: 2,\n mode: \"\",\n theme: \"\",\n height: \"500px\",\n width: \"500px\",\n value: [],\n fontSize: 12,\n showGutter: true,\n onChange: null,\n onPaste: null,\n onLoad: null,\n onScroll: null,\n minLines: null,\n maxLines: null,\n readOnly: false,\n highlightActiveLine: true,\n showPrintMargin: true,\n tabSize: 4,\n cursorStart: 1,\n editorProps: {},\n style: {},\n scrollMargin: [0, 0, 0, 0],\n setOptions: {},\n wrapEnabled: false,\n enableBasicAutocompletion: false,\n enableLiveAutocompletion: false\n };\n return SplitComponent;\n}(React.Component));\nexports.default = SplitComponent;\n//# sourceMappingURL=split.js.map"],"names":["global","this","window","define","module","deps","payload","arguments","length","modules","payloads","original","apply","console","error","trace","root","_require","parentId","callback","lookup","undefined","Object","prototype","toString","call","params","i","l","dep","require","push","packagedModule","normalizeModule","moduleName","indexOf","chunks","split","charAt","slice","join","previous","replace","exports","mod","id","uri","packaged","ace","Element","remove","defineProperty","enumerable","writable","configurable","value","parentNode","removeChild","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","_navigator","navigator","os","exec","platform","toLowerCase","ua","userAgent","appName","isWin","isIE","parseFloat","match","isOldIE","isGecko","isMozilla","isOpera","opera","isWebKit","isChrome","isEdge","isAIR","isAndroid","isChromeOS","isIOS","test","MSStream","isMobile","strictCSP","useragent","buildDom","arr","parent","refs","txt","document","createTextNode","appendChild","Array","isArray","els","ch","el","createElement","options","childIndex","keys","forEach","n","val","className","style","cssText","setAttribute","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","ns","createElementNS","removeChildren","element","innerHTML","textContent","ownerDocument","createFragment","createDocumentFragment","hasCssClass","name","addCssClass","removeCssClass","classes","index","splice","toggleCssClass","add","setCssClass","node","include","hasCssString","sheets","querySelectorAll","cssCache","insertPendingStyles","cache","item","importCssString","target","container","getRootNode","insertBefore","firstChild","useStrictCSP","importCssStylsheet","rel","href","scrollbarWidth","inner","width","minWidth","height","display","outer","position","left","overflow","body","noScrollbar","offsetWidth","withScrollbar","clientWidth","computedStyle","getComputedStyle","setStyle","styles","property","HAS_CSS_ANIMATION","HAS_CSS_TRANSFORMS","HI_DPI","devicePixelRatio","div","transform","animationName","translate","tx","ty","Math","round","top","inherits","ctor","superCtor","super_","create","constructor","mixin","obj","key","implement","proto","oop","Keys","ret","MODIFIER_KEYS","KEY_MODS","FUNCTION_KEYS","PRINTABLE_KEYS","parseInt","enter","escape","esc","del","mods","pow","filter","x","keyCodeToString","keyCode","keyString","String","fromCharCode","activeListenerOptions","pressedKeys","ts","getListenerOptions","createComment","addEventListener","passive","e","detectListenerOptionsSupport","EventListener","elem","type","destroy","removeListener","addListener","destroyer","$toDestroy","removeEventListener","stopEvent","stopPropagation","preventDefault","getButton","ctrlKey","altKey","shiftKey","button","capture","eventHandler","releaseCaptureHandler","onMouseUp","addMouseWheelListener","wheelDeltaX","wheelX","wheelY","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","elements","timeouts","callbackName","startX","startY","timer","clicks","eventNames","onMousedown","isNewClick","abs","clientX","clientY","clearTimeout","setTimeout","_clicks","getModifierHash","metaKey","normalizeCommandKeys","hashId","getModifierState","altGr","location","keyLocation","timeStamp","defaultPrevented","resetPressedKeys","getModifierString","addCommandKeyListener","isOldGecko","lastKeyDownKeyCode","lastDefaultPrevented","result","postMessage","postMessageId","nextTick","win","messageName","listener","data","$idleBlocked","onIdle","cb","timeout","handler","$idleBlockId","blockIdle","delay","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","bind","Range","startRow","startColumn","endRow","endColumn","start","row","column","end","isEqual","range","contains","compare","compareRange","cmp","comparePoint","p","containsRange","intersects","isEnd","isStart","setStart","setEnd","inside","insideStart","insideEnd","isMultiLine","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","extend","isEmpty","clone","collapseRows","max","toScreenRange","session","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","comparePoints","p1","p2","last","a","stringReverse","string","reverse","stringRepeat","count","trimBeginRegexp","trimEndRegexp","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","array","deepCopy","arrayToMap","map","createMap","props","arrayRemove","escapeRegExp","str","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","$cancelT","lineMode","pasteCancelled","Date","now","event","dom","lang","clipboard","BROKEN_SETDATA","USE_IE_MIME_TYPE","HAS_FOCUS_ARGS","MAX_LINE_LENGTH","KEYS","MODS","valueResetRegex","TextInput","host","text","opacity","copied","pasted","inComposition","sendingText","tempStyle","fontSize","commandMode","ignoreFocusEvents","lastValue","lastSelectionStart","lastSelectionEnd","lastRestoreEnd","isFocused","activeElement","onBlur","hasFocus","onFocus","resetSelection","$focusScroll","focus","preventScroll","isTransformed","getBoundingClientRect","ancestors","t","parentElement","nodeType","removeAttribute","blur","on","curOp","commandName","command","isUserAction","docChanged","selectionChanged","onCompositionEnd","newValue","selectionEnd","selection","setSelectionRange","afterContextMenu","selectionStart","line","getRange","cursor","getLine","prevLine","nextLine","inputHandler","setInputHandler","getInputHandler","sendText","fromInput","onPaste","extendLeft","extendRight","inserted","restoreStart","restoreEnd","endIndex","shouldReset","onTextInput","onInput","onCompositionUpdate","inputType","execCommand","handleClipboardData","forceIEMime","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","select","onCommandKey","isAllSelected","selectAll","$readOnly","cancelComposition","useTextareaForIME","markerRange","context","compositionStartOffset","off","closeTimeout","syncComposition","onContextMenuClose","renderer","$isMousePressed","$keepTextAreaAtCursor","$moveTextAreaToCursor","onCompositionStart","_signal","getSelectionRange","msGetInputContext","getInputContext","getElement","setCommandMode","readOnly","setReadOnly","setCopyWithEmptySelection","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","characterWidth","rect","borderTopWidth","borderLeftWidth","maxTop","bottom","clientHeight","move","min","textInput","scroller","typingResetTimeout","typing","detectArrowKeys","$mouseHandler","isMousePressed","modifier","up","home","option","down","right","shift","commands","findKeyCommand","addIosSelectionHandler","$setUserAgentForTests","_isMobile","_isIOS","DefaultHandlers","mouseHandler","$clickSelection","editor","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","selectByLines","extendSelectionBy","selectByWords","calcRangeOrientation","anchor","ev","inSelection","pos","getDocumentPosition","mousedownEvent","moveToPosition","time","$focusTimeout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","ax","ay","bx","by","distance","sqrt","getBracketRange","getWordRange","getLineRange","getAccelKey","$lastScroll","vx","vy","allowed","prevScroll","dt","direction","canScroll","isScrollableBy","speed","scrollBy","stop","Tooltip","isOpen","$element","$parentNode","$init","setText","setHtml","html","setPosition","setClassName","show","hide","getHeight","offsetHeight","getWidth","GutterTooltip","windowWidth","innerWidth","windowHeight","innerHeight","GutterHandler","tooltipTimeout","mouseEvent","tooltipAnnotation","gutter","$gutterLayer","tooltip","hideTooltip","moveTooltip","getRegion","selectTo","srcElement","$tooltipFollowsMouse","annotation","$annotations","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","showTooltip","$gutter","MouseEvent","$inSelection","propagationStopped","selectionRange","DragdropHandler","dragImage","dragSelectionMarker","timerId","dragCursor","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","mouseTarget","counter","onDragInterval","prevCursor","vMovement","hMovement","moveCursorToPosition","calcDistance","lineHeight","layerConfig","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","autoScroll","addDragMarker","toOrientedRange","addMarker","getSelectionStyle","clearSelection","$cursorLayer","setBlinking","clearInterval","setInterval","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","$resetCursorStyle","onDragStart","cancelDrag","draggable","self","dataTransfer","effectAllowed","getReadOnly","setDragImage","clearData","getTextRange","onDragEnd","dropEffect","setCursorStyle","onDragEnter","canAccept","getDropEffect","onDragOver","onMouseMoveTimer","onDragLeave","onDrop","moveText","dropData","insert","types","some","copyAllowed","copyModifierState","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","state","dragDrop","$dragEnabled","eventTarget","unselectable","addTouchListeners","touchStartT","lastT","longTouchTimer","animationTimer","pressed","contextMenu","mode","animationSteps","clickCount","vX","vY","showContextMenu","handleClick","selected","hasUndo","action","getAttribute","getUndoManager","replaceChild","class","readText","then","writeText","ontouchstart","ontouchend","onclick","pagePos","textToScreenCoordinates","leftOffset","pageX","scrollLeft","pageY","hideContextMenu","handleLongTap","selectWord","touches","h","w","touchObj","setRange","switchToSelectionMode","cursorPos","getPixelPosition","anchorPos","offsetTop","offsetLeft","weightedDistance","diff1","diff2","oldScrollTop","getScrollTop","get","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","path","s","src","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","once","newCallback","Promise","resolve","handlers","_disabled_","old","disabled","removeDefaultHandler","pop","capturing","removeAllListeners","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","hidden","getOption","opt","warn","forwardTo","handlesSet","set","message","reportError","msg","Error","AppConfig","$defaultOptions","defineOptions","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","loadWorkerFromBlob","sharedPopups","hasOwnProperty","all","$modes","moduleUrl","component","parts","sep","base","re","RegExp","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","reportErrorIfPathIsNotConfigured","init","scriptOptions","scriptUrl","currentScript","_currentScript","scripts","script","attributes","j","attr","m","m1","toUpperCase","version","DefaultGutterHandler","config","MouseHandler","focusEditor","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","Boolean","gutterEl","$dragDelay","character","mousemove","$scrollSpeed","mouseMoveHandler","which","releaseMouse","$mouseMoved","onCaptureEnd","onOperationEnd","onCaptureInterval","$onCaptureMouseMove","endOperation","startOperation","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimeout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","getUseWrapMode","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","args","passEvent","dir","hiLevel","lastArabic","hasUBAT_B","hasUBAT_S","impTab_LTR","impTab_RTL","ET","BN","UnicodeTBL00","UnicodeTBL20","_invertLevel","lev","levels","_array","lo","hi","tmp","len","_getCharClass","chars","ix","wType","nType","cType","c","rtlCandidate","_getCharacterType","uc","charCodeAt","L","R","EN","ON_R","AN","R_H","B","RLE","DOT","doBidiReorder","textCharTypes","isRtl","logicalFromVisual","bidiLevels","charTypes","impTab","prevState","newClass","newLevel","newState","condPos","_computeLevels","hasBidiCharacters","getVisualFromLogicalIdx","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","bidiMap","currentRow","charWidths","EOL","showInvisibles","isRtlDir","$isRtl","wrapIndent","EOF","contentWidth","fontMetrics","rtlLineOffset","wrapOffset","isMoveLeftOperation","seenBidi","getValue","isBidiRow","docRow","splitIndex","updateRowLine","updateBidiMap","onChange","delta","lines","getDocumentRow","rowCache","$screenRowCache","$getRowCacheIndex","$docRowCache","getSplitIndex","currentIndex","prevIndex","endOfLine","$useWrapMode","splits","$wrapData","indent","substring","size","isFullWidth","getScreenTabSize","$main","substr","markAsDirty","updateCharacterWidths","$characterSize","bidiCharWidth","$measureCharWidth","setShowInvisibles","setEolChar","eolChar","setContentWidth","isRtlLine","setRtlDirection","getCursorPosition","getSelectionAnchor","$bidiHandler","removeInLine","getPosLeft","col","leftBoundary","logicalIdx","getOverwrite","visualIdx","getSelections","startCol","endCol","level","selections","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","offsetToCol","posX","charWidth","Selection","getDocument","lead","createAnchor","$silent","$cursorChanged","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","$anchorChanged","getCursor","getPosition","getAnchor","getSelectionLead","isBackwards","$setSelection","Number","MAX_VALUE","anchorRow","anchorColumn","cursorRow","cursorColumn","wasEmpty","wasMultiselect","$moveSelection","mover","moveCursorTo","moveTo","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","wouldMoveIntoSoftTab","tabSize","isTabStop","getTabSize","getNavigateWithinSoftTabs","firstColumnPosition","screenToDocumentPosition","leadingSpace","getDisplayLine","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","search","moveCursorLongWordRight","rightOfCursor","nonTokenRe","lastIndex","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","offsetX","screenPos","lineWidgets","widget","rowsAbove","rowCount","docPos","keepDesiredColumn","moveCursorToScreen","desiredColumn","r","getRangeOfMovements","func","toJSON","rangeCount","ranges","r1","fromJSON","rangeList","toSingleRange","addRange","MAX_TOKEN_COUNT","Tokenizer","rules","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","regex","adjustedregex","matchcount","token","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","values","tokens","stack","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","next","consumeLineEnd","merge","unshift","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","append","$embeds","getEmbeds","pushState","popState","normalizeRules","processState","processed","toInsert","stateName","includeName","concat","noEscape","keywordMap","createKeywordMapper","ignoreCase","splitChar","keywords","$keywordList","list","word","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","getBehaviours","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","getCurrentTokenPosition","getCurrentTokenRange","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","defaultQuotes","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","opening","closing","rowDiff","CstyleBehaviour","getWrapBehavioursEnabled","isSaneInsertion","braces","recordAutoInsert","recordMaybeInsert","$findOpeningBracket","isAutoInsertedClosing","popAutoInsertedClosing","isMaybeInsertedClosing","clearMaybeInsertedClosing","openBracePos","findMatchingBracket","next_indent","$getIndent","getTabString","quotes","$mode","$quotes","lineCommentStart","quote","leftChar","rightChar","rightToken","pair","stringBefore","stringAfter","wordRe","isWordBefore","isWordAfter","charBefore","iterator","$matchTokenType","iterator2","bracket","wordChars","code","unicode","Mode","$defaultBehaviour","getTokenizer","$tokenizer","$highlightRules","$highlightRuleConfig","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","iter","fun","minEmptyLength","floor","toggleBlockComment","colDiff","initialRange","startRange","endRange","getNextLineIndent","tab","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","$id","delegations","scope","functionName","$delegator","method","language","transformAction","param","$behaviour","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","score","meta","applyDelta","docLines","doNotValidate","Anchor","$onChange","$pointsInOrder","point1","point2","equalPointsInOrder","bColIsAfter","$clipPositionToDocument","$insertRight","point","moveIfEqual","deltaIsInsert","deltaRowShift","deltaColShift","deltaStart","deltaEnd","$getTransformedPoint","noClip","Document","textOrLines","$lines","insertMergedLines","setValue","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","getLinesForRange","insertLines","insertFullLines","removeLines","removeFullLines","insertNewLine","clippedPos","clonePos","$clipPosition","deleteFirstNewLine","deleteLastNewLine","deletedLines","removeNewLine","applyDeltas","deltas","revertDeltas","revertDelta","isInsert","$splitAndapplyLargeDelta","$safeApplyDelta","docLength","MAX","from","to","chunk","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","endLine","startLine","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","first","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","update","markerLayer","drawSingleLineMarker","FoldLine","foldData","folds","setFoldLine","shiftRow","sameRow","sort","b","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","log","foldBefore","newFoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","$bias","pointIndex","excludeEdges","startIndex","addList","removed","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","lineDif","Fold","subFolds","consumePoint","restorePoint","subFold","collapseChildren","addSubFold","afterStart","firstConsumed","consumedFolds","k","restoreRange","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","trim","lastFold","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","outermostFolds","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","getCommentFoldRange","depth","getFoldWidget","getFoldWidgetRange","foldToLevel","foldAllComments","$foldStyles","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","$tokenizerUpdateFoldWidgets","updateFoldWidgets","tokenizerUpdateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","getMatchingBracketRanges","$brackets","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","$uid","onChangeFold","setMode","bgTokenizer","resetCaches","$resetRowCache","cacheArray","low","mid","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","$undoManager","mergeUndoDeltas","$informUndoManager","setUndoManager","reset","getSelection","undoManager","addSession","$syncInformUndoManager","markUndoGroup","$defaultUndoManager","undo","redo","hasRedo","addSelection","startNewGroup","setUseSoftTabs","$useSoftTabs","$indentWithTabs","setTabSize","$tabSize","setNavigateWithinSoftTabs","navigateWithinSoftTabs","$navigateWithinSoftTabs","$overwrite","setOverwrite","overwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","oldMode","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","scrollTop","isNaN","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","selectionBefore","$getUndoSelection","redoChanges","selectionAfter","setUndoSelect","enable","isUndo","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","$moveLines","diff","$clipRowToDocument","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","displayLength","lastSplit","lastDocSplit","isCode","$wrapAsCode","indentedSoftWrap","$indentedSoftWrap","maxIndent","addSplit","indentation","getWrapIndent","minSplit","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getRowWrapIndent","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","doCache","maxRow","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","$enableVarChar","getCharacterWidth","wrap","$wrap","firstLineNumber","useSoftTabs","foldStyle","Search","find","$matchIterator","sr","sc","er","ec","skipCurrent","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","$disableFakeMultiline","wholeWord","wordBoundary","addWordBoundary","caseSensitive","$assembleMultilineRegExp","backwards","forEachInLine","HashHandler","commandKeyBinding","addCommands","$singleCommand","MultiHashHandler","bindKey","isDefault","addCommand","removeCommand","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","keyPart","chain","binding","parseKeys","_addCommandToBinding","removeCommands","bindKeys","keyList","$keyChain","CommandManager","byName","$checkCommandState","isAvailable","returnValue","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","description","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","gotoLine","prompt","$type","multiSelectAction","getAllRanges","findNext","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","$copyWithEmptySelection","$handlePaste","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","autoIndent","firstLineEndCol","selectedCount","insertLine","curLine","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","textarea","keyBinding","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","$opResetTimer","$lastSel","prevOp","commandEvent","previousCommand","scrollSelectionIntoView","animateScrolling","sel","$mergeableCommands","$mergeUndoDeltas","prev","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","getSession","resize","onResize","setTheme","theme","getTheme","getFontSize","setFontSize","$highlightBrackets","$highlightPending","$bracketHighlight","markerIds","getMatching","markerType","$highlightTags","$highlightTagPending","$tagHighlight","currentTag","prevToken","stepCount","tmpToken","sbm","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","$updateHighlightActiveLine","updateLines","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$selectionColorConflict","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","wordWithBoundary","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","nl","copyLine","inVirtualSelectionMode","isFullLine","getBehavioursEnabled","d","lineState","shouldOutdent","$enableAutoIndent","lineIndent","selectedRange","currIndent","prevLineState","composition","applyComposition","forEachSelection","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","getShowInvisibles","setDisplayIndentGuides","getDisplayIndentGuides","setShowPrintMargin","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","toggleWord","$toggleWordPairs","currWordStart","wordParts","curLength","itLength","that","reg","wordPairs","negate","firstCondition","res","endPoint","moved","totalDiff","rangeIndex","subRows","compositionState","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","animate","alignCursor","getCursorPositionScreen","expand","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","searchBox","$pixelPos","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","copyWithEmptySelection","behavioursEnabled","wrapBehavioursEnabled","enableAutoIndent","autoScrollEditorIntoView","showLineNumbers","setShowLineNumbers","$loop","CHANGE_GUTTER","$relativeLineNumbers","relativeNumberRenderer","relativeLineNumbers","$showLineNumbers","$updatePlaceholder","$composition","placeholderNode","$placeholder","content","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","displayIndentGuides","showGutter","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","hasCssTransforms","maxPixelHeight","getText","lastLineNumber","$renderer","UndoManager","$maxRev","allowMerge","$lastDelta","$keepRedoStack","$redoStack","lastDeltas","$undoStack","$rev","rev","markIgnored","ignore","getRevision","getDeltas","getChangedRanges","getChangedLines","deltaSet","swapped","swapGroups","rearrangeUndoStack","$redoStackBaseRev","undoSelectionRange","$syncRev","redoStack","deltaSets","moveDeltasByOne","rebaseRedoStack","redoSelectionRange","nextDelta","mark","canUndo","canRedo","bookmark","isAtBookmark","isClean","markClean","$prettyPrint","stringifyDelta","stringifyRange","d1","d2","i1","i2","ds1","ds2","xform","c1","splitDelta","shiftPos","rowsBefore","otherLines","cloneDelta","xformed","Lines","canvasHeight","cells","cellCache","$offsetCoefficient","moveContainer","firstRowScreen","pageChanged","oldConfig","newConfig","computeLineTop","screenTop","screenPage","computeLineHeight","$cacheCell","cell","fragment","insertAdjacentElement","createCell","initElement","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","onCreateCell","textNode","foldWidget","rowInfo","annoText","gutterOffset","oldLastRow","$updateCursorRow","$renderCell","$updateGutterWidth","gutterRenderer","$firstLineNumber","lastLineText","$fixedWidth","padding","$padding","$computePadding","ceil","$highlightGutterLine","$cursorRow","updateLineHighlight","$cursorCell","scrollLines","$renderLines","childNodes","breakpoints","decorations","foldHeight","getShowLineNumbers","paddingLeft","borderRightWidth","paddingRight","Marker","setPadding","setMarkers","markers","elt","css","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","childElementCount","lastChild","stringBuilder","extraStyle","curr","lineRange","range1","drawBidiSingleLineMarker","radiusClass","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","margin","getLineHeight","$fontMetrics","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","showSpaces","showTabs","showEOL","$tabStrings","tabStr","span","$indentGuideRe","spaceClass","spaceContent","tabClass","tabContent","lineElements","lineElementsIdx","heightChanged","lineElement","$renderLine","$renderLinesFragment","lineEl","$useLineGroups","$textToken","$renderToken","valueFragment","simpleSpace","controlCharacter","cjkSpace","cjk","cloneNode","com","renderIndentGuide","cols","$createLineElement","$renderWrappedLine","splitChars","$renderOverflowMessage","$renderSimpleLine","overflowEl","$getFoldLineTokens","lastLineEl","invisibleEl","renderTokens","addTokens","Cursor","isVisible","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateOpacity","$startCssAnimation","animationDuration","$isAnimating","$stopCssAnimation","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","$isSmoothBlinking","blink","onScreen","isCursorInView","pixelPos","maxHeight","$selectionMarkers","cursorIndex","drawCursor","$setOverwrite","MAX_SCROLL_H","ScrollBar","classSuffix","setVisible","skipEvent","onScroll","coeff","VScrollBar","scrollHeight","$scrollbarWidth","$minWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","$recursionLimit","_flush","change","clear","CHAR_COUNT","USE_OBSERVER","ResizeObserver","FontMetrics","$setMeasureNodeStyles","$measureNode","$addObserver","isRoot","visibility","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","$observer","observe","setPolling","disconnect","$getZoom","getZoom","zoom","$initTransformMeasureNodes","transformCoordinates","clientPos","elPos","solve","l1","l2","det","sub","mul","m2","ut","u","f","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","HIDE_TEXTAREA","VirtualRenderer","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","minHeight","v","$renderChanges","defaultView","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$printMarginEl","containerEl","posTop","posLeft","setScrollMargin","sm","setMargin","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","$vScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","freeze","unfreeze","st","$updateLines","$autosize","desiredHeight","$maxPixelHeight","$gutterWidth","hideScrollbars","longestLine","$getLongestLine","horizScroll","hScrollChanged","vScrollBefore","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","x_min","steps","initialScroll","oldSteps","$timer","scrollTo","canvasPos","$hasCssTransforms","$blockCursor","$useTextareaForIME","addToken","removeExtraToken","newToken","$themeId","cssClass","$theme","isDark","setMouseCursor","attachToShadowRoot","workerUrl","Worker","blob","Blob","blobBuilder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","getBlob","$workerBlob","blobURL","URL","webkitURL","createObjectURL","WorkerClient","worker","$createWorkerFromOldConfig","$sendDeltaQueue","changeListener","onMessage","callbackId","callbacks","onmessage","topLevelNamespaces","classname","importScripts","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","err","deltaQueue","$doc","cmd","emit","ex","attachToDocument","q","UIWorkerClient","main","emitSync","sender","messageBuffer","workerClient","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","other","showOtherMarkers","othersActive","hideOtherMarkers","updateAnchors","lengthDiff","inMainRange","distanceFromStart","newPos","otherPos","updateMarkers","updateMarker","undosRequired","isSamePoint","alt","ctrl","accel","selectionMode","isMultiSelect","mouseX","mouseY","screenAnchor","screenCursor","$enableJumpToDef","$blockSelectEnabled","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","blockSelect","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","onSelectionInterval","selectMoreLines","selectMore","joinSelections","splitIntoLines","alignCursors","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","docEnd","yBackwards","MultiSelect","$multiselectOnSessionChange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","altCursor","altDown","addAltCursorListeners","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","keepOrder","$byLines","cmdResult","anim","buf","additive","skip","screenLead","toRemove","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","startW","textW","endW","isLeftAligned","isRightAligned","alignLeft","enableMultiselect","enableBlockSelect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","LineWidgets","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","updateOnFold","_inDocument","removeLineWidget","$updateRows","noWidgets","$oldWidget","$registerLineWidget","addLineWidget","zIndex","coverGutter","pixelHeight","$fold","onWidgetChanged","w1","getWidgetsAtRow","changedWidgets","fixedWidth","coverLine","fullWidth","oldWidget","gutterAnno","comparator","binarySearch","matched","findAnnotations","arrow","onmousedown","Renderer","edit","_id","getElementById","env","tagName","oldNode","createEditSession","Split","BELOW","BESIDE","$container","$splits","$editorCSS","$editors","$orientation","setSplits","$cEditor","$createEditor","$fontSize","getSplits","getEditor","getCurrentEditor","keybinding","$cloneSession","isUsed","getOrientation","setOrientation","orientation","editorWidth","editorHeight","DocCommentHighlightRules","getTagRule","getStartRule","getEndRule","identifierRe","JavaScriptHighlightRules","keywordMapper","escapedRe","comments","noES6","no_regex","jsx","JSX","tagRegex","jsxTag","jsxJsRule","jsxAttributes","reference","MatchingBraceOutdent","BaseFoldMode","commentRegex","source","singleLineBlockCommentRe","tripleStarBlockCommentRe","startRegionRe","_getFoldWidgetBase","forceMultiline","getCommentRegionBlock","getSectionRange","startIndent","subRange","CStyleFoldMode","$outdent","tokenizedLine","endState","results","snippetFileId","JavaHighlightRules","importRegex","getCStyleFoldWidget","getCstyleFoldWidgetRange","JavaScriptMode","JavaFoldMode","diff_match_patch","Diff_Timeout","Diff_EditCost","Match_Threshold","Match_Distance","Patch_DeleteThreshold","Patch_Margin","Match_MaxBits","DIFF_DELETE","Diff","op","diff_main","text1","text2","opt_checklines","opt_deadline","getTime","deadline","checklines","commonlength","diff_commonPrefix","commonprefix","diff_commonSuffix","commonsuffix","diffs","diff_compute_","diff_cleanupMerge","longtext","shorttext","hm","diff_halfMatch_","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","diff_lineMode_","diff_bisect_","diff_linesToChars_","chars1","chars2","linearray","lineArray","diff_charsToLines_","diff_cleanupSemantic","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","front","k1start","k1end","k2start","k2end","k1","k1_offset","y1","x1","k2_offset","x2","diff_bisectSplit_","k2","y2","text1a","text2a","text1b","text2b","diffsb","lineHash","diff_linesToCharsMunge_","lineStart","lineArrayLength","pointermin","pointermax","pointermid","pointerstart","pointerend","diff_commonOverlap_","text_length","best","pattern","dmp","diff_halfMatchI_","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","seed","best_common","prefixLength","suffixLength","hm1","hm2","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","diff_cleanupSemanticLossless","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumericRegex_","nonAlphaNumeric2","whitespace1","whitespaceRegex_","whitespace2","lineBreak1","linebreakRegex_","lineBreak2","blankLine1","blanklineEndRegex_","blankLine2","blanklineStartRegex_","equality1","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","diff_cleanupEfficiency","pre_ins","pre_del","post_ins","post_del","diff_xIndex","loc","last_chars1","last_chars2","diff_prettyHtml","pattern_amp","pattern_lt","pattern_gt","pattern_para","diff_text1","diff_text2","diff_levenshtein","levenshtein","insertions","deletions","diff_toDelta","encodeURI","diff_fromDelta","diffsLength","decodeURI","match_main","match_bitap_","match_alphabet_","match_bitapScore_","accuracy","proximity","score_threshold","best_loc","lastIndexOf","bin_min","bin_mid","matchmask","last_rd","bin_max","finish","rd","charMatch","patch_addContext_","patch","start2","length1","start1","length2","patch_make","opt_b","opt_c","patches","patch_obj","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patch_deepCopy","patchesCopy","patchCopy","patch_apply","nullPadding","patch_addPadding","patch_splitMax","start_loc","expected_loc","end_loc","index2","index1","paddingLength","patch_size","bigpatch","precontext","empty","postcontext","patch_toText","patch_fromText","textline","textPointer","patchHeader","sign","uid","HASH_UNDEFINED","reIsDeepProp","reIsPlainProp","reLeadingDot","rePropName","reEscapeChar","reIsHostCtor","freeGlobal","g","freeSelf","Function","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","IE_PROTO","funcToString","objectToString","reIsNative","Symbol","Map","getNative","nativeCreate","symbolProto","symbolToString","Hash","entries","entry","ListCache","MapCache","assocIndexOf","getMapData","__data__","object","isObject","isFunction","isHostObject","toSource","baseIsNative","has","stringToPath","memoize","isSymbol","baseToString","number","toKey","resolver","TypeError","memoized","Cache","isObjectLike","defaultValue","isKey","baseGet","extendStatics","__extends","setPrototypeOf","__proto__","__","__assign","assign","ace_builds_1","PropTypes","React","editorOptions_1","getAceInstance","ReactAce","_super","_this","editorEvents","debounce","isInShadow","componentDidMount","_a","onBeforeLoad","onValidate","wrapEnabled","_b","refEditor","editorProps","debounceChangePeriod","navigateToFileEnd","updatePlaceholder","handleMarkers","availableOptions","editorOptions","handleOptions","componentDidUpdate","prevProps","oldProps","nextProps","appliedClassesArray_1","oldClass","silent","cursorStart","handleScrollMargins","margins","componentWillUnmount","currentMarkers","showPlaceholder","updateRef","render","divStyle","ref","propTypes","oneOfType","bool","enableSnippets","enableBasicAutocompletion","enableLiveAutocompletion","defaultProps","Component","split_1","DiffMatchPatch","DiffComponent","lhString","rhString","diffedLines","generateDiffedLines","setCodeMarkers","chunkType","firstChar","lastChar","linesToHighlight","codeEditorSettings","newMarkerSet","markerObj","default","acequire","fn","ace_1","ext_split_1","SplitComponent","splitEditor","defaultValueForEditor","valueForEditor","newAnnotations","newMarkers","sp","nextValue","oldAnnotations","oldMarkers","value_1","value_2","value_3","arrayOf"],"sourceRoot":""}
|