[internal #1926343] CodeMirror updated to version 5.58.3
diff --git a/htdocs/Libs/Codemirror/brace-fold.js b/htdocs/Libs/Codemirror/brace-fold.js
new file mode 100644
index 0000000..654d1fb
--- /dev/null
+++ b/htdocs/Libs/Codemirror/brace-fold.js
@@ -0,0 +1,105 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.registerHelper("fold", "brace", function(cm, start) {
+  var line = start.line, lineText = cm.getLine(line);
+  var tokenType;
+
+  function findOpening(openCh) {
+    for (var at = start.ch, pass = 0;;) {
+      var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
+      if (found == -1) {
+        if (pass == 1) break;
+        pass = 1;
+        at = lineText.length;
+        continue;
+      }
+      if (pass == 1 && found < start.ch) break;
+      tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
+      if (!/^(comment|string)/.test(tokenType)) return found + 1;
+      at = found - 1;
+    }
+  }
+
+  var startToken = "{", endToken = "}", startCh = findOpening("{");
+  if (startCh == null) {
+    startToken = "[", endToken = "]";
+    startCh = findOpening("[");
+  }
+
+  if (startCh == null) return;
+  var count = 1, lastLine = cm.lastLine(), end, endCh;
+  outer: for (var i = line; i <= lastLine; ++i) {
+    var text = cm.getLine(i), pos = i == line ? startCh : 0;
+    for (;;) {
+      var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
+      if (nextOpen < 0) nextOpen = text.length;
+      if (nextClose < 0) nextClose = text.length;
+      pos = Math.min(nextOpen, nextClose);
+      if (pos == text.length) break;
+      if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
+        if (pos == nextOpen) ++count;
+        else if (!--count) { end = i; endCh = pos; break outer; }
+      }
+      ++pos;
+    }
+  }
+  if (end == null || line == end) return;
+  return {from: CodeMirror.Pos(line, startCh),
+          to: CodeMirror.Pos(end, endCh)};
+});
+
+CodeMirror.registerHelper("fold", "import", function(cm, start) {
+  function hasImport(line) {
+    if (line < cm.firstLine() || line > cm.lastLine()) return null;
+    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
+    if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
+    if (start.type != "keyword" || start.string != "import") return null;
+    // Now find closing semicolon, return its position
+    for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
+      var text = cm.getLine(i), semi = text.indexOf(";");
+      if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
+    }
+  }
+
+  var startLine = start.line, has = hasImport(startLine), prev;
+  if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
+    return null;
+  for (var end = has.end;;) {
+    var next = hasImport(end.line + 1);
+    if (next == null) break;
+    end = next.end;
+  }
+  return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
+});
+
+CodeMirror.registerHelper("fold", "include", function(cm, start) {
+  function hasInclude(line) {
+    if (line < cm.firstLine() || line > cm.lastLine()) return null;
+    var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
+    if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
+    if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
+  }
+
+  var startLine = start.line, has = hasInclude(startLine);
+  if (has == null || hasInclude(startLine - 1) != null) return null;
+  for (var end = startLine;;) {
+    var next = hasInclude(end + 1);
+    if (next == null) break;
+    ++end;
+  }
+  return {from: CodeMirror.Pos(startLine, has + 1),
+          to: cm.clipPos(CodeMirror.Pos(end))};
+});
+
+});
diff --git a/htdocs/Libs/Codemirror/closebrackets.js b/htdocs/Libs/Codemirror/closebrackets.js
new file mode 100644
index 0000000..4415c39
--- /dev/null
+++ b/htdocs/Libs/Codemirror/closebrackets.js
@@ -0,0 +1,191 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  var defaults = {
+    pairs: "()[]{}''\"\"",
+    closeBefore: ")]}'\":;>",
+    triples: "",
+    explode: "[]{}"
+  };
+
+  var Pos = CodeMirror.Pos;
+
+  CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
+    if (old && old != CodeMirror.Init) {
+      cm.removeKeyMap(keyMap);
+      cm.state.closeBrackets = null;
+    }
+    if (val) {
+      ensureBound(getOption(val, "pairs"))
+      cm.state.closeBrackets = val;
+      cm.addKeyMap(keyMap);
+    }
+  });
+
+  function getOption(conf, name) {
+    if (name == "pairs" && typeof conf == "string") return conf;
+    if (typeof conf == "object" && conf[name] != null) return conf[name];
+    return defaults[name];
+  }
+
+  var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
+  function ensureBound(chars) {
+    for (var i = 0; i < chars.length; i++) {
+      var ch = chars.charAt(i), key = "'" + ch + "'"
+      if (!keyMap[key]) keyMap[key] = handler(ch)
+    }
+  }
+  ensureBound(defaults.pairs + "`")
+
+  function handler(ch) {
+    return function(cm) { return handleChar(cm, ch); };
+  }
+
+  function getConfig(cm) {
+    var deflt = cm.state.closeBrackets;
+    if (!deflt || deflt.override) return deflt;
+    var mode = cm.getModeAt(cm.getCursor());
+    return mode.closeBrackets || deflt;
+  }
+
+  function handleBackspace(cm) {
+    var conf = getConfig(cm);
+    if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+    var pairs = getOption(conf, "pairs");
+    var ranges = cm.listSelections();
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var around = charsAround(cm, ranges[i].head);
+      if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
+    }
+    for (var i = ranges.length - 1; i >= 0; i--) {
+      var cur = ranges[i].head;
+      cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete");
+    }
+  }
+
+  function handleEnter(cm) {
+    var conf = getConfig(cm);
+    var explode = conf && getOption(conf, "explode");
+    if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+    var ranges = cm.listSelections();
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var around = charsAround(cm, ranges[i].head);
+      if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
+    }
+    cm.operation(function() {
+      var linesep = cm.lineSeparator() || "\n";
+      cm.replaceSelection(linesep + linesep, null);
+      cm.execCommand("goCharLeft");
+      ranges = cm.listSelections();
+      for (var i = 0; i < ranges.length; i++) {
+        var line = ranges[i].head.line;
+        cm.indentLine(line, null, true);
+        cm.indentLine(line + 1, null, true);
+      }
+    });
+  }
+
+  function contractSelection(sel) {
+    var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0;
+    return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)),
+            head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))};
+  }
+
+  function handleChar(cm, ch) {
+    var conf = getConfig(cm);
+    if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
+
+    var pairs = getOption(conf, "pairs");
+    var pos = pairs.indexOf(ch);
+    if (pos == -1) return CodeMirror.Pass;
+
+    var closeBefore = getOption(conf,"closeBefore");
+
+    var triples = getOption(conf, "triples");
+
+    var identical = pairs.charAt(pos + 1) == ch;
+    var ranges = cm.listSelections();
+    var opening = pos % 2 == 0;
+
+    var type;
+    for (var i = 0; i < ranges.length; i++) {
+      var range = ranges[i], cur = range.head, curType;
+      var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
+      if (opening && !range.empty()) {
+        curType = "surround";
+      } else if ((identical || !opening) && next == ch) {
+        if (identical && stringStartsAfter(cm, cur))
+          curType = "both";
+        else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
+          curType = "skipThree";
+        else
+          curType = "skip";
+      } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
+                 cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) {
+        if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass;
+        curType = "addFour";
+      } else if (identical) {
+        var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur)
+        if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";
+        else return CodeMirror.Pass;
+      } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) {
+        curType = "both";
+      } else {
+        return CodeMirror.Pass;
+      }
+      if (!type) type = curType;
+      else if (type != curType) return CodeMirror.Pass;
+    }
+
+    var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
+    var right = pos % 2 ? ch : pairs.charAt(pos + 1);
+    cm.operation(function() {
+      if (type == "skip") {
+        cm.execCommand("goCharRight");
+      } else if (type == "skipThree") {
+        for (var i = 0; i < 3; i++)
+          cm.execCommand("goCharRight");
+      } else if (type == "surround") {
+        var sels = cm.getSelections();
+        for (var i = 0; i < sels.length; i++)
+          sels[i] = left + sels[i] + right;
+        cm.replaceSelections(sels, "around");
+        sels = cm.listSelections().slice();
+        for (var i = 0; i < sels.length; i++)
+          sels[i] = contractSelection(sels[i]);
+        cm.setSelections(sels);
+      } else if (type == "both") {
+        cm.replaceSelection(left + right, null);
+        cm.triggerElectric(left + right);
+        cm.execCommand("goCharLeft");
+      } else if (type == "addFour") {
+        cm.replaceSelection(left + left + left + left, "before");
+        cm.execCommand("goCharRight");
+      }
+    });
+  }
+
+  function charsAround(cm, pos) {
+    var str = cm.getRange(Pos(pos.line, pos.ch - 1),
+                          Pos(pos.line, pos.ch + 1));
+    return str.length == 2 ? str : null;
+  }
+
+  function stringStartsAfter(cm, pos) {
+    var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1))
+    return /\bstring/.test(token.type) && token.start == pos.ch &&
+      (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos)))
+  }
+});
diff --git a/htdocs/Libs/Codemirror/closetag.js b/htdocs/Libs/Codemirror/closetag.js
new file mode 100644
index 0000000..7c22a50
--- /dev/null
+++ b/htdocs/Libs/Codemirror/closetag.js
@@ -0,0 +1,185 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+/**
+ * Tag-closer extension for CodeMirror.
+ *
+ * This extension adds an "autoCloseTags" option that can be set to
+ * either true to get the default behavior, or an object to further
+ * configure its behavior.
+ *
+ * These are supported options:
+ *
+ * `whenClosing` (default true)
+ *   Whether to autoclose when the '/' of a closing tag is typed.
+ * `whenOpening` (default true)
+ *   Whether to autoclose the tag when the final '>' of an opening
+ *   tag is typed.
+ * `dontCloseTags` (default is empty tags for HTML, none for XML)
+ *   An array of tag names that should not be autoclosed.
+ * `indentTags` (default is block tags for HTML, none for XML)
+ *   An array of tag names that should, when opened, cause a
+ *   blank line to be added inside the tag, and the blank line and
+ *   closing line to be indented.
+ * `emptyTags` (default is none)
+ *   An array of XML tag names that should be autoclosed with '/>'.
+ *
+ * See demos/closetag.html for a usage example.
+ */
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror", "../fold/xml-fold"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
+    if (old != CodeMirror.Init && old)
+      cm.removeKeyMap("autoCloseTags");
+    if (!val) return;
+    var map = {name: "autoCloseTags"};
+    if (typeof val != "object" || val.whenClosing !== false)
+      map["'/'"] = function(cm) { return autoCloseSlash(cm); };
+    if (typeof val != "object" || val.whenOpening !== false)
+      map["'>'"] = function(cm) { return autoCloseGT(cm); };
+    cm.addKeyMap(map);
+  });
+
+  var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
+                       "source", "track", "wbr"];
+  var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
+                    "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
+
+  function autoCloseGT(cm) {
+    if (cm.getOption("disableInput")) return CodeMirror.Pass;
+    var ranges = cm.listSelections(), replacements = [];
+    var opt = cm.getOption("autoCloseTags");
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var pos = ranges[i].head, tok = cm.getTokenAt(pos);
+      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
+      var tagInfo = inner.mode.xmlCurrentTag && inner.mode.xmlCurrentTag(state)
+      var tagName = tagInfo && tagInfo.name
+      if (!tagName) return CodeMirror.Pass
+
+      var html = inner.mode.configuration == "html";
+      var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
+      var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
+
+      if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
+      var lowerTagName = tagName.toLowerCase();
+      // Don't process the '>' at the end of an end-tag or self-closing tag
+      if (!tagName ||
+          tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
+          tok.type == "tag" && tagInfo.close ||
+          tok.string.indexOf("/") == (pos.ch - tok.start - 1) || // match something like <someTagName />
+          dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
+          closingTagExists(cm, inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state) || [], tagName, pos, true))
+        return CodeMirror.Pass;
+
+      var emptyTags = typeof opt == "object" && opt.emptyTags;
+      if (emptyTags && indexOf(emptyTags, tagName) > -1) {
+        replacements[i] = { text: "/>", newPos: CodeMirror.Pos(pos.line, pos.ch + 2) };
+        continue;
+      }
+
+      var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
+      replacements[i] = {indent: indent,
+                         text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
+                         newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
+    }
+
+    var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose);
+    for (var i = ranges.length - 1; i >= 0; i--) {
+      var info = replacements[i];
+      cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert");
+      var sel = cm.listSelections().slice(0);
+      sel[i] = {head: info.newPos, anchor: info.newPos};
+      cm.setSelections(sel);
+      if (!dontIndentOnAutoClose && info.indent) {
+        cm.indentLine(info.newPos.line, null, true);
+        cm.indentLine(info.newPos.line + 1, null, true);
+      }
+    }
+  }
+
+  function autoCloseCurrent(cm, typingSlash) {
+    var ranges = cm.listSelections(), replacements = [];
+    var head = typingSlash ? "/" : "</";
+    var opt = cm.getOption("autoCloseTags");
+    var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnSlash);
+    for (var i = 0; i < ranges.length; i++) {
+      if (!ranges[i].empty()) return CodeMirror.Pass;
+      var pos = ranges[i].head, tok = cm.getTokenAt(pos);
+      var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
+      if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" ||
+                          tok.start != pos.ch - 1))
+        return CodeMirror.Pass;
+      // Kludge to get around the fact that we are not in XML mode
+      // when completing in JS/CSS snippet in htmlmixed mode. Does not
+      // work for other XML embedded languages (there is no general
+      // way to go from a mixed mode to its current XML state).
+      var replacement, mixed = inner.mode.name != "xml" && cm.getMode().name == "htmlmixed"
+      if (mixed && inner.mode.name == "javascript") {
+        replacement = head + "script";
+      } else if (mixed && inner.mode.name == "css") {
+        replacement = head + "style";
+      } else {
+        var context = inner.mode.xmlCurrentContext && inner.mode.xmlCurrentContext(state)
+        var top = context.length ? context[context.length - 1] : ""
+        if (!context || (context.length && closingTagExists(cm, context, top, pos)))
+          return CodeMirror.Pass;
+        replacement = head + top
+      }
+      if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">";
+      replacements[i] = replacement;
+    }
+    cm.replaceSelections(replacements);
+    ranges = cm.listSelections();
+    if (!dontIndentOnAutoClose) {
+        for (var i = 0; i < ranges.length; i++)
+            if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
+                cm.indentLine(ranges[i].head.line);
+    }
+  }
+
+  function autoCloseSlash(cm) {
+    if (cm.getOption("disableInput")) return CodeMirror.Pass;
+    return autoCloseCurrent(cm, true);
+  }
+
+  CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };
+
+  function indexOf(collection, elt) {
+    if (collection.indexOf) return collection.indexOf(elt);
+    for (var i = 0, e = collection.length; i < e; ++i)
+      if (collection[i] == elt) return i;
+    return -1;
+  }
+
+  // If xml-fold is loaded, we use its functionality to try and verify
+  // whether a given tag is actually unclosed.
+  function closingTagExists(cm, context, tagName, pos, newTag) {
+    if (!CodeMirror.scanForClosingTag) return false;
+    var end = Math.min(cm.lastLine() + 1, pos.line + 500);
+    var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
+    if (!nextClose || nextClose.tag != tagName) return false;
+    // If the immediate wrapping context contains onCx instances of
+    // the same tag, a closing tag only exists if there are at least
+    // that many closing tags of that type following.
+    var onCx = newTag ? 1 : 0
+    for (var i = context.length - 1; i >= 0; i--) {
+      if (context[i] == tagName) ++onCx
+      else break
+    }
+    pos = nextClose.to;
+    for (var i = 1; i < onCx; i++) {
+      var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
+      if (!next || next.tag != tagName) return false;
+      pos = next.to;
+    }
+    return true;
+  }
+});
diff --git a/htdocs/Libs/Codemirror/codemirror.css b/htdocs/Libs/Codemirror/codemirror.css
index 49ec873..f1aa66d 100644
--- a/htdocs/Libs/Codemirror/codemirror.css
+++ b/htdocs/Libs/Codemirror/codemirror.css
@@ -5,6 +5,7 @@
   font-family: monospace;
   height: 300px;
   color: black;
+  direction: ltr;
 }
 
 /* PADDING */
@@ -12,7 +13,8 @@
 .CodeMirror-lines {
   padding: 4px 0; /* Vertical padding around content */
 }
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
   padding: 0 4px; /* Horizontal padding of content */
 }
 
@@ -52,13 +54,18 @@
 }
 .cm-fat-cursor .CodeMirror-cursor {
   width: auto;
-  border: 0;
+  border: 0 !important;
   background: #7e7;
 }
 .cm-fat-cursor div.CodeMirror-cursors {
   z-index: 1;
 }
-
+.cm-fat-cursor-mark {
+  background-color: rgba(20, 255, 20, 0.5);
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
 .cm-animate-fat-cursor {
   width: auto;
   border: 0;
@@ -88,8 +95,14 @@
 
 .cm-tab { display: inline-block; text-decoration: inherit; }
 
+.CodeMirror-rulers {
+  position: absolute;
+  left: 0; right: 0; top: -50px; bottom: 0;
+  overflow: hidden;
+}
 .CodeMirror-ruler {
   border-left: 1px solid #ccc;
+  top: 0; bottom: 0;
   position: absolute;
 }
 
@@ -113,7 +126,7 @@
 .cm-s-default .cm-property,
 .cm-s-default .cm-operator {}
 .cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
 .cm-s-default .cm-comment {color: #a50;}
 .cm-s-default .cm-string {color: #a11;}
 .cm-s-default .cm-string-2 {color: #f50;}
@@ -133,8 +146,8 @@
 
 /* Default styles for common addons */
 
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
 .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
 .CodeMirror-activeline-background {background: #e8f2ff;}
 
@@ -151,26 +164,27 @@
 
 .CodeMirror-scroll {
   overflow: scroll !important; /* Things will break if this is overridden */
-  /* 30px is the magic margin used to hide the element's real scrollbars */
+  /* 50px is the magic margin used to hide the element's real scrollbars */
   /* See overflow: hidden in .CodeMirror */
-  margin-bottom: -30px; margin-right: -30px;
-  padding-bottom: 30px;
+  margin-bottom: -50px; margin-right: -50px;
+  padding-bottom: 50px;
   height: 100%;
   outline: none; /* Prevent dragging from highlighting the element */
   position: relative;
 }
 .CodeMirror-sizer {
   position: relative;
-  border-right: 30px solid transparent;
+  border-right: 50px solid transparent;
 }
 
 /* The fake, visible scrollbars. Used to force redraw during scrolling
-   before actuall scrolling happens, thus preventing shaking and
+   before actual scrolling happens, thus preventing shaking and
    flickering artifacts. */
 .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
   position: absolute;
   z-index: 6;
   display: none;
+  outline: none;
 }
 .CodeMirror-vscrollbar {
   right: 0; top: 0;
@@ -191,16 +205,15 @@
 
 .CodeMirror-gutters {
   position: absolute; left: 0; top: 0;
+  min-height: 100%;
   z-index: 3;
 }
 .CodeMirror-gutter {
   white-space: normal;
   height: 100%;
   display: inline-block;
-  margin-bottom: -30px;
-  /* Hack to make IE7 behave */
-  *zoom:1;
-  *display:inline;
+  vertical-align: top;
+  margin-bottom: -50px;
 }
 .CodeMirror-gutter-wrapper {
   position: absolute;
@@ -218,17 +231,15 @@
   cursor: default;
   z-index: 4;
 }
-.CodeMirror-gutter-wrapper {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-}
+.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
+.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
 
 .CodeMirror-lines {
   cursor: text;
   min-height: 1px; /* prevents collapsing before first draw */
 }
-.CodeMirror pre {
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
   /* Reset some styles that the rest of the page might have set */
   -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
   border-width: 0;
@@ -244,8 +255,11 @@
   position: relative;
   overflow: visible;
   -webkit-tap-highlight-color: transparent;
+  -webkit-font-variant-ligatures: contextual;
+  font-variant-ligatures: contextual;
 }
-.CodeMirror-wrap pre {
+.CodeMirror-wrap pre.CodeMirror-line,
+.CodeMirror-wrap pre.CodeMirror-line-like {
   word-wrap: break-word;
   white-space: pre-wrap;
   word-break: normal;
@@ -260,11 +274,13 @@
 .CodeMirror-linewidget {
   position: relative;
   z-index: 2;
-  overflow: auto;
+  padding: 0.1px; /* Force widget margins to stay inside of the container */
 }
 
 .CodeMirror-widget {}
 
+.CodeMirror-rtl pre { direction: rtl; }
+
 .CodeMirror-code {
   outline: none;
 }
@@ -287,7 +303,10 @@
   visibility: hidden;
 }
 
-.CodeMirror-cursor { position: absolute; }
+.CodeMirror-cursor {
+  position: absolute;
+  pointer-events: none;
+}
 .CodeMirror-measure pre { position: static; }
 
 div.CodeMirror-cursors {
@@ -310,13 +329,10 @@
 .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
 
 .cm-searching {
-  background: #ffa;
-  background: rgba(255, 255, 0, .4);
+  background-color: #ffa;
+  background-color: rgba(255, 255, 0, .4);
 }
 
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
 /* Used to force a border model for a node */
 .cm-force-border { padding-right: .1px; }
 
diff --git a/htdocs/Libs/Codemirror/codemirror.custom.js b/htdocs/Libs/Codemirror/codemirror.custom.js
deleted file mode 100644
index 59ec31c..0000000
--- a/htdocs/Libs/Codemirror/codemirror.custom.js
+++ /dev/null
@@ -1,9544 +0,0 @@
-/* CodeMirror - Minified & Bundled
-   Generated on 2015. 08. 31. with http://codemirror.net/doc/compress.html
-   Version: HEAD
-
-   CodeMirror Library:
-   - codemirror.js
-   Modes:
-   - css.js
-   - htmlmixed.js
-   - javascript.js
-   - perl.js
-   - python.js
-   - shell.js
-   - xml.js
-   Add-ons:
-   - active-line.js
-   - brace-fold.js
-   - closebrackets.js
-   - closetag.js
-   - foldcode.js
-   - foldgutter.js
-   - indent-fold.js
-   - match-highlighter.js
-   - matchbrackets.js
-   - matchtags.js
-   - search.js
-   - xml-fold.js
- */
- 
-! function (a) {
-    if ("object" == typeof exports && "object" == typeof module) module.exports = a();
-    else {
-        if ("function" == typeof define && define.amd) return define([], a);
-        this.CodeMirror = a()
-    }
-}(function () {
-    "use strict";
-
-    function v(a, b) {
-        if (!(this instanceof v)) return new v(a, b);
-        this.options = b = b ? hg(b) : {}, hg(Ad, b, !1), I(b);
-        var c = b.value;
-        "string" == typeof c && (c = new af(c, b.mode, null, b.lineSeparator)), this.doc = c;
-        var g = new v.inputStyles[b.inputStyle](this),
-            h = this.display = new w(a, c, g);
-        h.wrapper.CodeMirror = this, E(this), C(this), b.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap"), b.autofocus && !n && h.input.focus(), M(this), this.state = {
-            keyMaps: [],
-            overlays: [],
-            modeGen: 0,
-            overwrite: !1,
-            delayingBlurEvent: !1,
-            focused: !1,
-            suppressEdits: !1,
-            pasteIncoming: !1,
-            cutIncoming: !1,
-            selectingText: !1,
-            draggingText: !1,
-            highlight: new Yf,
-            keySeq: null,
-            specialChars: null
-        };
-        var i = this;
-        d && 11 > e && setTimeout(function () {
-            i.display.input.reset(!0)
-        }, 20), pc(this), Bg(), Vb(this), this.curOp.forceUpdate = !0, ef(this, c), b.autofocus && !n || i.hasFocus() ? setTimeout(ig(Zc, this), 20) : $c(this);
-        for (var j in Bd) Bd.hasOwnProperty(j) && Bd[j](this, b[j], Dd);
-        R(this), b.finishInit && b.finishInit(this);
-        for (var k = 0; k < Hd.length; ++k) Hd[k](this);
-        Xb(this), f && b.lineWrapping && "optimizelegibility" == getComputedStyle(h.lineDiv)
-            .textRendering && (h.lineDiv.style.textRendering = "auto")
-    }
-
-    function w(b, c, g) {
-        var h = this;
-        this.input = g, h.scrollbarFiller = pg("div", null, "CodeMirror-scrollbar-filler"), h.scrollbarFiller.setAttribute("cm-not-content", "true"), h.gutterFiller = pg("div", null, "CodeMirror-gutter-filler"), h.gutterFiller.setAttribute("cm-not-content", "true"), h.lineDiv = pg("div", null, "CodeMirror-code"), h.selectionDiv = pg("div", null, null, "position: relative; z-index: 1"), h.cursorDiv = pg("div", null, "CodeMirror-cursors"), h.measure = pg("div", null, "CodeMirror-measure"), h.lineMeasure = pg("div", null, "CodeMirror-measure"), h.lineSpace = pg("div", [h.measure, h.lineMeasure, h.selectionDiv, h.cursorDiv, h.lineDiv], null, "position: relative; outline: none"), h.mover = pg("div", [pg("div", [h.lineSpace], "CodeMirror-lines")], null, "position: relative"), h.sizer = pg("div", [h.mover], "CodeMirror-sizer"), h.sizerWidth = null, h.heightForcer = pg("div", null, null, "position: absolute; height: " + Tf + "px; width: 1px;"), h.gutters = pg("div", null, "CodeMirror-gutters"), h.lineGutter = null, h.scroller = pg("div", [h.sizer, h.heightForcer, h.gutters], "CodeMirror-scroll"), h.scroller.setAttribute("tabIndex", "-1"), h.wrapper = pg("div", [h.scrollbarFiller, h.gutterFiller, h.scroller], "CodeMirror"), d && 8 > e && (h.gutters.style.zIndex = -1, h.scroller.style.paddingRight = 0), f || a && n || (h.scroller.draggable = !0), b && (b.appendChild ? b.appendChild(h.wrapper) : b(h.wrapper)), h.viewFrom = h.viewTo = c.first, h.reportedViewFrom = h.reportedViewTo = c.first, h.view = [], h.renderedView = null, h.externalMeasured = null, h.viewOffset = 0, h.lastWrapHeight = h.lastWrapWidth = 0, h.updateLineNumbers = null, h.nativeBarWidth = h.barHeight = h.barWidth = 0, h.scrollbarsClipped = !1, h.lineNumWidth = h.lineNumInnerWidth = h.lineNumChars = null, h.alignWidgets = !1, h.cachedCharWidth = h.cachedTextHeight = h.cachedPaddingH = null, h.maxLine = null, h.maxLineLength = 0, h.maxLineChanged = !1, h.wheelDX = h.wheelDY = h.wheelStartX = h.wheelStartY = null, h.shift = !1, h.selForContextMenu = null, h.activeTouch = null, g.init(h)
-    }
-
-    function x(a) {
-        a.doc.mode = v.getMode(a.options, a.doc.modeOption), y(a)
-    }
-
-    function y(a) {
-        a.doc.iter(function (a) {
-            a.stateAfter && (a.stateAfter = null), a.styles && (a.styles = null)
-        }), a.doc.frontier = a.doc.first, ib(a, 100), a.state.modeGen++, a.curOp && ic(a)
-    }
-
-    function z(a) {
-        a.options.lineWrapping ? (xg(a.display.wrapper, "CodeMirror-wrap"), a.display.sizer.style.minWidth = "", a.display.sizerWidth = null) : (wg(a.display.wrapper, "CodeMirror-wrap"), H(a)), B(a), ic(a), Fb(a), setTimeout(function () {
-            N(a)
-        }, 100)
-    }
-
-    function A(a) {
-        var b = Rb(a.display),
-            c = a.options.lineWrapping,
-            d = c && Math.max(5, a.display.scroller.clientWidth / Sb(a.display) - 3);
-        return function (e) {
-            if (we(a.doc, e)) return 0;
-            var f = 0;
-            if (e.widgets)
-                for (var g = 0; g < e.widgets.length; g++) e.widgets[g].height && (f += e.widgets[g].height);
-            return c ? f + (Math.ceil(e.text.length / d) || 1) * b : f + b
-        }
-    }
-
-    function B(a) {
-        var b = a.doc,
-            c = A(a);
-        b.iter(function (a) {
-            var b = c(a);
-            b != a.height && jf(a, b)
-        })
-    }
-
-    function C(a) {
-        a.display.wrapper.className = a.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + a.options.theme.replace(/(^|\s)\s*/g, " cm-s-"), Fb(a)
-    }
-
-    function D(a) {
-        E(a), ic(a), setTimeout(function () {
-            Q(a)
-        }, 20)
-    }
-
-    function E(a) {
-        var b = a.display.gutters,
-            c = a.options.gutters;
-        rg(b);
-        for (var d = 0; d < c.length; ++d) {
-            var e = c[d],
-                f = b.appendChild(pg("div", null, "CodeMirror-gutter " + e));
-            "CodeMirror-linenumbers" == e && (a.display.lineGutter = f, f.style.width = (a.display.lineNumWidth || 1) + "px")
-        }
-        b.style.display = d ? "" : "none", F(a)
-    }
-
-    function F(a) {
-        var b = a.display.gutters.offsetWidth;
-        a.display.sizer.style.marginLeft = b + "px"
-    }
-
-    function G(a) {
-        if (0 == a.height) return 0;
-        for (var c, b = a.text.length, d = a; c = pe(d);) {
-            var e = c.find(0, !0);
-            d = e.from.line, b += e.from.ch - e.to.ch
-        }
-        for (d = a; c = qe(d);) {
-            var e = c.find(0, !0);
-            b -= d.text.length - e.from.ch, d = e.to.line, b += d.text.length - e.to.ch
-        }
-        return b
-    }
-
-    function H(a) {
-        var b = a.display,
-            c = a.doc;
-        b.maxLine = ff(c, c.first), b.maxLineLength = G(b.maxLine), b.maxLineChanged = !0, c.iter(function (a) {
-            var c = G(a);
-            c > b.maxLineLength && (b.maxLineLength = c, b.maxLine = a)
-        })
-    }
-
-    function I(a) {
-        var b = dg(a.gutters, "CodeMirror-linenumbers"); - 1 == b && a.lineNumbers ? a.gutters = a.gutters.concat(["CodeMirror-linenumbers"]) : b > -1 && !a.lineNumbers && (a.gutters = a.gutters.slice(0), a.gutters.splice(b, 1))
-    }
-
-    function J(a) {
-        var b = a.display,
-            c = b.gutters.offsetWidth,
-            d = Math.round(a.doc.height + nb(a.display));
-        return {
-            clientHeight: b.scroller.clientHeight,
-            viewHeight: b.wrapper.clientHeight,
-            scrollWidth: b.scroller.scrollWidth,
-            clientWidth: b.scroller.clientWidth,
-            viewWidth: b.wrapper.clientWidth,
-            barLeft: a.options.fixedGutter ? c : 0,
-            docHeight: d,
-            scrollHeight: d + pb(a) + b.barHeight,
-            nativeBarWidth: b.nativeBarWidth,
-            gutterWidth: c
-        }
-    }
-
-    function K(a, b, c) {
-        this.cm = c;
-        var f = this.vert = pg("div", [pg("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"),
-            g = this.horiz = pg("div", [pg("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
-        a(f), a(g), Jf(f, "scroll", function () {
-            f.clientHeight && b(f.scrollTop, "vertical")
-        }), Jf(g, "scroll", function () {
-            g.clientWidth && b(g.scrollLeft, "horizontal")
-        }), this.checkedOverlay = !1, d && 8 > e && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px")
-    }
-
-    function L() {}
-
-    function M(a) {
-        a.display.scrollbars && (a.display.scrollbars.clear(), a.display.scrollbars.addClass && wg(a.display.wrapper, a.display.scrollbars.addClass)), a.display.scrollbars = new v.scrollbarModel[a.options.scrollbarStyle](function (b) {
-            a.display.wrapper.insertBefore(b, a.display.scrollbarFiller), Jf(b, "mousedown", function () {
-                a.state.focused && setTimeout(function () {
-                    a.display.input.focus()
-                }, 0)
-            }), b.setAttribute("cm-not-content", "true")
-        }, function (b, c) {
-            "horizontal" == c ? Ic(a, b) : Hc(a, b)
-        }, a), a.display.scrollbars.addClass && xg(a.display.wrapper, a.display.scrollbars.addClass)
-    }
-
-    function N(a, b) {
-        b || (b = J(a));
-        var c = a.display.barWidth,
-            d = a.display.barHeight;
-        O(a, b);
-        for (var e = 0; 4 > e && c != a.display.barWidth || d != a.display.barHeight; e++) c != a.display.barWidth && a.options.lineWrapping && $(a), O(a, J(a)), c = a.display.barWidth, d = a.display.barHeight
-    }
-
-    function O(a, b) {
-        var c = a.display,
-            d = c.scrollbars.update(b);
-        c.sizer.style.paddingRight = (c.barWidth = d.right) + "px", c.sizer.style.paddingBottom = (c.barHeight = d.bottom) + "px", d.right && d.bottom ? (c.scrollbarFiller.style.display = "block", c.scrollbarFiller.style.height = d.bottom + "px", c.scrollbarFiller.style.width = d.right + "px") : c.scrollbarFiller.style.display = "", d.bottom && a.options.coverGutterNextToScrollbar && a.options.fixedGutter ? (c.gutterFiller.style.display = "block", c.gutterFiller.style.height = d.bottom + "px", c.gutterFiller.style.width = b.gutterWidth + "px") : c.gutterFiller.style.display = ""
-    }
-
-    function P(a, b, c) {
-        var d = c && null != c.top ? Math.max(0, c.top) : a.scroller.scrollTop;
-        d = Math.floor(d - mb(a));
-        var e = c && null != c.bottom ? c.bottom : d + a.wrapper.clientHeight,
-            f = lf(b, d),
-            g = lf(b, e);
-        if (c && c.ensure) {
-            var h = c.ensure.from.line,
-                i = c.ensure.to.line;
-            f > h ? (f = h, g = lf(b, mf(ff(b, h)) + a.wrapper.clientHeight)) : Math.min(i, b.lastLine()) >= g && (f = lf(b, mf(ff(b, i)) - a.wrapper.clientHeight), g = i)
-        }
-        return {
-            from: f,
-            to: Math.max(g, f + 1)
-        }
-    }
-
-    function Q(a) {
-        var b = a.display,
-            c = b.view;
-        if (b.alignWidgets || b.gutters.firstChild && a.options.fixedGutter) {
-            for (var d = T(b) - b.scroller.scrollLeft + a.doc.scrollLeft, e = b.gutters.offsetWidth, f = d + "px", g = 0; g < c.length; g++)
-                if (!c[g].hidden) {
-                    a.options.fixedGutter && c[g].gutter && (c[g].gutter.style.left = f);
-                    var h = c[g].alignable;
-                    if (h)
-                        for (var i = 0; i < h.length; i++) h[i].style.left = f
-                }
-            a.options.fixedGutter && (b.gutters.style.left = d + e + "px")
-        }
-    }
-
-    function R(a) {
-        if (!a.options.lineNumbers) return !1;
-        var b = a.doc,
-            c = S(a.options, b.first + b.size - 1),
-            d = a.display;
-        if (c.length != d.lineNumChars) {
-            var e = d.measure.appendChild(pg("div", [pg("div", c)], "CodeMirror-linenumber CodeMirror-gutter-elt")),
-                f = e.firstChild.offsetWidth,
-                g = e.offsetWidth - f;
-            return d.lineGutter.style.width = "", d.lineNumInnerWidth = Math.max(f, d.lineGutter.offsetWidth - g) + 1, d.lineNumWidth = d.lineNumInnerWidth + g, d.lineNumChars = d.lineNumInnerWidth ? c.length : -1, d.lineGutter.style.width = d.lineNumWidth + "px", F(a), !0
-        }
-        return !1
-    }
-
-    function S(a, b) {
-        return String(a.lineNumberFormatter(b + a.firstLineNumber))
-    }
-
-    function T(a) {
-        return a.scroller.getBoundingClientRect()
-            .left - a.sizer.getBoundingClientRect()
-            .left
-    }
-
-    function U(a, b, c) {
-        var d = a.display;
-        this.viewport = b, this.visible = P(d, a.doc, b), this.editorIsHidden = !d.wrapper.offsetWidth, this.wrapperHeight = d.wrapper.clientHeight, this.wrapperWidth = d.wrapper.clientWidth, this.oldDisplayWidth = qb(a), this.force = c, this.dims = aa(a), this.events = []
-    }
-
-    function V(a) {
-        var b = a.display;
-        !b.scrollbarsClipped && b.scroller.offsetWidth && (b.nativeBarWidth = b.scroller.offsetWidth - b.scroller.clientWidth, b.heightForcer.style.height = pb(a) + "px", b.sizer.style.marginBottom = -b.nativeBarWidth + "px", b.sizer.style.borderRightWidth = pb(a) + "px", b.scrollbarsClipped = !0)
-    }
-
-    function W(a, b) {
-        var c = a.display,
-            d = a.doc;
-        if (b.editorIsHidden) return kc(a), !1;
-        if (!b.force && b.visible.from >= c.viewFrom && b.visible.to <= c.viewTo && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo) && c.renderedView == c.view && 0 == oc(a)) return !1;
-        R(a) && (kc(a), b.dims = aa(a));
-        var e = d.first + d.size,
-            f = Math.max(b.visible.from - a.options.viewportMargin, d.first),
-            g = Math.min(e, b.visible.to + a.options.viewportMargin);
-        c.viewFrom < f && f - c.viewFrom < 20 && (f = Math.max(d.first, c.viewFrom)), c.viewTo > g && c.viewTo - g < 20 && (g = Math.min(e, c.viewTo)), u && (f = ue(a.doc, f), g = ve(a.doc, g));
-        var h = f != c.viewFrom || g != c.viewTo || c.lastWrapHeight != b.wrapperHeight || c.lastWrapWidth != b.wrapperWidth;
-        nc(a, f, g), c.viewOffset = mf(ff(a.doc, c.viewFrom)), a.display.mover.style.top = c.viewOffset + "px";
-        var i = oc(a);
-        if (!h && 0 == i && !b.force && c.renderedView == c.view && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo)) return !1;
-        var j = ug();
-        return i > 4 && (c.lineDiv.style.display = "none"), ba(a, c.updateLineNumbers, b.dims), i > 4 && (c.lineDiv.style.display = ""), c.renderedView = c.view, j && ug() != j && j.offsetHeight && j.focus(), rg(c.cursorDiv), rg(c.selectionDiv), c.gutters.style.height = c.sizer.style.minHeight = 0, h && (c.lastWrapHeight = b.wrapperHeight, c.lastWrapWidth = b.wrapperWidth, ib(a, 400)), c.updateLineNumbers = null, !0
-    }
-
-    function X(a, b) {
-        for (var c = b.viewport, d = !0;
-            (d && a.options.lineWrapping && b.oldDisplayWidth != qb(a) || (c && null != c.top && (c = {
-                top: Math.min(a.doc.height + nb(a.display) - rb(a), c.top)
-            }), b.visible = P(a.display, a.doc, c), !(b.visible.from >= a.display.viewFrom && b.visible.to <= a.display.viewTo))) && W(a, b); d = !1) {
-            $(a);
-            var e = J(a);
-            db(a), Z(a, e), N(a, e)
-        }
-        b.signal(a, "update", a), (a.display.viewFrom != a.display.reportedViewFrom || a.display.viewTo != a.display.reportedViewTo) && (b.signal(a, "viewportChange", a, a.display.viewFrom, a.display.viewTo), a.display.reportedViewFrom = a.display.viewFrom, a.display.reportedViewTo = a.display.viewTo)
-    }
-
-    function Y(a, b) {
-        var c = new U(a, b);
-        if (W(a, c)) {
-            $(a), X(a, c);
-            var d = J(a);
-            db(a), Z(a, d), N(a, d), c.finish()
-        }
-    }
-
-    function Z(a, b) {
-        a.display.sizer.style.minHeight = b.docHeight + "px";
-        var c = b.docHeight + a.display.barHeight;
-        a.display.heightForcer.style.top = c + "px", a.display.gutters.style.height = Math.max(c + pb(a), b.clientHeight) + "px"
-    }
-
-    function $(a) {
-        for (var b = a.display, c = b.lineDiv.offsetTop, f = 0; f < b.view.length; f++) {
-            var h, g = b.view[f];
-            if (!g.hidden) {
-                if (d && 8 > e) {
-                    var i = g.node.offsetTop + g.node.offsetHeight;
-                    h = i - c, c = i
-                } else {
-                    var j = g.node.getBoundingClientRect();
-                    h = j.bottom - j.top
-                }
-                var k = g.line.height - h;
-                if (2 > h && (h = Rb(b)), (k > .001 || -.001 > k) && (jf(g.line, h), _(g.line), g.rest))
-                    for (var l = 0; l < g.rest.length; l++) _(g.rest[l])
-            }
-        }
-    }
-
-    function _(a) {
-        if (a.widgets)
-            for (var b = 0; b < a.widgets.length; ++b) a.widgets[b].height = a.widgets[b].node.offsetHeight
-    }
-
-    function aa(a) {
-        for (var b = a.display, c = {}, d = {}, e = b.gutters.clientLeft, f = b.gutters.firstChild, g = 0; f; f = f.nextSibling, ++g) c[a.options.gutters[g]] = f.offsetLeft + f.clientLeft + e, d[a.options.gutters[g]] = f.clientWidth;
-        return {
-            fixedPos: T(b),
-            gutterTotalWidth: b.gutters.offsetWidth,
-            gutterLeft: c,
-            gutterWidth: d,
-            wrapperWidth: b.wrapper.clientWidth
-        }
-    }
-
-    function ba(a, b, c) {
-        function i(b) {
-            var c = b.nextSibling;
-            return f && o && a.display.currentWheelTarget == b ? b.style.display = "none" : b.parentNode.removeChild(b), c
-        }
-        for (var d = a.display, e = a.options.lineNumbers, g = d.lineDiv, h = g.firstChild, j = d.view, k = d.viewFrom, l = 0; l < j.length; l++) {
-            var m = j[l];
-            if (m.hidden);
-            else if (m.node && m.node.parentNode == g) {
-                for (; h != m.node;) h = i(h);
-                var p = e && null != b && k >= b && m.lineNumber;
-                m.changes && (dg(m.changes, "gutter") > -1 && (p = !1), ca(a, m, k, c)), p && (rg(m.lineNumber), m.lineNumber.appendChild(document.createTextNode(S(a.options, k)))), h = m.node.nextSibling
-            } else {
-                var n = ka(a, m, k, c);
-                g.insertBefore(n, h)
-            }
-            k += m.size
-        }
-        for (; h;) h = i(h)
-    }
-
-    function ca(a, b, c, d) {
-        for (var e = 0; e < b.changes.length; e++) {
-            var f = b.changes[e];
-            "text" == f ? ga(a, b) : "gutter" == f ? ia(a, b, c, d) : "class" == f ? ha(b) : "widget" == f && ja(a, b, d)
-        }
-        b.changes = null
-    }
-
-    function da(a) {
-        return a.node == a.text && (a.node = pg("div", null, null, "position: relative"), a.text.parentNode && a.text.parentNode.replaceChild(a.node, a.text), a.node.appendChild(a.text), d && 8 > e && (a.node.style.zIndex = 2)), a.node
-    }
-
-    function ea(a) {
-        var b = a.bgClass ? a.bgClass + " " + (a.line.bgClass || "") : a.line.bgClass;
-        if (b && (b += " CodeMirror-linebackground"), a.background) b ? a.background.className = b : (a.background.parentNode.removeChild(a.background), a.background = null);
-        else if (b) {
-            var c = da(a);
-            a.background = c.insertBefore(pg("div", null, b), c.firstChild)
-        }
-    }
-
-    function fa(a, b) {
-        var c = a.display.externalMeasured;
-        return c && c.line == b.line ? (a.display.externalMeasured = null, b.measure = c.measure, c.built) : Qe(a, b)
-    }
-
-    function ga(a, b) {
-        var c = b.text.className,
-            d = fa(a, b);
-        b.text == b.node && (b.node = d.pre), b.text.parentNode.replaceChild(d.pre, b.text), b.text = d.pre, d.bgClass != b.bgClass || d.textClass != b.textClass ? (b.bgClass = d.bgClass, b.textClass = d.textClass, ha(b)) : c && (b.text.className = c)
-    }
-
-    function ha(a) {
-        ea(a), a.line.wrapClass ? da(a)
-            .className = a.line.wrapClass : a.node != a.text && (a.node.className = "");
-        var b = a.textClass ? a.textClass + " " + (a.line.textClass || "") : a.line.textClass;
-        a.text.className = b || ""
-    }
-
-    function ia(a, b, c, d) {
-        if (b.gutter && (b.node.removeChild(b.gutter), b.gutter = null), b.gutterBackground && (b.node.removeChild(b.gutterBackground), b.gutterBackground = null), b.line.gutterClass) {
-            var e = da(b);
-            b.gutterBackground = pg("div", null, "CodeMirror-gutter-background " + b.line.gutterClass, "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px; width: " + d.gutterTotalWidth + "px"), e.insertBefore(b.gutterBackground, b.text)
-        }
-        var f = b.line.gutterMarkers;
-        if (a.options.lineNumbers || f) {
-            var e = da(b),
-                g = b.gutter = pg("div", null, "CodeMirror-gutter-wrapper", "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px");
-            if (a.display.input.setUneditable(g), e.insertBefore(g, b.text), b.line.gutterClass && (g.className += " " + b.line.gutterClass), !a.options.lineNumbers || f && f["CodeMirror-linenumbers"] || (b.lineNumber = g.appendChild(pg("div", S(a.options, c), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + d.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + a.display.lineNumInnerWidth + "px"))), f)
-                for (var h = 0; h < a.options.gutters.length; ++h) {
-                    var i = a.options.gutters[h],
-                        j = f.hasOwnProperty(i) && f[i];
-                    j && g.appendChild(pg("div", [j], "CodeMirror-gutter-elt", "left: " + d.gutterLeft[i] + "px; width: " + d.gutterWidth[i] + "px"))
-                }
-        }
-    }
-
-    function ja(a, b, c) {
-        b.alignable && (b.alignable = null);
-        for (var e, d = b.node.firstChild; d; d = e) {
-            var e = d.nextSibling;
-            "CodeMirror-linewidget" == d.className && b.node.removeChild(d)
-        }
-        la(a, b, c)
-    }
-
-    function ka(a, b, c, d) {
-        var e = fa(a, b);
-        return b.text = b.node = e.pre, e.bgClass && (b.bgClass = e.bgClass), e.textClass && (b.textClass = e.textClass), ha(b), ia(a, b, c, d), la(a, b, d), b.node
-    }
-
-    function la(a, b, c) {
-        if (ma(a, b.line, b, c, !0), b.rest)
-            for (var d = 0; d < b.rest.length; d++) ma(a, b.rest[d], b, c, !1)
-    }
-
-    function ma(a, b, c, d, e) {
-        if (b.widgets)
-            for (var f = da(c), g = 0, h = b.widgets; g < h.length; ++g) {
-                var i = h[g],
-                    j = pg("div", [i.node], "CodeMirror-linewidget");
-                i.handleMouseEvents || j.setAttribute("cm-ignore-events", "true"), na(i, j, c, d), a.display.input.setUneditable(j), e && i.above ? f.insertBefore(j, c.gutter || c.text) : f.appendChild(j), Nf(i, "redraw")
-            }
-    }
-
-    function na(a, b, c, d) {
-        if (a.noHScroll) {
-            (c.alignable || (c.alignable = []))
-            .push(b);
-            var e = d.wrapperWidth;
-            b.style.left = d.fixedPos + "px", a.coverGutter || (e -= d.gutterTotalWidth, b.style.paddingLeft = d.gutterTotalWidth + "px"), b.style.width = e + "px"
-        }
-        a.coverGutter && (b.style.zIndex = 5, b.style.position = "relative", a.noHScroll || (b.style.marginLeft = -d.gutterTotalWidth + "px"))
-    }
-
-    function qa(a) {
-        return oa(a.line, a.ch)
-    }
-
-    function ra(a, b) {
-        return pa(a, b) < 0 ? b : a
-    }
-
-    function sa(a, b) {
-        return pa(a, b) < 0 ? a : b
-    }
-
-    function ta(a) {
-        a.state.focused || (a.display.input.focus(), Zc(a))
-    }
-
-    function ua(a) {
-        return a.options.readOnly || a.doc.cantEdit
-    }
-
-    function wa(a, b, c, d, e) {
-        var f = a.doc;
-        a.display.shift = !1, d || (d = f.sel);
-        var g = a.state.pasteIncoming || "paste" == e,
-            h = f.splitLines(b),
-            i = null;
-        if (g && d.ranges.length > 1)
-            if (va && va.join("\n") == b) {
-                if (d.ranges.length % va.length == 0) {
-                    i = [];
-                    for (var j = 0; j < va.length; j++) i.push(f.splitLines(va[j]))
-                }
-            } else h.length == d.ranges.length && (i = eg(h, function (a) {
-                return [a]
-            }));
-        for (var j = d.ranges.length - 1; j >= 0; j--) {
-            var k = d.ranges[j],
-                l = k.from(),
-                m = k.to();
-            k.empty() && (c && c > 0 ? l = oa(l.line, l.ch - c) : a.state.overwrite && !g && (m = oa(m.line, Math.min(ff(f, m.line)
-                .text.length, m.ch + bg(h)
-                .length))));
-            var n = a.curOp.updateInput,
-                o = {
-                    from: l,
-                    to: m,
-                    text: i ? i[j % i.length] : h,
-                    origin: e || (g ? "paste" : a.state.cutIncoming ? "cut" : "+input")
-                };
-            hd(a.doc, o), Nf(a, "inputRead", a, o)
-        }
-        b && !g && ya(a, b), td(a), a.curOp.updateInput = n, a.curOp.typing = !0, a.state.pasteIncoming = a.state.cutIncoming = !1
-    }
-
-    function xa(a, b) {
-        var c = a.clipboardData && a.clipboardData.getData("text/plain");
-        return c ? (a.preventDefault(), ua(b) || b.options.disableInput || cc(b, function () {
-            wa(b, c, 0, null, "paste")
-        }), !0) : void 0
-    }
-
-    function ya(a, b) {
-        if (a.options.electricChars && a.options.smartIndent)
-            for (var c = a.doc.sel, d = c.ranges.length - 1; d >= 0; d--) {
-                var e = c.ranges[d];
-                if (!(e.head.ch > 100 || d && c.ranges[d - 1].head.line == e.head.line)) {
-                    var f = a.getModeAt(e.head),
-                        g = !1;
-                    if (f.electricChars) {
-                        for (var h = 0; h < f.electricChars.length; h++)
-                            if (b.indexOf(f.electricChars.charAt(h)) > -1) {
-                                g = vd(a, e.head.line, "smart");
-                                break
-                            }
-                    } else f.electricInput && f.electricInput.test(ff(a.doc, e.head.line)
-                        .text.slice(0, e.head.ch)) && (g = vd(a, e.head.line, "smart"));
-                    g && Nf(a, "electricInput", a, e.head.line)
-                }
-            }
-    }
-
-    function za(a) {
-        for (var b = [], c = [], d = 0; d < a.doc.sel.ranges.length; d++) {
-            var e = a.doc.sel.ranges[d].head.line,
-                f = {
-                    anchor: oa(e, 0),
-                    head: oa(e + 1, 0)
-                };
-            c.push(f), b.push(a.getRange(f.anchor, f.head))
-        }
-        return {
-            text: b,
-            ranges: c
-        }
-    }
-
-    function Aa(a) {
-        a.setAttribute("autocorrect", "off"), a.setAttribute("autocapitalize", "off"), a.setAttribute("spellcheck", "false")
-    }
-
-    function Ba(a) {
-        this.cm = a, this.prevInput = "", this.pollingFast = !1, this.polling = new Yf, this.inaccurateSelection = !1, this.hasSelection = !1, this.composing = null
-    }
-
-    function Ca() {
-        var a = pg("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
-            b = pg("div", [a], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
-        return f ? a.style.width = "1000px" : a.setAttribute("wrap", "off"), m && (a.style.border = "1px solid black"), Aa(a), b
-    }
-
-    function Da(a) {
-        this.cm = a, this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null, this.polling = new Yf, this.gracePeriod = !1
-    }
-
-    function Ea(a, b) {
-        var c = wb(a, b.line);
-        if (!c || c.hidden) return null;
-        var d = ff(a.doc, b.line),
-            e = tb(c, d, b.line),
-            f = nf(d),
-            g = "left";
-        if (f) {
-            var h = Yg(f, b.ch);
-            g = h % 2 ? "right" : "left"
-        }
-        var i = Ab(e.map, b.ch, g);
-        return i.offset = "right" == i.collapse ? i.end : i.start, i
-    }
-
-    function Fa(a, b) {
-        return b && (a.bad = !0), a
-    }
-
-    function Ga(a, b, c) {
-        var d;
-        if (b == a.display.lineDiv) {
-            if (d = a.display.lineDiv.childNodes[c], !d) return Fa(a.clipPos(oa(a.display.viewTo - 1)), !0);
-            b = null, c = 0
-        } else
-            for (d = b;; d = d.parentNode) {
-                if (!d || d == a.display.lineDiv) return null;
-                if (d.parentNode && d.parentNode == a.display.lineDiv) break
-            }
-        for (var e = 0; e < a.display.view.length; e++) {
-            var f = a.display.view[e];
-            if (f.node == d) return Ha(f, b, c)
-        }
-    }
-
-    function Ha(a, b, c) {
-        function k(b, c, d) {
-            for (var e = -1; e < (j ? j.length : 0); e++)
-                for (var f = 0 > e ? i.map : j[e], g = 0; g < f.length; g += 3) {
-                    var h = f[g + 2];
-                    if (h == b || h == c) {
-                        var k = kf(0 > e ? a.line : a.rest[e]),
-                            l = f[g] + d;
-                        return (0 > d || h != b) && (l = f[g + (d ? 1 : 0)]), oa(k, l)
-                    }
-                }
-        }
-        var d = a.text.firstChild,
-            e = !1;
-        if (!b || !tg(d, b)) return Fa(oa(kf(a.line), 0), !0);
-        if (b == d && (e = !0, b = d.childNodes[c], c = 0, !b)) {
-            var f = a.rest ? bg(a.rest) : a.line;
-            return Fa(oa(kf(f), f.text.length), e)
-        }
-        var g = 3 == b.nodeType ? b : null,
-            h = b;
-        for (g || 1 != b.childNodes.length || 3 != b.firstChild.nodeType || (g = b.firstChild, c && (c = g.nodeValue.length)); h.parentNode != d;) h = h.parentNode;
-        var i = a.measure,
-            j = i.maps,
-            l = k(g, h, c);
-        if (l) return Fa(l, e);
-        for (var m = h.nextSibling, n = g ? g.nodeValue.length - c : 0; m; m = m.nextSibling) {
-            if (l = k(m, m.firstChild, 0)) return Fa(oa(l.line, l.ch - n), e);
-            n += m.textContent.length
-        }
-        for (var o = h.previousSibling, n = c; o; o = o.previousSibling) {
-            if (l = k(o, o.firstChild, -1)) return Fa(oa(l.line, l.ch + n), e);
-            n += m.textContent.length
-        }
-    }
-
-    function Ia(a, b, c, d, e) {
-        function i(a) {
-            return function (b) {
-                return b.id == a
-            }
-        }
-
-        function j(b) {
-            if (1 == b.nodeType) {
-                var c = b.getAttribute("cm-text");
-                if (null != c) return "" == c && (c = b.textContent.replace(/\u200b/g, "")), void(f += c);
-                var l, k = b.getAttribute("cm-marker");
-                if (k) {
-                    var m = a.findMarks(oa(d, 0), oa(e + 1, 0), i(+k));
-                    return void(m.length && (l = m[0].find()) && (f += gf(a.doc, l.from, l.to)
-                        .join(h)))
-                }
-                if ("false" == b.getAttribute("contenteditable")) return;
-                for (var n = 0; n < b.childNodes.length; n++) j(b.childNodes[n]);
-                /^(pre|div|p)$/i.test(b.nodeName) && (g = !0)
-            } else if (3 == b.nodeType) {
-                var o = b.nodeValue;
-                if (!o) return;
-                g && (f += h, g = !1), f += o
-            }
-        }
-        for (var f = "", g = !1, h = a.doc.lineSeparator(); j(b), b != c;) b = b.nextSibling;
-        return f
-    }
-
-    function Ja(a, b) {
-        this.ranges = a, this.primIndex = b
-    }
-
-    function Ka(a, b) {
-        this.anchor = a, this.head = b
-    }
-
-    function La(a, b) {
-        var c = a[b];
-        a.sort(function (a, b) {
-            return pa(a.from(), b.from())
-        }), b = dg(a, c);
-        for (var d = 1; d < a.length; d++) {
-            var e = a[d],
-                f = a[d - 1];
-            if (pa(f.to(), e.from()) >= 0) {
-                var g = sa(f.from(), e.from()),
-                    h = ra(f.to(), e.to()),
-                    i = f.empty() ? e.from() == e.head : f.from() == f.head;
-                b >= d && --b, a.splice(--d, 2, new Ka(i ? h : g, i ? g : h))
-            }
-        }
-        return new Ja(a, b)
-    }
-
-    function Ma(a, b) {
-        return new Ja([new Ka(a, b || a)], 0)
-    }
-
-    function Na(a, b) {
-        return Math.max(a.first, Math.min(b, a.first + a.size - 1))
-    }
-
-    function Oa(a, b) {
-        if (b.line < a.first) return oa(a.first, 0);
-        var c = a.first + a.size - 1;
-        return b.line > c ? oa(c, ff(a, c)
-            .text.length) : Pa(b, ff(a, b.line)
-            .text.length)
-    }
-
-    function Pa(a, b) {
-        var c = a.ch;
-        return null == c || c > b ? oa(a.line, b) : 0 > c ? oa(a.line, 0) : a
-    }
-
-    function Qa(a, b) {
-        return b >= a.first && b < a.first + a.size
-    }
-
-    function Ra(a, b) {
-        for (var c = [], d = 0; d < b.length; d++) c[d] = Oa(a, b[d]);
-        return c
-    }
-
-    function Sa(a, b, c, d) {
-        if (a.cm && a.cm.display.shift || a.extend) {
-            var e = b.anchor;
-            if (d) {
-                var f = pa(c, e) < 0;
-                f != pa(d, e) < 0 ? (e = c, c = d) : f != pa(c, d) < 0 && (c = d)
-            }
-            return new Ka(e, c)
-        }
-        return new Ka(d || c, c)
-    }
-
-    function Ta(a, b, c, d) {
-        Za(a, new Ja([Sa(a, a.sel.primary(), b, c)], 0), d)
-    }
-
-    function Ua(a, b, c) {
-        for (var d = [], e = 0; e < a.sel.ranges.length; e++) d[e] = Sa(a, a.sel.ranges[e], b[e], null);
-        var f = La(d, a.sel.primIndex);
-        Za(a, f, c)
-    }
-
-    function Va(a, b, c, d) {
-        var e = a.sel.ranges.slice(0);
-        e[b] = c, Za(a, La(e, a.sel.primIndex), d)
-    }
-
-    function Wa(a, b, c, d) {
-        Za(a, Ma(b, c), d)
-    }
-
-    function Xa(a, b) {
-        var c = {
-            ranges: b.ranges,
-            update: function (b) {
-                this.ranges = [];
-                for (var c = 0; c < b.length; c++) this.ranges[c] = new Ka(Oa(a, b[c].anchor), Oa(a, b[c].head))
-            }
-        };
-        return Lf(a, "beforeSelectionChange", a, c), a.cm && Lf(a.cm, "beforeSelectionChange", a.cm, c), c.ranges != b.ranges ? La(c.ranges, c.ranges.length - 1) : b
-    }
-
-    function Ya(a, b, c) {
-        var d = a.history.done,
-            e = bg(d);
-        e && e.ranges ? (d[d.length - 1] = b, $a(a, b, c)) : Za(a, b, c)
-    }
-
-    function Za(a, b, c) {
-        $a(a, b, c), uf(a, a.sel, a.cm ? a.cm.curOp.id : NaN, c)
-    }
-
-    function $a(a, b, c) {
-        (Rf(a, "beforeSelectionChange") || a.cm && Rf(a.cm, "beforeSelectionChange")) && (b = Xa(a, b));
-        var d = c && c.bias || (pa(b.primary()
-            .head, a.sel.primary()
-            .head) < 0 ? -1 : 1);
-        _a(a, bb(a, b, d, !0)), c && c.scroll === !1 || !a.cm || td(a.cm)
-    }
-
-    function _a(a, b) {
-        b.equals(a.sel) || (a.sel = b, a.cm && (a.cm.curOp.updateInput = a.cm.curOp.selectionChanged = !0, Qf(a.cm)), Nf(a, "cursorActivity", a))
-    }
-
-    function ab(a) {
-        _a(a, bb(a, a.sel, null, !1), Vf)
-    }
-
-    function bb(a, b, c, d) {
-        for (var e, f = 0; f < b.ranges.length; f++) {
-            var g = b.ranges[f],
-                h = cb(a, g.anchor, c, d),
-                i = cb(a, g.head, c, d);
-            (e || h != g.anchor || i != g.head) && (e || (e = b.ranges.slice(0, f)), e[f] = new Ka(h, i))
-        }
-        return e ? La(e, b.primIndex) : b
-    }
-
-    function cb(a, b, c, d) {
-        var e = !1,
-            f = b,
-            g = c || 1;
-        a.cantEdit = !1;
-        a: for (;;) {
-            var h = ff(a, f.line);
-            if (h.markedSpans)
-                for (var i = 0; i < h.markedSpans.length; ++i) {
-                    var j = h.markedSpans[i],
-                        k = j.marker;
-                    if ((null == j.from || (k.inclusiveLeft ? j.from <= f.ch : j.from < f.ch)) && (null == j.to || (k.inclusiveRight ? j.to >= f.ch : j.to > f.ch))) {
-                        if (d && (Lf(k, "beforeCursorEnter"), k.explicitlyCleared)) {
-                            if (h.markedSpans) {
-                                --i;
-                                continue
-                            }
-                            break
-                        }
-                        if (!k.atomic) continue;
-                        var l = k.find(0 > g ? -1 : 1);
-                        if (0 == pa(l, f) && (l.ch += g, l.ch < 0 ? l = l.line > a.first ? Oa(a, oa(l.line - 1)) : null : l.ch > h.text.length && (l = l.line < a.first + a.size - 1 ? oa(l.line + 1, 0) : null), !l)) {
-                            if (e) return d ? (a.cantEdit = !0, oa(a.first, 0)) : cb(a, b, c, !0);
-                            e = !0, l = b, g = -g
-                        }
-                        f = l;
-                        continue a
-                    }
-                }
-            return f
-        }
-    }
-
-    function db(a) {
-        a.display.input.showSelection(a.display.input.prepareSelection())
-    }
-
-    function eb(a, b) {
-        for (var c = a.doc, d = {}, e = d.cursors = document.createDocumentFragment(), f = d.selection = document.createDocumentFragment(), g = 0; g < c.sel.ranges.length; g++)
-            if (b !== !1 || g != c.sel.primIndex) {
-                var h = c.sel.ranges[g],
-                    i = h.empty();
-                (i || a.options.showCursorWhenSelecting) && fb(a, h.head, e), i || gb(a, h, f)
-            }
-        return d
-    }
-
-    function fb(a, b, c) {
-        var d = Lb(a, b, "div", null, null, !a.options.singleCursorHeightPerLine),
-            e = c.appendChild(pg("div", "\xa0", "CodeMirror-cursor"));
-        if (e.style.left = d.left + "px", e.style.top = d.top + "px", e.style.height = Math.max(0, d.bottom - d.top) * a.options.cursorHeight + "px", d.other) {
-            var f = c.appendChild(pg("div", "\xa0", "CodeMirror-cursor CodeMirror-secondarycursor"));
-            f.style.display = "", f.style.left = d.other.left + "px", f.style.top = d.other.top + "px", f.style.height = .85 * (d.other.bottom - d.other.top) + "px"
-        }
-    }
-
-    function gb(a, b, c) {
-        function j(a, b, c, d) {
-            0 > b && (b = 0), b = Math.round(b), d = Math.round(d), f.appendChild(pg("div", null, "CodeMirror-selected", "position: absolute; left: " + a + "px; top: " + b + "px; width: " + (null == c ? i - a : c) + "px; height: " + (d - b) + "px"))
-        }
-
-        function k(b, c, d) {
-            function m(c, d) {
-                return Kb(a, oa(b, c), "div", f, d)
-            }
-            var k, l, f = ff(e, b),
-                g = f.text.length;
-            return Og(nf(f), c || 0, null == d ? g : d, function (a, b, e) {
-                var n, o, p, f = m(a, "left");
-                if (a == b) n = f, o = p = f.left;
-                else {
-                    if (n = m(b - 1, "right"), "rtl" == e) {
-                        var q = f;
-                        f = n, n = q
-                    }
-                    o = f.left, p = n.right
-                }
-                null == c && 0 == a && (o = h), n.top - f.top > 3 && (j(o, f.top, null, f.bottom), o = h, f.bottom < n.top && j(o, f.bottom, null, n.top)), null == d && b == g && (p = i), (!k || f.top < k.top || f.top == k.top && f.left < k.left) && (k = f), (!l || n.bottom > l.bottom || n.bottom == l.bottom && n.right > l.right) && (l = n), h + 1 > o && (o = h), j(o, n.top, p - o, n.bottom)
-            }), {
-                start: k,
-                end: l
-            }
-        }
-        var d = a.display,
-            e = a.doc,
-            f = document.createDocumentFragment(),
-            g = ob(a.display),
-            h = g.left,
-            i = Math.max(d.sizerWidth, qb(a) - d.sizer.offsetLeft) - g.right,
-            l = b.from(),
-            m = b.to();
-        if (l.line == m.line) k(l.line, l.ch, m.ch);
-        else {
-            var n = ff(e, l.line),
-                o = ff(e, m.line),
-                p = se(n) == se(o),
-                q = k(l.line, l.ch, p ? n.text.length + 1 : null)
-                .end,
-                r = k(m.line, p ? 0 : null, m.ch)
-                .start;
-            p && (q.top < r.top - 2 ? (j(q.right, q.top, null, q.bottom), j(h, r.top, r.left, r.bottom)) : j(q.right, q.top, r.left - q.right, q.bottom)), q.bottom < r.top && j(h, q.bottom, null, r.top)
-        }
-        c.appendChild(f)
-    }
-
-    function hb(a) {
-        if (a.state.focused) {
-            var b = a.display;
-            clearInterval(b.blinker);
-            var c = !0;
-            b.cursorDiv.style.visibility = "", a.options.cursorBlinkRate > 0 ? b.blinker = setInterval(function () {
-                b.cursorDiv.style.visibility = (c = !c) ? "" : "hidden"
-            }, a.options.cursorBlinkRate) : a.options.cursorBlinkRate < 0 && (b.cursorDiv.style.visibility = "hidden")
-        }
-    }
-
-    function ib(a, b) {
-        a.doc.mode.startState && a.doc.frontier < a.display.viewTo && a.state.highlight.set(b, ig(jb, a))
-    }
-
-    function jb(a) {
-        var b = a.doc;
-        if (b.frontier < b.first && (b.frontier = b.first), !(b.frontier >= a.display.viewTo)) {
-            var c = +new Date + a.options.workTime,
-                d = Jd(b.mode, lb(a, b.frontier)),
-                e = [];
-            b.iter(b.frontier, Math.min(b.first + b.size, a.display.viewTo + 500), function (f) {
-                if (b.frontier >= a.display.viewFrom) {
-                    var g = f.styles,
-                        h = f.text.length > a.options.maxHighlightLength,
-                        i = Ke(a, f, h ? Jd(b.mode, d) : d, !0);
-                    f.styles = i.styles;
-                    var j = f.styleClasses,
-                        k = i.classes;
-                    k ? f.styleClasses = k : j && (f.styleClasses = null);
-                    for (var l = !g || g.length != f.styles.length || j != k && (!j || !k || j.bgClass != k.bgClass || j.textClass != k.textClass), m = 0; !l && m < g.length; ++m) l = g[m] != f.styles[m];
-                    l && e.push(b.frontier), f.stateAfter = h ? d : Jd(b.mode, d)
-                } else f.text.length <= a.options.maxHighlightLength && Me(a, f.text, d), f.stateAfter = b.frontier % 5 == 0 ? Jd(b.mode, d) : null;
-                return ++b.frontier, +new Date > c ? (ib(a, a.options.workDelay), !0) : void 0
-            }), e.length && cc(a, function () {
-                for (var b = 0; b < e.length; b++) jc(a, e[b], "text")
-            })
-        }
-    }
-
-    function kb(a, b, c) {
-        for (var d, e, f = a.doc, g = c ? -1 : b - (a.doc.mode.innerMode ? 1e3 : 100), h = b; h > g; --h) {
-            if (h <= f.first) return f.first;
-            var i = ff(f, h - 1);
-            if (i.stateAfter && (!c || h <= f.frontier)) return h;
-            var j = Zf(i.text, null, a.options.tabSize);
-            (null == e || d > j) && (e = h - 1, d = j)
-        }
-        return e
-    }
-
-    function lb(a, b, c) {
-        var d = a.doc,
-            e = a.display;
-        if (!d.mode.startState) return !0;
-        var f = kb(a, b, c),
-            g = f > d.first && ff(d, f - 1)
-            .stateAfter;
-        return g = g ? Jd(d.mode, g) : Kd(d.mode), d.iter(f, b, function (c) {
-            Me(a, c.text, g);
-            var h = f == b - 1 || f % 5 == 0 || f >= e.viewFrom && f < e.viewTo;
-            c.stateAfter = h ? Jd(d.mode, g) : null, ++f
-        }), c && (d.frontier = f), g
-    }
-
-    function mb(a) {
-        return a.lineSpace.offsetTop
-    }
-
-    function nb(a) {
-        return a.mover.offsetHeight - a.lineSpace.offsetHeight
-    }
-
-    function ob(a) {
-        if (a.cachedPaddingH) return a.cachedPaddingH;
-        var b = sg(a.measure, pg("pre", "x")),
-            c = window.getComputedStyle ? window.getComputedStyle(b, null) : b.currentStyle, // why the null: http://bugs.jquery.com/ticket/8635
-            d = {
-                left: parseInt(c.paddingLeft),
-                right: parseInt(c.paddingRight)
-            };
-        return isNaN(d.left) || isNaN(d.right) || (a.cachedPaddingH = d), d
-    }
-
-    function pb(a) {
-        return Tf - a.display.nativeBarWidth
-    }
-
-    function qb(a) {
-        return a.display.scroller.clientWidth - pb(a) - a.display.barWidth
-    }
-
-    function rb(a) {
-        return a.display.scroller.clientHeight - pb(a) - a.display.barHeight
-    }
-
-    function sb(a, b, c) {
-        var d = a.options.lineWrapping,
-            e = d && qb(a);
-        if (!b.measure.heights || d && b.measure.width != e) {
-            var f = b.measure.heights = [];
-            if (d) {
-                b.measure.width = e;
-                for (var g = b.text.firstChild.getClientRects(), h = 0; h < g.length - 1; h++) {
-                    var i = g[h],
-                        j = g[h + 1];
-                    Math.abs(i.bottom - j.bottom) > 2 && f.push((i.bottom + j.top) / 2 - c.top)
-                }
-            }
-            f.push(c.bottom - c.top)
-        }
-    }
-
-    function tb(a, b, c) {
-        if (a.line == b) return {
-            map: a.measure.map,
-            cache: a.measure.cache
-        };
-        for (var d = 0; d < a.rest.length; d++)
-            if (a.rest[d] == b) return {
-                map: a.measure.maps[d],
-                cache: a.measure.caches[d]
-            };
-        for (var d = 0; d < a.rest.length; d++)
-            if (kf(a.rest[d]) > c) return {
-                map: a.measure.maps[d],
-                cache: a.measure.caches[d],
-                before: !0
-            }
-    }
-
-    function ub(a, b) {
-        b = se(b);
-        var c = kf(b),
-            d = a.display.externalMeasured = new gc(a.doc, b, c);
-        d.lineN = c;
-        var e = d.built = Qe(a, d);
-        return d.text = e.pre, sg(a.display.lineMeasure, e.pre), d
-    }
-
-    function vb(a, b, c, d) {
-        return yb(a, xb(a, b), c, d)
-    }
-
-    function wb(a, b) {
-        if (b >= a.display.viewFrom && b < a.display.viewTo) return a.display.view[lc(a, b)];
-        var c = a.display.externalMeasured;
-        return c && b >= c.lineN && b < c.lineN + c.size ? c : void 0
-    }
-
-    function xb(a, b) {
-        var c = kf(b),
-            d = wb(a, c);
-        d && !d.text ? d = null : d && d.changes && (ca(a, d, c, aa(a)), a.curOp.forceUpdate = !0), d || (d = ub(a, b));
-        var e = tb(d, b, c);
-        return {
-            line: b,
-            view: d,
-            rect: null,
-            map: e.map,
-            cache: e.cache,
-            before: e.before,
-            hasHeights: !1
-        }
-    }
-
-    function yb(a, b, c, d, e) {
-        b.before && (c = -1);
-        var g, f = c + (d || "");
-        return b.cache.hasOwnProperty(f) ? g = b.cache[f] : (b.rect || (b.rect = b.view.text.getBoundingClientRect()), b.hasHeights || (sb(a, b.view, b.rect), b.hasHeights = !0), g = Bb(a, b, c, d), g.bogus || (b.cache[f] = g)), {
-            left: g.left,
-            right: g.right,
-            top: e ? g.rtop : g.top,
-            bottom: e ? g.rbottom : g.bottom
-        }
-    }
-
-    function Ab(a, b, c) {
-        for (var d, e, f, g, h = 0; h < a.length; h += 3) {
-            var i = a[h],
-                j = a[h + 1];
-            if (i > b ? (e = 0, f = 1, g = "left") : j > b ? (e = b - i, f = e + 1) : (h == a.length - 3 || b == j && a[h + 3] > b) && (f = j - i, e = f - 1, b >= j && (g = "right")), null != e) {
-                if (d = a[h + 2], i == j && c == (d.insertLeft ? "left" : "right") && (g = c), "left" == c && 0 == e)
-                    for (; h && a[h - 2] == a[h - 3] && a[h - 1].insertLeft;) d = a[(h -= 3) + 2], g = "left";
-                if ("right" == c && e == j - i)
-                    for (; h < a.length - 3 && a[h + 3] == a[h + 4] && !a[h + 5].insertLeft;) d = a[(h += 3) + 2], g = "right";
-                break
-            }
-        }
-        return {
-            node: d,
-            start: e,
-            end: f,
-            collapse: g,
-            coverStart: i,
-            coverEnd: j
-        }
-    }
-
-    function Bb(a, b, c, f) {
-        var l, g = Ab(b.map, c, f),
-            h = g.node,
-            i = g.start,
-            j = g.end,
-            k = g.collapse;
-        if (3 == h.nodeType) {
-            for (var m = 0; 4 > m; m++) {
-                for (; i && og(b.line.text.charAt(g.coverStart + i));) --i;
-                for (; g.coverStart + j < g.coverEnd && og(b.line.text.charAt(g.coverStart + j));) ++j;
-                if (d && 9 > e && 0 == i && j == g.coverEnd - g.coverStart) l = h.parentNode.getBoundingClientRect();
-                else if (d && a.options.lineWrapping) {
-                    var n = qg(h, i, j).getClientRects();
-                    l = n.length ? n["right" == f ? n.length - 1 : 0] : zb
-                } else if (oldff) { // customization here
-                    var w = jQuery(".CodeMirror-line SPAN", b.view.node).get(0);
-                    if (w) {
-                        l = w.getClientRects()[0];
-                    } else {
-                        l = zb;
-                    }
-                } else {
-                    l = qg(h, i, j).getBoundingClientRect() || zb;
-                }
-                if (l.left || l.right || 0 == i) break;
-                j = i, i -= 1, k = "right"
-            }
-            d && 11 > e && (l = Cb(a.display.measure, l))
-        } else {
-            i > 0 && (k = f = "right");
-            var n;
-            l = a.options.lineWrapping && (n = h.getClientRects())
-                .length > 1 ? n["right" == f ? n.length - 1 : 0] : h.getBoundingClientRect()
-        }
-        if (d && 9 > e && !i && (!l || !l.left && !l.right)) {
-            var o = h.parentNode.getClientRects()[0];
-            l = o ? {
-                left: o.left,
-                right: o.left + Sb(a.display),
-                top: o.top,
-                bottom: o.bottom
-            } : zb
-        }
-        for (var p = l.top - b.rect.top, q = l.bottom - b.rect.top, r = (p + q) / 2, s = b.view.measure.heights, m = 0; m < s.length - 1 && !(r < s[m]); m++);
-        var t = m ? s[m - 1] : 0,
-            u = s[m],
-            v = {
-                left: ("right" == k ? l.right : l.left) - b.rect.left,
-                right: ("left" == k ? l.left : l.right) - b.rect.left,
-                top: t,
-                bottom: u
-            };
-        return l.left || l.right || (v.bogus = !0), a.options.singleCursorHeightPerLine || (v.rtop = p, v.rbottom = q), v
-    }
-
-    function Cb(a, b) {
-        if (!window.screen || null == screen.logicalXDPI || screen.logicalXDPI == screen.deviceXDPI || !Mg(a)) return b;
-        var c = screen.logicalXDPI / screen.deviceXDPI,
-            d = screen.logicalYDPI / screen.deviceYDPI;
-        return {
-            left: b.left * c,
-            right: b.right * c,
-            top: b.top * d,
-            bottom: b.bottom * d
-        }
-    }
-
-    function Db(a) {
-        if (a.measure && (a.measure.cache = {}, a.measure.heights = null, a.rest))
-            for (var b = 0; b < a.rest.length; b++) a.measure.caches[b] = {}
-    }
-
-    function Eb(a) {
-        a.display.externalMeasure = null, rg(a.display.lineMeasure);
-        for (var b = 0; b < a.display.view.length; b++) Db(a.display.view[b])
-    }
-
-    function Fb(a) {
-        Eb(a), a.display.cachedCharWidth = a.display.cachedTextHeight = a.display.cachedPaddingH = null, a.options.lineWrapping || (a.display.maxLineChanged = !0), a.display.lineNumChars = null
-    }
-
-    function Gb() {
-        return window.pageXOffset || (document.documentElement || document.body)
-            .scrollLeft
-    }
-
-    function Hb() {
-        return window.pageYOffset || (document.documentElement || document.body)
-            .scrollTop
-    }
-
-    function Ib(a, b, c, d) {
-        if (b.widgets)
-            for (var e = 0; e < b.widgets.length; ++e)
-                if (b.widgets[e].above) {
-                    var f = Ae(b.widgets[e]);
-                    c.top += f, c.bottom += f
-                }
-        if ("line" == d) return c;
-        d || (d = "local");
-        var g = mf(b);
-        if ("local" == d ? g += mb(a.display) : g -= a.display.viewOffset, "page" == d || "window" == d) {
-            var h = a.display.lineSpace.getBoundingClientRect();
-            g += h.top + ("window" == d ? 0 : Hb());
-            var i = h.left + ("window" == d ? 0 : Gb());
-            c.left += i, c.right += i
-        }
-        return c.top += g, c.bottom += g, c
-    }
-
-    function Jb(a, b, c) {
-        if ("div" == c) return b;
-        var d = b.left,
-            e = b.top;
-        if ("page" == c) d -= Gb(), e -= Hb();
-        else if ("local" == c || !c) {
-            var f = a.display.sizer.getBoundingClientRect();
-            d += f.left, e += f.top
-        }
-        var g = a.display.lineSpace.getBoundingClientRect();
-        return {
-            left: d - g.left,
-            top: e - g.top
-        }
-    }
-
-    function Kb(a, b, c, d, e) {
-        return d || (d = ff(a.doc, b.line)), Ib(a, d, vb(a, d, b.ch, e), c)
-    }
-
-    function Lb(a, b, c, d, e, f) {
-        function g(b, g) {
-            var h = yb(a, e, b, g ? "right" : "left", f);
-            return g ? h.left = h.right : h.right = h.left, Ib(a, d, h, c)
-        }
-
-        function h(a, b) {
-            var c = i[b],
-                d = c.level % 2;
-            return a == Pg(c) && b && c.level < i[b - 1].level ? (c = i[--b], a = Qg(c) - (c.level % 2 ? 0 : 1), d = !0) : a == Qg(c) && b < i.length - 1 && c.level < i[b + 1].level && (c = i[++b], a = Pg(c) - c.level % 2, d = !1), d && a == c.to && a > c.from ? g(a - 1) : g(a, d)
-        }
-        d = d || ff(a.doc, b.line), e || (e = xb(a, d));
-        var i = nf(d),
-            j = b.ch;
-        if (!i) return g(j);
-        var k = Yg(i, j),
-            l = h(j, k);
-        return null != Xg && (l.other = h(j, Xg)), l
-    }
-
-    function Mb(a, b) {
-        var c = 0,
-            b = Oa(a.doc, b);
-        a.options.lineWrapping || (c = Sb(a.display) * b.ch);
-        var d = ff(a.doc, b.line),
-            e = mf(d) + mb(a.display);
-        return {
-            left: c,
-            right: c,
-            top: e,
-            bottom: e + d.height
-        }
-    }
-
-    function Nb(a, b, c, d) {
-        var e = oa(a, b);
-        return e.xRel = d, c && (e.outside = !0), e
-    }
-
-    function Ob(a, b, c) {
-        var d = a.doc;
-        if (c += a.display.viewOffset, 0 > c) return Nb(d.first, 0, !0, -1);
-        var e = lf(d, c),
-            f = d.first + d.size - 1;
-        if (e > f) return Nb(d.first + d.size - 1, ff(d, f)
-            .text.length, !0, 1);
-        0 > b && (b = 0);
-        for (var g = ff(d, e);;) {
-            var h = Pb(a, g, e, b, c),
-                i = qe(g),
-                j = i && i.find(0, !0);
-            if (!i || !(h.ch > j.from.ch || h.ch == j.from.ch && h.xRel > 0)) return h;
-            e = kf(g = j.to.line)
-        }
-    }
-
-    function Pb(a, b, c, d, e) {
-        function j(d) {
-            var e = Lb(a, oa(c, d), "line", b, i);
-            return g = !0, f > e.bottom ? e.left - h : f < e.top ? e.left + h : (g = !1, e.left)
-        }
-        var f = e - mf(b),
-            g = !1,
-            h = 2 * a.display.wrapper.clientWidth,
-            i = xb(a, b),
-            k = nf(b),
-            l = b.text.length,
-            m = Rg(b),
-            n = Sg(b),
-            o = j(m),
-            p = g,
-            q = j(n),
-            r = g;
-        if (d > q) return Nb(c, n, r, 1);
-        for (;;) {
-            if (k ? n == m || n == $g(b, m, 1) : 1 >= n - m) {
-                for (var s = o > d || q - d >= d - o ? m : n, t = d - (s == m ? o : q); og(b.text.charAt(s));) ++s;
-                var u = Nb(c, s, s == m ? p : r, -1 > t ? -1 : t > 1 ? 1 : 0);
-                return u
-            }
-            var v = Math.ceil(l / 2),
-                w = m + v;
-            if (k) {
-                w = m;
-                for (var x = 0; v > x; ++x) w = $g(b, w, 1)
-            }
-            var y = j(w);
-            y > d ? (n = w, q = y, (r = g) && (q += 1e3), l = v) : (m = w, o = y, p = g, l -= v)
-        }
-    }
-
-    function Rb(a) {
-        if (null != a.cachedTextHeight) return a.cachedTextHeight;
-        if (null == Qb) {
-            Qb = pg("pre");
-            for (var b = 0; 49 > b; ++b) Qb.appendChild(document.createTextNode("x")), Qb.appendChild(pg("br"));
-            Qb.appendChild(document.createTextNode("x"))
-        }
-        sg(a.measure, Qb);
-        var c = Qb.offsetHeight / 50;
-        return c > 3 && (a.cachedTextHeight = c), rg(a.measure), c || 1
-    }
-
-    function Sb(a) {
-        if (null != a.cachedCharWidth) return a.cachedCharWidth;
-        var b = pg("span", "xxxxxxxxxx"),
-            c = pg("pre", [b]);
-        sg(a.measure, c);
-        var d = b.getBoundingClientRect(),
-            e = (d.right - d.left) / 10;
-        return e > 2 && (a.cachedCharWidth = e), e || 10
-    }
-
-    function Vb(a) {
-        a.curOp = {
-            cm: a,
-            viewChanged: !1,
-            startHeight: a.doc.height,
-            forceUpdate: !1,
-            updateInput: null,
-            typing: !1,
-            changeObjs: null,
-            cursorActivityHandlers: null,
-            cursorActivityCalled: 0,
-            selectionChanged: !1,
-            updateMaxLine: !1,
-            scrollLeft: null,
-            scrollTop: null,
-            scrollToPos: null,
-            focus: !1,
-            id: ++Ub
-        }, Tb ? Tb.ops.push(a.curOp) : a.curOp.ownsGroup = Tb = {
-            ops: [a.curOp],
-            delayedCallbacks: []
-        }
-    }
-
-    function Wb(a) {
-        var b = a.delayedCallbacks,
-            c = 0;
-        do {
-            for (; c < b.length; c++) b[c].call(null);
-            for (var d = 0; d < a.ops.length; d++) {
-                var e = a.ops[d];
-                if (e.cursorActivityHandlers)
-                    for (; e.cursorActivityCalled < e.cursorActivityHandlers.length;) e.cursorActivityHandlers[e.cursorActivityCalled++].call(null, e.cm)
-            }
-        } while (c < b.length)
-    }
-
-    function Xb(a) {
-        var b = a.curOp,
-            c = b.ownsGroup;
-        if (c) try {
-            Wb(c)
-        } finally {
-            Tb = null;
-            for (var d = 0; d < c.ops.length; d++) c.ops[d].cm.curOp = null;
-            Yb(c)
-        }
-    }
-
-    function Yb(a) {
-        for (var b = a.ops, c = 0; c < b.length; c++) Zb(b[c]);
-        for (var c = 0; c < b.length; c++) $b(b[c]);
-        for (var c = 0; c < b.length; c++) _b(b[c]);
-        for (var c = 0; c < b.length; c++) ac(b[c]);
-        for (var c = 0; c < b.length; c++) bc(b[c])
-    }
-
-    function Zb(a) {
-        var b = a.cm,
-            c = b.display;
-        V(b), a.updateMaxLine && H(b), a.mustUpdate = a.viewChanged || a.forceUpdate || null != a.scrollTop || a.scrollToPos && (a.scrollToPos.from.line < c.viewFrom || a.scrollToPos.to.line >= c.viewTo) || c.maxLineChanged && b.options.lineWrapping, a.update = a.mustUpdate && new U(b, a.mustUpdate && {
-            top: a.scrollTop,
-            ensure: a.scrollToPos
-        }, a.forceUpdate)
-    }
-
-    function $b(a) {
-        a.updatedDisplay = a.mustUpdate && W(a.cm, a.update)
-    }
-
-    function _b(a) {
-        var b = a.cm,
-            c = b.display;
-        a.updatedDisplay && $(b), a.barMeasure = J(b), c.maxLineChanged && !b.options.lineWrapping && (a.adjustWidthTo = vb(b, c.maxLine, c.maxLine.text.length)
-            .left + 3, b.display.sizerWidth = a.adjustWidthTo, a.barMeasure.scrollWidth = Math.max(c.scroller.clientWidth, c.sizer.offsetLeft + a.adjustWidthTo + pb(b) + b.display.barWidth), a.maxScrollLeft = Math.max(0, c.sizer.offsetLeft + a.adjustWidthTo - qb(b))), (a.updatedDisplay || a.selectionChanged) && (a.preparedSelection = c.input.prepareSelection())
-    }
-
-    function ac(a) {
-        var b = a.cm;
-        null != a.adjustWidthTo && (b.display.sizer.style.minWidth = a.adjustWidthTo + "px", a.maxScrollLeft < b.doc.scrollLeft && Ic(b, Math.min(b.display.scroller.scrollLeft, a.maxScrollLeft), !0), b.display.maxLineChanged = !1), a.preparedSelection && b.display.input.showSelection(a.preparedSelection), a.updatedDisplay && Z(b, a.barMeasure), (a.updatedDisplay || a.startHeight != b.doc.height) && N(b, a.barMeasure), a.selectionChanged && hb(b), b.state.focused && a.updateInput && b.display.input.reset(a.typing), a.focus && a.focus == ug() && ta(a.cm)
-    }
-
-    function bc(a) {
-        var b = a.cm,
-            c = b.display,
-            d = b.doc;
-        if (a.updatedDisplay && X(b, a.update), null == c.wheelStartX || null == a.scrollTop && null == a.scrollLeft && !a.scrollToPos || (c.wheelStartX = c.wheelStartY = null), null == a.scrollTop || c.scroller.scrollTop == a.scrollTop && !a.forceScroll || (d.scrollTop = Math.max(0, Math.min(c.scroller.scrollHeight - c.scroller.clientHeight, a.scrollTop)), c.scrollbars.setScrollTop(d.scrollTop), c.scroller.scrollTop = d.scrollTop), null == a.scrollLeft || c.scroller.scrollLeft == a.scrollLeft && !a.forceScroll || (d.scrollLeft = Math.max(0, Math.min(c.scroller.scrollWidth - qb(b), a.scrollLeft)), c.scrollbars.setScrollLeft(d.scrollLeft), c.scroller.scrollLeft = d.scrollLeft, Q(b)), a.scrollToPos) {
-            var e = pd(b, Oa(d, a.scrollToPos.from), Oa(d, a.scrollToPos.to), a.scrollToPos.margin);
-            a.scrollToPos.isCursor && b.state.focused && od(b, e)
-        }
-        var f = a.maybeHiddenMarkers,
-            g = a.maybeUnhiddenMarkers;
-        if (f)
-            for (var h = 0; h < f.length; ++h) f[h].lines.length || Lf(f[h], "hide");
-        if (g)
-            for (var h = 0; h < g.length; ++h) g[h].lines.length && Lf(g[h], "unhide");
-        c.wrapper.offsetHeight && (d.scrollTop = b.display.scroller.scrollTop), a.changeObjs && Lf(b, "changes", b, a.changeObjs), a.update && a.update.finish()
-    }
-
-    function cc(a, b) {
-        if (a.curOp) return b();
-        Vb(a);
-        try {
-            return b()
-        } finally {
-            Xb(a)
-        }
-    }
-
-    function dc(a, b) {
-        return function () {
-            if (a.curOp) return b.apply(a, arguments);
-            Vb(a);
-            try {
-                return b.apply(a, arguments)
-            } finally {
-                Xb(a)
-            }
-        }
-    }
-
-    function ec(a) {
-        return function () {
-            if (this.curOp) return a.apply(this, arguments);
-            Vb(this);
-            try {
-                return a.apply(this, arguments)
-            } finally {
-                Xb(this)
-            }
-        }
-    }
-
-    function fc(a) {
-        return function () {
-            var b = this.cm;
-            if (!b || b.curOp) return a.apply(this, arguments);
-            Vb(b);
-            try {
-                return a.apply(this, arguments)
-            } finally {
-                Xb(b)
-            }
-        }
-    }
-
-    function gc(a, b, c) {
-        this.line = b, this.rest = te(b), this.size = this.rest ? kf(bg(this.rest)) - c + 1 : 1, this.node = this.text = null, this.hidden = we(a, b)
-    }
-
-    function hc(a, b, c) {
-        for (var e, d = [], f = b; c > f; f = e) {
-            var g = new gc(a.doc, ff(a.doc, f), f);
-            e = f + g.size, d.push(g)
-        }
-        return d
-    }
-
-    function ic(a, b, c, d) {
-        null == b && (b = a.doc.first), null == c && (c = a.doc.first + a.doc.size), d || (d = 0);
-        var e = a.display;
-        if (d && c < e.viewTo && (null == e.updateLineNumbers || e.updateLineNumbers > b) && (e.updateLineNumbers = b), a.curOp.viewChanged = !0, b >= e.viewTo) u && ue(a.doc, b) < e.viewTo && kc(a);
-        else if (c <= e.viewFrom) u && ve(a.doc, c + d) > e.viewFrom ? kc(a) : (e.viewFrom += d, e.viewTo += d);
-        else if (b <= e.viewFrom && c >= e.viewTo) kc(a);
-        else if (b <= e.viewFrom) {
-            var f = mc(a, c, c + d, 1);
-            f ? (e.view = e.view.slice(f.index), e.viewFrom = f.lineN, e.viewTo += d) : kc(a)
-        } else if (c >= e.viewTo) {
-            var f = mc(a, b, b, -1);
-            f ? (e.view = e.view.slice(0, f.index), e.viewTo = f.lineN) : kc(a)
-        } else {
-            var g = mc(a, b, b, -1),
-                h = mc(a, c, c + d, 1);
-            g && h ? (e.view = e.view.slice(0, g.index)
-                .concat(hc(a, g.lineN, h.lineN))
-                .concat(e.view.slice(h.index)), e.viewTo += d) : kc(a)
-        }
-        var i = e.externalMeasured;
-        i && (c < i.lineN ? i.lineN += d : b < i.lineN + i.size && (e.externalMeasured = null))
-    }
-
-    function jc(a, b, c) {
-        a.curOp.viewChanged = !0;
-        var d = a.display,
-            e = a.display.externalMeasured;
-        if (e && b >= e.lineN && b < e.lineN + e.size && (d.externalMeasured = null), !(b < d.viewFrom || b >= d.viewTo)) {
-            var f = d.view[lc(a, b)];
-            if (null != f.node) {
-                var g = f.changes || (f.changes = []); - 1 == dg(g, c) && g.push(c)
-            }
-        }
-    }
-
-    function kc(a) {
-        a.display.viewFrom = a.display.viewTo = a.doc.first, a.display.view = [], a.display.viewOffset = 0
-    }
-
-    function lc(a, b) {
-        if (b >= a.display.viewTo) return null;
-        if (b -= a.display.viewFrom, 0 > b) return null;
-        for (var c = a.display.view, d = 0; d < c.length; d++)
-            if (b -= c[d].size, 0 > b) return d
-    }
-
-    function mc(a, b, c, d) {
-        var f, e = lc(a, b),
-            g = a.display.view;
-        if (!u || c == a.doc.first + a.doc.size) return {
-            index: e,
-            lineN: c
-        };
-        for (var h = 0, i = a.display.viewFrom; e > h; h++) i += g[h].size;
-        if (i != b) {
-            if (d > 0) {
-                if (e == g.length - 1) return null;
-                f = i + g[e].size - b, e++
-            } else f = i - b;
-            b += f, c += f
-        }
-        for (; ue(a.doc, c) != c;) {
-            if (e == (0 > d ? 0 : g.length - 1)) return null;
-            c += d * g[e - (0 > d ? 1 : 0)].size, e += d
-        }
-        return {
-            index: e,
-            lineN: c
-        }
-    }
-
-    function nc(a, b, c) {
-        var d = a.display,
-            e = d.view;
-        0 == e.length || b >= d.viewTo || c <= d.viewFrom ? (d.view = hc(a, b, c), d.viewFrom = b) : (d.viewFrom > b ? d.view = hc(a, b, d.viewFrom)
-            .concat(d.view) : d.viewFrom < b && (d.view = d.view.slice(lc(a, b))), d.viewFrom = b, d.viewTo < c ? d.view = d.view.concat(hc(a, d.viewTo, c)) : d.viewTo > c && (d.view = d.view.slice(0, lc(a, c)))), d.viewTo = c
-    }
-
-    function oc(a) {
-        for (var b = a.display.view, c = 0, d = 0; d < b.length; d++) {
-            var e = b[d];
-            e.hidden || e.node && !e.changes || ++c
-        }
-        return c
-    }
-
-    function pc(a) {
-        function g() {
-            b.activeTouch && (c = setTimeout(function () {
-                b.activeTouch = null
-            }, 1e3), f = b.activeTouch, f.end = +new Date)
-        }
-
-        function h(a) {
-            if (1 != a.touches.length) return !1;
-            var b = a.touches[0];
-            return b.radiusX <= 1 && b.radiusY <= 1
-        }
-
-        function i(a, b) {
-            if (null == b.left) return !0;
-            var c = b.left - a.left,
-                d = b.top - a.top;
-            return c * c + d * d > 400
-        }
-        var b = a.display;
-        Jf(b.scroller, "mousedown", dc(a, uc)), d && 11 > e ? Jf(b.scroller, "dblclick", dc(a, function (b) {
-            if (!Pf(a, b)) {
-                var c = tc(a, b);
-                if (c && !Bc(a, b) && !sc(a.display, b)) {
-                    Df(b);
-                    var d = a.findWordAt(c);
-                    Ta(a.doc, d.anchor, d.head)
-                }
-            }
-        })) : Jf(b.scroller, "dblclick", function (b) {
-            Pf(a, b) || Df(b)
-        }), s || Jf(b.scroller, "contextmenu", function (b) {
-            _c(a, b)
-        });
-        var c, f = {
-            end: 0
-        };
-        Jf(b.scroller, "touchstart", function (a) {
-            if (!h(a)) {
-                clearTimeout(c);
-                var d = +new Date;
-                b.activeTouch = {
-                    start: d,
-                    moved: !1,
-                    prev: d - f.end <= 300 ? f : null
-                }, 1 == a.touches.length && (b.activeTouch.left = a.touches[0].pageX, b.activeTouch.top = a.touches[0].pageY)
-            }
-        }), Jf(b.scroller, "touchmove", function () {
-            b.activeTouch && (b.activeTouch.moved = !0)
-        }), Jf(b.scroller, "touchend", function (c) {
-            var d = b.activeTouch;
-            if (d && !sc(b, c) && null != d.left && !d.moved && new Date - d.start < 300) {
-                var f, e = a.coordsChar(b.activeTouch, "page");
-                f = !d.prev || i(d, d.prev) ? new Ka(e, e) : !d.prev.prev || i(d, d.prev.prev) ? a.findWordAt(e) : new Ka(oa(e.line, 0), Oa(a.doc, oa(e.line + 1, 0))), a.setSelection(f.anchor, f.head), a.focus(), Df(c)
-            }
-            g()
-        }), Jf(b.scroller, "touchcancel", g), Jf(b.scroller, "scroll", function () {
-            b.scroller.clientHeight && (Hc(a, b.scroller.scrollTop), Ic(a, b.scroller.scrollLeft, !0), Lf(a, "scroll", a))
-        }), Jf(b.scroller, "mousewheel", function (b) {
-            Mc(a, b)
-        }), Jf(b.scroller, "DOMMouseScroll", function (b) {
-            Mc(a, b)
-        }), Jf(b.wrapper, "scroll", function () {
-            b.wrapper.scrollTop = b.wrapper.scrollLeft = 0
-        }), b.dragFunctions = {
-            enter: function (b) {
-                Pf(a, b) || Gf(b)
-            },
-            over: function (b) {
-                Pf(a, b) || (Fc(a, b), Gf(b))
-            },
-            start: function (b) {
-                Ec(a, b)
-            },
-            drop: dc(a, Dc),
-            leave: function () {
-                Gc(a)
-            }
-        };
-        var j = b.input.getField();
-        Jf(j, "keyup", function (b) {
-            Wc.call(a, b)
-        }), Jf(j, "keydown", dc(a, Uc)), Jf(j, "keypress", dc(a, Xc)), Jf(j, "focus", ig(Zc, a)), Jf(j, "blur", ig($c, a))
-    }
-
-    function qc(a, b, c) {
-        var d = c && c != v.Init;
-        if (!b != !d) {
-            var e = a.display.dragFunctions,
-                f = b ? Jf : Kf;
-            f(a.display.scroller, "dragstart", e.start), f(a.display.scroller, "dragenter", e.enter), f(a.display.scroller, "dragover", e.over), f(a.display.scroller, "dragleave", e.leave), f(a.display.scroller, "drop", e.drop)
-        }
-    }
-
-    function rc(a) {
-        var b = a.display;
-        (b.lastWrapHeight != b.wrapper.clientHeight || b.lastWrapWidth != b.wrapper.clientWidth) && (b.cachedCharWidth = b.cachedTextHeight = b.cachedPaddingH = null, b.scrollbarsClipped = !1, a.setSize())
-    }
-
-    function sc(a, b) {
-        for (var c = Hf(b); c != a.wrapper; c = c.parentNode)
-            if (!c || 1 == c.nodeType && "true" == c.getAttribute("cm-ignore-events") || c.parentNode == a.sizer && c != a.mover) return !0
-    }
-
-    function tc(a, b, c, d) {
-        var e = a.display;
-        if (!c && "true" == Hf(b)
-            .getAttribute("cm-not-content")) return null;
-        var f, g, h = e.lineSpace.getBoundingClientRect();
-        try {
-            f = b.clientX - h.left, g = b.clientY - h.top
-        } catch (b) {
-            return null
-        }
-        var j, i = Ob(a, f, g);
-        if (d && 1 == i.xRel && (j = ff(a.doc, i.line)
-                .text)
-            .length == i.ch) {
-            var k = Zf(j, j.length, a.options.tabSize) - j.length;
-            i = oa(i.line, Math.max(0, Math.round((f - ob(a.display)
-                .left) / Sb(a.display)) - k))
-        }
-        return i
-    }
-
-    function uc(a) {
-        var b = this,
-            c = b.display;
-        if (!(c.activeTouch && c.input.supportsTouch() || Pf(b, a))) {
-            if (c.shift = a.shiftKey, sc(c, a)) return void(f || (c.scroller.draggable = !1, setTimeout(function () {
-                c.scroller.draggable = !0
-            }, 100)));
-            if (!Bc(b, a)) {
-                var d = tc(b, a);
-                switch (window.focus(), If(a)) {
-                case 1:
-                    b.state.selectingText ? b.state.selectingText(a) : d ? xc(b, a, d) : Hf(a) == c.scroller && Df(a);
-                    break;
-                case 2:
-                    f && (b.state.lastMiddleDown = +new Date), d && Ta(b.doc, d), setTimeout(function () {
-                        c.input.focus()
-                    }, 20), Df(a);
-                    break;
-                case 3:
-                    s ? _c(b, a) : Yc(b)
-                }
-            }
-        }
-    }
-
-    function xc(a, b, c) {
-        d ? setTimeout(ig(ta, a), 0) : a.curOp.focus = ug();
-        var f, e = +new Date;
-        wc && wc.time > e - 400 && 0 == pa(wc.pos, c) ? f = "triple" : vc && vc.time > e - 400 && 0 == pa(vc.pos, c) ? (f = "double", wc = {
-            time: e,
-            pos: c
-        }) : (f = "single", vc = {
-            time: e,
-            pos: c
-        });
-        var i, g = a.doc.sel,
-            h = o ? b.metaKey : b.ctrlKey;
-        a.options.dragDrop && Dg && !ua(a) && "single" == f && (i = g.contains(c)) > -1 && (pa((i = g.ranges[i])
-            .from(), c) < 0 || c.xRel > 0) && (pa(i.to(), c) > 0 || c.xRel < 0) ? yc(a, b, c, h) : zc(a, b, c, f, h)
-    }
-
-    function yc(a, b, c, g) {
-        var h = a.display,
-            i = +new Date,
-            j = dc(a, function (k) {
-                f && (h.scroller.draggable = !1), a.state.draggingText = !1, Kf(document, "mouseup", j), Kf(h.scroller, "drop", j), Math.abs(b.clientX - k.clientX) + Math.abs(b.clientY - k.clientY) < 10 && (Df(k), !g && +new Date - 200 < i && Ta(a.doc, c), f || d && 9 == e ? setTimeout(function () {
-                    document.body.focus(), h.input.focus()
-                }, 20) : h.input.focus())
-            });
-        f && (h.scroller.draggable = !0), a.state.draggingText = j, h.scroller.dragDrop && h.scroller.dragDrop(), Jf(document, "mouseup", j), Jf(h.scroller, "drop", j)
-    }
-
-    function zc(a, b, c, d, e) {
-        function o(b) {
-            if (0 != pa(n, b))
-                if (n = b, "rect" == d) {
-                    for (var e = [], f = a.options.tabSize, k = Zf(ff(g, c.line)
-                            .text, c.ch, f), l = Zf(ff(g, b.line)
-                            .text, b.ch, f), m = Math.min(k, l), o = Math.max(k, l), p = Math.min(c.line, b.line), q = Math.min(a.lastLine(), Math.max(c.line, b.line)); q >= p; p++) {
-                        var r = ff(g, p)
-                            .text,
-                            s = $f(r, m, f);
-                        m == o ? e.push(new Ka(oa(p, s), oa(p, s))) : r.length > s && e.push(new Ka(oa(p, s), oa(p, $f(r, o, f))))
-                    }
-                    e.length || e.push(new Ka(c, c)), Za(g, La(j.ranges.slice(0, i)
-                        .concat(e), i), {
-                        origin: "*mouse",
-                        scroll: !1
-                    }), a.scrollIntoView(b)
-                } else {
-                    var t = h,
-                        u = t.anchor,
-                        v = b;
-                    if ("single" != d) {
-                        if ("double" == d) var w = a.findWordAt(b);
-                        else var w = new Ka(oa(b.line, 0), Oa(g, oa(b.line + 1, 0)));
-                        pa(w.anchor, u) > 0 ? (v = w.head, u = sa(t.from(), w.anchor)) : (v = w.anchor, u = ra(t.to(), w.head))
-                    }
-                    var e = j.ranges.slice(0);
-                    e[i] = new Ka(Oa(g, u), v), Za(g, La(e, i), Wf)
-                }
-        }
-
-        function r(b) {
-            var c = ++q,
-                e = tc(a, b, !0, "rect" == d);
-            if (e)
-                if (0 != pa(e, n)) {
-                    a.curOp.focus = ug(), o(e);
-                    var h = P(f, g);
-                    (e.line >= h.to || e.line < h.from) && setTimeout(dc(a, function () {
-                        q == c && r(b)
-                    }), 150)
-                } else {
-                    var i = b.clientY < p.top ? -20 : b.clientY > p.bottom ? 20 : 0;
-                    i && setTimeout(dc(a, function () {
-                        q == c && (f.scroller.scrollTop += i, r(b))
-                    }), 50)
-                }
-        }
-
-        function s(b) {
-            a.state.selectingText = !1, q = 1 / 0, Df(b), f.input.focus(), Kf(document, "mousemove", t), Kf(document, "mouseup", u), g.history.lastSelOrigin = null
-        }
-        var f = a.display,
-            g = a.doc;
-        Df(b);
-        var h, i, j = g.sel,
-            k = j.ranges;
-        if (e && !b.shiftKey ? (i = g.sel.contains(c), h = i > -1 ? k[i] : new Ka(c, c)) : (h = g.sel.primary(), i = g.sel.primIndex), b.altKey) d = "rect", e || (h = new Ka(c, c)), c = tc(a, b, !0, !0), i = -1;
-        else if ("double" == d) {
-            var l = a.findWordAt(c);
-            h = a.display.shift || g.extend ? Sa(g, h, l.anchor, l.head) : l
-        } else if ("triple" == d) {
-            var m = new Ka(oa(c.line, 0), Oa(g, oa(c.line + 1, 0)));
-            h = a.display.shift || g.extend ? Sa(g, h, m.anchor, m.head) : m
-        } else h = Sa(g, h, c);
-        e ? -1 == i ? (i = k.length, Za(g, La(k.concat([h]), i), {
-            scroll: !1,
-            origin: "*mouse"
-        })) : k.length > 1 && k[i].empty() && "single" == d && !b.shiftKey ? (Za(g, La(k.slice(0, i)
-            .concat(k.slice(i + 1)), 0), {
-            scroll: !1,
-            origin: "*mouse"
-        }), j = g.sel) : Va(g, i, h, Wf) : (i = 0, Za(g, new Ja([h], 0), Wf), j = g.sel);
-        var n = c,
-            p = f.wrapper.getBoundingClientRect(),
-            q = 0,
-            t = dc(a, function (a) {
-                If(a) ? r(a) : s(a)
-            }),
-            u = dc(a, s);
-        a.state.selectingText = u, Jf(document, "mousemove", t), Jf(document, "mouseup", u)
-    }
-
-    function Ac(a, b, c, d, e) {
-        try {
-            var f = b.clientX,
-                g = b.clientY
-        } catch (b) {
-            return !1
-        }
-        if (f >= Math.floor(a.display.gutters.getBoundingClientRect()
-                .right)) return !1;
-        d && Df(b);
-        var h = a.display,
-            i = h.lineDiv.getBoundingClientRect();
-        if (g > i.bottom || !Rf(a, c)) return Ff(b);
-        g -= i.top - h.viewOffset;
-        for (var j = 0; j < a.options.gutters.length; ++j) {
-            var k = h.gutters.childNodes[j];
-            if (k && k.getBoundingClientRect()
-                .right >= f) {
-                var l = lf(a.doc, g),
-                    m = a.options.gutters[j];
-                return e(a, c, a, l, m, b), Ff(b)
-            }
-        }
-    }
-
-    function Bc(a, b) {
-        return Ac(a, b, "gutterClick", !0, Nf)
-    }
-
-    function Dc(a) {
-        var b = this;
-        if (Gc(b), !Pf(b, a) && !sc(b.display, a)) {
-            Df(a), d && (Cc = +new Date);
-            var c = tc(b, a, !0),
-                e = a.dataTransfer.files;
-            if (c && !ua(b))
-                if (e && e.length && window.FileReader && window.File)
-                    for (var f = e.length, g = Array(f), h = 0, i = function (a, d) {
-                            var e = new FileReader;
-                            e.onload = dc(b, function () {
-                                if (g[d] = e.result, ++h == f) {
-                                    c = Oa(b.doc, c);
-                                    var a = {
-                                        from: c,
-                                        to: c,
-                                        text: b.doc.splitLines(g.join(b.doc.lineSeparator())),
-                                        origin: "paste"
-                                    };
-                                    hd(b.doc, a), Ya(b.doc, Ma(c, bd(a)))
-                                }
-                            }), e.readAsText(a)
-                        }, j = 0; f > j; ++j) i(e[j], j);
-                else {
-                    if (b.state.draggingText && b.doc.sel.contains(c) > -1) return b.state.draggingText(a), void setTimeout(function () {
-                        b.display.input.focus()
-                    }, 20);
-                    try {
-                        var g = a.dataTransfer.getData("Text");
-                        if (g) {
-                            if (b.state.draggingText && !(o ? a.altKey : a.ctrlKey)) var k = b.listSelections();
-                            if ($a(b.doc, Ma(c, c)), k)
-                                for (var j = 0; j < k.length; ++j) nd(b.doc, "", k[j].anchor, k[j].head, "drag");
-                            b.replaceSelection(g, "around", "paste"), b.display.input.focus()
-                        }
-                    } catch (a) {}
-                }
-        }
-    }
-
-    function Ec(a, b) {
-        if (d && (!a.state.draggingText || +new Date - Cc < 100)) return void Gf(b);
-        if (!Pf(a, b) && !sc(a.display, b) && (b.dataTransfer.setData("Text", a.getSelection()), b.dataTransfer.setDragImage && !j)) {
-            var c = pg("img", null, null, "position: fixed; left: 0; top: 0;");
-            c.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", i && (c.width = c.height = 1, a.display.wrapper.appendChild(c), c._top = c.offsetTop), b.dataTransfer.setDragImage(c, 0, 0), i && c.parentNode.removeChild(c)
-        }
-    }
-
-    function Fc(a, b) {
-        var c = tc(a, b);
-        if (c) {
-            var d = document.createDocumentFragment();
-            fb(a, c, d), a.display.dragCursor || (a.display.dragCursor = pg("div", null, "CodeMirror-cursors CodeMirror-dragcursors"), a.display.lineSpace.insertBefore(a.display.dragCursor, a.display.cursorDiv)), sg(a.display.dragCursor, d)
-        }
-    }
-
-    function Gc(a) {
-        a.display.dragCursor && (a.display.lineSpace.removeChild(a.display.dragCursor), a.display.dragCursor = null)
-    }
-
-    function Hc(b, c) {
-        Math.abs(b.doc.scrollTop - c) < 2 || (b.doc.scrollTop = c, a || Y(b, {
-            top: c
-        }), b.display.scroller.scrollTop != c && (b.display.scroller.scrollTop = c), b.display.scrollbars.setScrollTop(c), a && Y(b), ib(b, 100))
-    }
-
-    function Ic(a, b, c) {
-        (c ? b == a.doc.scrollLeft : Math.abs(a.doc.scrollLeft - b) < 2) || (b = Math.min(b, a.display.scroller.scrollWidth - a.display.scroller.clientWidth), a.doc.scrollLeft = b, Q(a), a.display.scroller.scrollLeft != b && (a.display.scroller.scrollLeft = b), a.display.scrollbars.setScrollLeft(b))
-    }
-
-    function Mc(b, c) {
-        var d = Lc(c),
-            e = d.x,
-            g = d.y,
-            h = b.display,
-            j = h.scroller;
-        if (e && j.scrollWidth > j.clientWidth || g && j.scrollHeight > j.clientHeight) {
-            if (g && o && f) a: for (var k = c.target, l = h.view; k != j; k = k.parentNode)
-                for (var m = 0; m < l.length; m++)
-                    if (l[m].node == k) {
-                        b.display.currentWheelTarget = k;
-                        break a
-                    }
-            if (e && !a && !i && null != Kc) return g && Hc(b, Math.max(0, Math.min(j.scrollTop + g * Kc, j.scrollHeight - j.clientHeight))), Ic(b, Math.max(0, Math.min(j.scrollLeft + e * Kc, j.scrollWidth - j.clientWidth))), Df(c), void(h.wheelStartX = null);
-            if (g && null != Kc) {
-                var n = g * Kc,
-                    p = b.doc.scrollTop,
-                    q = p + h.wrapper.clientHeight;
-                0 > n ? p = Math.max(0, p + n - 50) : q = Math.min(b.doc.height, q + n + 50), Y(b, {
-                    top: p,
-                    bottom: q
-                })
-            }
-            20 > Jc && (null == h.wheelStartX ? (h.wheelStartX = j.scrollLeft, h.wheelStartY = j.scrollTop, h.wheelDX = e, h.wheelDY = g, setTimeout(function () {
-                if (null != h.wheelStartX) {
-                    var a = j.scrollLeft - h.wheelStartX,
-                        b = j.scrollTop - h.wheelStartY,
-                        c = b && h.wheelDY && b / h.wheelDY || a && h.wheelDX && a / h.wheelDX;
-                    h.wheelStartX = h.wheelStartY = null, c && (Kc = (Kc * Jc + c) / (Jc + 1), ++Jc)
-                }
-            }, 200)) : (h.wheelDX += e, h.wheelDY += g))
-        }
-    }
-
-    function Nc(a, b, c) {
-        if ("string" == typeof b && (b = Ld[b], !b)) return !1;
-        a.display.input.ensurePolled();
-        var d = a.display.shift,
-            e = !1;
-        try {
-            ua(a) && (a.state.suppressEdits = !0), c && (a.display.shift = !1), e = b(a) != Uf
-        } finally {
-            a.display.shift = d, a.state.suppressEdits = !1
-        }
-        return e
-    }
-
-    function Oc(a, b, c) {
-        for (var d = 0; d < a.state.keyMaps.length; d++) {
-            var e = Od(b, a.state.keyMaps[d], c, a);
-            if (e) return e
-        }
-        return a.options.extraKeys && Od(b, a.options.extraKeys, c, a) || Od(b, a.options.keyMap, c, a)
-    }
-
-    function Qc(a, b, c, d) {
-        var e = a.state.keySeq;
-        if (e) {
-            if (Pd(b)) return "handled";
-            Pc.set(50, function () {
-                a.state.keySeq == e && (a.state.keySeq = null, a.display.input.reset())
-            }), b = e + " " + b
-        }
-        var f = Oc(a, b, d);
-        return "multi" == f && (a.state.keySeq = b), "handled" == f && Nf(a, "keyHandled", a, b, c), ("handled" == f || "multi" == f) && (Df(c), hb(a)), e && !f && /\'$/.test(b) ? (Df(c), !0) : !!f
-    }
-
-    function Rc(a, b) {
-        var c = Qd(b, !0);
-        return c ? b.shiftKey && !a.state.keySeq ? Qc(a, "Shift-" + c, b, function (b) {
-            return Nc(a, b, !0)
-        }) || Qc(a, c, b, function (b) {
-            return ("string" == typeof b ? /^go[A-Z]/.test(b) : b.motion) ? Nc(a, b) : void 0
-        }) : Qc(a, c, b, function (b) {
-            return Nc(a, b)
-        }) : !1
-    }
-
-    function Sc(a, b, c) {
-        return Qc(a, "'" + c + "'", b, function (b) {
-            return Nc(a, b, !0)
-        })
-    }
-
-    function Uc(a) {
-        var b = this;
-        if (b.curOp.focus = ug(), !Pf(b, a)) {
-            d && 11 > e && 27 == a.keyCode && (a.returnValue = !1);
-            var c = a.keyCode;
-            b.display.shift = 16 == c || a.shiftKey;
-            var f = Rc(b, a);
-            i && (Tc = f ? c : null, !f && 88 == c && !Kg && (o ? a.metaKey : a.ctrlKey) && b.replaceSelection("", null, "cut")), 18 != c || /\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className) || Vc(b)
-        }
-    }
-
-    function Vc(a) {
-        function c(a) {
-            18 != a.keyCode && a.altKey || (wg(b, "CodeMirror-crosshair"), Kf(document, "keyup", c), Kf(document, "mouseover", c))
-        }
-        var b = a.display.lineDiv;
-        xg(b, "CodeMirror-crosshair"), Jf(document, "keyup", c), Jf(document, "mouseover", c)
-    }
-
-    function Wc(a) {
-        16 == a.keyCode && (this.doc.sel.shift = !1), Pf(this, a)
-    }
-
-    function Xc(a) {
-        var b = this;
-        if (!(sc(b.display, a) || Pf(b, a) || a.ctrlKey && !a.altKey || o && a.metaKey)) {
-            var c = a.keyCode,
-                d = a.charCode;
-            if (i && c == Tc) return Tc = null, void Df(a);
-            if (!i || a.which && !(a.which < 10) || !Rc(b, a)) {
-                var e = String.fromCharCode(null == d ? c : d);
-                Sc(b, a, e) || b.display.input.onKeyPress(a)
-            }
-        }
-    }
-
-    function Yc(a) {
-        a.state.delayingBlurEvent = !0, setTimeout(function () {
-            a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1, $c(a))
-        }, 100)
-    }
-
-    function Zc(a) {
-        a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1), "nocursor" != a.options.readOnly && (a.state.focused || (Lf(a, "focus", a), a.state.focused = !0, xg(a.display.wrapper, "CodeMirror-focused"), a.curOp || a.display.selForContextMenu == a.doc.sel || (a.display.input.reset(), f && setTimeout(function () {
-            a.display.input.reset(!0)
-        }, 20)), a.display.input.receivedFocus()), hb(a))
-    }
-
-    function $c(a) {
-        a.state.delayingBlurEvent || (a.state.focused && (Lf(a, "blur", a), a.state.focused = !1, wg(a.display.wrapper, "CodeMirror-focused")), clearInterval(a.display.blinker), setTimeout(function () {
-            a.state.focused || (a.display.shift = !1)
-        }, 150))
-    }
-
-    function _c(a, b) {
-        sc(a.display, b) || ad(a, b) || a.display.input.onContextMenu(b)
-    }
-
-    function ad(a, b) {
-        return Rf(a, "gutterContextMenu") ? Ac(a, b, "gutterContextMenu", !1, Lf) : !1
-    }
-
-    function cd(a, b) {
-        if (pa(a, b.from) < 0) return a;
-        if (pa(a, b.to) <= 0) return bd(b);
-        var c = a.line + b.text.length - (b.to.line - b.from.line) - 1,
-            d = a.ch;
-        return a.line == b.to.line && (d += bd(b)
-            .ch - b.to.ch), oa(c, d)
-    }
-
-    function dd(a, b) {
-        for (var c = [], d = 0; d < a.sel.ranges.length; d++) {
-            var e = a.sel.ranges[d];
-            c.push(new Ka(cd(e.anchor, b), cd(e.head, b)))
-        }
-        return La(c, a.sel.primIndex)
-    }
-
-    function ed(a, b, c) {
-        return a.line == b.line ? oa(c.line, a.ch - b.ch + c.ch) : oa(c.line + (a.line - b.line), a.ch)
-    }
-
-    function fd(a, b, c) {
-        for (var d = [], e = oa(a.first, 0), f = e, g = 0; g < b.length; g++) {
-            var h = b[g],
-                i = ed(h.from, e, f),
-                j = ed(bd(h), e, f);
-            if (e = h.to, f = j, "around" == c) {
-                var k = a.sel.ranges[g],
-                    l = pa(k.head, k.anchor) < 0;
-                d[g] = new Ka(l ? j : i, l ? i : j)
-            } else d[g] = new Ka(i, i)
-        }
-        return new Ja(d, a.sel.primIndex)
-    }
-
-    function gd(a, b, c) {
-        var d = {
-            canceled: !1,
-            from: b.from,
-            to: b.to,
-            text: b.text,
-            origin: b.origin,
-            cancel: function () {
-                this.canceled = !0
-            }
-        };
-        return c && (d.update = function (b, c, d, e) {
-            b && (this.from = Oa(a, b)), c && (this.to = Oa(a, c)), d && (this.text = d), void 0 !== e && (this.origin = e)
-        }), Lf(a, "beforeChange", a, d), a.cm && Lf(a.cm, "beforeChange", a.cm, d), d.canceled ? null : {
-            from: d.from,
-            to: d.to,
-            text: d.text,
-            origin: d.origin
-        }
-    }
-
-    function hd(a, b, c) {
-        if (a.cm) {
-            if (!a.cm.curOp) return dc(a.cm, hd)(a, b, c);
-            if (a.cm.state.suppressEdits) return
-        }
-        if (!(Rf(a, "beforeChange") || a.cm && Rf(a.cm, "beforeChange")) || (b = gd(a, b, !0))) {
-            var d = t && !c && ie(a, b.from, b.to);
-            if (d)
-                for (var e = d.length - 1; e >= 0; --e) id(a, {
-                    from: d[e].from,
-                    to: d[e].to,
-                    text: e ? [""] : b.text
-                });
-            else id(a, b)
-        }
-    }
-
-    function id(a, b) {
-        if (1 != b.text.length || "" != b.text[0] || 0 != pa(b.from, b.to)) {
-            var c = dd(a, b);
-            sf(a, b, c, a.cm ? a.cm.curOp.id : NaN), ld(a, b, c, fe(a, b));
-            var d = [];
-            df(a, function (a, c) {
-                c || -1 != dg(d, a.history) || (Cf(a.history, b), d.push(a.history)), ld(a, b, null, fe(a, b))
-            })
-        }
-    }
-
-    function jd(a, b, c) {
-        if (!a.cm || !a.cm.state.suppressEdits) {
-            for (var e, d = a.history, f = a.sel, g = "undo" == b ? d.done : d.undone, h = "undo" == b ? d.undone : d.done, i = 0; i < g.length && (e = g[i], c ? !e.ranges || e.equals(a.sel) : e.ranges); i++);
-            if (i != g.length) {
-                for (d.lastOrigin = d.lastSelOrigin = null; e = g.pop(), e.ranges;) {
-                    if (vf(e, h), c && !e.equals(a.sel)) return void Za(a, e, {
-                        clearRedo: !1
-                    });
-                    f = e
-                }
-                var j = [];
-                vf(f, h), h.push({
-                    changes: j,
-                    generation: d.generation
-                }), d.generation = e.generation || ++d.maxGeneration;
-                for (var k = Rf(a, "beforeChange") || a.cm && Rf(a.cm, "beforeChange"), i = e.changes.length - 1; i >= 0; --i) {
-                    var l = e.changes[i];
-                    if (l.origin = b, k && !gd(a, l, !1)) return void(g.length = 0);
-                    j.push(pf(a, l));
-                    var m = i ? dd(a, l) : bg(g);
-                    ld(a, l, m, he(a, l)), !i && a.cm && a.cm.scrollIntoView({
-                        from: l.from,
-                        to: bd(l)
-                    });
-                    var n = [];
-                    df(a, function (a, b) {
-                        b || -1 != dg(n, a.history) || (Cf(a.history, l), n.push(a.history)), ld(a, l, null, he(a, l))
-                    })
-                }
-            }
-        }
-    }
-
-    function kd(a, b) {
-        if (0 != b && (a.first += b, a.sel = new Ja(eg(a.sel.ranges, function (a) {
-                return new Ka(oa(a.anchor.line + b, a.anchor.ch), oa(a.head.line + b, a.head.ch))
-            }), a.sel.primIndex), a.cm)) {
-            ic(a.cm, a.first, a.first - b, b);
-            for (var c = a.cm.display, d = c.viewFrom; d < c.viewTo; d++) jc(a.cm, d, "gutter")
-        }
-    }
-
-    function ld(a, b, c, d) {
-        if (a.cm && !a.cm.curOp) return dc(a.cm, ld)(a, b, c, d);
-        if (b.to.line < a.first) return void kd(a, b.text.length - 1 - (b.to.line - b.from.line));
-        if (!(b.from.line > a.lastLine())) {
-            if (b.from.line < a.first) {
-                var e = b.text.length - 1 - (a.first - b.from.line);
-                kd(a, e), b = {
-                    from: oa(a.first, 0),
-                    to: oa(b.to.line + e, b.to.ch),
-                    text: [bg(b.text)],
-                    origin: b.origin
-                }
-            }
-            var f = a.lastLine();
-            b.to.line > f && (b = {
-                from: b.from,
-                to: oa(f, ff(a, f)
-                    .text.length),
-                text: [b.text[0]],
-                origin: b.origin
-            }), b.removed = gf(a, b.from, b.to), c || (c = dd(a, b)), a.cm ? md(a.cm, b, d) : Ye(a, b, d), $a(a, c, Vf)
-        }
-    }
-
-    function md(a, b, c) {
-        var d = a.doc,
-            e = a.display,
-            f = b.from,
-            g = b.to,
-            h = !1,
-            i = f.line;
-        a.options.lineWrapping || (i = kf(se(ff(d, f.line))), d.iter(i, g.line + 1, function (a) {
-            return a == e.maxLine ? (h = !0, !0) : void 0
-        })), d.sel.contains(b.from, b.to) > -1 && Qf(a), Ye(d, b, c, A(a)), a.options.lineWrapping || (d.iter(i, f.line + b.text.length, function (a) {
-            var b = G(a);
-            b > e.maxLineLength && (e.maxLine = a, e.maxLineLength = b, e.maxLineChanged = !0, h = !1)
-        }), h && (a.curOp.updateMaxLine = !0)), d.frontier = Math.min(d.frontier, f.line), ib(a, 400);
-        var j = b.text.length - (g.line - f.line) - 1;
-        b.full ? ic(a) : f.line != g.line || 1 != b.text.length || Xe(a.doc, b) ? ic(a, f.line, g.line + 1, j) : jc(a, f.line, "text");
-        var k = Rf(a, "changes"),
-            l = Rf(a, "change");
-        if (l || k) {
-            var m = {
-                from: f,
-                to: g,
-                text: b.text,
-                removed: b.removed,
-                origin: b.origin
-            };
-            l && Nf(a, "change", a, m), k && (a.curOp.changeObjs || (a.curOp.changeObjs = []))
-                .push(m)
-        }
-        a.display.selForContextMenu = null
-    }
-
-    function nd(a, b, c, d, e) {
-        if (d || (d = c), pa(d, c) < 0) {
-            var f = d;
-            d = c, c = f
-        }
-        "string" == typeof b && (b = a.splitLines(b)), hd(a, {
-            from: c,
-            to: d,
-            text: b,
-            origin: e
-        })
-    }
-
-    function od(a, b) {
-        if (!Pf(a, "scrollCursorIntoView")) {
-            var c = a.display,
-                d = c.sizer.getBoundingClientRect(),
-                e = null;
-            if (b.top + d.top < 0 ? e = !0 : b.bottom + d.top > (window.innerHeight || document.documentElement.clientHeight) && (e = !1), null != e && !l) {
-                var f = pg("div", "\u200b", null, "position: absolute; top: " + (b.top - c.viewOffset - mb(a.display)) + "px; height: " + (b.bottom - b.top + pb(a) + c.barHeight) + "px; left: " + b.left + "px; width: 2px;");
-                a.display.lineSpace.appendChild(f), f.scrollIntoView(e), a.display.lineSpace.removeChild(f)
-            }
-        }
-    }
-
-    function pd(a, b, c, d) {
-        null == d && (d = 0);
-        for (var e = 0; 5 > e; e++) {
-            var f = !1,
-                g = Lb(a, b),
-                h = c && c != b ? Lb(a, c) : g,
-                i = rd(a, Math.min(g.left, h.left), Math.min(g.top, h.top) - d, Math.max(g.left, h.left), Math.max(g.bottom, h.bottom) + d),
-                j = a.doc.scrollTop,
-                k = a.doc.scrollLeft;
-            if (null != i.scrollTop && (Hc(a, i.scrollTop), Math.abs(a.doc.scrollTop - j) > 1 && (f = !0)), null != i.scrollLeft && (Ic(a, i.scrollLeft), Math.abs(a.doc.scrollLeft - k) > 1 && (f = !0)), !f) break
-        }
-        return g
-    }
-
-    function qd(a, b, c, d, e) {
-        var f = rd(a, b, c, d, e);
-        null != f.scrollTop && Hc(a, f.scrollTop), null != f.scrollLeft && Ic(a, f.scrollLeft)
-    }
-
-    function rd(a, b, c, d, e) {
-        var f = a.display,
-            g = Rb(a.display);
-        0 > c && (c = 0);
-        var h = a.curOp && null != a.curOp.scrollTop ? a.curOp.scrollTop : f.scroller.scrollTop,
-            i = rb(a),
-            j = {};
-        e - c > i && (e = c + i);
-        var k = a.doc.height + nb(f),
-            l = g > c,
-            m = e > k - g;
-        if (h > c) j.scrollTop = l ? 0 : c;
-        else if (e > h + i) {
-            var n = Math.min(c, (m ? k : e) - i);
-            n != h && (j.scrollTop = n)
-        }
-        var o = a.curOp && null != a.curOp.scrollLeft ? a.curOp.scrollLeft : f.scroller.scrollLeft,
-            p = qb(a) - (a.options.fixedGutter ? f.gutters.offsetWidth : 0),
-            q = d - b > p;
-        return q && (d = b + p), 10 > b ? j.scrollLeft = 0 : o > b ? j.scrollLeft = Math.max(0, b - (q ? 0 : 10)) : d > p + o - 3 && (j.scrollLeft = d + (q ? 0 : 10) - p), j
-    }
-
-    function sd(a, b, c) {
-        (null != b || null != c) && ud(a), null != b && (a.curOp.scrollLeft = (null == a.curOp.scrollLeft ? a.doc.scrollLeft : a.curOp.scrollLeft) + b), null != c && (a.curOp.scrollTop = (null == a.curOp.scrollTop ? a.doc.scrollTop : a.curOp.scrollTop) + c)
-    }
-
-    function td(a) {
-        ud(a);
-        var b = a.getCursor(),
-            c = b,
-            d = b;
-        a.options.lineWrapping || (c = b.ch ? oa(b.line, b.ch - 1) : b, d = oa(b.line, b.ch + 1)), a.curOp.scrollToPos = {
-            from: c,
-            to: d,
-            margin: a.options.cursorScrollMargin,
-            isCursor: !0
-        }
-    }
-
-    function ud(a) {
-        var b = a.curOp.scrollToPos;
-        if (b) {
-            a.curOp.scrollToPos = null;
-            var c = Mb(a, b.from),
-                d = Mb(a, b.to),
-                e = rd(a, Math.min(c.left, d.left), Math.min(c.top, d.top) - b.margin, Math.max(c.right, d.right), Math.max(c.bottom, d.bottom) + b.margin);
-            a.scrollTo(e.scrollLeft, e.scrollTop)
-        }
-    }
-
-    function vd(a, b, c, d) {
-        var f, e = a.doc;
-        null == c && (c = "add"), "smart" == c && (e.mode.indent ? f = lb(a, b) : c = "prev");
-        var g = a.options.tabSize,
-            h = ff(e, b),
-            i = Zf(h.text, null, g);
-        h.stateAfter && (h.stateAfter = null);
-        var k, j = h.text.match(/^\s*/)[0];
-        if (d || /\S/.test(h.text)) {
-            if ("smart" == c && (k = e.mode.indent(f, h.text.slice(j.length), h.text), k == Uf || k > 150)) {
-                if (!d) return;
-                c = "prev"
-            }
-        } else k = 0, c = "not";
-        "prev" == c ? k = b > e.first ? Zf(ff(e, b - 1)
-            .text, null, g) : 0 : "add" == c ? k = i + a.options.indentUnit : "subtract" == c ? k = i - a.options.indentUnit : "number" == typeof c && (k = i + c), k = Math.max(0, k);
-        var l = "",
-            m = 0;
-        if (a.options.indentWithTabs)
-            for (var n = Math.floor(k / g); n; --n) m += g, l += "	";
-        if (k > m && (l += ag(k - m)), l != j) return nd(e, l, oa(b, 0), oa(b, j.length), "+input"), h.stateAfter = null, !0;
-        for (var n = 0; n < e.sel.ranges.length; n++) {
-            var o = e.sel.ranges[n];
-            if (o.head.line == b && o.head.ch < j.length) {
-                var m = oa(b, j.length);
-                Va(e, n, new Ka(m, m));
-                break
-            }
-        }
-    }
-
-    function wd(a, b, c, d) {
-        var e = b,
-            f = b;
-        return "number" == typeof b ? f = ff(a, Na(a, b)) : e = kf(b), null == e ? null : (d(f, e) && a.cm && jc(a.cm, e, c), f)
-    }
-
-    function xd(a, b) {
-        for (var c = a.doc.sel.ranges, d = [], e = 0; e < c.length; e++) {
-            for (var f = b(c[e]); d.length && pa(f.from, bg(d)
-                    .to) <= 0;) {
-                var g = d.pop();
-                if (pa(g.from, f.from) < 0) {
-                    f.from = g.from;
-                    break
-                }
-            }
-            d.push(f)
-        }
-        cc(a, function () {
-            for (var b = d.length - 1; b >= 0; b--) nd(a.doc, "", d[b].from, d[b].to, "+delete");
-            td(a)
-        })
-    }
-
-    function yd(a, b, c, d, e) {
-        function k() {
-            var b = f + c;
-            return b < a.first || b >= a.first + a.size ? j = !1 : (f = b, i = ff(a, b))
-        }
-
-        function l(a) {
-            var b = (e ? $g : _g)(i, g, c, !0);
-            if (null == b) {
-                if (a || !k()) return j = !1;
-                g = e ? (0 > c ? Sg : Rg)(i) : 0 > c ? i.text.length : 0
-            } else g = b;
-            return !0
-        }
-        var f = b.line,
-            g = b.ch,
-            h = c,
-            i = ff(a, f),
-            j = !0;
-        if ("char" == d) l();
-        else if ("column" == d) l(!0);
-        else if ("word" == d || "group" == d)
-            for (var m = null, n = "group" == d, o = a.cm && a.cm.getHelper(b, "wordChars"), p = !0; !(0 > c) || l(!p); p = !1) {
-                var q = i.text.charAt(g) || "\n",
-                    r = lg(q, o) ? "w" : n && "\n" == q ? "n" : !n || /\s/.test(q) ? null : "p";
-                if (!n || p || r || (r = "s"), m && m != r) {
-                    0 > c && (c = 1, l());
-                    break
-                }
-                if (r && (m = r), c > 0 && !l(!p)) break
-            }
-        var s = cb(a, oa(f, g), h, !0);
-        return j || (s.hitSide = !0), s
-    }
-
-    function zd(a, b, c, d) {
-        var g, e = a.doc,
-            f = b.left;
-        if ("page" == d) {
-            var h = Math.min(a.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
-            g = b.top + c * (h - (0 > c ? 1.5 : .5) * Rb(a.display))
-        } else "line" == d && (g = c > 0 ? b.bottom + 3 : b.top - 3);
-        for (;;) {
-            var i = Ob(a, f, g);
-            if (!i.outside) break;
-            if (0 > c ? 0 >= g : g >= e.height) {
-                i.hitSide = !0;
-                break
-            }
-            g += 5 * c
-        }
-        return i
-    }
-
-    function Cd(a, b, c, d) {
-        v.defaults[a] = b, c && (Bd[a] = d ? function (a, b, d) {
-            d != Dd && c(a, b, d)
-        } : c)
-    }
-
-    function Nd(a) {
-        for (var c, d, e, f, b = a.split(/-(?!$)/), a = b[b.length - 1], g = 0; g < b.length - 1; g++) {
-            var h = b[g];
-            if (/^(cmd|meta|m)$/i.test(h)) f = !0;
-            else if (/^a(lt)?$/i.test(h)) c = !0;
-            else if (/^(c|ctrl|control)$/i.test(h)) d = !0;
-            else {
-                if (!/^s(hift)$/i.test(h)) throw new Error("Unrecognized modifier name: " + h);
-                e = !0
-            }
-        }
-        return c && (a = "Alt-" + a), d && (a = "Ctrl-" + a), f && (a = "Cmd-" + a), e && (a = "Shift-" + a), a
-    }
-
-    function Rd(a) {
-        return "string" == typeof a ? Md[a] : a
-    }
-
-    function Vd(a, b, c, d, e) {
-        if (d && d.shared) return Xd(a, b, c, d, e);
-        if (a.cm && !a.cm.curOp) return dc(a.cm, Vd)(a, b, c, d, e);
-        var f = new Ud(a, e),
-            g = pa(b, c);
-        if (d && hg(d, f, !1), g > 0 || 0 == g && f.clearWhenEmpty !== !1) return f;
-        if (f.replacedWith && (f.collapsed = !0, f.widgetNode = pg("span", [f.replacedWith], "CodeMirror-widget"), d.handleMouseEvents || f.widgetNode.setAttribute("cm-ignore-events", "true"), d.insertLeft && (f.widgetNode.insertLeft = !0)), f.collapsed) {
-            if (re(a, b.line, b, c, f) || b.line != c.line && re(a, c.line, b, c, f)) throw new Error("Inserting collapsed marker partially overlapping an existing one");
-            u = !0
-        }
-        f.addToHistory && sf(a, {
-            from: b,
-            to: c,
-            origin: "markText"
-        }, a.sel, NaN);
-        var j, h = b.line,
-            i = a.cm;
-        if (a.iter(h, c.line + 1, function (a) {
-                i && f.collapsed && !i.options.lineWrapping && se(a) == i.display.maxLine && (j = !0), f.collapsed && h != b.line && jf(a, 0), ce(a, new _d(f, h == b.line ? b.ch : null, h == c.line ? c.ch : null)), ++h
-            }), f.collapsed && a.iter(b.line, c.line + 1, function (b) {
-                we(a, b) && jf(b, 0)
-            }), f.clearOnEnter && Jf(f, "beforeCursorEnter", function () {
-                f.clear()
-            }), f.readOnly && (t = !0, (a.history.done.length || a.history.undone.length) && a.clearHistory()), f.collapsed && (f.id = ++Td, f.atomic = !0), i) {
-            if (j && (i.curOp.updateMaxLine = !0), f.collapsed) ic(i, b.line, c.line + 1);
-            else if (f.className || f.title || f.startStyle || f.endStyle || f.css)
-                for (var k = b.line; k <= c.line; k++) jc(i, k, "text");
-            f.atomic && ab(i.doc), Nf(i, "markerAdded", i, f)
-        }
-        return f
-    }
-
-    function Xd(a, b, c, d, e) {
-        d = hg(d), d.shared = !1;
-        var f = [Vd(a, b, c, d, e)],
-            g = f[0],
-            h = d.widgetNode;
-        return df(a, function (a) {
-            h && (d.widgetNode = h.cloneNode(!0)), f.push(Vd(a, Oa(a, b), Oa(a, c), d, e));
-            for (var i = 0; i < a.linked.length; ++i)
-                if (a.linked[i].isParent) return;
-            g = bg(f)
-        }), new Wd(f, g)
-    }
-
-    function Yd(a) {
-        return a.findMarks(oa(a.first, 0), a.clipPos(oa(a.lastLine())), function (a) {
-            return a.parent
-        })
-    }
-
-    function Zd(a, b) {
-        for (var c = 0; c < b.length; c++) {
-            var d = b[c],
-                e = d.find(),
-                f = a.clipPos(e.from),
-                g = a.clipPos(e.to);
-            if (pa(f, g)) {
-                var h = Vd(a, f, g, d.primary, d.primary.type);
-                d.markers.push(h), h.parent = d
-            }
-        }
-    }
-
-    function $d(a) {
-        for (var b = 0; b < a.length; b++) {
-            var c = a[b],
-                d = [c.primary.doc];
-            df(c.primary.doc, function (a) {
-                d.push(a)
-            });
-            for (var e = 0; e < c.markers.length; e++) {
-                var f = c.markers[e]; - 1 == dg(d, f.doc) && (f.parent = null, c.markers.splice(e--, 1))
-            }
-        }
-    }
-
-    function _d(a, b, c) {
-        this.marker = a, this.from = b, this.to = c
-    }
-
-    function ae(a, b) {
-        if (a)
-            for (var c = 0; c < a.length; ++c) {
-                var d = a[c];
-                if (d.marker == b) return d
-            }
-    }
-
-    function be(a, b) {
-        for (var c, d = 0; d < a.length; ++d) a[d] != b && (c || (c = []))
-            .push(a[d]);
-        return c
-    }
-
-    function ce(a, b) {
-        a.markedSpans = a.markedSpans ? a.markedSpans.concat([b]) : [b], b.marker.attachLine(a)
-    }
-
-    function de(a, b, c) {
-        if (a)
-            for (var e, d = 0; d < a.length; ++d) {
-                var f = a[d],
-                    g = f.marker,
-                    h = null == f.from || (g.inclusiveLeft ? f.from <= b : f.from < b);
-                if (h || f.from == b && "bookmark" == g.type && (!c || !f.marker.insertLeft)) {
-                    var i = null == f.to || (g.inclusiveRight ? f.to >= b : f.to > b);
-                    (e || (e = []))
-                    .push(new _d(g, f.from, i ? null : f.to))
-                }
-            }
-        return e
-    }
-
-    function ee(a, b, c) {
-        if (a)
-            for (var e, d = 0; d < a.length; ++d) {
-                var f = a[d],
-                    g = f.marker,
-                    h = null == f.to || (g.inclusiveRight ? f.to >= b : f.to > b);
-                if (h || f.from == b && "bookmark" == g.type && (!c || f.marker.insertLeft)) {
-                    var i = null == f.from || (g.inclusiveLeft ? f.from <= b : f.from < b);
-                    (e || (e = []))
-                    .push(new _d(g, i ? null : f.from - b, null == f.to ? null : f.to - b))
-                }
-            }
-        return e
-    }
-
-    function fe(a, b) {
-        if (b.full) return null;
-        var c = Qa(a, b.from.line) && ff(a, b.from.line)
-            .markedSpans,
-            d = Qa(a, b.to.line) && ff(a, b.to.line)
-            .markedSpans;
-        if (!c && !d) return null;
-        var e = b.from.ch,
-            f = b.to.ch,
-            g = 0 == pa(b.from, b.to),
-            h = de(c, e, g),
-            i = ee(d, f, g),
-            j = 1 == b.text.length,
-            k = bg(b.text)
-            .length + (j ? e : 0);
-        if (h)
-            for (var l = 0; l < h.length; ++l) {
-                var m = h[l];
-                if (null == m.to) {
-                    var n = ae(i, m.marker);
-                    n ? j && (m.to = null == n.to ? null : n.to + k) : m.to = e
-                }
-            }
-        if (i)
-            for (var l = 0; l < i.length; ++l) {
-                var m = i[l];
-                if (null != m.to && (m.to += k), null == m.from) {
-                    var n = ae(h, m.marker);
-                    n || (m.from = k, j && (h || (h = []))
-                        .push(m))
-                } else m.from += k, j && (h || (h = []))
-                    .push(m)
-            }
-        h && (h = ge(h)), i && i != h && (i = ge(i));
-        var o = [h];
-        if (!j) {
-            var q, p = b.text.length - 2;
-            if (p > 0 && h)
-                for (var l = 0; l < h.length; ++l) null == h[l].to && (q || (q = []))
-                    .push(new _d(h[l].marker, null, null));
-            for (var l = 0; p > l; ++l) o.push(q);
-            o.push(i)
-        }
-        return o
-    }
-
-    function ge(a) {
-        for (var b = 0; b < a.length; ++b) {
-            var c = a[b];
-            null != c.from && c.from == c.to && c.marker.clearWhenEmpty !== !1 && a.splice(b--, 1)
-        }
-        return a.length ? a : null
-    }
-
-    function he(a, b) {
-        var c = yf(a, b),
-            d = fe(a, b);
-        if (!c) return d;
-        if (!d) return c;
-        for (var e = 0; e < c.length; ++e) {
-            var f = c[e],
-                g = d[e];
-            if (f && g) a: for (var h = 0; h < g.length; ++h) {
-                for (var i = g[h], j = 0; j < f.length; ++j)
-                    if (f[j].marker == i.marker) continue a;
-                f.push(i)
-            } else g && (c[e] = g)
-        }
-        return c
-    }
-
-    function ie(a, b, c) {
-        var d = null;
-        if (a.iter(b.line, c.line + 1, function (a) {
-                if (a.markedSpans)
-                    for (var b = 0; b < a.markedSpans.length; ++b) {
-                        var c = a.markedSpans[b].marker;
-                        !c.readOnly || d && -1 != dg(d, c) || (d || (d = []))
-                            .push(c)
-                    }
-            }), !d) return null;
-        for (var e = [{
-                from: b,
-                to: c
-            }], f = 0; f < d.length; ++f)
-            for (var g = d[f], h = g.find(0), i = 0; i < e.length; ++i) {
-                var j = e[i];
-                if (!(pa(j.to, h.from) < 0 || pa(j.from, h.to) > 0)) {
-                    var k = [i, 1],
-                        l = pa(j.from, h.from),
-                        m = pa(j.to, h.to);
-                    (0 > l || !g.inclusiveLeft && !l) && k.push({
-                        from: j.from,
-                        to: h.from
-                    }), (m > 0 || !g.inclusiveRight && !m) && k.push({
-                        from: h.to,
-                        to: j.to
-                    }), e.splice.apply(e, k), i += k.length - 1
-                }
-            }
-        return e
-    }
-
-    function je(a) {
-        var b = a.markedSpans;
-        if (b) {
-            for (var c = 0; c < b.length; ++c) b[c].marker.detachLine(a);
-            a.markedSpans = null
-        }
-    }
-
-    function ke(a, b) {
-        if (b) {
-            for (var c = 0; c < b.length; ++c) b[c].marker.attachLine(a);
-            a.markedSpans = b
-        }
-    }
-
-    function le(a) {
-        return a.inclusiveLeft ? -1 : 0
-    }
-
-    function me(a) {
-        return a.inclusiveRight ? 1 : 0
-    }
-
-    function ne(a, b) {
-        var c = a.lines.length - b.lines.length;
-        if (0 != c) return c;
-        var d = a.find(),
-            e = b.find(),
-            f = pa(d.from, e.from) || le(a) - le(b);
-        if (f) return -f;
-        var g = pa(d.to, e.to) || me(a) - me(b);
-        return g ? g : b.id - a.id
-    }
-
-    function oe(a, b) {
-        var d, c = u && a.markedSpans;
-        if (c)
-            for (var e, f = 0; f < c.length; ++f) e = c[f], e.marker.collapsed && null == (b ? e.from : e.to) && (!d || ne(d, e.marker) < 0) && (d = e.marker);
-        return d
-    }
-
-    function pe(a) {
-        return oe(a, !0)
-    }
-
-    function qe(a) {
-        return oe(a, !1)
-    }
-
-    function re(a, b, c, d, e) {
-        var f = ff(a, b),
-            g = u && f.markedSpans;
-        if (g)
-            for (var h = 0; h < g.length; ++h) {
-                var i = g[h];
-                if (i.marker.collapsed) {
-                    var j = i.marker.find(0),
-                        k = pa(j.from, c) || le(i.marker) - le(e),
-                        l = pa(j.to, d) || me(i.marker) - me(e);
-                    if (!(k >= 0 && 0 >= l || 0 >= k && l >= 0) && (0 >= k && (pa(j.to, c) > 0 || i.marker.inclusiveRight && e.inclusiveLeft) || k >= 0 && (pa(j.from, d) < 0 || i.marker.inclusiveLeft && e.inclusiveRight))) return !0
-                }
-            }
-    }
-
-    function se(a) {
-        for (var b; b = pe(a);) a = b.find(-1, !0)
-            .line;
-        return a
-    }
-
-    function te(a) {
-        for (var b, c; b = qe(a);) a = b.find(1, !0)
-            .line, (c || (c = []))
-            .push(a);
-        return c
-    }
-
-    function ue(a, b) {
-        var c = ff(a, b),
-            d = se(c);
-        return c == d ? b : kf(d)
-    }
-
-    function ve(a, b) {
-        if (b > a.lastLine()) return b;
-        var d, c = ff(a, b);
-        if (!we(a, c)) return b;
-        for (; d = qe(c);) c = d.find(1, !0)
-            .line;
-        return kf(c) + 1
-    }
-
-    function we(a, b) {
-        var c = u && b.markedSpans;
-        if (c)
-            for (var d, e = 0; e < c.length; ++e)
-                if (d = c[e], d.marker.collapsed) {
-                    if (null == d.from) return !0;
-                    if (!d.marker.widgetNode && 0 == d.from && d.marker.inclusiveLeft && xe(a, b, d)) return !0
-                }
-    }
-
-    function xe(a, b, c) {
-        if (null == c.to) {
-            var d = c.marker.find(1, !0);
-            return xe(a, d.line, ae(d.line.markedSpans, c.marker))
-        }
-        if (c.marker.inclusiveRight && c.to == b.text.length) return !0;
-        for (var e, f = 0; f < b.markedSpans.length; ++f)
-            if (e = b.markedSpans[f], e.marker.collapsed && !e.marker.widgetNode && e.from == c.to && (null == e.to || e.to != c.from) && (e.marker.inclusiveLeft || c.marker.inclusiveRight) && xe(a, b, e)) return !0
-    }
-
-    function ze(a, b, c) {
-        mf(b) < (a.curOp && a.curOp.scrollTop || a.doc.scrollTop) && sd(a, null, c)
-    }
-
-    function Ae(a) {
-        if (null != a.height) return a.height;
-        var b = a.doc.cm;
-        if (!b) return 0;
-        if (!tg(document.body, a.node)) {
-            var c = "position: relative;";
-            a.coverGutter && (c += "margin-left: -" + b.display.gutters.offsetWidth + "px;"), a.noHScroll && (c += "width: " + b.display.wrapper.clientWidth + "px;"), sg(b.display.measure, pg("div", [a.node], null, c))
-        }
-        return a.height = a.node.offsetHeight
-    }
-
-    function Be(a, b, c, d) {
-        var e = new ye(a, c, d),
-            f = a.cm;
-        return f && e.noHScroll && (f.display.alignWidgets = !0), wd(a, b, "widget", function (b) {
-            var c = b.widgets || (b.widgets = []);
-            if (null == e.insertAt ? c.push(e) : c.splice(Math.min(c.length - 1, Math.max(0, e.insertAt)), 0, e), e.line = b, f && !we(a, b)) {
-                var d = mf(b) < a.scrollTop;
-                jf(b, b.height + Ae(e)), d && sd(f, null, e.height), f.curOp.forceUpdate = !0
-            }
-            return !0
-        }), e
-    }
-
-    function De(a, b, c, d) {
-        a.text = b, a.stateAfter && (a.stateAfter = null), a.styles && (a.styles = null), null != a.order && (a.order = null), je(a), ke(a, c);
-        var e = d ? d(a) : 1;
-        e != a.height && jf(a, e)
-    }
-
-    function Ee(a) {
-        a.parent = null, je(a)
-    }
-
-    function Fe(a, b) {
-        if (a)
-            for (;;) {
-                var c = a.match(/(?:^|\s+)line-(background-)?(\S+)/);
-                if (!c) break;
-                a = a.slice(0, c.index) + a.slice(c.index + c[0].length);
-                var d = c[1] ? "bgClass" : "textClass";
-                null == b[d] ? b[d] = c[2] : new RegExp("(?:^|s)" + c[2] + "(?:$|s)")
-                    .test(b[d]) || (b[d] += " " + c[2])
-            }
-        return a
-    }
-
-    function Ge(a, b) {
-        if (a.blankLine) return a.blankLine(b);
-        if (a.innerMode) {
-            var c = v.innerMode(a, b);
-            return c.mode.blankLine ? c.mode.blankLine(c.state) : void 0
-        }
-    }
-
-    function He(a, b, c, d) {
-        for (var e = 0; 10 > e; e++) {
-            d && (d[0] = v.innerMode(a, c)
-                .mode);
-            var f = a.token(b, c);
-            if (b.pos > b.start) return f
-        }
-        throw new Error("Mode " + a.name + " failed to advance stream.")
-    }
-
-    function Ie(a, b, c, d) {
-        function e(a) {
-            return {
-                start: k.start,
-                end: k.pos,
-                string: k.current(),
-                type: h || null,
-                state: a ? Jd(f.mode, j) : j
-            }
-        }
-        var h, f = a.doc,
-            g = f.mode;
-        b = Oa(f, b);
-        var l, i = ff(f, b.line),
-            j = lb(a, b.line, c),
-            k = new Sd(i.text, a.options.tabSize);
-        for (d && (l = []);
-            (d || k.pos < b.ch) && !k.eol();) k.start = k.pos, h = He(g, k, j), d && l.push(e(!0));
-        return d ? l : e()
-    }
-
-    function Je(a, b, c, d, e, f, g) {
-        var h = c.flattenSpans;
-        null == h && (h = a.options.flattenSpans);
-        var l, i = 0,
-            j = null,
-            k = new Sd(b, a.options.tabSize),
-            m = a.options.addModeClass && [null];
-        for ("" == b && Fe(Ge(c, d), f); !k.eol();) {
-            if (k.pos > a.options.maxHighlightLength ? (h = !1, g && Me(a, b, d, k.pos), k.pos = b.length, l = null) : l = Fe(He(c, k, d, m), f), m) {
-                var n = m[0].name;
-                n && (l = "m-" + (l ? n + " " + l : n))
-            }
-            if (!h || j != l) {
-                for (; i < k.start;) i = Math.min(k.start, i + 5e4), e(i, j);
-                j = l
-            }
-            k.start = k.pos
-        }
-        for (; i < k.pos;) {
-            var o = Math.min(k.pos, i + 5e4);
-            e(o, j), i = o
-        }
-    }
-
-    function Ke(a, b, c, d) {
-        var e = [a.state.modeGen],
-            f = {};
-        Je(a, b.text, a.doc.mode, c, function (a, b) {
-            e.push(a, b)
-        }, f, d);
-        for (var g = 0; g < a.state.overlays.length; ++g) {
-            var h = a.state.overlays[g],
-                i = 1,
-                j = 0;
-            Je(a, b.text, h.mode, !0, function (a, b) {
-                for (var c = i; a > j;) {
-                    var d = e[i];
-                    d > a && e.splice(i, 1, a, e[i + 1], d), i += 2, j = Math.min(a, d)
-                }
-                if (b)
-                    if (h.opaque) e.splice(c, i - c, a, "cm-overlay " + b), i = c + 2;
-                    else
-                        for (; i > c; c += 2) {
-                            var f = e[c + 1];
-                            e[c + 1] = (f ? f + " " : "") + "cm-overlay " + b
-                        }
-            }, f)
-        }
-        return {
-            styles: e,
-            classes: f.bgClass || f.textClass ? f : null
-        }
-    }
-
-    function Le(a, b, c) {
-        if (!b.styles || b.styles[0] != a.state.modeGen) {
-            var d = lb(a, kf(b)),
-                e = Ke(a, b, b.text.length > a.options.maxHighlightLength ? Jd(a.doc.mode, d) : d);
-            b.stateAfter = d, b.styles = e.styles, e.classes ? b.styleClasses = e.classes : b.styleClasses && (b.styleClasses = null), c === a.doc.frontier && a.doc.frontier++
-        }
-        return b.styles
-    }
-
-    function Me(a, b, c, d) {
-        var e = a.doc.mode,
-            f = new Sd(b, a.options.tabSize);
-        for (f.start = f.pos = d || 0, "" == b && Ge(e, c); !f.eol();) He(e, f, c), f.start = f.pos
-    }
-
-    function Pe(a, b) {
-        if (!a || /^\s*$/.test(a)) return null;
-        var c = b.addModeClass ? Oe : Ne;
-        return c[a] || (c[a] = a.replace(/\S+/g, "cm-$&"))
-    }
-
-    function Qe(a, b) {
-        var c = pg("span", null, null, f ? "padding-right: .1px" : null),
-            e = {
-                pre: pg("pre", [c], "CodeMirror-line"),
-                content: c,
-                col: 0,
-                pos: 0,
-                cm: a,
-                splitSpaces: (d || f) && a.getOption("lineWrapping")
-            };
-        b.measure = {};
-        for (var g = 0; g <= (b.rest ? b.rest.length : 0); g++) {
-            var i, h = g ? b.rest[g - 1] : b.line;
-            e.pos = 0, e.addToken = Se, Hg(a.display.measure) && (i = nf(h)) && (e.addToken = Ue(e.addToken, i)), e.map = [];
-            var j = b != a.display.externalMeasured && kf(h);
-            We(h, e, Le(a, h, j)), h.styleClasses && (h.styleClasses.bgClass && (e.bgClass = yg(h.styleClasses.bgClass, e.bgClass || "")), h.styleClasses.textClass && (e.textClass = yg(h.styleClasses.textClass, e.textClass || ""))), 0 == e.map.length && e.map.push(0, 0, e.content.appendChild(Fg(a.display.measure))), 0 == g ? (b.measure.map = e.map, b.measure.cache = {}) : ((b.measure.maps || (b.measure.maps = []))
-                .push(e.map), (b.measure.caches || (b.measure.caches = []))
-                .push({}))
-        }
-        return f && /\bcm-tab\b/.test(e.content.lastChild.className) && (e.content.className = "cm-tab-wrap-hack"), Lf(a, "renderLine", a, b.line, e.pre), e.pre.className && (e.textClass = yg(e.pre.className, e.textClass || "")), e
-    }
-
-    function Re(a) {
-        var b = pg("span", "\u2022", "cm-invalidchar");
-        return b.title = "\\u" + a.charCodeAt(0)
-            .toString(16), b.setAttribute("aria-label", b.title), b
-    }
-
-    function Se(a, b, c, f, g, h, i) {
-        if (b) {
-            var j = a.splitSpaces ? b.replace(/ {3,}/g, Te) : b,
-                k = a.cm.state.specialChars,
-                l = !1;
-            if (k.test(b))
-                for (var m = document.createDocumentFragment(), n = 0;;) {
-                    k.lastIndex = n;
-                    var o = k.exec(b),
-                        p = o ? o.index - n : b.length - n;
-                    if (p) {
-                        var q = document.createTextNode(j.slice(n, n + p));
-                        d && 9 > e ? m.appendChild(pg("span", [q])) : m.appendChild(q), a.map.push(a.pos, a.pos + p, q), a.col += p, a.pos += p
-                    }
-                    if (!o) break;
-                    if (n += p + 1, "	" == o[0]) {
-                        var r = a.cm.options.tabSize,
-                            s = r - a.col % r,
-                            q = m.appendChild(pg("span", ag(s), "cm-tab"));
-                        q.setAttribute("role", "presentation"), q.setAttribute("cm-text", "	"), a.col += s
-                    } else if ("\r" == o[0] || "\n" == o[0]) {
-                        var q = m.appendChild(pg("span", "\r" == o[0] ? "\u240d" : "\u2424", "cm-invalidchar"));
-                        q.setAttribute("cm-text", o[0]), a.col += 1
-                    } else {
-                        var q = a.cm.options.specialCharPlaceholder(o[0]);
-                        q.setAttribute("cm-text", o[0]), d && 9 > e ? m.appendChild(pg("span", [q])) : m.appendChild(q), a.col += 1
-                    }
-                    a.map.push(a.pos, a.pos + 1, q), a.pos++
-                } else {
-                    a.col += b.length;
-                    var m = document.createTextNode(j);
-                    a.map.push(a.pos, a.pos + b.length, m), d && 9 > e && (l = !0), a.pos += b.length
-                }
-            if (c || f || g || l || i) {
-                var t = c || "";
-                f && (t += f), g && (t += g);
-                var u = pg("span", [m], t, i);
-                return h && (u.title = h), a.content.appendChild(u)
-            }
-            a.content.appendChild(m)
-        }
-    }
-
-    function Te(a) {
-        for (var b = " ", c = 0; c < a.length - 2; ++c) b += c % 2 ? " " : "\xa0";
-        return b += " "
-    }
-
-    function Ue(a, b) {
-        return function (c, d, e, f, g, h, i) {
-            e = e ? e + " cm-force-border" : "cm-force-border";
-            for (var j = c.pos, k = j + d.length;;) {
-                for (var l = 0; l < b.length; l++) {
-                    var m = b[l];
-                    if (m.to > j && m.from <= j) break
-                }
-                if (m.to >= k) return a(c, d, e, f, g, h, i);
-                a(c, d.slice(0, m.to - j), e, f, null, h, i), f = null, d = d.slice(m.to - j), j = m.to
-            }
-        }
-    }
-
-    function Ve(a, b, c, d) {
-        var e = !d && c.widgetNode;
-        e && a.map.push(a.pos, a.pos + b, e), !d && a.cm.display.input.needsContentAttribute && (e || (e = a.content.appendChild(document.createElement("span"))), e.setAttribute("cm-marker", c.id)), e && (a.cm.display.input.setUneditable(e), a.content.appendChild(e)), a.pos += b
-    }
-
-    function We(a, b, c) {
-        var d = a.markedSpans,
-            e = a.text,
-            f = 0;
-        if (d)
-            for (var k, l, n, o, p, q, r, h = e.length, i = 0, g = 1, j = "", m = 0;;) {
-                if (m == i) {
-                    n = o = p = q = l = "", r = null, m = 1 / 0;
-                    for (var s = [], t = 0; t < d.length; ++t) {
-                        var u = d[t],
-                            v = u.marker;
-                        "bookmark" == v.type && u.from == i && v.widgetNode ? s.push(v) : u.from <= i && (null == u.to || u.to > i || v.collapsed && u.to == i && u.from == i) ? (null != u.to && u.to != i && m > u.to && (m = u.to, o = ""), v.className && (n += " " + v.className), v.css && (l = v.css), v.startStyle && u.from == i && (p += " " + v.startStyle), v.endStyle && u.to == m && (o += " " + v.endStyle), v.title && !q && (q = v.title), v.collapsed && (!r || ne(r.marker, v) < 0) && (r = u)) : u.from > i && m > u.from && (m = u.from)
-                    }
-                    if (r && (r.from || 0) == i) {
-                        if (Ve(b, (null == r.to ? h + 1 : r.to) - i, r.marker, null == r.from), null == r.to) return;
-                        r.to == i && (r = !1)
-                    }
-                    if (!r && s.length)
-                        for (var t = 0; t < s.length; ++t) Ve(b, 0, s[t])
-                }
-                if (i >= h) break;
-                for (var w = Math.min(h, m);;) {
-                    if (j) {
-                        var x = i + j.length;
-                        if (!r) {
-                            var y = x > w ? j.slice(0, w - i) : j;
-                            b.addToken(b, y, k ? k + n : n, p, i + y.length == m ? o : "", q, l)
-                        }
-                        if (x >= w) {
-                            j = j.slice(w - i), i = w;
-                            break
-                        }
-                        i = x, p = ""
-                    }
-                    j = e.slice(f, f = c[g++]), k = Pe(c[g++], b.cm.options)
-                }
-            } else
-                for (var g = 1; g < c.length; g += 2) b.addToken(b, e.slice(f, f = c[g]), Pe(c[g + 1], b.cm.options))
-    }
-
-    function Xe(a, b) {
-        return 0 == b.from.ch && 0 == b.to.ch && "" == bg(b.text) && (!a.cm || a.cm.options.wholeLineUpdateBefore)
-    }
-
-    function Ye(a, b, c, d) {
-        function e(a) {
-            return c ? c[a] : null
-        }
-
-        function f(a, c, e) {
-            De(a, c, e, d), Nf(a, "change", a, b)
-        }
-
-        function g(a, b) {
-            for (var c = a, f = []; b > c; ++c) f.push(new Ce(j[c], e(c), d));
-            return f
-        }
-        var h = b.from,
-            i = b.to,
-            j = b.text,
-            k = ff(a, h.line),
-            l = ff(a, i.line),
-            m = bg(j),
-            n = e(j.length - 1),
-            o = i.line - h.line;
-        if (b.full) a.insert(0, g(0, j.length)), a.remove(j.length, a.size - j.length);
-        else if (Xe(a, b)) {
-            var p = g(0, j.length - 1);
-            f(l, l.text, n), o && a.remove(h.line, o), p.length && a.insert(h.line, p)
-        } else if (k == l)
-            if (1 == j.length) f(k, k.text.slice(0, h.ch) + m + k.text.slice(i.ch), n);
-            else {
-                var p = g(1, j.length - 1);
-                p.push(new Ce(m + k.text.slice(i.ch), n, d)), f(k, k.text.slice(0, h.ch) + j[0], e(0)), a.insert(h.line + 1, p)
-            } else if (1 == j.length) f(k, k.text.slice(0, h.ch) + j[0] + l.text.slice(i.ch), e(0)), a.remove(h.line + 1, o);
-        else {
-            f(k, k.text.slice(0, h.ch) + j[0], e(0)), f(l, m + l.text.slice(i.ch), n);
-            var p = g(1, j.length - 1);
-            o > 1 && a.remove(h.line + 1, o - 1), a.insert(h.line + 1, p)
-        }
-        Nf(a, "change", a, b)
-    }
-
-    function Ze(a) {
-        this.lines = a, this.parent = null;
-        for (var b = 0, c = 0; b < a.length; ++b) a[b].parent = this, c += a[b].height;
-        this.height = c
-    }
-
-    function $e(a) {
-        this.children = a;
-        for (var b = 0, c = 0, d = 0; d < a.length; ++d) {
-            var e = a[d];
-            b += e.chunkSize(), c += e.height, e.parent = this
-        }
-        this.size = b, this.height = c, this.parent = null
-    }
-
-    function df(a, b, c) {
-        function d(a, e, f) {
-            if (a.linked)
-                for (var g = 0; g < a.linked.length; ++g) {
-                    var h = a.linked[g];
-                    if (h.doc != e) {
-                        var i = f && h.sharedHist;
-                        (!c || i) && (b(h.doc, i), d(h.doc, a, i))
-                    }
-                }
-        }
-        d(a, null, !0)
-    }
-
-    function ef(a, b) {
-        if (b.cm) throw new Error("This document is already in use.");
-        a.doc = b, b.cm = a, B(a), x(a), a.options.lineWrapping || H(a), a.options.mode = b.modeOption, ic(a)
-    }
-
-    function ff(a, b) {
-        if (b -= a.first, 0 > b || b >= a.size) throw new Error("There is no line " + (b + a.first) + " in the document.");
-        for (var c = a; !c.lines;)
-            for (var d = 0;; ++d) {
-                var e = c.children[d],
-                    f = e.chunkSize();
-                if (f > b) {
-                    c = e;
-                    break
-                }
-                b -= f
-            }
-        return c.lines[b]
-    }
-
-    function gf(a, b, c) {
-        var d = [],
-            e = b.line;
-        return a.iter(b.line, c.line + 1, function (a) {
-            var f = a.text;
-            e == c.line && (f = f.slice(0, c.ch)), e == b.line && (f = f.slice(b.ch)), d.push(f), ++e
-        }), d
-    }
-
-    function hf(a, b, c) {
-        var d = [];
-        return a.iter(b, c, function (a) {
-            d.push(a.text)
-        }), d
-    }
-
-    function jf(a, b) {
-        var c = b - a.height;
-        if (c)
-            for (var d = a; d; d = d.parent) d.height += c
-    }
-
-    function kf(a) {
-        if (null == a.parent) return null;
-        for (var b = a.parent, c = dg(b.lines, a), d = b.parent; d; b = d, d = d.parent)
-            for (var e = 0; d.children[e] != b; ++e) c += d.children[e].chunkSize();
-        return c + b.first
-    }
-
-    function lf(a, b) {
-        var c = a.first;
-        a: do {
-            for (var d = 0; d < a.children.length; ++d) {
-                var e = a.children[d],
-                    f = e.height;
-                if (f > b) {
-                    a = e;
-                    continue a
-                }
-                b -= f, c += e.chunkSize()
-            }
-            return c
-        } while (!a.lines);
-        for (var d = 0; d < a.lines.length; ++d) {
-            var g = a.lines[d],
-                h = g.height;
-            if (h > b) break;
-            b -= h
-        }
-        return c + d
-    }
-
-    function mf(a) {
-        a = se(a);
-        for (var b = 0, c = a.parent, d = 0; d < c.lines.length; ++d) {
-            var e = c.lines[d];
-            if (e == a) break;
-            b += e.height
-        }
-        for (var f = c.parent; f; c = f, f = c.parent)
-            for (var d = 0; d < f.children.length; ++d) {
-                var g = f.children[d];
-                if (g == c) break;
-                b += g.height
-            }
-        return b
-    }
-
-    function nf(a) {
-        var b = a.order;
-        return null == b && (b = a.order = ah(a.text)), b
-    }
-
-    function of(a) {
-        this.done = [], this.undone = [], this.undoDepth = 1 / 0, this.lastModTime = this.lastSelTime = 0, this.lastOp = this.lastSelOp = null, this.lastOrigin = this.lastSelOrigin = null, this.generation = this.maxGeneration = a || 1
-    }
-
-    function pf(a, b) {
-        var c = {
-            from: qa(b.from),
-            to: bd(b),
-            text: gf(a, b.from, b.to)
-        };
-        return wf(a, c, b.from.line, b.to.line + 1), df(a, function (a) {
-            wf(a, c, b.from.line, b.to.line + 1)
-        }, !0), c
-    }
-
-    function qf(a) {
-        for (; a.length;) {
-            var b = bg(a);
-            if (!b.ranges) break;
-            a.pop()
-        }
-    }
-
-    function rf(a, b) {
-        return b ? (qf(a.done), bg(a.done)) : a.done.length && !bg(a.done)
-            .ranges ? bg(a.done) : a.done.length > 1 && !a.done[a.done.length - 2].ranges ? (a.done.pop(), bg(a.done)) : void 0
-    }
-
-    function sf(a, b, c, d) {
-        var e = a.history;
-        e.undone.length = 0;
-        var g, f = +new Date;
-        if ((e.lastOp == d || e.lastOrigin == b.origin && b.origin && ("+" == b.origin.charAt(0) && a.cm && e.lastModTime > f - a.cm.options.historyEventDelay || "*" == b.origin.charAt(0))) && (g = rf(e, e.lastOp == d))) {
-            var h = bg(g.changes);
-            0 == pa(b.from, b.to) && 0 == pa(b.from, h.to) ? h.to = bd(b) : g.changes.push(pf(a, b))
-        } else {
-            var i = bg(e.done);
-            for (i && i.ranges || vf(a.sel, e.done), g = {
-                    changes: [pf(a, b)],
-                    generation: e.generation
-                }, e.done.push(g); e.done.length > e.undoDepth;) e.done.shift(), e.done[0].ranges || e.done.shift()
-        }
-        e.done.push(c), e.generation = ++e.maxGeneration, e.lastModTime = e.lastSelTime = f, e.lastOp = e.lastSelOp = d, e.lastOrigin = e.lastSelOrigin = b.origin, h || Lf(a, "historyAdded")
-    }
-
-    function tf(a, b, c, d) {
-        var e = b.charAt(0);
-        return "*" == e || "+" == e && c.ranges.length == d.ranges.length && c.somethingSelected() == d.somethingSelected() && new Date - a.history.lastSelTime <= (a.cm ? a.cm.options.historyEventDelay : 500)
-    }
-
-    function uf(a, b, c, d) {
-        var e = a.history,
-            f = d && d.origin;
-        c == e.lastSelOp || f && e.lastSelOrigin == f && (e.lastModTime == e.lastSelTime && e.lastOrigin == f || tf(a, f, bg(e.done), b)) ? e.done[e.done.length - 1] = b : vf(b, e.done), e.lastSelTime = +new Date, e.lastSelOrigin = f, e.lastSelOp = c, d && d.clearRedo !== !1 && qf(e.undone)
-    }
-
-    function vf(a, b) {
-        var c = bg(b);
-        c && c.ranges && c.equals(a) || b.push(a)
-    }
-
-    function wf(a, b, c, d) {
-        var e = b["spans_" + a.id],
-            f = 0;
-        a.iter(Math.max(a.first, c), Math.min(a.first + a.size, d), function (c) {
-            c.markedSpans && ((e || (e = b["spans_" + a.id] = {}))[f] = c.markedSpans), ++f
-        })
-    }
-
-    function xf(a) {
-        if (!a) return null;
-        for (var c, b = 0; b < a.length; ++b) a[b].marker.explicitlyCleared ? c || (c = a.slice(0, b)) : c && c.push(a[b]);
-        return c ? c.length ? c : null : a
-    }
-
-    function yf(a, b) {
-        var c = b["spans_" + a.id];
-        if (!c) return null;
-        for (var d = 0, e = []; d < b.text.length; ++d) e.push(xf(c[d]));
-        return e
-    }
-
-    function zf(a, b, c) {
-        for (var d = 0, e = []; d < a.length; ++d) {
-            var f = a[d];
-            if (f.ranges) e.push(c ? Ja.prototype.deepCopy.call(f) : f);
-            else {
-                var g = f.changes,
-                    h = [];
-                e.push({
-                    changes: h
-                });
-                for (var i = 0; i < g.length; ++i) {
-                    var k, j = g[i];
-                    if (h.push({
-                            from: j.from,
-                            to: j.to,
-                            text: j.text
-                        }), b)
-                        for (var l in j)(k = l.match(/^spans_(\d+)$/)) && dg(b, Number(k[1])) > -1 && (bg(h)[l] = j[l], delete j[l])
-                }
-            }
-        }
-        return e
-    }
-
-    function Af(a, b, c, d) {
-        c < a.line ? a.line += d : b < a.line && (a.line = b, a.ch = 0)
-    }
-
-    function Bf(a, b, c, d) {
-        for (var e = 0; e < a.length; ++e) {
-            var f = a[e],
-                g = !0;
-            if (f.ranges) {
-                f.copied || (f = a[e] = f.deepCopy(), f.copied = !0);
-                for (var h = 0; h < f.ranges.length; h++) Af(f.ranges[h].anchor, b, c, d), Af(f.ranges[h].head, b, c, d)
-            } else {
-                for (var h = 0; h < f.changes.length; ++h) {
-                    var i = f.changes[h];
-                    if (c < i.from.line) i.from = oa(i.from.line + d, i.from.ch), i.to = oa(i.to.line + d, i.to.ch);
-                    else if (b <= i.to.line) {
-                        g = !1;
-                        break
-                    }
-                }
-                g || (a.splice(0, e + 1), e = 0)
-            }
-        }
-    }
-
-    function Cf(a, b) {
-        var c = b.from.line,
-            d = b.to.line,
-            e = b.text.length - (d - c) - 1;
-        Bf(a.done, c, d, e), Bf(a.undone, c, d, e)
-    }
-
-    function Ff(a) {
-        return null != a.defaultPrevented ? a.defaultPrevented : 0 == a.returnValue
-    }
-
-    function Hf(a) {
-        return a.target || a.srcElement
-    }
-
-    function If(a) {
-        var b = a.which;
-        return null == b && (1 & a.button ? b = 1 : 2 & a.button ? b = 3 : 4 & a.button && (b = 2)), o && a.ctrlKey && 1 == b && (b = 3), b
-    }
-
-    function Nf(a, b) {
-        function f(a) {
-            return function () {
-                a.apply(null, d)
-            }
-        }
-        var c = a._handlers && a._handlers[b];
-        if (c) {
-            var e, d = Array.prototype.slice.call(arguments, 2);
-            Tb ? e = Tb.delayedCallbacks : Mf ? e = Mf : (e = Mf = [], setTimeout(Of, 0));
-            for (var g = 0; g < c.length; ++g) e.push(f(c[g]))
-        }
-    }
-
-    function Of() {
-        var a = Mf;
-        Mf = null;
-        for (var b = 0; b < a.length; ++b) a[b]()
-    }
-
-    function Pf(a, b, c) {
-        return "string" == typeof b && (b = {
-            type: b,
-            preventDefault: function () {
-                this.defaultPrevented = !0
-            }
-        }), Lf(a, c || b.type, a, b), Ff(b) || b.codemirrorIgnore
-    }
-
-    function Qf(a) {
-        var b = a._handlers && a._handlers.cursorActivity;
-        if (b)
-            for (var c = a.curOp.cursorActivityHandlers || (a.curOp.cursorActivityHandlers = []), d = 0; d < b.length; ++d) - 1 == dg(c, b[d]) && c.push(b[d])
-    }
-
-    function Rf(a, b) {
-        var c = a._handlers && a._handlers[b];
-        return c && c.length > 0
-    }
-
-    function Sf(a) {
-        a.prototype.on = function (a, b) {
-            Jf(this, a, b)
-        }, a.prototype.off = function (a, b) {
-            Kf(this, a, b)
-        }
-    }
-
-    function Yf() {
-        this.id = null
-    }
-
-    function ag(a) {
-        for (; _f.length <= a;) _f.push(bg(_f) + " ");
-        return _f[a]
-    }
-
-    function bg(a) {
-        return a[a.length - 1]
-    }
-
-    function dg(a, b) {
-        for (var c = 0; c < a.length; ++c)
-            if (a[c] == b) return c;
-        return -1
-    }
-
-    function eg(a, b) {
-        for (var c = [], d = 0; d < a.length; d++) c[d] = b(a[d], d);
-        return c
-    }
-
-    function fg() {}
-
-    function gg(a, b) {
-        var c;
-        return Object.create ? c = Object.create(a) : (fg.prototype = a, c = new fg), b && hg(b, c), c
-    }
-
-    function hg(a, b, c) {
-        b || (b = {});
-        for (var d in a) !a.hasOwnProperty(d) || c === !1 && b.hasOwnProperty(d) || (b[d] = a[d]);
-        return b
-    }
-
-    function ig(a) {
-        var b = Array.prototype.slice.call(arguments, 1);
-        return function () {
-            return a.apply(null, b)
-        }
-    }
-
-    function lg(a, b) {
-        return b ? b.source.indexOf("\\w") > -1 && kg(a) ? !0 : b.test(a) : kg(a)
-    }
-
-    function mg(a) {
-        for (var b in a)
-            if (a.hasOwnProperty(b) && a[b]) return !1;
-        return !0
-    }
-
-    function og(a) {
-        return a.charCodeAt(0) >= 768 && ng.test(a)
-    }
-
-    function pg(a, b, c, d) {
-        var e = document.createElement(a);
-        if (c && (e.className = c), d && (e.style.cssText = d), "string" == typeof b) e.appendChild(document.createTextNode(b));
-        else if (b)
-            for (var f = 0; f < b.length; ++f) e.appendChild(b[f]);
-        return e
-    }
-
-    function rg(a) {
-        for (var b = a.childNodes.length; b > 0; --b) a.removeChild(a.firstChild);
-        return a
-    }
-
-    function sg(a, b) {
-        return rg(a)
-            .appendChild(b)
-    }
-
-    function ug() {
-        for (var a = document.activeElement; a && a.root && a.root.activeElement;) a = a.root.activeElement;
-        return a
-    }
-
-    function vg(a) {
-        return new RegExp("(^|\\s)" + a + "(?:$|\\s)\\s*")
-    }
-
-    function yg(a, b) {
-        for (var c = a.split(" "), d = 0; d < c.length; d++) c[d] && !vg(c[d])
-            .test(b) && (b += " " + c[d]);
-        return b
-    }
-
-    function zg(a) {
-        if (document.body.getElementsByClassName)
-            for (var b = document.body.getElementsByClassName("CodeMirror"), c = 0; c < b.length; c++) {
-                var d = b[c].CodeMirror;
-                d && a(d)
-            }
-    }
-
-    function Bg() {
-        Ag || (Cg(), Ag = !0)
-    }
-
-    function Cg() {
-        var a;
-        Jf(window, "resize", function () {
-            null == a && (a = setTimeout(function () {
-                a = null, zg(rc)
-            }, 100))
-        }), Jf(window, "blur", function () {
-            zg($c)
-        })
-    }
-
-    function Fg(a) {
-        if (null == Eg) {
-            var b = pg("span", "\u200b");
-            sg(a, pg("span", [b, document.createTextNode("x")])), 0 != a.firstChild.offsetHeight && (Eg = b.offsetWidth <= 1 && b.offsetHeight > 2 && !(d && 8 > e))
-        }
-        var c = Eg ? pg("span", "\u200b") : pg("span", "\xa0", null, "display: inline-block; width: 1px; margin-right: -1px");
-        return c.setAttribute("cm-text", ""), c
-    }
-
-    function Hg(a) {
-        if (oldff) return false;
-        if (null != Gg) return Gg;
-        var b = sg(a, document.createTextNode("A\u062eA")),
-            c = qg(b, 0, 1)
-            .getBoundingClientRect();
-        if (!c || c.left == c.right) return !1;
-        var d = qg(b, 1, 2)
-            .getBoundingClientRect();
-        return Gg = d.right - c.right < 3
-    }
-
-    function Mg(a) {
-        if (null != Lg) return Lg;
-        var b = sg(a, pg("span", "x")),
-            c = b.getBoundingClientRect(),
-            d = qg(b, 0, 1)
-            .getBoundingClientRect();
-        return Lg = Math.abs(c.left - d.left) > 1
-    }
-
-    function Og(a, b, c, d) {
-        if (!a) return d(b, c, "ltr");
-        for (var e = !1, f = 0; f < a.length; ++f) {
-            var g = a[f];
-            (g.from < c && g.to > b || b == c && g.to == b) && (d(Math.max(g.from, b), Math.min(g.to, c), 1 == g.level ? "rtl" : "ltr"), e = !0)
-        }
-        e || d(b, c, "ltr")
-    }
-
-    function Pg(a) {
-        return a.level % 2 ? a.to : a.from
-    }
-
-    function Qg(a) {
-        return a.level % 2 ? a.from : a.to
-    }
-
-    function Rg(a) {
-        var b = nf(a);
-        return b ? Pg(b[0]) : 0
-    }
-
-    function Sg(a) {
-        var b = nf(a);
-        return b ? Qg(bg(b)) : a.text.length
-    }
-
-    function Tg(a, b) {
-        var c = ff(a.doc, b),
-            d = se(c);
-        d != c && (b = kf(d));
-        var e = nf(d),
-            f = e ? e[0].level % 2 ? Sg(d) : Rg(d) : 0;
-        return oa(b, f)
-    }
-
-    function Ug(a, b) {
-        for (var c, d = ff(a.doc, b); c = qe(d);) d = c.find(1, !0)
-            .line, b = null;
-        var e = nf(d),
-            f = e ? e[0].level % 2 ? Rg(d) : Sg(d) : d.text.length;
-        return oa(null == b ? kf(d) : b, f)
-    }
-
-    function Vg(a, b) {
-        var c = Tg(a, b.line),
-            d = ff(a.doc, c.line),
-            e = nf(d);
-        if (!e || 0 == e[0].level) {
-            var f = Math.max(0, d.text.search(/\S/)),
-                g = b.line == c.line && b.ch <= f && b.ch;
-            return oa(c.line, g ? 0 : f)
-        }
-        return c
-    }
-
-    function Wg(a, b, c) {
-        var d = a[0].level;
-        return b == d ? !0 : c == d ? !1 : c > b
-    }
-
-    function Yg(a, b) {
-        Xg = null;
-        for (var d, c = 0; c < a.length; ++c) {
-            var e = a[c];
-            if (e.from < b && e.to > b) return c;
-            if (e.from == b || e.to == b) {
-                if (null != d) return Wg(a, e.level, a[d].level) ? (e.from != e.to && (Xg = d), c) : (e.from != e.to && (Xg = c), d);
-                d = c
-            }
-        }
-        return d
-    }
-
-    function Zg(a, b, c, d) {
-        if (!d) return b + c;
-        do b += c; while (b > 0 && og(a.text.charAt(b)));
-        return b
-    }
-
-    function $g(a, b, c, d) {
-        var e = nf(a);
-        if (!e) return _g(a, b, c, d);
-        for (var f = Yg(e, b), g = e[f], h = Zg(a, b, g.level % 2 ? -c : c, d);;) {
-            if (h > g.from && h < g.to) return h;
-            if (h == g.from || h == g.to) return Yg(e, h) == f ? h : (g = e[f += c], c > 0 == g.level % 2 ? g.to : g.from);
-            if (g = e[f += c], !g) return null;
-            h = c > 0 == g.level % 2 ? Zg(a, g.to, -1, d) : Zg(a, g.from, 1, d)
-        }
-    }
-
-    function _g(a, b, c, d) {
-        var e = b + c;
-        if (d)
-            for (; e > 0 && og(a.text.charAt(e));) e += c;
-        return 0 > e || e > a.text.length ? null : e
-    }
-    var a = /gecko\/\d/i.test(navigator.userAgent),
-        b = /MSIE \d/.test(navigator.userAgent),
-        c = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),
-        d = b || c,
-        e = d && (b ? document.documentMode || 6 : c[1]),
-        f = /WebKit\//.test(navigator.userAgent),
-        g = f && /Qt\/\d+\.\d+/.test(navigator.userAgent),
-        h = /Chrome\//.test(navigator.userAgent),
-        i = /Opera\//.test(navigator.userAgent),
-        j = /Apple Computer/.test(navigator.vendor),
-        k = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
-        l = /PhantomJS/.test(navigator.userAgent),
-        m = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent),
-        n = m || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),
-        o = m || /Mac/.test(navigator.platform),
-        p = /win/i.test(navigator.platform),
-        q = i && navigator.userAgent.match(/Version\/(\d*\.\d*)/),
-        oldff = /Firefox\/([1-3])\./i.test(navigator.userAgent);
-    q && (q = Number(q[1])), q && q >= 15 && (i = !1, f = !0);
-    var r = o && (g || i && (null == q || 12.11 > q)),
-        s = a || d && e >= 9,
-        t = !1,
-        u = !1;
-    K.prototype = hg({
-        update: function (a) {
-            var b = a.scrollWidth > a.clientWidth + 1,
-                c = a.scrollHeight > a.clientHeight + 1,
-                d = a.nativeBarWidth;
-            if (c) {
-                this.vert.style.display = "block", this.vert.style.bottom = b ? d + "px" : "0";
-                var e = a.viewHeight - (b ? d : 0);
-                this.vert.firstChild.style.height = Math.max(0, a.scrollHeight - a.clientHeight + e) + "px"
-            } else this.vert.style.display = "", this.vert.firstChild.style.height = "0";
-            if (b) {
-                this.horiz.style.display = "block", this.horiz.style.right = c ? d + "px" : "0", this.horiz.style.left = a.barLeft + "px";
-                var f = a.viewWidth - a.barLeft - (c ? d : 0);
-                this.horiz.firstChild.style.width = a.scrollWidth - a.clientWidth + f + "px"
-            } else this.horiz.style.display = "", this.horiz.firstChild.style.width = "0";
-            return !this.checkedOverlay && a.clientHeight > 0 && (0 == d && this.overlayHack(), this.checkedOverlay = !0), {
-                right: c ? d : 0,
-                bottom: b ? d : 0
-            }
-        },
-        setScrollLeft: function (a) {
-            this.horiz.scrollLeft != a && (this.horiz.scrollLeft = a)
-        },
-        setScrollTop: function (a) {
-            this.vert.scrollTop != a && (this.vert.scrollTop = a)
-        },
-        overlayHack: function () {
-            var a = o && !k ? "12px" : "18px";
-            this.horiz.style.minHeight = this.vert.style.minWidth = a;
-            var b = this,
-                c = function (a) {
-                    Hf(a) != b.vert && Hf(a) != b.horiz && dc(b.cm, uc)(a)
-                };
-            Jf(this.vert, "mousedown", c), Jf(this.horiz, "mousedown", c)
-        },
-        clear: function () {
-            var a = this.horiz.parentNode;
-            a.removeChild(this.horiz), a.removeChild(this.vert)
-        }
-    }, K.prototype), L.prototype = hg({
-        update: function () {
-            return {
-                bottom: 0,
-                right: 0
-            }
-        },
-        setScrollLeft: function () {},
-        setScrollTop: function () {},
-        clear: function () {}
-    }, L.prototype), v.scrollbarModel = {
-        "native": K,
-        "null": L
-    }, U.prototype.signal = function (a, b) {
-        Rf(a, b) && this.events.push(arguments)
-    }, U.prototype.finish = function () {
-        for (var a = 0; a < this.events.length; a++) Lf.apply(null, this.events[a])
-    };
-    var oa = v.Pos = function (a, b) {
-            return this instanceof oa ? (this.line = a, void(this.ch = b)) : new oa(a, b)
-        },
-        pa = v.cmpPos = function (a, b) {
-            return a.line - b.line || a.ch - b.ch
-        },
-        va = null;
-    Ba.prototype = hg({
-        init: function (a) {
-            function h(a) {
-                if (c.somethingSelected()) va = c.getSelections(), b.inaccurateSelection && (b.prevInput = "", b.inaccurateSelection = !1, g.value = va.join("\n"), cg(g));
-                else {
-                    if (!c.options.lineWiseCopyCut) return;
-                    var d = za(c);
-                    va = d.text, "cut" == a.type ? c.setSelections(d.ranges, null, Vf) : (b.prevInput = "", g.value = d.text.join("\n"), cg(g))
-                }
-                "cut" == a.type && (c.state.cutIncoming = !0)
-            }
-            var b = this,
-                c = this.cm,
-                f = this.wrapper = Ca(),
-                g = this.textarea = f.firstChild;
-            a.wrapper.insertBefore(f, a.wrapper.firstChild), m && (g.style.width = "0px"), Jf(g, "input", function () {
-                d && e >= 9 && b.hasSelection && (b.hasSelection = null), b.poll()
-            }), Jf(g, "paste", function (a) {
-                return xa(a, c) ? !0 : (c.state.pasteIncoming = !0, void b.fastPoll())
-            }), Jf(g, "cut", h), Jf(g, "copy", h), Jf(a.scroller, "paste", function (d) {
-                sc(a, d) || (c.state.pasteIncoming = !0, b.focus())
-            }), Jf(a.lineSpace, "selectstart", function (b) {
-                sc(a, b) || Df(b)
-            }), Jf(g, "compositionstart", function () {
-                var a = c.getCursor("from");
-                b.composing = {
-                    start: a,
-                    range: c.markText(a, c.getCursor("to"), {
-                        className: "CodeMirror-composing"
-                    })
-                }
-            }), Jf(g, "compositionend", function () {
-                b.composing && (b.poll(), b.composing.range.clear(), b.composing = null)
-            })
-        },
-        prepareSelection: function () {
-            var a = this.cm,
-                b = a.display,
-                c = a.doc,
-                d = eb(a);
-            if (a.options.moveInputWithCursor) {
-                var e = Lb(a, c.sel.primary()
-                        .head, "div"),
-                    f = b.wrapper.getBoundingClientRect(),
-                    g = b.lineDiv.getBoundingClientRect();
-                d.teTop = Math.max(0, Math.min(b.wrapper.clientHeight - 10, e.top + g.top - f.top)), d.teLeft = Math.max(0, Math.min(b.wrapper.clientWidth - 10, e.left + g.left - f.left))
-            }
-            return d
-        },
-        showSelection: function (a) {
-            var b = this.cm,
-                c = b.display;
-            sg(c.cursorDiv, a.cursors), sg(c.selectionDiv, a.selection), null != a.teTop && (this.wrapper.style.top = a.teTop + "px", this.wrapper.style.left = a.teLeft + "px")
-        },
-        reset: function (a) {
-            if (!this.contextMenuPending) {
-                var b, c, f = this.cm,
-                    g = f.doc;
-                if (f.somethingSelected()) {
-                    this.prevInput = "";
-                    var h = g.sel.primary();
-                    b = Kg && (h.to()
-                        .line - h.from()
-                        .line > 100 || (c = f.getSelection())
-                        .length > 1e3);
-                    var i = b ? "-" : c || f.getSelection();
-                    this.textarea.value = i, f.state.focused && cg(this.textarea), d && e >= 9 && (this.hasSelection = i)
-                } else a || (this.prevInput = this.textarea.value = "", d && e >= 9 && (this.hasSelection = null));
-                this.inaccurateSelection = b
-            }
-        },
-        getField: function () {
-            return this.textarea
-        },
-        supportsTouch: function () {
-            return !1
-        },
-        focus: function () {
-            if ("nocursor" != this.cm.options.readOnly && (!n || ug() != this.textarea)) try {
-                this.textarea.focus()
-            } catch (a) {}
-        },
-        blur: function () {
-            this.textarea.blur()
-        },
-        resetPosition: function () {
-            this.wrapper.style.top = this.wrapper.style.left = 0
-        },
-        receivedFocus: function () {
-            this.slowPoll()
-        },
-        slowPoll: function () {
-            var a = this;
-            a.pollingFast || a.polling.set(this.cm.options.pollInterval, function () {
-                a.poll(), a.cm.state.focused && a.slowPoll()
-            })
-        },
-        fastPoll: function () {
-            function c() {
-                var d = b.poll();
-                d || a ? (b.pollingFast = !1, b.slowPoll()) : (a = !0, b.polling.set(60, c))
-            }
-            var a = !1,
-                b = this;
-            b.pollingFast = !0, b.polling.set(20, c)
-        },
-        poll: function () {
-            var a = this.cm,
-                b = this.textarea,
-                c = this.prevInput;
-            if (this.contextMenuPending || !a.state.focused || Jg(b) && !c && !this.composing || ua(a) || a.options.disableInput || a.state.keySeq) return !1;
-            var f = b.value;
-            if (f == c && !a.somethingSelected()) return !1;
-            if (d && e >= 9 && this.hasSelection === f || o && /[\uf700-\uf7ff]/.test(f)) return a.display.input.reset(), !1;
-            if (a.doc.sel == a.display.selForContextMenu) {
-                var g = f.charCodeAt(0);
-                if (8203 != g || c || (c = "\u200b"), 8666 == g) return this.reset(), this.cm.execCommand("undo")
-            }
-            for (var h = 0, i = Math.min(c.length, f.length); i > h && c.charCodeAt(h) == f.charCodeAt(h);) ++h;
-            var j = this;
-            return cc(a, function () {
-                wa(a, f.slice(h), c.length - h, null, j.composing ? "*compose" : null), f.length > 1e3 || f.indexOf("\n") > -1 ? b.value = j.prevInput = "" : j.prevInput = f, j.composing && (j.composing.range.clear(), j.composing.range = a.markText(j.composing.start, a.getCursor("to"), {
-                    className: "CodeMirror-composing"
-                }))
-            }), !0
-        },
-        ensurePolled: function () {
-            this.pollingFast && this.poll() && (this.pollingFast = !1)
-        },
-        onKeyPress: function () {
-            d && e >= 9 && (this.hasSelection = null), this.fastPoll()
-        },
-        onContextMenu: function (a) {
-            function o() {
-                if (null != h.selectionStart) {
-                    var a = c.somethingSelected(),
-                        d = "\u200b" + (a ? h.value : "");
-                    h.value = "\u21da", h.value = d, b.prevInput = a ? "" : "\u200b", h.selectionStart = 1, h.selectionEnd = d.length, g.selForContextMenu = c.doc.sel
-                }
-            }
-
-            function p() {
-                if (b.contextMenuPending = !1, b.wrapper.style.position = "relative", h.style.cssText = m, d && 9 > e && g.scrollbars.setScrollTop(g.scroller.scrollTop = k), null != h.selectionStart) {
-                    (!d || d && 9 > e) && o();
-                    var a = 0,
-                        f = function () {
-                            g.selForContextMenu == c.doc.sel && 0 == h.selectionStart && h.selectionEnd > 0 && "\u200b" == b.prevInput ? dc(c, Ld.selectAll)(c) : a++ < 10 ? g.detectingSelectAll = setTimeout(f, 500) : g.input.reset()
-                        };
-                    g.detectingSelectAll = setTimeout(f, 200)
-                }
-            }
-            var b = this,
-                c = b.cm,
-                g = c.display,
-                h = b.textarea,
-                j = tc(c, a),
-                k = g.scroller.scrollTop;
-            if (j && !i) {
-                var l = c.options.resetSelectionOnContextMenu;
-                l && -1 == c.doc.sel.contains(j) && dc(c, Za)(c.doc, Ma(j), Vf);
-                var m = h.style.cssText;
-                if (b.wrapper.style.position = "absolute", h.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (a.clientY - 5) + "px; left: " + (a.clientX - 5) + "px; z-index: 1000; background: " + (d ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);", f) var n = window.scrollY;
-                if (g.input.focus(), f && window.scrollTo(null, n), g.input.reset(), c.somethingSelected() || (h.value = b.prevInput = " "), b.contextMenuPending = !0, g.selForContextMenu = c.doc.sel, clearTimeout(g.detectingSelectAll), d && e >= 9 && o(), s) {
-                    Gf(a);
-                    var q = function () {
-                        Kf(window, "mouseup", q), setTimeout(p, 20)
-                    };
-                    Jf(window, "mouseup", q)
-                } else setTimeout(p, 50)
-            }
-        },
-        setUneditable: fg,
-        needsContentAttribute: !1
-    }, Ba.prototype), Da.prototype = hg({
-        init: function (a) {
-            function e(a) {
-                if (c.somethingSelected()) va = c.getSelections(), "cut" == a.type && c.replaceSelection("", null, "cut");
-                else {
-                    if (!c.options.lineWiseCopyCut) return;
-                    var b = za(c);
-                    va = b.text, "cut" == a.type && c.operation(function () {
-                        c.setSelections(b.ranges, 0, Vf), c.replaceSelection("", null, "cut")
-                    })
-                }
-                if (a.clipboardData && !m) a.preventDefault(), a.clipboardData.clearData(), a.clipboardData.setData("text/plain", va.join("\n"));
-                else {
-                    var d = Ca(),
-                        e = d.firstChild;
-                    c.display.lineSpace.insertBefore(d, c.display.lineSpace.firstChild), e.value = va.join("\n");
-                    var f = document.activeElement;
-                    cg(e), setTimeout(function () {
-                        c.display.lineSpace.removeChild(d), f.focus()
-                    }, 50)
-                }
-            }
-            var b = this,
-                c = b.cm,
-                d = b.div = a.lineDiv;
-            d.contentEditable = "true", Aa(d), Jf(d, "paste", function (a) {
-                xa(a, c)
-            }), Jf(d, "compositionstart", function (a) {
-                var d = a.data;
-                if (b.composing = {
-                        sel: c.doc.sel,
-                        data: d,
-                        startData: d
-                    }, d) {
-                    var e = c.doc.sel.primary(),
-                        f = c.getLine(e.head.line),
-                        g = f.indexOf(d, Math.max(0, e.head.ch - d.length));
-                    g > -1 && g <= e.head.ch && (b.composing.sel = Ma(oa(e.head.line, g), oa(e.head.line, g + d.length)))
-                }
-            }), Jf(d, "compositionupdate", function (a) {
-                b.composing.data = a.data
-            }), Jf(d, "compositionend", function (a) {
-                var c = b.composing;
-                c && (a.data == c.startData || /\u200b/.test(a.data) || (c.data = a.data), setTimeout(function () {
-                    c.handled || b.applyComposition(c), b.composing == c && (b.composing = null)
-                }, 50))
-            }), Jf(d, "touchstart", function () {
-                b.forceCompositionEnd()
-            }), Jf(d, "input", function () {
-                b.composing || b.pollContent() || cc(b.cm, function () {
-                    ic(c)
-                })
-            }), Jf(d, "copy", e), Jf(d, "cut", e)
-        },
-        prepareSelection: function () {
-            var a = eb(this.cm, !1);
-            return a.focus = this.cm.state.focused, a
-        },
-        showSelection: function (a) {
-            a && this.cm.display.view.length && (a.focus && this.showPrimarySelection(), this.showMultipleSelections(a))
-        },
-        showPrimarySelection: function () {
-            var b = window.getSelection(),
-                c = this.cm.doc.sel.primary(),
-                d = Ga(this.cm, b.anchorNode, b.anchorOffset),
-                e = Ga(this.cm, b.focusNode, b.focusOffset);
-            if (!d || d.bad || !e || e.bad || 0 != pa(sa(d, e), c.from()) || 0 != pa(ra(d, e), c.to())) {
-                var f = Ea(this.cm, c.from()),
-                    g = Ea(this.cm, c.to());
-                if (f || g) {
-                    var h = this.cm.display.view,
-                        i = b.rangeCount && b.getRangeAt(0);
-                    if (f) {
-                        if (!g) {
-                            var j = h[h.length - 1].measure,
-                                k = j.maps ? j.maps[j.maps.length - 1] : j.map;
-                            g = {
-                                node: k[k.length - 1],
-                                offset: k[k.length - 2] - k[k.length - 3]
-                            }
-                        }
-                    } else f = {
-                        node: h[0].measure.map[2],
-                        offset: 0
-                    };
-                    try {
-                        var l = qg(f.node, f.offset, g.offset, g.node)
-                    } catch (m) {}
-                    l && (b.removeAllRanges(), b.addRange(l), i && null == b.anchorNode ? b.addRange(i) : a && this.startGracePeriod()), this.rememberSelection()
-                }
-            }
-        },
-        startGracePeriod: function () {
-            var a = this;
-            clearTimeout(this.gracePeriod), this.gracePeriod = setTimeout(function () {
-                a.gracePeriod = !1, a.selectionChanged() && a.cm.operation(function () {
-                    a.cm.curOp.selectionChanged = !0
-                })
-            }, 20)
-        },
-        showMultipleSelections: function (a) {
-            sg(this.cm.display.cursorDiv, a.cursors), sg(this.cm.display.selectionDiv, a.selection)
-        },
-        rememberSelection: function () {
-            var a = window.getSelection();
-            this.lastAnchorNode = a.anchorNode, this.lastAnchorOffset = a.anchorOffset, this.lastFocusNode = a.focusNode, this.lastFocusOffset = a.focusOffset
-        },
-        selectionInEditor: function () {
-            var a = window.getSelection();
-            if (!a.rangeCount) return !1;
-            var b = a.getRangeAt(0)
-                .commonAncestorContainer;
-            return tg(this.div, b)
-        },
-        focus: function () {
-            "nocursor" != this.cm.options.readOnly && this.div.focus()
-        },
-        blur: function () {
-            this.div.blur()
-        },
-        getField: function () {
-            return this.div
-        },
-        supportsTouch: function () {
-            return !0
-        },
-        receivedFocus: function () {
-            function b() {
-                a.cm.state.focused && (a.pollSelection(), a.polling.set(a.cm.options.pollInterval, b))
-            }
-            var a = this;
-            this.selectionInEditor() ? this.pollSelection() : cc(this.cm, function () {
-                a.cm.curOp.selectionChanged = !0
-            }), this.polling.set(this.cm.options.pollInterval, b)
-        },
-        selectionChanged: function () {
-            var a = window.getSelection();
-            return a.anchorNode != this.lastAnchorNode || a.anchorOffset != this.lastAnchorOffset || a.focusNode != this.lastFocusNode || a.focusOffset != this.lastFocusOffset
-        },
-        pollSelection: function () {
-            if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
-                var a = window.getSelection(),
-                    b = this.cm;
-                this.rememberSelection();
-                var c = Ga(b, a.anchorNode, a.anchorOffset),
-                    d = Ga(b, a.focusNode, a.focusOffset);
-                c && d && cc(b, function () {
-                    Za(b.doc, Ma(c, d), Vf), (c.bad || d.bad) && (b.curOp.selectionChanged = !0)
-                })
-            }
-        },
-        pollContent: function () {
-            var a = this.cm,
-                b = a.display,
-                c = a.doc.sel.primary(),
-                d = c.from(),
-                e = c.to();
-            if (d.line < b.viewFrom || e.line > b.viewTo - 1) return !1;
-            var f;
-            if (d.line == b.viewFrom || 0 == (f = lc(a, d.line))) var g = kf(b.view[0].line),
-                h = b.view[0].node;
-            else var g = kf(b.view[f].line),
-                h = b.view[f - 1].node.nextSibling;
-            var i = lc(a, e.line);
-            if (i == b.view.length - 1) var j = b.viewTo - 1,
-                k = b.lineDiv.lastChild;
-            else var j = kf(b.view[i + 1].line) - 1,
-                k = b.view[i + 1].node.previousSibling;
-            for (var l = a.doc.splitLines(Ia(a, h, k, g, j)), m = gf(a.doc, oa(g, 0), oa(j, ff(a.doc, j)
-                    .text.length)); l.length > 1 && m.length > 1;)
-                if (bg(l) == bg(m)) l.pop(), m.pop(), j--;
-                else {
-                    if (l[0] != m[0]) break;
-                    l.shift(), m.shift(), g++
-                }
-            for (var n = 0, o = 0, p = l[0], q = m[0], r = Math.min(p.length, q.length); r > n && p.charCodeAt(n) == q.charCodeAt(n);) ++n;
-            for (var s = bg(l), t = bg(m), u = Math.min(s.length - (1 == l.length ? n : 0), t.length - (1 == m.length ? n : 0)); u > o && s.charCodeAt(s.length - o - 1) == t.charCodeAt(t.length - o - 1);) ++o;
-            l[l.length - 1] = s.slice(0, s.length - o), l[0] = l[0].slice(n);
-            var v = oa(g, n),
-                w = oa(j, m.length ? bg(m)
-                    .length - o : 0);
-            return l.length > 1 || l[0] || pa(v, w) ? (nd(a.doc, l, v, w, "+input"), !0) : void 0
-        },
-        ensurePolled: function () {
-            this.forceCompositionEnd()
-        },
-        reset: function () {
-            this.forceCompositionEnd()
-        },
-        forceCompositionEnd: function () {
-            this.composing && !this.composing.handled && (this.applyComposition(this.composing), this.composing.handled = !0, this.div.blur(), this.div.focus())
-        },
-        applyComposition: function (a) {
-            a.data && a.data != a.startData && dc(this.cm, wa)(this.cm, a.data, 0, a.sel)
-        },
-        setUneditable: function (a) {
-            a.setAttribute("contenteditable", "false")
-        },
-        onKeyPress: function (a) {
-            a.preventDefault(), dc(this.cm, wa)(this.cm, String.fromCharCode(null == a.charCode ? a.keyCode : a.charCode), 0)
-        },
-        onContextMenu: fg,
-        resetPosition: fg,
-        needsContentAttribute: !0
-    }, Da.prototype), v.inputStyles = {
-        textarea: Ba,
-        contenteditable: Da
-    }, Ja.prototype = {
-        primary: function () {
-            return this.ranges[this.primIndex]
-        },
-        equals: function (a) {
-            if (a == this) return !0;
-            if (a.primIndex != this.primIndex || a.ranges.length != this.ranges.length) return !1;
-            for (var b = 0; b < this.ranges.length; b++) {
-                var c = this.ranges[b],
-                    d = a.ranges[b];
-                if (0 != pa(c.anchor, d.anchor) || 0 != pa(c.head, d.head)) return !1
-            }
-            return !0
-        },
-        deepCopy: function () {
-            for (var a = [], b = 0; b < this.ranges.length; b++) a[b] = new Ka(qa(this.ranges[b].anchor), qa(this.ranges[b].head));
-            return new Ja(a, this.primIndex)
-        },
-        somethingSelected: function () {
-            for (var a = 0; a < this.ranges.length; a++)
-                if (!this.ranges[a].empty()) return !0;
-            return !1
-        },
-        contains: function (a, b) {
-            b || (b = a);
-            for (var c = 0; c < this.ranges.length; c++) {
-                var d = this.ranges[c];
-                if (pa(b, d.from()) >= 0 && pa(a, d.to()) <= 0) return c
-            }
-            return -1
-        }
-    }, Ka.prototype = {
-        from: function () {
-            return sa(this.anchor, this.head)
-        },
-        to: function () {
-            return ra(this.anchor, this.head)
-        },
-        empty: function () {
-            return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch
-        }
-    };
-    var Qb, vc, wc, zb = {
-            left: 0,
-            right: 0,
-            top: 0,
-            bottom: 0
-        },
-        Tb = null,
-        Ub = 0,
-        Cc = 0,
-        Jc = 0,
-        Kc = null;
-    d ? Kc = -.53 : a ? Kc = 15 : h ? Kc = -.7 : j && (Kc = -1 / 3);
-    var Lc = function (a) {
-        var b = a.wheelDeltaX,
-            c = a.wheelDeltaY;
-        return null == b && a.detail && a.axis == a.HORIZONTAL_AXIS && (b = a.detail), null == c && a.detail && a.axis == a.VERTICAL_AXIS ? c = a.detail : null == c && (c = a.wheelDelta), {
-            x: b,
-            y: c
-        }
-    };
-    v.wheelEventPixels = function (a) {
-        var b = Lc(a);
-        return b.x *= Kc, b.y *= Kc, b
-    };
-    var Pc = new Yf,
-        Tc = null,
-        bd = v.changeEnd = function (a) {
-            return a.text ? oa(a.from.line + a.text.length - 1, bg(a.text)
-                .length + (1 == a.text.length ? a.from.ch : 0)) : a.to
-        };
-    v.prototype = {
-        constructor: v,
-        focus: function () {
-            window.focus(), this.display.input.focus()
-        },
-        setOption: function (a, b) {
-            var c = this.options,
-                d = c[a];
-            (c[a] != b || "mode" == a) && (c[a] = b, Bd.hasOwnProperty(a) && dc(this, Bd[a])(this, b, d))
-        },
-        getOption: function (a) {
-            return this.options[a]
-        },
-        getDoc: function () {
-            return this.doc
-        },
-        addKeyMap: function (a, b) {
-            this.state.keyMaps[b ? "push" : "unshift"](Rd(a))
-        },
-        removeKeyMap: function (a) {
-            for (var b = this.state.keyMaps, c = 0; c < b.length; ++c)
-                if (b[c] == a || b[c].name == a) return b.splice(c, 1), !0
-        },
-        addOverlay: ec(function (a, b) {
-            var c = a.token ? a : v.getMode(this.options, a);
-            if (c.startState) throw new Error("Overlays may not be stateful.");
-            this.state.overlays.push({
-                mode: c,
-                modeSpec: a,
-                opaque: b && b.opaque
-            }), this.state.modeGen++, ic(this)
-        }),
-        removeOverlay: ec(function (a) {
-            for (var b = this.state.overlays, c = 0; c < b.length; ++c) {
-                var d = b[c].modeSpec;
-                if (d == a || "string" == typeof a && d.name == a) return b.splice(c, 1), this.state.modeGen++, void ic(this)
-            }
-        }),
-        indentLine: ec(function (a, b, c) {
-            "string" != typeof b && "number" != typeof b && (b = null == b ? this.options.smartIndent ? "smart" : "prev" : b ? "add" : "subtract"), Qa(this.doc, a) && vd(this, a, b, c)
-        }),
-        indentSelection: ec(function (a) {
-            for (var b = this.doc.sel.ranges, c = -1, d = 0; d < b.length; d++) {
-                var e = b[d];
-                if (e.empty()) e.head.line > c && (vd(this, e.head.line, a, !0), c = e.head.line, d == this.doc.sel.primIndex && td(this));
-                else {
-                    var f = e.from(),
-                        g = e.to(),
-                        h = Math.max(c, f.line);
-                    c = Math.min(this.lastLine(), g.line - (g.ch ? 0 : 1)) + 1;
-                    for (var i = h; c > i; ++i) vd(this, i, a);
-                    var j = this.doc.sel.ranges;
-                    0 == f.ch && b.length == j.length && j[d].from()
-                        .ch > 0 && Va(this.doc, d, new Ka(f, j[d].to()), Vf)
-                }
-            }
-        }),
-        getTokenAt: function (a, b) {
-            return Ie(this, a, b)
-        },
-        getLineTokens: function (a, b) {
-            return Ie(this, oa(a), b, !0)
-        },
-        getTokenTypeAt: function (a) {
-            a = Oa(this.doc, a);
-            var f, b = Le(this, ff(this.doc, a.line)),
-                c = 0,
-                d = (b.length - 1) / 2,
-                e = a.ch;
-            if (0 == e) f = b[2];
-            else
-                for (;;) {
-                    var g = c + d >> 1;
-                    if ((g ? b[2 * g - 1] : 0) >= e) d = g;
-                    else {
-                        if (!(b[2 * g + 1] < e)) {
-                            f = b[2 * g + 2];
-                            break
-                        }
-                        c = g + 1
-                    }
-                }
-            var h = f ? f.indexOf("cm-overlay ") : -1;
-            return 0 > h ? f : 0 == h ? null : f.slice(0, h - 1)
-        },
-        getModeAt: function (a) {
-            var b = this.doc.mode;
-            return b.innerMode ? v.innerMode(b, this.getTokenAt(a)
-                    .state)
-                .mode : b
-        },
-        getHelper: function (a, b) {
-            return this.getHelpers(a, b)[0]
-        },
-        getHelpers: function (a, b) {
-            var c = [];
-            if (!Id.hasOwnProperty(b)) return c;
-            var d = Id[b],
-                e = this.getModeAt(a);
-            if ("string" == typeof e[b]) d[e[b]] && c.push(d[e[b]]);
-            else if (e[b])
-                for (var f = 0; f < e[b].length; f++) {
-                    var g = d[e[b][f]];
-                    g && c.push(g)
-                } else e.helperType && d[e.helperType] ? c.push(d[e.helperType]) : d[e.name] && c.push(d[e.name]);
-            for (var f = 0; f < d._global.length; f++) {
-                var h = d._global[f];
-                h.pred(e, this) && -1 == dg(c, h.val) && c.push(h.val)
-            }
-            return c
-        },
-        getStateAfter: function (a, b) {
-            var c = this.doc;
-            return a = Na(c, null == a ? c.first + c.size - 1 : a), lb(this, a + 1, b)
-        },
-        cursorCoords: function (a, b) {
-            var c, d = this.doc.sel.primary();
-            return c = null == a ? d.head : "object" == typeof a ? Oa(this.doc, a) : a ? d.from() : d.to(), Lb(this, c, b || "page")
-        },
-        charCoords: function (a, b) {
-            return Kb(this, Oa(this.doc, a), b || "page")
-        },
-        coordsChar: function (a, b) {
-            return a = Jb(this, a, b || "page"), Ob(this, a.left, a.top)
-        },
-        lineAtHeight: function (a, b) {
-            return a = Jb(this, {
-                    top: a,
-                    left: 0
-                }, b || "page")
-                .top, lf(this.doc, a + this.display.viewOffset)
-        },
-        heightAtLine: function (a, b) {
-            var d, c = !1;
-            if ("number" == typeof a) {
-                var e = this.doc.first + this.doc.size - 1;
-                a < this.doc.first ? a = this.doc.first : a > e && (a = e, c = !0), d = ff(this.doc, a)
-            } else d = a;
-            return Ib(this, d, {
-                    top: 0,
-                    left: 0
-                }, b || "page")
-                .top + (c ? this.doc.height - mf(d) : 0)
-        },
-        defaultTextHeight: function () {
-            return Rb(this.display)
-        },
-        defaultCharWidth: function () {
-            return Sb(this.display)
-        },
-        setGutterMarker: ec(function (a, b, c) {
-            return wd(this.doc, a, "gutter", function (a) {
-                var d = a.gutterMarkers || (a.gutterMarkers = {});
-                return d[b] = c, !c && mg(d) && (a.gutterMarkers = null), !0
-            })
-        }),
-        clearGutter: ec(function (a) {
-            var b = this,
-                c = b.doc,
-                d = c.first;
-            c.iter(function (c) {
-                c.gutterMarkers && c.gutterMarkers[a] && (c.gutterMarkers[a] = null, jc(b, d, "gutter"), mg(c.gutterMarkers) && (c.gutterMarkers = null)), ++d
-            })
-        }),
-        lineInfo: function (a) {
-            if ("number" == typeof a) {
-                if (!Qa(this.doc, a)) return null;
-                var b = a;
-                if (a = ff(this.doc, a), !a) return null
-            } else {
-                var b = kf(a);
-                if (null == b) return null
-            }
-            return {
-                line: b,
-                handle: a,
-                text: a.text,
-                gutterMarkers: a.gutterMarkers,
-                textClass: a.textClass,
-                bgClass: a.bgClass,
-                wrapClass: a.wrapClass,
-                widgets: a.widgets
-            }
-        },
-        getViewport: function () {
-            return {
-                from: this.display.viewFrom,
-                to: this.display.viewTo
-            }
-        },
-        addWidget: function (a, b, c, d, e) {
-            var f = this.display;
-            a = Lb(this, Oa(this.doc, a));
-            var g = a.bottom,
-                h = a.left;
-            if (b.style.position = "absolute", b.setAttribute("cm-ignore-events", "true"), this.display.input.setUneditable(b), f.sizer.appendChild(b), "over" == d) g = a.top;
-            else if ("above" == d || "near" == d) {
-                var i = Math.max(f.wrapper.clientHeight, this.doc.height),
-                    j = Math.max(f.sizer.clientWidth, f.lineSpace.clientWidth);
-                ("above" == d || a.bottom + b.offsetHeight > i) && a.top > b.offsetHeight ? g = a.top - b.offsetHeight : a.bottom + b.offsetHeight <= i && (g = a.bottom), h + b.offsetWidth > j && (h = j - b.offsetWidth)
-            }
-            b.style.top = g + "px", b.style.left = b.style.right = "", "right" == e ? (h = f.sizer.clientWidth - b.offsetWidth, b.style.right = "0px") : ("left" == e ? h = 0 : "middle" == e && (h = (f.sizer.clientWidth - b.offsetWidth) / 2), b.style.left = h + "px"), c && qd(this, h, g, h + b.offsetWidth, g + b.offsetHeight)
-        },
-        triggerOnKeyDown: ec(Uc),
-        triggerOnKeyPress: ec(Xc),
-        triggerOnKeyUp: Wc,
-        execCommand: function (a) {
-            return Ld.hasOwnProperty(a) ? Ld[a].call(null, this) : void 0
-        },
-        triggerElectric: ec(function (a) {
-            ya(this, a)
-        }),
-        findPosH: function (a, b, c, d) {
-            var e = 1;
-            0 > b && (e = -1, b = -b);
-            for (var f = 0, g = Oa(this.doc, a); b > f && (g = yd(this.doc, g, e, c, d), !g.hitSide); ++f);
-            return g
-        },
-        moveH: ec(function (a, b) {
-            var c = this;
-            c.extendSelectionsBy(function (d) {
-                return c.display.shift || c.doc.extend || d.empty() ? yd(c.doc, d.head, a, b, c.options.rtlMoveVisually) : 0 > a ? d.from() : d.to()
-            }, Xf)
-        }),
-        deleteH: ec(function (a, b) {
-            var c = this.doc.sel,
-                d = this.doc;
-            c.somethingSelected() ? d.replaceSelection("", null, "+delete") : xd(this, function (c) {
-                var e = yd(d, c.head, a, b, !1);
-                return 0 > a ? {
-                    from: e,
-                    to: c.head
-                } : {
-                    from: c.head,
-                    to: e
-                }
-            })
-        }),
-        findPosV: function (a, b, c, d) {
-            var e = 1,
-                f = d;
-            0 > b && (e = -1, b = -b);
-            for (var g = 0, h = Oa(this.doc, a); b > g; ++g) {
-                var i = Lb(this, h, "div");
-                if (null == f ? f = i.left : i.left = f, h = zd(this, i, e, c), h.hitSide) break
-            }
-            return h
-        },
-        moveV: ec(function (a, b) {
-            var c = this,
-                d = this.doc,
-                e = [],
-                f = !c.display.shift && !d.extend && d.sel.somethingSelected();
-            if (d.extendSelectionsBy(function (g) {
-                    if (f) return 0 > a ? g.from() : g.to();
-                    var h = Lb(c, g.head, "div");
-                    null != g.goalColumn && (h.left = g.goalColumn), e.push(h.left);
-                    var i = zd(c, h, a, b);
-                    return "page" == b && g == d.sel.primary() && sd(c, null, Kb(c, i, "div")
-                        .top - h.top), i
-                }, Xf), e.length)
-                for (var g = 0; g < d.sel.ranges.length; g++) d.sel.ranges[g].goalColumn = e[g]
-        }),
-        findWordAt: function (a) {
-            var b = this.doc,
-                c = ff(b, a.line)
-                .text,
-                d = a.ch,
-                e = a.ch;
-            if (c) {
-                var f = this.getHelper(a, "wordChars");
-                (a.xRel < 0 || e == c.length) && d ? --d : ++e;
-                for (var g = c.charAt(d), h = lg(g, f) ? function (a) {
-                        return lg(a, f)
-                    } : /\s/.test(g) ? function (a) {
-                        return /\s/.test(a)
-                    } : function (a) {
-                        return !/\s/.test(a) && !lg(a)
-                    }; d > 0 && h(c.charAt(d - 1));) --d;
-                for (; e < c.length && h(c.charAt(e));) ++e
-            }
-            return new Ka(oa(a.line, d), oa(a.line, e))
-        },
-        toggleOverwrite: function (a) {
-            (null == a || a != this.state.overwrite) && ((this.state.overwrite = !this.state.overwrite) ? xg(this.display.cursorDiv, "CodeMirror-overwrite") : wg(this.display.cursorDiv, "CodeMirror-overwrite"), Lf(this, "overwriteToggle", this, this.state.overwrite))
-        },
-        hasFocus: function () {
-            return this.display.input.getField() == ug()
-        },
-        scrollTo: ec(function (a, b) {
-            (null != a || null != b) && ud(this), null != a && (this.curOp.scrollLeft = a), null != b && (this.curOp.scrollTop = b)
-        }),
-        getScrollInfo: function () {
-            var a = this.display.scroller;
-            return {
-                left: a.scrollLeft,
-                top: a.scrollTop,
-                height: a.scrollHeight - pb(this) - this.display.barHeight,
-                width: a.scrollWidth - pb(this) - this.display.barWidth,
-                clientHeight: rb(this),
-                clientWidth: qb(this)
-            }
-        },
-        scrollIntoView: ec(function (a, b) {
-            if (null == a ? (a = {
-                    from: this.doc.sel.primary()
-                        .head,
-                    to: null
-                }, null == b && (b = this.options.cursorScrollMargin)) : "number" == typeof a ? a = {
-                    from: oa(a, 0),
-                    to: null
-                } : null == a.from && (a = {
-                    from: a,
-                    to: null
-                }), a.to || (a.to = a.from), a.margin = b || 0, null != a.from.line) ud(this), this.curOp.scrollToPos = a;
-            else {
-                var c = rd(this, Math.min(a.from.left, a.to.left), Math.min(a.from.top, a.to.top) - a.margin, Math.max(a.from.right, a.to.right), Math.max(a.from.bottom, a.to.bottom) + a.margin);
-                this.scrollTo(c.scrollLeft, c.scrollTop)
-            }
-        }),
-        setSize: ec(function (a, b) {
-            function d(a) {
-                return "number" == typeof a || /^\d+$/.test(String(a)) ? a + "px" : a
-            }
-            var c = this;
-            null != a && (c.display.wrapper.style.width = d(a)), null != b && (c.display.wrapper.style.height = d(b)), c.options.lineWrapping && Eb(this);
-            var e = c.display.viewFrom;
-            c.doc.iter(e, c.display.viewTo, function (a) {
-                if (a.widgets)
-                    for (var b = 0; b < a.widgets.length; b++)
-                        if (a.widgets[b].noHScroll) {
-                            jc(c, e, "widget");
-                            break
-                        }++e
-            }), c.curOp.forceUpdate = !0, Lf(c, "refresh", this)
-        }),
-        operation: function (a) {
-            return cc(this, a)
-        },
-        refresh: ec(function () {
-            var a = this.display.cachedTextHeight;
-            ic(this), this.curOp.forceUpdate = !0, Fb(this), this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop), F(this), (null == a || Math.abs(a - Rb(this.display)) > .5) && B(this), Lf(this, "refresh", this)
-        }),
-        swapDoc: ec(function (a) {
-            var b = this.doc;
-            return b.cm = null, ef(this, a), Fb(this), this.display.input.reset(), this.scrollTo(a.scrollLeft, a.scrollTop), this.curOp.forceScroll = !0, Nf(this, "swapDoc", this, b), b
-        }),
-        getInputField: function () {
-            return this.display.input.getField()
-        },
-        getWrapperElement: function () {
-            return this.display.wrapper
-        },
-        getScrollerElement: function () {
-            return this.display.scroller
-        },
-        getGutterElement: function () {
-            return this.display.gutters
-        }
-    }, Sf(v);
-    var Ad = v.defaults = {},
-        Bd = v.optionHandlers = {},
-        Dd = v.Init = {
-            toString: function () {
-                return "CodeMirror.Init"
-            }
-        };
-    Cd("value", "", function (a, b) {
-        a.setValue(b)
-    }, !0), Cd("mode", null, function (a, b) {
-        a.doc.modeOption = b, x(a)
-    }, !0), Cd("indentUnit", 2, x, !0), Cd("indentWithTabs", !1), Cd("smartIndent", !0), Cd("tabSize", 4, function (a) {
-        y(a), Fb(a), ic(a)
-    }, !0), Cd("lineSeparator", null, function (a, b) {
-        if (a.doc.lineSep = b, b) {
-            var c = [],
-                d = a.doc.first;
-            a.doc.iter(function (a) {
-                for (var e = 0;;) {
-                    var f = a.text.indexOf(b, e);
-                    if (-1 == f) break;
-                    e = f + b.length, c.push(oa(d, f))
-                }
-                d++
-            });
-            for (var e = c.length - 1; e >= 0; e--) nd(a.doc, b, c[e], oa(c[e].line, c[e].ch + b.length))
-        }
-    }), Cd("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function (a, b, c) {
-        a.state.specialChars = new RegExp(b.source + (b.test("	") ? "" : "|	"), "g"), c != v.Init && a.refresh()
-    }), Cd("specialCharPlaceholder", Re, function (a) {
-        a.refresh()
-    }, !0), Cd("electricChars", !0), Cd("inputStyle", n ? "contenteditable" : "textarea", function () {
-        throw new Error("inputStyle can not (yet) be changed in a running editor")
-    }, !0), Cd("rtlMoveVisually", !p), Cd("wholeLineUpdateBefore", !0), Cd("theme", "default", function (a) {
-        C(a), D(a)
-    }, !0), Cd("keyMap", "default", function (a, b, c) {
-        var d = Rd(b),
-            e = c != v.Init && Rd(c);
-        e && e.detach && e.detach(a, d), d.attach && d.attach(a, e || null)
-    }), Cd("extraKeys", null), Cd("lineWrapping", !1, z, !0), Cd("gutters", [], function (a) {
-        I(a.options), D(a)
-    }, !0), Cd("fixedGutter", !0, function (a, b) {
-        a.display.gutters.style.left = b ? T(a.display) + "px" : "0", a.refresh()
-    }, !0), Cd("coverGutterNextToScrollbar", !1, function (a) {
-        N(a)
-    }, !0), Cd("scrollbarStyle", "native", function (a) {
-        M(a), N(a), a.display.scrollbars.setScrollTop(a.doc.scrollTop), a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)
-    }, !0), Cd("lineNumbers", !1, function (a) {
-        I(a.options), D(a)
-    }, !0), Cd("firstLineNumber", 1, D, !0), Cd("lineNumberFormatter", function (a) {
-        return a
-    }, D, !0), Cd("showCursorWhenSelecting", !1, db, !0), Cd("resetSelectionOnContextMenu", !0), Cd("lineWiseCopyCut", !0), Cd("readOnly", !1, function (a, b) {
-        "nocursor" == b ? ($c(a), a.display.input.blur(), a.display.disabled = !0) : (a.display.disabled = !1, b || a.display.input.reset())
-    }), Cd("disableInput", !1, function (a, b) {
-        b || a.display.input.reset()
-    }, !0), Cd("dragDrop", !0, qc), Cd("cursorBlinkRate", 530), Cd("cursorScrollMargin", 0), Cd("cursorHeight", 1, db, !0), Cd("singleCursorHeightPerLine", !0, db, !0), Cd("workTime", 100), Cd("workDelay", 100), Cd("flattenSpans", !0, y, !0), Cd("addModeClass", !1, y, !0), Cd("pollInterval", 100), Cd("undoDepth", 200, function (a, b) {
-        a.doc.history.undoDepth = b
-    }), Cd("historyEventDelay", 1250), Cd("viewportMargin", 10, function (a) {
-        a.refresh()
-    }, !0), Cd("maxHighlightLength", 1e4, y, !0), Cd("moveInputWithCursor", !0, function (a, b) {
-        b || a.display.input.resetPosition()
-    }), Cd("tabindex", null, function (a, b) {
-        a.display.input.getField()
-            .tabIndex = b || ""
-    }), Cd("autofocus", null);
-    var Ed = v.modes = {},
-        Fd = v.mimeModes = {};
-    v.defineMode = function (a, b) {
-        v.defaults.mode || "null" == a || (v.defaults.mode = a), arguments.length > 2 && (b.dependencies = Array.prototype.slice.call(arguments, 2)), Ed[a] = b
-    }, v.defineMIME = function (a, b) {
-        Fd[a] = b
-    }, v.resolveMode = function (a) {
-        if ("string" == typeof a && Fd.hasOwnProperty(a)) a = Fd[a];
-        else if (a && "string" == typeof a.name && Fd.hasOwnProperty(a.name)) {
-            var b = Fd[a.name];
-            "string" == typeof b && (b = {
-                name: b
-            }), a = gg(b, a), a.name = b.name
-        } else if ("string" == typeof a && /^[\w\-]+\/[\w\-]+\+xml$/.test(a)) return v.resolveMode("application/xml");
-        return "string" == typeof a ? {
-            name: a
-        } : a || {
-            name: "null"
-        }
-    }, v.getMode = function (a, b) {
-        var b = v.resolveMode(b),
-            c = Ed[b.name];
-        if (!c) return v.getMode(a, "text/plain");
-        var d = c(a, b);
-        if (Gd.hasOwnProperty(b.name)) {
-            var e = Gd[b.name];
-            for (var f in e) e.hasOwnProperty(f) && (d.hasOwnProperty(f) && (d["_" + f] = d[f]), d[f] = e[f])
-        }
-        if (d.name = b.name, b.helperType && (d.helperType = b.helperType), b.modeProps)
-            for (var f in b.modeProps) d[f] = b.modeProps[f];
-        return d
-    }, v.defineMode("null", function () {
-        return {
-            token: function (a) {
-                a.skipToEnd()
-            }
-        }
-    }), v.defineMIME("text/plain", "null");
-    var Gd = v.modeExtensions = {};
-    v.extendMode = function (a, b) {
-        var c = Gd.hasOwnProperty(a) ? Gd[a] : Gd[a] = {};
-        hg(b, c)
-    }, v.defineExtension = function (a, b) {
-        v.prototype[a] = b
-    }, v.defineDocExtension = function (a, b) {
-        af.prototype[a] = b
-    }, v.defineOption = Cd;
-    var Hd = [];
-    v.defineInitHook = function (a) {
-        Hd.push(a)
-    };
-    var Id = v.helpers = {};
-    v.registerHelper = function (a, b, c) {
-        Id.hasOwnProperty(a) || (Id[a] = v[a] = {
-            _global: []
-        }), Id[a][b] = c
-    }, v.registerGlobalHelper = function (a, b, c, d) {
-        v.registerHelper(a, b, d), Id[a]._global.push({
-            pred: c,
-            val: d
-        })
-    };
-    var Jd = v.copyState = function (a, b) {
-            if (b === !0) return b;
-            if (a.copyState) return a.copyState(b);
-            var c = {};
-            for (var d in b) {
-                var e = b[d];
-                e instanceof Array && (e = e.concat([])), c[d] = e
-            }
-            return c
-        },
-        Kd = v.startState = function (a, b, c) {
-            return a.startState ? a.startState(b, c) : !0
-        };
-    v.innerMode = function (a, b) {
-        for (; a.innerMode;) {
-            var c = a.innerMode(b);
-            if (!c || c.mode == a) break;
-            b = c.state, a = c.mode
-        }
-        return c || {
-            mode: a,
-            state: b
-        }
-    };
-    var Ld = v.commands = {
-            selectAll: function (a) {
-                a.setSelection(oa(a.firstLine(), 0), oa(a.lastLine()), Vf)
-            },
-            singleSelection: function (a) {
-                a.setSelection(a.getCursor("anchor"), a.getCursor("head"), Vf)
-            },
-            killLine: function (a) {
-                xd(a, function (b) {
-                    if (b.empty()) {
-                        var c = ff(a.doc, b.head.line)
-                            .text.length;
-                        return b.head.ch == c && b.head.line < a.lastLine() ? {
-                            from: b.head,
-                            to: oa(b.head.line + 1, 0)
-                        } : {
-                            from: b.head,
-                            to: oa(b.head.line, c)
-                        }
-                    }
-                    return {
-                        from: b.from(),
-                        to: b.to()
-                    }
-                })
-            },
-            deleteLine: function (a) {
-                xd(a, function (b) {
-                    return {
-                        from: oa(b.from()
-                            .line, 0),
-                        to: Oa(a.doc, oa(b.to()
-                            .line + 1, 0))
-                    }
-                })
-            },
-            delLineLeft: function (a) {
-                xd(a, function (a) {
-                    return {
-                        from: oa(a.from()
-                            .line, 0),
-                        to: a.from()
-                    }
-                })
-            },
-            delWrappedLineLeft: function (a) {
-                xd(a, function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5,
-                        d = a.coordsChar({
-                            left: 0,
-                            top: c
-                        }, "div");
-                    return {
-                        from: d,
-                        to: b.from()
-                    }
-                })
-            },
-            delWrappedLineRight: function (a) {
-                xd(a, function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5,
-                        d = a.coordsChar({
-                            left: a.display.lineDiv.offsetWidth + 100,
-                            top: c
-                        }, "div");
-                    return {
-                        from: b.from(),
-                        to: d
-                    }
-                })
-            },
-            undo: function (a) {
-                a.undo()
-            },
-            redo: function (a) {
-                a.redo()
-            },
-            undoSelection: function (a) {
-                a.undoSelection()
-            },
-            redoSelection: function (a) {
-                a.redoSelection()
-            },
-            goDocStart: function (a) {
-                a.extendSelection(oa(a.firstLine(), 0))
-            },
-            goDocEnd: function (a) {
-                a.extendSelection(oa(a.lastLine()))
-            },
-            goLineStart: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    return Tg(a, b.head.line)
-                }, {
-                    origin: "+move",
-                    bias: 1
-                })
-            },
-            goLineStartSmart: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    return Vg(a, b.head)
-                }, {
-                    origin: "+move",
-                    bias: 1
-                })
-            },
-            goLineEnd: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    return Ug(a, b.head.line)
-                }, {
-                    origin: "+move",
-                    bias: -1
-                })
-            },
-            goLineRight: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5;
-                    return a.coordsChar({
-                        left: a.display.lineDiv.offsetWidth + 100,
-                        top: c
-                    }, "div")
-                }, Xf)
-            },
-            goLineLeft: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5;
-                    return a.coordsChar({
-                        left: 0,
-                        top: c
-                    }, "div")
-                }, Xf)
-            },
-            goLineLeftSmart: function (a) {
-                a.extendSelectionsBy(function (b) {
-                    var c = a.charCoords(b.head, "div")
-                        .top + 5,
-                        d = a.coordsChar({
-                            left: 0,
-                            top: c
-                        }, "div");
-                    return d.ch < a.getLine(d.line)
-                        .search(/\S/) ? Vg(a, b.head) : d
-                }, Xf)
-            },
-            goLineUp: function (a) {
-                a.moveV(-1, "line")
-            },
-            goLineDown: function (a) {
-                a.moveV(1, "line")
-            },
-            goPageUp: function (a) {
-                a.moveV(-1, "page")
-            },
-            goPageDown: function (a) {
-                a.moveV(1, "page")
-            },
-            goCharLeft: function (a) {
-                a.moveH(-1, "char")
-            },
-            goCharRight: function (a) {
-                a.moveH(1, "char")
-            },
-            goColumnLeft: function (a) {
-                a.moveH(-1, "column")
-            },
-            goColumnRight: function (a) {
-                a.moveH(1, "column")
-            },
-            goWordLeft: function (a) {
-                a.moveH(-1, "word")
-            },
-            goGroupRight: function (a) {
-                a.moveH(1, "group")
-            },
-            goGroupLeft: function (a) {
-                a.moveH(-1, "group")
-            },
-            goWordRight: function (a) {
-                a.moveH(1, "word")
-            },
-            delCharBefore: function (a) {
-                a.deleteH(-1, "char")
-            },
-            delCharAfter: function (a) {
-                a.deleteH(1, "char")
-            },
-            delWordBefore: function (a) {
-                a.deleteH(-1, "word")
-            },
-            delWordAfter: function (a) {
-                a.deleteH(1, "word")
-            },
-            delGroupBefore: function (a) {
-                a.deleteH(-1, "group")
-            },
-            delGroupAfter: function (a) {
-                a.deleteH(1, "group")
-            },
-            indentAuto: function (a) {
-                a.indentSelection("smart")
-            },
-            indentMore: function (a) {
-                a.indentSelection("add")
-            },
-            indentLess: function (a) {
-                a.indentSelection("subtract")
-            },
-            insertTab: function (a) {
-                a.replaceSelection("	")
-            },
-            insertSoftTab: function (a) {
-                for (var b = [], c = a.listSelections(), d = a.options.tabSize, e = 0; e < c.length; e++) {
-                    var f = c[e].from(),
-                        g = Zf(a.getLine(f.line), f.ch, d);
-                    b.push(new Array(d - g % d + 1)
-                        .join(" "))
-                }
-                a.replaceSelections(b)
-            },
-            defaultTab: function (a) {
-                a.somethingSelected() ? a.indentSelection("add") : a.execCommand("insertTab")
-            },
-            transposeChars: function (a) {
-                cc(a, function () {
-                    for (var b = a.listSelections(), c = [], d = 0; d < b.length; d++) {
-                        var e = b[d].head,
-                            f = ff(a.doc, e.line)
-                            .text;
-                        if (f)
-                            if (e.ch == f.length && (e = new oa(e.line, e.ch - 1)), e.ch > 0) e = new oa(e.line, e.ch + 1), a.replaceRange(f.charAt(e.ch - 1) + f.charAt(e.ch - 2), oa(e.line, e.ch - 2), e, "+transpose");
-                            else if (e.line > a.doc.first) {
-                            var g = ff(a.doc, e.line - 1)
-                                .text;
-                            g && a.replaceRange(f.charAt(0) + a.doc.lineSeparator() + g.charAt(g.length - 1), oa(e.line - 1, g.length - 1), oa(e.line, 1), "+transpose")
-                        }
-                        c.push(new Ka(e, e))
-                    }
-                    a.setSelections(c)
-                })
-            },
-            newlineAndIndent: function (a) {
-                cc(a, function () {
-                    for (var b = a.listSelections()
-                            .length, c = 0; b > c; c++) {
-                        var d = a.listSelections()[c];
-                        a.replaceRange(a.doc.lineSeparator(), d.anchor, d.head, "+input"), a.indentLine(d.from()
-                            .line + 1, null, !0), td(a)
-                    }
-                })
-            },
-            toggleOverwrite: function (a) {
-                a.toggleOverwrite()
-            }
-        },
-        Md = v.keyMap = {};
-    Md.basic = {
-        Left: "goCharLeft",
-        Right: "goCharRight",
-        Up: "goLineUp",
-        Down: "goLineDown",
-        End: "goLineEnd",
-        Home: "goLineStartSmart",
-        PageUp: "goPageUp",
-        PageDown: "goPageDown",
-        Delete: "delCharAfter",
-        Backspace: "delCharBefore",
-        "Shift-Backspace": "delCharBefore",
-        Tab: "defaultTab",
-        "Shift-Tab": "indentAuto",
-        Enter: "newlineAndIndent",
-        Insert: "toggleOverwrite",
-        Esc: "singleSelection"
-    }, Md.pcDefault = {
-        "Ctrl-A": "selectAll",
-        "Ctrl-D": "deleteLine",
-        "Ctrl-Z": "undo",
-        "Shift-Ctrl-Z": "redo",
-        "Ctrl-Y": "redo",
-        "Ctrl-Home": "goDocStart",
-        "Ctrl-End": "goDocEnd",
-        "Ctrl-Up": "goLineUp",
-        "Ctrl-Down": "goLineDown",
-        "Ctrl-Left": "goGroupLeft",
-        "Ctrl-Right": "goGroupRight",
-        "Alt-Left": "goLineStart",
-        "Alt-Right": "goLineEnd",
-        "Ctrl-Backspace": "delGroupBefore",
-        "Ctrl-Delete": "delGroupAfter",
-        "Ctrl-S": "save",
-        "Ctrl-F": "find",
-        "Ctrl-G": "findNext",
-        "Shift-Ctrl-G": "findPrev",
-        "Shift-Ctrl-F": "replace",
-        "Shift-Ctrl-R": "replaceAll",
-        "Ctrl-[": "indentLess",
-        "Ctrl-]": "indentMore",
-        "Ctrl-U": "undoSelection",
-        "Shift-Ctrl-U": "redoSelection",
-        "Alt-U": "redoSelection",
-        fallthrough: "basic"
-    }, Md.emacsy = {
-        "Ctrl-F": "goCharRight",
-        "Ctrl-B": "goCharLeft",
-        "Ctrl-P": "goLineUp",
-        "Ctrl-N": "goLineDown",
-        "Alt-F": "goWordRight",
-        "Alt-B": "goWordLeft",
-        "Ctrl-A": "goLineStart",
-        "Ctrl-E": "goLineEnd",
-        "Ctrl-V": "goPageDown",
-        "Shift-Ctrl-V": "goPageUp",
-        "Ctrl-D": "delCharAfter",
-        "Ctrl-H": "delCharBefore",
-        "Alt-D": "delWordAfter",
-        "Alt-Backspace": "delWordBefore",
-        "Ctrl-K": "killLine",
-        "Ctrl-T": "transposeChars"
-    }, Md.macDefault = {
-        "Cmd-A": "selectAll",
-        "Cmd-D": "deleteLine",
-        "Cmd-Z": "undo",
-        "Shift-Cmd-Z": "redo",
-        "Cmd-Y": "redo",
-        "Cmd-Home": "goDocStart",
-        "Cmd-Up": "goDocStart",
-        "Cmd-End": "goDocEnd",
-        "Cmd-Down": "goDocEnd",
-        "Alt-Left": "goGroupLeft",
-        "Alt-Right": "goGroupRight",
-        "Cmd-Left": "goLineLeft",
-        "Cmd-Right": "goLineRight",
-        "Alt-Backspace": "delGroupBefore",
-        "Ctrl-Alt-Backspace": "delGroupAfter",
-        "Alt-Delete": "delGroupAfter",
-        "Cmd-S": "save",
-        "Cmd-F": "find",
-        "Cmd-G": "findNext",
-        "Shift-Cmd-G": "findPrev",
-        "Cmd-Alt-F": "replace",
-        "Shift-Cmd-Alt-F": "replaceAll",
-        "Cmd-[": "indentLess",
-        "Cmd-]": "indentMore",
-        "Cmd-Backspace": "delWrappedLineLeft",
-        "Cmd-Delete": "delWrappedLineRight",
-        "Cmd-U": "undoSelection",
-        "Shift-Cmd-U": "redoSelection",
-        "Ctrl-Up": "goDocStart",
-        "Ctrl-Down": "goDocEnd",
-        fallthrough: ["basic", "emacsy"]
-    }, Md["default"] = o ? Md.macDefault : Md.pcDefault, v.normalizeKeyMap = function (a) {
-        var b = {};
-        for (var c in a)
-            if (a.hasOwnProperty(c)) {
-                var d = a[c];
-                if (/^(name|fallthrough|(de|at)tach)$/.test(c)) continue;
-                if ("..." == d) {
-                    delete a[c];
-                    continue
-                }
-                for (var e = eg(c.split(" "), Nd), f = 0; f < e.length; f++) {
-                    var g, h;
-                    f == e.length - 1 ? (h = e.join(" "), g = d) : (h = e.slice(0, f + 1)
-                        .join(" "), g = "...");
-                    var i = b[h];
-                    if (i) {
-                        if (i != g) throw new Error("Inconsistent bindings for " + h)
-                    } else b[h] = g
-                }
-                delete a[c]
-            }
-        for (var j in b) a[j] = b[j];
-        return a
-    };
-    var Od = v.lookupKey = function (a, b, c, d) {
-            b = Rd(b);
-            var e = b.call ? b.call(a, d) : b[a];
-            if (e === !1) return "nothing";
-            if ("..." === e) return "multi";
-            if (null != e && c(e)) return "handled";
-            if (b.fallthrough) {
-                if ("[object Array]" != Object.prototype.toString.call(b.fallthrough)) return Od(a, b.fallthrough, c, d);
-                for (var f = 0; f < b.fallthrough.length; f++) {
-                    var g = Od(a, b.fallthrough[f], c, d);
-                    if (g) return g
-                }
-            }
-        },
-        Pd = v.isModifierKey = function (a) {
-            var b = "string" == typeof a ? a : Ng[a.keyCode];
-            return "Ctrl" == b || "Alt" == b || "Shift" == b || "Mod" == b
-        },
-        Qd = v.keyName = function (a, b) {
-            if (i && 34 == a.keyCode && a["char"]) return !1;
-            var c = Ng[a.keyCode],
-                d = c;
-            return null == d || a.altGraphKey ? !1 : (a.altKey && "Alt" != c && (d = "Alt-" + d), (r ? a.metaKey : a.ctrlKey) && "Ctrl" != c && (d = "Ctrl-" + d), (r ? a.ctrlKey : a.metaKey) && "Cmd" != c && (d = "Cmd-" + d), !b && a.shiftKey && "Shift" != c && (d = "Shift-" + d), d)
-        };
-    v.fromTextArea = function (a, b) {
-        function d() {
-            a.value = i.getValue()
-        }
-        if (b = b ? hg(b) : {}, b.value = a.value, !b.tabindex && a.tabIndex && (b.tabindex = a.tabIndex), !b.placeholder && a.placeholder && (b.placeholder = a.placeholder), null == b.autofocus) {
-            var c = ug();
-            b.autofocus = c == a || null != a.getAttribute("autofocus") && c == document.body
-        }
-        if (a.form && (Jf(a.form, "submit", d), !b.leaveSubmitMethodAlone)) {
-            var e = a.form,
-                f = e.submit;
-            try {
-                var g = e.submit = function () {
-                    d(), e.submit = f, e.submit(), e.submit = g
-                }
-            } catch (h) {}
-        }
-        b.finishInit = function (b) {
-            b.save = d, b.getTextArea = function () {
-                return a
-            }, b.toTextArea = function () {
-                b.toTextArea = isNaN, d(), a.parentNode.removeChild(b.getWrapperElement()), a.style.display = "", a.form && (Kf(a.form, "submit", d), "function" == typeof a.form.submit && (a.form.submit = f))
-            }
-        }, a.style.display = "none";
-        var i = v(function (b) {
-            a.parentNode.insertBefore(b, a.nextSibling)
-        }, b);
-        return i
-    };
-    var Sd = v.StringStream = function (a, b) {
-        this.pos = this.start = 0, this.string = a, this.tabSize = b || 8, this.lastColumnPos = this.lastColumnValue = 0, this.lineStart = 0
-    };
-    Sd.prototype = {
-        eol: function () {
-            return this.pos >= this.string.length
-        },
-        sol: function () {
-            return this.pos == this.lineStart
-        },
-        peek: function () {
-            return this.string.charAt(this.pos) || void 0
-        },
-        next: function () {
-            return this.pos < this.string.length ? this.string.charAt(this.pos++) : void 0
-        },
-        eat: function (a) {
-            var b = this.string.charAt(this.pos);
-            if ("string" == typeof a) var c = b == a;
-            else var c = b && (a.test ? a.test(b) : a(b));
-            return c ? (++this.pos, b) : void 0
-        },
-        eatWhile: function (a) {
-            for (var b = this.pos; this.eat(a););
-            return this.pos > b
-        },
-        eatSpace: function () {
-            for (var a = this.pos;
-                /[\s\u00a0]/.test(this.string.charAt(this.pos));) ++this.pos;
-            return this.pos > a
-        },
-        skipToEnd: function () {
-            this.pos = this.string.length
-        },
-        skipTo: function (a) {
-            var b = this.string.indexOf(a, this.pos);
-            return b > -1 ? (this.pos = b, !0) : void 0
-        },
-        backUp: function (a) {
-            this.pos -= a
-        },
-        column: function () {
-            return this.lastColumnPos < this.start && (this.lastColumnValue = Zf(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start), this.lastColumnValue - (this.lineStart ? Zf(this.string, this.lineStart, this.tabSize) : 0)
-        },
-        indentation: function () {
-            return Zf(this.string, null, this.tabSize) - (this.lineStart ? Zf(this.string, this.lineStart, this.tabSize) : 0)
-        },
-        match: function (a, b, c) {
-            if ("string" != typeof a) {
-                var f = this.string.slice(this.pos)
-                    .match(a);
-                return f && f.index > 0 ? null : (f && b !== !1 && (this.pos += f[0].length), f)
-            }
-            var d = function (a) {
-                    return c ? a.toLowerCase() : a
-                },
-                e = this.string.substr(this.pos, a.length);
-            return d(e) == d(a) ? (b !== !1 && (this.pos += a.length), !0) : void 0
-        },
-        current: function () {
-            return this.string.slice(this.start, this.pos)
-        },
-        hideFirstChars: function (a, b) {
-            this.lineStart += a;
-            try {
-                return b()
-            } finally {
-                this.lineStart -= a
-            }
-        }
-    };
-    var Td = 0,
-        Ud = v.TextMarker = function (a, b) {
-            this.lines = [], this.type = b, this.doc = a, this.id = ++Td
-        };
-    Sf(Ud), Ud.prototype.clear = function () {
-        if (!this.explicitlyCleared) {
-            var a = this.doc.cm,
-                b = a && !a.curOp;
-            if (b && Vb(a), Rf(this, "clear")) {
-                var c = this.find();
-                c && Nf(this, "clear", c.from, c.to)
-            }
-            for (var d = null, e = null, f = 0; f < this.lines.length; ++f) {
-                var g = this.lines[f],
-                    h = ae(g.markedSpans, this);
-                a && !this.collapsed ? jc(a, kf(g), "text") : a && (null != h.to && (e = kf(g)), null != h.from && (d = kf(g))), g.markedSpans = be(g.markedSpans, h), null == h.from && this.collapsed && !we(this.doc, g) && a && jf(g, Rb(a.display))
-            }
-            if (a && this.collapsed && !a.options.lineWrapping)
-                for (var f = 0; f < this.lines.length; ++f) {
-                    var i = se(this.lines[f]),
-                        j = G(i);
-                    j > a.display.maxLineLength && (a.display.maxLine = i, a.display.maxLineLength = j, a.display.maxLineChanged = !0)
-                }
-            null != d && a && this.collapsed && ic(a, d, e + 1), this.lines.length = 0, this.explicitlyCleared = !0, this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, a && ab(a.doc)), a && Nf(a, "markerCleared", a, this), b && Xb(a), this.parent && this.parent.clear()
-        }
-    }, Ud.prototype.find = function (a, b) {
-        null == a && "bookmark" == this.type && (a = 1);
-        for (var c, d, e = 0; e < this.lines.length; ++e) {
-            var f = this.lines[e],
-                g = ae(f.markedSpans, this);
-            if (null != g.from && (c = oa(b ? f : kf(f), g.from), -1 == a)) return c;
-            if (null != g.to && (d = oa(b ? f : kf(f), g.to), 1 == a)) return d
-        }
-        return c && {
-            from: c,
-            to: d
-        }
-    }, Ud.prototype.changed = function () {
-        var a = this.find(-1, !0),
-            b = this,
-            c = this.doc.cm;
-        a && c && cc(c, function () {
-            var d = a.line,
-                e = kf(a.line),
-                f = wb(c, e);
-            if (f && (Db(f), c.curOp.selectionChanged = c.curOp.forceUpdate = !0), c.curOp.updateMaxLine = !0, !we(b.doc, d) && null != b.height) {
-                var g = b.height;
-                b.height = null;
-                var h = Ae(b) - g;
-                h && jf(d, d.height + h)
-            }
-        })
-    }, Ud.prototype.attachLine = function (a) {
-        if (!this.lines.length && this.doc.cm) {
-            var b = this.doc.cm.curOp;
-            b.maybeHiddenMarkers && -1 != dg(b.maybeHiddenMarkers, this) || (b.maybeUnhiddenMarkers || (b.maybeUnhiddenMarkers = []))
-                .push(this)
-        }
-        this.lines.push(a)
-    }, Ud.prototype.detachLine = function (a) {
-        if (this.lines.splice(dg(this.lines, a), 1), !this.lines.length && this.doc.cm) {
-            var b = this.doc.cm.curOp;
-            (b.maybeHiddenMarkers || (b.maybeHiddenMarkers = []))
-            .push(this)
-        }
-    };
-    var Td = 0,
-        Wd = v.SharedTextMarker = function (a, b) {
-            this.markers = a, this.primary = b;
-            for (var c = 0; c < a.length; ++c) a[c].parent = this
-        };
-    Sf(Wd), Wd.prototype.clear = function () {
-        if (!this.explicitlyCleared) {
-            this.explicitlyCleared = !0;
-            for (var a = 0; a < this.markers.length; ++a) this.markers[a].clear();
-            Nf(this, "clear")
-        }
-    }, Wd.prototype.find = function (a, b) {
-        return this.primary.find(a, b)
-    };
-    var ye = v.LineWidget = function (a, b, c) {
-        if (c)
-            for (var d in c) c.hasOwnProperty(d) && (this[d] = c[d]);
-        this.doc = a, this.node = b
-    };
-    Sf(ye), ye.prototype.clear = function () {
-        var a = this.doc.cm,
-            b = this.line.widgets,
-            c = this.line,
-            d = kf(c);
-        if (null != d && b) {
-            for (var e = 0; e < b.length; ++e) b[e] == this && b.splice(e--, 1);
-            b.length || (c.widgets = null);
-            var f = Ae(this);
-            jf(c, Math.max(0, c.height - f)), a && cc(a, function () {
-                ze(a, c, -f), jc(a, d, "widget")
-            })
-        }
-    }, ye.prototype.changed = function () {
-        var a = this.height,
-            b = this.doc.cm,
-            c = this.line;
-        this.height = null;
-        var d = Ae(this) - a;
-        d && (jf(c, c.height + d), b && cc(b, function () {
-            b.curOp.forceUpdate = !0, ze(b, c, d)
-        }))
-    };
-    var Ce = v.Line = function (a, b, c) {
-        this.text = a, ke(this, b), this.height = c ? c(this) : 1
-    };
-    Sf(Ce), Ce.prototype.lineNo = function () {
-        return kf(this)
-    };
-    var Ne = {},
-        Oe = {};
-    Ze.prototype = {
-        chunkSize: function () {
-            return this.lines.length
-        },
-        removeInner: function (a, b) {
-            for (var c = a, d = a + b; d > c; ++c) {
-                var e = this.lines[c];
-                this.height -= e.height, Ee(e), Nf(e, "delete")
-            }
-            this.lines.splice(a, b)
-        },
-        collapse: function (a) {
-            a.push.apply(a, this.lines)
-        },
-        insertInner: function (a, b, c) {
-            this.height += c, this.lines = this.lines.slice(0, a)
-                .concat(b)
-                .concat(this.lines.slice(a));
-            for (var d = 0; d < b.length; ++d) b[d].parent = this
-        },
-        iterN: function (a, b, c) {
-            for (var d = a + b; d > a; ++a)
-                if (c(this.lines[a])) return !0
-        }
-    }, $e.prototype = {
-        chunkSize: function () {
-            return this.size
-        },
-        removeInner: function (a, b) {
-            this.size -= b;
-            for (var c = 0; c < this.children.length; ++c) {
-                var d = this.children[c],
-                    e = d.chunkSize();
-                if (e > a) {
-                    var f = Math.min(b, e - a),
-                        g = d.height;
-                    if (d.removeInner(a, f), this.height -= g - d.height, e == f && (this.children.splice(c--, 1), d.parent = null), 0 == (b -= f)) break;
-                    a = 0
-                } else a -= e
-            }
-            if (this.size - b < 25 && (this.children.length > 1 || !(this.children[0] instanceof Ze))) {
-                var h = [];
-                this.collapse(h), this.children = [new Ze(h)], this.children[0].parent = this
-            }
-        },
-        collapse: function (a) {
-            for (var b = 0; b < this.children.length; ++b) this.children[b].collapse(a)
-        },
-        insertInner: function (a, b, c) {
-            this.size += b.length, this.height += c;
-            for (var d = 0; d < this.children.length; ++d) {
-                var e = this.children[d],
-                    f = e.chunkSize();
-                if (f >= a) {
-                    if (e.insertInner(a, b, c), e.lines && e.lines.length > 50) {
-                        for (; e.lines.length > 50;) {
-                            var g = e.lines.splice(e.lines.length - 25, 25),
-                                h = new Ze(g);
-                            e.height -= h.height, this.children.splice(d + 1, 0, h), h.parent = this
-                        }
-                        this.maybeSpill()
-                    }
-                    break
-                }
-                a -= f
-            }
-        },
-        maybeSpill: function () {
-            if (!(this.children.length <= 10)) {
-                var a = this;
-                do {
-                    var b = a.children.splice(a.children.length - 5, 5),
-                        c = new $e(b);
-                    if (a.parent) {
-                        a.size -= c.size, a.height -= c.height;
-                        var e = dg(a.parent.children, a);
-                        a.parent.children.splice(e + 1, 0, c)
-                    } else {
-                        var d = new $e(a.children);
-                        d.parent = a, a.children = [d, c], a = d
-                    }
-                    c.parent = a.parent
-                } while (a.children.length > 10);
-                a.parent.maybeSpill()
-            }
-        },
-        iterN: function (a, b, c) {
-            for (var d = 0; d < this.children.length; ++d) {
-                var e = this.children[d],
-                    f = e.chunkSize();
-                if (f > a) {
-                    var g = Math.min(b, f - a);
-                    if (e.iterN(a, g, c)) return !0;
-                    if (0 == (b -= g)) break;
-                    a = 0
-                } else a -= f
-            }
-        }
-    };
-    var _e = 0,
-        af = v.Doc = function (a, b, c, d) {
-            if (!(this instanceof af)) return new af(a, b, c, d);
-            null == c && (c = 0), $e.call(this, [new Ze([new Ce("", null)])]), this.first = c, this.scrollTop = this.scrollLeft = 0, this.cantEdit = !1, this.cleanGeneration = 1, this.frontier = c;
-            var e = oa(c, 0);
-            this.sel = Ma(e), this.history = new of(null), this.id = ++_e, this.modeOption = b, this.lineSep = d, "string" == typeof a && (a = this.splitLines(a)), Ye(this, {
-                from: e,
-                to: e,
-                text: a
-            }), Za(this, Ma(e), Vf)
-        };
-    af.prototype = gg($e.prototype, {
-        constructor: af,
-        iter: function (a, b, c) {
-            c ? this.iterN(a - this.first, b - a, c) : this.iterN(this.first, this.first + this.size, a)
-        },
-        insert: function (a, b) {
-            for (var c = 0, d = 0; d < b.length; ++d) c += b[d].height;
-            this.insertInner(a - this.first, b, c)
-        },
-        remove: function (a, b) {
-            this.removeInner(a - this.first, b)
-        },
-        getValue: function (a) {
-            var b = hf(this, this.first, this.first + this.size);
-            return a === !1 ? b : b.join(a || this.lineSeparator())
-        },
-        setValue: fc(function (a) {
-            var b = oa(this.first, 0),
-                c = this.first + this.size - 1;
-            hd(this, {
-                from: b,
-                to: oa(c, ff(this, c)
-                    .text.length),
-                text: this.splitLines(a),
-                origin: "setValue",
-                full: !0
-            }, !0), Za(this, Ma(b))
-        }),
-        replaceRange: function (a, b, c, d) {
-            b = Oa(this, b), c = c ? Oa(this, c) : b, nd(this, a, b, c, d)
-        },
-        getRange: function (a, b, c) {
-            var d = gf(this, Oa(this, a), Oa(this, b));
-            return c === !1 ? d : d.join(c || this.lineSeparator())
-        },
-        getLine: function (a) {
-            var b = this.getLineHandle(a);
-            return b && b.text
-        },
-        getLineHandle: function (a) {
-            return Qa(this, a) ? ff(this, a) : void 0
-        },
-        getLineNumber: function (a) {
-            return kf(a)
-        },
-        getLineHandleVisualStart: function (a) {
-            return "number" == typeof a && (a = ff(this, a)), se(a)
-        },
-        lineCount: function () {
-            return this.size
-        },
-        firstLine: function () {
-            return this.first
-        },
-        lastLine: function () {
-            return this.first + this.size - 1
-        },
-        clipPos: function (a) {
-            return Oa(this, a)
-        },
-        getCursor: function (a) {
-            var c, b = this.sel.primary();
-            return c = null == a || "head" == a ? b.head : "anchor" == a ? b.anchor : "end" == a || "to" == a || a === !1 ? b.to() : b.from()
-        },
-        listSelections: function () {
-            return this.sel.ranges
-        },
-        somethingSelected: function () {
-            return this.sel.somethingSelected()
-        },
-        setCursor: fc(function (a, b, c) {
-            Wa(this, Oa(this, "number" == typeof a ? oa(a, b || 0) : a), null, c)
-        }),
-        setSelection: fc(function (a, b, c) {
-            Wa(this, Oa(this, a), Oa(this, b || a), c)
-        }),
-        extendSelection: fc(function (a, b, c) {
-            Ta(this, Oa(this, a), b && Oa(this, b), c)
-        }),
-        extendSelections: fc(function (a, b) {
-            Ua(this, Ra(this, a, b))
-        }),
-        extendSelectionsBy: fc(function (a, b) {
-            Ua(this, eg(this.sel.ranges, a), b)
-        }),
-        setSelections: fc(function (a, b, c) {
-            if (a.length) {
-                for (var d = 0, e = []; d < a.length; d++) e[d] = new Ka(Oa(this, a[d].anchor), Oa(this, a[d].head));
-                null == b && (b = Math.min(a.length - 1, this.sel.primIndex)), Za(this, La(e, b), c)
-            }
-        }),
-        addSelection: fc(function (a, b, c) {
-            var d = this.sel.ranges.slice(0);
-            d.push(new Ka(Oa(this, a), Oa(this, b || a))), Za(this, La(d, d.length - 1), c)
-        }),
-        getSelection: function (a) {
-            for (var c, b = this.sel.ranges, d = 0; d < b.length; d++) {
-                var e = gf(this, b[d].from(), b[d].to());
-                c = c ? c.concat(e) : e
-            }
-            return a === !1 ? c : c.join(a || this.lineSeparator())
-        },
-        getSelections: function (a) {
-            for (var b = [], c = this.sel.ranges, d = 0; d < c.length; d++) {
-                var e = gf(this, c[d].from(), c[d].to());
-                a !== !1 && (e = e.join(a || this.lineSeparator())), b[d] = e
-            }
-            return b
-        },
-        replaceSelection: function (a, b, c) {
-            for (var d = [], e = 0; e < this.sel.ranges.length; e++) d[e] = a;
-            this.replaceSelections(d, b, c || "+input")
-        },
-        replaceSelections: fc(function (a, b, c) {
-            for (var d = [], e = this.sel, f = 0; f < e.ranges.length; f++) {
-                var g = e.ranges[f];
-                d[f] = {
-                    from: g.from(),
-                    to: g.to(),
-                    text: this.splitLines(a[f]),
-                    origin: c
-                }
-            }
-            for (var h = b && "end" != b && fd(this, d, b), f = d.length - 1; f >= 0; f--) hd(this, d[f]);
-            h ? Ya(this, h) : this.cm && td(this.cm)
-        }),
-        undo: fc(function () {
-            jd(this, "undo")
-        }),
-        redo: fc(function () {
-            jd(this, "redo")
-        }),
-        undoSelection: fc(function () {
-            jd(this, "undo", !0)
-        }),
-        redoSelection: fc(function () {
-            jd(this, "redo", !0)
-        }),
-        setExtending: function (a) {
-            this.extend = a
-        },
-        getExtending: function () {
-            return this.extend
-        },
-        historySize: function () {
-            for (var a = this.history, b = 0, c = 0, d = 0; d < a.done.length; d++) a.done[d].ranges || ++b;
-            for (var d = 0; d < a.undone.length; d++) a.undone[d].ranges || ++c;
-            return {
-                undo: b,
-                redo: c
-            }
-        },
-        clearHistory: function () {
-            this.history = new of(this.history.maxGeneration)
-        },
-        markClean: function () {
-            this.cleanGeneration = this.changeGeneration(!0)
-        },
-        changeGeneration: function (a) {
-            return a && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null), this.history.generation
-        },
-        isClean: function (a) {
-            return this.history.generation == (a || this.cleanGeneration)
-        },
-        getHistory: function () {
-            return {
-                done: zf(this.history.done),
-                undone: zf(this.history.undone)
-            }
-        },
-        setHistory: function (a) {
-            var b = this.history = new of(this.history.maxGeneration);
-            b.done = zf(a.done.slice(0), null, !0), b.undone = zf(a.undone.slice(0), null, !0)
-        },
-        addLineClass: fc(function (a, b, c) {
-            return wd(this, a, "gutter" == b ? "gutter" : "class", function (a) {
-                var d = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass";
-                if (a[d]) {
-                    if (vg(c)
-                        .test(a[d])) return !1;
-                    a[d] += " " + c
-                } else a[d] = c;
-                return !0
-            })
-        }),
-        removeLineClass: fc(function (a, b, c) {
-            return wd(this, a, "gutter" == b ? "gutter" : "class", function (a) {
-                var d = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass",
-                    e = a[d];
-                if (!e) return !1;
-                if (null == c) a[d] = null;
-                else {
-                    var f = e.match(vg(c));
-                    if (!f) return !1;
-                    var g = f.index + f[0].length;
-                    a[d] = e.slice(0, f.index) + (f.index && g != e.length ? " " : "") + e.slice(g) || null
-                }
-                return !0
-            })
-        }),
-        addLineWidget: fc(function (a, b, c) {
-            return Be(this, a, b, c)
-        }),
-        removeLineWidget: function (a) {
-            a.clear()
-        },
-        markText: function (a, b, c) {
-            return Vd(this, Oa(this, a), Oa(this, b), c, "range")
-        },
-        setBookmark: function (a, b) {
-            var c = {
-                replacedWith: b && (null == b.nodeType ? b.widget : b),
-                insertLeft: b && b.insertLeft,
-                clearWhenEmpty: !1,
-                shared: b && b.shared,
-                handleMouseEvents: b && b.handleMouseEvents
-            };
-            return a = Oa(this, a), Vd(this, a, a, c, "bookmark")
-        },
-        findMarksAt: function (a) {
-            a = Oa(this, a);
-            var b = [],
-                c = ff(this, a.line)
-                .markedSpans;
-            if (c)
-                for (var d = 0; d < c.length; ++d) {
-                    var e = c[d];
-                    (null == e.from || e.from <= a.ch) && (null == e.to || e.to >= a.ch) && b.push(e.marker.parent || e.marker)
-                }
-            return b
-        },
-        findMarks: function (a, b, c) {
-            a = Oa(this, a), b = Oa(this, b);
-            var d = [],
-                e = a.line;
-            return this.iter(a.line, b.line + 1, function (f) {
-                var g = f.markedSpans;
-                if (g)
-                    for (var h = 0; h < g.length; h++) {
-                        var i = g[h];
-                        e == a.line && a.ch > i.to || null == i.from && e != a.line || e == b.line && i.from > b.ch || c && !c(i.marker) || d.push(i.marker.parent || i.marker)
-                    }++e
-            }), d
-        },
-        getAllMarks: function () {
-            var a = [];
-            return this.iter(function (b) {
-                var c = b.markedSpans;
-                if (c)
-                    for (var d = 0; d < c.length; ++d) null != c[d].from && a.push(c[d].marker)
-            }), a
-        },
-        posFromIndex: function (a) {
-            var b, c = this.first;
-            return this.iter(function (d) {
-                var e = d.text.length + 1;
-                return e > a ? (b = a, !0) : (a -= e, void++c)
-            }), Oa(this, oa(c, b))
-        },
-        indexFromPos: function (a) {
-            a = Oa(this, a);
-            var b = a.ch;
-            return a.line < this.first || a.ch < 0 ? 0 : (this.iter(this.first, a.line, function (a) {
-                b += a.text.length + 1
-            }), b)
-        },
-        copy: function (a) {
-            var b = new af(hf(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep);
-            return b.scrollTop = this.scrollTop, b.scrollLeft = this.scrollLeft, b.sel = this.sel, b.extend = !1, a && (b.history.undoDepth = this.history.undoDepth, b.setHistory(this.getHistory())), b
-        },
-        linkedDoc: function (a) {
-            a || (a = {});
-            var b = this.first,
-                c = this.first + this.size;
-            null != a.from && a.from > b && (b = a.from), null != a.to && a.to < c && (c = a.to);
-            var d = new af(hf(this, b, c), a.mode || this.modeOption, b, this.lineSep);
-            return a.sharedHist && (d.history = this.history), (this.linked || (this.linked = []))
-                .push({
-                    doc: d,
-                    sharedHist: a.sharedHist
-                }), d.linked = [{
-                    doc: this,
-                    isParent: !0,
-                    sharedHist: a.sharedHist
-                }], Zd(d, Yd(this)), d
-        },
-        unlinkDoc: function (a) {
-            if (a instanceof v && (a = a.doc), this.linked)
-                for (var b = 0; b < this.linked.length; ++b) {
-                    var c = this.linked[b];
-                    if (c.doc == a) {
-                        this.linked.splice(b, 1), a.unlinkDoc(this), $d(Yd(this));
-                        break
-                    }
-                }
-            if (a.history == this.history) {
-                var d = [a.id];
-                df(a, function (a) {
-                    d.push(a.id)
-                }, !0), a.history = new of(null), a.history.done = zf(this.history.done, d), a.history.undone = zf(this.history.undone, d)
-            }
-        },
-        iterLinkedDocs: function (a) {
-            df(this, a)
-        },
-        getMode: function () {
-            return this.mode
-        },
-        getEditor: function () {
-            return this.cm
-        },
-        splitLines: function (a) {
-            return this.lineSep ? a.split(this.lineSep) : Ig(a)
-        },
-        lineSeparator: function () {
-            return this.lineSep || "\n"
-        }
-    }), af.prototype.eachLine = af.prototype.iter;
-    var bf = "iter insert remove copy getEditor constructor".split(" ");
-    for (var cf in af.prototype) af.prototype.hasOwnProperty(cf) && dg(bf, cf) < 0 && (v.prototype[cf] = function (a) {
-        return function () {
-            return a.apply(this.doc, arguments)
-        }
-    }(af.prototype[cf]));
-    Sf(af);
-    var Df = v.e_preventDefault = function (a) {
-            a.preventDefault ? a.preventDefault() : a.returnValue = !1
-        },
-        Ef = v.e_stopPropagation = function (a) {
-            a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
-        },
-        Gf = v.e_stop = function (a) {
-            Df(a), Ef(a)
-        },
-        Jf = v.on = function (a, b, c) {
-            if (a.addEventListener) a.addEventListener(b, c, !1);
-            else if (a.attachEvent) a.attachEvent("on" + b, c);
-            else {
-                var d = a._handlers || (a._handlers = {}),
-                    e = d[b] || (d[b] = []);
-                e.push(c)
-            }
-        },
-        Kf = v.off = function (a, b, c) {
-            if (a.removeEventListener) a.removeEventListener(b, c, !1);
-            else if (a.detachEvent) a.detachEvent("on" + b, c);
-            else {
-                var d = a._handlers && a._handlers[b];
-                if (!d) return;
-                for (var e = 0; e < d.length; ++e)
-                    if (d[e] == c) {
-                        d.splice(e, 1);
-                        break
-                    }
-            }
-        },
-        Lf = v.signal = function (a, b) {
-            var c = a._handlers && a._handlers[b];
-            if (c)
-                for (var d = Array.prototype.slice.call(arguments, 2), e = 0; e < c.length; ++e) c[e].apply(null, d)
-        },
-        Mf = null,
-        Tf = 30,
-        Uf = v.Pass = {
-            toString: function () {
-                return "CodeMirror.Pass"
-            }
-        },
-        Vf = {
-            scroll: !1
-        },
-        Wf = {
-            origin: "*mouse"
-        },
-        Xf = {
-            origin: "+move"
-        };
-    Yf.prototype.set = function (a, b) {
-        clearTimeout(this.id), this.id = setTimeout(b, a)
-    };
-    var Zf = v.countColumn = function (a, b, c, d, e) {
-            null == b && (b = a.search(/[^\s\u00a0]/), -1 == b && (b = a.length));
-            for (var f = d || 0, g = e || 0;;) {
-                var h = a.indexOf("	", f);
-                if (0 > h || h >= b) return g + (b - f);
-                g += h - f, g += c - g % c, f = h + 1
-            }
-        },
-        $f = v.findColumn = function (a, b, c) {
-            for (var d = 0, e = 0;;) {
-                var f = a.indexOf("	", d); - 1 == f && (f = a.length);
-                var g = f - d;
-                if (f == a.length || e + g >= b) return d + Math.min(g, b - e);
-                if (e += f - d, e += c - e % c, d = f + 1, e >= b) return d
-            }
-        },
-        _f = [""],
-        cg = function (a) {
-            a.select()
-        };
-    m ? cg = function (a) {
-        a.selectionStart = 0, a.selectionEnd = a.value.length
-    } : d && (cg = function (a) {
-        try {
-            a.select()
-        } catch (b) {}
-    });
-    var qg, jg = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,
-        kg = v.isWordChar = function (a) {
-            return /\w/.test(a) || a > "\x80" && (a.toUpperCase() != a.toLowerCase() || jg.test(a))
-        },
-        ng = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
-    qg = document.createRange ? function (a, b, c, d) {
-        var e = document.createRange();
-        return e.setEnd(d || a, c), e.setStart(a, b), e
-    } : function (a, b, c) {
-        var d = document.body.createTextRange();
-        try {
-            d.moveToElementText(a.parentNode)
-        } catch (e) {
-            return d
-        }
-        return d.collapse(!0), d.moveEnd("character", c), d.moveStart("character", b), d
-    };
-    var tg = v.contains = function (a, b) {
-        if (3 == b.nodeType && (b = b.parentNode), a.contains) return a.contains(b);
-        do
-            if (11 == b.nodeType && (b = b.host), b == a) return !0;
-        while (b = b.parentNode)
-    };
-    d && 11 > e && (ug = function () {
-        try {
-            return document.activeElement
-        } catch (a) {
-            return document.body
-        }
-    });
-    var Eg, Gg, wg = v.rmClass = function (a, b) {
-            var c = a.className,
-                d = vg(b)
-                .exec(c);
-            if (d) {
-                var e = c.slice(d.index + d[0].length);
-                a.className = c.slice(0, d.index) + (e ? d[1] + e : "")
-            }
-        },
-        xg = v.addClass = function (a, b) {
-            var c = a.className;
-            vg(b)
-                .test(c) || (a.className += (c ? " " : "") + b)
-        },
-        Ag = !1,
-        Dg = function () {
-            if (d && 9 > e) return !1;
-            var a = pg("div");
-            return "draggable" in a || "dragDrop" in a
-        }(),
-        Ig = v.splitLines = 3 != "\n\nb".split(/\n/)
-        .length ? function (a) {
-            for (var b = 0, c = [], d = a.length; d >= b;) {
-                var e = a.indexOf("\n", b); - 1 == e && (e = a.length);
-                var f = a.slice(b, "\r" == a.charAt(e - 1) ? e - 1 : e),
-                    g = f.indexOf("\r"); - 1 != g ? (c.push(f.slice(0, g)), b += g + 1) : (c.push(f), b = e + 1)
-            }
-            return c
-        } : function (a) {
-            return a.split(/\r\n?|\n/)
-        },
-        Jg = window.getSelection ? function (a) {
-            try {
-                return a.selectionStart != a.selectionEnd
-            } catch (b) {
-                return !1
-            }
-        } : function (a) {
-            try {
-                var b = a.ownerDocument.selection.createRange()
-            } catch (c) {}
-            return b && b.parentElement() == a ? 0 != b.compareEndPoints("StartToEnd", b) : !1
-        },
-        Kg = function () {
-            var a = pg("div");
-            return "oncopy" in a ? !0 : (a.setAttribute("oncopy", "return;"), "function" == typeof a.oncopy)
-        }(),
-        Lg = null,
-        Ng = {
-            3: "Enter",
-            8: "Backspace",
-            9: "Tab",
-            13: "Enter",
-            16: "Shift",
-            17: "Ctrl",
-            18: "Alt",
-            19: "Pause",
-            20: "CapsLock",
-            27: "Esc",
-            32: "Space",
-            33: "PageUp",
-            34: "PageDown",
-            35: "End",
-            36: "Home",
-            37: "Left",
-            38: "Up",
-            39: "Right",
-            40: "Down",
-            44: "PrintScrn",
-            45: "Insert",
-            46: "Delete",
-            59: ";",
-            61: "=",
-            91: "Mod",
-            92: "Mod",
-            93: "Mod",
-            107: "=",
-            109: "-",
-            127: "Delete",
-            173: "-",
-            186: ";",
-            187: "=",
-            188: ",",
-            189: "-",
-            190: ".",
-            191: "/",
-            192: "`",
-            219: "[",
-            220: "\\",
-            221: "]",
-            222: "'",
-            63232: "Up",
-            63233: "Down",
-            63234: "Left",
-            63235: "Right",
-            63272: "Delete",
-            63273: "Home",
-            63275: "End",
-            63276: "PageUp",
-            63277: "PageDown",
-            63302: "Insert"
-        };
-    v.keyNames = Ng,
-        function () {
-            for (var a = 0; 10 > a; a++) Ng[a + 48] = Ng[a + 96] = String(a);
-            for (var a = 65; 90 >= a; a++) Ng[a] = String.fromCharCode(a);
-            for (var a = 1; 12 >= a; a++) Ng[a + 111] = Ng[a + 63235] = "F" + a
-        }();
-    var Xg, ah = function () {
-        function c(c) {
-            return 247 >= c ? a.charAt(c) : c >= 1424 && 1524 >= c ? "R" : c >= 1536 && 1773 >= c ? b.charAt(c - 1536) : c >= 1774 && 2220 >= c ? "r" : c >= 8192 && 8203 >= c ? "w" : 8204 == c ? "b" : "L"
-        }
-
-        function j(a, b, c) {
-            this.level = a, this.from = b, this.to = c
-        }
-        var a = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",
-            b = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",
-            d = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,
-            e = /[stwN]/,
-            f = /[LRr]/,
-            g = /[Lb1n]/,
-            h = /[1n]/,
-            i = "L";
-        return function (a) {
-            if (!d.test(a)) return !1;
-            for (var m, b = a.length, k = [], l = 0; b > l; ++l) k.push(m = c(a.charCodeAt(l)));
-            for (var l = 0, n = i; b > l; ++l) {
-                var m = k[l];
-                "m" == m ? k[l] = n : n = m
-            }
-            for (var l = 0, o = i; b > l; ++l) {
-                var m = k[l];
-                "1" == m && "r" == o ? k[l] = "n" : f.test(m) && (o = m, "r" == m && (k[l] = "R"))
-            }
-            for (var l = 1, n = k[0]; b - 1 > l; ++l) {
-                var m = k[l];
-                "+" == m && "1" == n && "1" == k[l + 1] ? k[l] = "1" : "," != m || n != k[l + 1] || "1" != n && "n" != n || (k[l] = n), n = m
-            }
-            for (var l = 0; b > l; ++l) {
-                var m = k[l];
-                if ("," == m) k[l] = "N";
-                else if ("%" == m) {
-                    for (var p = l + 1; b > p && "%" == k[p]; ++p);
-                    for (var q = l && "!" == k[l - 1] || b > p && "1" == k[p] ? "1" : "N", r = l; p > r; ++r) k[r] = q;
-                    l = p - 1
-                }
-            }
-            for (var l = 0, o = i; b > l; ++l) {
-                var m = k[l];
-                "L" == o && "1" == m ? k[l] = "L" : f.test(m) && (o = m)
-            }
-            for (var l = 0; b > l; ++l)
-                if (e.test(k[l])) {
-                    for (var p = l + 1; b > p && e.test(k[p]); ++p);
-                    for (var s = "L" == (l ? k[l - 1] : i), t = "L" == (b > p ? k[p] : i), q = s || t ? "L" : "R", r = l; p > r; ++r) k[r] = q;
-                    l = p - 1
-                }
-            for (var v, u = [], l = 0; b > l;)
-                if (g.test(k[l])) {
-                    var w = l;
-                    for (++l; b > l && g.test(k[l]); ++l);
-                    u.push(new j(0, w, l))
-                } else {
-                    var x = l,
-                        y = u.length;
-                    for (++l; b > l && "L" != k[l]; ++l);
-                    for (var r = x; l > r;)
-                        if (h.test(k[r])) {
-                            r > x && u.splice(y, 0, new j(1, x, r));
-                            var z = r;
-                            for (++r; l > r && h.test(k[r]); ++r);
-                            u.splice(y, 0, new j(2, z, r)), x = r
-                        } else ++r;
-                    l > x && u.splice(y, 0, new j(1, x, l))
-                }
-            return 1 == u[0].level && (v = a.match(/^\s+/)) && (u[0].from = v[0].length, u.unshift(new j(0, 0, v[0].length))), 1 == bg(u)
-                .level && (v = a.match(/\s+$/)) && (bg(u)
-                    .to -= v[0].length, u.push(new j(0, b - v[0].length, b))), 2 == u[0].level && u.unshift(new j(1, u[0].to, u[0].to)), u[0].level != bg(u)
-                .level && u.push(new j(u[0].level, b, b)), u
-        }
-    }();
-    return v.version = "5.6.1", v
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a) {
-        for (var b = {}, c = 0; c < a.length; ++c) b[a[c]] = !0;
-        return b
-    }
-
-    function x(a, b) {
-        for (var d, c = !1; null != (d = a.next());) {
-            if (c && "/" == d) {
-                b.tokenize = null;
-                break
-            }
-            c = "*" == d
-        }
-        return ["comment", "comment"]
-    }
-    a.defineMode("css", function (b, c) {
-        function u(a, b) {
-            return s = b, a
-        }
-
-        function v(a, b) {
-            var c = a.next();
-            if (f[c]) {
-                var d = f[c](a, b);
-                if (d !== !1) return d
-            }
-            return "@" == c ? (a.eatWhile(/[\w\\\-]/), u("def", a.current())) : "=" == c || ("~" == c || "|" == c) && a.eat("=") ? u(null, "compare") : '"' == c || "'" == c ? (b.tokenize = w(c), b.tokenize(a, b)) : "#" == c ? (a.eatWhile(/[\w\\\-]/), u("atom", "hash")) : "!" == c ? (a.match(/^\s*\w*/), u("keyword", "important")) : /\d/.test(c) || "." == c && a.eat(/\d/) ? (a.eatWhile(/[\w.%]/), u("number", "unit")) : "-" !== c ? /[,+>*\/]/.test(c) ? u(null, "select-op") : "." == c && a.match(/^-?[_a-z][_a-z0-9-]*/i) ? u("qualifier", "qualifier") : /[:;{}\[\]\(\)]/.test(c) ? u(null, c) : "u" == c && a.match(/rl(-prefix)?\(/) || "d" == c && a.match("omain(") || "r" == c && a.match("egexp(") ? (a.backUp(1), b.tokenize = x, u("property", "word")) : /[\w\\\-]/.test(c) ? (a.eatWhile(/[\w\\\-]/), u("property", "word")) : u(null, null) : /[\d.]/.test(a.peek()) ? (a.eatWhile(/[\w.%]/), u("number", "unit")) : a.match(/^-[\w\\\-]+/) ? (a.eatWhile(/[\w\\\-]/), a.match(/^\s*:/, !1) ? u("variable-2", "variable-definition") : u("variable-2", "variable")) : a.match(/^\w+-/) ? u("meta", "meta") : void 0
-        }
-
-        function w(a) {
-            return function (b, c) {
-                for (var e, d = !1; null != (e = b.next());) {
-                    if (e == a && !d) {
-                        ")" == a && b.backUp(1);
-                        break
-                    }
-                    d = !d && "\\" == e
-                }
-                return (e == a || !d && ")" != a) && (c.tokenize = null), u("string", "string")
-            }
-        }
-
-        function x(a, b) {
-            return a.next(), a.match(/\s*[\"\')]/, !1) ? b.tokenize = null : b.tokenize = w(")"), u(null, "(")
-        }
-
-        function y(a, b, c) {
-            this.type = a, this.indent = b, this.prev = c
-        }
-
-        function z(a, b, c, d) {
-            return a.context = new y(c, b.indentation() + (d === !1 ? 0 : e), a.context), c
-        }
-
-        function A(a) {
-            return a.context.prev && (a.context = a.context.prev), a.context.type
-        }
-
-        function B(a, b, c) {
-            return E[c.context.type](a, b, c)
-        }
-
-        function C(a, b, c, d) {
-            for (var e = d || 1; e > 0; e--) c.context = c.context.prev;
-            return B(a, b, c)
-        }
-
-        function D(a) {
-            var b = a.current()
-                .toLowerCase();
-            t = p.hasOwnProperty(b) ? "atom" : o.hasOwnProperty(b) ? "keyword" : "variable"
-        }
-        var d = c;
-        c.propertyKeywords || (c = a.resolveMode("text/css")), c.inline = d.inline;
-        var s, t, e = b.indentUnit,
-            f = c.tokenHooks,
-            g = c.documentTypes || {},
-            h = c.mediaTypes || {},
-            i = c.mediaFeatures || {},
-            j = c.mediaValueKeywords || {},
-            k = c.propertyKeywords || {},
-            l = c.nonStandardPropertyKeywords || {},
-            m = c.fontProperties || {},
-            n = c.counterDescriptors || {},
-            o = c.colorKeywords || {},
-            p = c.valueKeywords || {},
-            q = c.allowNested,
-            r = c.supportsAtComponent === !0,
-            E = {};
-        return E.top = function (a, b, c) {
-            if ("{" == a) return z(c, b, "block");
-            if ("}" == a && c.context.prev) return A(c);
-            if (r && /@component/.test(a)) return z(c, b, "atComponentBlock");
-            if (/^@(-moz-)?document$/.test(a)) return z(c, b, "documentTypes");
-            if (/^@(media|supports|(-moz-)?document|import)$/.test(a)) return z(c, b, "atBlock");
-            if (/^@(font-face|counter-style)/.test(a)) return c.stateArg = a, "restricted_atBlock_before";
-            if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(a)) return "keyframes";
-            if (a && "@" == a.charAt(0)) return z(c, b, "at");
-            if ("hash" == a) t = "builtin";
-            else if ("word" == a) t = "tag";
-            else {
-                if ("variable-definition" == a) return "maybeprop";
-                if ("interpolation" == a) return z(c, b, "interpolation");
-                if (":" == a) return "pseudo";
-                if (q && "(" == a) return z(c, b, "parens")
-            }
-            return c.context.type
-        }, E.block = function (a, b, c) {
-            if ("word" == a) {
-                var d = b.current()
-                    .toLowerCase();
-                return k.hasOwnProperty(d) ? (t = "property", "maybeprop") : l.hasOwnProperty(d) ? (t = "string-2", "maybeprop") : q ? (t = b.match(/^\s*:(?:\s|$)/, !1) ? "property" : "tag", "block") : (t += " error", "maybeprop")
-            }
-            return "meta" == a ? "block" : q || "hash" != a && "qualifier" != a ? E.top(a, b, c) : (t = "error", "block")
-        }, E.maybeprop = function (a, b, c) {
-            return ":" == a ? z(c, b, "prop") : B(a, b, c)
-        }, E.prop = function (a, b, c) {
-            if (";" == a) return A(c);
-            if ("{" == a && q) return z(c, b, "propBlock");
-            if ("}" == a || "{" == a) return C(a, b, c);
-            if ("(" == a) return z(c, b, "parens");
-            if ("hash" != a || /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(b.current())) {
-                if ("word" == a) D(b);
-                else if ("interpolation" == a) return z(c, b, "interpolation")
-            } else t += " error";
-            return "prop"
-        }, E.propBlock = function (a, b, c) {
-            return "}" == a ? A(c) : "word" == a ? (t = "property", "maybeprop") : c.context.type
-        }, E.parens = function (a, b, c) {
-            return "{" == a || "}" == a ? C(a, b, c) : ")" == a ? A(c) : "(" == a ? z(c, b, "parens") : "interpolation" == a ? z(c, b, "interpolation") : ("word" == a && D(b), "parens")
-        }, E.pseudo = function (a, b, c) {
-            return "word" == a ? (t = "variable-3", c.context.type) : B(a, b, c)
-        }, E.documentTypes = function (a, b, c) {
-            return "word" == a && g.hasOwnProperty(b.current()) ? (t = "tag", c.context.type) : E.atBlock(a, b, c)
-        }, E.atBlock = function (a, b, c) {
-            if ("(" == a) return z(c, b, "atBlock_parens");
-            if ("}" == a || ";" == a) return C(a, b, c);
-            if ("{" == a) return A(c) && z(c, b, q ? "block" : "top");
-            if ("word" == a) {
-                var d = b.current()
-                    .toLowerCase();
-                t = "only" == d || "not" == d || "and" == d || "or" == d ? "keyword" : h.hasOwnProperty(d) ? "attribute" : i.hasOwnProperty(d) ? "property" : j.hasOwnProperty(d) ? "keyword" : k.hasOwnProperty(d) ? "property" : l.hasOwnProperty(d) ? "string-2" : p.hasOwnProperty(d) ? "atom" : o.hasOwnProperty(d) ? "keyword" : "error"
-            }
-            return c.context.type
-        }, E.atComponentBlock = function (a, b, c) {
-            return "}" == a ? C(a, b, c) : "{" == a ? A(c) && z(c, b, q ? "block" : "top", !1) : ("word" == a && (t = "error"), c.context.type)
-        }, E.atBlock_parens = function (a, b, c) {
-            return ")" == a ? A(c) : "{" == a || "}" == a ? C(a, b, c, 2) : E.atBlock(a, b, c)
-        }, E.restricted_atBlock_before = function (a, b, c) {
-            return "{" == a ? z(c, b, "restricted_atBlock") : "word" == a && "@counter-style" == c.stateArg ? (t = "variable", "restricted_atBlock_before") : B(a, b, c)
-        }, E.restricted_atBlock = function (a, b, c) {
-            return "}" == a ? (c.stateArg = null, A(c)) : "word" == a ? (t = "@font-face" == c.stateArg && !m.hasOwnProperty(b.current()
-                .toLowerCase()) || "@counter-style" == c.stateArg && !n.hasOwnProperty(b.current()
-                .toLowerCase()) ? "error" : "property", "maybeprop") : "restricted_atBlock"
-        }, E.keyframes = function (a, b, c) {
-            return "word" == a ? (t = "variable", "keyframes") : "{" == a ? z(c, b, "top") : B(a, b, c)
-        }, E.at = function (a, b, c) {
-            return ";" == a ? A(c) : "{" == a || "}" == a ? C(a, b, c) : ("word" == a ? t = "tag" : "hash" == a && (t = "builtin"), "at")
-        }, E.interpolation = function (a, b, c) {
-            return "}" == a ? A(c) : "{" == a || ";" == a ? C(a, b, c) : ("word" == a ? t = "variable" : "variable" != a && "(" != a && ")" != a && (t = "error"), "interpolation")
-        }, {
-            startState: function (a) {
-                return {
-                    tokenize: null,
-                    state: c.inline ? "block" : "top",
-                    stateArg: null,
-                    context: new y(c.inline ? "block" : "top", a || 0, null)
-                }
-            },
-            token: function (a, b) {
-                if (!b.tokenize && a.eatSpace()) return null;
-                var c = (b.tokenize || v)(a, b);
-                return c && "object" == typeof c && (s = c[1], c = c[0]), t = c, b.state = E[b.state](s, a, b), t
-            },
-            indent: function (a, b) {
-                var c = a.context,
-                    d = b && b.charAt(0),
-                    f = c.indent;
-                return "prop" != c.type || "}" != d && ")" != d || (c = c.prev), c.prev && ("}" != d || "block" != c.type && "top" != c.type && "interpolation" != c.type && "restricted_atBlock" != c.type ? (")" == d && ("parens" == c.type || "atBlock_parens" == c.type) || "{" == d && ("at" == c.type || "atBlock" == c.type)) && (f = Math.max(0, c.indent - e), c = c.prev) : (c = c.prev, f = c.indent)), f
-            },
-            electricChars: "}",
-            blockCommentStart: "/*",
-            blockCommentEnd: "*/",
-            fold: "brace"
-        }
-    });
-    var c = ["domain", "regexp", "url", "url-prefix"],
-        d = b(c),
-        e = ["all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed"],
-        f = b(e),
-        g = ["width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid", "orientation", "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", "pointer", "any-pointer", "hover", "any-hover"],
-        h = b(g),
-        i = ["landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", "interlace", "progressive"],
-        j = b(i),
-        k = ["align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "column-count", "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", "column-span", "column-width", "columns", "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "dominant-baseline", "drop-initial-after-adjust", "drop-initial-after-align", "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-start", "grid-row", "grid-row-end", "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", "marquee-style", "max-height", "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "object-fit", "object-position", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "region-break-after", "region-break-before", "region-break-inside", "region-fragment", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "color-interpolation", "color-interpolation-filters", "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", "glyph-orientation-vertical", "text-anchor", "writing-mode"],
-        l = b(k),
-        m = ["scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom"],
-        n = b(m),
-        o = ["font-family", "src", "unicode-range", "font-variant", "font-feature-settings", "font-stretch", "font-weight", "font-style"],
-        p = b(o),
-        q = ["additive-symbols", "fallback", "negative", "pad", "prefix", "range", "speak-as", "suffix", "symbols", "system"],
-        r = b(q),
-        s = ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen"],
-        t = b(s),
-        u = ["above", "absolute", "activeborder", "additive", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "column", "column-reverse", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "disclosure-closed", "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "japanese-formal", "japanese-informal", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "matrix", "matrix3d", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "simp-chinese-formal", "simp-chinese-informal", "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tamil", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "trad-chinese-formal", "trad-chinese-informal", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", "xx-large", "xx-small"],
-        v = b(u),
-        w = c.concat(e)
-        .concat(g)
-        .concat(i)
-        .concat(k)
-        .concat(m)
-        .concat(s)
-        .concat(u);
-    a.registerHelper("hintWords", "css", w), a.defineMIME("text/css", {
-        documentTypes: d,
-        mediaTypes: f,
-        mediaFeatures: h,
-        mediaValueKeywords: j,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        fontProperties: p,
-        counterDescriptors: r,
-        colorKeywords: t,
-        valueKeywords: v,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("*") ? (b.tokenize = x, x(a, b)) : !1
-            }
-        },
-        name: "css"
-    }), a.defineMIME("text/x-scss", {
-        mediaTypes: f,
-        mediaFeatures: h,
-        mediaValueKeywords: j,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        colorKeywords: t,
-        valueKeywords: v,
-        fontProperties: p,
-        allowNested: !0,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("/") ? (a.skipToEnd(), ["comment", "comment"]) : a.eat("*") ? (b.tokenize = x, x(a, b)) : ["operator", "operator"]
-            },
-            ":": function (a) {
-                return a.match(/\s*\{/) ? [null, "{"] : !1
-            },
-            $: function (a) {
-                return a.match(/^[\w-]+/), a.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"]
-            },
-            "#": function (a) {
-                return a.eat("{") ? [null, "interpolation"] : !1
-            }
-        },
-        name: "css",
-        helperType: "scss"
-    }), a.defineMIME("text/x-less", {
-        mediaTypes: f,
-        mediaFeatures: h,
-        mediaValueKeywords: j,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        colorKeywords: t,
-        valueKeywords: v,
-        fontProperties: p,
-        allowNested: !0,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("/") ? (a.skipToEnd(), ["comment", "comment"]) : a.eat("*") ? (b.tokenize = x, x(a, b)) : ["operator", "operator"]
-            },
-            "@": function (a) {
-                return a.eat("{") ? [null, "interpolation"] : a.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, !1) ? !1 : (a.eatWhile(/[\w\\\-]/), a.match(/^\s*:/, !1) ? ["variable-2", "variable-definition"] : ["variable-2", "variable"])
-            },
-            "&": function () {
-                return ["atom", "atom"]
-            }
-        },
-        name: "css",
-        helperType: "less"
-    }), a.defineMIME("text/x-gss", {
-        documentTypes: d,
-        mediaTypes: f,
-        mediaFeatures: h,
-        propertyKeywords: l,
-        nonStandardPropertyKeywords: n,
-        fontProperties: p,
-        counterDescriptors: r,
-        colorKeywords: t,
-        valueKeywords: v,
-        supportsAtComponent: !0,
-        tokenHooks: {
-            "/": function (a, b) {
-                return a.eat("*") ? (b.tokenize = x, x(a, b)) : !1
-            }
-        },
-        name: "css",
-        helperType: "gss"
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function c(a, b, c) {
-        var d = a.current(),
-            e = d.search(b);
-        return e > -1 ? a.backUp(d.length - e) : d.match(/<\/?$/) && (a.backUp(d.length), a.match(b, !1) || a.match(d)), c
-    }
-
-    function e(a) {
-        var b = d[a];
-        return b ? b : d[a] = new RegExp("\\s+" + a + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")
-    }
-
-    function f(a, b) {
-        for (var d, c = a.pos; c >= 0 && "<" !== a.string.charAt(c);) c--;
-        return 0 > c ? c : (d = a.string.slice(c, a.pos)
-            .match(e(b))) ? d[2] : ""
-    }
-
-    function g(a, b) {
-        return new RegExp((b ? "^" : "") + "</s*" + a + "s*>", "i")
-    }
-
-    function h(a, b) {
-        for (var c in a)
-            for (var d = b[c] || (b[c] = []), e = a[c], f = e.length - 1; f >= 0; f--) d.unshift(e[f])
-    }
-
-    function i(a, b) {
-        for (var c = 0; c < a.length; c++) {
-            var d = a[c];
-            if (!d[0] || d[1].test(f(b, d[0]))) return d[2]
-        }
-    }
-    var b = {
-            script: [["lang", /(javascript|babel)/i, "javascript"], ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"], ["type", /./, "text/plain"], [null, null, "javascript"]],
-            style: [["lang", /^css$/i, "css"], ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], ["type", /./, "text/plain"], [null, null, "css"]]
-        },
-        d = {};
-    a.defineMode("htmlmixed", function (d, e) {
-        function n(b, e) {
-            var m, h = e.htmlState.tagName,
-                k = h && j[h.toLowerCase()],
-                l = f.token(b, e.htmlState);
-            if (k && /\btag\b/.test(l) && ">" === b.current() && (m = i(k, b))) {
-                var o = a.getMode(d, m),
-                    p = g(h, !0),
-                    q = g(h, !1);
-                e.token = function (a, b) {
-                    return a.match(p, !1) ? (b.token = n, b.localState = b.localMode = null, null) : c(a, q, b.localMode.token(a, b.localState))
-                }, e.localMode = o, e.localState = a.startState(o, f.indent(e.htmlState, ""))
-            }
-            return l
-        }
-        var f = a.getMode(d, {
-                name: "xml",
-                htmlMode: !0,
-                multilineTagIndentFactor: e.multilineTagIndentFactor,
-                multilineTagIndentPastTag: e.multilineTagIndentPastTag
-            }),
-            j = {},
-            k = e && e.tags,
-            l = e && e.scriptTypes;
-        if (h(b, j), k && h(k, j), l)
-            for (var m = l.length - 1; m >= 0; m--) j.script.unshift(["type", l[m].matches, l[m].mode]);
-        return {
-            startState: function () {
-                var a = f.startState();
-                return {
-                    token: n,
-                    localMode: null,
-                    localState: null,
-                    htmlState: a
-                }
-            },
-            copyState: function (b) {
-                var c;
-                return b.localState && (c = a.copyState(b.localMode, b.localState)), {
-                    token: b.token,
-                    localMode: b.localMode,
-                    localState: c,
-                    htmlState: a.copyState(f, b.htmlState)
-                }
-            },
-            token: function (a, b) {
-                return b.token(a, b)
-            },
-            indent: function (b, c) {
-                return !b.localMode || /^\s*<\//.test(c) ? f.indent(b.htmlState, c) : b.localMode.indent ? b.localMode.indent(b.localState, c) : a.Pass
-            },
-            innerMode: function (a) {
-                return {
-                    state: a.localState || a.htmlState,
-                    mode: a.localMode || f
-                }
-            }
-        }
-    }, "xml", "javascript", "css"), a.defineMIME("text/html", "htmlmixed")
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.defineMode("javascript", function (b, c) {
-            function m(a) {
-                for (var c, b = !1, d = !1; null != (c = a.next());) {
-                    if (!b) {
-                        if ("/" == c && !d) return;
-                        "[" == c ? d = !0 : d && "]" == c && (d = !1)
-                    }
-                    b = !b && "\\" == c
-                }
-            }
-
-            function p(a, b, c) {
-                return n = a, o = c, b
-            }
-
-            function q(a, b) {
-                var c = a.next();
-                if ('"' == c || "'" == c) return b.tokenize = r(c), b.tokenize(a, b);
-                if ("." == c && a.match(/^\d+(?:[eE][+\-]?\d+)?/)) return p("number", "number");
-                if ("." == c && a.match("..")) return p("spread", "meta");
-                if (/[\[\]{}\(\),;\:\.]/.test(c)) return p(c);
-                if ("=" == c && a.eat(">")) return p("=>", "operator");
-                if ("0" == c && a.eat(/x/i)) return a.eatWhile(/[\da-f]/i), p("number", "number");
-                if (/\d/.test(c)) return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/), p("number", "number");
-                if ("/" == c) return a.eat("*") ? (b.tokenize = s, s(a, b)) : a.eat("/") ? (a.skipToEnd(), p("comment", "comment")) : "operator" == b.lastType || "keyword c" == b.lastType || "sof" == b.lastType || /^[\[{}\(,;:]$/.test(b.lastType) ? (m(a), a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/), p("regexp", "string-2")) : (a.eatWhile(k), p("operator", "operator", a.current()));
-                if ("`" == c) return b.tokenize = t, t(a, b);
-                if ("#" == c) return a.skipToEnd(), p("error", "error");
-                if (k.test(c)) return a.eatWhile(k), p("operator", "operator", a.current());
-                if (i.test(c)) {
-                    a.eatWhile(i);
-                    var d = a.current(),
-                        e = j.propertyIsEnumerable(d) && j[d];
-                    return e && "." != b.lastType ? p(e.type, e.style, d) : p("variable", "variable", d)
-                }
-            }
-
-            function r(a) {
-                return function (b, c) {
-                    var e, d = !1;
-                    if (f && "@" == b.peek() && b.match(l)) return c.tokenize = q, p("jsonld-keyword", "meta");
-                    for (; null != (e = b.next()) && (e != a || d);) d = !d && "\\" == e;
-                    return d || (c.tokenize = q), p("string", "string")
-                }
-            }
-
-            function s(a, b) {
-                for (var d, c = !1; d = a.next();) {
-                    if ("/" == d && c) {
-                        b.tokenize = q;
-                        break
-                    }
-                    c = "*" == d
-                }
-                return p("comment", "comment")
-            }
-
-            function t(a, b) {
-                for (var d, c = !1; null != (d = a.next());) {
-                    if (!c && ("`" == d || "$" == d && a.eat("{"))) {
-                        b.tokenize = q;
-                        break
-                    }
-                    c = !c && "\\" == d
-                }
-                return p("quasi", "string-2", a.current())
-            }
-
-            function v(a, b) {
-                b.fatArrowAt && (b.fatArrowAt = null);
-                var c = a.string.indexOf("=>", a.start);
-                if (!(0 > c)) {
-                    for (var d = 0, e = !1, f = c - 1; f >= 0; --f) {
-                        var g = a.string.charAt(f),
-                            h = u.indexOf(g);
-                        if (h >= 0 && 3 > h) {
-                            if (!d) {
-                                ++f;
-                                break
-                            }
-                            if (0 == --d) break
-                        } else if (h >= 3 && 6 > h) ++d;
-                        else if (i.test(g)) e = !0;
-                        else {
-                            if (/["'\/]/.test(g)) return;
-                            if (e && !d) {
-                                ++f;
-                                break
-                            }
-                        }
-                    }
-                    e && !d && (b.fatArrowAt = f)
-                }
-            }
-
-            function x(a, b, c, d, e, f) {
-                this.indented = a, this.column = b, this.type = c, this.prev = e, this.info = f, null != d && (this.align = d)
-            }
-
-            function y(a, b) {
-                for (var c = a.localVars; c; c = c.next)
-                    if (c.name == b) return !0;
-                for (var d = a.context; d; d = d.prev)
-                    for (var c = d.vars; c; c = c.next)
-                        if (c.name == b) return !0
-            }
-
-            function z(a, b, c, d, e) {
-                var f = a.cc;
-                for (A.state = a, A.stream = e, A.marked = null, A.cc = f, A.style = b, a.lexical.hasOwnProperty("align") || (a.lexical.align = !0);;) {
-                    var h = f.length ? f.pop() : g ? L : K;
-                    if (h(c, d)) {
-                        for (; f.length && f[f.length - 1].lex;) f.pop()();
-                        return A.marked ? A.marked : "variable" == c && y(a, d) ? "variable-2" : b
-                    }
-                }
-            }
-
-            function B() {
-                for (var a = arguments.length - 1; a >= 0; a--) A.cc.push(arguments[a])
-            }
-
-            function C() {
-                return B.apply(null, arguments), !0
-            }
-
-            function D(a) {
-                function b(b) {
-                    for (var c = b; c; c = c.next)
-                        if (c.name == a) return !0;
-                    return !1
-                }
-                var d = A.state;
-                if (d.context) {
-                    if (A.marked = "def", b(d.localVars)) return;
-                    d.localVars = {
-                        name: a,
-                        next: d.localVars
-                    }
-                } else {
-                    if (b(d.globalVars)) return;
-                    c.globalVars && (d.globalVars = {
-                        name: a,
-                        next: d.globalVars
-                    })
-                }
-            }
-
-            function F() {
-                A.state.context = {
-                    prev: A.state.context,
-                    vars: A.state.localVars
-                }, A.state.localVars = E
-            }
-
-            function G() {
-                A.state.localVars = A.state.context.vars, A.state.context = A.state.context.prev
-            }
-
-            function H(a, b) {
-                var c = function () {
-                    var c = A.state,
-                        d = c.indented;
-                    if ("stat" == c.lexical.type) d = c.lexical.indented;
-                    else
-                        for (var e = c.lexical; e && ")" == e.type && e.align; e = e.prev) d = e.indented;
-                    c.lexical = new x(d, A.stream.column(), a, null, c.lexical, b)
-                };
-                return c.lex = !0, c
-            }
-
-            function I() {
-                var a = A.state;
-                a.lexical.prev && (")" == a.lexical.type && (a.indented = a.lexical.indented), a.lexical = a.lexical.prev)
-            }
-
-            function J(a) {
-                function b(c) {
-                    return c == a ? C() : ";" == a ? B() : C(b)
-                }
-                return b
-            }
-
-            function K(a, b) {
-                return "var" == a ? C(H("vardef", b.length), fa, J(";"), I) : "keyword a" == a ? C(H("form"), L, K, I) : "keyword b" == a ? C(H("form"), K, I) : "{" == a ? C(H("}"), ba, I) : ";" == a ? C() : "if" == a ? ("else" == A.state.lexical.info && A.state.cc[A.state.cc.length - 1] == I && A.state.cc.pop()(), C(H("form"), L, K, I, ka)) : "function" == a ? C(qa) : "for" == a ? C(H("form"), la, K, I) : "variable" == a ? C(H("stat"), W) : "switch" == a ? C(H("form"), L, H("}", "switch"), J("{"), ba, I, I) : "case" == a ? C(L, J(":")) : "default" == a ? C(J(":")) : "catch" == a ? C(H("form"), F, J("("), ra, J(")"), K, I, G) : "class" == a ? C(H("form"), sa, I) : "export" == a ? C(H("form"), wa, I) : "import" == a ? C(H("form"), xa, I) : B(H("stat"), L, J(";"), I)
-            }
-
-            function L(a) {
-                return N(a, !1)
-            }
-
-            function M(a) {
-                return N(a, !0)
-            }
-
-            function N(a, b) {
-                if (A.state.fatArrowAt == A.stream.start) {
-                    var c = b ? V : U;
-                    if ("(" == a) return C(F, H(")"), _(ga, ")"), I, J("=>"), c, G);
-                    if ("variable" == a) return B(F, ga, J("=>"), c, G)
-                }
-                var d = b ? R : Q;
-                return w.hasOwnProperty(a) ? C(d) : "async" == a ? C(L) : "function" == a ? C(qa, d) : "keyword c" == a ? C(b ? P : O) : "(" == a ? C(H(")"), O, Da, J(")"), I, d) : "operator" == a || "spread" == a ? C(b ? M : L) : "[" == a ? C(H("]"), Ba, I, d) : "{" == a ? aa(Y, "}", null, d) : "quasi" == a ? B(S, d) : C()
-            }
-
-            function O(a) {
-                return a.match(/[;\}\)\],]/) ? B() : B(L)
-            }
-
-            function P(a) {
-                return a.match(/[;\}\)\],]/) ? B() : B(M)
-            }
-
-            function Q(a, b) {
-                return "," == a ? C(L) : R(a, b, !1)
-            }
-
-            function R(a, b, c) {
-                var d = 0 == c ? Q : R,
-                    e = 0 == c ? L : M;
-                return "=>" == a ? C(F, c ? V : U, G) : "operator" == a ? /\+\+|--/.test(b) ? C(d) : "?" == b ? C(L, J(":"), e) : C(e) : "quasi" == a ? B(S, d) : ";" != a ? "(" == a ? aa(M, ")", "call", d) : "." == a ? C(X, d) : "[" == a ? C(H("]"), O, J("]"), I, d) : void 0 : void 0
-            }
-
-            function S(a, b) {
-                return "quasi" != a ? B() : "${" != b.slice(b.length - 2) ? C(S) : C(L, T)
-            }
-
-            function T(a) {
-                return "}" == a ? (A.marked = "string-2", A.state.tokenize = t, C(S)) : void 0
-            }
-
-            function U(a) {
-                return v(A.stream, A.state), B("{" == a ? K : L)
-            }
-
-            function V(a) {
-                return v(A.stream, A.state), B("{" == a ? K : M)
-            }
-
-            function W(a) {
-                return ":" == a ? C(I, K) : B(Q, J(";"), I)
-            }
-
-            function X(a) {
-                return "variable" == a ? (A.marked = "property", C()) : void 0
-            }
-
-            function Y(a, b) {
-                return "async" == a ? C(Y) : "variable" == a || "keyword" == A.style ? (A.marked = "property", C("get" == b || "set" == b ? Z : $)) : "number" == a || "string" == a ? (A.marked = f ? "property" : A.style + " property", C($)) : "jsonld-keyword" == a ? C($) : "[" == a ? C(L, J("]"), $) : void 0
-            }
-
-            function Z(a) {
-                return "variable" != a ? B($) : (A.marked = "property", C(qa))
-            }
-
-            function $(a) {
-                return ":" == a ? C(M) : "(" == a ? B(qa) : void 0
-            }
-
-            function _(a, b) {
-                function c(d) {
-                    if ("," == d) {
-                        var e = A.state.lexical;
-                        return "call" == e.info && (e.pos = (e.pos || 0) + 1), C(a, c)
-                    }
-                    return d == b ? C() : C(J(b))
-                }
-                return function (d) {
-                    return d == b ? C() : B(a, c)
-                }
-            }
-
-            function aa(a, b, c) {
-                for (var d = 3; d < arguments.length; d++) A.cc.push(arguments[d]);
-                return C(H(b, c), _(a, b), I)
-            }
-
-            function ba(a) {
-                return "}" == a ? C() : B(K, ba)
-            }
-
-            function ca(a) {
-                return h && ":" == a ? C(ea) : void 0
-            }
-
-            function da(a, b) {
-                return "=" == b ? C(M) : void 0
-            }
-
-            function ea(a) {
-                return "variable" == a ? (A.marked = "variable-3", C()) : void 0
-            }
-
-            function fa() {
-                return B(ga, ca, ia, ja)
-            }
-
-            function ga(a, b) {
-                return "variable" == a ? (D(b), C()) : "[" == a ? aa(ga, "]") : "{" == a ? aa(ha, "}") : void 0
-            }
-
-            function ha(a, b) {
-                return "variable" != a || A.stream.match(/^\s*:/, !1) ? ("variable" == a && (A.marked = "property"), C(J(":"), ga, ia)) : (D(b), C(ia))
-            }
-
-            function ia(a, b) {
-                return "=" == b ? C(M) : void 0
-            }
-
-            function ja(a) {
-                return "," == a ? C(fa) : void 0
-            }
-
-            function ka(a, b) {
-                return "keyword b" == a && "else" == b ? C(H("form", "else"), K, I) : void 0
-            }
-
-            function la(a) {
-                return "(" == a ? C(H(")"), ma, J(")"), I) : void 0
-            }
-
-            function ma(a) {
-                return "var" == a ? C(fa, J(";"), oa) : ";" == a ? C(oa) : "variable" == a ? C(na) : B(L, J(";"), oa)
-            }
-
-            function na(a, b) {
-                return "in" == b || "of" == b ? (A.marked = "keyword", C(L)) : C(Q, oa)
-            }
-
-            function oa(a, b) {
-                return ";" == a ? C(pa) : "in" == b || "of" == b ? (A.marked = "keyword", C(L)) : B(L, J(";"), pa)
-            }
-
-            function pa(a) {
-                ")" != a && C(L)
-            }
-
-            function qa(a, b) {
-                return "*" == b ? (A.marked = "keyword", C(qa)) : "variable" == a ? (D(b), C(qa)) : "(" == a ? C(F, H(")"), _(ra, ")"), I, K, G) : void 0
-            }
-
-            function ra(a) {
-                return "spread" == a ? C(ra) : B(ga, ca, da)
-            }
-
-            function sa(a, b) {
-                return "variable" == a ? (D(b), C(ta)) : void 0
-            }
-
-            function ta(a, b) {
-                return "extends" == b ? C(L, ta) : "{" == a ? C(H("}"), ua, I) : void 0
-            }
-
-            function ua(a, b) {
-                return "variable" == a || "keyword" == A.style ? "static" == b ? (A.marked = "keyword", C(ua)) : (A.marked = "property", "get" == b || "set" == b ? C(va, qa, ua) : C(qa, ua)) : "*" == b ? (A.marked = "keyword", C(ua)) : ";" == a ? C(ua) : "}" == a ? C() : void 0
-            }
-
-            function va(a) {
-                return "variable" != a ? B() : (A.marked = "property", C())
-            }
-
-            function wa(a, b) {
-                return "*" == b ? (A.marked = "keyword", C(Aa, J(";"))) : "default" == b ? (A.marked = "keyword", C(L, J(";"))) : B(K)
-            }
-
-            function xa(a) {
-                return "string" == a ? C() : B(ya, Aa)
-            }
-
-            function ya(a, b) {
-                return "{" == a ? aa(ya, "}") : ("variable" == a && D(b), "*" == b && (A.marked = "keyword"), C(za))
-            }
-
-            function za(a, b) {
-                return "as" == b ? (A.marked = "keyword", C(ya)) : void 0
-            }
-
-            function Aa(a, b) {
-                return "from" == b ? (A.marked = "keyword", C(L)) : void 0
-            }
-
-            function Ba(a) {
-                return "]" == a ? C() : B(M, Ca)
-            }
-
-            function Ca(a) {
-                return "for" == a ? B(Da, J("]")) : "," == a ? C(_(P, "]")) : B(_(M, "]"))
-            }
-
-            function Da(a) {
-                return "for" == a ? C(la, Da) : "if" == a ? C(L, Da) : void 0
-            }
-
-            function Ea(a, b) {
-                return "operator" == a.lastType || "," == a.lastType || k.test(b.charAt(0)) || /[,.]/.test(b.charAt(0))
-            }
-            var n, o, d = b.indentUnit,
-                e = c.statementIndent,
-                f = c.jsonld,
-                g = c.json || f,
-                h = c.typescript,
-                i = c.wordCharacters || /[\w$\xa1-\uffff]/,
-                j = function () {
-                    function a(a) {
-                        return {
-                            type: a,
-                            style: "keyword"
-                        }
-                    }
-                    var b = a("keyword a"),
-                        c = a("keyword b"),
-                        d = a("keyword c"),
-                        e = a("operator"),
-                        f = {
-                            type: "atom",
-                            style: "atom"
-                        },
-                        g = {
-                            "if": a("if"),
-                            "while": b,
-                            "with": b,
-                            "else": c,
-                            "do": c,
-                            "try": c,
-                            "finally": c,
-                            "return": d,
-                            "break": d,
-                            "continue": d,
-                            "new": d,
-                            "delete": d,
-                            "throw": d,
-                            "debugger": d,
-                            "var": a("var"),
-                            "const": a("var"),
-                            let: a("var"),
-                            async: a("async"),
-                            "function": a("function"),
-                            "catch": a("catch"),
-                            "for": a("for"),
-                            "switch": a("switch"),
-                            "case": a("case"),
-                            "default": a("default"),
-                            "in": e,
-                            "typeof": e,
-                            "instanceof": e,
-                            "true": f,
-                            "false": f,
-                            "null": f,
-                            undefined: f,
-                            NaN: f,
-                            Infinity: f,
-                            "this": a("this"),
-                            "class": a("class"),
-                            "super": a("atom"),
-                            await: d,
-                            "yield": d,
-                            "export": a("export"),
-                            "import": a("import"),
-                            "extends": d
-                        };
-                    if (h) {
-                        var i = {
-                                type: "variable",
-                                style: "variable-3"
-                            },
-                            j = {
-                                "interface": a("interface"),
-                                "extends": a("extends"),
-                                constructor: a("constructor"),
-                                "public": a("public"),
-                                "private": a("private"),
-                                "protected": a("protected"),
-                                "static": a("static"),
-                                string: i,
-                                number: i,
-                                bool: i,
-                                any: i
-                            };
-                        for (var k in j) g[k] = j[k]
-                    }
-                    return g
-                }(),
-                k = /[+\-*&%=<>!?|~^]/,
-                l = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,
-                u = "([{}])",
-                w = {
-                    atom: !0,
-                    number: !0,
-                    variable: !0,
-                    string: !0,
-                    regexp: !0,
-                    "this": !0,
-                    "jsonld-keyword": !0
-                },
-                A = {
-                    state: null,
-                    column: null,
-                    marked: null,
-                    cc: null
-                },
-                E = {
-                    name: "this",
-                    next: {
-                        name: "arguments"
-                    }
-                };
-            return I.lex = !0, {
-                startState: function (a) {
-                    var b = {
-                        tokenize: q,
-                        lastType: "sof",
-                        cc: [],
-                        lexical: new x((a || 0) - d, 0, "block", !1),
-                        localVars: c.localVars,
-                        context: c.localVars && {
-                            vars: c.localVars
-                        },
-                        indented: 0
-                    };
-                    return c.globalVars && "object" == typeof c.globalVars && (b.globalVars = c.globalVars), b
-                },
-                token: function (a, b) {
-                    if (a.sol() && (b.lexical.hasOwnProperty("align") || (b.lexical.align = !1), b.indented = a.indentation(), v(a, b)), b.tokenize != s && a.eatSpace()) return null;
-                    var c = b.tokenize(a, b);
-                    return "comment" == n ? c : (b.lastType = "operator" != n || "++" != o && "--" != o ? n : "incdec", z(b, c, n, o, a))
-                },
-                indent: function (b, f) {
-                    if (b.tokenize == s) return a.Pass;
-                    if (b.tokenize != q) return 0;
-                    var g = f && f.charAt(0),
-                        h = b.lexical;
-                    if (!/^\s*else\b/.test(f))
-                        for (var i = b.cc.length - 1; i >= 0; --i) {
-                            var j = b.cc[i];
-                            if (j == I) h = h.prev;
-                            else if (j != ka) break
-                        }
-                    "stat" == h.type && "}" == g && (h = h.prev), e && ")" == h.type && "stat" == h.prev.type && (h = h.prev);
-                    var k = h.type,
-                        l = g == k;
-                    return "vardef" == k ? h.indented + ("operator" == b.lastType || "," == b.lastType ? h.info + 1 : 0) : "form" == k && "{" == g ? h.indented : "form" == k ? h.indented + d : "stat" == k ? h.indented + (Ea(b, f) ? e || d : 0) : "switch" != h.info || l || 0 == c.doubleIndentSwitch ? h.align ? h.column + (l ? 0 : 1) : h.indented + (l ? 0 : d) : h.indented + (/^(?:case|default)\b/.test(f) ? d : 2 * d)
-                },
-                electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
-                blockCommentStart: g ? null : "/*",
-                blockCommentEnd: g ? null : "*/",
-                lineComment: g ? null : "//",
-                fold: "brace",
-                closeBrackets: "()[]{}''\"\"``",
-                helperType: g ? "json" : "javascript",
-                jsonldMode: f,
-                jsonMode: g
-            }
-        }), a.registerHelper("wordChars", "javascript", /[\w$]/), a.defineMIME("text/javascript", "javascript"), a.defineMIME("text/ecmascript", "javascript"), a.defineMIME("application/javascript", "javascript"),
-        a.defineMIME("application/x-javascript", "javascript"), a.defineMIME("application/ecmascript", "javascript"), a.defineMIME("application/json", {
-            name: "javascript",
-            json: !0
-        }), a.defineMIME("application/x-json", {
-            name: "javascript",
-            json: !0
-        }), a.defineMIME("application/ld+json", {
-            name: "javascript",
-            jsonld: !0
-        }), a.defineMIME("text/typescript", {
-            name: "javascript",
-            typescript: !0
-        }), a.defineMIME("application/typescript", {
-            name: "javascript",
-            typescript: !0
-        })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a, b) {
-        return a.string.charAt(a.pos + (b || 0))
-    }
-
-    function c(a, b) {
-        if (b) {
-            var c = a.pos - b;
-            return a.string.substr(c >= 0 ? c : 0, b)
-        }
-        return a.string.substr(0, a.pos - 1)
-    }
-
-    function d(a, b) {
-        var c = a.string.length,
-            d = c - a.pos + 1;
-        return a.string.substr(a.pos, b && c > b ? b : d)
-    }
-
-    function e(a, b) {
-        var d, c = a.pos + b;
-        0 >= c ? a.pos = 0 : c >= (d = a.string.length - 1) ? a.pos = d : a.pos = c
-    }
-    a.defineMode("perl", function () {
-        function h(a, b, c, d, e) {
-            return b.chain = null, b.style = null, b.tail = null, b.tokenize = function (a, b) {
-                for (var g, f = !1, h = 0; g = a.next();) {
-                    if (g === c[h] && !f) return void 0 !== c[++h] ? (b.chain = c[h], b.style = d, b.tail = e) : e && a.eatWhile(e), b.tokenize = j, d;
-                    f = !f && "\\" == g
-                }
-                return d
-            }, b.tokenize(a, b)
-        }
-
-        function i(a, b, c) {
-            return b.tokenize = function (a, b) {
-                return a.string == c && (b.tokenize = j), a.skipToEnd(), "string"
-            }, b.tokenize(a, b)
-        }
-
-        function j(j, k) {
-            if (j.eatSpace()) return null;
-            if (k.chain) return h(j, k, k.chain, k.style, k.tail);
-            if (j.match(/^\-?[\d\.]/, !1) && j.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) return "number";
-            if (j.match(/^<<(?=\w)/)) return j.eatWhile(/\w/), i(j, k, j.current()
-                .substr(2));
-            if (j.sol() && j.match(/^\=item(?!\w)/)) return i(j, k, "=cut");
-            var l = j.next();
-            if ('"' == l || "'" == l) {
-                if (c(j, 3) == "<<" + l) {
-                    var m = j.pos;
-                    j.eatWhile(/\w/);
-                    var n = j.current()
-                        .substr(1);
-                    if (n && j.eat(l)) return i(j, k, n);
-                    j.pos = m
-                }
-                return h(j, k, [l], "string")
-            }
-            if ("q" == l) {
-                var o = b(j, -2);
-                if (!o || !/\w/.test(o))
-                    if (o = b(j, 0), "x" == o) {
-                        if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], f, g);
-                        if ("[" == o) return e(j, 2), h(j, k, ["]"], f, g);
-                        if ("{" == o) return e(j, 2), h(j, k, ["}"], f, g);
-                        if ("<" == o) return e(j, 2), h(j, k, [">"], f, g);
-                        if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], f, g)
-                    } else if ("q" == o) {
-                    if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], "string");
-                    if ("[" == o) return e(j, 2), h(j, k, ["]"], "string");
-                    if ("{" == o) return e(j, 2), h(j, k, ["}"], "string");
-                    if ("<" == o) return e(j, 2), h(j, k, [">"], "string");
-                    if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], "string")
-                } else if ("w" == o) {
-                    if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], "bracket");
-                    if ("[" == o) return e(j, 2), h(j, k, ["]"], "bracket");
-                    if ("{" == o) return e(j, 2), h(j, k, ["}"], "bracket");
-                    if ("<" == o) return e(j, 2), h(j, k, [">"], "bracket");
-                    if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], "bracket")
-                } else if ("r" == o) {
-                    if (o = b(j, 1), "(" == o) return e(j, 2), h(j, k, [")"], f, g);
-                    if ("[" == o) return e(j, 2), h(j, k, ["]"], f, g);
-                    if ("{" == o) return e(j, 2), h(j, k, ["}"], f, g);
-                    if ("<" == o) return e(j, 2), h(j, k, [">"], f, g);
-                    if (/[\^'"!~\/]/.test(o)) return e(j, 1), h(j, k, [j.eat(o)], f, g)
-                } else if (/[\^'"!~\/(\[{<]/.test(o)) {
-                    if ("(" == o) return e(j, 1), h(j, k, [")"], "string");
-                    if ("[" == o) return e(j, 1), h(j, k, ["]"], "string");
-                    if ("{" == o) return e(j, 1), h(j, k, ["}"], "string");
-                    if ("<" == o) return e(j, 1), h(j, k, [">"], "string");
-                    if (/[\^'"!~\/]/.test(o)) return h(j, k, [j.eat(o)], "string")
-                }
-            }
-            if ("m" == l) {
-                var o = b(j, -2);
-                if ((!o || !/\w/.test(o)) && (o = j.eat(/[(\[{<\^'"!~\/]/))) {
-                    if (/[\^'"!~\/]/.test(o)) return h(j, k, [o], f, g);
-                    if ("(" == o) return h(j, k, [")"], f, g);
-                    if ("[" == o) return h(j, k, ["]"], f, g);
-                    if ("{" == o) return h(j, k, ["}"], f, g);
-                    if ("<" == o) return h(j, k, [">"], f, g)
-                }
-            }
-            if ("s" == l) {
-                var o = /[\/>\]})\w]/.test(b(j, -2));
-                if (!o && (o = j.eat(/[(\[{<\^'"!~\/]/))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
-            }
-            if ("y" == l) {
-                var o = /[\/>\]})\w]/.test(b(j, -2));
-                if (!o && (o = j.eat(/[(\[{<\^'"!~\/]/))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
-            }
-            if ("t" == l) {
-                var o = /[\/>\]})\w]/.test(b(j, -2));
-                if (!o && (o = j.eat("r"), o && (o = j.eat(/[(\[{<\^'"!~\/]/)))) return "[" == o ? h(j, k, ["]", "]"], f, g) : "{" == o ? h(j, k, ["}", "}"], f, g) : "<" == o ? h(j, k, [">", ">"], f, g) : "(" == o ? h(j, k, [")", ")"], f, g) : h(j, k, [o, o], f, g)
-            }
-            if ("`" == l) return h(j, k, [l], "variable-2");
-            if ("/" == l) return /~\s*$/.test(c(j)) ? h(j, k, [l], f, g) : "operator";
-            if ("$" == l) {
-                var m = j.pos;
-                if (j.eatWhile(/\d/) || j.eat("{") && j.eatWhile(/\d/) && j.eat("}")) return "variable-2";
-                j.pos = m
-            }
-            if (/[$@%]/.test(l)) {
-                var m = j.pos;
-                if (j.eat("^") && j.eat(/[A-Z]/) || !/[@$%&]/.test(b(j, -2)) && j.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)) {
-                    var o = j.current();
-                    if (a[o]) return "variable-2"
-                }
-                j.pos = m
-            }
-            if (/[$@%&]/.test(l) && (j.eatWhile(/[\w$\[\]]/) || j.eat("{") && j.eatWhile(/[\w$\[\]]/) && j.eat("}"))) {
-                var o = j.current();
-                return a[o] ? "variable-2" : "variable"
-            }
-            if ("#" == l && "$" != b(j, -2)) return j.skipToEnd(), "comment";
-            if (/[:+\-\^*$&%@=<>!?|\/~\.]/.test(l)) {
-                var m = j.pos;
-                if (j.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/), a[j.current()]) return "operator";
-                j.pos = m
-            }
-            if ("_" == l && 1 == j.pos) {
-                if ("_END__" == d(j, 6)) return h(j, k, ["\x00"], "comment");
-                if ("_DATA__" == d(j, 7)) return h(j, k, ["\x00"], "variable-2");
-                if ("_C__" == d(j, 7)) return h(j, k, ["\x00"], "string")
-            }
-            if (/\w/.test(l)) {
-                var m = j.pos;
-                if ("{" == b(j, -2) && ("}" == b(j, 0) || j.eatWhile(/\w/) && "}" == b(j, 0))) return "string";
-                j.pos = m
-            }
-            if (/[A-Z]/.test(l)) {
-                var p = b(j, -2),
-                    m = j.pos;
-                if (j.eatWhile(/[A-Z_]/), !/[\da-z]/.test(b(j, 0))) {
-                    var o = a[j.current()];
-                    return o ? (o[1] && (o = o[0]), ":" != p ? 1 == o ? "keyword" : 2 == o ? "def" : 3 == o ? "atom" : 4 == o ? "operator" : 5 == o ? "variable-2" : "meta" : "meta") : "meta"
-                }
-                j.pos = m
-            }
-            if (/[a-zA-Z_]/.test(l)) {
-                var p = b(j, -2);
-                j.eatWhile(/\w/);
-                var o = a[j.current()];
-                return o ? (o[1] && (o = o[0]), ":" != p ? 1 == o ? "keyword" : 2 == o ? "def" : 3 == o ? "atom" : 4 == o ? "operator" : 5 == o ? "variable-2" : "meta" : "meta") : "meta"
-            }
-            return null
-        }
-        var a = {
-                "->": 4,
-                "++": 4,
-                "--": 4,
-                "**": 4,
-                "=~": 4,
-                "!~": 4,
-                "*": 4,
-                "/": 4,
-                "%": 4,
-                x: 4,
-                "+": 4,
-                "-": 4,
-                ".": 4,
-                "<<": 4,
-                ">>": 4,
-                "<": 4,
-                ">": 4,
-                "<=": 4,
-                ">=": 4,
-                lt: 4,
-                gt: 4,
-                le: 4,
-                ge: 4,
-                "==": 4,
-                "!=": 4,
-                "<=>": 4,
-                eq: 4,
-                ne: 4,
-                cmp: 4,
-                "~~": 4,
-                "&": 4,
-                "|": 4,
-                "^": 4,
-                "&&": 4,
-                "||": 4,
-                "//": 4,
-                "..": 4,
-                "...": 4,
-                "?": 4,
-                ":": 4,
-                "=": 4,
-                "+=": 4,
-                "-=": 4,
-                "*=": 4,
-                ",": 4,
-                "=>": 4,
-                "::": 4,
-                not: 4,
-                and: 4,
-                or: 4,
-                xor: 4,
-                BEGIN: [5, 1],
-                END: [5, 1],
-                PRINT: [5, 1],
-                PRINTF: [5, 1],
-                GETC: [5, 1],
-                READ: [5, 1],
-                READLINE: [5, 1],
-                DESTROY: [5, 1],
-                TIE: [5, 1],
-                TIEHANDLE: [5, 1],
-                UNTIE: [5, 1],
-                STDIN: 5,
-                STDIN_TOP: 5,
-                STDOUT: 5,
-                STDOUT_TOP: 5,
-                STDERR: 5,
-                STDERR_TOP: 5,
-                $ARG: 5,
-                $_: 5,
-                "@ARG": 5,
-                "@_": 5,
-                $LIST_SEPARATOR: 5,
-                '$"': 5,
-                $PROCESS_ID: 5,
-                $PID: 5,
-                $$: 5,
-                $REAL_GROUP_ID: 5,
-                $GID: 5,
-                "$(": 5,
-                $EFFECTIVE_GROUP_ID: 5,
-                $EGID: 5,
-                "$)": 5,
-                $PROGRAM_NAME: 5,
-                $0: 5,
-                $SUBSCRIPT_SEPARATOR: 5,
-                $SUBSEP: 5,
-                "$;": 5,
-                $REAL_USER_ID: 5,
-                $UID: 5,
-                "$<": 5,
-                $EFFECTIVE_USER_ID: 5,
-                $EUID: 5,
-                "$>": 5,
-                $a: 5,
-                $b: 5,
-                $COMPILING: 5,
-                "$^C": 5,
-                $DEBUGGING: 5,
-                "$^D": 5,
-                "${^ENCODING}": 5,
-                $ENV: 5,
-                "%ENV": 5,
-                $SYSTEM_FD_MAX: 5,
-                "$^F": 5,
-                "@F": 5,
-                "${^GLOBAL_PHASE}": 5,
-                "$^H": 5,
-                "%^H": 5,
-                "@INC": 5,
-                "%INC": 5,
-                $INPLACE_EDIT: 5,
-                "$^I": 5,
-                "$^M": 5,
-                $OSNAME: 5,
-                "$^O": 5,
-                "${^OPEN}": 5,
-                $PERLDB: 5,
-                "$^P": 5,
-                $SIG: 5,
-                "%SIG": 5,
-                $BASETIME: 5,
-                "$^T": 5,
-                "${^TAINT}": 5,
-                "${^UNICODE}": 5,
-                "${^UTF8CACHE}": 5,
-                "${^UTF8LOCALE}": 5,
-                $PERL_VERSION: 5,
-                "$^V": 5,
-                "${^WIN32_SLOPPY_STAT}": 5,
-                $EXECUTABLE_NAME: 5,
-                "$^X": 5,
-                $1: 5,
-                $MATCH: 5,
-                "$&": 5,
-                "${^MATCH}": 5,
-                $PREMATCH: 5,
-                "$`": 5,
-                "${^PREMATCH}": 5,
-                $POSTMATCH: 5,
-                "$'": 5,
-                "${^POSTMATCH}": 5,
-                $LAST_PAREN_MATCH: 5,
-                "$+": 5,
-                $LAST_SUBMATCH_RESULT: 5,
-                "$^N": 5,
-                "@LAST_MATCH_END": 5,
-                "@+": 5,
-                "%LAST_PAREN_MATCH": 5,
-                "%+": 5,
-                "@LAST_MATCH_START": 5,
-                "@-": 5,
-                "%LAST_MATCH_START": 5,
-                "%-": 5,
-                $LAST_REGEXP_CODE_RESULT: 5,
-                "$^R": 5,
-                "${^RE_DEBUG_FLAGS}": 5,
-                "${^RE_TRIE_MAXBUF}": 5,
-                $ARGV: 5,
-                "@ARGV": 5,
-                ARGV: 5,
-                ARGVOUT: 5,
-                $OUTPUT_FIELD_SEPARATOR: 5,
-                $OFS: 5,
-                "$,": 5,
-                $INPUT_LINE_NUMBER: 5,
-                $NR: 5,
-                "$.": 5,
-                $INPUT_RECORD_SEPARATOR: 5,
-                $RS: 5,
-                "$/": 5,
-                $OUTPUT_RECORD_SEPARATOR: 5,
-                $ORS: 5,
-                "$\\": 5,
-                $OUTPUT_AUTOFLUSH: 5,
-                "$|": 5,
-                $ACCUMULATOR: 5,
-                "$^A": 5,
-                $FORMAT_FORMFEED: 5,
-                "$^L": 5,
-                $FORMAT_PAGE_NUMBER: 5,
-                "$%": 5,
-                $FORMAT_LINES_LEFT: 5,
-                "$-": 5,
-                $FORMAT_LINE_BREAK_CHARACTERS: 5,
-                "$:": 5,
-                $FORMAT_LINES_PER_PAGE: 5,
-                "$=": 5,
-                $FORMAT_TOP_NAME: 5,
-                "$^": 5,
-                $FORMAT_NAME: 5,
-                "$~": 5,
-                "${^CHILD_ERROR_NATIVE}": 5,
-                $EXTENDED_OS_ERROR: 5,
-                "$^E": 5,
-                $EXCEPTIONS_BEING_CAUGHT: 5,
-                "$^S": 5,
-                $WARNING: 5,
-                "$^W": 5,
-                "${^WARNING_BITS}": 5,
-                $OS_ERROR: 5,
-                $ERRNO: 5,
-                "$!": 5,
-                "%OS_ERROR": 5,
-                "%ERRNO": 5,
-                "%!": 5,
-                $CHILD_ERROR: 5,
-                "$?": 5,
-                $EVAL_ERROR: 5,
-                "$@": 5,
-                $OFMT: 5,
-                "$#": 5,
-                "$*": 5,
-                $ARRAY_BASE: 5,
-                "$[": 5,
-                $OLD_PERL_VERSION: 5,
-                "$]": 5,
-                "if": [1, 1],
-                elsif: [1, 1],
-                "else": [1, 1],
-                "while": [1, 1],
-                unless: [1, 1],
-                "for": [1, 1],
-                foreach: [1, 1],
-                abs: 1,
-                accept: 1,
-                alarm: 1,
-                atan2: 1,
-                bind: 1,
-                binmode: 1,
-                bless: 1,
-                bootstrap: 1,
-                "break": 1,
-                caller: 1,
-                chdir: 1,
-                chmod: 1,
-                chomp: 1,
-                chop: 1,
-                chown: 1,
-                chr: 1,
-                chroot: 1,
-                close: 1,
-                closedir: 1,
-                connect: 1,
-                "continue": [1, 1],
-                cos: 1,
-                crypt: 1,
-                dbmclose: 1,
-                dbmopen: 1,
-                "default": 1,
-                defined: 1,
-                "delete": 1,
-                die: 1,
-                "do": 1,
-                dump: 1,
-                each: 1,
-                endgrent: 1,
-                endhostent: 1,
-                endnetent: 1,
-                endprotoent: 1,
-                endpwent: 1,
-                endservent: 1,
-                eof: 1,
-                eval: 1,
-                exec: 1,
-                exists: 1,
-                exit: 1,
-                exp: 1,
-                fcntl: 1,
-                fileno: 1,
-                flock: 1,
-                fork: 1,
-                format: 1,
-                formline: 1,
-                getc: 1,
-                getgrent: 1,
-                getgrgid: 1,
-                getgrnam: 1,
-                gethostbyaddr: 1,
-                gethostbyname: 1,
-                gethostent: 1,
-                getlogin: 1,
-                getnetbyaddr: 1,
-                getnetbyname: 1,
-                getnetent: 1,
-                getpeername: 1,
-                getpgrp: 1,
-                getppid: 1,
-                getpriority: 1,
-                getprotobyname: 1,
-                getprotobynumber: 1,
-                getprotoent: 1,
-                getpwent: 1,
-                getpwnam: 1,
-                getpwuid: 1,
-                getservbyname: 1,
-                getservbyport: 1,
-                getservent: 1,
-                getsockname: 1,
-                getsockopt: 1,
-                given: 1,
-                glob: 1,
-                gmtime: 1,
-                "goto": 1,
-                grep: 1,
-                hex: 1,
-                "import": 1,
-                index: 1,
-                "int": 1,
-                ioctl: 1,
-                join: 1,
-                keys: 1,
-                kill: 1,
-                last: 1,
-                lc: 1,
-                lcfirst: 1,
-                length: 1,
-                link: 1,
-                listen: 1,
-                local: 2,
-                localtime: 1,
-                lock: 1,
-                log: 1,
-                lstat: 1,
-                m: null,
-                map: 1,
-                mkdir: 1,
-                msgctl: 1,
-                msgget: 1,
-                msgrcv: 1,
-                msgsnd: 1,
-                my: 2,
-                "new": 1,
-                next: 1,
-                no: 1,
-                oct: 1,
-                open: 1,
-                opendir: 1,
-                ord: 1,
-                our: 2,
-                pack: 1,
-                "package": 1,
-                pipe: 1,
-                pop: 1,
-                pos: 1,
-                print: 1,
-                printf: 1,
-                prototype: 1,
-                push: 1,
-                q: null,
-                qq: null,
-                qr: null,
-                quotemeta: null,
-                qw: null,
-                qx: null,
-                rand: 1,
-                read: 1,
-                readdir: 1,
-                readline: 1,
-                readlink: 1,
-                readpipe: 1,
-                recv: 1,
-                redo: 1,
-                ref: 1,
-                rename: 1,
-                require: 1,
-                reset: 1,
-                "return": 1,
-                reverse: 1,
-                rewinddir: 1,
-                rindex: 1,
-                rmdir: 1,
-                s: null,
-                say: 1,
-                scalar: 1,
-                seek: 1,
-                seekdir: 1,
-                select: 1,
-                semctl: 1,
-                semget: 1,
-                semop: 1,
-                send: 1,
-                setgrent: 1,
-                sethostent: 1,
-                setnetent: 1,
-                setpgrp: 1,
-                setpriority: 1,
-                setprotoent: 1,
-                setpwent: 1,
-                setservent: 1,
-                setsockopt: 1,
-                shift: 1,
-                shmctl: 1,
-                shmget: 1,
-                shmread: 1,
-                shmwrite: 1,
-                shutdown: 1,
-                sin: 1,
-                sleep: 1,
-                socket: 1,
-                socketpair: 1,
-                sort: 1,
-                splice: 1,
-                split: 1,
-                sprintf: 1,
-                sqrt: 1,
-                srand: 1,
-                stat: 1,
-                state: 1,
-                study: 1,
-                sub: 1,
-                substr: 1,
-                symlink: 1,
-                syscall: 1,
-                sysopen: 1,
-                sysread: 1,
-                sysseek: 1,
-                system: 1,
-                syswrite: 1,
-                tell: 1,
-                telldir: 1,
-                tie: 1,
-                tied: 1,
-                time: 1,
-                times: 1,
-                tr: null,
-                truncate: 1,
-                uc: 1,
-                ucfirst: 1,
-                umask: 1,
-                undef: 1,
-                unlink: 1,
-                unpack: 1,
-                unshift: 1,
-                untie: 1,
-                use: 1,
-                utime: 1,
-                values: 1,
-                vec: 1,
-                wait: 1,
-                waitpid: 1,
-                wantarray: 1,
-                warn: 1,
-                when: 1,
-                write: 1,
-                y: null
-            },
-            f = "string-2",
-            g = /[goseximacplud]/;
-        return {
-            startState: function () {
-                return {
-                    tokenize: j,
-                    chain: null,
-                    style: null,
-                    tail: null
-                }
-            },
-            token: function (a, b) {
-                return (b.tokenize || j)(a, b)
-            },
-            lineComment: "#"
-        }
-    }), a.registerHelper("wordChars", "perl", /[\w$]/), a.defineMIME("text/x-perl", "perl")
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a) {
-        return new RegExp("^((" + a.join(")|(") + "))\\b")
-    }
-
-    function h(a) {
-        return a.scopes[a.scopes.length - 1]
-    }
-    var c = b(["and", "or", "not", "is"]),
-        d = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in"],
-        e = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"],
-        f = {
-            builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile", "file", "intern", "long", "raw_input", "reduce", "reload", "unichr", "unicode", "xrange", "False", "True", "None"],
-            keywords: ["exec", "print"]
-        },
-        g = {
-            builtins: ["ascii", "bytes", "exec", "print"],
-            keywords: ["nonlocal", "False", "True", "None", "async", "await"]
-        };
-    a.registerHelper("hintWords", "python", d.concat(e)), a.defineMode("python", function (i, j) {
-        function x(a, b) {
-            if (a.sol() && "py" == h(b)
-                .type) {
-                var c = h(b)
-                    .offset;
-                if (a.eatSpace()) {
-                    var d = a.indentation();
-                    return d > c ? A(a, b, "py") : c > d && B(a, b) && (b.errorToken = !0), null
-                }
-                var e = y(a, b);
-                return c > 0 && B(a, b) && (e += " " + k), e
-            }
-            return y(a, b)
-        }
-
-        function y(a, b) {
-            if (a.eatSpace()) return null;
-            var d = a.peek();
-            if ("#" == d) return a.skipToEnd(), "comment";
-            if (a.match(/^[0-9\.]/, !1)) {
-                var e = !1;
-                if (a.match(/^\d*\.\d+(e[\+\-]?\d+)?/i) && (e = !0), a.match(/^\d+\.\d*/) && (e = !0), a.match(/^\.\d+/) && (e = !0), e) return a.eat(/J/i), "number";
-                var f = !1;
-                if (a.match(/^0x[0-9a-f]+/i) && (f = !0), a.match(/^0b[01]+/i) && (f = !0), a.match(/^0o[0-7]+/i) && (f = !0), a.match(/^[1-9]\d*(e[\+\-]?\d+)?/) && (a.eat(/J/i), f = !0), a.match(/^0(?![\dx])/i) && (f = !0), f) return a.eat(/L/i), "number"
-            }
-            return a.match(u) ? (b.tokenize = z(a.current()), b.tokenize(a, b)) : a.match(o) || a.match(n) ? null : a.match(m) || a.match(p) ? "operator" : a.match(l) ? null : a.match(v) || a.match(c) ? "keyword" : a.match(w) ? "builtin" : a.match(/^(self|cls)\b/) ? "variable-2" : a.match(q) ? "def" == b.lastToken || "class" == b.lastToken ? "def" : "variable" : (a.next(), k)
-        }
-
-        function z(a) {
-            function d(d, e) {
-                for (; !d.eol();)
-                    if (d.eatWhile(/[^'"\\]/), d.eat("\\")) {
-                        if (d.next(), b && d.eol()) return c
-                    } else {
-                        if (d.match(a)) return e.tokenize = x, c;
-                        d.eat(/['"]/)
-                    }
-                if (b) {
-                    if (j.singleLineStringErrors) return k;
-                    e.tokenize = x
-                }
-                return c
-            }
-            for (;
-                "rub".indexOf(a.charAt(0)
-                    .toLowerCase()) >= 0;) a = a.substr(1);
-            var b = 1 == a.length,
-                c = "string";
-            return d.isString = !0, d
-        }
-
-        function A(a, b, c) {
-            var d = 0,
-                e = null;
-            if ("py" == c)
-                for (;
-                    "py" != h(b)
-                    .type;) b.scopes.pop();
-            d = h(b)
-                .offset + ("py" == c ? i.indentUnit : r), "py" == c || a.match(/^(\s|#.*)*$/, !1) || (e = a.column() + 1), b.scopes.push({
-                    offset: d,
-                    type: c,
-                    align: e
-                })
-        }
-
-        function B(a, b) {
-            for (var c = a.indentation(); h(b)
-                .offset > c;) {
-                if ("py" != h(b)
-                    .type) return !0;
-                b.scopes.pop()
-            }
-            return h(b)
-                .offset != c
-        }
-
-        function C(a, b) {
-            var c = b.tokenize(a, b),
-                d = a.current();
-            if ("." == d) return c = a.match(q, !1) ? null : k, null == c && "meta" == b.lastStyle && (c = "meta"), c;
-            if ("@" == d) return j.version && 3 == parseInt(j.version, 10) ? a.match(q, !1) ? "meta" : "operator" : a.match(q, !1) ? "meta" : k;
-            "variable" != c && "builtin" != c || "meta" != b.lastStyle || (c = "meta"), ("pass" == d || "return" == d) && (b.dedent += 1), "lambda" == d && (b.lambda = !0), ":" != d || b.lambda || "py" != h(b)
-                .type || A(a, b, "py");
-            var e = 1 == d.length ? "[({".indexOf(d) : -1;
-            if (-1 != e && A(a, b, "])}".slice(e, e + 1)), e = "])}".indexOf(d), -1 != e) {
-                if (h(b)
-                    .type != d) return k;
-                b.scopes.pop()
-            }
-            return b.dedent > 0 && a.eol() && "py" == h(b)
-                .type && (b.scopes.length > 1 && b.scopes.pop(), b.dedent -= 1), c
-        }
-        var k = "error",
-            l = j.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"),
-            m = j.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"),
-            n = j.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"),
-            o = j.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
-        if (j.version && 3 == parseInt(j.version, 10)) var p = j.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"),
-            q = j.identifiers || new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");
-        else var p = j.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"),
-            q = j.identifiers || new RegExp("^[_A-Za-z][_A-Za-z0-9]*");
-        var r = j.hangingIndent || i.indentUnit,
-            s = d,
-            t = e;
-        if (void 0 != j.extra_keywords && (s = s.concat(j.extra_keywords)), void 0 != j.extra_builtins && (t = t.concat(j.extra_builtins)), j.version && 3 == parseInt(j.version, 10)) {
-            s = s.concat(g.keywords), t = t.concat(g.builtins);
-            var u = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i")
-        } else {
-            s = s.concat(f.keywords), t = t.concat(f.builtins);
-            var u = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i")
-        }
-        var v = b(s),
-            w = b(t),
-            D = {
-                startState: function (a) {
-                    return {
-                        tokenize: x,
-                        scopes: [{
-                            offset: a || 0,
-                            type: "py",
-                            align: null
-                        }],
-                        lastStyle: null,
-                        lastToken: null,
-                        lambda: !1,
-                        dedent: 0
-                    }
-                },
-                token: function (a, b) {
-                    var c = b.errorToken;
-                    c && (b.errorToken = !1);
-                    var d = C(a, b);
-                    b.lastStyle = d;
-                    var e = a.current();
-                    return e && d && (b.lastToken = e), a.eol() && b.lambda && (b.lambda = !1), c ? d + " " + k : d
-                },
-                indent: function (b, c) {
-                    if (b.tokenize != x) return b.tokenize.isString ? a.Pass : 0;
-                    var d = h(b),
-                        e = c && c.charAt(0) == d.type;
-                    return null != d.align ? d.align - (e ? 1 : 0) : e && b.scopes.length > 1 ? b.scopes[b.scopes.length - 2].offset : d.offset
-                },
-                closeBrackets: {
-                    triples: "'\""
-                },
-                lineComment: "#",
-                fold: "indent"
-            };
-        return D
-    }), a.defineMIME("text/x-python", "python");
-    var i = function (a) {
-        return a.split(" ")
-    };
-    a.defineMIME("text/x-cython", {
-        name: "python",
-        extra_keywords: i("by cdef cimport cpdef ctypedef enum exceptextern gil include nogil property publicreadonly struct union DEF IF ELIF ELSE")
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.defineMode("shell", function () {
-        function b(b, c) {
-            for (var d = c.split(" "), e = 0; e < d.length; e++) a[d[e]] = b
-        }
-
-        function c(b, c) {
-            if (b.eatSpace()) return null;
-            var g = b.sol(),
-                h = b.next();
-            if ("\\" === h) return b.next(), null;
-            if ("'" === h || '"' === h || "`" === h) return c.tokens.unshift(d(h)), f(b, c);
-            if ("#" === h) return g && b.eat("!") ? (b.skipToEnd(), "meta") : (b.skipToEnd(), "comment");
-            if ("$" === h) return c.tokens.unshift(e), f(b, c);
-            if ("+" === h || "=" === h) return "operator";
-            if ("-" === h) return b.eat("-"), b.eatWhile(/\w/), "attribute";
-            if (/\d/.test(h) && (b.eatWhile(/\d/), b.eol() || !/\w/.test(b.peek()))) return "number";
-            b.eatWhile(/[\w-]/);
-            var i = b.current();
-            return "=" === b.peek() && /\w+/.test(i) ? "def" : a.hasOwnProperty(i) ? a[i] : null
-        }
-
-        function d(a) {
-            return function (b, c) {
-                for (var d, f = !1, g = !1; null != (d = b.next());) {
-                    if (d === a && !g) {
-                        f = !0;
-                        break
-                    }
-                    if ("$" === d && !g && "'" !== a) {
-                        g = !0, b.backUp(1), c.tokens.unshift(e);
-                        break
-                    }
-                    g = !g && "\\" === d
-                }
-                return (f || !g) && c.tokens.shift(), "`" === a || ")" === a ? "quote" : "string"
-            }
-        }
-
-        function f(a, b) {
-            return (b.tokens[0] || c)(a, b)
-        }
-        var a = {};
-        b("atom", "true false"), b("keyword", "if then do else elif while until for in esac fi fin fil done exit set unset export function"), b("builtin", "ab awk bash beep cat cc cd chown chmod chroot clear cp curl cut diff echo find gawk gcc get git grep kill killall ln ls make mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh shopt shred source sort sleep ssh start stop su sudo tee telnet top touch vi vim wall wc wget who write yes zsh");
-        var e = function (a, b) {
-            b.tokens.length > 1 && a.eat("$");
-            var c = a.next(),
-                e = /\w/;
-            return "{" === c && (e = /[^}]/), "(" === c ? (b.tokens[0] = d(")"), f(a, b)) : (/\d/.test(c) || (a.eatWhile(e), a.eat("}")), b.tokens.shift(), "def")
-        };
-        return {
-            startState: function () {
-                return {
-                    tokens: []
-                }
-            },
-            token: function (a, b) {
-                return f(a, b)
-            },
-            lineComment: "#",
-            fold: "brace"
-        }
-    }), a.defineMIME("text/x-sh", "shell")
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.defineMode("xml", function (b, c) {
-        function k(a, b) {
-            function c(c) {
-                return b.tokenize = c, c(a, b)
-            }
-            var d = a.next();
-            if ("<" == d) return a.eat("!") ? a.eat("[") ? a.match("CDATA[") ? c(n("atom", "]]>")) : null : a.match("--") ? c(n("comment", "-->")) : a.match("DOCTYPE", !0, !0) ? (a.eatWhile(/[\w\._\-]/), c(o(1))) : null : a.eat("?") ? (a.eatWhile(/[\w\._\-]/), b.tokenize = n("meta", "?>"), "meta") : (i = a.eat("/") ? "closeTag" : "openTag", b.tokenize = l, "tag bracket");
-            if ("&" == d) {
-                var e;
-                return e = a.eat("#") ? a.eat("x") ? a.eatWhile(/[a-fA-F\d]/) && a.eat(";") : a.eatWhile(/[\d]/) && a.eat(";") : a.eatWhile(/[\w\.\-:]/) && a.eat(";"), e ? "atom" : "error"
-            }
-            return a.eatWhile(/[^&<]/), null
-        }
-
-        function l(a, b) {
-            var c = a.next();
-            if (">" == c || "/" == c && a.eat(">")) return b.tokenize = k, i = ">" == c ? "endTag" : "selfcloseTag", "tag bracket";
-            if ("=" == c) return i = "equals", null;
-            if ("<" == c) {
-                b.tokenize = k, b.state = s, b.tagName = b.tagStart = null;
-                var d = b.tokenize(a, b);
-                return d ? d + " tag error" : "tag error"
-            }
-            return /[\'\"]/.test(c) ? (b.tokenize = m(c), b.stringStartCol = a.column(), b.tokenize(a, b)) : (a.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/), "word")
-        }
-
-        function m(a) {
-            var b = function (b, c) {
-                for (; !b.eol();)
-                    if (b.next() == a) {
-                        c.tokenize = l;
-                        break
-                    }
-                return "string"
-            };
-            return b.isInAttribute = !0, b
-        }
-
-        function n(a, b) {
-            return function (c, d) {
-                for (; !c.eol();) {
-                    if (c.match(b)) {
-                        d.tokenize = k;
-                        break
-                    }
-                    c.next()
-                }
-                return a
-            }
-        }
-
-        function o(a) {
-            return function (b, c) {
-                for (var d; null != (d = b.next());) {
-                    if ("<" == d) return c.tokenize = o(a + 1), c.tokenize(b, c);
-                    if (">" == d) {
-                        if (1 == a) {
-                            c.tokenize = k;
-                            break
-                        }
-                        return c.tokenize = o(a - 1), c.tokenize(b, c)
-                    }
-                }
-                return "meta"
-            }
-        }
-
-        function p(a, b, c) {
-            this.prev = a.context, this.tagName = b, this.indent = a.indented, this.startOfLine = c, (g.doNotIndent.hasOwnProperty(b) || a.context && a.context.noIndent) && (this.noIndent = !0)
-        }
-
-        function q(a) {
-            a.context && (a.context = a.context.prev)
-        }
-
-        function r(a, b) {
-            for (var c;;) {
-                if (!a.context) return;
-                if (c = a.context.tagName, !g.contextGrabbers.hasOwnProperty(c) || !g.contextGrabbers[c].hasOwnProperty(b)) return;
-                q(a)
-            }
-        }
-
-        function s(a, b, c) {
-            return "openTag" == a ? (c.tagStart = b.column(), t) : "closeTag" == a ? u : s
-        }
-
-        function t(a, b, c) {
-            return "word" == a ? (c.tagName = b.current(), j = "tag", x) : (j = "error", t)
-        }
-
-        function u(a, b, c) {
-            if ("word" == a) {
-                var d = b.current();
-                return c.context && c.context.tagName != d && g.implicitlyClosed.hasOwnProperty(c.context.tagName) && q(c), c.context && c.context.tagName == d ? (j = "tag", v) : (j = "tag error", w)
-            }
-            return j = "error", w
-        }
-
-        function v(a, b, c) {
-            return "endTag" != a ? (j = "error", v) : (q(c), s)
-        }
-
-        function w(a, b, c) {
-            return j = "error", v(a, b, c)
-        }
-
-        function x(a, b, c) {
-            if ("word" == a) return j = "attribute", y;
-            if ("endTag" == a || "selfcloseTag" == a) {
-                var d = c.tagName,
-                    e = c.tagStart;
-                return c.tagName = c.tagStart = null, "selfcloseTag" == a || g.autoSelfClosers.hasOwnProperty(d) ? r(c, d) : (r(c, d), c.context = new p(c, d, e == c.indented)), s
-            }
-            return j = "error", x
-        }
-
-        function y(a, b, c) {
-            return "equals" == a ? z : (g.allowMissing || (j = "error"), x(a, b, c))
-        }
-
-        function z(a, b, c) {
-            return "string" == a ? A : "word" == a && g.allowUnquoted ? (j = "string", x) : (j = "error", x(a, b, c))
-        }
-
-        function A(a, b, c) {
-            return "string" == a ? A : x(a, b, c)
-        }
-        var d = b.indentUnit,
-            e = c.multilineTagIndentFactor || 1,
-            f = c.multilineTagIndentPastTag;
-        null == f && (f = !0);
-        var i, j, g = c.htmlMode ? {
-                autoSelfClosers: {
-                    area: !0,
-                    base: !0,
-                    br: !0,
-                    col: !0,
-                    command: !0,
-                    embed: !0,
-                    frame: !0,
-                    hr: !0,
-                    img: !0,
-                    input: !0,
-                    keygen: !0,
-                    link: !0,
-                    meta: !0,
-                    param: !0,
-                    source: !0,
-                    track: !0,
-                    wbr: !0,
-                    menuitem: !0
-                },
-                implicitlyClosed: {
-                    dd: !0,
-                    li: !0,
-                    optgroup: !0,
-                    option: !0,
-                    p: !0,
-                    rp: !0,
-                    rt: !0,
-                    tbody: !0,
-                    td: !0,
-                    tfoot: !0,
-                    th: !0,
-                    tr: !0
-                },
-                contextGrabbers: {
-                    dd: {
-                        dd: !0,
-                        dt: !0
-                    },
-                    dt: {
-                        dd: !0,
-                        dt: !0
-                    },
-                    li: {
-                        li: !0
-                    },
-                    option: {
-                        option: !0,
-                        optgroup: !0
-                    },
-                    optgroup: {
-                        optgroup: !0
-                    },
-                    p: {
-                        address: !0,
-                        article: !0,
-                        aside: !0,
-                        blockquote: !0,
-                        dir: !0,
-                        div: !0,
-                        dl: !0,
-                        fieldset: !0,
-                        footer: !0,
-                        form: !0,
-                        h1: !0,
-                        h2: !0,
-                        h3: !0,
-                        h4: !0,
-                        h5: !0,
-                        h6: !0,
-                        header: !0,
-                        hgroup: !0,
-                        hr: !0,
-                        menu: !0,
-                        nav: !0,
-                        ol: !0,
-                        p: !0,
-                        pre: !0,
-                        section: !0,
-                        table: !0,
-                        ul: !0
-                    },
-                    rp: {
-                        rp: !0,
-                        rt: !0
-                    },
-                    rt: {
-                        rp: !0,
-                        rt: !0
-                    },
-                    tbody: {
-                        tbody: !0,
-                        tfoot: !0
-                    },
-                    td: {
-                        td: !0,
-                        th: !0
-                    },
-                    tfoot: {
-                        tbody: !0
-                    },
-                    th: {
-                        td: !0,
-                        th: !0
-                    },
-                    thead: {
-                        tbody: !0,
-                        tfoot: !0
-                    },
-                    tr: {
-                        tr: !0
-                    }
-                },
-                doNotIndent: {
-                    pre: !0
-                },
-                allowUnquoted: !0,
-                allowMissing: !0,
-                caseFold: !0
-            } : {
-                autoSelfClosers: {},
-                implicitlyClosed: {},
-                contextGrabbers: {},
-                doNotIndent: {},
-                allowUnquoted: !1,
-                allowMissing: !1,
-                caseFold: !1
-            },
-            h = c.alignCDATA;
-        return k.isInText = !0, {
-            startState: function () {
-                return {
-                    tokenize: k,
-                    state: s,
-                    indented: 0,
-                    tagName: null,
-                    tagStart: null,
-                    context: null
-                }
-            },
-            token: function (a, b) {
-                if (!b.tagName && a.sol() && (b.indented = a.indentation()), a.eatSpace()) return null;
-                i = null;
-                var c = b.tokenize(a, b);
-                return (c || i) && "comment" != c && (j = null, b.state = b.state(i || c, a, b), j && (c = "error" == j ? c + " error" : j)), c
-            },
-            indent: function (b, c, i) {
-                var j = b.context;
-                if (b.tokenize.isInAttribute) return b.tagStart == b.indented ? b.stringStartCol + 1 : b.indented + d;
-                if (j && j.noIndent) return a.Pass;
-                if (b.tokenize != l && b.tokenize != k) return i ? i.match(/^(\s*)/)[0].length : 0;
-                if (b.tagName) return f ? b.tagStart + b.tagName.length + 2 : b.tagStart + d * e;
-                if (h && /<!\[CDATA\[/.test(c)) return 0;
-                var m = c && /^<(\/)?([\w_:\.-]*)/.exec(c);
-                if (m && m[1])
-                    for (; j;) {
-                        if (j.tagName == m[2]) {
-                            j = j.prev;
-                            break
-                        }
-                        if (!g.implicitlyClosed.hasOwnProperty(j.tagName)) break;
-                        j = j.prev
-                    } else if (m)
-                        for (; j;) {
-                            var n = g.contextGrabbers[j.tagName];
-                            if (!n || !n.hasOwnProperty(m[2])) break;
-                            j = j.prev
-                        }
-                    for (; j && !j.startOfLine;) j = j.prev;
-                return j ? j.indent + d : 0
-            },
-            electricInput: /<\/[\s\w:]+>$/,
-            blockCommentStart: "<!--",
-            blockCommentEnd: "-->",
-            configuration: c.htmlMode ? "html" : "xml",
-            helperType: c.htmlMode ? "html" : "xml"
-        }
-    }), a.defineMIME("text/xml", "xml"), a.defineMIME("application/xml", "xml"), a.mimeModes.hasOwnProperty("text/html") || a.defineMIME("text/html", {
-        name: "xml",
-        htmlMode: !0
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function d(a) {
-        for (var d = 0; d < a.state.activeLines.length; d++) a.removeLineClass(a.state.activeLines[d], "wrap", b), a.removeLineClass(a.state.activeLines[d], "background", c)
-    }
-
-    function e(a, b) {
-        if (a.length != b.length) return !1;
-        for (var c = 0; c < a.length; c++)
-            if (a[c] != b[c]) return !1;
-        return !0
-    }
-
-    function f(a, f) {
-        for (var g = [], h = 0; h < f.length; h++) {
-            var i = f[h];
-            if (i.empty()) {
-                var j = a.getLineHandleVisualStart(i.head.line);
-                g[g.length - 1] != j && g.push(j)
-            }
-        }
-        e(a.state.activeLines, g) || a.operation(function () {
-            d(a);
-            for (var e = 0; e < g.length; e++) a.addLineClass(g[e], "wrap", b), a.addLineClass(g[e], "background", c);
-            a.state.activeLines = g
-        })
-    }
-
-    function g(a, b) {
-        f(a, b.ranges)
-    }
-    var b = "CodeMirror-activeline",
-        c = "CodeMirror-activeline-background";
-    a.defineOption("styleActiveLine", !1, function (b, c, e) {
-        var h = e && e != a.Init;
-        c && !h ? (b.state.activeLines = [], f(b, b.listSelections()), b.on("beforeSelectionChange", g)) : !c && h && (b.off("beforeSelectionChange", g), d(b), delete b.state.activeLines)
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.registerHelper("fold", "brace", function (b, c) {
-        function h(f) {
-            for (var h = c.ch, i = 0;;) {
-                var j = 0 >= h ? -1 : e.lastIndexOf(f, h - 1);
-                if (-1 != j) {
-                    if (1 == i && j < c.ch) break;
-                    if (g = b.getTokenTypeAt(a.Pos(d, j + 1)), !/^(comment|string)/.test(g)) return j + 1;
-                    h = j - 1
-                } else {
-                    if (1 == i) break;
-                    i = 1, h = e.length
-                }
-            }
-        }
-        var f, g, d = c.line,
-            e = b.getLine(d),
-            i = "{",
-            j = "}",
-            f = h("{");
-        if (null == f && (i = "[", j = "]", f = h("[")), null != f) {
-            var m, n, k = 1,
-                l = b.lastLine();
-            a: for (var o = d; l >= o; ++o)
-                for (var p = b.getLine(o), q = o == d ? f : 0;;) {
-                    var r = p.indexOf(i, q),
-                        s = p.indexOf(j, q);
-                    if (0 > r && (r = p.length), 0 > s && (s = p.length), q = Math.min(r, s), q == p.length) break;
-                    if (b.getTokenTypeAt(a.Pos(o, q + 1)) == g)
-                        if (q == r) ++k;
-                        else if (!--k) {
-                        m = o, n = q;
-                        break a
-                    }++q
-                }
-            if (null != m && (d != m || n != f)) return {
-                from: a.Pos(d, f),
-                to: a.Pos(m, n)
-            }
-        }
-    }), a.registerHelper("fold", "import", function (b, c) {
-        function d(c) {
-            if (c < b.firstLine() || c > b.lastLine()) return null;
-            var d = b.getTokenAt(a.Pos(c, 1));
-            if (/\S/.test(d.string) || (d = b.getTokenAt(a.Pos(c, d.end + 1))), "keyword" != d.type || "import" != d.string) return null;
-            for (var e = c, f = Math.min(b.lastLine(), c + 10); f >= e; ++e) {
-                var g = b.getLine(e),
-                    h = g.indexOf(";");
-                if (-1 != h) return {
-                    startCh: d.end,
-                    end: a.Pos(e, h)
-                }
-            }
-        }
-        var f, c = c.line,
-            e = d(c);
-        if (!e || d(c - 1) || (f = d(c - 2)) && f.end.line == c - 1) return null;
-        for (var g = e.end;;) {
-            var h = d(g.line + 1);
-            if (null == h) break;
-            g = h.end
-        }
-        return {
-            from: b.clipPos(a.Pos(c, e.startCh + 1)),
-            to: g
-        }
-    }), a.registerHelper("fold", "include", function (b, c) {
-        function d(c) {
-            if (c < b.firstLine() || c > b.lastLine()) return null;
-            var d = b.getTokenAt(a.Pos(c, 1));
-            return /\S/.test(d.string) || (d = b.getTokenAt(a.Pos(c, d.end + 1))), "meta" == d.type && "#include" == d.string.slice(0, 8) ? d.start + 8 : void 0
-        }
-        var c = c.line,
-            e = d(c);
-        if (null == e || null != d(c - 1)) return null;
-        for (var f = c;;) {
-            var g = d(f + 1);
-            if (null == g) break;
-            ++f
-        }
-        return {
-            from: a.Pos(c, e + 1),
-            to: b.clipPos(a.Pos(f))
-        }
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    function d(a, c) {
-        return "pairs" == c && "string" == typeof a ? a : "object" == typeof a && null != a[c] ? a[c] : b[c]
-    }
-
-    function h(a) {
-        return function (b) {
-            return l(b, a)
-        }
-    }
-
-    function i(a) {
-        var b = a.state.closeBrackets;
-        if (!b) return null;
-        var c = a.getModeAt(a.getCursor());
-        return c.closeBrackets || b
-    }
-
-    function j(b) {
-        var e = i(b);
-        if (!e || b.getOption("disableInput")) return a.Pass;
-        for (var f = d(e, "pairs"), g = b.listSelections(), h = 0; h < g.length; h++) {
-            if (!g[h].empty()) return a.Pass;
-            var j = n(b, g[h].head);
-            if (!j || f.indexOf(j) % 2 != 0) return a.Pass
-        }
-        for (var h = g.length - 1; h >= 0; h--) {
-            var k = g[h].head;
-            b.replaceRange("", c(k.line, k.ch - 1), c(k.line, k.ch + 1))
-        }
-    }
-
-    function k(b) {
-        var c = i(b),
-            e = c && d(c, "explode");
-        if (!e || b.getOption("disableInput")) return a.Pass;
-        for (var f = b.listSelections(), g = 0; g < f.length; g++) {
-            if (!f[g].empty()) return a.Pass;
-            var h = n(b, f[g].head);
-            if (!h || e.indexOf(h) % 2 != 0) return a.Pass
-        }
-        b.operation(function () {
-            b.replaceSelection("\n\n", null), b.execCommand("goCharLeft"), f = b.listSelections();
-            for (var a = 0; a < f.length; a++) {
-                var c = f[a].head.line;
-                b.indentLine(c, null, !0), b.indentLine(c + 1, null, !0)
-            }
-        })
-    }
-
-    function l(b, e) {
-        var f = i(b);
-        if (!f || b.getOption("disableInput")) return a.Pass;
-        var g = d(f, "pairs"),
-            h = g.indexOf(e);
-        if (-1 == h) return a.Pass;
-        for (var p, q, j = d(f, "triples"), k = g.charAt(h + 1) == e, l = b.listSelections(), n = h % 2 == 0, r = 0; r < l.length; r++) {
-            var u, s = l[r],
-                t = s.head,
-                q = b.getRange(t, c(t.line, t.ch + 1));
-            if (n && !s.empty()) u = "surround";
-            else if (!k && n || q != e)
-                if (k && t.ch > 1 && j.indexOf(e) >= 0 && b.getRange(c(t.line, t.ch - 2), t) == e + e && (t.ch <= 2 || b.getRange(c(t.line, t.ch - 3), c(t.line, t.ch - 2)) != e)) u = "addFour";
-                else if (k) {
-                if (a.isWordChar(q) || !o(b, t, e)) return a.Pass;
-                u = "both"
-            } else {
-                if (!n || b.getLine(t.line)
-                    .length != t.ch && !m(q, g) && !/\s/.test(q)) return a.Pass;
-                u = "both"
-            } else u = j.indexOf(e) >= 0 && b.getRange(t, c(t.line, t.ch + 3)) == e + e + e ? "skipThree" : "skip";
-            if (p) {
-                if (p != u) return a.Pass
-            } else p = u
-        }
-        var v = h % 2 ? g.charAt(h - 1) : e,
-            w = h % 2 ? e : g.charAt(h + 1);
-        b.operation(function () {
-            if ("skip" == p) b.execCommand("goCharRight");
-            else if ("skipThree" == p)
-                for (var a = 0; 3 > a; a++) b.execCommand("goCharRight");
-            else if ("surround" == p) {
-                for (var c = b.getSelections(), a = 0; a < c.length; a++) c[a] = v + c[a] + w;
-                b.replaceSelections(c, "around")
-            } else "both" == p ? (b.replaceSelection(v + w, null), b.triggerElectric(v + w), b.execCommand("goCharLeft")) : "addFour" == p && (b.replaceSelection(v + v + v + v, "before"), b.execCommand("goCharRight"))
-        })
-    }
-
-    function m(a, b) {
-        var c = b.lastIndexOf(a);
-        return c > -1 && c % 2 == 1
-    }
-
-    function n(a, b) {
-        var d = a.getRange(c(b.line, b.ch - 1), c(b.line, b.ch + 1));
-        return 2 == d.length ? d : null
-    }
-
-    function o(b, c, d) {
-        var e = b.getLine(c.line),
-            f = b.getTokenAt(c);
-        if (/\bstring2?\b/.test(f.type)) return !1;
-        var g = new a.StringStream(e.slice(0, c.ch) + d + e.slice(c.ch), 4);
-        for (g.pos = g.start = f.start;;) {
-            var h = b.getMode()
-                .token(g, f.state);
-            if (g.pos >= c.ch + 1) return /\bstring2?\b/.test(h);
-            g.start = g.pos
-        }
-    }
-    var b = {
-            pairs: "()[]{}''\"\"",
-            triples: "",
-            explode: "[]{}"
-        },
-        c = a.Pos;
-    a.defineOption("autoCloseBrackets", !1, function (b, c, d) {
-        d && d != a.Init && (b.removeKeyMap(f), b.state.closeBrackets = null), c && (b.state.closeBrackets = c, b.addKeyMap(f))
-    });
-    for (var e = b.pairs + "`", f = {
-            Backspace: j,
-            Enter: k
-        }, g = 0; g < e.length; g++) f["'" + e.charAt(g) + "'"] = h(e.charAt(g))
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../fold/xml-fold")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../fold/xml-fold"], a) : a(CodeMirror)
-}(function (a) {
-    function d(d) {
-        if (d.getOption("disableInput")) return a.Pass;
-        for (var e = d.listSelections(), f = [], i = 0; i < e.length; i++) {
-            if (!e[i].empty()) return a.Pass;
-            var j = e[i].head,
-                k = d.getTokenAt(j),
-                l = a.innerMode(d.getMode(), k.state),
-                m = l.state;
-            if ("xml" != l.mode.name || !m.tagName) return a.Pass;
-            var n = d.getOption("autoCloseTags"),
-                o = "html" == l.mode.configuration,
-                p = "object" == typeof n && n.dontCloseTags || o && b,
-                q = "object" == typeof n && n.indentTags || o && c,
-                r = m.tagName;
-            k.end > j.ch && (r = r.slice(0, r.length - k.end + j.ch));
-            var s = r.toLowerCase();
-            if (!r || "string" == k.type && (k.end != j.ch || !/[\"\']/.test(k.string.charAt(k.string.length - 1)) || 1 == k.string.length) || "tag" == k.type && "closeTag" == m.type || k.string.indexOf("/") == k.string.length - 1 || p && g(p, s) > -1 || h(d, r, j, m, !0)) return a.Pass;
-            var t = q && g(q, s) > -1;
-            f[i] = {
-                indent: t,
-                text: ">" + (t ? "\n\n" : "") + "</" + r + ">",
-                newPos: t ? a.Pos(j.line + 1, 0) : a.Pos(j.line, j.ch + 1)
-            }
-        }
-        for (var i = e.length - 1; i >= 0; i--) {
-            var u = f[i];
-            d.replaceRange(u.text, e[i].head, e[i].anchor, "+insert");
-            var v = d.listSelections()
-                .slice(0);
-            v[i] = {
-                head: u.newPos,
-                anchor: u.newPos
-            }, d.setSelections(v), u.indent && (d.indentLine(u.newPos.line, null, !0), d.indentLine(u.newPos.line + 1, null, !0))
-        }
-    }
-
-    function e(b, c) {
-        for (var d = b.listSelections(), e = [], f = c ? "/" : "</", g = 0; g < d.length; g++) {
-            if (!d[g].empty()) return a.Pass;
-            var i = d[g].head,
-                j = b.getTokenAt(i),
-                k = a.innerMode(b.getMode(), j.state),
-                l = k.state;
-            if (c && ("string" == j.type || "<" != j.string.charAt(0) || j.start != i.ch - 1)) return a.Pass;
-            var m;
-            if ("xml" != k.mode.name)
-                if ("htmlmixed" == b.getMode()
-                    .name && "javascript" == k.mode.name) m = f + "script";
-                else {
-                    if ("htmlmixed" != b.getMode()
-                        .name || "css" != k.mode.name) return a.Pass;
-                    m = f + "style"
-                } else {
-                if (!l.context || !l.context.tagName || h(b, l.context.tagName, i, l)) return a.Pass;
-                m = f + l.context.tagName;
-            }
-            ">" != b.getLine(i.line)
-                .charAt(j.end) && (m += ">"), e[g] = m
-        }
-        b.replaceSelections(e), d = b.listSelections();
-        for (var g = 0; g < d.length; g++)(g == d.length - 1 || d[g].head.line < d[g + 1].head.line) && b.indentLine(d[g].head.line)
-    }
-
-    function f(b) {
-        return b.getOption("disableInput") ? a.Pass : e(b, !0)
-    }
-
-    function g(a, b) {
-        if (a.indexOf) return a.indexOf(b);
-        for (var c = 0, d = a.length; d > c; ++c)
-            if (a[c] == b) return c;
-        return -1
-    }
-
-    function h(b, c, d, e, f) {
-        if (!a.scanForClosingTag) return !1;
-        var g = Math.min(b.lastLine() + 1, d.line + 500),
-            h = a.scanForClosingTag(b, d, null, g);
-        if (!h || h.tag != c) return !1;
-        for (var i = e.context, j = f ? 1 : 0; i && i.tagName == c; i = i.prev) ++j;
-        d = h.to;
-        for (var k = 1; j > k; k++) {
-            var l = a.scanForClosingTag(b, d, null, g);
-            if (!l || l.tag != c) return !1;
-            d = l.to
-        }
-        return !0
-    }
-    a.defineOption("autoCloseTags", !1, function (b, c, e) {
-        if (e != a.Init && e && b.removeKeyMap("autoCloseTags"), c) {
-            var g = {
-                name: "autoCloseTags"
-            };
-            ("object" != typeof c || c.whenClosing) && (g["'/'"] = function (a) {
-                return f(a)
-            }), ("object" != typeof c || c.whenOpening) && (g["'>'"] = function (a) {
-                return d(a)
-            }), b.addKeyMap(g)
-        }
-    });
-    var b = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"],
-        c = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
-    a.commands.closeTag = function (a) {
-        return e(a)
-    }
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(b, d, f, g) {
-        function j(a) {
-            var c = h(b, d);
-            if (!c || c.to.line - c.from.line < i) return null;
-            for (var e = b.findMarksAt(c.from), f = 0; f < e.length; ++f)
-                if (e[f].__isFold && "fold" !== g) {
-                    if (!a) return null;
-                    c.cleared = !0, e[f].clear()
-                }
-            return c
-        }
-        if (f && f.call) {
-            var h = f;
-            f = null
-        } else var h = e(b, f, "rangeFinder");
-        "number" == typeof d && (d = a.Pos(d, 0));
-        var i = e(b, f, "minFoldSize"),
-            k = j(!0);
-        if (e(b, f, "scanUp"))
-            for (; !k && d.line > b.firstLine();) d = a.Pos(d.line - 1, 0), k = j(!1);
-        if (k && !k.cleared && "unfold" !== g) {
-            var l = c(b, f);
-            a.on(l, "mousedown", function (b) {
-                m.clear(), a.e_preventDefault(b)
-            });
-            var m = b.markText(k.from, k.to, {
-                replacedWith: l,
-                clearOnEnter: !0,
-                __isFold: !0
-            });
-            m.on("clear", function (c, d) {
-                a.signal(b, "unfold", b, c, d)
-            }), a.signal(b, "fold", b, k.from, k.to)
-        }
-    }
-
-    function c(a, b) {
-        var c = e(a, b, "widget");
-        if ("string" == typeof c) {
-            var d = document.createTextNode(c);
-            c = document.createElement("span"), c.appendChild(d), c.className = "CodeMirror-foldmarker"
-        }
-        return c
-    }
-
-    function e(a, b, c) {
-        if (b && void 0 !== b[c]) return b[c];
-        var e = a.options.foldOptions;
-        return e && void 0 !== e[c] ? e[c] : d[c]
-    }
-    a.newFoldFunction = function (a, c) {
-        return function (d, e) {
-            b(d, e, {
-                rangeFinder: a,
-                widget: c
-            })
-        }
-    }, a.defineExtension("foldCode", function (a, c, d) {
-        b(this, a, c, d)
-    }), a.defineExtension("isFolded", function (a) {
-        for (var b = this.findMarksAt(a), c = 0; c < b.length; ++c)
-            if (b[c].__isFold) return !0
-    }), a.commands.toggleFold = function (a) {
-        a.foldCode(a.getCursor())
-    }, a.commands.fold = function (a) {
-        a.foldCode(a.getCursor(), null, "fold")
-    }, a.commands.unfold = function (a) {
-        a.foldCode(a.getCursor(), null, "unfold")
-    }, a.commands.foldAll = function (b) {
-        b.operation(function () {
-            for (var c = b.firstLine(), d = b.lastLine(); d >= c; c++) b.foldCode(a.Pos(c, 0), null, "fold")
-        })
-    }, a.commands.unfoldAll = function (b) {
-        b.operation(function () {
-            for (var c = b.firstLine(), d = b.lastLine(); d >= c; c++) b.foldCode(a.Pos(c, 0), null, "unfold")
-        })
-    }, a.registerHelper("fold", "combine", function () {
-        var a = Array.prototype.slice.call(arguments, 0);
-        return function (b, c) {
-            for (var d = 0; d < a.length; ++d) {
-                var e = a[d](b, c);
-                if (e) return e
-            }
-        }
-    }), a.registerHelper("fold", "auto", function (a, b) {
-        for (var c = a.getHelpers(b, "fold"), d = 0; d < c.length; d++) {
-            var e = c[d](a, b);
-            if (e) return e
-        }
-    });
-    var d = {
-        rangeFinder: a.fold.auto,
-        widget: "\u2194",
-        minFoldSize: 0,
-        scanUp: !1
-    };
-    a.defineOption("foldOptions", null), a.defineExtension("foldOption", function (a, b) {
-        return e(this, a, b)
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("./foldcode")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "./foldcode"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function c(a) {
-        this.options = a, this.from = this.to = 0
-    }
-
-    function d(a) {
-        return a === !0 && (a = {}), null == a.gutter && (a.gutter = "CodeMirror-foldgutter"), null == a.indicatorOpen && (a.indicatorOpen = "CodeMirror-foldgutter-open"), null == a.indicatorFolded && (a.indicatorFolded = "CodeMirror-foldgutter-folded"), a
-    }
-
-    function e(a, c) {
-        for (var d = a.findMarksAt(b(c)), e = 0; e < d.length; ++e)
-            if (d[e].__isFold && d[e].find()
-                .from.line == c) return d[e]
-    }
-
-    function f(a) {
-        if ("string" == typeof a) {
-            var b = document.createElement("div");
-            return b.className = a + " CodeMirror-guttermarker-subtle", b
-        }
-        return a.cloneNode(!0)
-    }
-
-    function g(a, c, d) {
-        var g = a.state.foldGutter.options,
-            h = c,
-            i = a.foldOption(g, "minFoldSize"),
-            j = a.foldOption(g, "rangeFinder");
-        a.eachLine(c, d, function (c) {
-            var d = null;
-            if (e(a, h)) d = f(g.indicatorFolded);
-            else {
-                var k = b(h, 0),
-                    l = j && j(a, k);
-                l && l.to.line - l.from.line >= i && (d = f(g.indicatorOpen))
-            }
-            a.setGutterMarker(c, g.gutter, d), ++h
-        })
-    }
-
-    function h(a) {
-        var b = a.getViewport(),
-            c = a.state.foldGutter;
-        c && (a.operation(function () {
-            g(a, b.from, b.to)
-        }), c.from = b.from, c.to = b.to)
-    }
-
-    function i(a, c, d) {
-        var f = a.state.foldGutter;
-        if (f) {
-            var g = f.options;
-            if (d == g.gutter) {
-                var h = e(a, c);
-                h ? h.clear() : a.foldCode(b(c, 0), g.rangeFinder)
-            }
-        }
-    }
-
-    function j(a) {
-        var b = a.state.foldGutter;
-        if (b) {
-            var c = b.options;
-            b.from = b.to = 0, clearTimeout(b.changeUpdate), b.changeUpdate = setTimeout(function () {
-                h(a)
-            }, c.foldOnChangeTimeSpan || 600)
-        }
-    }
-
-    function k(a) {
-        var b = a.state.foldGutter;
-        if (b) {
-            var c = b.options;
-            clearTimeout(b.changeUpdate), b.changeUpdate = setTimeout(function () {
-                var c = a.getViewport();
-                b.from == b.to || c.from - b.to > 20 || b.from - c.to > 20 ? h(a) : a.operation(function () {
-                    c.from < b.from && (g(a, c.from, b.from), b.from = c.from), c.to > b.to && (g(a, b.to, c.to), b.to = c.to)
-                })
-            }, c.updateViewportTimeSpan || 400)
-        }
-    }
-
-    function l(a, b) {
-        var c = a.state.foldGutter;
-        if (c) {
-            var d = b.line;
-            d >= c.from && d < c.to && g(a, d, d + 1)
-        }
-    }
-    a.defineOption("foldGutter", !1, function (b, e, f) {
-        f && f != a.Init && (b.clearGutter(b.state.foldGutter.options.gutter), b.state.foldGutter = null, b.off("gutterClick", i), b.off("change", j), b.off("viewportChange", k), b.off("fold", l), b.off("unfold", l), b.off("swapDoc", h)), e && (b.state.foldGutter = new c(d(e)), h(b), b.on("gutterClick", i), b.on("change", j), b.on("viewportChange", k), b.on("fold", l), b.on("unfold", l), b.on("swapDoc", h))
-    });
-    var b = a.Pos
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-    a.registerHelper("fold", "indent", function (b, c) {
-        var d = b.getOption("tabSize"),
-            e = b.getLine(c.line);
-        if (/\S/.test(e)) {
-            for (var f = function (b) {
-                    return a.countColumn(b, null, d)
-                }, g = f(e), h = null, i = c.line + 1, j = b.lastLine(); j >= i; ++i) {
-                var k = b.getLine(i),
-                    l = f(k);
-                if (l > g) h = i;
-                else if (/\S/.test(k)) break
-            }
-            return h ? {
-                from: a.Pos(c.line, e.length),
-                to: a.Pos(h, b.getLine(h)
-                    .length)
-            } : void 0
-        }
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function f(a) {
-        "object" == typeof a && (this.minChars = a.minChars, this.style = a.style, this.showToken = a.showToken, this.delay = a.delay, this.wordsOnly = a.wordsOnly), null == this.style && (this.style = c), null == this.minChars && (this.minChars = b), null == this.delay && (this.delay = d), null == this.wordsOnly && (this.wordsOnly = e), this.overlay = this.timeout = null
-    }
-
-    function g(a) {
-        var b = a.state.matchHighlighter;
-        clearTimeout(b.timeout), b.timeout = setTimeout(function () {
-            h(a)
-        }, b.delay)
-    }
-
-    function h(a) {
-        a.operation(function () {
-            var b = a.state.matchHighlighter;
-            if (b.overlay && (a.removeOverlay(b.overlay), b.overlay = null), !a.somethingSelected() && b.showToken) {
-                for (var c = b.showToken === !0 ? /[\w$]/ : b.showToken, d = a.getCursor(), e = a.getLine(d.line), f = d.ch, g = f; f && c.test(e.charAt(f - 1));) --f;
-                for (; g < e.length && c.test(e.charAt(g));) ++g;
-                return void(g > f && a.addOverlay(b.overlay = k(e.slice(f, g), c, b.style)))
-            }
-            var h = a.getCursor("from"),
-                j = a.getCursor("to");
-            if (h.line == j.line && (!b.wordsOnly || i(a, h, j))) {
-                var l = a.getRange(h, j)
-                    .replace(/^\s+|\s+$/g, "");
-                l.length >= b.minChars && a.addOverlay(b.overlay = k(l, !1, b.style))
-            }
-        })
-    }
-
-    function i(a, b, c) {
-        var d = a.getRange(b, c);
-        if (null !== d.match(/^\w+$/)) {
-            if (b.ch > 0) {
-                var e = {
-                        line: b.line,
-                        ch: b.ch - 1
-                    },
-                    f = a.getRange(e, b);
-                if (null === f.match(/\W/)) return !1
-            }
-            if (c.ch < a.getLine(b.line)
-                .length) {
-                var e = {
-                        line: c.line,
-                        ch: c.ch + 1
-                    },
-                    f = a.getRange(c, e);
-                if (null === f.match(/\W/)) return !1
-            }
-            return !0
-        }
-        return !1
-    }
-
-    function j(a, b) {
-        return !(a.start && b.test(a.string.charAt(a.start - 1)) || a.pos != a.string.length && b.test(a.string.charAt(a.pos)))
-    }
-
-    function k(a, b, c) {
-        return {
-            token: function (d) {
-                return !d.match(a) || b && !j(d, b) ? (d.next(), void(d.skipTo(a.charAt(0)) || d.skipToEnd())) : c
-            }
-        }
-    }
-    var b = 2,
-        c = "matchhighlight",
-        d = 100,
-        e = !1;
-    a.defineOption("highlightSelectionMatches", !1, function (b, c, d) {
-        if (d && d != a.Init) {
-            var e = b.state.matchHighlighter.overlay;
-            e && b.removeOverlay(e), clearTimeout(b.state.matchHighlighter.timeout), b.state.matchHighlighter = null, b.off("cursorActivity", g)
-        }
-        c && (b.state.matchHighlighter = new f(c), h(b), b.on("cursorActivity", g))
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    function e(a, b, e, g) {
-        var h = a.getLineHandle(b.line),
-            i = b.ch - 1,
-            j = i >= 0 && d[h.text.charAt(i)] || d[h.text.charAt(++i)];
-        if (!j) return null;
-        var k = ">" == j.charAt(1) ? 1 : -1;
-        if (e && k > 0 != (i == b.ch)) return null;
-        var l = a.getTokenTypeAt(c(b.line, i + 1)),
-            m = f(a, c(b.line, i + (k > 0 ? 1 : 0)), k, l || null, g);
-        return null == m ? null : {
-            from: c(b.line, i),
-            to: m && m.pos,
-            match: m && m.ch == j.charAt(0),
-            forward: k > 0
-        }
-    }
-
-    function f(a, b, e, f, g) {
-        for (var h = g && g.maxScanLineLength || 1e4, i = g && g.maxScanLines || 1e3, j = [], k = g && g.bracketRegex ? g.bracketRegex : /[(){}[\]]/, l = e > 0 ? Math.min(b.line + i, a.lastLine() + 1) : Math.max(a.firstLine() - 1, b.line - i), m = b.line; m != l; m += e) {
-            var n = a.getLine(m);
-            if (n) {
-                var o = e > 0 ? 0 : n.length - 1,
-                    p = e > 0 ? n.length : -1;
-                if (!(n.length > h))
-                    for (m == b.line && (o = b.ch - (0 > e ? 1 : 0)); o != p; o += e) {
-                        var q = n.charAt(o);
-                        if (k.test(q) && (void 0 === f || a.getTokenTypeAt(c(m, o + 1)) == f)) {
-                            var r = d[q];
-                            if (">" == r.charAt(1) == e > 0) j.push(q);
-                            else {
-                                if (!j.length) return {
-                                    pos: c(m, o),
-                                    ch: q
-                                };
-                                j.pop()
-                            }
-                        }
-                    }
-            }
-        }
-        return m - e == (e > 0 ? a.lastLine() : a.firstLine()) ? !1 : null
-    }
-
-    function g(a, d, f) {
-        for (var g = a.state.matchBrackets.maxHighlightLineLength || 1e3, h = [], i = a.listSelections(), j = 0; j < i.length; j++) {
-            var k = i[j].empty() && e(a, i[j].head, !1, f);
-            if (k && a.getLine(k.from.line)
-                .length <= g) {
-                var l = k.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
-                h.push(a.markText(k.from, c(k.from.line, k.from.ch + 1), {
-                        className: l
-                    })), k.to && a.getLine(k.to.line)
-                    .length <= g && h.push(a.markText(k.to, c(k.to.line, k.to.ch + 1), {
-                        className: l
-                    }))
-            }
-        }
-        if (h.length) {
-            b && a.state.focused && a.focus();
-            var m = function () {
-                a.operation(function () {
-                    for (var a = 0; a < h.length; a++) h[a].clear()
-                })
-            };
-            if (!d) return m;
-            setTimeout(m, 800)
-        }
-    }
-
-    function i(a) {
-        a.operation(function () {
-            h && (h(), h = null), h = g(a, !1, a.state.matchBrackets)
-        })
-    }
-    var b = /MSIE \d/.test(navigator.userAgent) && (null == document.documentMode || document.documentMode < 8),
-        c = a.Pos,
-        d = {
-            "(": ")>",
-            ")": "(<",
-            "[": "]>",
-            "]": "[<",
-            "{": "}>",
-            "}": "{<"
-        },
-        h = null;
-    a.defineOption("matchBrackets", !1, function (b, c, d) {
-        d && d != a.Init && b.off("cursorActivity", i), c && (b.state.matchBrackets = "object" == typeof c ? c : {}, b.on("cursorActivity", i))
-    }), a.defineExtension("matchBrackets", function () {
-        g(this, !0)
-    }), a.defineExtension("findMatchingBracket", function (a, b, c) {
-        return e(this, a, b, c)
-    }), a.defineExtension("scanForBracket", function (a, b, c, d) {
-        return f(this, a, b, c, d)
-    })
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("../fold/xml-fold")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "../fold/xml-fold"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a) {
-        a.state.tagHit && a.state.tagHit.clear(), a.state.tagOther && a.state.tagOther.clear(), a.state.tagHit = a.state.tagOther = null
-    }
-
-    function c(c) {
-        c.state.failedTagMatch = !1, c.operation(function () {
-            if (b(c), !c.somethingSelected()) {
-                var d = c.getCursor(),
-                    e = c.getViewport();
-                e.from = Math.min(e.from, d.line), e.to = Math.max(d.line + 1, e.to);
-                var f = a.findMatchingTag(c, d, e);
-                if (f) {
-                    if (c.state.matchBothTags) {
-                        var g = "open" == f.at ? f.open : f.close;
-                        g && (c.state.tagHit = c.markText(g.from, g.to, {
-                            className: "CodeMirror-matchingtag"
-                        }))
-                    }
-                    var h = "close" == f.at ? f.open : f.close;
-                    h ? c.state.tagOther = c.markText(h.from, h.to, {
-                        className: "CodeMirror-matchingtag"
-                    }) : c.state.failedTagMatch = !0
-                }
-            }
-        })
-    }
-
-    function d(a) {
-        a.state.failedTagMatch && c(a)
-    }
-    a.defineOption("matchTags", !1, function (e, f, g) {
-        g && g != a.Init && (e.off("cursorActivity", c), e.off("viewportChange", d), b(e)), f && (e.state.matchBothTags = "object" == typeof f && f.bothTags, e.on("cursorActivity", c), e.on("viewportChange", d), c(e))
-    }), a.commands.toMatchingTag = function (b) {
-        var c = a.findMatchingTag(b, b.getCursor());
-        if (c) {
-            var d = "close" == c.at ? c.open : c.close;
-            d && b.extendSelection(d.to, d.from)
-        }
-    }
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function b(a, b) {
-        return "string" == typeof a ? a = new RegExp(a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), b ? "gi" : "g") : a.global || (a = new RegExp(a.source, a.ignoreCase ? "gi" : "g")), {
-            token: function (b) {
-                a.lastIndex = b.pos;
-                var c = a.exec(b.string);
-                return c && c.index == b.pos ? (b.pos += c[0].length, "searching") : void(c ? b.pos = c.index : b.skipToEnd())
-            }
-        }
-    }
-
-    function c() {
-        this.posFrom = this.posTo = this.lastQuery = this.query = null, this.overlay = null
-    }
-
-    function d(a) {
-        return a.state.search || (a.state.search = new c)
-    }
-
-    function e(a) {
-        return "string" == typeof a && a == a.toLowerCase()
-    }
-
-    function f(a, b, c) {
-        return a.getSearchCursor(b, c, e(b))
-    }
-
-    function g(a, b, c, d) {
-        a.openDialog(b, d, {
-            value: c,
-            selectValueOnOpen: !0,
-            closeOnEnter: !1,
-            onClose: function () {
-                p(a)
-            }
-        })
-    }
-
-    function h(a, b, c, d, e) {
-        a.openDialog ? a.openDialog(b, e, {
-            value: d,
-            selectValueOnOpen: !0
-        }) : e(prompt(c, d))
-    }
-
-    function i(a, b, c, d) {
-        a.openConfirm ? a.openConfirm(b, d) : confirm(c) && d[0]()
-    }
-
-    function j(a) {
-        return a.replace(/\\(.)/g, function (a, b) {
-            return "n" == b ? "\n" : "r" == b ? "\r" : b
-        })
-    }
-
-    function k(a) {
-        var b = a.match(/^\/(.*)\/([a-z]*)$/);
-        if (b) try {
-            a = new RegExp(b[1], -1 == b[2].indexOf("i") ? "" : "i")
-        } catch (c) {} else a = j(a);
-        return ("string" == typeof a ? "" == a : a.test("")) && (a = /x^/), a
-    }
-
-    function m(a, c, d) {
-        c.queryText = d, c.query = k(d), a.removeOverlay(c.overlay, e(c.query)), c.overlay = b(c.query, e(c.query)), a.addOverlay(c.overlay), a.showMatchesOnScrollbar && (c.annotate && (c.annotate.clear(), c.annotate = null), c.annotate = a.showMatchesOnScrollbar(c.query, e(c.query)))
-    }
-
-    function n(b, c, e) {
-        var f = d(b);
-        if (f.query) return o(b, c);
-        var i = b.getSelection() || f.lastQuery;
-        e && b.openDialog ? g(b, l, i, function (c, d) {
-            a.e_stop(d), c && (c != f.queryText && m(b, f, c), o(b, d.shiftKey))
-        }) : h(b, l, "Search for:", i, function (a) {
-            a && !f.query && b.operation(function () {
-                m(b, f, a), f.posFrom = f.posTo = b.getCursor(), o(b, c)
-            })
-        })
-    }
-
-    function o(b, c) {
-        b.operation(function () {
-            var e = d(b),
-                g = f(b, e.query, c ? e.posFrom : e.posTo);
-            (g.find(c) || (g = f(b, e.query, c ? a.Pos(b.lastLine()) : a.Pos(b.firstLine(), 0)), g.find(c))) && (b.setSelection(g.from(), g.to()), b.scrollIntoView({
-                from: g.from(),
-                to: g.to()
-            }, 20), e.posFrom = g.from(), e.posTo = g.to())
-        })
-    }
-
-    function p(a) {
-        a.operation(function () {
-            var b = d(a);
-            b.lastQuery = b.query, b.query && (b.query = b.queryText = null, a.removeOverlay(b.overlay), b.annotate && (b.annotate.clear(), b.annotate = null))
-        })
-    }
-
-    function t(a, b) {
-        if (!a.getOption("readOnly")) {
-            var c = a.getSelection() || d(a)
-                .lastQuery;
-            h(a, q, "Replace:", c, function (c) {
-                c && (c = k(c), h(a, r, "Replace with:", "", function (d) {
-                    if (d = j(d), b) a.operation(function () {
-                        for (var b = f(a, c); b.findNext();)
-                            if ("string" != typeof c) {
-                                var e = a.getRange(b.from(), b.to())
-                                    .match(c);
-                                b.replace(d.replace(/\$(\d)/g, function (a, b) {
-                                    return e[b]
-                                }))
-                            } else b.replace(d)
-                    });
-                    else {
-                        p(a);
-                        var e = f(a, c, a.getCursor()),
-                            g = function () {
-                                var d, b = e.from();
-                                !(d = e.findNext()) && (e = f(a, c), !(d = e.findNext()) || b && e.from()
-                                    .line == b.line && e.from()
-                                    .ch == b.ch) || (a.setSelection(e.from(), e.to()), a.scrollIntoView({
-                                    from: e.from(),
-                                    to: e.to()
-                                }), i(a, s, "Replace?", [function () {
-                                    h(d)
-                                }, g]))
-                            },
-                            h = function (a) {
-                                e.replace("string" == typeof c ? d : d.replace(/\$(\d)/g, function (b, c) {
-                                    return a[c]
-                                })), g()
-                            };
-                        g()
-                    }
-                }))
-            })
-        }
-    }
-    var l = 'Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',
-        q = 'Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>',
-        r = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',
-        s = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
-    a.commands.find = function (a) {
-        p(a), n(a)
-    }, a.commands.findPersistent = function (a) {
-        p(a), n(a, !1, !0)
-    }, a.commands.findNext = n, a.commands.findPrev = function (a) {
-        n(a, !0)
-    }, a.commands.clearSearch = p, a.commands.replace = t, a.commands.replaceAll = function (a) {
-        t(a, !0)
-    }
-}),
-function (a) {
-    "object" == typeof exports && "object" == typeof module ? a(require("../../lib/codemirror")) : "function" == typeof define && define.amd ? define(["../../lib/codemirror"], a) : a(CodeMirror)
-}(function (a) {
-    "use strict";
-
-    function c(a, b) {
-        return a.line - b.line || a.ch - b.ch
-    }
-
-    function g(a, b, c, d) {
-        this.line = b, this.ch = c, this.cm = a, this.text = a.getLine(b), this.min = d ? d.from : a.firstLine(), this.max = d ? d.to - 1 : a.lastLine()
-    }
-
-    function h(a, c) {
-        var d = a.cm.getTokenTypeAt(b(a.line, c));
-        return d && /\btag\b/.test(d)
-    }
-
-    function i(a) {
-        return a.line >= a.max ? void 0 : (a.ch = 0, a.text = a.cm.getLine(++a.line), !0)
-    }
-
-    function j(a) {
-        return a.line <= a.min ? void 0 : (a.text = a.cm.getLine(--a.line), a.ch = a.text.length, !0)
-    }
-
-    function k(a) {
-        for (;;) {
-            var b = a.text.indexOf(">", a.ch);
-            if (-1 == b) {
-                if (i(a)) continue;
-                return
-            } {
-                if (h(a, b + 1)) {
-                    var c = a.text.lastIndexOf("/", b),
-                        d = c > -1 && !/\S/.test(a.text.slice(c + 1, b));
-                    return a.ch = b + 1, d ? "selfClose" : "regular"
-                }
-                a.ch = b + 1
-            }
-        }
-    }
-
-    function l(a) {
-        for (;;) {
-            var b = a.ch ? a.text.lastIndexOf("<", a.ch - 1) : -1;
-            if (-1 == b) {
-                if (j(a)) continue;
-                return
-            }
-            if (h(a, b + 1)) {
-                f.lastIndex = b, a.ch = b;
-                var c = f.exec(a.text);
-                if (c && c.index == b) return c
-            } else a.ch = b
-        }
-    }
-
-    function m(a) {
-        for (;;) {
-            f.lastIndex = a.ch;
-            var b = f.exec(a.text);
-            if (!b) {
-                if (i(a)) continue;
-                return
-            } {
-                if (h(a, b.index + 1)) return a.ch = b.index + b[0].length, b;
-                a.ch = b.index + 1
-            }
-        }
-    }
-
-    function n(a) {
-        for (;;) {
-            var b = a.ch ? a.text.lastIndexOf(">", a.ch - 1) : -1;
-            if (-1 == b) {
-                if (j(a)) continue;
-                return
-            } {
-                if (h(a, b + 1)) {
-                    var c = a.text.lastIndexOf("/", b),
-                        d = c > -1 && !/\S/.test(a.text.slice(c + 1, b));
-                    return a.ch = b + 1, d ? "selfClose" : "regular"
-                }
-                a.ch = b
-            }
-        }
-    }
-
-    function o(a, c) {
-        for (var d = [];;) {
-            var f, e = m(a),
-                g = a.line,
-                h = a.ch - (e ? e[0].length : 0);
-            if (!e || !(f = k(a))) return;
-            if ("selfClose" != f)
-                if (e[1]) {
-                    for (var i = d.length - 1; i >= 0; --i)
-                        if (d[i] == e[2]) {
-                            d.length = i;
-                            break
-                        }
-                    if (0 > i && (!c || c == e[2])) return {
-                        tag: e[2],
-                        from: b(g, h),
-                        to: b(a.line, a.ch)
-                    }
-                } else d.push(e[2])
-        }
-    }
-
-    function p(a, c) {
-        for (var d = [];;) {
-            var e = n(a);
-            if (!e) return;
-            if ("selfClose" != e) {
-                var f = a.line,
-                    g = a.ch,
-                    h = l(a);
-                if (!h) return;
-                if (h[1]) d.push(h[2]);
-                else {
-                    for (var i = d.length - 1; i >= 0; --i)
-                        if (d[i] == h[2]) {
-                            d.length = i;
-                            break
-                        }
-                    if (0 > i && (!c || c == h[2])) return {
-                        tag: h[2],
-                        from: b(a.line, a.ch),
-                        to: b(f, g)
-                    }
-                }
-            } else l(a)
-        }
-    }
-    var b = a.Pos,
-        d = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",
-        e = d + "-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",
-        f = new RegExp("<(/?)([" + d + "][" + e + "]*)", "g");
-    a.registerHelper("fold", "xml", function (a, c) {
-        for (var d = new g(a, c.line, 0);;) {
-            var f, e = m(d);
-            if (!e || d.line != c.line || !(f = k(d))) return;
-            if (!e[1] && "selfClose" != f) {
-                var c = b(d.line, d.ch),
-                    h = o(d, e[2]);
-                return h && {
-                    from: c,
-                    to: h.from
-                }
-            }
-        }
-    }), a.findMatchingTag = function (a, d, e) {
-        var f = new g(a, d.line, d.ch, e);
-        if (-1 != f.text.indexOf(">") || -1 != f.text.indexOf("<")) {
-            var h = k(f),
-                i = h && b(f.line, f.ch),
-                j = h && l(f);
-            if (h && j && !(c(f, d) > 0)) {
-                var m = {
-                    from: b(f.line, f.ch),
-                    to: i,
-                    tag: j[2]
-                };
-                return "selfClose" == h ? {
-                    open: m,
-                    close: null,
-                    at: "open"
-                } : j[1] ? {
-                    open: p(f, j[2]),
-                    close: m,
-                    at: "close"
-                } : (f = new g(a, i.line, i.ch, e), {
-                    open: m,
-                    close: o(f, j[2]),
-                    at: "open"
-                })
-            }
-        }
-    }, a.findEnclosingTag = function (a, b, c) {
-        for (var d = new g(a, b.line, b.ch, c);;) {
-            var e = p(d);
-            if (!e) break;
-            var f = new g(a, b.line, b.ch, c),
-                h = o(f, e.tag);
-            if (h) return {
-                open: e,
-                close: h
-            }
-        }
-    }, a.scanForClosingTag = function (a, b, c, d) {
-        var e = new g(a, b.line, b.ch, d ? {
-            from: 0,
-            to: d
-        } : null);
-        return o(e, c)
-    }
-});
diff --git a/htdocs/Libs/Codemirror/codemirror.js b/htdocs/Libs/Codemirror/codemirror.js
new file mode 100644
index 0000000..0436a99
--- /dev/null
+++ b/htdocs/Libs/Codemirror/codemirror.js
@@ -0,0 +1,9797 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+// This is CodeMirror (https://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define(factory) :
+  (global = global || self, global.CodeMirror = factory());
+}(this, (function () { 'use strict';
+
+  // Kludges for bugs and behavior differences that can't be feature
+  // detected are enabled based on userAgent etc sniffing.
+  var userAgent = navigator.userAgent;
+  var platform = navigator.platform;
+
+  var gecko = /gecko\/\d/i.test(userAgent);
+  var ie_upto10 = /MSIE \d/.test(userAgent);
+  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
+  var edge = /Edge\/(\d+)/.exec(userAgent);
+  var ie = ie_upto10 || ie_11up || edge;
+  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);
+  var webkit = !edge && /WebKit\//.test(userAgent);
+  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
+  var chrome = !edge && /Chrome\//.test(userAgent);
+  var presto = /Opera\//.test(userAgent);
+  var safari = /Apple Computer/.test(navigator.vendor);
+  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
+  var phantom = /PhantomJS/.test(userAgent);
+
+  var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
+  var android = /Android/.test(userAgent);
+  // This is woefully incomplete. Suggestions for alternative methods welcome.
+  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
+  var mac = ios || /Mac/.test(platform);
+  var chromeOS = /\bCrOS\b/.test(userAgent);
+  var windows = /win/i.test(platform);
+
+  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
+  if (presto_version) { presto_version = Number(presto_version[1]); }
+  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+  var captureRightClick = gecko || (ie && ie_version >= 9);
+
+  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
+
+  var rmClass = function(node, cls) {
+    var current = node.className;
+    var match = classTest(cls).exec(current);
+    if (match) {
+      var after = current.slice(match.index + match[0].length);
+      node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
+    }
+  };
+
+  function removeChildren(e) {
+    for (var count = e.childNodes.length; count > 0; --count)
+      { e.removeChild(e.firstChild); }
+    return e
+  }
+
+  function removeChildrenAndAdd(parent, e) {
+    return removeChildren(parent).appendChild(e)
+  }
+
+  function elt(tag, content, className, style) {
+    var e = document.createElement(tag);
+    if (className) { e.className = className; }
+    if (style) { e.style.cssText = style; }
+    if (typeof content == "string") { e.appendChild(document.createTextNode(content)); }
+    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }
+    return e
+  }
+  // wrapper for elt, which removes the elt from the accessibility tree
+  function eltP(tag, content, className, style) {
+    var e = elt(tag, content, className, style);
+    e.setAttribute("role", "presentation");
+    return e
+  }
+
+  var range;
+  if (document.createRange) { range = function(node, start, end, endNode) {
+    var r = document.createRange();
+    r.setEnd(endNode || node, end);
+    r.setStart(node, start);
+    return r
+  }; }
+  else { range = function(node, start, end) {
+    var r = document.body.createTextRange();
+    try { r.moveToElementText(node.parentNode); }
+    catch(e) { return r }
+    r.collapse(true);
+    r.moveEnd("character", end);
+    r.moveStart("character", start);
+    return r
+  }; }
+
+  function contains(parent, child) {
+    if (child.nodeType == 3) // Android browser always returns false when child is a textnode
+      { child = child.parentNode; }
+    if (parent.contains)
+      { return parent.contains(child) }
+    do {
+      if (child.nodeType == 11) { child = child.host; }
+      if (child == parent) { return true }
+    } while (child = child.parentNode)
+  }
+
+  function activeElt() {
+    // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
+    // IE < 10 will throw when accessed while the page is loading or in an iframe.
+    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
+    var activeElement;
+    try {
+      activeElement = document.activeElement;
+    } catch(e) {
+      activeElement = document.body || null;
+    }
+    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
+      { activeElement = activeElement.shadowRoot.activeElement; }
+    return activeElement
+  }
+
+  function addClass(node, cls) {
+    var current = node.className;
+    if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; }
+  }
+  function joinClasses(a, b) {
+    var as = a.split(" ");
+    for (var i = 0; i < as.length; i++)
+      { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } }
+    return b
+  }
+
+  var selectInput = function(node) { node.select(); };
+  if (ios) // Mobile Safari apparently has a bug where select() is broken.
+    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }
+  else if (ie) // Suppress mysterious IE10 errors
+    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }
+
+  function bind(f) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function(){return f.apply(null, args)}
+  }
+
+  function copyObj(obj, target, overwrite) {
+    if (!target) { target = {}; }
+    for (var prop in obj)
+      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+        { target[prop] = obj[prop]; } }
+    return target
+  }
+
+  // Counts the column offset in a string, taking tabs into account.
+  // Used mostly to find indentation.
+  function countColumn(string, end, tabSize, startIndex, startValue) {
+    if (end == null) {
+      end = string.search(/[^\s\u00a0]/);
+      if (end == -1) { end = string.length; }
+    }
+    for (var i = startIndex || 0, n = startValue || 0;;) {
+      var nextTab = string.indexOf("\t", i);
+      if (nextTab < 0 || nextTab >= end)
+        { return n + (end - i) }
+      n += nextTab - i;
+      n += tabSize - (n % tabSize);
+      i = nextTab + 1;
+    }
+  }
+
+  var Delayed = function() {
+    this.id = null;
+    this.f = null;
+    this.time = 0;
+    this.handler = bind(this.onTimeout, this);
+  };
+  Delayed.prototype.onTimeout = function (self) {
+    self.id = 0;
+    if (self.time <= +new Date) {
+      self.f();
+    } else {
+      setTimeout(self.handler, self.time - +new Date);
+    }
+  };
+  Delayed.prototype.set = function (ms, f) {
+    this.f = f;
+    var time = +new Date + ms;
+    if (!this.id || time < this.time) {
+      clearTimeout(this.id);
+      this.id = setTimeout(this.handler, ms);
+      this.time = time;
+    }
+  };
+
+  function indexOf(array, elt) {
+    for (var i = 0; i < array.length; ++i)
+      { if (array[i] == elt) { return i } }
+    return -1
+  }
+
+  // Number of pixels added to scroller and sizer to hide scrollbar
+  var scrollerGap = 50;
+
+  // Returned or thrown by various protocols to signal 'I'm not
+  // handling this'.
+  var Pass = {toString: function(){return "CodeMirror.Pass"}};
+
+  // Reused option objects for setSelection & friends
+  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
+
+  // The inverse of countColumn -- find the offset that corresponds to
+  // a particular column.
+  function findColumn(string, goal, tabSize) {
+    for (var pos = 0, col = 0;;) {
+      var nextTab = string.indexOf("\t", pos);
+      if (nextTab == -1) { nextTab = string.length; }
+      var skipped = nextTab - pos;
+      if (nextTab == string.length || col + skipped >= goal)
+        { return pos + Math.min(skipped, goal - col) }
+      col += nextTab - pos;
+      col += tabSize - (col % tabSize);
+      pos = nextTab + 1;
+      if (col >= goal) { return pos }
+    }
+  }
+
+  var spaceStrs = [""];
+  function spaceStr(n) {
+    while (spaceStrs.length <= n)
+      { spaceStrs.push(lst(spaceStrs) + " "); }
+    return spaceStrs[n]
+  }
+
+  function lst(arr) { return arr[arr.length-1] }
+
+  function map(array, f) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }
+    return out
+  }
+
+  function insertSorted(array, value, score) {
+    var pos = 0, priority = score(value);
+    while (pos < array.length && score(array[pos]) <= priority) { pos++; }
+    array.splice(pos, 0, value);
+  }
+
+  function nothing() {}
+
+  function createObj(base, props) {
+    var inst;
+    if (Object.create) {
+      inst = Object.create(base);
+    } else {
+      nothing.prototype = base;
+      inst = new nothing();
+    }
+    if (props) { copyObj(props, inst); }
+    return inst
+  }
+
+  var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+  function isWordCharBasic(ch) {
+    return /\w/.test(ch) || ch > "\x80" &&
+      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))
+  }
+  function isWordChar(ch, helper) {
+    if (!helper) { return isWordCharBasic(ch) }
+    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true }
+    return helper.test(ch)
+  }
+
+  function isEmpty(obj) {
+    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }
+    return true
+  }
+
+  // Extending unicode characters. A series of a non-extending char +
+  // any number of extending chars is treated as a single unit as far
+  // as editing and measuring is concerned. This is not fully correct,
+  // since some scripts/fonts/browsers also treat other configurations
+  // of code points as a group.
+  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }
+
+  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
+  function skipExtendingChars(str, pos, dir) {
+    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }
+    return pos
+  }
+
+  // Returns the value from the range [`from`; `to`] that satisfies
+  // `pred` and is closest to `from`. Assumes that at least `to`
+  // satisfies `pred`. Supports `from` being greater than `to`.
+  function findFirst(pred, from, to) {
+    // At any point we are certain `to` satisfies `pred`, don't know
+    // whether `from` does.
+    var dir = from > to ? -1 : 1;
+    for (;;) {
+      if (from == to) { return from }
+      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);
+      if (mid == from) { return pred(mid) ? from : to }
+      if (pred(mid)) { to = mid; }
+      else { from = mid + dir; }
+    }
+  }
+
+  // BIDI HELPERS
+
+  function iterateBidiSections(order, from, to, f) {
+    if (!order) { return f(from, to, "ltr", 0) }
+    var found = false;
+    for (var i = 0; i < order.length; ++i) {
+      var part = order[i];
+      if (part.from < to && part.to > from || from == to && part.to == from) {
+        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i);
+        found = true;
+      }
+    }
+    if (!found) { f(from, to, "ltr"); }
+  }
+
+  var bidiOther = null;
+  function getBidiPartAt(order, ch, sticky) {
+    var found;
+    bidiOther = null;
+    for (var i = 0; i < order.length; ++i) {
+      var cur = order[i];
+      if (cur.from < ch && cur.to > ch) { return i }
+      if (cur.to == ch) {
+        if (cur.from != cur.to && sticky == "before") { found = i; }
+        else { bidiOther = i; }
+      }
+      if (cur.from == ch) {
+        if (cur.from != cur.to && sticky != "before") { found = i; }
+        else { bidiOther = i; }
+      }
+    }
+    return found != null ? found : bidiOther
+  }
+
+  // Bidirectional ordering algorithm
+  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+  // that this (partially) implements.
+
+  // One-char codes used for character types:
+  // L (L):   Left-to-Right
+  // R (R):   Right-to-Left
+  // r (AL):  Right-to-Left Arabic
+  // 1 (EN):  European Number
+  // + (ES):  European Number Separator
+  // % (ET):  European Number Terminator
+  // n (AN):  Arabic Number
+  // , (CS):  Common Number Separator
+  // m (NSM): Non-Spacing Mark
+  // b (BN):  Boundary Neutral
+  // s (B):   Paragraph Separator
+  // t (S):   Segment Separator
+  // w (WS):  Whitespace
+  // N (ON):  Other Neutrals
+
+  // Returns null if characters are ordered as they appear
+  // (left-to-right), or an array of sections ({from, to, level}
+  // objects) in the order in which they occur visually.
+  var bidiOrdering = (function() {
+    // Character types for codepoints 0 to 0xff
+    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+    // Character types for codepoints 0x600 to 0x6f9
+    var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";
+    function charType(code) {
+      if (code <= 0xf7) { return lowTypes.charAt(code) }
+      else if (0x590 <= code && code <= 0x5f4) { return "R" }
+      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }
+      else if (0x6ee <= code && code <= 0x8ac) { return "r" }
+      else if (0x2000 <= code && code <= 0x200b) { return "w" }
+      else if (code == 0x200c) { return "b" }
+      else { return "L" }
+    }
+
+    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+
+    function BidiSpan(level, from, to) {
+      this.level = level;
+      this.from = from; this.to = to;
+    }
+
+    return function(str, direction) {
+      var outerType = direction == "ltr" ? "L" : "R";
+
+      if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false }
+      var len = str.length, types = [];
+      for (var i = 0; i < len; ++i)
+        { types.push(charType(str.charCodeAt(i))); }
+
+      // W1. Examine each non-spacing mark (NSM) in the level run, and
+      // change the type of the NSM to the type of the previous
+      // character. If the NSM is at the start of the level run, it will
+      // get the type of sor.
+      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {
+        var type = types[i$1];
+        if (type == "m") { types[i$1] = prev; }
+        else { prev = type; }
+      }
+
+      // W2. Search backwards from each instance of a European number
+      // until the first strong type (R, L, AL, or sor) is found. If an
+      // AL is found, change the type of the European number to Arabic
+      // number.
+      // W3. Change all ALs to R.
+      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {
+        var type$1 = types[i$2];
+        if (type$1 == "1" && cur == "r") { types[i$2] = "n"; }
+        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } }
+      }
+
+      // W4. A single European separator between two European numbers
+      // changes to a European number. A single common separator between
+      // two numbers of the same type changes to that type.
+      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {
+        var type$2 = types[i$3];
+        if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; }
+        else if (type$2 == "," && prev$1 == types[i$3+1] &&
+                 (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; }
+        prev$1 = type$2;
+      }
+
+      // W5. A sequence of European terminators adjacent to European
+      // numbers changes to all European numbers.
+      // W6. Otherwise, separators and terminators change to Other
+      // Neutral.
+      for (var i$4 = 0; i$4 < len; ++i$4) {
+        var type$3 = types[i$4];
+        if (type$3 == ",") { types[i$4] = "N"; }
+        else if (type$3 == "%") {
+          var end = (void 0);
+          for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {}
+          var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+          for (var j = i$4; j < end; ++j) { types[j] = replace; }
+          i$4 = end - 1;
+        }
+      }
+
+      // W7. Search backwards from each instance of a European number
+      // until the first strong type (R, L, or sor) is found. If an L is
+      // found, then change the type of the European number to L.
+      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {
+        var type$4 = types[i$5];
+        if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; }
+        else if (isStrong.test(type$4)) { cur$1 = type$4; }
+      }
+
+      // N1. A sequence of neutrals takes the direction of the
+      // surrounding strong text if the text on both sides has the same
+      // direction. European and Arabic numbers act as if they were R in
+      // terms of their influence on neutrals. Start-of-level-run (sor)
+      // and end-of-level-run (eor) are used at level run boundaries.
+      // N2. Any remaining neutrals take the embedding direction.
+      for (var i$6 = 0; i$6 < len; ++i$6) {
+        if (isNeutral.test(types[i$6])) {
+          var end$1 = (void 0);
+          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}
+          var before = (i$6 ? types[i$6-1] : outerType) == "L";
+          var after = (end$1 < len ? types[end$1] : outerType) == "L";
+          var replace$1 = before == after ? (before ? "L" : "R") : outerType;
+          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }
+          i$6 = end$1 - 1;
+        }
+      }
+
+      // Here we depart from the documented algorithm, in order to avoid
+      // building up an actual levels array. Since there are only three
+      // levels (0, 1, 2) in an implementation that doesn't take
+      // explicit embedding into account, we can build up the order on
+      // the fly, without following the level-based algorithm.
+      var order = [], m;
+      for (var i$7 = 0; i$7 < len;) {
+        if (countsAsLeft.test(types[i$7])) {
+          var start = i$7;
+          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}
+          order.push(new BidiSpan(0, start, i$7));
+        } else {
+          var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0;
+          for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {}
+          for (var j$2 = pos; j$2 < i$7;) {
+            if (countsAsNum.test(types[j$2])) {
+              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }
+              var nstart = j$2;
+              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}
+              order.splice(at, 0, new BidiSpan(2, nstart, j$2));
+              at += isRTL;
+              pos = j$2;
+            } else { ++j$2; }
+          }
+          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }
+        }
+      }
+      if (direction == "ltr") {
+        if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+          order[0].from = m[0].length;
+          order.unshift(new BidiSpan(0, 0, m[0].length));
+        }
+        if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+          lst(order).to -= m[0].length;
+          order.push(new BidiSpan(0, len - m[0].length, len));
+        }
+      }
+
+      return direction == "rtl" ? order.reverse() : order
+    }
+  })();
+
+  // Get the bidi ordering for the given line (and cache it). Returns
+  // false for lines that are fully left-to-right, and an array of
+  // BidiSpan objects otherwise.
+  function getOrder(line, direction) {
+    var order = line.order;
+    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }
+    return order
+  }
+
+  // EVENT HANDLING
+
+  // Lightweight event framework. on/off also work on DOM nodes,
+  // registering native DOM handlers.
+
+  var noHandlers = [];
+
+  var on = function(emitter, type, f) {
+    if (emitter.addEventListener) {
+      emitter.addEventListener(type, f, false);
+    } else if (emitter.attachEvent) {
+      emitter.attachEvent("on" + type, f);
+    } else {
+      var map = emitter._handlers || (emitter._handlers = {});
+      map[type] = (map[type] || noHandlers).concat(f);
+    }
+  };
+
+  function getHandlers(emitter, type) {
+    return emitter._handlers && emitter._handlers[type] || noHandlers
+  }
+
+  function off(emitter, type, f) {
+    if (emitter.removeEventListener) {
+      emitter.removeEventListener(type, f, false);
+    } else if (emitter.detachEvent) {
+      emitter.detachEvent("on" + type, f);
+    } else {
+      var map = emitter._handlers, arr = map && map[type];
+      if (arr) {
+        var index = indexOf(arr, f);
+        if (index > -1)
+          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }
+      }
+    }
+  }
+
+  function signal(emitter, type /*, values...*/) {
+    var handlers = getHandlers(emitter, type);
+    if (!handlers.length) { return }
+    var args = Array.prototype.slice.call(arguments, 2);
+    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }
+  }
+
+  // The DOM events that CodeMirror handles can be overridden by
+  // registering a (non-DOM) handler on the editor for the event name,
+  // and preventDefault-ing the event in that handler.
+  function signalDOMEvent(cm, e, override) {
+    if (typeof e == "string")
+      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }
+    signal(cm, override || e.type, cm, e);
+    return e_defaultPrevented(e) || e.codemirrorIgnore
+  }
+
+  function signalCursorActivity(cm) {
+    var arr = cm._handlers && cm._handlers.cursorActivity;
+    if (!arr) { return }
+    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)
+      { set.push(arr[i]); } }
+  }
+
+  function hasHandler(emitter, type) {
+    return getHandlers(emitter, type).length > 0
+  }
+
+  // Add on and off methods to a constructor's prototype, to make
+  // registering events on such objects more convenient.
+  function eventMixin(ctor) {
+    ctor.prototype.on = function(type, f) {on(this, type, f);};
+    ctor.prototype.off = function(type, f) {off(this, type, f);};
+  }
+
+  // Due to the fact that we still support jurassic IE versions, some
+  // compatibility wrappers are needed.
+
+  function e_preventDefault(e) {
+    if (e.preventDefault) { e.preventDefault(); }
+    else { e.returnValue = false; }
+  }
+  function e_stopPropagation(e) {
+    if (e.stopPropagation) { e.stopPropagation(); }
+    else { e.cancelBubble = true; }
+  }
+  function e_defaultPrevented(e) {
+    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
+  }
+  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+
+  function e_target(e) {return e.target || e.srcElement}
+  function e_button(e) {
+    var b = e.which;
+    if (b == null) {
+      if (e.button & 1) { b = 1; }
+      else if (e.button & 2) { b = 3; }
+      else if (e.button & 4) { b = 2; }
+    }
+    if (mac && e.ctrlKey && b == 1) { b = 3; }
+    return b
+  }
+
+  // Detect drag-and-drop
+  var dragAndDrop = function() {
+    // There is *some* kind of drag-and-drop support in IE6-8, but I
+    // couldn't get it to work yet.
+    if (ie && ie_version < 9) { return false }
+    var div = elt('div');
+    return "draggable" in div || "dragDrop" in div
+  }();
+
+  var zwspSupported;
+  function zeroWidthElement(measure) {
+    if (zwspSupported == null) {
+      var test = elt("span", "\u200b");
+      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+      if (measure.firstChild.offsetHeight != 0)
+        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }
+    }
+    var node = zwspSupported ? elt("span", "\u200b") :
+      elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+    node.setAttribute("cm-text", "");
+    return node
+  }
+
+  // Feature-detect IE's crummy client rect reporting for bidi text
+  var badBidiRects;
+  function hasBadBidiRects(measure) {
+    if (badBidiRects != null) { return badBidiRects }
+    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+    var r0 = range(txt, 0, 1).getBoundingClientRect();
+    var r1 = range(txt, 1, 2).getBoundingClientRect();
+    removeChildren(measure);
+    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)
+    return badBidiRects = (r1.right - r0.right < 3)
+  }
+
+  // See if "".split is the broken IE version, if so, provide an
+  // alternative way to split lines.
+  var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) {
+    var pos = 0, result = [], l = string.length;
+    while (pos <= l) {
+      var nl = string.indexOf("\n", pos);
+      if (nl == -1) { nl = string.length; }
+      var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
+      var rt = line.indexOf("\r");
+      if (rt != -1) {
+        result.push(line.slice(0, rt));
+        pos += rt + 1;
+      } else {
+        result.push(line);
+        pos = nl + 1;
+      }
+    }
+    return result
+  } : function (string) { return string.split(/\r\n?|\n/); };
+
+  var hasSelection = window.getSelection ? function (te) {
+    try { return te.selectionStart != te.selectionEnd }
+    catch(e) { return false }
+  } : function (te) {
+    var range;
+    try {range = te.ownerDocument.selection.createRange();}
+    catch(e) {}
+    if (!range || range.parentElement() != te) { return false }
+    return range.compareEndPoints("StartToEnd", range) != 0
+  };
+
+  var hasCopyEvent = (function () {
+    var e = elt("div");
+    if ("oncopy" in e) { return true }
+    e.setAttribute("oncopy", "return;");
+    return typeof e.oncopy == "function"
+  })();
+
+  var badZoomedRects = null;
+  function hasBadZoomedRects(measure) {
+    if (badZoomedRects != null) { return badZoomedRects }
+    var node = removeChildrenAndAdd(measure, elt("span", "x"));
+    var normal = node.getBoundingClientRect();
+    var fromRange = range(node, 0, 1).getBoundingClientRect();
+    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1
+  }
+
+  // Known modes, by name and by MIME
+  var modes = {}, mimeModes = {};
+
+  // Extra arguments are stored as the mode's dependencies, which is
+  // used by (legacy) mechanisms like loadmode.js to automatically
+  // load a mode. (Preferred mechanism is the require/define calls.)
+  function defineMode(name, mode) {
+    if (arguments.length > 2)
+      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }
+    modes[name] = mode;
+  }
+
+  function defineMIME(mime, spec) {
+    mimeModes[mime] = spec;
+  }
+
+  // Given a MIME type, a {name, ...options} config object, or a name
+  // string, return a mode config object.
+  function resolveMode(spec) {
+    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
+      spec = mimeModes[spec];
+    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+      var found = mimeModes[spec.name];
+      if (typeof found == "string") { found = {name: found}; }
+      spec = createObj(found, spec);
+      spec.name = found.name;
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
+      return resolveMode("application/xml")
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
+      return resolveMode("application/json")
+    }
+    if (typeof spec == "string") { return {name: spec} }
+    else { return spec || {name: "null"} }
+  }
+
+  // Given a mode spec (anything that resolveMode accepts), find and
+  // initialize an actual mode object.
+  function getMode(options, spec) {
+    spec = resolveMode(spec);
+    var mfactory = modes[spec.name];
+    if (!mfactory) { return getMode(options, "text/plain") }
+    var modeObj = mfactory(options, spec);
+    if (modeExtensions.hasOwnProperty(spec.name)) {
+      var exts = modeExtensions[spec.name];
+      for (var prop in exts) {
+        if (!exts.hasOwnProperty(prop)) { continue }
+        if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; }
+        modeObj[prop] = exts[prop];
+      }
+    }
+    modeObj.name = spec.name;
+    if (spec.helperType) { modeObj.helperType = spec.helperType; }
+    if (spec.modeProps) { for (var prop$1 in spec.modeProps)
+      { modeObj[prop$1] = spec.modeProps[prop$1]; } }
+
+    return modeObj
+  }
+
+  // This can be used to attach properties to mode objects from
+  // outside the actual mode definition.
+  var modeExtensions = {};
+  function extendMode(mode, properties) {
+    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
+    copyObj(properties, exts);
+  }
+
+  function copyState(mode, state) {
+    if (state === true) { return state }
+    if (mode.copyState) { return mode.copyState(state) }
+    var nstate = {};
+    for (var n in state) {
+      var val = state[n];
+      if (val instanceof Array) { val = val.concat([]); }
+      nstate[n] = val;
+    }
+    return nstate
+  }
+
+  // Given a mode and a state (for that mode), find the inner mode and
+  // state at the position that the state refers to.
+  function innerMode(mode, state) {
+    var info;
+    while (mode.innerMode) {
+      info = mode.innerMode(state);
+      if (!info || info.mode == mode) { break }
+      state = info.state;
+      mode = info.mode;
+    }
+    return info || {mode: mode, state: state}
+  }
+
+  function startState(mode, a1, a2) {
+    return mode.startState ? mode.startState(a1, a2) : true
+  }
+
+  // STRING STREAM
+
+  // Fed to the mode parsers, provides helper functions to make
+  // parsers more succinct.
+
+  var StringStream = function(string, tabSize, lineOracle) {
+    this.pos = this.start = 0;
+    this.string = string;
+    this.tabSize = tabSize || 8;
+    this.lastColumnPos = this.lastColumnValue = 0;
+    this.lineStart = 0;
+    this.lineOracle = lineOracle;
+  };
+
+  StringStream.prototype.eol = function () {return this.pos >= this.string.length};
+  StringStream.prototype.sol = function () {return this.pos == this.lineStart};
+  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};
+  StringStream.prototype.next = function () {
+    if (this.pos < this.string.length)
+      { return this.string.charAt(this.pos++) }
+  };
+  StringStream.prototype.eat = function (match) {
+    var ch = this.string.charAt(this.pos);
+    var ok;
+    if (typeof match == "string") { ok = ch == match; }
+    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }
+    if (ok) {++this.pos; return ch}
+  };
+  StringStream.prototype.eatWhile = function (match) {
+    var start = this.pos;
+    while (this.eat(match)){}
+    return this.pos > start
+  };
+  StringStream.prototype.eatSpace = function () {
+    var start = this.pos;
+    while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }
+    return this.pos > start
+  };
+  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};
+  StringStream.prototype.skipTo = function (ch) {
+    var found = this.string.indexOf(ch, this.pos);
+    if (found > -1) {this.pos = found; return true}
+  };
+  StringStream.prototype.backUp = function (n) {this.pos -= n;};
+  StringStream.prototype.column = function () {
+    if (this.lastColumnPos < this.start) {
+      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+      this.lastColumnPos = this.start;
+    }
+    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+  };
+  StringStream.prototype.indentation = function () {
+    return countColumn(this.string, null, this.tabSize) -
+      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+  };
+  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
+    if (typeof pattern == "string") {
+      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };
+      var substr = this.string.substr(this.pos, pattern.length);
+      if (cased(substr) == cased(pattern)) {
+        if (consume !== false) { this.pos += pattern.length; }
+        return true
+      }
+    } else {
+      var match = this.string.slice(this.pos).match(pattern);
+      if (match && match.index > 0) { return null }
+      if (match && consume !== false) { this.pos += match[0].length; }
+      return match
+    }
+  };
+  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};
+  StringStream.prototype.hideFirstChars = function (n, inner) {
+    this.lineStart += n;
+    try { return inner() }
+    finally { this.lineStart -= n; }
+  };
+  StringStream.prototype.lookAhead = function (n) {
+    var oracle = this.lineOracle;
+    return oracle && oracle.lookAhead(n)
+  };
+  StringStream.prototype.baseToken = function () {
+    var oracle = this.lineOracle;
+    return oracle && oracle.baseToken(this.pos)
+  };
+
+  // Find the line object corresponding to the given line number.
+  function getLine(doc, n) {
+    n -= doc.first;
+    if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") }
+    var chunk = doc;
+    while (!chunk.lines) {
+      for (var i = 0;; ++i) {
+        var child = chunk.children[i], sz = child.chunkSize();
+        if (n < sz) { chunk = child; break }
+        n -= sz;
+      }
+    }
+    return chunk.lines[n]
+  }
+
+  // Get the part of a document between two positions, as an array of
+  // strings.
+  function getBetween(doc, start, end) {
+    var out = [], n = start.line;
+    doc.iter(start.line, end.line + 1, function (line) {
+      var text = line.text;
+      if (n == end.line) { text = text.slice(0, end.ch); }
+      if (n == start.line) { text = text.slice(start.ch); }
+      out.push(text);
+      ++n;
+    });
+    return out
+  }
+  // Get the lines between from and to, as array of strings.
+  function getLines(doc, from, to) {
+    var out = [];
+    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value
+    return out
+  }
+
+  // Update the height of a line, propagating the height change
+  // upwards to parent nodes.
+  function updateLineHeight(line, height) {
+    var diff = height - line.height;
+    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }
+  }
+
+  // Given a line object, find its line number by walking up through
+  // its parent links.
+  function lineNo(line) {
+    if (line.parent == null) { return null }
+    var cur = line.parent, no = indexOf(cur.lines, line);
+    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+      for (var i = 0;; ++i) {
+        if (chunk.children[i] == cur) { break }
+        no += chunk.children[i].chunkSize();
+      }
+    }
+    return no + cur.first
+  }
+
+  // Find the line at the given vertical position, using the height
+  // information in the document tree.
+  function lineAtHeight(chunk, h) {
+    var n = chunk.first;
+    outer: do {
+      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {
+        var child = chunk.children[i$1], ch = child.height;
+        if (h < ch) { chunk = child; continue outer }
+        h -= ch;
+        n += child.chunkSize();
+      }
+      return n
+    } while (!chunk.lines)
+    var i = 0;
+    for (; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i], lh = line.height;
+      if (h < lh) { break }
+      h -= lh;
+    }
+    return n + i
+  }
+
+  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
+
+  function lineNumberFor(options, i) {
+    return String(options.lineNumberFormatter(i + options.firstLineNumber))
+  }
+
+  // A Pos instance represents a position within the text.
+  function Pos(line, ch, sticky) {
+    if ( sticky === void 0 ) sticky = null;
+
+    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }
+    this.line = line;
+    this.ch = ch;
+    this.sticky = sticky;
+  }
+
+  // Compare two positions, return 0 if they are the same, a negative
+  // number when a is less, and a positive number otherwise.
+  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
+
+  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }
+
+  function copyPos(x) {return Pos(x.line, x.ch)}
+  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
+  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
+
+  // Most of the external API clips given positions to make sure they
+  // actually exist within the document.
+  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
+  function clipPos(doc, pos) {
+    if (pos.line < doc.first) { return Pos(doc.first, 0) }
+    var last = doc.first + doc.size - 1;
+    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }
+    return clipToLen(pos, getLine(doc, pos.line).text.length)
+  }
+  function clipToLen(pos, linelen) {
+    var ch = pos.ch;
+    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }
+    else if (ch < 0) { return Pos(pos.line, 0) }
+    else { return pos }
+  }
+  function clipPosArray(doc, array) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }
+    return out
+  }
+
+  var SavedContext = function(state, lookAhead) {
+    this.state = state;
+    this.lookAhead = lookAhead;
+  };
+
+  var Context = function(doc, state, line, lookAhead) {
+    this.state = state;
+    this.doc = doc;
+    this.line = line;
+    this.maxLookAhead = lookAhead || 0;
+    this.baseTokens = null;
+    this.baseTokenPos = 1;
+  };
+
+  Context.prototype.lookAhead = function (n) {
+    var line = this.doc.getLine(this.line + n);
+    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }
+    return line
+  };
+
+  Context.prototype.baseToken = function (n) {
+    if (!this.baseTokens) { return null }
+    while (this.baseTokens[this.baseTokenPos] <= n)
+      { this.baseTokenPos += 2; }
+    var type = this.baseTokens[this.baseTokenPos + 1];
+    return {type: type && type.replace(/( |^)overlay .*/, ""),
+            size: this.baseTokens[this.baseTokenPos] - n}
+  };
+
+  Context.prototype.nextLine = function () {
+    this.line++;
+    if (this.maxLookAhead > 0) { this.maxLookAhead--; }
+  };
+
+  Context.fromSaved = function (doc, saved, line) {
+    if (saved instanceof SavedContext)
+      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }
+    else
+      { return new Context(doc, copyState(doc.mode, saved), line) }
+  };
+
+  Context.prototype.save = function (copy) {
+    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;
+    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state
+  };
+
+
+  // Compute a style array (an array starting with a mode generation
+  // -- for invalidation -- followed by pairs of end positions and
+  // style strings), which is used to highlight the tokens on the
+  // line.
+  function highlightLine(cm, line, context, forceToEnd) {
+    // A styles array always starts with a number identifying the
+    // mode/overlays that it is based on (for easy invalidation).
+    var st = [cm.state.modeGen], lineClasses = {};
+    // Compute the base array of styles
+    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },
+            lineClasses, forceToEnd);
+    var state = context.state;
+
+    // Run overlays, adjust style array.
+    var loop = function ( o ) {
+      context.baseTokens = st;
+      var overlay = cm.state.overlays[o], i = 1, at = 0;
+      context.state = true;
+      runMode(cm, line.text, overlay.mode, context, function (end, style) {
+        var start = i;
+        // Ensure there's a token end at the current position, and that i points at it
+        while (at < end) {
+          var i_end = st[i];
+          if (i_end > end)
+            { st.splice(i, 1, end, st[i+1], i_end); }
+          i += 2;
+          at = Math.min(end, i_end);
+        }
+        if (!style) { return }
+        if (overlay.opaque) {
+          st.splice(start, i - start, end, "overlay " + style);
+          i = start + 2;
+        } else {
+          for (; start < i; start += 2) {
+            var cur = st[start+1];
+            st[start+1] = (cur ? cur + " " : "") + "overlay " + style;
+          }
+        }
+      }, lineClasses);
+      context.state = state;
+      context.baseTokens = null;
+      context.baseTokenPos = 1;
+    };
+
+    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );
+
+    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}
+  }
+
+  function getLineStyles(cm, line, updateFrontier) {
+    if (!line.styles || line.styles[0] != cm.state.modeGen) {
+      var context = getContextBefore(cm, lineNo(line));
+      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);
+      var result = highlightLine(cm, line, context);
+      if (resetState) { context.state = resetState; }
+      line.stateAfter = context.save(!resetState);
+      line.styles = result.styles;
+      if (result.classes) { line.styleClasses = result.classes; }
+      else if (line.styleClasses) { line.styleClasses = null; }
+      if (updateFrontier === cm.doc.highlightFrontier)
+        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }
+    }
+    return line.styles
+  }
+
+  function getContextBefore(cm, n, precise) {
+    var doc = cm.doc, display = cm.display;
+    if (!doc.mode.startState) { return new Context(doc, true, n) }
+    var start = findStartLine(cm, n, precise);
+    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;
+    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);
+
+    doc.iter(start, n, function (line) {
+      processLine(cm, line.text, context);
+      var pos = context.line;
+      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;
+      context.nextLine();
+    });
+    if (precise) { doc.modeFrontier = context.line; }
+    return context
+  }
+
+  // Lightweight form of highlight -- proceed over this line and
+  // update state, but don't save a style array. Used for lines that
+  // aren't currently visible.
+  function processLine(cm, text, context, startAt) {
+    var mode = cm.doc.mode;
+    var stream = new StringStream(text, cm.options.tabSize, context);
+    stream.start = stream.pos = startAt || 0;
+    if (text == "") { callBlankLine(mode, context.state); }
+    while (!stream.eol()) {
+      readToken(mode, stream, context.state);
+      stream.start = stream.pos;
+    }
+  }
+
+  function callBlankLine(mode, state) {
+    if (mode.blankLine) { return mode.blankLine(state) }
+    if (!mode.innerMode) { return }
+    var inner = innerMode(mode, state);
+    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }
+  }
+
+  function readToken(mode, stream, state, inner) {
+    for (var i = 0; i < 10; i++) {
+      if (inner) { inner[0] = innerMode(mode, state).mode; }
+      var style = mode.token(stream, state);
+      if (stream.pos > stream.start) { return style }
+    }
+    throw new Error("Mode " + mode.name + " failed to advance stream.")
+  }
+
+  var Token = function(stream, type, state) {
+    this.start = stream.start; this.end = stream.pos;
+    this.string = stream.current();
+    this.type = type || null;
+    this.state = state;
+  };
+
+  // Utility for getTokenAt and getLineTokens
+  function takeToken(cm, pos, precise, asArray) {
+    var doc = cm.doc, mode = doc.mode, style;
+    pos = clipPos(doc, pos);
+    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);
+    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;
+    if (asArray) { tokens = []; }
+    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
+      stream.start = stream.pos;
+      style = readToken(mode, stream, context.state);
+      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }
+    }
+    return asArray ? tokens : new Token(stream, style, context.state)
+  }
+
+  function extractLineClasses(type, output) {
+    if (type) { for (;;) {
+      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+      if (!lineClass) { break }
+      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+      var prop = lineClass[1] ? "bgClass" : "textClass";
+      if (output[prop] == null)
+        { output[prop] = lineClass[2]; }
+      else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop]))
+        { output[prop] += " " + lineClass[2]; }
+    } }
+    return type
+  }
+
+  // Run the given mode's parser over a line, calling f for each token.
+  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
+    var flattenSpans = mode.flattenSpans;
+    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }
+    var curStart = 0, curStyle = null;
+    var stream = new StringStream(text, cm.options.tabSize, context), style;
+    var inner = cm.options.addModeClass && [null];
+    if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }
+    while (!stream.eol()) {
+      if (stream.pos > cm.options.maxHighlightLength) {
+        flattenSpans = false;
+        if (forceToEnd) { processLine(cm, text, context, stream.pos); }
+        stream.pos = text.length;
+        style = null;
+      } else {
+        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);
+      }
+      if (inner) {
+        var mName = inner[0].name;
+        if (mName) { style = "m-" + (style ? mName + " " + style : mName); }
+      }
+      if (!flattenSpans || curStyle != style) {
+        while (curStart < stream.start) {
+          curStart = Math.min(stream.start, curStart + 5000);
+          f(curStart, curStyle);
+        }
+        curStyle = style;
+      }
+      stream.start = stream.pos;
+    }
+    while (curStart < stream.pos) {
+      // Webkit seems to refuse to render text nodes longer than 57444
+      // characters, and returns inaccurate measurements in nodes
+      // starting around 5000 chars.
+      var pos = Math.min(stream.pos, curStart + 5000);
+      f(pos, curStyle);
+      curStart = pos;
+    }
+  }
+
+  // Finds the line to start with when starting a parse. Tries to
+  // find a line with a stateAfter, so that it can start with a
+  // valid state. If that fails, it returns the line with the
+  // smallest indentation, which tends to need the least context to
+  // parse correctly.
+  function findStartLine(cm, n, precise) {
+    var minindent, minline, doc = cm.doc;
+    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+    for (var search = n; search > lim; --search) {
+      if (search <= doc.first) { return doc.first }
+      var line = getLine(doc, search - 1), after = line.stateAfter;
+      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))
+        { return search }
+      var indented = countColumn(line.text, null, cm.options.tabSize);
+      if (minline == null || minindent > indented) {
+        minline = search - 1;
+        minindent = indented;
+      }
+    }
+    return minline
+  }
+
+  function retreatFrontier(doc, n) {
+    doc.modeFrontier = Math.min(doc.modeFrontier, n);
+    if (doc.highlightFrontier < n - 10) { return }
+    var start = doc.first;
+    for (var line = n - 1; line > start; line--) {
+      var saved = getLine(doc, line).stateAfter;
+      // change is on 3
+      // state on line 1 looked ahead 2 -- so saw 3
+      // test 1 + 2 < 3 should cover this
+      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {
+        start = line + 1;
+        break
+      }
+    }
+    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);
+  }
+
+  // Optimize some code when these features are not used.
+  var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+  function seeReadOnlySpans() {
+    sawReadOnlySpans = true;
+  }
+
+  function seeCollapsedSpans() {
+    sawCollapsedSpans = true;
+  }
+
+  // TEXTMARKER SPANS
+
+  function MarkedSpan(marker, from, to) {
+    this.marker = marker;
+    this.from = from; this.to = to;
+  }
+
+  // Search an array of spans for a span matching the given marker.
+  function getMarkedSpanFor(spans, marker) {
+    if (spans) { for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.marker == marker) { return span }
+    } }
+  }
+  // Remove a span from an array, returning undefined if no spans are
+  // left (we don't store arrays for lines without spans).
+  function removeMarkedSpan(spans, span) {
+    var r;
+    for (var i = 0; i < spans.length; ++i)
+      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
+    return r
+  }
+  // Add a span to a line.
+  function addMarkedSpan(line, span) {
+    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+    span.marker.attachLine(line);
+  }
+
+  // Used for the algorithm that adjusts markers for a change in the
+  // document. These functions cut an array of spans at a given
+  // character position, returning an array of remaining chunks (or
+  // undefined if nothing remains).
+  function markedSpansBefore(old, startCh, isInsert) {
+    var nw;
+    if (old) { for (var i = 0; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)
+        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+      }
+    } }
+    return nw
+  }
+  function markedSpansAfter(old, endCh, isInsert) {
+    var nw;
+    if (old) { for (var i = 0; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)
+        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+                                              span.to == null ? null : span.to - endCh));
+      }
+    } }
+    return nw
+  }
+
+  // Given a change object, compute the new set of marker spans that
+  // cover the line in which the change took place. Removes spans
+  // entirely within the change, reconnects spans belonging to the
+  // same marker that appear on both sides of the change, and cuts off
+  // spans partially within the change. Returns an array of span
+  // arrays with one element for each line in (after) the change.
+  function stretchSpansOverChange(doc, change) {
+    if (change.full) { return null }
+    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+    if (!oldFirst && !oldLast) { return null }
+
+    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+    // Get the spans that 'stick out' on both sides
+    var first = markedSpansBefore(oldFirst, startCh, isInsert);
+    var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+    // Next, merge those two ends
+    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+    if (first) {
+      // Fix up .to properties of first
+      for (var i = 0; i < first.length; ++i) {
+        var span = first[i];
+        if (span.to == null) {
+          var found = getMarkedSpanFor(last, span.marker);
+          if (!found) { span.to = startCh; }
+          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }
+        }
+      }
+    }
+    if (last) {
+      // Fix up .from in last (or move them into first in case of sameLine)
+      for (var i$1 = 0; i$1 < last.length; ++i$1) {
+        var span$1 = last[i$1];
+        if (span$1.to != null) { span$1.to += offset; }
+        if (span$1.from == null) {
+          var found$1 = getMarkedSpanFor(first, span$1.marker);
+          if (!found$1) {
+            span$1.from = offset;
+            if (sameLine) { (first || (first = [])).push(span$1); }
+          }
+        } else {
+          span$1.from += offset;
+          if (sameLine) { (first || (first = [])).push(span$1); }
+        }
+      }
+    }
+    // Make sure we didn't create any zero-length spans
+    if (first) { first = clearEmptySpans(first); }
+    if (last && last != first) { last = clearEmptySpans(last); }
+
+    var newMarkers = [first];
+    if (!sameLine) {
+      // Fill gap with whole-line-spans
+      var gap = change.text.length - 2, gapMarkers;
+      if (gap > 0 && first)
+        { for (var i$2 = 0; i$2 < first.length; ++i$2)
+          { if (first[i$2].to == null)
+            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }
+      for (var i$3 = 0; i$3 < gap; ++i$3)
+        { newMarkers.push(gapMarkers); }
+      newMarkers.push(last);
+    }
+    return newMarkers
+  }
+
+  // Remove spans that are empty and don't have a clearWhenEmpty
+  // option of false.
+  function clearEmptySpans(spans) {
+    for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+        { spans.splice(i--, 1); }
+    }
+    if (!spans.length) { return null }
+    return spans
+  }
+
+  // Used to 'clip' out readOnly ranges when making a change.
+  function removeReadOnlyRanges(doc, from, to) {
+    var markers = null;
+    doc.iter(from.line, to.line + 1, function (line) {
+      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+        var mark = line.markedSpans[i].marker;
+        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+          { (markers || (markers = [])).push(mark); }
+      } }
+    });
+    if (!markers) { return null }
+    var parts = [{from: from, to: to}];
+    for (var i = 0; i < markers.length; ++i) {
+      var mk = markers[i], m = mk.find(0);
+      for (var j = 0; j < parts.length; ++j) {
+        var p = parts[j];
+        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }
+        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+          { newParts.push({from: p.from, to: m.from}); }
+        if (dto > 0 || !mk.inclusiveRight && !dto)
+          { newParts.push({from: m.to, to: p.to}); }
+        parts.splice.apply(parts, newParts);
+        j += newParts.length - 3;
+      }
+    }
+    return parts
+  }
+
+  // Connect or disconnect spans from a line.
+  function detachMarkedSpans(line) {
+    var spans = line.markedSpans;
+    if (!spans) { return }
+    for (var i = 0; i < spans.length; ++i)
+      { spans[i].marker.detachLine(line); }
+    line.markedSpans = null;
+  }
+  function attachMarkedSpans(line, spans) {
+    if (!spans) { return }
+    for (var i = 0; i < spans.length; ++i)
+      { spans[i].marker.attachLine(line); }
+    line.markedSpans = spans;
+  }
+
+  // Helpers used when computing which overlapping collapsed span
+  // counts as the larger one.
+  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
+  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
+
+  // Returns a number indicating which of two overlapping collapsed
+  // spans is larger (and thus includes the other). Falls back to
+  // comparing ids when the spans cover exactly the same range.
+  function compareCollapsedMarkers(a, b) {
+    var lenDiff = a.lines.length - b.lines.length;
+    if (lenDiff != 0) { return lenDiff }
+    var aPos = a.find(), bPos = b.find();
+    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+    if (fromCmp) { return -fromCmp }
+    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+    if (toCmp) { return toCmp }
+    return b.id - a.id
+  }
+
+  // Find out whether a line ends or starts in a collapsed span. If
+  // so, return the marker for that span.
+  function collapsedSpanAtSide(line, start) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+        { found = sp.marker; }
+    } }
+    return found
+  }
+  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
+  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
+
+  function collapsedSpanAround(line, ch) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) { for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }
+    } }
+    return found
+  }
+
+  // Test whether there exists a collapsed span that partially
+  // overlaps (covers the start or end, but not both) of a new span.
+  // Such overlap is not allowed.
+  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
+    var line = getLine(doc, lineNo);
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) { for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (!sp.marker.collapsed) { continue }
+      var found = sp.marker.find(0);
+      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }
+      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
+          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
+        { return true }
+    } }
+  }
+
+  // A visual line is a line as drawn on the screen. Folding, for
+  // example, can cause multiple logical lines to appear on the same
+  // visual line. This finds the start of the visual line that the
+  // given line is part of (usually that is the line itself).
+  function visualLine(line) {
+    var merged;
+    while (merged = collapsedSpanAtStart(line))
+      { line = merged.find(-1, true).line; }
+    return line
+  }
+
+  function visualLineEnd(line) {
+    var merged;
+    while (merged = collapsedSpanAtEnd(line))
+      { line = merged.find(1, true).line; }
+    return line
+  }
+
+  // Returns an array of logical lines that continue the visual line
+  // started by the argument, or undefined if there are no such lines.
+  function visualLineContinued(line) {
+    var merged, lines;
+    while (merged = collapsedSpanAtEnd(line)) {
+      line = merged.find(1, true).line
+      ;(lines || (lines = [])).push(line);
+    }
+    return lines
+  }
+
+  // Get the line number of the start of the visual line that the
+  // given line number is part of.
+  function visualLineNo(doc, lineN) {
+    var line = getLine(doc, lineN), vis = visualLine(line);
+    if (line == vis) { return lineN }
+    return lineNo(vis)
+  }
+
+  // Get the line number of the start of the next visual line after
+  // the given line.
+  function visualLineEndNo(doc, lineN) {
+    if (lineN > doc.lastLine()) { return lineN }
+    var line = getLine(doc, lineN), merged;
+    if (!lineIsHidden(doc, line)) { return lineN }
+    while (merged = collapsedSpanAtEnd(line))
+      { line = merged.find(1, true).line; }
+    return lineNo(line) + 1
+  }
+
+  // Compute whether a line is hidden. Lines count as hidden when they
+  // are part of a visual line that starts with another line, or when
+  // they are entirely covered by collapsed, non-widget span.
+  function lineIsHidden(doc, line) {
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (!sp.marker.collapsed) { continue }
+      if (sp.from == null) { return true }
+      if (sp.marker.widgetNode) { continue }
+      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+        { return true }
+    } }
+  }
+  function lineIsHiddenInner(doc, line, span) {
+    if (span.to == null) {
+      var end = span.marker.find(1, true);
+      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))
+    }
+    if (span.marker.inclusiveRight && span.to == line.text.length)
+      { return true }
+    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {
+      sp = line.markedSpans[i];
+      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+          (sp.to == null || sp.to != span.from) &&
+          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+          lineIsHiddenInner(doc, line, sp)) { return true }
+    }
+  }
+
+  // Find the height above the given line.
+  function heightAtLine(lineObj) {
+    lineObj = visualLine(lineObj);
+
+    var h = 0, chunk = lineObj.parent;
+    for (var i = 0; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i];
+      if (line == lineObj) { break }
+      else { h += line.height; }
+    }
+    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {
+        var cur = p.children[i$1];
+        if (cur == chunk) { break }
+        else { h += cur.height; }
+      }
+    }
+    return h
+  }
+
+  // Compute the character length of a line, taking into account
+  // collapsed ranges (see markText) that might hide parts, and join
+  // other lines onto it.
+  function lineLength(line) {
+    if (line.height == 0) { return 0 }
+    var len = line.text.length, merged, cur = line;
+    while (merged = collapsedSpanAtStart(cur)) {
+      var found = merged.find(0, true);
+      cur = found.from.line;
+      len += found.from.ch - found.to.ch;
+    }
+    cur = line;
+    while (merged = collapsedSpanAtEnd(cur)) {
+      var found$1 = merged.find(0, true);
+      len -= cur.text.length - found$1.from.ch;
+      cur = found$1.to.line;
+      len += cur.text.length - found$1.to.ch;
+    }
+    return len
+  }
+
+  // Find the longest line in the document.
+  function findMaxLine(cm) {
+    var d = cm.display, doc = cm.doc;
+    d.maxLine = getLine(doc, doc.first);
+    d.maxLineLength = lineLength(d.maxLine);
+    d.maxLineChanged = true;
+    doc.iter(function (line) {
+      var len = lineLength(line);
+      if (len > d.maxLineLength) {
+        d.maxLineLength = len;
+        d.maxLine = line;
+      }
+    });
+  }
+
+  // LINE DATA STRUCTURE
+
+  // Line objects. These hold state related to a line, including
+  // highlighting info (the styles array).
+  var Line = function(text, markedSpans, estimateHeight) {
+    this.text = text;
+    attachMarkedSpans(this, markedSpans);
+    this.height = estimateHeight ? estimateHeight(this) : 1;
+  };
+
+  Line.prototype.lineNo = function () { return lineNo(this) };
+  eventMixin(Line);
+
+  // Change the content (text, markers) of a line. Automatically
+  // invalidates cached information and tries to re-estimate the
+  // line's height.
+  function updateLine(line, text, markedSpans, estimateHeight) {
+    line.text = text;
+    if (line.stateAfter) { line.stateAfter = null; }
+    if (line.styles) { line.styles = null; }
+    if (line.order != null) { line.order = null; }
+    detachMarkedSpans(line);
+    attachMarkedSpans(line, markedSpans);
+    var estHeight = estimateHeight ? estimateHeight(line) : 1;
+    if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+  }
+
+  // Detach a line from the document tree and its markers.
+  function cleanUpLine(line) {
+    line.parent = null;
+    detachMarkedSpans(line);
+  }
+
+  // Convert a style as returned by a mode (either null, or a string
+  // containing one or more styles) to a CSS style. This is cached,
+  // and also looks for line-wide styles.
+  var styleToClassCache = {}, styleToClassCacheWithMode = {};
+  function interpretTokenStyle(style, options) {
+    if (!style || /^\s*$/.test(style)) { return null }
+    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+    return cache[style] ||
+      (cache[style] = style.replace(/\S+/g, "cm-$&"))
+  }
+
+  // Render the DOM representation of the text of a line. Also builds
+  // up a 'line map', which points at the DOM nodes that represent
+  // specific stretches of text, and is used by the measuring code.
+  // The returned object contains the DOM node, this map, and
+  // information about line-wide styles that were set by the mode.
+  function buildLineContent(cm, lineView) {
+    // The padding-right forces the element to have a 'border', which
+    // is needed on Webkit to be able to get line-level bounding
+    // rectangles for it (in measureChar).
+    var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null);
+    var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content,
+                   col: 0, pos: 0, cm: cm,
+                   trailingSpace: false,
+                   splitSpaces: cm.getOption("lineWrapping")};
+    lineView.measure = {};
+
+    // Iterate over the logical lines that make up this visual line.
+    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);
+      builder.pos = 0;
+      builder.addToken = buildToken;
+      // Optionally wire in some hacks into the token-rendering
+      // algorithm, to deal with browser quirks.
+      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))
+        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }
+      builder.map = [];
+      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
+      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
+      if (line.styleClasses) {
+        if (line.styleClasses.bgClass)
+          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); }
+        if (line.styleClasses.textClass)
+          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); }
+      }
+
+      // Ensure at least a single node is present, for measuring.
+      if (builder.map.length == 0)
+        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }
+
+      // Store the map and a cache object for the current logical line
+      if (i == 0) {
+        lineView.measure.map = builder.map;
+        lineView.measure.cache = {};
+      } else {
+  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)
+        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});
+      }
+    }
+
+    // See issue #2901
+    if (webkit) {
+      var last = builder.content.lastChild;
+      if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
+        { builder.content.className = "cm-tab-wrap-hack"; }
+    }
+
+    signal(cm, "renderLine", cm, lineView.line, builder.pre);
+    if (builder.pre.className)
+      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); }
+
+    return builder
+  }
+
+  function defaultSpecialCharPlaceholder(ch) {
+    var token = elt("span", "\u2022", "cm-invalidchar");
+    token.title = "\\u" + ch.charCodeAt(0).toString(16);
+    token.setAttribute("aria-label", token.title);
+    return token
+  }
+
+  // Build up the DOM representation for a single token, and add it to
+  // the line map. Takes care to render special characters separately.
+  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {
+    if (!text) { return }
+    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;
+    var special = builder.cm.state.specialChars, mustWrap = false;
+    var content;
+    if (!special.test(text)) {
+      builder.col += text.length;
+      content = document.createTextNode(displayText);
+      builder.map.push(builder.pos, builder.pos + text.length, content);
+      if (ie && ie_version < 9) { mustWrap = true; }
+      builder.pos += text.length;
+    } else {
+      content = document.createDocumentFragment();
+      var pos = 0;
+      while (true) {
+        special.lastIndex = pos;
+        var m = special.exec(text);
+        var skipped = m ? m.index - pos : text.length - pos;
+        if (skipped) {
+          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
+          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); }
+          else { content.appendChild(txt); }
+          builder.map.push(builder.pos, builder.pos + skipped, txt);
+          builder.col += skipped;
+          builder.pos += skipped;
+        }
+        if (!m) { break }
+        pos += skipped + 1;
+        var txt$1 = (void 0);
+        if (m[0] == "\t") {
+          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+          txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+          txt$1.setAttribute("role", "presentation");
+          txt$1.setAttribute("cm-text", "\t");
+          builder.col += tabWidth;
+        } else if (m[0] == "\r" || m[0] == "\n") {
+          txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
+          txt$1.setAttribute("cm-text", m[0]);
+          builder.col += 1;
+        } else {
+          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);
+          txt$1.setAttribute("cm-text", m[0]);
+          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); }
+          else { content.appendChild(txt$1); }
+          builder.col += 1;
+        }
+        builder.map.push(builder.pos, builder.pos + 1, txt$1);
+        builder.pos++;
+      }
+    }
+    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
+    if (style || startStyle || endStyle || mustWrap || css || attributes) {
+      var fullStyle = style || "";
+      if (startStyle) { fullStyle += startStyle; }
+      if (endStyle) { fullStyle += endStyle; }
+      var token = elt("span", [content], fullStyle, css);
+      if (attributes) {
+        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class")
+          { token.setAttribute(attr, attributes[attr]); } }
+      }
+      return builder.content.appendChild(token)
+    }
+    builder.content.appendChild(content);
+  }
+
+  // Change some spaces to NBSP to prevent the browser from collapsing
+  // trailing spaces at the end of a line when rendering text (issue #1362).
+  function splitSpaces(text, trailingBefore) {
+    if (text.length > 1 && !/  /.test(text)) { return text }
+    var spaceBefore = trailingBefore, result = "";
+    for (var i = 0; i < text.length; i++) {
+      var ch = text.charAt(i);
+      if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
+        { ch = "\u00a0"; }
+      result += ch;
+      spaceBefore = ch == " ";
+    }
+    return result
+  }
+
+  // Work around nonsense dimensions being reported for stretches of
+  // right-to-left text.
+  function buildTokenBadBidi(inner, order) {
+    return function (builder, text, style, startStyle, endStyle, css, attributes) {
+      style = style ? style + " cm-force-border" : "cm-force-border";
+      var start = builder.pos, end = start + text.length;
+      for (;;) {
+        // Find the part that overlaps with the start of this text
+        var part = (void 0);
+        for (var i = 0; i < order.length; i++) {
+          part = order[i];
+          if (part.to > start && part.from <= start) { break }
+        }
+        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }
+        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);
+        startStyle = null;
+        text = text.slice(part.to - start);
+        start = part.to;
+      }
+    }
+  }
+
+  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+    var widget = !ignoreWidget && marker.widgetNode;
+    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }
+    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
+      if (!widget)
+        { widget = builder.content.appendChild(document.createElement("span")); }
+      widget.setAttribute("cm-marker", marker.id);
+    }
+    if (widget) {
+      builder.cm.display.input.setUneditable(widget);
+      builder.content.appendChild(widget);
+    }
+    builder.pos += size;
+    builder.trailingSpace = false;
+  }
+
+  // Outputs a number of spans to make up a line, taking highlighting
+  // and marked text into account.
+  function insertLineContent(line, builder, styles) {
+    var spans = line.markedSpans, allText = line.text, at = 0;
+    if (!spans) {
+      for (var i$1 = 1; i$1 < styles.length; i$1+=2)
+        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }
+      return
+    }
+
+    var len = allText.length, pos = 0, i = 1, text = "", style, css;
+    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;
+    for (;;) {
+      if (nextChange == pos) { // Update current marker set
+        spanStyle = spanEndStyle = spanStartStyle = css = "";
+        attributes = null;
+        collapsed = null; nextChange = Infinity;
+        var foundBookmarks = [], endStyles = (void 0);
+        for (var j = 0; j < spans.length; ++j) {
+          var sp = spans[j], m = sp.marker;
+          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
+            foundBookmarks.push(m);
+          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
+            if (sp.to != null && sp.to != pos && nextChange > sp.to) {
+              nextChange = sp.to;
+              spanEndStyle = "";
+            }
+            if (m.className) { spanStyle += " " + m.className; }
+            if (m.css) { css = (css ? css + ";" : "") + m.css; }
+            if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; }
+            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }
+            // support for the old title property
+            // https://github.com/codemirror/CodeMirror/pull/5673
+            if (m.title) { (attributes || (attributes = {})).title = m.title; }
+            if (m.attributes) {
+              for (var attr in m.attributes)
+                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }
+            }
+            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+              { collapsed = sp; }
+          } else if (sp.from > pos && nextChange > sp.from) {
+            nextChange = sp.from;
+          }
+        }
+        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)
+          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } }
+
+        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)
+          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }
+        if (collapsed && (collapsed.from || 0) == pos) {
+          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+                             collapsed.marker, collapsed.from == null);
+          if (collapsed.to == null) { return }
+          if (collapsed.to == pos) { collapsed = false; }
+        }
+      }
+      if (pos >= len) { break }
+
+      var upto = Math.min(len, nextChange);
+      while (true) {
+        if (text) {
+          var end = pos + text.length;
+          if (!collapsed) {
+            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes);
+          }
+          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}
+          pos = end;
+          spanStartStyle = "";
+        }
+        text = allText.slice(at, at = styles[i++]);
+        style = interpretTokenStyle(styles[i++], builder.cm.options);
+      }
+    }
+  }
+
+
+  // These objects are used to represent the visible (currently drawn)
+  // part of the document. A LineView may correspond to multiple
+  // logical lines, if those are connected by collapsed ranges.
+  function LineView(doc, line, lineN) {
+    // The starting line
+    this.line = line;
+    // Continuing lines, if any
+    this.rest = visualLineContinued(line);
+    // Number of logical lines in this visual line
+    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+    this.node = this.text = null;
+    this.hidden = lineIsHidden(doc, line);
+  }
+
+  // Create a range of LineView objects for the given lines.
+  function buildViewArray(cm, from, to) {
+    var array = [], nextPos;
+    for (var pos = from; pos < to; pos = nextPos) {
+      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+      nextPos = pos + view.size;
+      array.push(view);
+    }
+    return array
+  }
+
+  var operationGroup = null;
+
+  function pushOperation(op) {
+    if (operationGroup) {
+      operationGroup.ops.push(op);
+    } else {
+      op.ownsGroup = operationGroup = {
+        ops: [op],
+        delayedCallbacks: []
+      };
+    }
+  }
+
+  function fireCallbacksForOps(group) {
+    // Calls delayed callbacks and cursorActivity handlers until no
+    // new ones appear
+    var callbacks = group.delayedCallbacks, i = 0;
+    do {
+      for (; i < callbacks.length; i++)
+        { callbacks[i].call(null); }
+      for (var j = 0; j < group.ops.length; j++) {
+        var op = group.ops[j];
+        if (op.cursorActivityHandlers)
+          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }
+      }
+    } while (i < callbacks.length)
+  }
+
+  function finishOperation(op, endCb) {
+    var group = op.ownsGroup;
+    if (!group) { return }
+
+    try { fireCallbacksForOps(group); }
+    finally {
+      operationGroup = null;
+      endCb(group);
+    }
+  }
+
+  var orphanDelayedCallbacks = null;
+
+  // Often, we want to signal events at a point where we are in the
+  // middle of some work, but don't want the handler to start calling
+  // other methods on the editor, which might be in an inconsistent
+  // state or simply not expect any other events to happen.
+  // signalLater looks whether there are any handlers, and schedules
+  // them to be executed when the last operation ends, or, if no
+  // operation is active, when a timeout fires.
+  function signalLater(emitter, type /*, values...*/) {
+    var arr = getHandlers(emitter, type);
+    if (!arr.length) { return }
+    var args = Array.prototype.slice.call(arguments, 2), list;
+    if (operationGroup) {
+      list = operationGroup.delayedCallbacks;
+    } else if (orphanDelayedCallbacks) {
+      list = orphanDelayedCallbacks;
+    } else {
+      list = orphanDelayedCallbacks = [];
+      setTimeout(fireOrphanDelayed, 0);
+    }
+    var loop = function ( i ) {
+      list.push(function () { return arr[i].apply(null, args); });
+    };
+
+    for (var i = 0; i < arr.length; ++i)
+      loop( i );
+  }
+
+  function fireOrphanDelayed() {
+    var delayed = orphanDelayedCallbacks;
+    orphanDelayedCallbacks = null;
+    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }
+  }
+
+  // When an aspect of a line changes, a string is added to
+  // lineView.changes. This updates the relevant part of the line's
+  // DOM structure.
+  function updateLineForChanges(cm, lineView, lineN, dims) {
+    for (var j = 0; j < lineView.changes.length; j++) {
+      var type = lineView.changes[j];
+      if (type == "text") { updateLineText(cm, lineView); }
+      else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); }
+      else if (type == "class") { updateLineClasses(cm, lineView); }
+      else if (type == "widget") { updateLineWidgets(cm, lineView, dims); }
+    }
+    lineView.changes = null;
+  }
+
+  // Lines with gutter elements, widgets or a background class need to
+  // be wrapped, and have the extra elements added to the wrapper div
+  function ensureLineWrapped(lineView) {
+    if (lineView.node == lineView.text) {
+      lineView.node = elt("div", null, null, "position: relative");
+      if (lineView.text.parentNode)
+        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }
+      lineView.node.appendChild(lineView.text);
+      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }
+    }
+    return lineView.node
+  }
+
+  function updateLineBackground(cm, lineView) {
+    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+    if (cls) { cls += " CodeMirror-linebackground"; }
+    if (lineView.background) {
+      if (cls) { lineView.background.className = cls; }
+      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+    } else if (cls) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+      cm.display.input.setUneditable(lineView.background);
+    }
+  }
+
+  // Wrapper around buildLineContent which will reuse the structure
+  // in display.externalMeasured when possible.
+  function getLineContent(cm, lineView) {
+    var ext = cm.display.externalMeasured;
+    if (ext && ext.line == lineView.line) {
+      cm.display.externalMeasured = null;
+      lineView.measure = ext.measure;
+      return ext.built
+    }
+    return buildLineContent(cm, lineView)
+  }
+
+  // Redraw the line's text. Interacts with the background and text
+  // classes because the mode may output tokens that influence these
+  // classes.
+  function updateLineText(cm, lineView) {
+    var cls = lineView.text.className;
+    var built = getLineContent(cm, lineView);
+    if (lineView.text == lineView.node) { lineView.node = built.pre; }
+    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+    lineView.text = built.pre;
+    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+      lineView.bgClass = built.bgClass;
+      lineView.textClass = built.textClass;
+      updateLineClasses(cm, lineView);
+    } else if (cls) {
+      lineView.text.className = cls;
+    }
+  }
+
+  function updateLineClasses(cm, lineView) {
+    updateLineBackground(cm, lineView);
+    if (lineView.line.wrapClass)
+      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }
+    else if (lineView.node != lineView.text)
+      { lineView.node.className = ""; }
+    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+    lineView.text.className = textClass || "";
+  }
+
+  function updateLineGutter(cm, lineView, lineN, dims) {
+    if (lineView.gutter) {
+      lineView.node.removeChild(lineView.gutter);
+      lineView.gutter = null;
+    }
+    if (lineView.gutterBackground) {
+      lineView.node.removeChild(lineView.gutterBackground);
+      lineView.gutterBackground = null;
+    }
+    if (lineView.line.gutterClass) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
+                                      ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px"));
+      cm.display.input.setUneditable(lineView.gutterBackground);
+      wrap.insertBefore(lineView.gutterBackground, lineView.text);
+    }
+    var markers = lineView.line.gutterMarkers;
+    if (cm.options.lineNumbers || markers) {
+      var wrap$1 = ensureLineWrapped(lineView);
+      var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
+      cm.display.input.setUneditable(gutterWrap);
+      wrap$1.insertBefore(gutterWrap, lineView.text);
+      if (lineView.line.gutterClass)
+        { gutterWrap.className += " " + lineView.line.gutterClass; }
+      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+        { lineView.lineNumber = gutterWrap.appendChild(
+          elt("div", lineNumberFor(cm.options, lineN),
+              "CodeMirror-linenumber CodeMirror-gutter-elt",
+              ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); }
+      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {
+        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];
+        if (found)
+          { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt",
+                                     ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); }
+      } }
+    }
+  }
+
+  function updateLineWidgets(cm, lineView, dims) {
+    if (lineView.alignable) { lineView.alignable = null; }
+    var isWidget = classTest("CodeMirror-linewidget");
+    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {
+      next = node.nextSibling;
+      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }
+    }
+    insertLineWidgets(cm, lineView, dims);
+  }
+
+  // Build a line's DOM representation from scratch
+  function buildLineElement(cm, lineView, lineN, dims) {
+    var built = getLineContent(cm, lineView);
+    lineView.text = lineView.node = built.pre;
+    if (built.bgClass) { lineView.bgClass = built.bgClass; }
+    if (built.textClass) { lineView.textClass = built.textClass; }
+
+    updateLineClasses(cm, lineView);
+    updateLineGutter(cm, lineView, lineN, dims);
+    insertLineWidgets(cm, lineView, dims);
+    return lineView.node
+  }
+
+  // A lineView may contain multiple logical lines (when merged by
+  // collapsed spans). The widgets for all of them need to be drawn.
+  function insertLineWidgets(cm, lineView, dims) {
+    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
+    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }
+  }
+
+  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
+    if (!line.widgets) { return }
+    var wrap = ensureLineWrapped(lineView);
+    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : ""));
+      if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); }
+      positionLineWidget(widget, node, lineView, dims);
+      cm.display.input.setUneditable(node);
+      if (allowAbove && widget.above)
+        { wrap.insertBefore(node, lineView.gutter || lineView.text); }
+      else
+        { wrap.appendChild(node); }
+      signalLater(widget, "redraw");
+    }
+  }
+
+  function positionLineWidget(widget, node, lineView, dims) {
+    if (widget.noHScroll) {
+  (lineView.alignable || (lineView.alignable = [])).push(node);
+      var width = dims.wrapperWidth;
+      node.style.left = dims.fixedPos + "px";
+      if (!widget.coverGutter) {
+        width -= dims.gutterTotalWidth;
+        node.style.paddingLeft = dims.gutterTotalWidth + "px";
+      }
+      node.style.width = width + "px";
+    }
+    if (widget.coverGutter) {
+      node.style.zIndex = 5;
+      node.style.position = "relative";
+      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; }
+    }
+  }
+
+  function widgetHeight(widget) {
+    if (widget.height != null) { return widget.height }
+    var cm = widget.doc.cm;
+    if (!cm) { return 0 }
+    if (!contains(document.body, widget.node)) {
+      var parentStyle = "position: relative;";
+      if (widget.coverGutter)
+        { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; }
+      if (widget.noHScroll)
+        { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; }
+      removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
+    }
+    return widget.height = widget.node.parentNode.offsetHeight
+  }
+
+  // Return true when the given mouse event happened in a widget
+  function eventInWidget(display, e) {
+    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+      if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
+          (n.parentNode == display.sizer && n != display.mover))
+        { return true }
+    }
+  }
+
+  // POSITION MEASUREMENT
+
+  function paddingTop(display) {return display.lineSpace.offsetTop}
+  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
+  function paddingH(display) {
+    if (display.cachedPaddingH) { return display.cachedPaddingH }
+    var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like"));
+    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }
+    return data
+  }
+
+  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
+  function displayWidth(cm) {
+    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
+  }
+  function displayHeight(cm) {
+    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
+  }
+
+  // Ensure the lineView.wrapping.heights array is populated. This is
+  // an array of bottom offsets for the lines that make up a drawn
+  // line. When lineWrapping is on, there might be more than one
+  // height.
+  function ensureLineHeights(cm, lineView, rect) {
+    var wrapping = cm.options.lineWrapping;
+    var curWidth = wrapping && displayWidth(cm);
+    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+      var heights = lineView.measure.heights = [];
+      if (wrapping) {
+        lineView.measure.width = curWidth;
+        var rects = lineView.text.firstChild.getClientRects();
+        for (var i = 0; i < rects.length - 1; i++) {
+          var cur = rects[i], next = rects[i + 1];
+          if (Math.abs(cur.bottom - next.bottom) > 2)
+            { heights.push((cur.bottom + next.top) / 2 - rect.top); }
+        }
+      }
+      heights.push(rect.bottom - rect.top);
+    }
+  }
+
+  // Find a line map (mapping character offsets to text nodes) and a
+  // measurement cache for the given line number. (A line view might
+  // contain multiple lines when collapsed ranges are present.)
+  function mapFromLineView(lineView, line, lineN) {
+    if (lineView.line == line)
+      { return {map: lineView.measure.map, cache: lineView.measure.cache} }
+    for (var i = 0; i < lineView.rest.length; i++)
+      { if (lineView.rest[i] == line)
+        { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
+    for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
+      { if (lineNo(lineView.rest[i$1]) > lineN)
+        { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
+  }
+
+  // Render a line into the hidden node display.externalMeasured. Used
+  // when measurement is needed for a line that's not in the viewport.
+  function updateExternalMeasurement(cm, line) {
+    line = visualLine(line);
+    var lineN = lineNo(line);
+    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+    view.lineN = lineN;
+    var built = view.built = buildLineContent(cm, view);
+    view.text = built.pre;
+    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+    return view
+  }
+
+  // Get a {top, bottom, left, right} box (in line-local coordinates)
+  // for a given character.
+  function measureChar(cm, line, ch, bias) {
+    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
+  }
+
+  // Find a line view that corresponds to the given line number.
+  function findViewForLine(cm, lineN) {
+    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+      { return cm.display.view[findViewIndex(cm, lineN)] }
+    var ext = cm.display.externalMeasured;
+    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+      { return ext }
+  }
+
+  // Measurement can be split in two steps, the set-up work that
+  // applies to the whole line, and the measurement of the actual
+  // character. Functions like coordsChar, that need to do a lot of
+  // measurements in a row, can thus ensure that the set-up work is
+  // only done once.
+  function prepareMeasureForLine(cm, line) {
+    var lineN = lineNo(line);
+    var view = findViewForLine(cm, lineN);
+    if (view && !view.text) {
+      view = null;
+    } else if (view && view.changes) {
+      updateLineForChanges(cm, view, lineN, getDimensions(cm));
+      cm.curOp.forceUpdate = true;
+    }
+    if (!view)
+      { view = updateExternalMeasurement(cm, line); }
+
+    var info = mapFromLineView(view, line, lineN);
+    return {
+      line: line, view: view, rect: null,
+      map: info.map, cache: info.cache, before: info.before,
+      hasHeights: false
+    }
+  }
+
+  // Given a prepared measurement object, measures the position of an
+  // actual character (or fetches it from the cache).
+  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+    if (prepared.before) { ch = -1; }
+    var key = ch + (bias || ""), found;
+    if (prepared.cache.hasOwnProperty(key)) {
+      found = prepared.cache[key];
+    } else {
+      if (!prepared.rect)
+        { prepared.rect = prepared.view.text.getBoundingClientRect(); }
+      if (!prepared.hasHeights) {
+        ensureLineHeights(cm, prepared.view, prepared.rect);
+        prepared.hasHeights = true;
+      }
+      found = measureCharInner(cm, prepared, ch, bias);
+      if (!found.bogus) { prepared.cache[key] = found; }
+    }
+    return {left: found.left, right: found.right,
+            top: varHeight ? found.rtop : found.top,
+            bottom: varHeight ? found.rbottom : found.bottom}
+  }
+
+  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+  function nodeAndOffsetInLineMap(map, ch, bias) {
+    var node, start, end, collapse, mStart, mEnd;
+    // First, search the line map for the text node corresponding to,
+    // or closest to, the target character.
+    for (var i = 0; i < map.length; i += 3) {
+      mStart = map[i];
+      mEnd = map[i + 1];
+      if (ch < mStart) {
+        start = 0; end = 1;
+        collapse = "left";
+      } else if (ch < mEnd) {
+        start = ch - mStart;
+        end = start + 1;
+      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
+        end = mEnd - mStart;
+        start = end - 1;
+        if (ch >= mEnd) { collapse = "right"; }
+      }
+      if (start != null) {
+        node = map[i + 2];
+        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+          { collapse = bias; }
+        if (bias == "left" && start == 0)
+          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
+            node = map[(i -= 3) + 2];
+            collapse = "left";
+          } }
+        if (bias == "right" && start == mEnd - mStart)
+          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
+            node = map[(i += 3) + 2];
+            collapse = "right";
+          } }
+        break
+      }
+    }
+    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
+  }
+
+  function getUsefulRect(rects, bias) {
+    var rect = nullRect;
+    if (bias == "left") { for (var i = 0; i < rects.length; i++) {
+      if ((rect = rects[i]).left != rect.right) { break }
+    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {
+      if ((rect = rects[i$1]).left != rect.right) { break }
+    } }
+    return rect
+  }
+
+  function measureCharInner(cm, prepared, ch, bias) {
+    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
+    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
+
+    var rect;
+    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }
+        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }
+        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
+          { rect = node.parentNode.getBoundingClientRect(); }
+        else
+          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }
+        if (rect.left || rect.right || start == 0) { break }
+        end = start;
+        start = start - 1;
+        collapse = "right";
+      }
+      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }
+    } else { // If it is a widget, simply get the box for the whole widget.
+      if (start > 0) { collapse = bias = "right"; }
+      var rects;
+      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+        { rect = rects[bias == "right" ? rects.length - 1 : 0]; }
+      else
+        { rect = node.getBoundingClientRect(); }
+    }
+    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+      var rSpan = node.parentNode.getClientRects()[0];
+      if (rSpan)
+        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }
+      else
+        { rect = nullRect; }
+    }
+
+    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+    var mid = (rtop + rbot) / 2;
+    var heights = prepared.view.measure.heights;
+    var i = 0;
+    for (; i < heights.length - 1; i++)
+      { if (mid < heights[i]) { break } }
+    var top = i ? heights[i - 1] : 0, bot = heights[i];
+    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+                  top: top, bottom: bot};
+    if (!rect.left && !rect.right) { result.bogus = true; }
+    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+    return result
+  }
+
+  // Work around problem with bounding client rects on ranges being
+  // returned incorrectly when zoomed on IE10 and below.
+  function maybeUpdateRectForZooming(measure, rect) {
+    if (!window.screen || screen.logicalXDPI == null ||
+        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+      { return rect }
+    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+    return {left: rect.left * scaleX, right: rect.right * scaleX,
+            top: rect.top * scaleY, bottom: rect.bottom * scaleY}
+  }
+
+  function clearLineMeasurementCacheFor(lineView) {
+    if (lineView.measure) {
+      lineView.measure.cache = {};
+      lineView.measure.heights = null;
+      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+        { lineView.measure.caches[i] = {}; } }
+    }
+  }
+
+  function clearLineMeasurementCache(cm) {
+    cm.display.externalMeasure = null;
+    removeChildren(cm.display.lineMeasure);
+    for (var i = 0; i < cm.display.view.length; i++)
+      { clearLineMeasurementCacheFor(cm.display.view[i]); }
+  }
+
+  function clearCaches(cm) {
+    clearLineMeasurementCache(cm);
+    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }
+    cm.display.lineNumChars = null;
+  }
+
+  function pageScrollX() {
+    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
+    // which causes page_Offset and bounding client rects to use
+    // different reference viewports and invalidate our calculations.
+    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }
+    return window.pageXOffset || (document.documentElement || document.body).scrollLeft
+  }
+  function pageScrollY() {
+    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }
+    return window.pageYOffset || (document.documentElement || document.body).scrollTop
+  }
+
+  function widgetTopHeight(lineObj) {
+    var height = 0;
+    if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)
+      { height += widgetHeight(lineObj.widgets[i]); } } }
+    return height
+  }
+
+  // Converts a {top, bottom, left, right} box from line-local
+  // coordinates into another coordinate system. Context may be one of
+  // "line", "div" (display.lineDiv), "local"./null (editor), "window",
+  // or "page".
+  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
+    if (!includeWidgets) {
+      var height = widgetTopHeight(lineObj);
+      rect.top += height; rect.bottom += height;
+    }
+    if (context == "line") { return rect }
+    if (!context) { context = "local"; }
+    var yOff = heightAtLine(lineObj);
+    if (context == "local") { yOff += paddingTop(cm.display); }
+    else { yOff -= cm.display.viewOffset; }
+    if (context == "page" || context == "window") {
+      var lOff = cm.display.lineSpace.getBoundingClientRect();
+      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+      rect.left += xOff; rect.right += xOff;
+    }
+    rect.top += yOff; rect.bottom += yOff;
+    return rect
+  }
+
+  // Coverts a box from "div" coords to another coordinate system.
+  // Context may be "window", "page", "div", or "local"./null.
+  function fromCoordSystem(cm, coords, context) {
+    if (context == "div") { return coords }
+    var left = coords.left, top = coords.top;
+    // First move into "page" coordinate system
+    if (context == "page") {
+      left -= pageScrollX();
+      top -= pageScrollY();
+    } else if (context == "local" || !context) {
+      var localBox = cm.display.sizer.getBoundingClientRect();
+      left += localBox.left;
+      top += localBox.top;
+    }
+
+    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
+  }
+
+  function charCoords(cm, pos, context, lineObj, bias) {
+    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }
+    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
+  }
+
+  // Returns a box for a given cursor position, which may have an
+  // 'other' property containing the position of the secondary cursor
+  // on a bidi boundary.
+  // A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
+  // and after `char - 1` in writing order of `char - 1`
+  // A cursor Pos(line, char, "after") is on the same visual line as `char`
+  // and before `char` in writing order of `char`
+  // Examples (upper-case letters are RTL, lower-case are LTR):
+  //     Pos(0, 1, ...)
+  //     before   after
+  // ab     a|b     a|b
+  // aB     a|B     aB|
+  // Ab     |Ab     A|b
+  // AB     B|A     B|A
+  // Every position after the last character on a line is considered to stick
+  // to the last character on the line.
+  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+    lineObj = lineObj || getLine(cm.doc, pos.line);
+    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+    function get(ch, right) {
+      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+      if (right) { m.left = m.right; } else { m.right = m.left; }
+      return intoCoordSystem(cm, lineObj, m, context)
+    }
+    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;
+    if (ch >= lineObj.text.length) {
+      ch = lineObj.text.length;
+      sticky = "before";
+    } else if (ch <= 0) {
+      ch = 0;
+      sticky = "after";
+    }
+    if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") }
+
+    function getBidi(ch, partPos, invert) {
+      var part = order[partPos], right = part.level == 1;
+      return get(invert ? ch - 1 : ch, right != invert)
+    }
+    var partPos = getBidiPartAt(order, ch, sticky);
+    var other = bidiOther;
+    var val = getBidi(ch, partPos, sticky == "before");
+    if (other != null) { val.other = getBidi(ch, other, sticky != "before"); }
+    return val
+  }
+
+  // Used to cheaply estimate the coordinates for a position. Used for
+  // intermediate scroll updates.
+  function estimateCoords(cm, pos) {
+    var left = 0;
+    pos = clipPos(cm.doc, pos);
+    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }
+    var lineObj = getLine(cm.doc, pos.line);
+    var top = heightAtLine(lineObj) + paddingTop(cm.display);
+    return {left: left, right: left, top: top, bottom: top + lineObj.height}
+  }
+
+  // Positions returned by coordsChar contain some extra information.
+  // xRel is the relative x position of the input coordinates compared
+  // to the found position (so xRel > 0 means the coordinates are to
+  // the right of the character position, for example). When outside
+  // is true, that means the coordinates lie outside the line's
+  // vertical range.
+  function PosWithInfo(line, ch, sticky, outside, xRel) {
+    var pos = Pos(line, ch, sticky);
+    pos.xRel = xRel;
+    if (outside) { pos.outside = outside; }
+    return pos
+  }
+
+  // Compute the character position closest to the given coordinates.
+  // Input must be lineSpace-local ("div" coordinate system).
+  function coordsChar(cm, x, y) {
+    var doc = cm.doc;
+    y += cm.display.viewOffset;
+    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }
+    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+    if (lineN > last)
+      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }
+    if (x < 0) { x = 0; }
+
+    var lineObj = getLine(doc, lineN);
+    for (;;) {
+      var found = coordsCharInner(cm, lineObj, lineN, x, y);
+      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));
+      if (!collapsed) { return found }
+      var rangeEnd = collapsed.find(1);
+      if (rangeEnd.line == lineN) { return rangeEnd }
+      lineObj = getLine(doc, lineN = rangeEnd.line);
+    }
+  }
+
+  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
+    y -= widgetTopHeight(lineObj);
+    var end = lineObj.text.length;
+    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);
+    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);
+    return {begin: begin, end: end}
+  }
+
+  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
+    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top;
+    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
+  }
+
+  // Returns true if the given side of a box is after the given
+  // coordinates, in top-to-bottom, left-to-right order.
+  function boxIsAfter(box, x, y, left) {
+    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x
+  }
+
+  function coordsCharInner(cm, lineObj, lineNo, x, y) {
+    // Move y into line-local coordinate space
+    y -= heightAtLine(lineObj);
+    var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+    // When directly calling `measureCharPrepared`, we have to adjust
+    // for the widgets at this line.
+    var widgetHeight = widgetTopHeight(lineObj);
+    var begin = 0, end = lineObj.text.length, ltr = true;
+
+    var order = getOrder(lineObj, cm.doc.direction);
+    // If the line isn't plain left-to-right text, first figure out
+    // which bidi section the coordinates fall into.
+    if (order) {
+      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)
+                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);
+      ltr = part.level != 1;
+      // The awkward -1 offsets are needed because findFirst (called
+      // on these below) will treat its first bound as inclusive,
+      // second as exclusive, but we want to actually address the
+      // characters in the part's range
+      begin = ltr ? part.from : part.to - 1;
+      end = ltr ? part.to : part.from - 1;
+    }
+
+    // A binary search to find the first character whose bounding box
+    // starts after the coordinates. If we run across any whose box wrap
+    // the coordinates, store that.
+    var chAround = null, boxAround = null;
+    var ch = findFirst(function (ch) {
+      var box = measureCharPrepared(cm, preparedMeasure, ch);
+      box.top += widgetHeight; box.bottom += widgetHeight;
+      if (!boxIsAfter(box, x, y, false)) { return false }
+      if (box.top <= y && box.left <= x) {
+        chAround = ch;
+        boxAround = box;
+      }
+      return true
+    }, begin, end);
+
+    var baseX, sticky, outside = false;
+    // If