1{"version":3,"file":"brace.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/../../opt/drone/yarncache/brace-npm-0.11.1-a66ecae2b2-def78159ab.zip/node_modules/brace/index.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 (acequire, 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 acequirejs !== \"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 _acequire = 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 && acequire.original)\n                return;\n            params.push(dep);\n        }\n        return callback && callback.apply(null, params) || true;\n    }\n};\n\nvar acequire = function(module, callback) {\n    var packagedModule = _acequire(\"\", module, callback);\n    if (packagedModule == undefined && acequire.original)\n        return acequire.original.apply(this, arguments);\n    return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin acequires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative acequires\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 _acequire(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.acequire || !root.acequire.packaged) {\n        acequire.original = root.acequire;\n        root.acequire = acequire;\n        root.acequire.packaged = true;\n    }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n    if (!compliantLastIndexIncrement) {\n        RegExp.prototype.test = function (str) {\n            var match = real.exec.call(this, str);\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./regexp\");\nacequire(\"./es5-shim\");\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n    if (!doc)\n        doc = document;\n    return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n};\n\nexports.createElement = function(tag, ns) {\n    return document.createElementNS ?\n           document.createElementNS(ns || XHTML_NS, tag) :\n           document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n    var classes = (el.className + \"\").split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n    if (!exports.hasCssClass(el, name)) {\n        el.className += \" \" + name;\n    }\n};\nexports.removeCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g), add = true;\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        add = false;\n        classes.splice(index, 1);\n    }\n    if (add)\n        classes.push(name);\n\n    el.className = classes.join(\" \");\n    return add;\n};\nexports.setCssClass = function(node, className, include) {\n    if (include) {\n        exports.addCssClass(node, className);\n    } else {\n        exports.removeCssClass(node, className);\n    }\n};\n\nexports.hasCssString = function(id, doc) {\n    var index = 0, sheets;\n    doc = doc || document;\n\n    if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n        while (index < sheets.length)\n            if (sheets[index++].owningElement.id === id) return true;\n    } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n        while (index < sheets.length)\n            if (sheets[index++].id === id) return true;\n    }\n\n    return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n    doc = doc || document;\n    if (id && exports.hasCssString(id, doc))\n        return null;\n    \n    var style;\n    \n    if (id)\n        cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n    \n    if (doc.createStyleSheet) {\n        style = doc.createStyleSheet();\n        style.cssText = cssText;\n        if (id)\n            style.owningElement.id = id;\n    } else {\n        style = exports.createElement(\"style\");\n        style.appendChild(doc.createTextNode(cssText));\n        if (id)\n            style.id = id;\n\n        exports.getDocumentHead(doc).appendChild(style);\n    }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n    if (doc.createStyleSheet) {\n        doc.createStyleSheet(uri);\n    } else {\n        var link = exports.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = uri;\n\n        exports.getDocumentHead(doc).appendChild(link);\n    }\n};\n\nexports.getInnerWidth = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n        element.clientWidth\n    );\n};\n\nexports.getInnerHeight = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n        element.clientHeight\n    );\n};\n\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\nif (typeof document == \"undefined\") {\n    exports.importCssString = function() {};\n    return;\n}\n\nif (window.pageYOffset !== undefined) {\n    exports.getPageScrollTop = function() {\n        return window.pageYOffset;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return window.pageXOffset;\n    };\n}\nelse {\n    exports.getPageScrollTop = function() {\n        return document.body.scrollTop;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return document.body.scrollLeft;\n    };\n}\n\nif (window.getComputedStyle)\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n        return window.getComputedStyle(element, \"\") || {};\n    };\nelse\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return element.currentStyle[style];\n        return element.currentStyle;\n    };\nexports.setInnerHtml = function(el, innerHtml) {\n    var element = el.cloneNode(false);//document.createElement(\"div\");\n    element.innerHTML = innerHtml;\n    el.parentNode.replaceChild(element, el);\n    return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n    exports.setInnerText = function(el, innerText) {\n        el.textContent = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.textContent;\n    };\n}\nelse {\n    exports.setInnerText = function(el, innerText) {\n        el.innerText = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.innerText;\n    };\n}\n\nexports.getParentWindow = function(document) {\n    return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(acequire, 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/fixoldbrowsers\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./fixoldbrowsers\");\n\nvar oop = acequire(\"./oop\");\nvar Keys = (function() {\n    var ret = {\n        MODIFIER_KEYS: {\n            16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n        },\n\n        KEY_MODS: {\n            \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n            \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n        },\n\n        FUNCTION_KEYS : {\n            8  : \"Backspace\",\n            9  : \"Tab\",\n            13 : \"Return\",\n            19 : \"Pause\",\n            27 : \"Esc\",\n            32 : \"Space\",\n            33 : \"PageUp\",\n            34 : \"PageDown\",\n            35 : \"End\",\n            36 : \"Home\",\n            37 : \"Left\",\n            38 : \"Up\",\n            39 : \"Right\",\n            40 : \"Down\",\n            44 : \"Print\",\n            45 : \"Insert\",\n            46 : \"Delete\",\n            96 : \"Numpad0\",\n            97 : \"Numpad1\",\n            98 : \"Numpad2\",\n            99 : \"Numpad3\",\n            100: \"Numpad4\",\n            101: \"Numpad5\",\n            102: \"Numpad6\",\n            103: \"Numpad7\",\n            104: \"Numpad8\",\n            105: \"Numpad9\",\n            '-13': \"NumpadEnter\",\n            112: \"F1\",\n            113: \"F2\",\n            114: \"F3\",\n            115: \"F4\",\n            116: \"F5\",\n            117: \"F6\",\n            118: \"F7\",\n            119: \"F8\",\n            120: \"F9\",\n            121: \"F10\",\n            122: \"F11\",\n            123: \"F12\",\n            144: \"Numlock\",\n            145: \"Scrolllock\"\n        },\n\n        PRINTABLE_KEYS: {\n           32: ' ',  48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',\n           54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',\n           66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',\n           73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',\n           80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',\n           87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',\n          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/useragent\",[\"require\",\"exports\",\"module\"], function(acequire, 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};\nif (typeof navigator != \"object\")\n    return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n    (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n    ? parseFloat((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 = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keys = acequire(\"./keys\");\nvar useragent = acequire(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nexports.addListener = function(elem, type, callback) {\n    if (elem.addEventListener) {\n        return elem.addEventListener(type, callback, false);\n    }\n    if (elem.attachEvent) {\n        var wrapper = function() {\n            callback.call(elem, window.event);\n        };\n        callback._wrapper = wrapper;\n        elem.attachEvent(\"on\" + type, wrapper);\n    }\n};\n\nexports.removeListener = function(elem, type, callback) {\n    if (elem.removeEventListener) {\n        return elem.removeEventListener(type, callback, false);\n    }\n    if (elem.detachEvent) {\n        elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n    }\n};\nexports.stopEvent = function(e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n};\n\nexports.stopPropagation = function(e) {\n    if (e.stopPropagation)\n        e.stopPropagation();\n    else\n        e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n    if (e.preventDefault)\n        e.preventDefault();\n    else\n        e.returnValue = false;\n};\nexports.getButton = function(e) {\n    if (e.type == \"dblclick\")\n        return 0;\n    if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n        return 2;\n    if (e.preventDefault) {\n        return e.button;\n    }\n    else {\n        return {1:0, 2:2, 4:1}[e.button];\n    }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n    function onMouseUp(e) {\n        eventHandler && eventHandler(e);\n        releaseCaptureHandler && releaseCaptureHandler(e);\n\n        exports.removeListener(document, \"mousemove\", eventHandler, true);\n        exports.removeListener(document, \"mouseup\", onMouseUp, true);\n        exports.removeListener(document, \"dragstart\", onMouseUp, true);\n    }\n\n    exports.addListener(document, \"mousemove\", eventHandler, true);\n    exports.addListener(document, \"mouseup\", onMouseUp, true);\n    exports.addListener(document, \"dragstart\", onMouseUp, true);\n    \n    return onMouseUp;\n};\n\nexports.addTouchMoveListener = function (el, callback) {\n    var startx, starty;\n    exports.addListener(el, \"touchstart\", function (e) {\n        var touches = e.touches;\n        var touchObj = touches[0];\n        startx = touchObj.clientX;\n        starty = touchObj.clientY;\n    });\n    exports.addListener(el, \"touchmove\", function (e) {\n        var touches = e.touches;\n        if (touches.length > 1) return;\n\n        var touchObj = touches[0];\n\n        e.wheelX = startx - touchObj.clientX;\n        e.wheelY = starty - touchObj.clientY;\n\n        startx = touchObj.clientX;\n        starty = touchObj.clientY;\n\n        callback(e);\n    });\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n    if (\"onmousewheel\" in el) {\n        exports.addListener(el, \"mousewheel\", function(e) {\n            var factor = 8;\n            if (e.wheelDeltaX !== undefined) {\n                e.wheelX = -e.wheelDeltaX / factor;\n                e.wheelY = -e.wheelDeltaY / factor;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = -e.wheelDelta / factor;\n            }\n            callback(e);\n        });\n    } else if (\"onwheel\" in el) {\n        exports.addListener(el, \"wheel\",  function(e) {\n            var factor = 0.35;\n            switch (e.deltaMode) {\n                case e.DOM_DELTA_PIXEL:\n                    e.wheelX = e.deltaX * factor || 0;\n                    e.wheelY = e.deltaY * factor || 0;\n                    break;\n                case e.DOM_DELTA_LINE:\n                case e.DOM_DELTA_PAGE:\n                    e.wheelX = (e.deltaX || 0) * 5;\n                    e.wheelY = (e.deltaY || 0) * 5;\n                    break;\n            }\n            \n            callback(e);\n        });\n    } else {\n        exports.addListener(el, \"DOMMouseScroll\", function(e) {\n            if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n                e.wheelX = (e.detail || 0) * 5;\n                e.wheelY = 0;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = (e.detail || 0) * 5;\n            }\n            callback(e);\n        });\n    }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\n    var clicks = 0;\n    var startX, startY, timer; \n    var eventNames = {\n        2: \"dblclick\",\n        3: \"tripleclick\",\n        4: \"quadclick\"\n    };\n\n    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    function onDblclick(e) {\n        clicks = 2;\n        if (timer)\n            clearTimeout(timer);\n        timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n        eventHandler[callbackName](\"mousedown\", e);\n        eventHandler[callbackName](eventNames[clicks], e);\n    }\n    if (!Array.isArray(elements))\n        elements = [elements];\n    elements.forEach(function(el) {\n        exports.addListener(el, \"mousedown\", onMousedown);\n        if (useragent.isOldIE)\n            exports.addListener(el, \"dblclick\", onDblclick);\n    });\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n    ? function(e) {\n        return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n    }\n    : function(e) {\n        return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n    };\n\nexports.getModifierString = function(e) {\n    return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = getModifierHash(e);\n\n    if (!useragent.isMac && pressedKeys) {\n        if (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    if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\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) {\n    var addListener = exports.addListener;\n    if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n        var lastKeyDownKeyCode = null;\n        addListener(el, \"keydown\", function(e) {\n            lastKeyDownKeyCode = e.keyCode;\n        });\n        addListener(el, \"keypress\", function(e) {\n            return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n        });\n    } else {\n        var lastDefaultPrevented = null;\n\n        addListener(el, \"keydown\", function(e) {\n            pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n            var result = normalizeCommandKeys(callback, e, e.keyCode);\n            lastDefaultPrevented = e.defaultPrevented;\n            return result;\n        });\n\n        addListener(el, \"keypress\", function(e) {\n            if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n                exports.stopEvent(e);\n                lastDefaultPrevented = null;\n            }\n        });\n\n        addListener(el, \"keyup\", function(e) {\n            pressedKeys[e.keyCode] = null;\n        });\n\n        if (!pressedKeys) {\n            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        exports.addListener(win, \"message\", function listener(e) {\n            if (e.data == messageName) {\n                exports.stopPropagation(e);\n                exports.removeListener(win, \"message\", listener);\n                callback();\n            }\n        });\n        win.postMessage(messageName, \"*\");\n    };\n}\n\n\nexports.nextFrame = 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/lib/lang\",[\"require\",\"exports\",\"module\"], function(acequire, 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, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\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/keyboard/textinput_ios\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/keys\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar KEYS = acequire(\"../lib/keys\");\nvar MODS = KEYS.KEY_MODS;\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE =  useragent.isIE;\n\nvar TextInput = function(parentNode, host) {\n    var self = this;\n    var text = dom.createElement(\"textarea\");\n    text.className = useragent.isIOS ? \"ace_text-input ace_text-input-ios\" : \"ace_text-input\";\n\n    if (useragent.isTouchPad)\n        text.setAttribute(\"x-palm-disable-auto-cap\", true);\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 PLACEHOLDER = \"\\n aaaa a\\n\";\n\n    var copied = false;\n    var cut = false;\n    var pasted = false;\n    var inComposition = false;\n    var tempStyle = '';\n    var isSelectionEmpty = true;\n    try { var isFocused = document.activeElement === text; } catch(e) {}\n\n    event.addListener(text, \"blur\", function(e) {\n        host.onBlur(e);\n        isFocused = false;\n    });\n    event.addListener(text, \"focus\", function(e) {\n        isFocused = true;\n        host.onFocus(e);\n        resetSelection();\n    });\n    this.focus = function() {\n        if (tempStyle) return text.focus();\n        text.style.position = \"fixed\";\n        text.focus();\n    };\n    this.blur = function() {\n        text.blur();\n    };\n    this.isFocused = function() {\n        return isFocused;\n    };\n    var syncSelection = lang.delayedCall(function() {\n        isFocused && resetSelection(isSelectionEmpty);\n    });\n    var syncValue = lang.delayedCall(function() {\n         if (!inComposition) {\n            text.value = PLACEHOLDER;\n            isFocused && resetSelection();\n         }\n    });\n\n    function resetSelection(isEmpty) {\n        if (inComposition)\n            return;\n        inComposition = true;\n\n        if (inputHandler) {\n            selectionStart = 0;\n            selectionEnd = isEmpty ? 0 : text.value.length - 1;\n        } else {\n            var selectionStart = 4;\n            var selectionEnd = 5;\n        }\n        try {\n            text.setSelectionRange(selectionStart, selectionEnd);\n        } catch(e) {}\n\n        inComposition = false;\n    }\n\n    function resetValue() {\n        if (inComposition)\n            return;\n        text.value = PLACEHOLDER;\n        if (useragent.isWebKit)\n            syncValue.schedule();\n    }\n\n    useragent.isWebKit || host.addEventListener('changeSelection', function() {\n        if (host.selection.isEmpty() != isSelectionEmpty) {\n            isSelectionEmpty = !isSelectionEmpty;\n            syncSelection.schedule();\n        }\n    });\n\n    resetValue();\n    if (isFocused)\n        host.onFocus();\n\n\n    var isAllSelected = function(text) {\n        return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n    };\n\n    var onSelect = function(e) {\n        if (isAllSelected(text)) {\n            host.selectAll();\n            resetSelection();\n        } else if (inputHandler) {\n            resetSelection(host.selection.isEmpty());\n        }\n    };\n\n    var inputHandler = null;\n    this.setInputHandler = function(cb) {inputHandler = cb;};\n    this.getInputHandler = function() {return inputHandler;};\n    var afterContextMenu = false;\n\n    var sendText = function(data) {\n        if (text.selectionStart === 4 && text.selectionEnd === 5) {\n          return;\n        }\n        if (inputHandler) {\n            data = inputHandler(data);\n            inputHandler = null;\n        }\n        if (pasted) {\n            resetSelection();\n            if (data)\n                host.onPaste(data);\n            pasted = false;\n        } else if (data == PLACEHOLDER.substr(0) && text.selectionStart === 4) {\n            if (afterContextMenu)\n                host.execCommand(\"del\", {source: \"ace\"});\n            else // some versions of android do not fire keydown when pressing backspace\n                host.execCommand(\"backspace\", {source: \"ace\"});\n        } else if (!copied) {\n            if (data.substring(0, 9) == PLACEHOLDER && data.length > PLACEHOLDER.length)\n                data = data.substr(9);\n            else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4))\n                data = data.substr(4, data.length - PLACEHOLDER.length + 1);\n            else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            if (data == PLACEHOLDER.charAt(0)) {\n            } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n\n            if (data)\n                host.onTextInput(data);\n        }\n        if (copied) {\n          copied = false;\n        }\n        if (afterContextMenu)\n            afterContextMenu = false;\n    };\n    var onInput = function(e) {\n        if (inComposition)\n            return;\n        var data = text.value;\n        sendText(data);\n        resetValue();\n    };\n\n    var 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 (useragent.isIOS) {\n                cut = isCut;\n                text.value = \"\\n aa\" + data + \"a a\\n\";\n                text.setSelectionRange(4, 4 + data.length);\n                copied = {\n                    value: data\n                };\n            }\n            isCut ? host.onCut() : host.onCopy();\n            if (!useragent.isIOS) event.preventDefault(e);\n        } else {\n            copied = true;\n            text.value = data;\n            text.select();\n            setTimeout(function(){\n                copied = false;\n                resetValue();\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 (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));\n\n    event.addListener(text, \"select\", onSelect);\n\n    event.addListener(text, \"input\", onInput);\n\n    event.addListener(text, \"cut\", onCut);\n    event.addListener(text, \"copy\", onCopy);\n    event.addListener(text, \"paste\", onPaste);\n    var onCompositionStart = function(e) {\n        if (inComposition || !host.onCompositionStart || host.$readOnly)\n            return;\n        inComposition = {};\n        inComposition.canUndo = host.session.$undoManager;\n        host.onCompositionStart();\n        setTimeout(onCompositionUpdate, 0);\n        host.on(\"mousedown\", onCompositionEnd);\n        if (inComposition.canUndo && !host.selection.isEmpty()) {\n            host.insert(\"\");\n            host.session.markUndoGroup();\n            host.selection.clearSelection();\n        }\n        host.session.markUndoGroup();\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n            return;\n        var val = text.value.replace(/\\x01/g, \"\");\n        if (inComposition.lastValue === val) return;\n\n        host.onCompositionUpdate(val);\n        if (inComposition.lastValue)\n            host.undo();\n        if (inComposition.canUndo)\n            inComposition.lastValue = val;\n        if (inComposition.lastValue) {\n            var r = host.selection.getRange();\n            host.insert(inComposition.lastValue);\n            host.session.markUndoGroup();\n            inComposition.range = host.selection.getRange();\n            host.selection.setRange(r);\n            host.selection.clearSelection();\n        }\n    };\n\n    var onCompositionEnd = function(e) {\n        if (!host.onCompositionEnd || host.$readOnly) return;\n        var c = inComposition;\n        inComposition = false;\n        var timer = setTimeout(function() {\n            timer = null;\n            var str = text.value.replace(/\\x01/g, \"\");\n            if (inComposition)\n                return;\n            else if (str == c.lastValue)\n                resetValue();\n            else if (!c.lastValue && str) {\n                resetValue();\n                sendText(str);\n            }\n        });\n        inputHandler = function compositionInputHandler(str) {\n            if (timer)\n                clearTimeout(timer);\n            str = str.replace(/\\x01/g, \"\");\n            if (str == c.lastValue)\n                return \"\";\n            if (c.lastValue && timer)\n                host.undo();\n            return str;\n        };\n        host.onCompositionEnd();\n        host.removeListener(\"mousedown\", onCompositionEnd);\n        if (e.type == \"compositionend\" && c.range) {\n            host.selection.setRange(c.range);\n        }\n        var needsOnInput =\n            (!!useragent.isChrome && useragent.isChrome >= 53) ||\n            (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n        if (needsOnInput) {\n          onInput();\n        }\n    };\n\n\n\n    var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n    event.addListener(text, \"compositionstart\", onCompositionStart);\n    if (useragent.isGecko) {\n        event.addListener(text, \"text\", function(){syncComposition.schedule();});\n    } else {\n        event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n        event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n    }\n    event.addListener(text, \"compositionend\", onCompositionEnd);\n\n    this.getElement = function() {\n        return text;\n    };\n\n    this.setReadOnly = function(readOnly) {\n       text.readOnly = readOnly;\n    };\n\n    this.onContextMenu = function(e) {\n        afterContextMenu = true;\n        resetSelection(host.selection.isEmpty());\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            + \"height:\" + text.style.height + \";\"\n            + (useragent.isIE ? \"opacity:0.1;\" : \"\");\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            text.style.left = e.clientX - left - 2 + \"px\";\n            text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n        };\n        move(e);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        if (host.renderer.$keepTextAreaAtCursor)\n            host.renderer.$keepTextAreaAtCursor = null;\n\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            if (host.renderer.$keepTextAreaAtCursor == null) {\n                host.renderer.$keepTextAreaAtCursor = true;\n                host.renderer.$moveTextAreaToCursor();\n            }\n        }, 0);\n    }\n\n    var onContextMenu = function(e) {\n        host.textInput.onContextMenu(e);\n        onContextMenuClose();\n    };\n    event.addListener(text, \"mouseup\", onContextMenu);\n    event.addListener(text, \"mousedown\", function(e) {\n        e.preventDefault();\n        onContextMenuClose();\n    });\n    event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n    event.addListener(text, \"contextmenu\", onContextMenu);\n\n    if (useragent.isIOS) {\n        var typingResetTimeout = null;\n        var typing = false;\n\n        parentNode.addEventListener(\"keydown\", function (e) {\n            if (typingResetTimeout) clearTimeout(typingResetTimeout);\n            typing = true;\n        });\n\n        parentNode.addEventListener(\"keyup\", function (e) {\n            typingResetTimeout = setTimeout(function () {\n                typing = false;\n            }, 100);\n        });\n        var detectArrowKeys = function(e) {\n            if (document.activeElement !== text) return;\n            if (typing) return;\n\n            if (cut) {\n                return setTimeout(function () {\n                    cut = false;\n                }, 100);\n            }\n            var selectionStart = text.selectionStart;\n            var selectionEnd = text.selectionEnd;\n            text.setSelectionRange(4, 5);\n            if (selectionStart == selectionEnd) {\n                switch (selectionStart) {\n                    case 0: host.onCommandKey(null, 0, KEYS.up); break;\n                    case 1: host.onCommandKey(null, 0, KEYS.home); break;\n                    case 2: host.onCommandKey(null, MODS.option, KEYS.left); break;\n                    case 4: host.onCommandKey(null, 0, KEYS.left); break;\n                    case 5: host.onCommandKey(null, 0, KEYS.right); break;\n                    case 7: host.onCommandKey(null, MODS.option, KEYS.right); break;\n                    case 8: host.onCommandKey(null, 0, KEYS.end); break;\n                    case 9: host.onCommandKey(null, 0, KEYS.down); break;\n                }\n            } else {\n                switch (selectionEnd) {\n                    case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break;\n                    case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break;\n                    case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break;\n                    case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break;\n                }\n                switch (selectionStart) {\n                    case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break;\n                    case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break;\n                    case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break;\n                    case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break;\n                }\n            }\n        };\n        document.addEventListener(\"selectionchange\", detectArrowKeys);\n        host.on(\"destroy\", function() {\n            document.removeEventListener(\"selectionchange\", detectArrowKeys);\n        });\n    }\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/keyboard/textinput_ios\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE =  useragent.isIE;\n\nvar TextInputIOS = acequire(\"./textinput_ios\").TextInput;\nvar TextInput = function(parentNode, host) {\n    if (useragent.isIOS)\n        return TextInputIOS.call(this, parentNode, host);\n\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 PLACEHOLDER = \"\\u2028\\u2028\";\n\n    var copied = false;\n    var pasted = false;\n    var inComposition = false;\n    var tempStyle = '';\n    var isSelectionEmpty = true;\n    try { var isFocused = document.activeElement === text; } catch(e) {}\n    \n    event.addListener(text, \"blur\", function(e) {\n        host.onBlur(e);\n        isFocused = false;\n    });\n    event.addListener(text, \"focus\", function(e) {\n        isFocused = true;\n        host.onFocus(e);\n        resetSelection();\n    });\n    this.focus = function() {\n        if (tempStyle) return text.focus();\n        var top = text.style.top;\n        text.style.position = \"fixed\";\n        text.style.top = \"0px\";\n        text.focus();\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    var syncSelection = lang.delayedCall(function() {\n        isFocused && resetSelection(isSelectionEmpty);\n    });\n    var syncValue = lang.delayedCall(function() {\n         if (!inComposition) {\n            text.value = PLACEHOLDER;\n            isFocused && resetSelection();\n         }\n    });\n\n    function resetSelection(isEmpty) {\n        if (inComposition)\n            return;\n        inComposition = true;\n        \n        if (inputHandler) {\n            var selectionStart = 0;\n            var selectionEnd = isEmpty ? 0 : text.value.length - 1;\n        } else {\n            var selectionStart = isEmpty ? 2 : 1;\n            var selectionEnd = 2;\n        }\n        try {\n            text.setSelectionRange(selectionStart, selectionEnd);\n        } catch(e){}\n        \n        inComposition = false;\n    }\n\n    function resetValue() {\n        if (inComposition)\n            return;\n        text.value = PLACEHOLDER;\n        if (useragent.isWebKit)\n            syncValue.schedule();\n    }\n\n    useragent.isWebKit || host.addEventListener('changeSelection', function() {\n        if (host.selection.isEmpty() != isSelectionEmpty) {\n            isSelectionEmpty = !isSelectionEmpty;\n            syncSelection.schedule();\n        }\n    });\n\n    resetValue();\n    if (isFocused)\n        host.onFocus();\n\n\n    var isAllSelected = function(text) {\n        return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n    };\n\n    var onSelect = function(e) {\n        if (copied) {\n            copied = false;\n        } else if (isAllSelected(text)) {\n            host.selectAll();\n            resetSelection();\n        } else if (inputHandler) {\n            resetSelection(host.selection.isEmpty());\n        }\n    };\n\n    var inputHandler = null;\n    this.setInputHandler = function(cb) {inputHandler = cb;};\n    this.getInputHandler = function() {return inputHandler;};\n    var afterContextMenu = false;\n    \n    var sendText = function(data) {\n        if (inputHandler) {\n            data = inputHandler(data);\n            inputHandler = null;\n        }\n        if (pasted) {\n            resetSelection();\n            if (data)\n                host.onPaste(data);\n            pasted = false;\n        } else if (data == PLACEHOLDER.charAt(0)) {\n            if (afterContextMenu)\n                host.execCommand(\"del\", {source: \"ace\"});\n            else // some versions of android do not fire keydown when pressing backspace\n                host.execCommand(\"backspace\", {source: \"ace\"});\n        } else {\n            if (data.substring(0, 2) == PLACEHOLDER)\n                data = data.substr(2);\n            else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n                data = data.substr(1);\n            else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            \n            if (data)\n                host.onTextInput(data);\n        }\n        if (afterContextMenu)\n            afterContextMenu = false;\n    };\n    var onInput = function(e) {\n        if (inComposition)\n            return;\n        var data = text.value;\n        sendText(data);\n        resetValue();\n    };\n    \n    var 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            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                resetValue();\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 (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));\n\n    event.addListener(text, \"select\", onSelect);\n\n    event.addListener(text, \"input\", onInput);\n\n    event.addListener(text, \"cut\", onCut);\n    event.addListener(text, \"copy\", onCopy);\n    event.addListener(text, \"paste\", onPaste);\n    if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n                return;\n\n            switch (e.keyCode) {\n                case 67:\n                    onCopy(e);\n                    break;\n                case 86:\n                    onPaste(e);\n                    break;\n                case 88:\n                    onCut(e);\n                    break;\n            }\n        });\n    }\n    var onCompositionStart = function(e) {\n        if (inComposition || !host.onCompositionStart || host.$readOnly) \n            return;\n        inComposition = {};\n        inComposition.canUndo = host.session.$undoManager;\n        host.onCompositionStart();\n        setTimeout(onCompositionUpdate, 0);\n        host.on(\"mousedown\", onCompositionEnd);\n        if (inComposition.canUndo && !host.selection.isEmpty()) {\n            host.insert(\"\");\n            host.session.markUndoGroup();\n            host.selection.clearSelection();\n        }\n        host.session.markUndoGroup();\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n            return;\n        var val = text.value.replace(/\\u2028/g, \"\");\n        if (inComposition.lastValue === val) return;\n        \n        host.onCompositionUpdate(val);\n        if (inComposition.lastValue)\n            host.undo();\n        if (inComposition.canUndo)\n            inComposition.lastValue = val;\n        if (inComposition.lastValue) {\n            var r = host.selection.getRange();\n            host.insert(inComposition.lastValue);\n            host.session.markUndoGroup();\n            inComposition.range = host.selection.getRange();\n            host.selection.setRange(r);\n            host.selection.clearSelection();\n        }\n    };\n\n    var onCompositionEnd = function(e) {\n        if (!host.onCompositionEnd || host.$readOnly) return;\n        var c = inComposition;\n        inComposition = false;\n        var timer = setTimeout(function() {\n            timer = null;\n            var str = text.value.replace(/\\u2028/g, \"\");\n            if (inComposition)\n                return;\n            else if (str == c.lastValue)\n                resetValue();\n            else if (!c.lastValue && str) {\n                resetValue();\n                sendText(str);\n            }\n        });\n        inputHandler = function compositionInputHandler(str) {\n            if (timer)\n                clearTimeout(timer);\n            str = str.replace(/\\u2028/g, \"\");\n            if (str == c.lastValue)\n                return \"\";\n            if (c.lastValue && timer)\n                host.undo();\n            return str;\n        };\n        host.onCompositionEnd();\n        host.removeListener(\"mousedown\", onCompositionEnd);\n        if (e.type == \"compositionend\" && c.range) {\n            host.selection.setRange(c.range);\n        }\n        var needsOnInput =\n            (!!useragent.isChrome && useragent.isChrome >= 53) ||\n            (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n        if (needsOnInput) {\n          onInput();\n        }\n    };\n    \n    \n\n    var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n    event.addListener(text, \"compositionstart\", onCompositionStart);\n    if (useragent.isGecko) {\n        event.addListener(text, \"text\", function(){syncComposition.schedule();});\n    } else {\n        event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n        event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n    }\n    event.addListener(text, \"compositionend\", onCompositionEnd);\n\n    this.getElement = function() {\n        return text;\n    };\n\n    this.setReadOnly = function(readOnly) {\n       text.readOnly = readOnly;\n    };\n\n    this.onContextMenu = function(e) {\n        afterContextMenu = true;\n        resetSelection(host.selection.isEmpty());\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            + \"height:\" + text.style.height + \";\"\n            + (useragent.isIE ? \"opacity:0.1;\" : \"\");\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            text.style.left = e.clientX - left - 2 + \"px\";\n            text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n        }; \n        move(e);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        if (host.renderer.$keepTextAreaAtCursor)\n            host.renderer.$keepTextAreaAtCursor = null;\n\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            if (host.renderer.$keepTextAreaAtCursor == null) {\n                host.renderer.$keepTextAreaAtCursor = true;\n                host.renderer.$moveTextAreaToCursor();\n            }\n        }, 0);\n    }\n\n    var onContextMenu = function(e) {\n        host.textInput.onContextMenu(e);\n        onContextMenuClose();\n    };\n    event.addListener(text, \"mouseup\", onContextMenu);\n    event.addListener(text, \"mousedown\", function(e) {\n        e.preventDefault();\n        onContextMenuClose();\n    });\n    event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n    event.addListener(text, \"contextmenu\", onContextMenu);\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 250; // 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    editor.setDefaultHandler(\"touchmove\", this.onTouchMove.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            editor.$blockScrolling++;\n            if (selectionEmpty || button == 1)\n                editor.selection.moveToPosition(pos);\n            editor.$blockScrolling--;\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.$focusTimout && !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        editor.$blockScrolling++;\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        editor.$blockScrolling--;\n    };\n\n    this.select = function() {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        editor.$blockScrolling++;\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.$blockScrolling--;\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        editor.$blockScrolling++;\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.$blockScrolling--;\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.$focusTimout)\n            this.startSelect(this.mousedownEvent.getDocumentPosition());\n    };\n\n    this.onDoubleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n        var session = editor.session;\n\n        var range = session.getBracketRange(pos);\n        if (range) {\n            if (range.isEmpty()) {\n                range.start.column--;\n                range.end.column++;\n            }\n            this.setState(\"select\");\n        } else {\n            range = editor.selection.getWordRange(pos.row, pos.column);\n            this.setState(\"selectByWords\");\n        }\n        this.$clickSelection = range;\n        this.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 = ev.wheelX / dt;\n        var vy = ev.wheelY / dt;\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.1 * Math.abs(prevScroll.vx)\n                && Math.abs(vy) <= 1.1 * 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    this.onTouchMove = function(ev) {\n        this.editor._emit(\"mousewheel\", ev);\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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n    this.isOpen = false;\n    this.$element = null;\n    this.$parentNode = parentNode;\n}\n\n(function() {\n    this.$init = function() {\n        this.$element = dom.createElement(\"div\");\n        this.$element.className = \"ace_tooltip\";\n        this.$element.style.display = \"none\";\n        this.$parentNode.appendChild(this.$element);\n        return this.$element;\n    };\n    this.getElement = function() {\n        return this.$element || this.$init();\n    };\n    this.setText = function(text) {\n        dom.setInnerText(this.getElement(), text);\n    };\n    this.setHtml = function(html) {\n        this.getElement().innerHTML = html;\n    };\n    this.setPosition = function(x, y) {\n        this.getElement().style.left = x + \"px\";\n        this.getElement().style.top = y + \"px\";\n    };\n    this.setClassName = function(className) {\n        dom.addCssClass(this.getElement(), className);\n    };\n    this.show = function(text, x, y) {\n        if (text != null)\n            this.setText(text);\n        if (x != null && y != null)\n            this.setPosition(x, y);\n        if (!this.isOpen) {\n            this.getElement().style.display = \"block\";\n            this.isOpen = true;\n        }\n    };\n\n    this.hide = function() {\n        if (this.isOpen) {\n            this.getElement().style.display = \"none\";\n            this.isOpen = false;\n        }\n    };\n    this.getHeight = function() {\n        return this.getElement().offsetHeight;\n    };\n    this.getWidth = function() {\n        return this.getElement().offsetWidth;\n    };\n\n    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(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar event = acequire(\"../lib/event\");\nvar Tooltip = acequire(\"../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.removeEventListener(\"mousewheel\", hideTooltip);\n        }\n    }\n\n    function moveTooltip(e) {\n        tooltip.setPosition(e.x, e.y);\n    }\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n        var target = e.domEvent.target || e.domEvent.srcElement;\n        if (dom.hasCssClass(target, \"ace_fold-widget\"))\n            return hideTooltip();\n\n        if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n            moveTooltip(e);\n\n        mouseEvent = e;\n        if (tooltipTimeout)\n            return;\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            if (mouseEvent && !mouseHandler.isMousePressed)\n                showTooltip();\n            else\n                hideTooltip();\n        }, 50);\n    });\n\n    event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n        mouseEvent = null;\n        if (!tooltipAnnotation || tooltipTimeout)\n            return;\n\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            hideTooltip();\n        }, 50);\n    });\n    \n    editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n    Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n    this.setPosition = function(x, y) {\n        var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n        var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n        var width = this.getWidth();\n        var height = this.getHeight();\n        x += 15;\n        y += 15;\n        if (x + width > windowWidth) {\n            x -= (x + width) - windowWidth;\n        }\n        if (y + height > windowHeight) {\n            y -= 20 + height;\n        }\n        Tooltip.prototype.setPosition.call(this, x, y);\n    };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../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(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n    var editor = mouseHandler.editor;\n\n    var blankImage = dom.createElement(\"img\");\n    blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n    if (useragent.isOpera)\n        blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n    var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n     exports.forEach(function(x) {\n         mouseHandler[x] = this[x];\n    }, this);\n    editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n    var mouseTarget = editor.container;\n    var dragSelectionMarker, x, y;\n    var timerId, range;\n    var dragCursor, counter = 0;\n    var dragOperation;\n    var isInternal;\n    var autoScrollStartTime;\n    var cursorMovedTime;\n    var cursorPointOnCaretMoved;\n\n    this.onDragStart = function(e) {\n        if (this.cancelDrag || !mouseTarget.draggable) {\n            var self = this;\n            setTimeout(function(){\n                self.startSelect();\n                self.captureMouse(e);\n            }, 0);\n            return e.preventDefault();\n        }\n        range = editor.getSelectionRange();\n\n        var dataTransfer = e.dataTransfer;\n        dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n        if (useragent.isOpera) {\n            editor.container.appendChild(blankImage);\n            blankImage.scrollTop = 0;\n        }\n        dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n        if (useragent.isOpera) {\n            editor.container.removeChild(blankImage);\n        }\n        dataTransfer.clearData();\n        dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n        isInternal = true;\n        this.setState(\"drag\");\n    };\n\n    this.onDragEnd = function(e) {\n        mouseTarget.draggable = false;\n        isInternal = false;\n        this.setState(null);\n        if (!editor.getReadOnly()) {\n            var dropEffect = e.dataTransfer.dropEffect;\n            if (!dragOperation && dropEffect == \"move\")\n                editor.session.remove(editor.getSelectionRange());\n            editor.renderer.$cursorLayer.setBlinking(true);\n        }\n        this.editor.unsetStyle(\"ace_dragging\");\n        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));\n    event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n    event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n    function scrollCursorIntoView(cursor, prevCursor) {\n        var now = Date.now();\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        var hMovement = !prevCursor || cursor.column != prevCursor.column;\n        if (!cursorMovedTime || vMovement || hMovement) {\n            editor.$blockScrolling += 1;\n            editor.moveCursorToPosition(cursor);\n            editor.$blockScrolling -= 1;\n            cursorMovedTime = now;\n            cursorPointOnCaretMoved = {x: x, y: y};\n        } else {\n            var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n            if (distance > SCROLL_CURSOR_HYSTERESIS) {\n                cursorMovedTime = null;\n            } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n                editor.renderer.scrollCursorIntoView();\n                cursorMovedTime = null;\n            }\n        }\n    }\n\n    function autoScroll(cursor, prevCursor) {\n        var now = Date.now();\n        var lineHeight = editor.renderer.layerConfig.lineHeight;\n        var characterWidth = editor.renderer.layerConfig.characterWidth;\n        var editorRect = editor.renderer.scroller.getBoundingClientRect();\n        var offsets = {\n           x: {\n               left: x - editorRect.left,\n               right: editorRect.right - x\n           },\n           y: {\n               top: y - editorRect.top,\n               bottom: editorRect.bottom - y\n           }\n        };\n        var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n        var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n        var scrollCursor = {row: cursor.row, column: cursor.column};\n        if (nearestXOffset / characterWidth <= 2) {\n            scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n        }\n        if (nearestYOffset / lineHeight <= 1) {\n            scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n        }\n        var vScroll = cursor.row != scrollCursor.row;\n        var hScroll = cursor.column != scrollCursor.column;\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        if (vScroll || (hScroll && !vMovement)) {\n            if (!autoScrollStartTime)\n                autoScrollStartTime = now;\n            else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n                editor.renderer.scrollCursorIntoView(scrollCursor);\n        } else {\n            autoScrollStartTime = null;\n        }\n    }\n\n    function onDragInterval() {\n        var prevCursor = dragCursor;\n        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n        scrollCursorIntoView(dragCursor, prevCursor);\n        autoScroll(dragCursor, prevCursor);\n    }\n\n    function addDragMarker() {\n        range = editor.selection.toOrientedRange();\n        dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n        editor.clearSelection();\n        if (editor.isFocused())\n            editor.renderer.$cursorLayer.setBlinking(false);\n        clearInterval(timerId);\n        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.$blockScrolling += 1;\n        editor.selection.fromOrientedRange(range);\n        editor.$blockScrolling -= 1;\n        if (editor.isFocused() && !isInternal)\n            editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n        range = null;\n        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.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\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/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"./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(acequire, 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    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\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        var old = handlers[eventName];\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 (this._eventRegistry) this._eventRegistry[eventName] = [];\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(acequire, exports, module) {\n\"no use strict\";\n\nvar oop = acequire(\"./oop\");\nvar EventEmitter = acequire(\"./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            optionNames = Object.keys(this.$options);\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        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/app_config\"], function(acequire, exports, module) {\n\"no use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar net = acequire(\"./lib/net\");\nvar AppConfig = acequire(\"./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};\n\nexports.get = function(key) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    return options[key];\n};\n\nexports.set = function(key, value) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    options[key] = value;\n};\n\nexports.all = function() {\n    return lang.copyObject(options);\n};\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 = acequire(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        acequire([moduleName], function(module) {\n            exports._emit(\"load.module\", {name: moduleName, module: module});\n            var listeners = exports.$loading[moduleName];\n            exports.$loading[moduleName] = null;\n            listeners.forEach(function(onLoad) {\n                onLoad && onLoad(module);\n            });\n        });\n    };\n\n    if (!exports.get(\"packaged\"))\n        return afterLoad();\n    net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n    if (!global || !global.document)\n        return;\n    \n    options.packaged = packaged || acequire.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\n});\n\nace.define(\"ace/mouse/mouse_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/mouse/default_handlers\",\"ace/mouse/default_gutter_handler\",\"ace/mouse/mouse_event\",\"ace/mouse/dragdrop_handler\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar DefaultHandlers = acequire(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = acequire(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = acequire(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = acequire(\"./dragdrop_handler\").DragdropHandler;\nvar config = acequire(\"../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\"));\n    event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"));\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\");\n    event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"));\n    event.addTouchMoveListener(editor.container, this.onTouchMove.bind(this, \"touchmove\"));\n\n    var gutterEl = editor.renderer.$gutter;\n    event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"));\n    event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"));\n    event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"));\n    event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"));\n\n    event.addListener(mouseTarget, \"mousedown\", focusEditor);\n    event.addListener(gutterEl, \"mousedown\", focusEditor);\n    if (useragent.isIE && editor.renderer.scrollBarV) {\n        event.addListener(editor.renderer.scrollBarV.element, \"mousedown\", focusEditor);\n        event.addListener(editor.renderer.scrollBarH.element, \"mousedown\", focusEditor);\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    });\n};\n\n(function() {\n    this.onMouseEvent = function(name, e) {\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseMove = function(name, e) {\n        var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n        if (!listeners || !listeners.length)\n            return;\n\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseWheel = function(name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n\n        this.editor._emit(name, mouseEvent);\n    };\n    \n    this.onTouchMove = function (name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = 1;//this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n        this.editor._emit(name, mouseEvent);\n    };\n\n    this.setState = function(state) {\n        this.state = state;\n    };\n\n    this.captureMouse = function(ev, mouseMoveHandler) {\n        this.x = ev.x;\n        this.y = ev.y;\n\n        this.isMousePressed = true;\n        var renderer = this.editor.renderer;\n        if (renderer.$keepTextAreaAtCursor)\n            renderer.$keepTextAreaAtCursor = null;\n\n        var self = this;\n        var onMouseMove = function(e) {\n            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            clearInterval(timerId);\n            onCaptureInterval();\n            self[self.state + \"End\"] && self[self.state + \"End\"](e);\n            self.state = \"\";\n            if (renderer.$keepTextAreaAtCursor == null) {\n                renderer.$keepTextAreaAtCursor = true;\n                renderer.$moveTextAreaToCursor();\n            }\n            self.isMousePressed = false;\n            self.$onCaptureMouseMove = self.releaseMouse = null;\n            e && self.onMouseEvent(\"mouseup\", e);\n        };\n\n        var onCaptureInterval = function() {\n            self[self.state] && self[self.state]();\n            self.$mouseMoved = false;\n        };\n\n        if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n            return setTimeout(function() {onCaptureEnd(ev);});\n        }\n\n        self.$onCaptureMouseMove = onMouseMove;\n        self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n        var timerId = setInterval(onCaptureInterval, 20);\n    };\n    this.releaseMouse = null;\n    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}).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    focusTimout: {initialValue: 0},\n    tooltipFollowsMouse: {initialValue: true}\n});\n\n\nexports.MouseHandler = MouseHandler;\n});\n\nace.define(\"ace/mouse/fold_handler\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nfunction FoldHandler(editor) {\n\n    editor.on(\"click\", function(e) {\n        var position = e.getDocumentPosition();\n        var session = editor.session;\n        var fold = session.getFoldAt(position.row, position.column, 1);\n        if (fold) {\n            if (e.getAccelKey())\n                session.removeFold(fold);\n            else\n                session.expandFold(fold);\n\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            if (session.foldWidgets && session.foldWidgets[row])\n                editor.session.onFoldWidgetClick(row, e);\n            if (!editor.isFocused())\n                editor.focus();\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterdblclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            var data = session.getParentFoldRangeData(row, true);\n            var range = data.range || data.firstRange;\n\n            if (range) {\n                row = range.start.row;\n                var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n\n                if (fold) {\n                    session.removeFold(fold);\n                } else {\n                    session.addFold(\"...\", range);\n                    editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});\n                }\n            }\n            e.stop();\n        }\n    });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\nace.define(\"ace/keyboard/keybinding\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil  = acequire(\"../lib/keys\");\nvar event = acequire(\"../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        this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n    };\n\n    this.onTextInput = function(text) {\n        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(acequire, 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) {\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\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 ) {\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\n\tif (hi == 0) {\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;\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}\n\treturn ON;\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;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\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\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))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\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\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar bidiUtil = acequire(\"./lib/bidiutil\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\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.line = \"\";\n    this.wrapIndent = 0;\n    this.isLastRow = false;\n    this.EOF = \"\\xB6\";\n    this.seenBidi = false;\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        }\n\n        return splitIndex;\n    };\n\n    this.updateRowLine = function(docRow, splitIndex) {\n        if (docRow === undefined)\n            docRow = this.getDocumentRow();\n\n        this.wrapIndent = 0;\n        this.isLastRow = (docRow === this.session.getLength() - 1);\n        this.line = this.session.getLine(docRow);\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.line = (splitIndex < splits.length) ?\n                        this.line.substring(splits[splitIndex - 1], splits[splits.length - 1]) :\n                            this.line.substring(splits[splits.length - 1]);\n                } else {\n                    this.line = this.line.substring(0, splits[splitIndex]);\n                }\n            }\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\n    this.updateBidiMap = function() {\n        var textCharTypes = [], endOfLine = this.isLastRow ? this.EOF : this.EOL;\n        var line = this.line + (this.showInvisibles ? endOfLine : bidiUtil.DOT);\n        if (bidiUtil.hasBidiCharacters(line, textCharTypes)) {\n            this.bidiMap = bidiUtil.doBidiReorder(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.seenBidi)\n            return;\n        if (this.characterWidth === fontMetrics.$characterSize.width)\n            return;\n\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] = useragent.isChrome ? bidiCharWidth : bidiCharWidth * 0.45;\n        this.charWidths[bidiUtil.B] = 0;\n\n        this.currentRow = null;\n    };\n\n    this.getShowInvisibles = function() {\n        return this.showInvisibles;\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.setTextDir = function(isRtlDir) {\n        this.isRtlDir = isRtlDir;\n    };\n    this.getPosLeft = function(col) {\n        col -= this.wrapIndent;\n        var visualIdx = bidiUtil.getVisualFromLogicalIdx(col > 0 ? col - 1 : 0, this.bidiMap),\n            levels = this.bidiMap.bidiLevels, left = 0;\n\n        if (col === 0 && 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 (col !== 0 && levels[visualIdx] % 2 === 0)\n            left += this.charWidths[levels[visualIdx]];\n\n        if (this.wrapIndent)\n            left += this.wrapIndent * this.charWidths[bidiUtil.L];\n\n        return left;\n    };\n    this.getSelections = function(startCol, endCol) {\n        var map = this.bidiMap, levels = map.bidiLevels, level, offset = this.wrapIndent * this.charWidths[bidiUtil.L], selections = [],\n            selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n                isSelected = false, isSelectedPrev = false, selectionStart = 0;\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        return selections;\n    };\n    this.offsetToCol = function(posX) {\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.wrapIndent * this.charWidths[bidiUtil.L];\n        }\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        return (logicalIdx + this.wrapIndent);\n    };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(acequire, 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/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Selection = function(session) {\n    this.session = session;\n    this.doc = session.getDocument();\n\n    this.clearSelection();\n    this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n    this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n    var self = this;\n    this.lead.on(\"change\", function(e) {\n        self._emit(\"changeCursor\");\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n        if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n            self.$desiredColumn = null;\n    });\n\n    this.selectionAnchor.on(\"change\", function() {\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n    });\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.isEmpty = function() {\n        return (this.$isEmpty || (\n            this.anchor.row == this.lead.row &&\n            this.anchor.column == this.lead.column\n        ));\n    };\n    this.isMultiLine = function() {\n        if (this.isEmpty()) {\n            return false;\n        }\n\n        return this.getRange().isMultiLine();\n    };\n    this.getCursor = function() {\n        return this.lead.getPosition();\n    };\n    this.setSelectionAnchor = function(row, column) {\n        this.anchor.setPosition(row, column);\n\n        if (this.$isEmpty) {\n            this.$isEmpty = false;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.getSelectionAnchor = function() {\n        if (this.$isEmpty)\n            return this.getSelectionLead();\n        else\n            return this.anchor.getPosition();\n    };\n    this.getSelectionLead = function() {\n        return this.lead.getPosition();\n    };\n    this.shiftSelection = function(columns) {\n        if (this.$isEmpty) {\n            this.moveCursorTo(this.lead.row, this.lead.column + columns);\n            return;\n        }\n\n        var anchor = this.getSelectionAnchor();\n        var lead = this.getSelectionLead();\n\n        var isBackwards = this.isBackwards();\n\n        if (!isBackwards || anchor.column !== 0)\n            this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n        if (isBackwards || lead.column !== 0) {\n            this.$moveSelection(function() {\n                this.moveCursorTo(lead.row, lead.column + columns);\n            });\n        }\n    };\n    this.isBackwards = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n        return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n    };\n    this.getRange = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n\n        if (this.isEmpty())\n            return Range.fromPoints(lead, lead);\n\n        if (this.isBackwards()) {\n            return Range.fromPoints(lead, anchor);\n        }\n        else {\n            return Range.fromPoints(anchor, lead);\n        }\n    };\n    this.clearSelection = function() {\n        if (!this.$isEmpty) {\n            this.$isEmpty = true;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.selectAll = function() {\n        var lastRow = this.doc.getLength() - 1;\n        this.setSelectionAnchor(0, 0);\n        this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n    };\n    this.setRange =\n    this.setSelectionRange = function(range, reverse) {\n        if (reverse) {\n            this.setSelectionAnchor(range.end.row, range.end.column);\n            this.selectTo(range.start.row, range.start.column);\n        } else {\n            this.setSelectionAnchor(range.start.row, range.start.column);\n            this.selectTo(range.end.row, range.end.column);\n        }\n        if (this.getRange().isEmpty())\n            this.$isEmpty = true;\n        this.$desiredColumn = null;\n    };\n\n    this.$moveSelection = function(mover) {\n        var lead = this.lead;\n        if (this.$isEmpty)\n            this.setSelectionAnchor(lead.row, lead.column);\n\n        mover.call(this);\n    };\n    this.selectTo = function(row, column) {\n        this.$moveSelection(function() {\n            this.moveCursorTo(row, column);\n        });\n    };\n    this.selectToPosition = function(pos) {\n        this.$moveSelection(function() {\n            this.moveCursorToPosition(pos);\n        });\n    };\n    this.moveTo = function(row, column) {\n        this.clearSelection();\n        this.moveCursorTo(row, column);\n    };\n    this.moveToPosition = function(pos) {\n        this.clearSelection();\n        this.moveCursorToPosition(pos);\n    };\n    this.selectUp = function() {\n        this.$moveSelection(this.moveCursorUp);\n    };\n    this.selectDown = function() {\n        this.$moveSelection(this.moveCursorDown);\n    };\n    this.selectRight = function() {\n        this.$moveSelection(this.moveCursorRight);\n    };\n    this.selectLeft = function() {\n        this.$moveSelection(this.moveCursorLeft);\n    };\n    this.selectLineStart = function() {\n        this.$moveSelection(this.moveCursorLineStart);\n    };\n    this.selectLineEnd = function() {\n        this.$moveSelection(this.moveCursorLineEnd);\n    };\n    this.selectFileEnd = function() {\n        this.$moveSelection(this.moveCursorFileEnd);\n    };\n    this.selectFileStart = function() {\n        this.$moveSelection(this.moveCursorFileStart);\n    };\n    this.selectWordRight = function() {\n        this.$moveSelection(this.moveCursorWordRight);\n    };\n    this.selectWordLeft = function() {\n        this.$moveSelection(this.moveCursorWordLeft);\n    };\n    this.getWordRange = function(row, column) {\n        if (typeof column == \"undefined\") {\n            var cursor = row || this.lead;\n            row = cursor.row;\n            column = cursor.column;\n        }\n        return this.session.getWordRange(row, column);\n    };\n    this.selectWord = function() {\n        this.setSelectionRange(this.getWordRange());\n    };\n    this.selectAWord = function() {\n        var cursor = this.getCursor();\n        var range = this.session.getAWordRange(cursor.row, cursor.column);\n        this.setSelectionRange(range);\n    };\n\n    this.getLineRange = function(row, excludeLastChar) {\n        var rowStart = typeof row == \"number\" ? row : this.lead.row;\n        var rowEnd;\n\n        var foldLine = this.session.getFoldLine(rowStart);\n        if (foldLine) {\n            rowStart = foldLine.start.row;\n            rowEnd = foldLine.end.row;\n        } else {\n            rowEnd = rowStart;\n        }\n        if (excludeLastChar === true)\n            return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n        else\n            return new Range(rowStart, 0, rowEnd + 1, 0);\n    };\n    this.selectLine = function() {\n        this.setSelectionRange(this.getLineRange());\n    };\n    this.moveCursorUp = function() {\n        this.moveCursorBy(-1, 0);\n    };\n    this.moveCursorDown = function() {\n        this.moveCursorBy(1, 0);\n    };\n    this.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        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n            return;\n        }\n        if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n            column += this.session.nonTokenRe.lastIndex;\n            this.session.nonTokenRe.lastIndex = 0;\n            rightOfCursor = line.substring(column);\n        }\n        if (column >= line.length) {\n            this.moveCursorTo(row, line.length);\n            this.moveCursorRight();\n            if (row < this.doc.getLength() - 1)\n                this.moveCursorWordRight();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            column += this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorLongWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n            return;\n        }\n\n        var str = this.session.getFoldStringAt(row, column, -1);\n        if (str == null) {\n            str = this.doc.getLine(row).substring(0, column);\n        }\n\n        var leftOfCursor = lang.stringReverse(str);\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n            column -= this.session.nonTokenRe.lastIndex;\n            leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n            this.session.nonTokenRe.lastIndex = 0;\n        }\n        if (column <= 0) {\n            this.moveCursorTo(row, 0);\n            this.moveCursorLeft();\n            if (row > 0)\n                this.moveCursorWordLeft();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(leftOfCursor)) {\n            column -= this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n\n    this.$shortWordEndIndex = function(rightOfCursor) {\n        var match, index = 0, ch;\n        var whitespaceRe = /\\s/;\n        var tokenRe = this.session.tokenRe;\n\n        tokenRe.lastIndex = 0;\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            index = this.session.tokenRe.lastIndex;\n        } else {\n            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                index ++;\n\n            if (index < 1) {\n                tokenRe.lastIndex = 0;\n                 while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n                    tokenRe.lastIndex = 0;\n                    index ++;\n                    if (whitespaceRe.test(ch)) {\n                        if (index > 2) {\n                            index--;\n                            break;\n                        } else {\n                            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                                index ++;\n                            if (index > 2)\n                                break;\n                        }\n                    }\n                }\n            }\n        }\n        tokenRe.lastIndex = 0;\n\n        return index;\n    };\n\n    this.moveCursorShortWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold)\n            return this.moveCursorTo(fold.end.row, fold.end.column);\n\n        if (column == line.length) {\n            var l = this.doc.getLength();\n            do {\n                row++;\n                rightOfCursor = this.doc.getLine(row);\n            } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n            if (!/^\\s+/.test(rightOfCursor))\n                rightOfCursor = \"\";\n            column = 0;\n        }\n\n        var index = this.$shortWordEndIndex(rightOfCursor);\n\n        this.moveCursorTo(row, column + index);\n    };\n\n    this.moveCursorShortWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1))\n            return this.moveCursorTo(fold.start.row, fold.start.column);\n\n        var line = this.session.getLine(row).substring(0, column);\n        if (column === 0) {\n            do {\n                row--;\n                line = this.doc.getLine(row);\n            } while (row > 0 && /^\\s*$/.test(line));\n\n            column = line.length;\n            if (!/\\s+$/.test(line))\n                line = \"\";\n        }\n\n        var leftOfCursor = lang.stringReverse(line);\n        var index = this.$shortWordEndIndex(leftOfCursor);\n\n        return this.moveCursorTo(row, column - index);\n    };\n\n    this.moveCursorWordRight = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordRight();\n        else\n            this.moveCursorShortWordRight();\n    };\n\n    this.moveCursorWordLeft = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordLeft();\n        else\n            this.moveCursorShortWordLeft();\n    };\n    this.moveCursorBy = function(rows, chars) {\n        var screenPos = this.session.documentToScreenPosition(\n            this.lead.row,\n            this.lead.column\n        );\n\n        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        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            if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\n                if (docPos.row > 0 || rows > 0)\n                    docPos.row++;\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        this.session = this.doc = null;\n    };\n\n    this.fromOrientedRange = function(range) {\n        this.setSelectionRange(range, range.cursor == range.start);\n        this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n    };\n\n    this.toOrientedRange = function(range) {\n        var r = this.getRange();\n        if (range) {\n            range.start.column = r.start.column;\n            range.start.row = r.start.row;\n            range.end.column = r.end.column;\n            range.end.row = r.end.row;\n        } else {\n            range = r;\n        }\n\n        range.cursor = this.isBackwards() ? range.start : range.end;\n        range.desiredColumn = this.$desiredColumn;\n        return range;\n    };\n    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) {\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        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(acequire, exports, module) {\n\"use strict\";\n\nvar config = acequire(\"./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 += 2000),\n                        type: \"overflow\"\n                    };\n                }\n                currentState = \"start\";\n                stack = [];\n                break;\n            }\n        }\n\n        if (token.type)\n            tokens.push(token);\n        \n        if (stack.length > 1) {\n            if (stack[0] !== currentState)\n                stack.unshift(\"#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(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../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        Object.keys(map).forEach(function(className) {\n            var a = map[className];\n            if (ignoreCase)\n                a = a.toLowerCase();\n            var list = a.split(splitChar || \"|\");\n            for (var i = list.length; i--; )\n                keywords[list[i]] = className;\n        });\n        if (Object.getPrototypeOf(keywords)) {\n            keywords.__proto__ = null;\n        }\n        this.$keywordList = Object.keys(keywords);\n        map = null;\n        return ignoreCase\n            ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\n            : function(value) {return keywords[value] || defaultToken; };\n    };\n\n    this.getKeywords = function() {\n        return this.$keywords;\n    };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(acequire, 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(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Behaviour = acequire(\"../behaviour\").Behaviour;\nvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\nvar lang = acequire(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"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                    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 selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || 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        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(acequire, exports, module) {\n\"use strict\";\nexports.packages = {};\n\naddUnicodePackage({\n    L:  \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n    Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n    Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n    Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n    Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    M:  \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n    Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n    Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n    Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n    N:  \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n    No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n    P:  \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n    Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n    Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n    Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n    Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n    Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n    Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n    Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n    S:  \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n    Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n    Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n    Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n    So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n    Z:  \"002000A01680180E2000-200A20282029202F205F3000\",\n    Zs: \"002000A01680180E2000-200A202F205F3000\",\n    Zl: \"2028\",\n    Zp: \"2029\",\n    C:  \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n    Cc: \"0000-001F007F-009F\",\n    Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n    Co: \"E000-F8FF\",\n    Cs: \"D800-DFFF\",\n    Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n    var codePoint = /\\w{4}/g;\n    for (var name in pack)\n        exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n}\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Tokenizer = acequire(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = acequire(\"../unicode\");\nvar lang = acequire(\"../lib/lang\");\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../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(\"^[\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n    );\n\n    this.nonTokenRe = new RegExp(\"^(?:[^\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n    );\n\n    this.getTokenizer = function() {\n        if (!this.$tokenizer) {\n            this.$highlightRules = 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                return true;\n            };\n        }\n\n        function iter(fun) {\n            for (var i = startRow; i <= endRow; i++)\n                fun(doc.getLine(i), i);\n        }\n\n\n        var minEmptyLength = Infinity;\n        iter(function(line, i) {\n            var indent = line.search(/\\S/);\n            if (indent !== -1) {\n                if (indent < minIndent)\n                    minIndent = indent;\n                if (shouldRemove && !testRemove(line, i))\n                    shouldRemove = false;\n            } else if (minEmptyLength > line.length) {\n                minEmptyLength = line.length;\n            }\n        });\n\n        if (minIndent == Infinity) {\n            minIndent = minEmptyLength;\n            ignoreBlankLines = false;\n            shouldRemove = false;\n        }\n\n        if (insertAtTabStop && minIndent % tabSize != 0)\n            minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n        iter(shouldRemove ? uncomment : comment);\n    };\n\n    this.toggleBlockComment = function(state, session, range, cursor) {\n        var comment = this.blockComment;\n        if (!comment)\n            return;\n        if (!comment.start && comment[0])\n            comment = comment[0];\n\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        var token = iterator.getCurrentToken();\n\n        var sel = session.selection;\n        var initialRange = session.selection.toOrientedRange();\n        var startRow, colDiff;\n\n        if (token && /comment/.test(token.type)) {\n            var startRange, endRange;\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.start);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    startRange = new Range(row, column, row, column + comment.start.length);\n                    break;\n                }\n                token = iterator.stepBackward();\n            }\n\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.end);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    endRange = new Range(row, column, row, column + comment.end.length);\n                    break;\n                }\n                token = iterator.stepForward();\n            }\n            if (endRange)\n                session.remove(endRange);\n            if (startRange) {\n                session.remove(startRange);\n                startRow = startRange.start.row;\n                colDiff = -comment.start.length;\n            }\n        } else {\n            colDiff = comment.start.length;\n            startRow = range.start.row;\n            session.insert(range.end, comment.end);\n            session.insert(range.start, comment.start);\n        }\n        if (initialRange.start.row == startRow)\n            initialRange.start.column += colDiff;\n        if (initialRange.end.row == startRow)\n            initialRange.end.column += colDiff;\n        session.selection.fromOrientedRange(initialRange);\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.createModeDelegates = function (mapping) {\n        this.$embeds = [];\n        this.$modes = {};\n        for (var i in mapping) {\n            if (mapping[i]) {\n                this.$embeds.push(i);\n                this.$modes[i] = new mapping[i]();\n            }\n        }\n\n        var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n            \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n        for (var i = 0; i < delegations.length; i++) {\n            (function(scope) {\n              var functionName = delegations[i];\n              var defaultHandler = scope[functionName];\n              scope[delegations[i]] = function() {\n                  return this.$delegator(functionName, arguments, defaultHandler);\n              };\n            }(this));\n        }\n    };\n\n    this.$delegator = function(method, args, defaultHandler) {\n        var state = args[0];\n        if (typeof state != \"string\")\n            state = state[0];\n        for (var i = 0; i < this.$embeds.length; i++) {\n            if (!this.$modes[this.$embeds[i]]) continue;\n\n            var split = state.split(this.$embeds[i]);\n            if (!split[0] && split[1]) {\n                args[0] = split[1];\n                var mode = this.$modes[this.$embeds[i]];\n                return mode[method].apply(mode, args);\n            }\n        }\n        var ret = defaultHandler.apply(this, args);\n        return defaultHandler ? ret : undefined;\n    };\n\n    this.transformAction = function(state, action, editor, session, param) {\n        if (this.$behaviour) {\n            var behaviours = this.$behaviour.getBehaviours();\n            for (var key in behaviours) {\n                if (behaviours[key][action]) {\n                    var ret = behaviours[key][action].apply(this, arguments);\n                    if (ret) {\n                        return ret;\n                    }\n                }\n            }\n        }\n    };\n    \n    this.getKeywords = function(append) {\n        if (!this.completionKeywords) {\n            var rules = this.$tokenizer.rules;\n            var completionKeywords = [];\n            for (var rule in rules) {\n                var ruleItr = rules[rule];\n                for (var r = 0, l = ruleItr.length; r < l; r++) {\n                    if (typeof ruleItr[r].token === \"string\") {\n                        if (/keyword|support|storage/.test(ruleItr[r].token))\n                            completionKeywords.push(ruleItr[r].regex);\n                    }\n                    else if (typeof ruleItr[r].token === \"object\") {\n                        for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {    \n                            if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n                                var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n                                completionKeywords.push(rule.substr(1, rule.length - 2));\n                            }\n                        }\n                    }\n                }\n            }\n            this.completionKeywords = completionKeywords;\n        }\n        if (!append)\n            return this.$keywordList;\n        return completionKeywords.concat(this.$keywordList || []);\n    };\n    \n    this.$createKeywordList = function() {\n        if (!this.$highlightRules)\n            this.getTokenizer();\n        return this.$keywordList = this.$highlightRules.$keywordList || [];\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var keywords = this.$keywordList || this.$createKeywordList();\n        return keywords.map(function(word) {\n            return {\n                name: word,\n                value: word,\n                score: 0,\n                meta: \"keyword\"\n            };\n        });\n    };\n\n    this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(acequire, 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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./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.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar applyDelta = acequire(\"./apply_delta\").applyDelta;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./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        applyDelta(this.$lines, delta, doNotValidate);\n        this._signal(\"change\", delta);\n    };\n    \n    this.$splitAndapplyLargeDelta = function(delta, MAX) {\n        var lines = delta.lines;\n        var l = lines.length;\n        var row = delta.start.row; \n        var column = delta.start.column;\n        var from = 0, to = 0;\n        do {\n            from = to;\n            to += MAX - 1;\n            var chunk = lines.slice(from, to);\n            if (to > l) {\n                delta.lines = chunk;\n                delta.start.row = row + from;\n                delta.start.column = column;\n                break;\n            }\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        } while(true);\n    };\n    this.revertDelta = function(delta) {\n        this.applyDelta({\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: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./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(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./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(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../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(acequire, exports, module) {\n\"use strict\";\nvar Range = acequire(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n    this.ranges = [];\n};\n\n(function() {\n    this.comparePoints = comparePoints;\n\n    this.pointIndex = function(pos, excludeEdges, startIndex) {\n        var list = this.ranges;\n\n        for (var i = startIndex || 0; i < list.length; i++) {\n            var range = list[i];\n            var cmpEnd = comparePoints(pos, range.end);\n            if (cmpEnd > 0)\n                continue;\n            var cmpStart = comparePoints(pos, range.start);\n            if (cmpEnd === 0)\n                return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n            if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n                return i;\n\n            return -i-1;\n        }\n        return -i - 1;\n    };\n\n    this.add = function(range) {\n        var excludeEdges = !range.isEmpty();\n        var startIndex = this.pointIndex(range.start, excludeEdges);\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n\n        var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n        else\n            endIndex++;\n        return this.ranges.splice(startIndex, endIndex - startIndex, range);\n    };\n\n    this.addList = function(list) {\n        var removed = [];\n        for (var i = list.length; i--; ) {\n            removed.push.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        if (delta.action == \"insert\"){\n            var start = delta.start;\n            var end = delta.end;\n        } else {\n            var end = delta.start;\n            var start = delta.end;\n        }\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n\n        var colDiff = -start.column + end.column;\n        var ranges = this.ranges;\n\n        for (var i = 0, n = ranges.length; i < n; i++) {\n            var r = ranges[i];\n            if (r.end.row < startRow)\n                continue;\n            if (r.start.row > startRow)\n                break;\n\n            if (r.start.row == startRow && r.start.column >= start.column ) {\n                if (r.start.column == start.column && this.$insertRight) {\n                } else {\n                    r.start.column += colDiff;\n                    r.start.row += lineDif;\n                }\n            }\n            if (r.end.row == startRow && r.end.column >= start.column) {\n                if (r.end.column == start.column && this.$insertRight) {\n                    continue;\n                }\n                if (r.end.column == start.column && colDiff > 0 && i < n - 1) {                \n                    if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n                        r.end.column -= colDiff;\n                }\n                r.end.column += colDiff;\n                r.end.row += lineDif;\n            }\n        }\n\n        if (lineDif != 0 && i < n) {\n            for (; i < n; i++) {\n                var r = ranges[i];\n                r.start.row += lineDif;\n                r.end.row += lineDif;\n            }\n        }\n    };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar RangeList = acequire(\"../range_list\").RangeList;\nvar oop = acequire(\"../lib/oop\");\nvar Fold = exports.Fold = function(range, placeholder) {\n    this.foldLine = null;\n    this.placeholder = placeholder;\n    this.range = range;\n    this.start = range.start;\n    this.end = range.end;\n\n    this.sameRow = range.start.row == range.end.row;\n    this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n    this.toString = function() {\n        return '\"' + this.placeholder + '\" ' + this.range.toString();\n    };\n\n    this.setFoldLine = function(foldLine) {\n        this.foldLine = foldLine;\n        this.subFolds.forEach(function(fold) {\n            fold.setFoldLine(foldLine);\n        });\n    };\n\n    this.clone = function() {\n        var range = this.range.clone();\n        var fold = new Fold(range, this.placeholder);\n        this.subFolds.forEach(function(subFold) {\n            fold.subFolds.push(subFold.clone());\n        });\n        fold.collapseChildren = this.collapseChildren;\n        return fold;\n    };\n\n    this.addSubFold = function(fold) {\n        if (this.range.isEqual(fold))\n            return;\n\n        if (!this.range.containsRange(fold))\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n        consumeRange(fold, this.start);\n\n        var row = fold.start.row, column = fold.start.column;\n        for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n            cmp = this.subFolds[i].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterStart = this.subFolds[i];\n\n        if (cmp == 0)\n            return afterStart.addSubFold(fold);\n        var row = fold.range.end.row, column = fold.range.end.column;\n        for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n            cmp = this.subFolds[j].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterEnd = this.subFolds[j];\n\n        if (cmp == 0)\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n        var consumedFolds = this.subFolds.splice(i, j - i, fold);\n        fold.setFoldLine(this.foldLine);\n\n        return fold;\n    };\n    \n    this.restoreRange = function(range) {\n        return restoreRange(range, this.start);\n    };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n    point.row -= anchor.row;\n    if (point.row == 0)\n        point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n    consumePoint(range.start, anchor);\n    consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n    if (point.row == 0)\n        point.column += anchor.column;\n    point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n    restorePoint(range.start, anchor);\n    restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar FoldLine = acequire(\"./fold_line\").FoldLine;\nvar Fold = acequire(\"./fold\").Fold;\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n    this.getFoldAt = function(row, column, side) {\n        var foldLine = this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var folds = foldLine.folds;\n        for (var i = 0; i < folds.length; i++) {\n            var fold = folds[i];\n            if (fold.range.contains(row, column)) {\n                if (side == 1 && fold.range.isEnd(row, column)) {\n                    continue;\n                } else if (side == -1 && fold.range.isStart(row, column)) {\n                    continue;\n                }\n                return fold;\n            }\n        }\n    };\n    this.getFoldsInRange = function(range) {\n        var start = range.start;\n        var end = range.end;\n        var foldLines = this.$foldData;\n        var foundFolds = [];\n\n        start.column += 1;\n        end.column -= 1;\n\n        for (var i = 0; i < foldLines.length; i++) {\n            var cmp = foldLines[i].range.compareRange(range);\n            if (cmp == 2) {\n                continue;\n            }\n            else if (cmp == -2) {\n                break;\n            }\n\n            var folds = foldLines[i].folds;\n            for (var j = 0; j < folds.length; j++) {\n                var fold = folds[j];\n                cmp = fold.range.compareRange(range);\n                if (cmp == -2) {\n                    break;\n                } else if (cmp == 2) {\n                    continue;\n                } else\n                if (cmp == 42) {\n                    break;\n                }\n                foundFolds.push(fold);\n            }\n        }\n        start.column -= 1;\n        end.column += 1;\n\n        return foundFolds;\n    };\n\n    this.getFoldsInRangeList = function(ranges) {\n        if (Array.isArray(ranges)) {\n            var folds = [];\n            ranges.forEach(function(range) {\n                folds = folds.concat(this.getFoldsInRange(range));\n            }, this);\n        } else {\n            var folds = this.getFoldsInRange(ranges);\n        }\n        return folds;\n    };\n    this.getAllFolds = function() {\n        var folds = [];\n        var foldLines = this.$foldData;\n        \n        for (var i = 0; i < foldLines.length; i++)\n            for (var j = 0; j < foldLines[i].folds.length; j++)\n                folds.push(foldLines[i].folds[j]);\n\n        return folds;\n    };\n    this.getFoldStringAt = function(row, column, trim, foldLine) {\n        foldLine = foldLine || this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var lastFold = {\n            end: { column: 0 }\n        };\n        var str, fold;\n        for (var i = 0; i < foldLine.folds.length; i++) {\n            fold = foldLine.folds[i];\n            var cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                str = this\n                    .getLine(fold.start.row)\n                    .substring(lastFold.end.column, fold.start.column);\n                break;\n            }\n            else if (cmp === 0) {\n                return null;\n            }\n            lastFold = fold;\n        }\n        if (!str)\n            str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n        if (trim == -1)\n            return str.substring(0, column - lastFold.end.column);\n        else if (trim == 1)\n            return str.substring(column - lastFold.end.column);\n        else\n            return str;\n    };\n\n    this.getFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n                return foldLine;\n            } else if (foldLine.end.row > docRow) {\n                return null;\n            }\n        }\n        return null;\n    };\n    this.getNextFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.end.row >= docRow) {\n                return foldLine;\n            }\n        }\n        return null;\n    };\n\n    this.getFoldedRowCount = function(first, last) {\n        var foldData = this.$foldData, rowCount = last-first+1;\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i],\n                end = foldLine.end.row,\n                start = foldLine.start.row;\n            if (end >= last) {\n                if (start < last) {\n                    if (start >= first)\n                        rowCount -= last-start;\n                    else\n                        rowCount = 0; // in one fold\n                }\n                break;\n            } else if (end >= first){\n                if (start >= first) // fold inside range\n                    rowCount -=  end-start;\n                else\n                    rowCount -=  end-first+1;\n            }\n        }\n        return rowCount;\n    };\n\n    this.$addFoldLine = function(foldLine) {\n        this.$foldData.push(foldLine);\n        this.$foldData.sort(function(a, b) {\n            return a.start.row - b.start.row;\n        });\n        return foldLine;\n    };\n    this.addFold = function(placeholder, range) {\n        var foldData = this.$foldData;\n        var added = false;\n        var fold;\n        \n        if (placeholder instanceof Fold)\n            fold = placeholder;\n        else {\n            fold = new Fold(range, placeholder);\n            fold.collapseChildren = range.collapseChildren;\n        }\n        this.$clipRangeToDocument(fold.range);\n\n        var startRow = fold.start.row;\n        var startColumn = fold.start.column;\n        var endRow = fold.end.row;\n        var endColumn = fold.end.column;\n        if (!(startRow < endRow || \n            startRow == endRow && startColumn <= endColumn - 2))\n            throw new Error(\"The range has to be at least 2 characters width\");\n\n        var startFold = this.getFoldAt(startRow, startColumn, 1);\n        var endFold = this.getFoldAt(endRow, endColumn, -1);\n        if (startFold && endFold == startFold)\n            return startFold.addSubFold(fold);\n\n        if (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            folds.forEach(function(subFold) {\n                fold.addSubFold(subFold);\n            });\n        }\n\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (endRow == foldLine.start.row) {\n                foldLine.addFold(fold);\n                added = true;\n                break;\n            } else if (startRow == foldLine.end.row) {\n                foldLine.addFold(fold);\n                added = true;\n                if (!fold.sameRow) {\n                    var foldLineNext = foldData[i + 1];\n                    if (foldLineNext && foldLineNext.start.row == endRow) {\n                        foldLine.merge(foldLineNext);\n                        break;\n                    }\n                }\n                break;\n            } else if (endRow <= foldLine.start.row) {\n                break;\n            }\n        }\n\n        if (!added)\n            foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n        if (this.$useWrapMode)\n            this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n        else\n            this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n        this.$modified = true;\n        this._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            expandInner = true;\n        } else if (typeof location == \"number\")\n            range = new Range(location, 0, location, this.getLine(location).length);\n        else if (\"row\" in location)\n            range = Range.fromPoints(location, location);\n        else\n            range = location;\n        \n        folds = this.getFoldsInRangeList(range);\n        if (expandInner) {\n            this.removeFolds(folds);\n        } else {\n            var subFolds = folds;\n            while (subFolds.length) {\n                this.expandFolds(subFolds);\n                subFolds = this.getFoldsInRangeList(range);\n            }\n        }\n        if (folds.length)\n            return folds;\n    };\n    this.isRowFolded = function(docRow, startFoldRow) {\n        return !!this.getFoldLine(docRow, startFoldRow);\n    };\n\n    this.getRowFoldEnd = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.end.row : docRow;\n    };\n\n    this.getRowFoldStart = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.start.row : docRow;\n    };\n\n    this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n        if (startRow == null)\n            startRow = foldLine.start.row;\n        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.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) {\n        if (depth == undefined)\n            depth = 100000; // JSON.stringify doesn't hanle Infinity\n        var foldWidgets = this.foldWidgets;\n        if (!foldWidgets)\n            return; // mode doesn't support folding\n        endRow = endRow || this.getLength();\n        startRow = startRow || 0;\n        for (var row = startRow; row < endRow; row++) {\n            if (foldWidgets[row] == null)\n                foldWidgets[row] = this.getFoldWidget(row);\n            if (foldWidgets[row] != \"start\")\n                continue;\n\n            var range = this.getFoldWidgetRange(row);\n            if (range && range.isMultiLine()\n                && range.end.row <= endRow\n                && range.start.row >= startRow\n            ) {\n                row = range.end.row;\n                try {\n                    var fold = this.addFold(\"...\", range);\n                    if (fold)\n                        fold.collapseChildren = depth;\n                } catch(e) {}\n            }\n        }\n    };\n    this.$foldStyles = {\n        \"manual\": 1,\n        \"markbegin\": 1,\n        \"markbeginend\": 1\n    };\n    this.$foldStyle = \"markbegin\";\n    this.setFoldStyle = function(style) {\n        if (!this.$foldStyles[style])\n            throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n        \n        if (this.$foldStyle == style)\n            return;\n\n        this.$foldStyle = style;\n        \n        if (style == \"manual\")\n            this.unfold();\n        var mode = this.$foldMode;\n        this.$setFolding(null);\n        this.$setFolding(mode);\n    };\n\n    this.$setFolding = function(foldMode) {\n        if (this.$foldMode == foldMode)\n            return;\n            \n        this.$foldMode = foldMode;\n        \n        this.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(acequire, exports, module) {\n\"use strict\";\n\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n    this.findMatchingBracket = function(position, chr) {\n        if (position.column == 0) return null;\n\n        var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n        if (charBeforeCursor == \"\") return null;\n\n        var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match)\n            return null;\n\n        if (match[1])\n            return this.$findClosingBracket(match[1], position);\n        else\n            return this.$findOpeningBracket(match[2], position);\n    };\n    \n    this.getBracketRange = function(pos) {\n        var line = this.getLine(pos.row);\n        var before = true, range;\n\n        var chr = line.charAt(pos.column-1);\n        var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match) {\n            chr = line.charAt(pos.column);\n            pos = {row: pos.row, column: pos.column + 1};\n            match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n            before = false;\n        }\n        if (!match)\n            return null;\n\n        if (match[1]) {\n            var bracketPos = this.$findClosingBracket(match[1], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(pos, bracketPos);\n            if (!before) {\n                range.end.column++;\n                range.start.column--;\n            }\n            range.cursor = range.end;\n        } else {\n            var bracketPos = this.$findOpeningBracket(match[2], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(bracketPos, pos);\n            if (!before) {\n                range.start.column++;\n                range.end.column--;\n            }\n            range.cursor = range.start;\n        }\n        \n        return range;\n    };\n\n    this.$brackets = {\n        \")\": \"(\",\n        \"(\": \")\",\n        \"]\": \"[\",\n        \"[\": \"]\",\n        \"{\": \"}\",\n        \"}\": \"{\"\n    };\n\n    this.$findOpeningBracket = function(bracket, position, typeRe) {\n        var openBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n        \n         if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n                    .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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar BidiHandler = acequire(\"./bidihandler\").BidiHandler;\nvar config = acequire(\"./config\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Selection = acequire(\"./selection\").Selection;\nvar TextMode = acequire(\"./mode/text\").Mode;\nvar Range = acequire(\"./range\").Range;\nvar Document = acequire(\"./document\").Document;\nvar BackgroundTokenizer = acequire(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = acequire(\"./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.$bidiHandler = new BidiHandler(this);\n    this.setDocument(text);\n    this.selection = new Selection(this);\n\n    config.resetOptions(this);\n    this.setMode(mode);\n    config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setDocument = function(doc) {\n        if (this.doc)\n            this.doc.removeListener(\"change\", this.$onChange);\n\n        this.doc = doc;\n        doc.on(\"change\", this.$onChange);\n\n        if (this.bgTokenizer)\n            this.bgTokenizer.setDocument(this.getDocument());\n\n        this.resetCaches();\n    };\n    this.getDocument = function() {\n        return this.doc;\n    };\n    this.$resetRowCache = function(docRow) {\n        if (!docRow) {\n            this.$docRowCache = [];\n            this.$screenRowCache = [];\n            return;\n        }\n        var l = this.$docRowCache.length;\n        var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n        if (l > i) {\n            this.$docRowCache.splice(i, l);\n            this.$screenRowCache.splice(i, l);\n        }\n    };\n\n    this.$getRowCacheIndex = function(cacheArray, val) {\n        var low = 0;\n        var hi = cacheArray.length - 1;\n\n        while (low <= hi) {\n            var mid = (low + hi) >> 1;\n            var c = cacheArray[mid];\n\n            if (val > c)\n                low = mid + 1;\n            else if (val < c)\n                hi = mid - 1;\n            else\n                return mid;\n        }\n\n        return low -1;\n    };\n\n    this.resetCaches = function() {\n        this.$modified = true;\n        this.$wrapData = [];\n        this.$rowLengthCache = [];\n        this.$resetRowCache(0);\n        if (this.bgTokenizer)\n            this.bgTokenizer.start(0);\n    };\n\n    this.onChangeFold = function(e) {\n        var fold = e.data;\n        this.$resetRowCache(fold.start.row);\n    };\n\n    this.onChange = function(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 && !delta.ignore) {\n            this.$deltasDoc.push(delta);\n            if (removedFolds && removedFolds.length != 0) {\n                this.$deltasFold.push({\n                    action: \"removeFolds\",\n                    folds:  removedFolds\n                });\n            }\n\n            this.$informUndoManager.schedule();\n        }\n\n        this.bgTokenizer && 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.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n        this.setUndoManager(this.$undoManager);\n        this.getUndoManager().reset();\n    };\n    this.getValue =\n    this.toString = function() {\n        return this.doc.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.getState = function(row) {\n        return this.bgTokenizer.getState(row);\n    };\n    this.getTokens = function(row) {\n        return this.bgTokenizer.getTokens(row);\n    };\n    this.getTokenAt = function(row, column) {\n        var tokens = this.bgTokenizer.getTokens(row);\n        var token, c = 0;\n        if (column == null) {\n            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        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n\n        if (this.$informUndoManager)\n            this.$informUndoManager.cancel();\n\n        if (undoManager) {\n            var self = this;\n\n            this.$syncInformUndoManager = function() {\n                self.$informUndoManager.cancel();\n\n                if (self.$deltasFold.length) {\n                    self.$deltas.push({\n                        group: \"fold\",\n                        deltas: self.$deltasFold\n                    });\n                    self.$deltasFold = [];\n                }\n\n                if (self.$deltasDoc.length) {\n                    self.$deltas.push({\n                        group: \"doc\",\n                        deltas: self.$deltasDoc\n                    });\n                    self.$deltasDoc = [];\n                }\n\n                if (self.$deltas.length > 0) {\n                    undoManager.execute({\n                        action: \"aceupdate\",\n                        args: [self.$deltas, self],\n                        merge: self.mergeUndoDeltas\n                    });\n                }\n                self.mergeUndoDeltas = false;\n                self.$deltas = [];\n            };\n            this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n        }\n    };\n    this.markUndoGroup = function() {\n        if (this.$syncInformUndoManager)\n            this.$syncInformUndoManager();\n    };\n    \n    this.$defaultUndoManager = {\n        undo: function() {},\n        redo: function() {},\n        reset: function() {}\n    };\n    this.getUndoManager = function() {\n        return this.$undoManager || this.$defaultUndoManager;\n    };\n    this.getTabString = function() {\n        if (this.getUseSoftTabs()) {\n            return lang.stringRepeat(\" \", this.getTabSize());\n        } else {\n            return \"\\t\";\n        }\n    };\n    this.setUseSoftTabs = function(val) {\n        this.setOption(\"useSoftTabs\", val);\n    };\n    this.getUseSoftTabs = function() {\n        return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n    };\n    this.setTabSize = function(tabSize) {\n        this.setOption(\"tabSize\", tabSize);\n    };\n    this.getTabSize = function() {\n        return this.$tabSize;\n    };\n    this.isTabStop = function(position) {\n        return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n    };\n    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        if (marker) {\n            delete (markers[markerId]);\n            this._signal(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n        }\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 = {};\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        this.$mode = mode;\n\n        this.$stopWorker();\n\n        if (this.$useWorker)\n            this.$startWorker();\n\n        var tokenizer = mode.getTokenizer();\n\n        if(tokenizer.addEventListener !== undefined) {\n            var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n            tokenizer.addEventListener(\"update\", onReloadTokenizer);\n        }\n\n        if (!this.bgTokenizer) {\n            this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n            var _self = this;\n            this.bgTokenizer.addEventListener(\"update\", function(e) {\n                _self._signal(\"tokenizerUpdate\", e);\n            });\n        } else {\n            this.bgTokenizer.setTokenizer(tokenizer);\n        }\n\n        this.bgTokenizer.setDocument(this.getDocument());\n\n        this.tokenRe = mode.tokenRe;\n        this.nonTokenRe = mode.nonTokenRe;\n\n        \n        if (!$isPlaceholder) {\n            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\");\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        var lastUndoRange = null;\n        for (var i = deltas.length - 1; i != -1; i--) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.revertDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n            } else {\n                delta.deltas.forEach(function(foldDelta) {\n                    this.addFolds(foldDelta.folds);\n                }, this);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.redoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = 0; i < deltas.length; i++) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.applyDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.setUndoSelect = function(enable) {\n        this.$undoSelect = enable;\n    };\n\n    this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n        function isInsert(delta) {\n            return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n        }\n\n        var delta = deltas[0];\n        var range, point;\n        var lastDeltaIsInsert = false;\n        if (isInsert(delta)) {\n            range = Range.fromPoints(delta.start, delta.end);\n            lastDeltaIsInsert = true;\n        } else {\n            range = Range.fromPoints(delta.start, delta.start);\n            lastDeltaIsInsert = false;\n        }\n\n        for (var i = 1; i < deltas.length; i++) {\n            delta = deltas[i];\n            if (isInsert(delta)) {\n                point = delta.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                lastDeltaIsInsert = true;\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                lastDeltaIsInsert = false;\n            }\n        }\n        if (lastUndoRange != null) {\n            if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n                lastUndoRange.start.column += range.end.column - range.start.column;\n                lastUndoRange.end.column += range.end.column - range.start.column;\n            }\n\n            var cmp = lastUndoRange.compareRange(range);\n            if (cmp == 1) {\n                range.setStart(lastUndoRange.start);\n            } else if (cmp == -1) {\n                range.setEnd(lastUndoRange.end);\n            }\n        }\n\n        return range;\n    };\n    this.replace = function(range, text) {\n        return this.doc.replace(range, text);\n    };\n    this.moveText = function(fromRange, toPosition, copy) {\n        var text = this.getTextRange(fromRange);\n        var folds = this.getFoldsInRange(fromRange);\n\n        var toRange = Range.fromPoints(toPosition, toPosition);\n        if (!copy) {\n            this.remove(fromRange);\n            var rowDiff = fromRange.start.row - fromRange.end.row;\n            var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n            if (collDiff) {\n                if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n                    toRange.start.column += collDiff;\n                if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n                    toRange.end.column += collDiff;\n            }\n            if (rowDiff && toRange.start.row >= fromRange.end.row) {\n                toRange.start.row += rowDiff;\n                toRange.end.row += rowDiff;\n            }\n        }\n\n        toRange.end = this.insert(toRange.start, text);\n        if (folds.length) {\n            var oldStart = fromRange.start;\n            var newStart = toRange.start;\n            var rowDiff = newStart.row - oldStart.row;\n            var collDiff = newStart.column - oldStart.column;\n            this.addFolds(folds.map(function(x) {\n                x = x.clone();\n                if (x.start.row == oldStart.row)\n                    x.start.column += collDiff;\n                if (x.end.row == oldStart.row)\n                    x.end.column += collDiff;\n                x.start.row += rowDiff;\n                x.end.row += rowDiff;\n                return x;\n            }));\n        }\n\n        return toRange;\n    };\n    this.indentRows = function(startRow, endRow, indentString) {\n        indentString = indentString.replace(/\\t/g, this.getTabString());\n        for (var row=startRow; row<=endRow; row++)\n            this.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 displayed = tokens.slice(lastSplit, screenPos);\n            var len = displayed.length;\n            displayed.join(\"\")\n                .replace(/12/g, function() {\n                    len -= 1;\n                })\n                .replace(/2/g, function() {\n                    len -= 1;\n                });\n\n            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        if (this.lineWidgets)\n            var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n        else \n            h = 0;\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1 + h;\n        } else {\n            return this.$wrapData[row].length + 1 + h;\n        }\n    };\n    this.getRowLineCount = function(row) {\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1;\n        } else {\n            return this.$wrapData[row].length + 1;\n        }\n    };\n\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;\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        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    };\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\nacequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nacequire(\"./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.$modified = true;\n                    this.$resetRowCache(0);\n                    this.$updateWrapData(0, this.getLength() - 1);\n                }\n            }\n        },\n        initialValue: \"auto\"\n    },\n    indentedSoftWrap: { initialValue: true },\n    firstLineNumber: {\n        set: function() {this._signal(\"changeBreakpoint\");},\n        initialValue: 1\n    },\n    useWorker: {\n        set: function(useWorker) {\n            this.$useWorker = useWorker;\n\n            this.$stopWorker();\n            if (useWorker)\n                this.$startWorker();\n        },\n        initialValue: true\n    },\n    useSoftTabs: {initialValue: true},\n    tabSize: {\n        set: function(tabSize) {\n            if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n            this.$modified = true;\n            this.$rowLengthCache = [];\n            this.$tabSize = tabSize;\n            this._signal(\"changeTabSize\");\n        },\n        initialValue: 4,\n        handlesSet: true\n    },\n    navigateWithinSoftTabs: {initialValue: false},\n    overwrite: {\n        set: function(val) {this._signal(\"changeOverwrite\");},\n        initialValue: false\n    },\n    newLineMode: {\n        set: function(val) {this.doc.setNewLineMode(val);},\n        get: function() {return this.doc.getNewLineMode();},\n        handlesSet: true\n    },\n    mode: {\n        set: function(val) { this.setMode(val); },\n        get: function() { return this.$modeId; }\n    }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./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) 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 m;\n                var last = startIndex;\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(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil = acequire(\"../lib/keys\");\nvar useragent = acequire(\"../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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar MultiHashHandler = acequire(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = acequire(\"../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 (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.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n            if (!this.macro.length)\n                this.macro = this.oldMacro;\n\n            return this.recording = false;\n        }\n        if (!this.$addCommandToMacro) {\n            this.$addCommandToMacro = function(e) {\n                this.macro.push([e.command, e.args]);\n            }.bind(this);\n        }\n\n        this.oldMacro = this.macro;\n        this.macro = [];\n        this.on(\"exec\", this.$addCommandToMacro);\n        return this.recording = true;\n    };\n\n    this.replay = function(editor) {\n        if (this.$inReplay || !this.macro)\n            return;\n\n        if (this.recording)\n            return this.toggleRecording(editor);\n\n        try {\n            this.$inReplay = true;\n            this.macro.forEach(function(x) {\n                if (typeof x == \"string\")\n                    this.exec(x, editor);\n                else\n                    this.exec(x[0], editor, x[1]);\n            }, this);\n        } finally {\n            this.$inReplay = false;\n        }\n    };\n\n    this.trimMacro = function(m) {\n        return m.map(function(x){\n            if (typeof x[0] != \"string\")\n                x[0] = x[0].name;\n            if (!x[1])\n                x = x[0];\n            return x;\n        });\n    };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\nvar config = acequire(\"../config\");\nvar Range = acequire(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n    return {win: win, mac: mac};\n}\nexports.commands = [{\n    name: \"showSettingsMenu\",\n    bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/settings_menu\", function(module) {\n            module.init(editor);\n            editor.showSettingsMenu();\n        });\n    },\n    readOnly: true\n}, {\n    name: \"goToNextError\",\n    bindKey: bindKey(\"Alt-E\", \"F4\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/error_marker\", function(module) {\n            module.showErrorMarker(editor, 1);\n        });\n    },\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"goToPreviousError\",\n    bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/error_marker\", function(module) {\n            module.showErrorMarker(editor, -1);\n        });\n    },\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"selectall\",\n    bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n    exec: function(editor) { editor.selectAll(); },\n    readOnly: true\n}, {\n    name: \"centerselection\",\n    bindKey: bindKey(null, \"Ctrl-L\"),\n    exec: function(editor) { editor.centerSelection(); },\n    readOnly: true\n}, {\n    name: \"gotoline\",\n    bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n    exec: function(editor) {\n        var line = parseInt(prompt(\"Enter line number:\"), 10);\n        if (!isNaN(line)) {\n            editor.gotoLine(line);\n        }\n    },\n    readOnly: true\n}, {\n    name: \"fold\",\n    bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n    exec: function(editor) { editor.session.toggleFold(false); },\n    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    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    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    bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n    exec: function(editor) { editor.session.foldAll(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldOther\",\n    bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n    exec: function(editor) { \n        editor.session.foldAll();\n        editor.session.unfold(editor.selection.getAllRanges());\n    },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfoldall\",\n    bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n    exec: function(editor) { editor.session.unfold(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findnext\",\n    bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n    exec: function(editor) { editor.findNext(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findprevious\",\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    bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n    exec: function(editor) {\n        if (editor.selection.isEmpty())\n            editor.selection.selectWord();\n        else\n            editor.findNext(); \n    },\n    readOnly: true\n}, {\n    name: \"selectOrFindPrevious\",\n    bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n    exec: function(editor) { \n        if (editor.selection.isEmpty())\n            editor.selection.selectWord();\n        else\n            editor.findPrevious();\n    },\n    readOnly: true\n}, {\n    name: \"find\",\n    bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor);});\n    },\n    readOnly: true\n}, {\n    name: \"overwrite\",\n    bindKey: \"Insert\",\n    exec: function(editor) { editor.toggleOverwrite(); },\n    readOnly: true\n}, {\n    name: \"selecttostart\",\n    bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"gotostart\",\n    bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n    exec: function(editor) { editor.navigateFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"selectup\",\n    bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n    exec: function(editor) { editor.getSelection().selectUp(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"golineup\",\n    bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n    exec: function(editor, args) { editor.navigateUp(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttoend\",\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    bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n    exec: function(editor) { editor.navigateFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"selectdown\",\n    bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n    exec: function(editor) { editor.getSelection().selectDown(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"golinedown\",\n    bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n    exec: function(editor, args) { editor.navigateDown(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectwordleft\",\n    bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotowordleft\",\n    bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n    exec: function(editor) { editor.navigateWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttolinestart\",\n    bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotolinestart\",\n    bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n    exec: function(editor) { editor.navigateLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectleft\",\n    bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n    exec: function(editor) { editor.getSelection().selectLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotoleft\",\n    bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n    exec: function(editor, args) { editor.navigateLeft(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectwordright\",\n    bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotowordright\",\n    bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n    exec: function(editor) { editor.navigateWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttolineend\",\n    bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|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    bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n    exec: function(editor) { editor.navigateLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectright\",\n    bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotoright\",\n    bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n    exec: function(editor, args) { editor.navigateRight(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectpagedown\",\n    bindKey: \"Shift-PageDown\",\n    exec: function(editor) { editor.selectPageDown(); },\n    readOnly: true\n}, {\n    name: \"pagedown\",\n    bindKey: bindKey(null, \"Option-PageDown\"),\n    exec: function(editor) { editor.scrollPageDown(); },\n    readOnly: true\n}, {\n    name: \"gotopagedown\",\n    bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n    exec: function(editor) { editor.gotoPageDown(); },\n    readOnly: true\n}, {\n    name: \"selectpageup\",\n    bindKey: \"Shift-PageUp\",\n    exec: function(editor) { editor.selectPageUp(); },\n    readOnly: true\n}, {\n    name: \"pageup\",\n    bindKey: bindKey(null, \"Option-PageUp\"),\n    exec: function(editor) { editor.scrollPageUp(); },\n    readOnly: true\n}, {\n    name: \"gotopageup\",\n    bindKey: \"PageUp\",\n    exec: function(editor) { editor.gotoPageUp(); },\n    readOnly: true\n}, {\n    name: \"scrollup\",\n    bindKey: bindKey(\"Ctrl-Up\", null),\n    exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"scrolldown\",\n    bindKey: bindKey(\"Ctrl-Down\", null),\n    exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"selectlinestart\",\n    bindKey: \"Shift-Home\",\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectlineend\",\n    bindKey: \"Shift-End\",\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"togglerecording\",\n    bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n    exec: function(editor) { editor.commands.toggleRecording(editor); },\n    readOnly: true\n}, {\n    name: \"replaymacro\",\n    bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n    exec: function(editor) { editor.commands.replay(editor); },\n    readOnly: true\n}, {\n    name: \"jumptomatching\",\n    bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n    exec: function(editor) { editor.jumpToMatching(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"selecttomatching\",\n    bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n    exec: function(editor) { editor.jumpToMatching(true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"expandToMatching\",\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    bindKey: bindKey(null, null),\n    exec: function() {},\n    passEvent: true,\n    readOnly: true\n}, {\n    name: \"copy\",\n    exec: function(editor) {\n    },\n    readOnly: true\n},\n{\n    name: \"cut\",\n    exec: function(editor) {\n        var range = editor.getSelectionRange();\n        editor._emit(\"cut\", range);\n\n        if (!editor.selection.isEmpty()) {\n            editor.session.remove(range);\n            editor.clearSelection();\n        }\n    },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"paste\",\n    exec: function(editor, args) {\n        editor.$handlePaste(args);\n    },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removeline\",\n    bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n    exec: function(editor) { editor.removeLines(); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"duplicateSelection\",\n    bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n    exec: function(editor) { editor.duplicateSelection(); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"sortlines\",\n    bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n    exec: function(editor) { editor.sortLines(); },\n    scrollIntoView: \"selection\",\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"togglecomment\",\n    bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n    exec: function(editor) { editor.toggleCommentLines(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"toggleBlockComment\",\n    bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n    exec: function(editor) { editor.toggleBlockComment(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"modifyNumberUp\",\n    bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n    exec: function(editor) { editor.modifyNumber(1); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"modifyNumberDown\",\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    bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true);});\n    }\n}, {\n    name: \"undo\",\n    bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n    exec: function(editor) { editor.undo(); }\n}, {\n    name: \"redo\",\n    bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n    exec: function(editor) { editor.redo(); }\n}, {\n    name: \"copylinesup\",\n    bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n    exec: function(editor) { editor.copyLinesUp(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"movelinesup\",\n    bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n    exec: function(editor) { editor.moveLinesUp(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"copylinesdown\",\n    bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n    exec: function(editor) { editor.copyLinesDown(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"movelinesdown\",\n    bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n    exec: function(editor) { editor.moveLinesDown(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"del\",\n    bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n    exec: function(editor) { editor.remove(\"right\"); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"backspace\",\n    bindKey: bindKey(\n        \"Shift-Backspace|Backspace\",\n        \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n    ),\n    exec: function(editor) { editor.remove(\"left\"); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"cut_or_delete\",\n    bindKey: bindKey(\"Shift-Delete\", null),\n    exec: function(editor) { \n        if (editor.selection.isEmpty()) {\n            editor.remove(\"left\");\n        } else {\n            return false;\n        }\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolinestart\",\n    bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n    exec: function(editor) { editor.removeToLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolineend\",\n    bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n    exec: function(editor) { editor.removeToLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolinestarthard\",\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    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    bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n    exec: function(editor) { editor.removeWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removewordright\",\n    bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n    exec: function(editor) { editor.removeWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"outdent\",\n    bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"indent\",\n    bindKey: bindKey(\"Tab\", \"Tab\"),\n    exec: function(editor) { editor.indent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockoutdent\",\n    bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockindent\",\n    bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n    exec: function(editor) { editor.blockIndent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"insertstring\",\n    exec: function(editor, str) { editor.insert(str); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"inserttext\",\n    exec: function(editor, args) {\n        editor.insert(lang.stringRepeat(args.text  || \"\", args.times || 1));\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"splitline\",\n    bindKey: bindKey(null, \"Ctrl-O\"),\n    exec: function(editor) { editor.splitLine(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"transposeletters\",\n    bindKey: bindKey(\"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    bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n    exec: function(editor) { editor.toUpperCase(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"tolowercase\",\n    bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n    exec: function(editor) { editor.toLowerCase(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"expandtoline\",\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    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    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\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\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar TextInput = acequire(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = acequire(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = acequire(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = acequire(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar Search = acequire(\"./search\").Search;\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = acequire(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = acequire(\"./commands/default_commands\").commands;\nvar config = acequire(\"./config\");\nvar TokenIterator = acequire(\"./token_iterator\").TokenIterator;\nvar Editor = function(renderer, session) {\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.$blockScrolling = 0;\n    this.$search = new Search().set({\n        wrap: true\n    });\n\n    this.$historyTracker = this.$historyTracker.bind(this);\n    this.commands.on(\"exec\", this.$historyTracker);\n\n    this.$initOperationListeners();\n    \n    this._$emitInputEvent = lang.delayedCall(function() {\n        this._signal(\"input\", {});\n        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 || new EditSession(\"\"));\n    config.resetOptions(this);\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        function last(a) {return a[a.length - 1];}\n\n        this.selections = [];\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));\n\n        this.on(\"change\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.docChanged = true;\n        }.bind(this), true);\n\n        this.on(\"changeSelection\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.selectionChanged = true;\n        }.bind(this), true);\n    };\n\n    this.curOp = null;\n    this.prevOp = {};\n    this.startOperation = function(commadEvent) {\n        if (this.curOp) {\n            if (!commadEvent || this.curOp.command)\n                return;\n            this.prevOp = this.curOp;\n        }\n        if (!commadEvent) {\n            this.previousCommand = null;\n            commadEvent = {};\n        }\n\n        this.$opResetTimer.schedule();\n        this.curOp = {\n            command: commadEvent.command || {},\n            args: commadEvent.args,\n            scrollTop: this.renderer.scrollTop\n        };\n        if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\n            this.$blockScrolling++;\n    };\n\n    this.endOperation = function(e) {\n        if (this.curOp) {\n            if (e && e.returnValue === false)\n                return this.curOp = null;\n            this._signal(\"beforeEndOperation\");\n            var command = this.curOp.command;\n            if (command.name && this.$blockScrolling > 0)\n                this.$blockScrolling--;\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            \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\") {\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.$blockScrolling += 1;\n            this.onCursorChange();\n            this.$blockScrolling -= 1;\n    \n            this.onScrollTopChange();\n            this.onScrollLeftChange();\n            this.onSelectionChange();\n            this.onChangeFrontMarker();\n            this.onChangeBackMarker();\n            this.onChangeBreakpoint();\n            this.onChangeAnnotation();\n            this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n            this.renderer.updateFull();\n        } 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.session.$bracketHighlight) {\n            this.session.removeMarker(this.session.$bracketHighlight);\n            this.session.$bracketHighlight = null;\n        }\n\n        if (this.$highlightPending) {\n            return;\n        }\n        var self = this;\n        this.$highlightPending = true;\n        setTimeout(function() {\n            self.$highlightPending = false;\n            var session = self.session;\n            if (!session || !session.bgTokenizer) return;\n            var pos = session.findMatchingBracket(self.getCursorPosition());\n            if (pos) {\n                var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n            } else if (session.$mode.getMatching) {\n                var range = session.$mode.getMatching(self.session);\n            }\n            if (range)\n                session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\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 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 && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                        if (prevToken.value === '<'){\n                            depth++;\n                        } else if (prevToken.value === '</'){\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 && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                        if (prevToken.value === '<') {\n                            depth++;\n                        } else if (prevToken.value === '</') {\n                            depth--;\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 (range && !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            _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    };\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        this.$updateHighlightActiveLine();\n    };\n\n    this.onTokenizerUpdate = function(e) {\n        var rows = e.data;\n        this.renderer.updateLines(rows.first, rows.last);\n    };\n\n\n    this.onScrollTopChange = function() {\n        this.renderer.scrollToY(this.session.getScrollTop());\n    };\n\n    this.onScrollLeftChange = function() {\n        this.renderer.scrollToX(this.session.getScrollLeft());\n    };\n    this.onCursorChange = function() {\n        this.$cursorChange();\n\n        if (!this.$blockScrolling) {\n            config.warn(\"Automatically scrolling cursor into view after selection change\",\n                \"this will be disabled in the next version\",\n                \"set editor.$blockScrolling = Infinity to disable this message\"\n            );\n            this.renderer.scrollCursorIntoView();\n        }\n\n        this.$highlightBrackets();\n        this.$highlightTags();\n        this.$updateHighlightActiveLine();\n        this._signal(\"changeSelection\");\n    };\n\n    this.$updateHighlightActiveLine = function() {\n        var session = this.getSession();\n\n        var highlight;\n        if (this.$highlightActiveLine) {\n            if ((this.$selectionStyle != \"line\" || !this.selection.isMultiLine()))\n                highlight = this.getCursorPosition();\n            if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))\n                highlight = false;\n        }\n\n        if (session.$highlightLineMarker && !highlight) {\n            session.removeMarker(session.$highlightLineMarker.id);\n            session.$highlightLineMarker = null;\n        } else if (!session.$highlightLineMarker && highlight) {\n            var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n            range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n            session.$highlightLineMarker = range;\n        } else if (highlight) {\n            session.$highlightLineMarker.start.row = highlight.row;\n            session.$highlightLineMarker.end.row = highlight.row;\n            session.$highlightLineMarker.start.column = highlight.column;\n            session._signal(\"changeBackMarker\");\n        }\n    };\n\n    this.onSelectionChange = function(e) {\n        var session = this.session;\n\n        if (session.$selectionMarker) {\n            session.removeMarker(session.$selectionMarker);\n        }\n        session.$selectionMarker = null;\n\n        if (!this.selection.isEmpty()) {\n            var range = this.selection.getRange();\n            var style = this.getSelectionStyle();\n            session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n        } else {\n            this.$updateHighlightActiveLine();\n        }\n\n        var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n        this.session.highlight(re);\n\n        this._signal(\"changeSelection\");\n    };\n\n    this.$getSelectionHighLightRegexp = function() {\n        var session = this.session;\n\n        var selection = this.getSelectionRange();\n        if (selection.isEmpty() || selection.isMultiLine())\n            return;\n\n        var startOuter = selection.start.column - 1;\n        var endOuter = selection.end.column + 1;\n        var line = session.getLine(selection.start.row);\n        var lineCols = line.length;\n        var needle = line.substring(Math.max(startOuter, 0),\n                                    Math.min(endOuter, lineCols));\n        if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n            (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n            return;\n\n        needle = line.substring(selection.start.column, selection.end.column);\n        if (!/^[\\w\\d]+$/.test(needle))\n            return;\n\n        var re = this.$search.$assembleRegExp({\n            wholeWord: true,\n            caseSensitive: true,\n            needle: needle\n        });\n\n        return re;\n    };\n\n\n    this.onChangeFrontMarker = function() {\n        this.renderer.updateFrontMarkers();\n    };\n\n    this.onChangeBackMarker = function() {\n        this.renderer.updateBackMarkers();\n    };\n\n\n    this.onChangeBreakpoint = function() {\n        this.renderer.updateBreakpoints();\n    };\n\n    this.onChangeAnnotation = function() {\n        this.renderer.setAnnotations(this.session.getAnnotations());\n    };\n\n\n    this.onChangeMode = function(e) {\n        this.renderer.updateText();\n        this._emit(\"changeMode\", e);\n    };\n\n\n    this.onChangeWrapLimit = function() {\n        this.renderer.updateFull();\n    };\n\n    this.onChangeWrapMode = function() {\n        this.renderer.onResize(true);\n    };\n\n\n    this.onChangeFold = function() {\n        this.$updateHighlightActiveLine();\n        this.renderer.updateFull();\n    };\n    this.getSelectedText = function() {\n        return this.session.getTextRange(this.getSelectionRange());\n    };\n    this.getCopyText = function() {\n        var text = this.getSelectedText();\n        this._signal(\"copy\", text);\n        return text;\n    };\n    this.onCopy = function() {\n        this.commands.exec(\"copy\", this);\n    };\n    this.onCut = function() {\n        this.commands.exec(\"cut\", this);\n    };\n    this.onPaste = function(text, 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        if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n            this.insert(text);\n        } else {\n            var lines = text.split(/\\r\\n|\\r|\\n/);\n            var ranges = this.selection.rangeList.ranges;\n    \n            if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n                return this.commands.exec(\"insertstring\", this, text);\n    \n            for (var i = ranges.length; i--;) {\n                var range = ranges[i];\n                if (!range.isEmpty())\n                    this.session.remove(range);\n    \n                this.session.insert(range.start, lines[i]);\n            }\n        }\n    };\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                    this.session.mergeUndoDeltas = false;\n                    this.$mergeNextCommand = false;\n                }\n                text = transform.text;\n\n            }\n        }\n        \n        if (text == \"\\t\")\n            text = this.session.getTabString();\n        if (!this.selection.isEmpty()) {\n            var range = this.getSelectionRange();\n            cursor = this.session.remove(range);\n            this.clearSelection();\n        }\n        else if (this.session.getOverwrite() && 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        var end = session.insert(cursor, text);\n\n        if (transform && transform.selection) {\n            if (transform.selection.length == 2) { // Transform relative to the current column\n                this.selection.setSelectionRange(\n                    new Range(cursor.row, start + transform.selection[0],\n                              cursor.row, start + transform.selection[1]));\n            } else { // Transform relative to the current row.\n                this.selection.setSelectionRange(\n                    new Range(cursor.row + transform.selection[0],\n                              transform.selection[1],\n                              cursor.row + transform.selection[2],\n                              transform.selection[3]));\n            }\n        }\n\n        if (session.getDocument().isNewLine(text)) {\n            var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n            session.insert({row: cursor.row+1, column: 0}, lineIndent);\n        }\n        if (shouldOutdent)\n            mode.autoOutdent(lineState, session, cursor.row);\n    };\n\n    this.onTextInput = function(text) {\n        this.keyBinding.onTextInput(text);\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        this.keyBinding.onCommandKey(e, hashId, keyCode);\n    };\n    this.setOverwrite = function(overwrite) {\n        this.session.setOverwrite(overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.session.getOverwrite();\n    };\n    this.toggleOverwrite = function() {\n        this.session.toggleOverwrite();\n    };\n    this.setScrollSpeed = function(speed) {\n        this.setOption(\"scrollSpeed\", speed);\n    };\n    this.getScrollSpeed = function() {\n        return this.getOption(\"scrollSpeed\");\n    };\n    this.setDragDelay = function(dragDelay) {\n        this.setOption(\"dragDelay\", dragDelay);\n    };\n    this.getDragDelay = function() {\n        return this.getOption(\"dragDelay\");\n    };\n    this.setSelectionStyle = function(val) {\n        this.setOption(\"selectionStyle\", val);\n    };\n    this.getSelectionStyle = function() {\n        return this.getOption(\"selectionStyle\");\n    };\n    this.setHighlightActiveLine = function(shouldHighlight) {\n        this.setOption(\"highlightActiveLine\", shouldHighlight);\n    };\n    this.getHighlightActiveLine = function() {\n        return this.getOption(\"highlightActiveLine\");\n    };\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n    this.setHighlightSelectedWord = function(shouldHighlight) {\n        this.setOption(\"highlightSelectedWord\", shouldHighlight);\n    };\n    this.getHighlightSelectedWord = function() {\n        return this.$highlightSelectedWord;\n    };\n\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.renderer.setAnimatedScroll(shouldAnimate);\n    };\n\n    this.getAnimatedScroll = function(){\n        return this.renderer.getAnimatedScroll();\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.renderer.setShowInvisibles(showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.renderer.getShowInvisibles();\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.renderer.setDisplayIndentGuides(display);\n    };\n\n    this.getDisplayIndentGuides = function() {\n        return this.renderer.getDisplayIndentGuides();\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.renderer.setShowPrintMargin(showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.renderer.getShowPrintMargin();\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.renderer.setPrintMarginColumn(showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.renderer.getPrintMarginColumn();\n    };\n    this.setReadOnly = function(readOnly) {\n        this.setOption(\"readOnly\", readOnly);\n    };\n    this.getReadOnly = function() {\n        return this.getOption(\"readOnly\");\n    };\n    this.setBehavioursEnabled = function (enabled) {\n        this.setOption(\"behavioursEnabled\", enabled);\n    };\n    this.getBehavioursEnabled = function () {\n        return this.getOption(\"behavioursEnabled\");\n    };\n    this.setWrapBehavioursEnabled = function (enabled) {\n        this.setOption(\"wrapBehavioursEnabled\", enabled);\n    };\n    this.getWrapBehavioursEnabled = function () {\n        return this.getOption(\"wrapBehavioursEnabled\");\n    };\n    this.setShowFoldWidgets = function(show) {\n        this.setOption(\"showFoldWidgets\", show);\n\n    };\n    this.getShowFoldWidgets = function() {\n        return this.getOption(\"showFoldWidgets\");\n    };\n\n    this.setFadeFoldWidgets = function(fade) {\n        this.setOption(\"fadeFoldWidgets\", fade);\n    };\n\n    this.getFadeFoldWidgets = function() {\n        return this.getOption(\"fadeFoldWidgets\");\n    };\n    this.remove = function(dir) {\n        if (this.selection.isEmpty()){\n            if (dir == \"left\")\n                this.selection.selectLeft();\n            else\n                this.selection.selectRight();\n        }\n\n        var range = this.getSelectionRange();\n        if (this.getBehavioursEnabled()) {\n            var session = this.session;\n            var state = session.getState(range.start.row);\n            var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n            if (range.end.column === 0) {\n                var text = session.getTextRange(range);\n                if (text[text.length - 1] == \"\\n\") {\n                    var line = session.getLine(range.end.row);\n                    if (/^\\s+$/.test(line)) {\n                        range.end.column = line.length;\n                    }\n                }\n            }\n            if (new_range)\n                range = new_range;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.removeWordRight = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordRight();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeWordLeft = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordLeft();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineStart = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineStart();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineEnd = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineEnd();\n\n        var range = this.getSelectionRange();\n        if (range.start.column == range.end.column && range.start.row == range.end.row) {\n            range.end.column = 0;\n            range.end.row++;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.splitLine = function() {\n        if (!this.selection.isEmpty()) {\n            this.session.remove(this.getSelectionRange());\n            this.clearSelection();\n        }\n\n        var cursor = this.getCursorPosition();\n        this.insert(\"\\n\");\n        this.moveCursorToPosition(cursor);\n    };\n    this.transposeLetters = function() {\n        if (!this.selection.isEmpty()) {\n            return;\n        }\n\n        var cursor = this.getCursorPosition();\n        var column = cursor.column;\n        if (column === 0)\n            return;\n\n        var line = this.session.getLine(cursor.row);\n        var swap, range;\n        if (column < line.length) {\n            swap = line.charAt(column) + line.charAt(column-1);\n            range = new Range(cursor.row, column-1, cursor.row, column+1);\n        }\n        else {\n            swap = line.charAt(column-1) + line.charAt(column-2);\n            range = new Range(cursor.row, column-2, cursor.row, column);\n        }\n        this.session.replace(range, swap);\n        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        }\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(text) {\n        this.renderer.showComposition(this.getCursorPosition());\n    };\n\n    this.onCompositionUpdate = function(text) {\n        this.renderer.setCompositionText(text);\n    };\n\n    this.onCompositionEnd = function() {\n        this.renderer.hideComposition();\n    };\n    this.getFirstVisibleRow = function() {\n        return this.renderer.getFirstVisibleRow();\n    };\n    this.getLastVisibleRow = function() {\n        return this.renderer.getLastVisibleRow();\n    };\n    this.isRowVisible = function(row) {\n        return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n    };\n    this.isRowFullyVisible = function(row) {\n        return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n    };\n    this.$getVisibleRowCount = function() {\n        return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n    };\n\n    this.$moveByPage = function(dir, select) {\n        var renderer = this.renderer;\n        var config = this.renderer.layerConfig;\n        var rows = dir * Math.floor(config.height / config.lineHeight);\n\n        this.$blockScrolling++;\n        if (select === true) {\n            this.selection.$moveSelection(function(){\n                this.moveCursorBy(rows, 0);\n            });\n        } else if (select === false) {\n            this.selection.moveCursorBy(rows, 0);\n            this.selection.clearSelection();\n        }\n        this.$blockScrolling--;\n\n        var scrollTop = renderer.scrollTop;\n\n        renderer.scrollBy(0, rows * config.lineHeight);\n        if (select != null)\n            renderer.scrollCursorIntoView(null, 0.5);\n\n        renderer.animateScrolling(scrollTop);\n    };\n    this.selectPageDown = function() {\n        this.$moveByPage(1, true);\n    };\n    this.selectPageUp = function() {\n        this.$moveByPage(-1, true);\n    };\n    this.gotoPageDown = function() {\n       this.$moveByPage(1, false);\n    };\n    this.gotoPageUp = function() {\n        this.$moveByPage(-1, false);\n    };\n    this.scrollPageDown = function() {\n        this.$moveByPage(1);\n    };\n    this.scrollPageUp = function() {\n        this.$moveByPage(-1);\n    };\n    this.scrollToRow = function(row) {\n        this.renderer.scrollToRow(row);\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        this.renderer.scrollToLine(line, center, animate, callback);\n    };\n    this.centerSelection = function() {\n        var range = this.getSelectionRange();\n        var pos = {\n            row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n            column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n        };\n        this.renderer.alignCursor(pos, 0.5);\n    };\n    this.getCursorPosition = function() {\n        return this.selection.getCursor();\n    };\n    this.getCursorPositionScreen = function() {\n        return this.session.documentToScreenPosition(this.getCursorPosition());\n    };\n    this.getSelectionRange = function() {\n        return this.selection.getRange();\n    };\n    this.selectAll = function() {\n        this.$blockScrolling += 1;\n        this.selection.selectAll();\n        this.$blockScrolling -= 1;\n    };\n    this.clearSelection = function() {\n        this.selection.clearSelection();\n    };\n    this.moveCursorTo = function(row, column) {\n        this.selection.moveCursorTo(row, column);\n    };\n    this.moveCursorToPosition = function(pos) {\n        this.selection.moveCursorToPosition(pos);\n    };\n    this.jumpToMatching = function(select, 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 && 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\n        this.$blockScrolling += 1;\n        this.exitMultiSelectMode && this.exitMultiSelectMode();\n        this.moveCursorTo(lineNumber - 1, column || 0);\n        this.$blockScrolling -= 1;\n\n        if (!this.isRowFullyVisible(lineNumber - 1))\n            this.scrollToLine(lineNumber - 1, true, animate);\n    };\n    this.navigateTo = function(row, column) {\n        this.selection.moveTo(row, column);\n    };\n    this.navigateUp = function(times) {\n        if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n            var selectionStart = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionStart);\n        }\n        this.selection.clearSelection();\n        this.selection.moveCursorBy(-times || -1, 0);\n    };\n    this.navigateDown = function(times) {\n        if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n            var selectionEnd = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionEnd);\n        }\n        this.selection.clearSelection();\n        this.selection.moveCursorBy(times || 1, 0);\n    };\n    this.navigateLeft = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionStart = this.getSelectionRange().start;\n            this.moveCursorToPosition(selectionStart);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorLeft();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateRight = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionEnd = this.getSelectionRange().end;\n            this.moveCursorToPosition(selectionEnd);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorRight();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateLineStart = function() {\n        this.selection.moveCursorLineStart();\n        this.clearSelection();\n    };\n    this.navigateLineEnd = function() {\n        this.selection.moveCursorLineEnd();\n        this.clearSelection();\n    };\n    this.navigateFileEnd = function() {\n        this.selection.moveCursorFileEnd();\n        this.clearSelection();\n    };\n    this.navigateFileStart = function() {\n        this.selection.moveCursorFileStart();\n        this.clearSelection();\n    };\n    this.navigateWordRight = function() {\n        this.selection.moveCursorWordRight();\n        this.clearSelection();\n    };\n    this.navigateWordLeft = function() {\n        this.selection.moveCursorWordLeft();\n        this.clearSelection();\n    };\n    this.replace = function(replacement, options) {\n        if (options)\n            this.$search.set(options);\n\n        var range = this.$search.find(this.session);\n        var replaced = 0;\n        if (!range)\n            return replaced;\n\n        if (this.$tryReplace(range, replacement)) {\n            replaced = 1;\n        }\n        if (range !== null) {\n            this.selection.setSelectionRange(range);\n            this.renderer.scrollSelectionIntoView(range.start, range.end);\n        }\n\n        return replaced;\n    };\n    this.replaceAll = function(replacement, options) {\n        if (options) {\n            this.$search.set(options);\n        }\n\n        var ranges = this.$search.findAll(this.session);\n        var replaced = 0;\n        if (!ranges.length)\n            return replaced;\n\n        this.$blockScrolling += 1;\n\n        var selection = this.getSelectionRange();\n        this.selection.moveTo(0, 0);\n\n        for (var i = ranges.length - 1; i >= 0; --i) {\n            if(this.$tryReplace(ranges[i], replacement)) {\n                replaced++;\n            }\n        }\n\n        this.selection.setSelectionRange(selection);\n        this.$blockScrolling -= 1;\n\n        return replaced;\n    };\n\n    this.$tryReplace = function(range, replacement) {\n        var input = this.session.getTextRange(range);\n        replacement = this.$search.replace(input, replacement);\n        if (replacement !== null) {\n            range.end = this.session.replace(range, replacement);\n            return range;\n        } else {\n            return null;\n        }\n    };\n    this.getLastSearchOptions = function() {\n        return this.$search.getOptions();\n    };\n    this.find = function(needle, options, animate) {\n        if (!options)\n            options = {};\n\n        if (typeof needle == \"string\" || needle instanceof RegExp)\n            options.needle = needle;\n        else if (typeof needle == \"object\")\n            oop.mixin(options, needle);\n\n        var range = this.selection.getRange();\n        if (options.needle == null) {\n            needle = this.session.getTextRange(range)\n                || this.$search.$options.needle;\n            if (!needle) {\n                range = this.session.getWordRange(range.start.row, range.start.column);\n                needle = this.session.getTextRange(range);\n            }\n            this.$search.set({needle: needle});\n        }\n\n        this.$search.set(options);\n        if (!options.start)\n            this.$search.set({start: range});\n\n        var newRange = this.$search.find(this.session);\n        if (options.preventScroll)\n            return newRange;\n        if (newRange) {\n            this.revealRange(newRange, animate);\n            return newRange;\n        }\n        if (options.backwards)\n            range.start = range.end;\n        else\n            range.end = range.start;\n        this.selection.setRange(range);\n    };\n    this.findNext = function(options, animate) {\n        this.find({skipCurrent: true, backwards: false}, options, animate);\n    };\n    this.findPrevious = function(options, animate) {\n        this.find(options, {skipCurrent: true, backwards: true}, animate);\n    };\n\n    this.revealRange = function(range, animate) {\n        this.$blockScrolling += 1;\n        this.session.unfold(range);\n        this.selection.setSelectionRange(range);\n        this.$blockScrolling -= 1;\n\n        var scrollTop = this.renderer.scrollTop;\n        this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n        if (animate !== false)\n            this.renderer.animateScrolling(scrollTop);\n    };\n    this.undo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().undo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.redo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().redo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.destroy = function() {\n        this.renderer.destroy();\n        this._signal(\"destroy\", this);\n        if (this.session) {\n            this.session.destroy();\n        }\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\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.$resetCursorStyle(); \n        },\n        initialValue: false\n    },\n    cursorStyle: {\n        set: function(val) { this.$resetCursorStyle(); },\n        values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n        initialValue: \"ace\"\n    },\n    mergeUndoDeltas: {\n        values: [false, true, \"always\"],\n        initialValue: true\n    },\n    behavioursEnabled: {initialValue: true},\n    wrapBehavioursEnabled: {initialValue: true},\n    autoScrollEditorIntoView: {\n        set: function(val) {this.setAutoScrollEditorIntoView(val);}\n    },\n    keyboardHandler: {\n        set: function(val) { this.setKeyboardHandler(val); },\n        get: function() { return this.keybindingId; },\n        handlesSet: true\n    },\n\n    hScrollBarAlwaysVisible: \"renderer\",\n    vScrollBarAlwaysVisible: \"renderer\",\n    highlightGutterLine: \"renderer\",\n    animatedScroll: \"renderer\",\n    showInvisibles: \"renderer\",\n    showPrintMargin: \"renderer\",\n    printMarginColumn: \"renderer\",\n    printMargin: \"renderer\",\n    fadeFoldWidgets: \"renderer\",\n    showFoldWidgets: \"renderer\",\n    showLineNumbers: \"renderer\",\n    showGutter: \"renderer\",\n    displayIndentGuides: \"renderer\",\n    fontSize: \"renderer\",\n    fontFamily: \"renderer\",\n    maxLines: \"renderer\",\n    minLines: \"renderer\",\n    scrollPastEnd: \"renderer\",\n    fixedWidthGutter: \"renderer\",\n    theme: \"renderer\",\n\n    scrollSpeed: \"$mouseHandler\",\n    dragDelay: \"$mouseHandler\",\n    dragEnabled: \"$mouseHandler\",\n    focusTimout: \"$mouseHandler\",\n    tooltipFollowsMouse: \"$mouseHandler\",\n\n    firstLineNumber: \"session\",\n    overwrite: \"session\",\n    newLineMode: \"session\",\n    useWorker: \"session\",\n    useSoftTabs: \"session\",\n    tabSize: \"session\",\n    wrap: \"session\",\n    indentedSoftWrap: \"session\",\n    foldStyle: \"session\",\n    mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n    this.reset();\n};\n\n(function() {\n    this.execute = function(options) {\n        var deltaSets = options.args[0];\n        this.$doc  = options.args[1];\n        if (options.merge && this.hasUndo()){\n            this.dirtyCounter--;\n            deltaSets = this.$undoStack.pop().concat(deltaSets);\n        }\n        this.$undoStack.push(deltaSets);\n        this.$redoStack = [];\n        if (this.dirtyCounter < 0) {\n            this.dirtyCounter = NaN;\n        }\n        this.dirtyCounter++;\n    };\n    this.undo = function(dontSelect) {\n        var deltaSets = this.$undoStack.pop();\n        var undoSelectionRange = null;\n        if (deltaSets) {\n            undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\n            this.$redoStack.push(deltaSets);\n            this.dirtyCounter--;\n        }\n\n        return undoSelectionRange;\n    };\n    this.redo = function(dontSelect) {\n        var deltaSets = this.$redoStack.pop();\n        var redoSelectionRange = null;\n        if (deltaSets) {\n            redoSelectionRange =\n                this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\n            this.$undoStack.push(deltaSets);\n            this.dirtyCounter++;\n        }\n        return redoSelectionRange;\n    };\n    this.reset = function() {\n        this.$undoStack = [];\n        this.$redoStack = [];\n        this.dirtyCounter = 0;\n    };\n    this.hasUndo = function() {\n        return this.$undoStack.length > 0;\n    };\n    this.hasRedo = function() {\n        return this.$redoStack.length > 0;\n    };\n    this.markClean = function() {\n        this.dirtyCounter = 0;\n    };\n    this.isClean = function() {\n        return this.dirtyCounter === 0;\n    };\n    this.$serializeDeltas = function(deltaSets) {\n        return cloneDeltaSetsObj(deltaSets, $serializeDelta);\n    };\n    this.$deserializeDeltas = function(deltaSets) {\n        return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\n    };\n    \n    function $serializeDelta(delta){\n        return {\n            action: delta.action,\n            start: delta.start,\n            end: delta.end,\n            lines: delta.lines.length == 1 ? null : delta.lines,\n            text: delta.lines.length == 1 ? delta.lines[0] : null\n        };\n    }\n        \n    function $deserializeDelta(delta) {\n        return {\n            action: delta.action,\n            start: delta.start,\n            end: delta.end,\n            lines: delta.lines || [delta.text]\n        };\n    }\n    \n    function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\n        var deltaSets_new = new Array(deltaSets_old.length);\n        for (var i = 0; i < deltaSets_old.length; i++) {\n            var deltaSet_old = deltaSets_old[i];\n            var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\n            \n            for (var j = 0; j < deltaSet_old.deltas.length; j++) {\n                var delta_old = deltaSet_old.deltas[j];\n                deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\n            }\n            \n            deltaSets_new[i] = deltaSet_new;\n        }\n        return deltaSets_new;\n    }\n    \n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\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.$cells = [];\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.removeEventListener(\"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        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        var fold = session.getNextFoldLine(firstRow);\n        var foldStart = fold ? fold.start.row : Infinity;\n        var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n        var breakpoints = session.$breakpoints;\n        var decorations = session.$decorations;\n        var firstLineNumber = session.$firstLineNumber;\n        var lastLineNumber = 0;\n        \n        var gutterRenderer = session.gutterRenderer || this.$renderer;\n\n        var cell = null;\n        var index = -1;\n        var row = firstRow;\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.$cells.length > index + 1) {\n                    cell = this.$cells.pop();\n                    this.element.removeChild(cell.element);\n                }\n                break;\n            }\n\n            cell = this.$cells[++index];\n            if (!cell) {\n                cell = {element: null, textNode: null, foldWidget: null};\n                cell.element = dom.createElement(\"div\");\n                cell.textNode = document.createTextNode('');\n                cell.element.appendChild(cell.textNode);\n                this.element.appendChild(cell.element);\n                this.$cells[index] = cell;\n            }\n\n            var className = \"ace_gutter-cell \";\n            if (breakpoints[row])\n                className += breakpoints[row];\n            if (decorations[row])\n                className += decorations[row];\n            if (this.$annotations[row])\n                className += this.$annotations[row].className;\n            if (cell.element.className != className)\n                cell.element.className = className;\n\n            var height = session.getRowLength(row) * config.lineHeight + \"px\";\n            if (height != cell.element.style.height)\n                cell.element.style.height = height;\n\n            if (foldWidgets) {\n                var c = foldWidgets[row];\n                if (c == null)\n                    c = foldWidgets[row] = session.getFoldWidget(row);\n            }\n\n            if (c) {\n                if (!cell.foldWidget) {\n                    cell.foldWidget = dom.createElement(\"span\");\n                    cell.element.appendChild(cell.foldWidget);\n                }\n                var className = \"ace_fold-widget ace_\" + c;\n                if (c == \"start\" && row == foldStart && row < fold.end.row)\n                    className += \" ace_closed\";\n                else\n                    className += \" ace_open\";\n                if (cell.foldWidget.className != className)\n                    cell.foldWidget.className = className;\n\n                var height = config.lineHeight + \"px\";\n                if (cell.foldWidget.style.height != height)\n                    cell.foldWidget.style.height = height;\n            } else {\n                if (cell.foldWidget) {\n                    cell.element.removeChild(cell.foldWidget);\n                    cell.foldWidget = null;\n                }\n            }\n            \n            var text = lastLineNumber = gutterRenderer\n                ? gutterRenderer.getText(session, row)\n                : row + firstLineNumber;\n            if (text !== cell.textNode.data)\n                cell.textNode.data = text;\n\n            row++;\n        }\n\n        this.element.style.height = config.minHeight + \"px\";\n\n        if (this.$fixedWidth || session.$useWrapMode)\n            lastLineNumber = session.getLength() + firstLineNumber;\n\n        var gutterWidth = gutterRenderer \n            ? gutterRenderer.getWidth(session, lastLineNumber, config)\n            : lastLineNumber.toString().length * config.characterWidth;\n        \n        var padding = this.$padding || this.$computePadding();\n        gutterWidth += padding.left + padding.right;\n        if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n            this.gutterWidth = gutterWidth;\n            this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n            this._emit(\"changeGutterWidth\", gutterWidth);\n        }\n    };\n\n    this.$fixedWidth = false;\n    \n    this.$showLineNumbers = true;\n    this.$renderer = \"\";\n    this.setShowLineNumbers = function(show) {\n        this.$renderer = !show && {\n            getWidth: function() {return \"\";},\n            getText: function() {return \"\";}\n        };\n    };\n    \n    this.getShowLineNumbers = function() {\n        return this.$showLineNumbers;\n    };\n    \n    this.$showFoldWidgets = true;\n    this.setShowFoldWidgets = function(show) {\n        if (show)\n            dom.addCssClass(this.element, \"ace_folding-enabled\");\n        else\n            dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n        this.$showFoldWidgets = show;\n        this.$padding = null;\n    };\n    \n    this.getShowFoldWidgets = function() {\n        return this.$showFoldWidgets;\n    };\n\n    this.$computePadding = function() {\n        if (!this.element.firstChild)\n            return {left: 0, right: 0};\n        var style = dom.computedStyle(this.element.firstChild);\n        this.$padding = {};\n        this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n        this.$padding.right = parseInt(style.paddingRight) || 0;\n        return this.$padding;\n    };\n\n    this.getRegion = function(point) {\n        var padding = this.$padding || this.$computePadding();\n        var rect = this.element.getBoundingClientRect();\n        if (point.x < padding.left + rect.left)\n            return \"markers\";\n        if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n            return \"foldWidgets\";\n    };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar dom = acequire(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_marker-layer\";\n    parentEl.appendChild(this.element);\n};\n\n(function() {\n\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n    this.setSession = function(session) {\n        this.session = session;\n    };\n    \n    this.setMarkers = function(markers) {\n        this.markers = markers;\n    };\n\n    this.update = function(config) {\n        if (!config) return;\n\n        this.config = config;\n\n\n        var html = [];\n        for (var key in this.markers) {\n            var marker = this.markers[key];\n\n            if (!marker.range) {\n                marker.update(html, this, this.session, config);\n                continue;\n            }\n\n            var range = marker.range.clipRows(config.firstRow, config.lastRow);\n            if (range.isEmpty()) continue;\n\n            range = range.toScreenRange(this.session);\n            if (marker.renderer) {\n                var top = this.$getTop(range.start.row, config);\n                var left = this.$padding + (this.session.$bidiHandler.isBidiRow(range.start.row)\n                    ? this.session.$bidiHandler.getPosLeft(range.start.column)\n                    : 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                if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n                    this.drawBidiSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n                } else {\n                    this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n                }\n            }\n        }\n        this.element.innerHTML = html.join(\"\");\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 clazzModified = null;\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            clazzModified = clazz + (row == start  ? \" ace_start\" : \"\") + \" ace_br\"\n                + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end);\n\n            if (this.session.$bidiHandler.isBidiRow(row)) {\n                this.drawBidiSingleLineMarker(stringBuilder, lineRange, clazzModified,\n                    layerConfig, row == end ? 0 : 1, extraStyle);\n            } else {\n                this.drawSingleLineMarker(stringBuilder, lineRange, clazzModified,\n                    layerConfig, row == end ? 0 : 1, extraStyle);\n            }\n        }\n    };\n    this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var padding = this.$padding;\n        var height, top, left;\n        extraStyle = extraStyle || \"\";\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           height = config.lineHeight;\n           top = this.$getTop(range.start.row, config);\n           left = padding + range.start.column * config.characterWidth;\n           stringBuilder.push(\n               \"<div class='\", clazz, \" ace_br1 ace_start' style='\",\n               \"height:\", height, \"px;\",\n               \"right:0;\",\n               \"top:\", top, \"px;\",\n               \"left:\", left, \"px;\", extraStyle, \"'></div>\"\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           var width = range.end.column * config.characterWidth;\n           height = config.lineHeight;\n           top = this.$getTop(range.end.row, config);\n           stringBuilder.push(\n               \"<div class='\", clazz, \" ace_br12' style='\",\n               \"height:\", height, \"px;\",\n               \"width:\", width, \"px;\",\n               \"top:\", top, \"px;\",\n               \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\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        stringBuilder.push(\n            \"<div class='\", clazz, (radiusClass ? \" ace_br\" + radiusClass : \"\"), \"' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n    };\n    this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n        var height = config.lineHeight;\n        var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n        var top = this.$getTop(range.start.row, config);\n        var left = this.$padding + range.start.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle || \"\", \"'></div>\"\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            stringBuilder.push(\n                \"<div class='\", clazz, \"' style='\",\n                \"height:\", height, \"px;\",\n                \"width:\", selection.width + (extraLength || 0), \"px;\",\n                \"top:\", top, \"px;\",\n                \"left:\", padding + selection.left, \"px;\", extraStyle || \"\", \"'></div>\"\n            );\n        });\n    };\n\n    this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n        if (range.start.row != range.end.row)\n            height += this.$getTop(range.end.row, config) - top;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n    \n    this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\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/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_text-layer\";\n    parentEl.appendChild(this.element);\n    this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.EOF_CHAR = \"\\xB6\";\n    this.EOL_CHAR_LF = \"\\xAC\";\n    this.EOL_CHAR_CRLF = \"\\xa4\";\n    this.EOL_CHAR = this.EOL_CHAR_LF;\n    this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n    this.SPACE_CHAR = \"\\xB7\";\n    this.$padding = 0;\n\n    this.$updateEolChar = function() {\n        var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n           ? this.EOL_CHAR_LF\n           : this.EOL_CHAR_CRLF;\n        if (this.EOL_CHAR != EOL_CHAR) {\n            this.EOL_CHAR = EOL_CHAR;\n            return true;\n        }\n    };\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.element.style.padding = \"0 \" + padding + \"px\";\n    };\n\n    this.getLineHeight = function() {\n        return this.$fontMetrics.$characterSize.height || 0;\n    };\n\n    this.getCharacterWidth = function() {\n        return this.$fontMetrics.$characterSize.width || 0;\n    };\n    \n    this.$setFontMetrics = function(measure) {\n        this.$fontMetrics = measure;\n        this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n            this._signal(\"changeCharacterSize\", e);\n        }.bind(this));\n        this.$pollSizeChanges();\n    };\n\n    this.checkForSizeChanges = function() {\n        this.$fontMetrics.checkForSizeChanges();\n    };\n    this.$pollSizeChanges = function() {\n        return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n    };\n    this.setSession = function(session) {\n        this.session = session;\n        if (session)\n            this.$computeTabString();\n    };\n\n    this.showInvisibles = false;\n    this.setShowInvisibles = function(showInvisibles) {\n        if (this.showInvisibles == showInvisibles)\n            return false;\n\n        this.showInvisibles = showInvisibles;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.displayIndentGuides = true;\n    this.setDisplayIndentGuides = function(display) {\n        if (this.displayIndentGuides == display)\n            return false;\n\n        this.displayIndentGuides = display;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.$tabStrings = [];\n    this.onChangeTabSize =\n    this.$computeTabString = function() {\n        var tabSize = this.session.getTabSize();\n        this.tabSize = tabSize;\n        var tabStr = this.$tabStrings = [0];\n        for (var i = 1; i < tabSize + 1; i++) {\n            if (this.showInvisibles) {\n                tabStr.push(\"<span class='ace_invisible ace_invisible_tab'>\"\n                    + lang.stringRepeat(this.TAB_CHAR, i)\n                    + \"</span>\");\n            } else {\n                tabStr.push(lang.stringRepeat(\" \", i));\n            }\n        }\n        if (this.displayIndentGuides) {\n            this.$indentGuideRe =  /\\s\\S| \\t|\\t |\\s$/;\n            var className = \"ace_indent-guide\";\n            var spaceClass = \"\";\n            var tabClass = \"\";\n            if (this.showInvisibles) {\n                className += \" ace_invisible\";\n                spaceClass = \" ace_invisible_space\";\n                tabClass = \" ace_invisible_tab\";\n                var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n                var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\n            } else{\n                var spaceContent = lang.stringRepeat(\" \", this.tabSize);\n                var tabContent = spaceContent;\n            }\n\n            this.$tabStrings[\" \"] = \"<span class='\" + className + spaceClass + \"'>\" + spaceContent + \"</span>\";\n            this.$tabStrings[\"\\t\"] = \"<span class='\" + className + tabClass + \"'>\" + tabContent + \"</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            this.scrollLines(config);\n        }\n        this.config = config;\n\n        var first = Math.max(firstRow, config.firstRow);\n        var last = Math.min(lastRow, config.lastRow);\n\n        var lineElements = this.element.childNodes;\n        var lineElementsIdx = 0;\n\n        for (var row = config.firstRow; row < first; row++) {\n            var foldLine = this.session.getFoldLine(row);\n            if (foldLine) {\n                if (foldLine.containsRow(first)) {\n                    first = foldLine.start.row;\n                    break;\n                } else {\n                    row = foldLine.end.row;\n                }\n            }\n            lineElementsIdx ++;\n        }\n\n        var row = first;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > last)\n                break;\n\n            var lineElement = lineElements[lineElementsIdx++];\n            if (lineElement) {\n                var html = [];\n                this.$renderLine(\n                    html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n                );\n                lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n                lineElement.innerHTML = html.join(\"\");\n            }\n            row++;\n        }\n    };\n\n    this.scrollLines = function(config) {\n        var oldConfig = this.config;\n        this.config = config;\n\n        if (!oldConfig || oldConfig.lastRow < config.firstRow)\n            return this.update(config);\n\n        if (config.lastRow < oldConfig.firstRow)\n            return this.update(config);\n\n        var el = this.element;\n        if (oldConfig.firstRow < config.firstRow)\n            for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n                el.removeChild(el.firstChild);\n\n        if (oldConfig.lastRow > config.lastRow)\n            for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n                el.removeChild(el.lastChild);\n\n        if (config.firstRow < oldConfig.firstRow) {\n            var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n            if (el.firstChild)\n                el.insertBefore(fragment, el.firstChild);\n            else\n                el.appendChild(fragment);\n        }\n\n        if (config.lastRow > oldConfig.lastRow) {\n            var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n            el.appendChild(fragment);\n        }\n    };\n\n    this.$renderLinesFragment = function(config, firstRow, lastRow) {\n        var fragment = this.element.ownerDocument.createDocumentFragment();\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row : Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            var container = dom.createElement(\"div\");\n\n            var html = [];\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n            container.innerHTML = html.join(\"\");\n            if (this.$useLineGroups()) {\n                container.className = 'ace_line_group';\n                fragment.appendChild(container);\n                container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n            } else {\n                while(container.firstChild)\n                    fragment.appendChild(container.firstChild);\n            }\n\n            row++;\n        }\n        return fragment;\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var html = [];\n        var firstRow = config.firstRow, lastRow = config.lastRow;\n\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            if (this.$useLineGroups())\n                html.push(\"<div class='ace_line_group' style='height:\", config.lineHeight*this.session.getRowLength(row), \"px'>\");\n\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n            if (this.$useLineGroups())\n                html.push(\"</div>\"); // end the line group\n\n            row++;\n        }\n        this.element.innerHTML = html.join(\"\");\n    };\n\n    this.$textToken = {\n        \"text\": true,\n        \"rparen\": true,\n        \"lparen\": true\n    };\n\n    this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n        var self = this;\n        var replaceReg = /\\t|&|<|>|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\\uFFF9-\\uFFFC])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n        var replaceFunc = function(c, a, b, tabIdx, idx4) {\n            if (a) {\n                return self.showInvisibles\n                    ? \"<span class='ace_invisible ace_invisible_space'>\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"</span>\"\n                    : c;\n            } else if (c == \"&\") {\n                return \"&#38;\";\n            } else if (c == \"<\") {\n                return \"&#60;\";\n            } else if (c == \">\") {\n                return \"&#62;\";\n            } else if (c == \"\\t\") {\n                var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n                screenColumn += tabSize - 1;\n                return self.$tabStrings[tabSize];\n            } else if (c == \"\\u3000\") {\n                var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n                var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n                screenColumn += 1;\n                return \"<span class='\" + classToUse + \"' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + space + \"</span>\";\n            } else if (b) {\n                return \"<span class='ace_invisible ace_invisible_space ace_invalid'>\" + self.SPACE_CHAR + \"</span>\";\n            } else {\n                screenColumn += 1;\n                return \"<span class='ace_cjk' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + c + \"</span>\";\n            }\n        };\n\n        var output = value.replace(replaceReg, replaceFunc);\n\n        if (!this.$textToken[token.type]) {\n            var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n            var style = \"\";\n            if (token.type == \"fold\")\n                style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n            stringBuilder.push(\"<span class='\", classes, \"'\", style, \">\", output, \"</span>\");\n        }\n        else {\n            stringBuilder.push(output);\n        }\n        return screenColumn + value.length;\n    };\n\n    this.renderIndentGuide = function(stringBuilder, value, max) {\n        var cols = value.search(this.$indentGuideRe);\n        if (cols <= 0 || cols >= max)\n            return value;\n        if (value[0] == \" \") {\n            cols -= cols % this.tabSize;\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n            return value.substr(cols);\n        } else if (value[0] == \"\\t\") {\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n            return value.substr(cols);\n        }\n        return value;\n    };\n\n    this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n        var chars = 0;\n        var split = 0;\n        var splitChars = splits[0];\n        var screenColumn = 0;\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            var value = token.value;\n            if (i == 0 && this.displayIndentGuides) {\n                chars = value.length;\n                value = this.renderIndentGuide(stringBuilder, value, splitChars);\n                if (!value)\n                    continue;\n                chars -= value.length;\n            }\n\n            if (chars + value.length < splitChars) {\n                screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n                chars += value.length;\n            } else {\n                while (chars + value.length >= splitChars) {\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn,\n                        token, value.substring(0, splitChars - chars)\n                    );\n                    value = value.substring(splitChars - chars);\n                    chars = splitChars;\n\n                    if (!onlyContents) {\n                        stringBuilder.push(\"</div>\",\n                            \"<div class='ace_line' style='height:\",\n                            this.config.lineHeight, \"px'>\"\n                        );\n                    }\n\n                    stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\n                    split ++;\n                    screenColumn = 0;\n                    splitChars = splits[split] || Number.MAX_VALUE;\n                }\n                if (value.length != 0) {\n                    chars += value.length;\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn, token, value\n                    );\n                }\n            }\n        }\n    };\n\n    this.$renderSimpleLine = function(stringBuilder, tokens) {\n        var screenColumn = 0;\n        var token = tokens[0];\n        var value = token.value;\n        if (this.displayIndentGuides)\n            value = this.renderIndentGuide(stringBuilder, value);\n        if (value)\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        for (var i = 1; i < tokens.length; i++) {\n            token = tokens[i];\n            value = token.value;\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        }\n    };\n    this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n        if (!foldLine && foldLine != false)\n            foldLine = this.session.getFoldLine(row);\n\n        if (foldLine)\n            var tokens = this.$getFoldLineTokens(row, foldLine);\n        else\n            var tokens = this.session.getTokens(row);\n\n\n        if (!onlyContents) {\n            stringBuilder.push(\n                \"<div class='ace_line' style='height:\", \n                    this.config.lineHeight * (\n                        this.$useLineGroups() ? 1 :this.session.getRowLength(row)\n                    ), \"px'>\"\n            );\n        }\n\n        if (tokens.length) {\n            var splits = this.session.getRowSplitData(row);\n            if (splits && splits.length)\n                this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n            else\n                this.$renderSimpleLine(stringBuilder, tokens);\n        }\n\n        if (this.showInvisibles) {\n            if (foldLine)\n                row = foldLine.end.row;\n\n            stringBuilder.push(\n                \"<span class='ace_invisible ace_invisible_eol'>\",\n                row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n                \"</span>\"\n            );\n        }\n        if (!onlyContents)\n            stringBuilder.push(\"</div>\");\n    };\n\n    this.$getFoldLineTokens = function(row, foldLine) {\n        var session = this.session;\n        var renderTokens = [];\n\n        function addTokens(tokens, from, to) {\n            var idx = 0, col = 0;\n            while ((col + tokens[idx].value.length) < from) {\n                col += tokens[idx].value.length;\n                idx++;\n\n                if (idx == tokens.length)\n                    return;\n            }\n            if (col != from) {\n                var value = tokens[idx].value.substring(from - col);\n                if (value.length > (to - from))\n                    value = value.substring(0, to - from);\n\n                renderTokens.push({\n                    type: tokens[idx].type,\n                    value: value\n                });\n\n                col = from + value.length;\n                idx += 1;\n            }\n\n            while (col < to && idx < tokens.length) {\n                var value = tokens[idx].value;\n                if (value.length + col > to) {\n                    renderTokens.push({\n                        type: tokens[idx].type,\n                        value: value.substring(0, to - col)\n                    });\n                } else\n                    renderTokens.push(tokens[idx]);\n                col += value.length;\n                idx += 1;\n            }\n        }\n\n        var tokens = session.getTokens(row);\n        foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n            if (placeholder != null) {\n                renderTokens.push({\n                    type: \"fold\",\n                    value: placeholder\n                });\n            } else {\n                if (isNewRow)\n                    tokens = session.getTokens(row);\n\n                if (tokens.length)\n                    addTokens(tokens, lastColumn, column);\n            }\n        }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n        return renderTokens;\n    };\n\n    this.$useLineGroups = function() {\n        return this.session.getUseWrapMode();\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.$measureNode)\n            this.$measureNode.parentNode.removeChild(this.$measureNode);\n        delete this.$measureNode;\n    };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar isIE8;\n\nvar Cursor = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_cursor-layer\";\n    parentEl.appendChild(this.element);\n    \n    if (isIE8 === undefined)\n        isIE8 = !(\"opacity\" in this.element.style);\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 = (isIE8\n        ? this.$updateVisibility\n        : this.$updateOpacity).bind(this);\n};\n\n(function() {\n    \n    this.$updateVisibility = function(val) {\n        var cursors = this.cursors;\n        for (var i = cursors.length; i--; )\n            cursors[i].style.visibility = val ? \"\" : \"hidden\";\n    };\n    this.$updateOpacity = function(val) {\n        var cursors = this.cursors;\n        for (var i = cursors.length; i--; )\n            cursors[i].style.opacity = val ? \"\" : \"0\";\n    };\n    \n\n    this.$padding = 0;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n    };\n\n    this.setBlinking = function(blinking) {\n        if (blinking != this.isBlinking){\n            this.isBlinking = blinking;\n            this.restartTimer();\n        }\n    };\n\n    this.setBlinkInterval = function(blinkInterval) {\n        if (blinkInterval != this.blinkInterval){\n            this.blinkInterval = blinkInterval;\n            this.restartTimer();\n        }\n    };\n\n    this.setSmoothBlinking = function(smoothBlinking) {\n        if (smoothBlinking != this.smoothBlinking && !isIE8) {\n            this.smoothBlinking = smoothBlinking;\n            dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n            this.$updateCursors(true);\n            this.$updateCursors = (this.$updateOpacity).bind(this);\n            this.restartTimer();\n        }\n    };\n\n    this.addCursor = function() {\n        var el = dom.createElement(\"div\");\n        el.className = \"ace_cursor\";\n        this.element.appendChild(el);\n        this.cursors.push(el);\n        return el;\n    };\n\n    this.removeCursor = function() {\n        if (this.cursors.length > 1) {\n            var el = this.cursors.pop();\n            el.parentNode.removeChild(el);\n            return el;\n        }\n    };\n\n    this.hideCursor = function() {\n        this.isVisible = false;\n        dom.addCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.showCursor = function() {\n        this.isVisible = true;\n        dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.restartTimer = function() {\n        var update = this.$updateCursors;\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n        if (this.smoothBlinking) {\n            dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n        }\n        \n        update(true);\n\n        if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n            return;\n\n        if (this.smoothBlinking) {\n            setTimeout(function(){\n                dom.addCssClass(this.element, \"ace_smooth-blinking\");\n            }.bind(this));\n        }\n        \n        var blink = function(){\n            this.timeoutId = setTimeout(function() {\n                update(false);\n            }, 0.6 * this.blinkInterval);\n        }.bind(this);\n\n        this.intervalId = setInterval(function() {\n            update(true);\n            blink();\n        }, this.blinkInterval);\n\n        blink();\n    };\n\n    this.getPixelPosition = function(position, onScreen) {\n        if (!this.config || !this.session)\n            return {left : 0, top : 0};\n\n        if (!position)\n            position = this.session.selection.getCursor();\n        var pos = this.session.documentToScreenPosition(position);\n        var cursorLeft = this.$padding + (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.update = function(config) {\n        this.config = config;\n\n        var selections = this.session.$selectionMarkers;\n        var i = 0, cursorIndex = 0;\n\n        if (selections === undefined || selections.length === 0){\n            selections = [{cursor: null}];\n        }\n\n        for (var i = 0, n = selections.length; i < n; i++) {\n            var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n            if ((pixelPos.top > config.height + config.offset ||\n                 pixelPos.top < 0) && i > 1) {\n                continue;\n            }\n\n            var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n            \n            if (!this.drawCursor) {\n                style.left = pixelPos.left + \"px\";\n                style.top = pixelPos.top + \"px\";\n                style.width = config.characterWidth + \"px\";\n                style.height = config.lineHeight + \"px\";\n            } else {\n                this.drawCursor(style, 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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\nvar EventEmitter = acequire(\"./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.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(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n    this.onRender = onRender;\n    this.pending = false;\n    this.changes = 0;\n    this.window = win || window;\n};\n\n(function() {\n\n\n    this.schedule = function(change) {\n        this.changes = this.changes | change;\n        if (!this.pending && this.changes) {\n            this.pending = true;\n            var _self = this;\n            event.nextFrame(function() {\n                _self.pending = false;\n                var changes;\n                while (changes = _self.changes) {\n                    _self.changes = 0;\n                    _self.onRender(changes);\n                }\n            }, this.window);\n        }\n    };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\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    if (!CHAR_COUNT)\n        this.$testFractionalRect();\n    this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n    \n    this.$characterSize = {width: 0, height: 0};\n    this.checkForSizeChanges();\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n        \n    this.$characterSize = {width: 0, height: 0};\n    \n    this.$testFractionalRect = function() {\n        var el = dom.createElement(\"div\");\n        this.$setMeasureNodeStyles(el.style);\n        el.style.width = \"0.2px\";\n        document.documentElement.appendChild(el);\n        var w = el.getBoundingClientRect().width;\n        if (w > 0 && w < 1)\n            CHAR_COUNT = 50;\n        else\n            CHAR_COUNT = 100;\n        el.parentNode.removeChild(el);\n    };\n    \n    this.$setMeasureNodeStyles = function(style, isRoot) {\n        style.width = style.height = \"auto\";\n        style.left = style.top = \"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() {\n        var size = this.$measureSizes();\n        if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n            this.$measureNode.style.fontWeight = \"bold\";\n            var boldSize = this.$measureSizes();\n            this.$measureNode.style.fontWeight = \"\";\n            this.$characterSize = size;\n            this.charSizes = Object.create(null);\n            this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n            this._emit(\"changeCharacterSize\", {data: size});\n        }\n    };\n\n    this.$pollSizeChanges = function() {\n        if (this.$pollSizeChangesTimer)\n            return this.$pollSizeChangesTimer;\n        var self = this;\n        return this.$pollSizeChangesTimer = setInterval(function() {\n            self.checkForSizeChanges();\n        }, 500);\n    };\n    \n    this.setPolling = function(val) {\n        if (val) {\n            this.$pollSizeChanges();\n        } else if (this.$pollSizeChangesTimer) {\n            clearInterval(this.$pollSizeChangesTimer);\n            this.$pollSizeChangesTimer = 0;\n        }\n    };\n\n    this.$measureSizes = function() {\n        if (CHAR_COUNT === 50) {\n            var rect = null;\n            try { \n               rect = this.$measureNode.getBoundingClientRect();\n            } catch(e) {\n               rect = {width: 0, height:0 };\n            }\n            var size = {\n                height: rect.height,\n                width: rect.width / CHAR_COUNT\n            };\n        } else {\n            var size = {\n                height: this.$measureNode.clientHeight,\n                width: this.$measureNode.clientWidth / CHAR_COUNT\n            };\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.innerHTML = 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.el && this.el.parentNode)\n            this.el.parentNode.removeChild(this.el);\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/lib/useragent\",\"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\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar config = acequire(\"./config\");\nvar useragent = acequire(\"./lib/useragent\");\nvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\nvar MarkerLayer = acequire(\"./layer/marker\").Marker;\nvar TextLayer = acequire(\"./layer/text\").Text;\nvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\nvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\nvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\nvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\nvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\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;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\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_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block;   \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\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_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.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_text-input-ios {\\\nposition: absolute !important;\\\ntop: -100000px !important;\\\nleft: -100000px !important;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n    var _self = this;\n\n    this.container = container || dom.createElement(\"div\");\n    this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n    dom.addCssClass(this.container, \"ace_editor\");\n\n    this.setTheme(theme);\n\n    this.$gutter = dom.createElement(\"div\");\n    this.$gutter.className = \"ace_gutter\";\n    this.container.appendChild(this.$gutter);\n    this.$gutter.setAttribute(\"aria-hidden\", true);\n\n    this.scroller = dom.createElement(\"div\");\n    this.scroller.className = \"ace_scroller\";\n    this.container.appendChild(this.scroller);\n\n    this.content = dom.createElement(\"div\");\n    this.content.className = \"ace_content\";\n    this.scroller.appendChild(this.content);\n\n    this.$gutterLayer = new GutterLayer(this.$gutter);\n    this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n    this.$markerBack = new MarkerLayer(this.content);\n\n    var textLayer = this.$textLayer = new TextLayer(this.content);\n    this.canvas = textLayer.element;\n\n    this.$markerFront = new MarkerLayer(this.content);\n\n    this.$cursorLayer = new CursorLayer(this.content);\n    this.$horizScroll = false;\n    this.$vScroll = false;\n\n    this.scrollBar = \n    this.scrollBarV = new VScrollBar(this.container, this);\n    this.scrollBarH = new HScrollBar(this.container, this);\n    this.scrollBarV.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n    });\n    this.scrollBarH.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n    });\n\n    this.scrollTop = 0;\n    this.scrollLeft = 0;\n\n    this.cursorPos = {\n        row : 0,\n        column : 0\n    };\n\n    this.$fontMetrics = new FontMetrics(this.container);\n    this.$textLayer.$setFontMetrics(this.$fontMetrics);\n    this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n        _self.updateCharacterSize();\n        _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n        _self._signal(\"changeCharacterSize\", e);\n    });\n\n    this.$size = {\n        width: 0,\n        height: 0,\n        scrollerHeight: 0,\n        scrollerWidth: 0,\n        $dirty: true\n    };\n\n    this.layerConfig = {\n        width : 1,\n        padding : 0,\n        firstRow : 0,\n        firstRowScreen: 0,\n        lastRow : 0,\n        lineHeight : 0,\n        characterWidth : 0,\n        minHeight : 1,\n        maxHeight : 1,\n        offset : 0,\n        height : 1,\n        gutterOffset: 1\n    };\n    \n    this.scrollMargin = {\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        v: 0,\n        h: 0\n    };\n\n    this.$loop = new RenderLoop(\n        this.$renderChanges.bind(this),\n        this.container.ownerDocument.defaultView\n    );\n    this.$loop.schedule(this.CHANGE_FULL);\n\n    this.updateCharacterSize();\n    this.setPadding(4);\n    config.resetOptions(this);\n    config._emit(\"renderer\", this);\n};\n\n(function() {\n\n    this.CHANGE_CURSOR = 1;\n    this.CHANGE_MARKER = 2;\n    this.CHANGE_GUTTER = 4;\n    this.CHANGE_SCROLL = 8;\n    this.CHANGE_LINES = 16;\n    this.CHANGE_TEXT = 32;\n    this.CHANGE_SIZE = 64;\n    this.CHANGE_MARKER_BACK = 128;\n    this.CHANGE_MARKER_FRONT = 256;\n    this.CHANGE_FULL = 512;\n    this.CHANGE_H_SCROLL = 1024;\n\n    oop.implement(this, EventEmitter);\n\n    this.updateCharacterSize = function() {\n        if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n            this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n            this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n        }\n\n        this.layerConfig.characterWidth =\n        this.characterWidth = this.$textLayer.getCharacterWidth();\n        this.layerConfig.lineHeight =\n        this.lineHeight = this.$textLayer.getLineHeight();\n        this.$updatePrintMargin();\n    };\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n            \n        this.session = session;\n        if (session && 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.scrollBarV.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            this.scrollBarH.element.style.left = \n            this.scroller.style.left = gutterWidth + \"px\";\n            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());           \n            \n            this.scrollBarH.element.style.right = \n            this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n            this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n                changes |= this.CHANGE_FULL;\n        }\n        \n        size.$dirty = !width || !height;\n\n        if (changes)\n            this._signal(\"resize\", oldSize);\n\n        return changes;\n    };\n\n    this.onGutterResize = function() {\n        var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n        if (gutterWidth != this.gutterWidth)\n            this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n        if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else if (this.$size.$dirty) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else {\n            this.$computeLayerConfig();\n            this.$loop.schedule(this.CHANGE_MARKER);\n        }\n    };\n    this.adjustWrapLimit = function() {\n        var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n        var limit = Math.floor(availableWidth / this.characterWidth);\n        return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n    };\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.setOption(\"animatedScroll\", shouldAnimate);\n    };\n    this.getAnimatedScroll = function() {\n        return this.$animatedScroll;\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.setOption(\"showInvisibles\", showInvisibles);\n        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.$updateGutterLineHighlight = function() {\n        var pos = this.$cursorLayer.$pixelPos;\n        var height = this.layerConfig.lineHeight;\n        if (this.session.getUseWrapMode()) {\n            var cursor = this.session.selection.getCursor();\n            cursor.column = 0;\n            pos = this.$cursorLayer.getPixelPosition(cursor, true);\n            height *= this.session.getRowLength(cursor.row);\n        }\n        this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n        this.$gutterLineHighlight.style.height = height + \"px\";\n    };\n\n    this.$updatePrintMargin = function() {\n        if (!this.$showPrintMargin && !this.$printMarginEl)\n            return;\n\n        if (!this.$printMarginEl) {\n            var containerEl = dom.createElement(\"div\");\n            containerEl.className = \"ace_layer ace_print-margin-layer\";\n            this.$printMarginEl = dom.createElement(\"div\");\n            this.$printMarginEl.className = \"ace_print-margin\";\n            containerEl.appendChild(this.$printMarginEl);\n            this.content.insertBefore(containerEl, this.content.firstChild);\n        }\n\n        var style = this.$printMarginEl.style;\n        style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n        style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n        \n        if (this.session && this.session.$wrap == -1)\n            this.adjustWrapLimit();\n    };\n    this.getContainerElement = function() {\n        return this.container;\n    };\n    this.getMouseEventTarget = function() {\n        return this.scroller;\n    };\n    this.getTextAreaContainer = function() {\n        return this.container;\n    };\n    this.$moveTextAreaToCursor = function() {\n        if (!this.$keepTextAreaAtCursor)\n            return;\n        var config = this.layerConfig;\n        var posTop = this.$cursorLayer.$pixelPos.top;\n        var posLeft = this.$cursorLayer.$pixelPos.left;\n        posTop -= config.offset;\n\n        var style = this.textarea.style;\n        var h = this.lineHeight;\n        if (posTop < 0 || posTop > config.height - h) {\n            style.top = style.left = \"0\";\n            return;\n        }\n\n        var w = this.characterWidth;\n        if (this.$composition) {\n            var val = this.textarea.value.replace(/^\\x01+/, \"\");\n            w *= (this.session.$getStringScreenWidth(val)[0]+2);\n            h += 2;\n        }\n        posLeft -= this.scrollLeft;\n        if (posLeft > this.$size.scrollerWidth - w)\n            posLeft = this.$size.scrollerWidth - w;\n\n        posLeft += this.gutterWidth;\n        style.height = h + \"px\";\n        style.width = w + \"px\";\n        style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n        style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n    };\n    this.getFirstVisibleRow = function() {\n        return this.layerConfig.firstRow;\n    };\n    this.getFirstFullyVisibleRow = function() {\n        return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n    };\n    this.getLastFullyVisibleRow = function() {\n        var 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    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\");\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();\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();\n                }\n            }\n            config = this.layerConfig;\n            this.$updateScrollBarV();\n            if (changes & this.CHANGE_H_SCROLL)\n                this.$updateScrollBarH();\n            this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n            this.content.style.marginTop = (-config.offset) + \"px\";\n            this.content.style.width = config.width + 2 * this.$padding + \"px\";\n            this.content.style.height = config.minHeight + \"px\";\n        }\n        if (changes & this.CHANGE_H_SCROLL) {\n            this.content.style.marginLeft = -this.scrollLeft + \"px\";\n            this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n        }\n        if (changes & this.CHANGE_FULL) {\n            this.$textLayer.update(config);\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n            this.$markerBack.update(config);\n            this.$markerFront.update(config);\n            this.$cursorLayer.update(config);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this._signal(\"afterRender\");\n            return;\n        }\n        if (changes & this.CHANGE_SCROLL) {\n            if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n                this.$textLayer.update(config);\n            else\n                this.$textLayer.scrollLines(config);\n\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n            this.$markerBack.update(config);\n            this.$markerFront.update(config);\n            this.$cursorLayer.update(config);\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this.$moveTextAreaToCursor();\n            this._signal(\"afterRender\");\n            return;\n        }\n\n        if (changes & this.CHANGE_TEXT) {\n            this.$textLayer.update(config);\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n        else if (changes & this.CHANGE_LINES) {\n            if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n        else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n\n        if (changes & this.CHANGE_CURSOR) {\n            this.$cursorLayer.update(config);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n            this.$markerFront.update(config);\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n            this.$markerBack.update(config);\n        }\n\n        this._signal(\"afterRender\");\n    };\n\n    \n    this.$autosize = function() {\n        var height = this.session.getScreenLength() * this.lineHeight;\n        var maxHeight = this.$maxLines * this.lineHeight;\n        var desiredHeight = Math.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        var vScroll = height > maxHeight;\n        \n        if (desiredHeight != this.desiredHeight ||\n            this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n            if (vScroll != this.$vScroll) {\n                this.$vScroll = vScroll;\n                this.scrollBarV.setVisible(vScroll);\n            }\n            \n            var w = this.container.clientWidth;\n            this.container.style.height = desiredHeight + \"px\";\n            this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n            this.desiredHeight = desiredHeight;\n            \n            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 offset = this.scrollTop % this.lineHeight;\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 lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n        var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n        var lastRow = firstRow + lineCount;\n        var firstRowScreen, firstRowHeight;\n        var lineHeight = this.lineHeight;\n        firstRow = session.screenToDocumentRow(firstRow, 0);\n        var foldLine = session.getFoldLine(firstRow);\n        if (foldLine) {\n            firstRow = foldLine.start.row;\n        }\n\n        firstRowScreen = session.documentToScreenRow(firstRow, 0);\n        firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n        lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n        minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n                                                firstRowHeight;\n\n        offset = this.scrollTop - firstRowScreen * lineHeight;\n\n        var changes = 0;\n        if (this.layerConfig.width != longestLine) \n            changes = this.CHANGE_H_SCROLL;\n        if (hScrollChanged || vScrollChanged) {\n            changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n            this._signal(\"scrollbarVisibilityChanged\");\n            if (vScrollChanged)\n                longestLine = this.$getLongestLine();\n        }\n        \n        this.layerConfig = {\n            width : longestLine,\n            padding : this.$padding,\n            firstRow : firstRow,\n            firstRowScreen: firstRowScreen,\n            lastRow : lastRow,\n            lineHeight : lineHeight,\n            characterWidth : this.characterWidth,\n            minHeight : minHeight,\n            maxHeight : maxHeight,\n            offset : offset,\n            gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n            height : this.$size.scrollerHeight\n        };\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        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 - this.$size.scrollerHeight);\n        }\n\n        var scrollLeft = this.scrollLeft;\n\n        if (scrollLeft > left) {\n            if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n                left = -this.scrollMargin.left;\n            this.session.setScrollLeft(left);\n        } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n            this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n        } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n            this.session.setScrollLeft(0);\n        }\n    };\n    this.getScrollTop = function() {\n        return this.session.getScrollTop();\n    };\n    this.getScrollLeft = function() {\n        return this.session.getScrollLeft();\n    };\n    this.getScrollTopRow = function() {\n        return this.scrollTop / this.lineHeight;\n    };\n    this.getScrollBottomRow = function() {\n        return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n    };\n    this.scrollToRow = function(row) {\n        this.session.setScrollTop(row * this.lineHeight);\n    };\n\n    this.alignCursor = function(cursor, alignment) {\n        if (typeof cursor == \"number\")\n            cursor = {row: cursor, column: 0};\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n        var h = this.$size.scrollerHeight - this.lineHeight;\n        var offset = pos.top - h * (alignment || 0);\n\n        this.session.setScrollTop(offset);\n        return offset;\n    };\n\n    this.STEPS = 8;\n    this.$calcSteps = function(fromValue, toValue){\n        var i = 0;\n        var l = this.STEPS;\n        var steps = [];\n\n        var func  = function(t, x_min, dx) {\n            return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n        };\n\n        for (i = 0; i < l; ++i)\n            steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n        return steps;\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n        var offset = pos.top;\n        if (center)\n            offset -= this.$size.scrollerHeight / 2;\n\n        var initialScroll = this.scrollTop;\n        this.session.setScrollTop(offset);\n        if (animate !== false)\n            this.animateScrolling(initialScroll, callback);\n    };\n\n    this.animateScrolling = function(fromValue, callback) {\n        var toValue = this.scrollTop;\n        if (!this.$animatedScroll)\n            return;\n        var _self = this;\n        \n        if (fromValue == toValue)\n            return;\n        \n        if (this.$scrollAnimation) {\n            var oldSteps = this.$scrollAnimation.steps;\n            if (oldSteps.length) {\n                fromValue = oldSteps[0];\n                if (fromValue == toValue)\n                    return;\n            }\n        }\n        \n        var steps = _self.$calcSteps(fromValue, toValue);\n        this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n        clearInterval(this.$timer);\n\n        _self.session.setScrollTop(steps.shift());\n        _self.session.$scrollTop = toValue;\n        this.$timer = setInterval(function() {\n            if (steps.length) {\n                _self.session.setScrollTop(steps.shift());\n                _self.session.$scrollTop = toValue;\n            } else if (toValue != null) {\n                _self.session.$scrollTop = -1;\n                _self.session.setScrollTop(toValue);\n                toValue = null;\n            } else {\n                _self.$timer = clearInterval(_self.$timer);\n                _self.$scrollAnimation = null;\n                callback && callback();\n            }\n        }, 10);\n    };\n    this.scrollToY = function(scrollTop) {\n        if (this.scrollTop !== scrollTop) {\n            this.$loop.schedule(this.CHANGE_SCROLL);\n            this.scrollTop = scrollTop;\n        }\n    };\n    this.scrollToX = function(scrollLeft) {\n        if (this.scrollLeft !== scrollLeft)\n            this.scrollLeft = scrollLeft;\n        this.$loop.schedule(this.CHANGE_H_SCROLL);\n    };\n    this.scrollTo = function(x, y) {\n        this.session.setScrollTop(y);\n        this.session.setScrollLeft(y);\n    };\n    this.scrollBy = function(deltaX, deltaY) {\n        deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n        deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n    };\n    this.isScrollableBy = function(deltaX, deltaY) {\n        if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n           return true;\n        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n            - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n           return true;\n        if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n            return true;\n        if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n            - this.layerConfig.width < -1 + this.scrollMargin.right)\n           return true;\n    };\n\n    this.pixelToScreenCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var 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 = 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 = this.scroller.getBoundingClientRect();\n        var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n\n        var col = Math.round(offsetX / this.characterWidth);\n\n        var row = (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(position) {\n        if (!this.$composition)\n            this.$composition = {\n                keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n                cssText: this.textarea.style.cssText\n            };\n\n        this.$keepTextAreaAtCursor = true;\n        dom.addCssClass(this.textarea, \"ace_composition\");\n        this.textarea.style.cssText = \"\";\n        this.$moveTextAreaToCursor();\n    };\n    this.setCompositionText = function(text) {\n        this.$moveTextAreaToCursor();\n    };\n    this.hideComposition = function() {\n        if (!this.$composition)\n            return;\n\n        dom.removeCssClass(this.textarea, \"ace_composition\");\n        this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n        this.textarea.style.cssText = this.$composition.cssText;\n        this.$composition = null;\n    };\n    this.setTheme = function(theme, cb) {\n        var _self = this;\n        this.$themeId = theme;\n        _self._dispatchEvent('themeChange',{theme:theme});\n\n        if (!theme || typeof theme == \"string\") {\n            var moduleName = theme || this.$options.theme.initialValue;\n            config.loadModule([\"theme\", moduleName], afterLoad);\n        } else {\n            afterLoad(theme);\n        }\n\n        function afterLoad(module) {\n            if (_self.$themeId != theme)\n                return cb && cb();\n            if (!module || !module.cssClass)\n                throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n            dom.importCssString(\n                module.cssText,\n                module.cssClass,\n                _self.container.ownerDocument\n            );\n\n            if (_self.theme)\n                dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n            var padding = \"padding\" in module ? module.padding \n                : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n            if (_self.$padding && padding != _self.$padding)\n                _self.setPadding(padding);\n            _self.$theme = module.cssClass;\n\n            _self.theme = module;\n            dom.addCssClass(_self.container, module.cssClass);\n            dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n            if (_self.$size) {\n                _self.$size.width = 0;\n                _self.$updateSizeAsync();\n            }\n\n            _self._dispatchEvent('themeLoaded', {theme:module});\n            cb && cb();\n        }\n    };\n    this.getTheme = function() {\n        return this.$themeId;\n    };\n    this.setStyle = function(style, include) {\n        dom.setCssClass(this.container, style, include !== false);\n    };\n    this.unsetStyle = function(style) {\n        dom.removeCssClass(this.container, style);\n    };\n    \n    this.setCursorStyle = function(style) {\n        if (this.scroller.style.cursor != style)\n            this.scroller.style.cursor = style;\n    };\n    this.setMouseCursor = function(cursorStyle) {\n        this.scroller.style.cursor = cursorStyle;\n    };\n    this.destroy = function() {\n        this.$textLayer.destroy();\n        this.$cursorLayer.destroy();\n    };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n    animatedScroll: {initialValue: false},\n    showInvisibles: {\n        set: function(value) {\n            if (this.$textLayer.setShowInvisibles(value))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: false\n    },\n    showPrintMargin: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: true\n    },\n    printMarginColumn: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: 80\n    },\n    printMargin: {\n        set: function(val) {\n            if (typeof val == \"number\")\n                this.$printMarginColumn = val;\n            this.$showPrintMargin = !!val;\n            this.$updatePrintMargin();\n        },\n        get: function() {\n            return this.$showPrintMargin && this.$printMarginColumn; \n        }\n    },\n    showGutter: {\n        set: function(show){\n            this.$gutter.style.display = show ? \"block\" : \"none\";\n            this.$loop.schedule(this.CHANGE_FULL);\n            this.onGutterResize();\n        },\n        initialValue: true\n    },\n    fadeFoldWidgets: {\n        set: function(show) {\n            dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n        },\n        initialValue: false\n    },\n    showFoldWidgets: {\n        set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\n        initialValue: true\n    },\n    showLineNumbers: {\n        set: function(show) {\n            this.$gutterLayer.setShowLineNumbers(show);\n            this.$loop.schedule(this.CHANGE_GUTTER);\n        },\n        initialValue: true\n    },\n    displayIndentGuides: {\n        set: function(show) {\n            if (this.$textLayer.setDisplayIndentGuides(show))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: true\n    },\n    highlightGutterLine: {\n        set: function(shouldHighlight) {\n            if (!this.$gutterLineHighlight) {\n                this.$gutterLineHighlight = dom.createElement(\"div\");\n                this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n                this.$gutter.appendChild(this.$gutterLineHighlight);\n                return;\n            }\n\n            this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n            if (this.$cursorLayer.$pixelPos)\n                this.$updateGutterLineHighlight();\n        },\n        initialValue: false,\n        value: true\n    },\n    hScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    vScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    fontSize:  {\n        set: function(size) {\n            if (typeof size == \"number\")\n                size = size + \"px\";\n            this.container.style.fontSize = size;\n            this.updateFontSize();\n        },\n        initialValue: 12\n    },\n    fontFamily: {\n        set: function(name) {\n            this.container.style.fontFamily = name;\n            this.updateFontSize();\n        }\n    },\n    maxLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    minLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    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});\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(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar net = acequire(\"../lib/net\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\nvar config = acequire(\"../config\");\n\nfunction $workerBlob(workerUrl, mod) {\n    var script = mod.src;\"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, mod) {\n    var blob = $workerBlob(workerUrl, mod);\n    var URL = window.URL || window.webkitURL;\n    var blobURL = URL.createObjectURL(blob);\n    return new Worker(blobURL);\n}\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.onMessage = this.onMessage.bind(this);\n    if (acequire.nameToUrl && !acequire.toUrl)\n        acequire.toUrl = acequire.nameToUrl;\n    \n    if (config.get(\"packaged\") || !acequire.toUrl) {\n        workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\");\n    } else {\n        var normalizePath = this.$normalizePath;\n        workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n        var tlns = {};\n        topLevelNamespaces.forEach(function(ns) {\n            tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n        });\n    }\n\n    this.$worker = createWorker(workerUrl, mod);\n    if (importScripts) {\n        this.send(\"importScripts\", importScripts);\n    }\n    this.$worker.postMessage({\n        init : true,\n        tlns : tlns,\n        module : mod.id,\n        classname : classname\n    });\n\n    this.callbackId = 1;\n    this.callbacks = {};\n\n    this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.onMessage = function(e) {\n        var msg = e.data;\n        switch (msg.type) {\n            case \"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            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    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.callbackId = 1;\n    this.callbacks = {};\n    this.messageBuffer = [];\n\n    var main = null;\n    var emitSync = false;\n    var sender = Object.create(EventEmitter);\n    var _self = this;\n\n    this.$worker = {};\n    this.$worker.terminate = function() {};\n    this.$worker.postMessage = function(e) {\n        _self.messageBuffer.push(e);\n        if (main) {\n            if (emitSync)\n                setTimeout(processNext);\n            else\n                processNext();\n        }\n    };\n    this.setEmitSync = function(val) { emitSync = val; };\n\n    var processNext = function() {\n        var msg = _self.messageBuffer.shift();\n        if (msg.command)\n            main[msg.command].apply(main, msg.args);\n        else if (msg.event)\n            sender._signal(msg.event, msg.data);\n    };\n\n    sender.postMessage = function(msg) {\n        _self.onMessage({data: msg});\n    };\n    sender.callback = function(data, callbackId) {\n        this.postMessage({type: \"call\", id: callbackId, data: data});\n    };\n    sender.emit = function(name, data) {\n        this.postMessage({type: \"event\", name: name, data: data});\n    };\n\n    config.loadModule([\"worker\", mod], function(Main) {\n        main = new Main[classname](sender);\n        while (_self.messageBuffer.length)\n            processNext();\n    });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar oop = acequire(\"./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.removeEventListener(\"change\", this.$onUpdate);\n        this.session.selection.removeEventListener(\"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(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(acequire, exports, module) {\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../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        \n        editor.$blockScrolling++;\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.$blockScrolling--;\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.$blockScrolling++;\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            editor.$blockScrolling--;\n        };\n        editor.$blockScrolling++;\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        editor.$blockScrolling--;\n        \n        screenCursor = {row: -1, column: -1};\n\n        var onMouseSelectionEnd = function(e) {\n            clearInterval(timerId);\n            editor.removeSelectionMarkers(rectSel);\n            if (!rectSel.length)\n                rectSel = [selection.toOrientedRange()];\n            editor.$blockScrolling++;\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            editor.$blockScrolling--;\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(acequire, exports, module) {\nexports.defaultCommands = [{\n    name: \"addCursorAbove\",\n    exec: function(editor) { editor.selectMoreLines(-1); },\n    bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"addCursorBelow\",\n    exec: function(editor) { editor.selectMoreLines(1); },\n    bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"addCursorAboveSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"addCursorBelowSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectMoreBefore\",\n    exec: function(editor) { editor.selectMore(-1); },\n    bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectMoreAfter\",\n    exec: function(editor) { editor.selectMore(1); },\n    bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectNextBefore\",\n    exec: function(editor) { editor.selectMore(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectNextAfter\",\n    exec: function(editor) { editor.selectMore(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"splitIntoLines\",\n    exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n    bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n    readOnly: true\n}, {\n    name: \"alignCursors\",\n    exec: function(editor) { editor.alignCursors(); },\n    bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"findAll\",\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    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 = acequire(\"../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(acequire, exports, module) {\n\nvar RangeList = acequire(\"./range_list\").RangeList;\nvar Range = acequire(\"./range\").Range;\nvar Selection = acequire(\"./selection\").Selection;\nvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar commands = acequire(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = acequire(\"./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 = acequire(\"./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\n    this.toSingleRange = function(range) {\n        range = range || this.ranges[0];\n        var removed = this.rangeList.removeAll();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        range && this.fromOrientedRange(range);\n    };\n    this.substractPoint = function(pos) {\n        var removed = this.rangeList.substractPoint(pos);\n        if (removed) {\n            this.$onRemoveRange(removed);\n            return removed[0];\n        }\n    };\n    this.mergeOverlappingRanges = function() {\n        var removed = this.rangeList.merge();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n        else if(this.ranges[0])\n            this.fromOrientedRange(this.ranges[0]);\n    };\n\n    this.$onAddRange = function(range) {\n        this.rangeCount = this.rangeList.ranges.length;\n        this.ranges.unshift(range);\n        this._signal(\"addRange\", {range: range});\n    };\n\n    this.$onRemoveRange = function(removed) {\n        this.rangeCount = this.rangeList.ranges.length;\n        if (this.rangeCount == 1 && this.inMultiSelectMode) {\n            var lastRange = this.rangeList.ranges.pop();\n            removed.push(lastRange);\n            this.rangeCount = 0;\n        }\n\n        for (var i = removed.length; i--; ) {\n            var index = this.ranges.indexOf(removed[i]);\n            this.ranges.splice(index, 1);\n        }\n\n        this._signal(\"removeRange\", {ranges: removed});\n\n        if (this.rangeCount === 0 && this.inMultiSelectMode) {\n            this.inMultiSelectMode = false;\n            this._signal(\"singleSelect\");\n            this.session.$undoSelect = true;\n            this.rangeList.detach(this.session);\n        }\n\n        lastRange = lastRange || this.ranges[0];\n        if (lastRange && !lastRange.isEqual(this.getRange()))\n            this.fromOrientedRange(lastRange);\n    };\n    this.$initRangeList = function() {\n        if (this.rangeList)\n            return;\n\n        this.rangeList = new RangeList();\n        this.ranges = [];\n        this.rangeCount = 0;\n    };\n    this.getAllRanges = function() {\n        return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n    };\n\n    this.splitIntoLines = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var range = this.getRange();\n            var isBackwards = this.isBackwards();\n            var startRow = range.start.row;\n            var endRow = range.end.row;\n            if (startRow == endRow) {\n                if (isBackwards)\n                    var start = range.end, end = range.start;\n                else\n                    var start = range.start, end = range.end;\n                \n                this.addRange(Range.fromPoints(end, end));\n                this.addRange(Range.fromPoints(start, start));\n                return;\n            }\n\n            var rectSel = [];\n            var r = this.getLineRange(startRow, true);\n            r.start.column = range.start.column;\n            rectSel.push(r);\n\n            for (var i = startRow + 1; i < endRow; i++)\n                rectSel.push(this.getLineRange(i, true));\n\n            r = this.getLineRange(endRow, true);\n            r.end.column = range.end.column;\n            rectSel.push(r);\n\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.toggleBlockSelection = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var cursor = this.session.documentToScreenPosition(this.selectionLead);\n            var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n            var rectSel = this.rectangularRangeBlock(cursor, anchor);\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n        var rectSel = [];\n\n        var xBackwards = screenCursor.column < screenAnchor.column;\n        if (xBackwards) {\n            var startColumn = screenCursor.column;\n            var endColumn = screenAnchor.column;\n            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        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                var docEnd = range.end;\n            }\n            range.cursor = xBackwards ? range.start : range.end;\n            rectSel.push(range);\n        }\n\n        if (yBackwards)\n            rectSel.reverse();\n\n        if (!includeEmptyLines) {\n            var end = rectSel.length - 1;\n            while (rectSel[end].isEmpty() && end > 0)\n                end--;\n            if (end > 0) {\n                var start = 0;\n                while (rectSel[start].isEmpty())\n                    start++;\n            }\n            for (var i = end; i >= start; i--) {\n                if (rectSel[i].isEmpty())\n                    rectSel.splice(i, 1);\n            }\n        }\n\n        return rectSel;\n    };\n}).call(Selection.prototype);\nvar Editor = acequire(\"./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        \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        }\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        this.$blockScrolling += 1;\n        var selection = this.multiSelect;\n\n        if (!additive)\n            selection.toSingleRange(ranges[0]);\n\n        for (var i = ranges.length; i--; )\n            selection.addRange(ranges[i], true);\n        if (range && selection.rangeList.rangeAtPoint(range.start))\n            selection.addRange(range, true);\n        \n        this.$blockScrolling -= 1;\n\n        return ranges.length;\n    };\n    this.selectMoreLines = function(dir, skip) {\n        var range = this.selection.toOrientedRange();\n        var isBackwards = range.cursor == range.end;\n\n        var screenLead = this.session.documentToScreenPosition(range.cursor);\n        if (this.selection.$desiredColumn)\n            screenLead.column = this.selection.$desiredColumn;\n\n        var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n        if (!range.isEmpty()) {\n            var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n            var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n        } else {\n            var anchor = lead;\n        }\n\n        if (isBackwards) {\n            var newRange = Range.fromPoints(lead, anchor);\n            newRange.cursor = newRange.start;\n        } else {\n            var newRange = Range.fromPoints(anchor, lead);\n            newRange.cursor = newRange.end;\n        }\n\n        newRange.desiredColumn = screenLead.column;\n        if (!this.selection.inMultiSelectMode) {\n            this.selection.addRange(range);\n        } else {\n            if (skip)\n                var toRemove = range.cursor;\n        }\n\n        this.selection.addRange(newRange);\n        if (toRemove)\n            this.selection.substractPoint(toRemove);\n    };\n    this.transposeSelections = function(dir) {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var all = sel.ranges;\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            if (range.isEmpty()) {\n                var tmp = session.getWordRange(range.start.row, range.start.column);\n                range.start.row = tmp.start.row;\n                range.start.column = tmp.start.column;\n                range.end.row = tmp.end.row;\n                range.end.column = tmp.end.column;\n            }\n        }\n        sel.mergeOverlappingRanges();\n\n        var words = [];\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            words.unshift(session.getTextRange(range));\n        }\n\n        if (dir < 0)\n            words.unshift(words.pop());\n        else\n            words.push(words.shift());\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            var tmp = range.clone();\n            session.replace(range, words[i]);\n            range.start.row = tmp.start.row;\n            range.start.column = tmp.start.column;\n        }\n    };\n    this.selectMore = function(dir, skip, 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.$blockScrolling += 1;\n            this.session.unfold(newRange);\n            this.multiSelect.addRange(newRange);\n            this.$blockScrolling -= 1;\n            this.renderer.scrollCursorIntoView(null, 0.5);\n        }\n        if (skip)\n            this.multiSelect.substractPoint(range.cursor);\n    };\n    this.alignCursors = function() {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var ranges = sel.ranges;\n        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    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    });\n\n    event.addListener(el, \"keyup\", reset);\n    event.addListener(el, \"blur\", reset);\n    function reset(e) {\n        if (altCursor) {\n            editor.renderer.setMouseCursor(\"\");\n            altCursor = false;\n        }\n    }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nacequire(\"./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(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = session.getFoldWidget(end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n    this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var end = {row: row, column: column};\n        var start = session.$findOpeningBracket(bracket, end);\n\n        if (!start)\n            return;\n\n        start.column++;\n        end.column--;\n\n        return  Range.fromPoints(start, end);\n    };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, 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\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar Range = acequire(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n    this.session = session;\n    this.session.widgetManager = this;\n    this.session.getRowLength = this.getRowLength;\n    this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n    this.updateOnChange = this.updateOnChange.bind(this);\n    this.renderWidgets = this.renderWidgets.bind(this);\n    this.measureWidgets = this.measureWidgets.bind(this);\n    this.session._changedWidgets = [];\n    this.$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            removed.forEach(function(w) {\n                w && this.removeLineWidget(w);\n            }, this);\n            this.$updateRows();\n        } else {\n            var args = new Array(len);\n            args.unshift(startRow, 0);\n            lineWidgets.splice.apply(lineWidgets, args);\n            this.$updateRows();\n        }\n    };\n    \n    this.$updateRows = function() {\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets) return;\n        var noWidgets = true;\n        lineWidgets.forEach(function(w, i) {\n            if (w) {\n                noWidgets = false;\n                w.row = i;\n                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.addLineWidget = 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        \n        w.session = this.session;\n        \n        var renderer = this.editor.renderer;\n        if (w.html && !w.el) {\n            w.el = dom.createElement(\"div\");\n            w.el.innerHTML = w.html;\n        }\n        if (w.el) {\n            dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n            w.el.style.position = \"absolute\";\n            w.el.style.zIndex = 5;\n            renderer.container.appendChild(w.el);\n            w._inDocument = true;\n        }\n        \n        if (!w.coverGutter) {\n            w.el.style.zIndex = 3;\n        }\n        if (w.pixelHeight == null) {\n            w.pixelHeight = w.el.offsetHeight;\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(acequire, exports, module) {\n\"use strict\";\nvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\nvar dom = acequire(\"../lib/dom\");\nvar Range = acequire(\"../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\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/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(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\n\nvar Editor = acequire(\"./editor\").Editor;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar UndoManager = acequire(\"./undomanager\").UndoManager;\nvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\nacequire(\"./worker/worker_client\");\nacequire(\"./keyboard/hash_handler\");\nacequire(\"./placeholder\");\nacequire(\"./multi_select\");\nacequire(\"./mode/folding/fold_mode\");\nacequire(\"./theme/textmate\");\nacequire(\"./ext/error_marker\");\n\nexports.config = acequire(\"./config\");\nexports.acequire = acequire;\n\nif (typeof define === \"function\")\n    exports.define = define;\nexports.edit = function(el) {\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 = dom.getInnerText(el);\n        el.innerHTML = \"\";\n    }\n\n    var doc = exports.createEditSession(value);\n\n    var editor = new Editor(new Renderer(el));\n    editor.setSession(doc);\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.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.version = \"1.2.9\";\n});\n            (function() {\n                ace.acequire([\"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                });\n            })();\n        \nmodule.exports = window.ace.acequire(\"ace/ace\");"],"names":["global","this","window","define","module","deps","payload","arguments","length","modules","payloads","original","apply","console","error","trace","ns","root","_acequire","parentId","callback","lookup","undefined","Object","prototype","toString","call","params","i","l","dep","acequire","push","packagedModule","normalizeModule","moduleName","indexOf","chunks","split","charAt","slice","join","previous","replace","exports","mod","id","uri","packaged","ace","x","real","exec","RegExp","test","match","String","compliantExecNpcg","compliantLastIndexIncrement","lastIndex","getNativeFlags","regex","ignoreCase","multiline","extended","sticky","array","item","from","Array","str","name","r2","source","index","_xregexp","captureNames","Empty","Function","bind","that","target","TypeError","args","bound","result","concat","defineGetter","defineSetter","lookupGetter","lookupSetter","supportsAccessors","prototypeOfArray","prototypeOfObject","_toString","owns","hasOwnProperty","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","splice","makeArray","a","lengthBefore","array_splice","start","deleteCount","pos","removeCount","Math","max","removed","insert","add","remove","min","tailOldPos","tailNewPos","tailCount","lengthAfterRemove","isArray","obj","createEmpty","freezeObject","boxedString","splitString","forEach","fun","object","toObject","self","thisp","map","filter","value","every","some","reduce","reduceRight","sought","toInteger","lastIndexOf","abs","getPrototypeOf","__proto__","constructor","getOwnPropertyDescriptor","property","descriptor","enumerable","configurable","getter","setter","get","set","getOwnPropertyNames","keys","create","empty","propertyIsEnumerable","isPrototypeOf","toLocaleString","valueOf","properties","Type","defineProperties","doesDefinePropertyWork","defineProperty","exception","definePropertyWorksOnObject","definePropertyWorksOnDom","document","createElement","definePropertyFallback","seal","freeze","preventExtensions","isSealed","isFrozen","isExtensible","returnValue","hasDontEnumBug","dontEnums","dontEnumsLength","key","ii","dontEnum","Date","now","getTime","ws","trim","trimBeginRegexp","trimEndRegexp","n","floor","o","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","hasCssClass","el","className","addCssClass","removeCssClass","classes","toggleCssClass","setCssClass","node","include","hasCssString","sheets","createStyleSheet","styleSheets","owningElement","importCssString","cssText","style","appendChild","createTextNode","importCssStylsheet","link","rel","href","getInnerWidth","element","parseInt","computedStyle","clientWidth","getInnerHeight","clientHeight","scrollbarWidth","inner","width","minWidth","height","display","outer","position","left","overflow","body","noScrollbar","offsetWidth","withScrollbar","removeChild","pageYOffset","getPageScrollTop","getPageScrollLeft","pageXOffset","scrollTop","scrollLeft","getComputedStyle","currentStyle","setInnerHtml","innerHtml","cloneNode","innerHTML","parentNode","replaceChild","setInnerText","innerText","textContent","getInnerText","getParentWindow","defaultView","parentWindow","inherits","ctor","superCtor","super_","writable","mixin","implement","proto","oop","Keys","ret","MODIFIER_KEYS","KEY_MODS","FUNCTION_KEYS","PRINTABLE_KEYS","toLowerCase","enter","escape","esc","del","mods","pow","keyCodeToString","keyCode","keyString","fromCharCode","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","navigator","os","platform","ua","userAgent","isWin","isIE","appName","parseFloat","isOldIE","isGecko","isMozilla","Controllers","controllers","product","isOldGecko","isOpera","opera","isWebKit","isChrome","isAIR","isIPad","isChromeOS","isIOS","MSStream","useragent","pressedKeys","ts","addListener","elem","type","addEventListener","attachEvent","wrapper","event","_wrapper","removeListener","removeEventListener","detachEvent","stopEvent","e","stopPropagation","preventDefault","cancelBubble","getButton","ctrlKey","altKey","shiftKey","button","capture","eventHandler","releaseCaptureHandler","onMouseUp","addTouchMoveListener","startx","starty","touchObj","touches","clientX","clientY","wheelX","wheelY","addMouseWheelListener","wheelDeltaX","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","clearTimeout","setTimeout","_clicks","onDblclick","getModifierHash","metaKey","normalizeCommandKeys","hashId","getModifierState","altGr","location","keyLocation","timeStamp","defaultPrevented","resetPressedKeys","getModifierString","addCommandKeyListener","lastKeyDownKeyCode","lastDefaultPrevented","postMessage","nextTick","win","messageName","listener","data","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","last","stringReverse","string","reverse","stringRepeat","count","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","deepCopy","arrayToMap","arr","createMap","props","arrayRemove","escapeRegExp","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","timeout","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","delay","dom","lang","KEYS","MODS","BROKEN_SETDATA","USE_IE_MIME_TYPE","TextInput","host","text","isTouchPad","setAttribute","opacity","insertBefore","firstChild","PLACEHOLDER","copied","cut","pasted","inComposition","tempStyle","isSelectionEmpty","isFocused","activeElement","onBlur","onFocus","resetSelection","focus","blur","syncSelection","syncValue","isEmpty","inputHandler","selectionStart","selectionEnd","setSelectionRange","resetValue","selection","setInputHandler","cb","getInputHandler","afterContextMenu","sendText","onPaste","substr","execCommand","substring","onTextInput","onInput","handleClipboardData","forceIEMime","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","select","onCommandKey","isAllSelected","selectAll","closeTimeout","onCompositionUpdate","$readOnly","val","lastValue","undo","canUndo","r","getRange","session","markUndoGroup","range","setRange","clearSelection","onCompositionEnd","c","syncComposition","onContextMenuClose","renderer","$keepTextAreaAtCursor","$moveTextAreaToCursor","onCompositionStart","$undoManager","on","getElement","setReadOnly","readOnly","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","rect","container","getBoundingClientRect","top","borderTopWidth","borderLeftWidth","maxTop","bottom","move","textInput","scroller","typingResetTimeout","typing","detectArrowKeys","up","home","option","right","end","down","shift","TextInputIOS","DefaultHandlers","mouseHandler","$clickSelection","editor","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","onTouchMove","selectByLines","extendSelectionBy","selectByWords","calcRangeOrientation","cursor","row","cmp","column","anchor","ev","inSelection","getDocumentPosition","mousedownEvent","selectionEmpty","getSelectionRange","$blockScrolling","moveToPosition","time","$focusTimout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","setStyle","comparePoint","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","ax","ay","bx","by","distance","sqrt","getBracketRange","getWordRange","isMultiLine","contains","getLineRange","getAccelKey","$lastScroll","t","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","destroy","GutterTooltip","windowWidth","innerWidth","windowHeight","innerHeight","GutterHandler","tooltipTimeout","mouseEvent","tooltipAnnotation","gutter","$gutterLayer","tooltip","hideTooltip","_signal","moveTooltip","getRegion","selectTo","srcElement","$tooltipFollowsMouse","isMousePressed","annotation","$annotations","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","showTooltip","$gutter","MouseEvent","$inSelection","propagationStopped","selectionRange","DragdropHandler","blankImage","src","dragSelectionMarker","timerId","dragCursor","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","mouseTarget","counter","onDragInterval","prevCursor","vMovement","hMovement","moveCursorToPosition","calcDistance","lineHeight","layerConfig","characterWidth","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","autoScroll","addDragMarker","toOrientedRange","addMarker","getSelectionStyle","$cursorLayer","setBlinking","clearInterval","setInterval","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","getReadOnly","onDragStart","cancelDrag","draggable","dataTransfer","effectAllowed","setDragImage","clearData","getTextRange","onDragEnd","dropEffect","setCursorStyle","onDragEnter","canAccept","getDropEffect","onDragOver","onMouseMoveTimer","onDragLeave","onDrop","moveText","dropData","types","copyAllowed","copyModifierState","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","state","dragDrop","$dragEnabled","eventTarget","unselectable","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","path","s","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","once","newCallback","handlers","_disabled_","old","disabled","removeDefaultHandler","pop","capturing","off","removeAllListeners","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","getOption","opt","warn","forwardTo","handlesSet","message","reportError","msg","Error","AppConfig","$defaultOptions","defineOptions","options","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","init","scriptOptions","scriptUrl","currentScript","_currentScript","scripts","ownerDocument","script","getAttribute","attributes","j","attr","m","m1","toUpperCase","base","all","moduleUrl","component","parts","sep","re","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","DefaultGutterHandler","config","MouseHandler","focusEditor","hasFocus","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","Boolean","gutterEl","$dragDelay","character","insideStart","mousemove","$scrollSpeed","mouseMoveHandler","which","releaseMouse","$mouseMoved","onCaptureEnd","onCaptureInterval","$onCaptureMouseMove","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","getLine","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","commands","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","h","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","command","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","rtlCandidate","_getCharacterType","ch","uc","charCodeAt","L","R","EN","ON_R","AN","R_H","B","DOT","doBidiReorder","textCharTypes","isRtl","logicalFromVisual","bidiLevels","charTypes","impTab","prevState","newClass","newLevel","newState","action","condPos","_computeLevels","hasBidiCharacters","getVisualFromLogicalIdx","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","bidiMap","currentRow","charWidths","EOL","showInvisibles","isRtlDir","line","wrapIndent","isLastRow","EOF","seenBidi","isBidiRow","docRow","splitIndex","updateRowLine","updateBidiMap","onChange","delta","lines","getDocumentRow","rowCache","$screenRowCache","$getRowCacheIndex","$docRowCache","getSplitIndex","currentIndex","prevIndex","$useWrapMode","splits","$wrapData","indent","size","isFullWidth","getScreenTabSize","endOfLine","markAsDirty","updateCharacterWidths","fontMetrics","$characterSize","bidiCharWidth","$measureCharWidth","getShowInvisibles","setShowInvisibles","setEolChar","eolChar","setTextDir","getPosLeft","col","visualIdx","getSelections","startCol","endCol","level","selections","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","offsetToCol","posX","logicalIdx","charWidth","Range","startRow","startColumn","endRow","endColumn","isEqual","compare","compareRange","p","containsRange","intersects","isEnd","isStart","setStart","setEnd","inside","insideEnd","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","extend","clone","collapseRows","toScreenRange","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","comparePoints","p1","p2","Selection","getDocument","lead","selectionLead","createAnchor","selectionAnchor","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","getCursor","getPosition","getSelectionAnchor","getSelectionLead","shiftSelection","columns","moveCursorTo","isBackwards","$moveSelection","mover","moveTo","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectWord","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","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","offsetX","screenPos","$bidiHandler","round","docPos","lineWidgets","keepDesiredColumn","moveCursorToScreen","desiredColumn","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","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","noEscape","keywordMap","createKeywordMapper","splitChar","keywords","list","$keywordList","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","mode","getBehaviours","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","rowCount","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","getCurrentTokenPosition","getCurrentTokenRange","context","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","defaultQuotes","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","selected","opening","closing","rowDiff","CstyleBehaviour","getCursorPosition","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","iterator","$matchTokenType","iterator2","bracket","packages","pack","codePoint","addUnicodePackage","Ll","Lu","Lt","Lm","Lo","M","Mn","Mc","Me","N","Nd","Nl","No","P","Pd","Ps","Pe","Pi","Pf","Pc","Po","S","Sm","Sc","Sk","So","Z","Zs","Zl","Zp","C","Cc","Cf","Co","Cs","Cn","unicode","Mode","$defaultBehaviour","getTokenizer","$tokenizer","$highlightRules","$highlightRuleConfig","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","removeInLine","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","iter","minEmptyLength","toggleBlockComment","colDiff","initialRange","startRange","endRange","getNextLineIndent","tab","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","$modes","delegations","scope","functionName","$delegator","method","transformAction","param","$behaviour","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","word","score","meta","$id","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","getValue","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","MAX","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","cache","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","pointIndex","excludeEdges","startIndex","endIndex","addList","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","lineDif","Fold","subFolds","consumePoint","restorePoint","subFold","collapseChildren","addSubFold","afterStart","restoreRange","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","lastFold","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","getCommentFoldRange","depth","getFoldWidget","getFoldWidgetRange","$foldStyles","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","$tokenizerUpdateFoldWidgets","updateFoldWidgets","tokenizerUpdateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","$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","ignore","$deltasDoc","$deltasFold","$informUndoManager","$deltas","setUndoManager","getUndoManager","reset","getSelection","undoManager","$syncInformUndoManager","group","execute","mergeUndoDeltas","$defaultUndoManager","redo","setUseSoftTabs","$useSoftTabs","$indentWithTabs","setTabSize","$tabSize","setNavigateWithinSoftTabs","navigateWithinSoftTabs","$navigateWithinSoftTabs","$overwrite","setOverwrite","overwrite","getOverwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","markers","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","isNaN","getScrollTop","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","w","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","lastUndoRange","$getUndoSelection","foldDelta","redoChanges","setUndoSelect","enable","isUndo","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","$moveLines","diff","$clipRowToDocument","Number","MAX_VALUE","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","getUseWrapMode","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","displayed","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","Search","find","$matchIterator","sr","sc","er","ec","skipCurrent","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","$disableFakeMultiline","wholeWord","wordBoundary","addWordBoundary","modifier","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","findKeyCommand","$keyChain","CommandManager","byName","isAvailable","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","prompt","gotoLine","multiSelectAction","getAllRanges","findNext","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","$handlePaste","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","firstLineEndCol","selectedCount","insertLine","curLine","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","textarea","$mouseHandler","keyBinding","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","startOperation","endOperation","$opResetTimer","curOp","docChanged","selectionChanged","prevOp","commadEvent","previousCommand","scrollSelectionIntoView","animateScrolling","$mergeableCommands","$mergeUndoDeltas","prev","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","handler","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","cursorPos","resize","onResize","setTheme","theme","getTheme","getFontSize","setFontSize","$highlightBrackets","$bracketHighlight","$highlightPending","getMatching","$highlightTags","$highlightTagPending","$tagHighlight","prevToken","sbm","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","updateLines","$updateHighlightActiveLine","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","startOuter","endOuter","lineCols","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","inVirtualSelectionMode","getBehavioursEnabled","transform","$mergeNextCommand","d","lineState","shouldOutdent","lineIndent","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","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","sel","endPoint","moved","totalDiff","rangeIndex","subRows","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","preventScroll","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","searchBox","$pixelPos","$resetCursorStyle","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","behavioursEnabled","wrapBehavioursEnabled","autoScrollEditorIntoView","keybindingId","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","showLineNumbers","showGutter","displayIndentGuides","fontSize","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","foldStyle","UndoManager","$serializeDelta","$deserializeDelta","cloneDeltaSetsObj","deltaSets_old","fnGetModifiedDelta","deltaSets_new","deltaSet_old","deltaSet_new","delta_old","deltaSets","$doc","hasUndo","dirtyCounter","$undoStack","$redoStack","NaN","undoSelectionRange","redoSelectionRange","$deserializeDeltas","hasRedo","markClean","isClean","$serializeDeltas","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","$cells","rowInfo","annoText","gutterOffset","breakpoints","decorations","$firstLineNumber","lastLineNumber","gutterRenderer","$renderer","cell","textNode","foldWidget","getText","minHeight","$fixedWidth","padding","$padding","$computePadding","ceil","$showLineNumbers","setShowLineNumbers","getShowLineNumbers","paddingLeft","paddingRight","Marker","setPadding","setMarkers","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","drawBidiSingleLineMarker","firstRowScreen","stringBuilder","extraStyle","curr","clazzModified","lineRange","range1","radiusClass","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","getLineHeight","$fontMetrics","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","$tabStrings","tabStr","$indentGuideRe","spaceClass","tabClass","spaceContent","tabContent","scrollLines","lineElements","childNodes","lineElementsIdx","lineElement","$renderLine","$useLineGroups","oldConfig","lastChild","fragment","$renderLinesFragment","createDocumentFragment","$textToken","$renderToken","output","tabIdx","idx4","classToUse","space","renderIndentGuide","cols","$renderWrappedLine","onlyContents","splitChars","$renderSimpleLine","$getFoldLineTokens","renderTokens","addTokens","$measureNode","isIE8","Cursor","isVisible","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateVisibility","$updateOpacity","visibility","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","blink","getPixelPosition","onScreen","$selectionMarkers","cursorIndex","pixelPos","drawCursor","$setOverwrite","MAX_SCROLL_H","ScrollBar","parent","classSuffix","setVisible","skipEvent","onScroll","coeff","VScrollBar","scrollHeight","$scrollbarWidth","$minWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","change","CHAR_COUNT","FontMetrics","$setMeasureNodeStyles","$main","$testFractionalRect","isRoot","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","setPolling","GutterLayer","MarkerLayer","TextLayer","CursorLayer","VirtualRenderer","content","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","maxHeight","v","$loop","$renderChanges","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_GUTTER","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","$updateGutterLineHighlight","$gutterLineHighlight","$printMarginEl","containerEl","posTop","posLeft","$composition","setScrollMargin","sm","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","$vScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","unfreeze","st","marginTop","marginLeft","$highlightGutterLine","$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","textToScreenCoordinates","pageX","pageY","keepTextAreaAtCursor","$themeId","cssClass","$theme","isDark","setMouseCursor","maxPixelHeight","workerUrl","blob","Blob","blobBuilder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","getBlob","$workerBlob","blobURL","URL","webkitURL","createObjectURL","Worker","WorkerClient","topLevelNamespaces","classname","importScripts","$sendDeltaQueue","changeListener","onMessage","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","callbackId","callbacks","onmessage","err","deltaQueue","cmd","emit","ex","attachToDocument","q","UIWorkerClient","messageBuffer","main","emitSync","sender","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","selectionBefore","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","onSelectionInterval","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","selectMoreLines","selectMore","splitIntoLines","alignCursors","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","yBackwards","docEnd","MultiSelect","$multiselectOnSessionChange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","altCursor","altDown","addAltCursorListeners","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","forEachSelection","keepOrder","$byLines","reg","cmdResult","anim","buf","nl","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","hidden","_inDocument","removeLineWidget","$updateRows","noWidgets","$oldWidget","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","version"],"sourceRoot":""}