[Notice] Announcing the End of Demo Server [Read me]
Jihan Kim 2014-05-14
Remove mergely.js
@b753ad4e8c628e0cea7d287ac316b6569c3f5d6a
app/views/code/compare_svn.scala.html
--- app/views/code/compare_svn.scala.html
+++ app/views/code/compare_svn.scala.html
@@ -38,7 +38,6 @@
         }
     </div>
 </div>
-@common.mergely()
 <script type="text/javascript">
     $(document).ready(function(){
         $yobi.loadModule("code.SvnDiff", {
app/views/code/diff.scala.html
--- app/views/code/diff.scala.html
+++ app/views/code/diff.scala.html
@@ -198,7 +198,6 @@
     </div>
 </div>
 @common.markdown(project)
-@common.mergely()
 @common.commentDeleteModal("#code-browse-wrap")
 
 <link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.css")">
app/views/code/svnDiff.scala.html
--- app/views/code/svnDiff.scala.html
+++ app/views/code/svnDiff.scala.html
@@ -93,19 +93,6 @@
             <div class="diff-wrap">
                 <div id="commit" data-commit-origin="true" class="diff-body hide">@patch</div>
             </div>
-            @** Mergely **@
-            <div id="compare" class="modal hide compare-wrap" tabindex="-1" role="dialog">
-                <h4 class="path">
-                    <span></span>
-                    <button type="button" class="ybtn pull-right" data-dismiss="modal" style="margin-right:20px;">@Messages("button.confirm")</button>
-                </h4>
-                <div class="row-fluid">
-                    <div class="span6 commitA"></div>
-                    <div class="span6 commitB"></div>
-                </div>
-                <div id="mergely" class="mergely-wrap"></div>
-            </div>
-            @** // **@
 
             @** Comment **@
             <div class="board-comment-wrap">
@@ -176,16 +163,12 @@
     <button class="ybtn medium btn-thread"></button>
 </script>
 
-<link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/mergely/codemirror.css")">
-<link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/mergely/mergely.css")">
 <link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.css")">
 <script type="text/javascript" src="@routes.Assets.at("javascripts/lib/atjs/jquery.caret.min.js")"></script>
 <script type="text/javascript" src="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.js")"></script>
 <script type="text/javascript" src="@routes.Assets.at("javascripts/lib/atjs/jquery.browser.js")"></script>
 <script type="text/javascript" src="@routes.Assets.at("javascripts/lib/atjs/jquery.firefox.keyfix.js")"></script>
 <script type="text/javascript" src="@routes.Assets.at("javascripts/lib/diff.js")"></script>
-<script type="text/javascript" src="@routes.Assets.at("javascripts/lib/mergely/codemirror.min.js")"></script>
-<script type="text/javascript" src="@routes.Assets.at("javascripts/lib/mergely/mergely.js")"></script>
 <script type="text/javascript">
     $(document).ready(function(){
         $yobi.loadModule("code.SvnDiff", {
 
app/views/common/mergely.scala.html (deleted)
--- app/views/common/mergely.scala.html
@@ -1,44 +0,0 @@
-@**
-* Yobi, Project Hosting SW
-*
-* Copyright 2013 NAVER Corp.
-* http://yobi.io
-*
-* @Author JiHan Kim
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-**@
-
-@import utils.TemplateHelper._
-
-<div id="compare" class="modal hide compare-wrap" tabindex="-1" role="dialog">
-    <h4 class="path">
-        <span></span>
-        <button type="button" class="ybtn pull-right" data-dismiss="modal" style="margin-right:20px;">@Messages("button.confirm")</button>
-     </h4>
-     <div class="row-fluid">
-        <div class="span6 commitA"></div>
-        <div class="span6 commitB"></div>
-     </div>
-     <div id="mergely" class="mergely-wrap"></div>
-</div>
-<link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/mergely/codemirror.css")">
-<link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/mergely/mergely.css")">
-<script type="text/javascript" src="@routes.Assets.at("javascripts/lib/mergely/codemirror.min.js")"></script>
-<script type="text/javascript" src="@routes.Assets.at("javascripts/lib/mergely/mergely.js")"></script>
-<script type="text/javascript" src="@routes.Assets.at("javascripts/common/yobi.ui.Mergely.js")"></script>
-<script type="text/javascript">
-    $(document).ready(function(){
-        yobi.ui.Mergely().setButtons("[data-toggle=mergely]");
-    });
-</script>
app/views/git/view.scala.html
--- app/views/git/view.scala.html
+++ app/views/git/view.scala.html
@@ -127,7 +127,6 @@
     </div>
 </div>
 @common.markdown(project)
-@common.mergely()
 @common.commentDeleteModal()
 
 <link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.css")">
app/views/git/viewChanges.scala.html
--- app/views/git/viewChanges.scala.html
+++ app/views/git/viewChanges.scala.html
@@ -168,7 +168,6 @@
 </div>
 
 @common.markdown(project)
-@common.mergely()
 @common.commentDeleteModal("#changes")
 
 <link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("javascripts/lib/atjs/jquery.atwho.css")">
app/views/partial_diff.scala.html
--- app/views/partial_diff.scala.html
+++ app/views/partial_diff.scala.html
@@ -29,4 +29,3 @@
   @views.html.partial_filediff(diff, threads, projectA, projectB)
 }
 
-@common.mergely()
app/views/partial_filediff.scala.html
--- app/views/partial_filediff.scala.html
+++ app/views/partial_filediff.scala.html
@@ -201,15 +201,6 @@
         <div class="diff-partial-file">
           <span class="filename">@fileHeader</span>
         </div>
-        <div class="diff-partial-utility">
-          @if(diff.commitA && diff.commitB && diff.pathA && diff.pathB){
-              <button type="button" class="ybtn ybtn-small" data-toggle="mergely"
-                data-pathA="@diff.pathA" data-pathB="@diff.pathB" data-commitA="@diff.commitA" data-commitB="@diff.commitB"
-                data-rawA="@routes.CodeApp.showRawFile(projectA.owner, projectA.name, diff.commitA, diff.pathA)"
-                data-rawB="@routes.CodeApp.showRawFile(projectB.owner, projectB.name, diff.commitB, diff.pathB)"
-              >@Messages("code.fullDiff")</button>
-          }
-        </div>
       </div>
       <div class="diff-partial-code" data-hashcode="@diff.hashCode">
         <table class="diff-container show-comments"
 
public/javascripts/lib/mergely/codemirror.css (deleted)
--- public/javascripts/lib/mergely/codemirror.css
@@ -1,245 +0,0 @@
-/* BASICS */
-
-.CodeMirror {
-  /* Set height, width, borders, and global font properties here */
-  font-family: "monospace", Consolas, Tahoma;
-  height: 300px;
-}
-.CodeMirror-scroll {
-  /* Set scrolling behaviour here */
-  overflow: auto;
-}
-
-/* PADDING */
-
-.CodeMirror-lines {
-  padding: 4px 0; /* Vertical padding around content */
-}
-.CodeMirror pre {
-  padding: 0 4px; /* Horizontal padding of content */
-}
-
-.CodeMirror-scrollbar-filler {
-  background-color: white; /* The little square between H and V scrollbars */
-}
-
-/* GUTTER */
-
-.CodeMirror-gutters {
-  border-right: 1px solid #ddd;
-  background-color: #f7f7f7;
-}
-.CodeMirror-linenumbers {}
-.CodeMirror-linenumber {
-  padding: 0 3px 0 5px;
-  min-width: 20px;
-  text-align: right;
-  color: #999;
-}
-
-/* CURSOR */
-
-.CodeMirror div.CodeMirror-cursor {
-  border-left: 1px solid black;
-}
-/* Shown when moving in bi-directional text */
-.CodeMirror div.CodeMirror-secondarycursor {
-  border-left: 1px solid silver;
-}
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
-  width: auto;
-  border: 0;
-  background: transparent;
-  background: rgba(0, 200, 0, .4);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800);
-}
-/* Kludge to turn off filter in ie9+, which also accepts rgba */
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor:not(#nonsense_id) {
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-/* Can style cursor different in overwrite (non-insert) mode */
-.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
-
-/* DEFAULT THEME */
-
-.cm-s-default .cm-keyword {color: #708;}
-.cm-s-default .cm-atom {color: #219;}
-.cm-s-default .cm-number {color: #164;}
-.cm-s-default .cm-def {color: #00f;}
-.cm-s-default .cm-variable {color: black;}
-.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
-.cm-s-default .cm-property {color: black;}
-.cm-s-default .cm-operator {color: black;}
-.cm-s-default .cm-comment {color: #a50;}
-.cm-s-default .cm-string {color: #a11;}
-.cm-s-default .cm-string-2 {color: #f50;}
-.cm-s-default .cm-meta {color: #555;}
-.cm-s-default .cm-error {color: #f00;}
-.cm-s-default .cm-qualifier {color: #555;}
-.cm-s-default .cm-builtin {color: #30a;}
-.cm-s-default .cm-bracket {color: #997;}
-.cm-s-default .cm-tag {color: #170;}
-.cm-s-default .cm-attribute {color: #00c;}
-.cm-s-default .cm-header {color: blue;}
-.cm-s-default .cm-quote {color: #090;}
-.cm-s-default .cm-hr {color: #999;}
-.cm-s-default .cm-link {color: #00c;}
-
-.cm-negative {color: #d44;}
-.cm-positive {color: #292;}
-.cm-header, .cm-strong {font-weight: bold;}
-.cm-em {font-style: italic;}
-.cm-emstrong {font-style: italic; font-weight: bold;}
-.cm-link {text-decoration: underline;}
-
-.cm-invalidchar {color: #f00;}
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
-
-/* STOP */
-
-/* The rest of this file contains styles related to the mechanics of
-   the editor. You probably shouldn't touch them. */
-
-.CodeMirror {
-  line-height: 1;
-  position: relative;
-  overflow: hidden;
-}
-
-.CodeMirror-scroll {
-  /* 30px is the magic margin used to hide the element's real scrollbars */
-  /* See overflow: hidden in .CodeMirror, and the paddings in .CodeMirror-sizer */
-  margin-bottom: -30px; margin-right: -30px;
-  padding-bottom: 30px; padding-right: 30px;
-  height: 100%;
-  outline: none; /* Prevent dragging from highlighting the element */
-  position: relative;
-}
-.CodeMirror-sizer {
-  position: relative;
-}
-
-/* The fake, visible scrollbars. Used to force redraw during scrolling
-   before actuall scrolling happens, thus preventing shaking and
-   flickering artifacts. */
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler {
-  position: absolute;
-  z-index: 6;
-  display: none;
-}
-.CodeMirror-vscrollbar {
-  right: 0; top: 0;
-  overflow-x: hidden;
-  overflow-y: scroll;
-}
-.CodeMirror-hscrollbar {
-  bottom: 0; left: 0;
-  overflow-y: hidden;
-  overflow-x: scroll;
-}
-.CodeMirror-scrollbar-filler {
-  right: 0; bottom: 0;
-  z-index: 6;
-}
-
-.CodeMirror-gutters {
-  position: absolute; left: 0; top: 0;
-  height: 100%;
-  padding-bottom: 30px;
-  z-index: 3;
-}
-.CodeMirror-gutter {
-  height: 100%;
-  display: inline-block;
-  /* Hack to make IE7 behave */
-  *zoom:1;
-  *display:inline;
-}
-.CodeMirror-gutter-elt {
-  position: absolute;
-  cursor: default;
-  z-index: 4;
-}
-
-.CodeMirror-lines {
-  cursor: text;
-}
-.CodeMirror pre {
-  /* Reset some styles that the rest of the page might have set */
-  -moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0;
-  border-width: 0;
-  background: transparent;
-  font-family: inherit;
-  font-size: inherit;
-  margin: 0;
-  white-space: pre;
-  word-wrap: normal;
-  line-height: inherit;
-  color: inherit;
-  z-index: 2;
-  position: relative;
-  overflow: visible;
-}
-.CodeMirror-wrap pre {
-  word-wrap: break-word;
-  white-space: pre-wrap;
-  word-break: normal;
-}
-.CodeMirror-linebackground {
-  position: absolute;
-  left: 0; right: 0; top: 0; bottom: 0;
-  z-index: 0;
-}
-
-.CodeMirror-linewidget {
-  position: relative;
-  z-index: 2;
-  overflow: auto;
-}
-
-.CodeMirror-widget {
-  display: inline-block;
-}
-
-.CodeMirror-wrap .CodeMirror-scroll {
-  overflow-x: hidden;
-}
-
-.CodeMirror-measure {
-  position: absolute;
-  width: 100%; height: 0px;
-  overflow: hidden;
-  visibility: hidden;
-}
-.CodeMirror-measure pre { position: static; }
-
-.CodeMirror div.CodeMirror-cursor {
-  position: absolute;
-  visibility: hidden;
-  border-right: none;
-  width: 0;
-}
-.CodeMirror-focused div.CodeMirror-cursor {
-  visibility: visible;
-}
-
-.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
-
-.cm-searching {
-  background: #ffa;
-  background: rgba(255, 255, 0, .4);
-}
-
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
-@media print {
-  /* Hide the cursor when printing */
-  .CodeMirror div.CodeMirror-cursor {
-    visibility: hidden;
-  }
-}
 
public/javascripts/lib/mergely/codemirror.js (deleted)
--- public/javascripts/lib/mergely/codemirror.js
This file is too big to display.
 
public/javascripts/lib/mergely/codemirror.min.js (deleted)
--- public/javascripts/lib/mergely/codemirror.min.js
@@ -1,4 +0,0 @@
-window.CodeMirror=function(){"use strict";function w(a,c){if(!(this instanceof w))return new w(a,c);this.options=c=c||{};for(var d in Mc)!c.hasOwnProperty(d)&&Mc.hasOwnProperty(d)&&(c[d]=Mc[d]);I(c);var e="string"==typeof c.value?0:c.value.first,f=this.display=x(a,e);f.wrapper.CodeMirror=this,F(this),c.autofocus&&!o&&Db(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,draggingText:!1,highlight:new De},D(this),c.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap");var g=c.value;"string"==typeof g&&(g=new Rd(c.value,c.mode)),vb(this,Vd)(this,g),b&&setTimeout(Ne(Cb,this,!0),20),Fb(this);var h;try{h=document.activeElement==f.input}catch(i){}h||c.autofocus&&!o?setTimeout(Ne(_b,this),20):ac(this),vb(this,function(){for(var a in Lc)Lc.propertyIsEnumerable(a)&&Lc[a](this,c[a],Oc);for(var b=0;Sc.length>b;++b)Sc[b](this)})()}function x(a,b){var d={},f=d.input=Se("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none;");e?f.style.width="1000px":f.setAttribute("wrap","off"),f.setAttribute("autocorrect","off"),f.setAttribute("autocapitalize","off"),d.inputDiv=Se("div",[f],null,"overflow: hidden; position: relative; width: 3px; height: 0px;"),d.scrollbarH=Se("div",[Se("div",null,null,"height: 1px")],"CodeMirror-hscrollbar"),d.scrollbarV=Se("div",[Se("div",null,null,"width: 1px")],"CodeMirror-vscrollbar"),d.scrollbarFiller=Se("div",null,"CodeMirror-scrollbar-filler"),d.lineDiv=Se("div"),d.selectionDiv=Se("div",null,null,"position: relative; z-index: 1"),d.cursor=Se("div","\u00a0","CodeMirror-cursor"),d.otherCursor=Se("div","\u00a0","CodeMirror-cursor CodeMirror-secondarycursor"),d.measure=Se("div",null,"CodeMirror-measure"),d.lineSpace=Se("div",[d.measure,d.selectionDiv,d.lineDiv,d.cursor,d.otherCursor],null,"position: relative; outline: none"),d.mover=Se("div",[Se("div",[d.lineSpace],"CodeMirror-lines")],null,"position: relative"),d.sizer=Se("div",[d.mover],"CodeMirror-sizer"),d.heightForcer=Se("div","\u00a0",null,"position: absolute; height: "+Be+"px"),d.gutters=Se("div",null,"CodeMirror-gutters"),d.lineGutter=null;var g=Se("div",[d.sizer,d.heightForcer,d.gutters],null,"position: relative; min-height: 100%");return d.scroller=Se("div",[g],"CodeMirror-scroll"),d.scroller.setAttribute("tabIndex","-1"),d.wrapper=Se("div",[d.inputDiv,d.scrollbarH,d.scrollbarV,d.scrollbarFiller,d.scroller],"CodeMirror"),c&&(d.gutters.style.zIndex=-1,d.scroller.style.paddingRight=0),a.appendChild?a.appendChild(d.wrapper):a(d.wrapper),n&&(f.style.width="0px"),e||(d.scroller.draggable=!0),j?(d.inputDiv.style.height="1px",d.inputDiv.style.position="absolute"):c&&(d.scrollbarH.style.minWidth=d.scrollbarV.style.minWidth="18px"),d.viewOffset=d.lastSizeC=0,d.showingFrom=d.showingTo=b,d.lineNumWidth=d.lineNumInnerWidth=d.lineNumChars=null,d.prevInput="",d.alignWidgets=!1,d.pollingFast=!1,d.poll=new De,d.draggingText=!1,d.cachedCharWidth=d.cachedTextHeight=null,d.measureLineCache=[],d.measureLineCachePos=0,d.inaccurateSelection=!1,d.maxLine=null,d.maxLineLength=0,d.maxLineChanged=!1,d.wheelDX=d.wheelDY=d.wheelStartX=d.wheelStartY=null,d}function y(a){a.doc.mode=w.getMode(a.options,a.doc.modeOption),a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)}),a.doc.frontier=a.doc.first,_(a,100),a.state.modeGen++,a.curOp&&yb(a)}function z(a){a.options.lineWrapping?(a.display.wrapper.className+=" CodeMirror-wrap",a.display.sizer.style.minWidth=""):(a.display.wrapper.className=a.display.wrapper.className.replace(" CodeMirror-wrap",""),H(a)),B(a),yb(a),ib(a),setTimeout(function(){J(a.display,a.doc.height)},100)}function A(a){var b=qb(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/rb(a.display)-3);return function(e){return qd(a.doc,e)?0:c?(Math.ceil(e.text.length/d)||1)*b:b}}function B(a){var b=a.doc,c=A(a);b.iter(function(a){var b=c(a);b!=a.height&&Zd(a,b)})}function C(a){var b=Wc[a.options.keyMap].style;a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-keymap-\S+/g,"")+(b?" cm-keymap-"+b:"")}function D(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g," cm-s-"),ib(a)}function E(a){F(a),yb(a)}function F(a){var b=a.display.gutters,c=a.options.gutters;Te(b);for(var d=0;c.length>d;++d){var e=c[d],f=b.appendChild(Se("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"}function G(a,b){if(0==b.height)return 0;for(var d,c=b.text.length,e=b;d=nd(e);){var f=d.find();e=Wd(a,f.from.line),c+=f.from.ch-f.to.ch}for(e=b;d=od(e);){var f=d.find();c-=e.text.length-f.from.ch,e=Wd(a,f.to.line),c+=e.text.length-f.to.ch}return c}function H(a){var b=a.display,c=a.doc;b.maxLine=Wd(c,c.first),b.maxLineLength=G(c,b.maxLine),b.maxLineChanged=!0,c.iter(function(a){var d=G(c,a);d>b.maxLineLength&&(b.maxLineLength=d,b.maxLine=a)})}function I(a){for(var b=!1,c=0;a.gutters.length>c;++c)"CodeMirror-linenumbers"==a.gutters[c]&&(a.lineNumbers?b=!0:a.gutters.splice(c--,1));!b&&a.lineNumbers&&a.gutters.push("CodeMirror-linenumbers")}function J(a,b){var c=b+2*db(a);a.sizer.style.minHeight=a.heightForcer.style.top=c+"px";var d=Math.max(c,a.scroller.scrollHeight),e=a.scroller.scrollWidth>a.scroller.clientWidth,f=d>a.scroller.clientHeight;f?(a.scrollbarV.style.display="block",a.scrollbarV.style.bottom=e?$e(a.measure)+"px":"0",a.scrollbarV.firstChild.style.height=d-a.scroller.clientHeight+a.scrollbarV.clientHeight+"px"):a.scrollbarV.style.display="",e?(a.scrollbarH.style.display="block",a.scrollbarH.style.right=f?$e(a.measure)+"px":"0",a.scrollbarH.firstChild.style.width=a.scroller.scrollWidth-a.scroller.clientWidth+a.scrollbarH.clientWidth+"px"):a.scrollbarH.style.display="",e&&f?(a.scrollbarFiller.style.display="block",a.scrollbarFiller.style.height=a.scrollbarFiller.style.width=$e(a.measure)+"px"):a.scrollbarFiller.style.display="",k&&0===$e(a.measure)&&(a.scrollbarV.style.minWidth=a.scrollbarH.style.minHeight=l?"18px":"12px")}function K(a,b,c){var d=a.scroller.scrollTop,e=a.wrapper.clientHeight;"number"==typeof c?d=c:c&&(d=c.top,e=c.bottom-c.top),d=Math.floor(d-db(a));var f=Math.ceil(d+e);return{from:_d(b,d),to:_d(b,f)}}function L(a){var b=a.display;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var c=O(b)-b.scroller.scrollLeft+a.doc.scrollLeft,d=b.gutters.offsetWidth,e=c+"px",f=b.lineDiv.firstChild;f;f=f.nextSibling)if(f.alignable)for(var g=0,h=f.alignable;h.length>g;++g)h[g].style.left=e;a.options.fixedGutter&&(b.gutters.style.left=c+d+"px")}}function M(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=N(a.options,b.first+b.size-1),d=a.display;if(c.length!=d.lineNumChars){var e=d.measure.appendChild(Se("div",[Se("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),d.lineNumWidth=d.lineNumInnerWidth+g,d.lineNumChars=d.lineNumInnerWidth?c.length:-1,d.lineGutter.style.width=d.lineNumWidth+"px",!0}return!1}function N(a,b){return a.lineNumberFormatter(b+a.firstLineNumber)+""}function O(a){return We(a.scroller).left-We(a.sizer).left}function P(a,b,c){var d=a.display.showingFrom,e=a.display.showingTo,f=Q(a,b,c);return f&&(ye(a,"update",a),(a.display.showingFrom!=d||a.display.showingTo!=e)&&ye(a,"viewportChange",a,a.display.showingFrom,a.display.showingTo)),X(a),J(a.display,a.doc.height),f}function Q(a,b,d){var e=a.display,f=a.doc;if(!e.wrapper.clientWidth)return e.showingFrom=e.showingTo=f.first,e.viewOffset=0,void 0;var g=K(e,f,d);if(!(0==b.length&&g.from>e.showingFrom&&g.to<e.showingTo)){M(a)&&(b=[{from:f.first,to:f.first+f.size}]);var h=e.sizer.style.marginLeft=e.gutters.offsetWidth+"px";e.scrollbarH.style.left=a.options.fixedGutter?h:"0";var i=1/0;if(a.options.lineNumbers)for(var j=0;b.length>j;++j)if(b[j].diff){i=b[j].from;break}var k=f.first+f.size,l=Math.max(g.from-a.options.viewportMargin,f.first),m=Math.min(k,g.to+a.options.viewportMargin);if(l>e.showingFrom&&20>l-e.showingFrom&&(l=Math.max(f.first,e.showingFrom)),e.showingTo>m&&20>e.showingTo-m&&(m=Math.min(k,e.showingTo)),v)for(l=$d(pd(f,Wd(f,l)));k>m&&qd(f,Wd(f,m));)++m;var n=[{from:Math.max(e.showingFrom,f.first),to:Math.min(e.showingTo,k)}];if(n=n[0].from>=n[0].to?[]:S(n,b),v)for(var j=0;n.length>j;++j)for(var p,o=n[j];p=od(Wd(f,o.to-1));){var q=p.find().from.line;if(!(q>o.from)){n.splice(j--,1);break}o.to=q}for(var r=0,j=0;n.length>j;++j){var o=n[j];l>o.from&&(o.from=l),o.to>m&&(o.to=m),o.from>=o.to?n.splice(j--,1):r+=o.to-o.from}if(r==m-l&&l==e.showingFrom&&m==e.showingTo)return R(a),void 0;n.sort(function(a,b){return a.from-b.from});var s=document.activeElement;.7*(m-l)>r&&(e.lineDiv.style.display="none"),U(a,l,m,n,i),e.lineDiv.style.display="",document.activeElement!=s&&s.offsetHeight&&s.focus();var t=l!=e.showingFrom||m!=e.showingTo||e.lastSizeC!=e.wrapper.clientHeight;t&&(e.lastSizeC=e.wrapper.clientHeight),e.showingFrom=l,e.showingTo=m,_(a,100);for(var x,u=e.lineDiv.offsetTop,w=e.lineDiv.firstChild;w;w=w.nextSibling)if(w.lineObj){if(c){var y=w.offsetTop+w.offsetHeight;x=y-u,u=y}else{var z=We(w);x=z.bottom-z.top}var A=w.lineObj.height-x;if(2>x&&(x=qb(e)),A>.001||-.001>A){Zd(w.lineObj,x);var B=w.lineObj.widgets;if(B)for(var j=0;B.length>j;++j)B[j].height=B[j].node.offsetHeight}}return R(a),K(e,f,d).to>m&&Q(a,[],d),!0}}function R(a){var b=a.display.viewOffset=ae(a,Wd(a.doc,a.display.showingFrom));a.display.mover.style.top=b+"px"}function S(a,b){for(var c=0,d=b.length||0;d>c;++c){for(var e=b[c],f=[],g=e.diff||0,h=0,i=a.length;i>h;++h){var j=a[h];e.to<=j.from&&e.diff?f.push({from:j.from+g,to:j.to+g}):e.to<=j.from||e.from>=j.to?f.push(j):(e.from>j.from&&f.push({from:j.from,to:e.from}),e.to<j.to&&f.push({from:e.to+g,to:j.to+g}))}a=f}return a}function T(a){for(var b=a.display,c={},d={},e=b.gutters.firstChild,f=0;e;e=e.nextSibling,++f)c[a.options.gutters[f]]=e.offsetLeft,d[a.options.gutters[f]]=e.offsetWidth;return{fixedPos:O(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function U(a,b,c,d,f){function l(b){var c=b.nextSibling;return e&&p&&a.display.currentWheelTarget==b?(b.style.display="none",b.lineObj=null):b.parentNode.removeChild(b),c}var g=T(a),h=a.display,i=a.options.lineNumbers;d.length||e&&a.display.currentWheelTarget||Te(h.lineDiv);var j=h.lineDiv,k=j.firstChild,m=d.shift(),n=b;for(a.doc.iter(b,c,function(b){if(m&&m.to==n&&(m=d.shift()),qd(a.doc,b)){if(0!=b.height&&Zd(b,0),b.widgets&&k.previousSibling)for(var c=0;b.widgets.length>c;++c)if(b.widgets[c].showIfHidden){var e=k.previousSibling;if(/pre/i.test(e.nodeName)){var h=Se("div",null,null,"position: relative");e.parentNode.replaceChild(h,e),h.appendChild(e),e=h}var o=e.appendChild(Se("div",[b.widgets[c].node],"CodeMirror-linewidget"));W(b.widgets[c],o,e,g)}}else if(m&&n>=m.from&&m.to>n){for(;k.lineObj!=b;)k=l(k);i&&n>=f&&k.lineNumber&&Ve(k.lineNumber,N(a.options,n)),k=k.nextSibling}else{if(b.widgets)for(var r,p=0,q=k;q&&20>p;++p,q=q.nextSibling)if(q.lineObj==b&&/div/i.test(q.nodeName)){r=q;break}var s=V(a,b,n,g,r);if(s!=r)j.insertBefore(s,k);else{for(;k!=r;)k=l(k);k=k.nextSibling}s.lineObj=b}++n});k;)k=l(k)}function V(a,b,d,e,f){var j,g=Hd(a,b),h=b.gutterMarkers,i=a.display;if(!(a.options.lineNumbers||h||b.bgClass||b.wrapClass||b.widgets))return g;if(f){f.alignable=null;for(var n,k=!0,l=0,m=f.firstChild;m;m=n)if(n=m.nextSibling,/\bCodeMirror-linewidget\b/.test(m.className)){for(var o=0,p=!0;b.widgets.length>o;++o){var q=b.widgets[o],r=!1;if(q.above||(r=p,p=!1),q.node==m.firstChild){W(q,m,f,e),++l,r&&f.insertBefore(g,m);break}}if(o==b.widgets.length){k=!1;break}}else f.removeChild(m);k&&l==b.widgets.length&&(j=f,f.className=b.wrapClass||"")}if(j||(j=Se("div",null,b.wrapClass,"position: relative"),j.appendChild(g)),b.bgClass&&j.insertBefore(Se("div","\u00a0",b.bgClass+" CodeMirror-linebackground"),j.firstChild),a.options.lineNumbers||h){var s=j.insertBefore(Se("div",null,null,"position: absolute; left: "+(a.options.fixedGutter?e.fixedPos:-e.gutterTotalWidth)+"px"),j.firstChild);if(a.options.fixedGutter&&(j.alignable||(j.alignable=[])).push(s),!a.options.lineNumbers||h&&h["CodeMirror-linenumbers"]||(j.lineNumber=s.appendChild(Se("div",N(a.options,d),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+e.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+i.lineNumInnerWidth+"px"))),h)for(var t=0;a.options.gutters.length>t;++t){var u=a.options.gutters[t],v=h.hasOwnProperty(u)&&h[u];v&&s.appendChild(Se("div",[v],"CodeMirror-gutter-elt","left: "+e.gutterLeft[u]+"px; width: "+e.gutterWidth[u]+"px"))}}if(c&&(j.style.zIndex=2),b.widgets&&j!=f)for(var o=0,w=b.widgets;w.length>o;++o){var q=w[o],x=Se("div",[q.node],"CodeMirror-linewidget");W(q,x,j,e),q.above?j.insertBefore(x,a.options.lineNumbers&&0!=b.height?s:g):j.appendChild(x),ye(q,"redraw")}return j}function W(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 X(a){var b=a.display,c=pc(a.doc.sel.from,a.doc.sel.to);c||a.options.showCursorWhenSelecting?Y(a):b.cursor.style.display=b.otherCursor.style.display="none",c?b.selectionDiv.style.display="none":Z(a);var d=lb(a,a.doc.sel.head,"div"),e=We(b.wrapper),f=We(b.lineDiv);b.inputDiv.style.top=Math.max(0,Math.min(b.wrapper.clientHeight-10,d.top+f.top-e.top))+"px",b.inputDiv.style.left=Math.max(0,Math.min(b.wrapper.clientWidth-10,d.left+f.left-e.left))+"px"}function Y(a){var b=a.display,c=lb(a,a.doc.sel.head,"div");b.cursor.style.left=c.left+"px",b.cursor.style.top=c.top+"px",b.cursor.style.height=Math.max(0,c.bottom-c.top)*a.options.cursorHeight+"px",b.cursor.style.display="",c.other?(b.otherCursor.style.display="",b.otherCursor.style.left=c.other.left+"px",b.otherCursor.style.top=c.other.top+"px",b.otherCursor.style.height=.85*(c.other.bottom-c.other.top)+"px"):b.otherCursor.style.display="none"}function Z(a){function h(a,b,c,d){0>b&&(b=0),e.appendChild(Se("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?f-a:c)+"px; height: "+(d-b)+"px"))}function i(b,d,e,i){function m(c){return kb(a,oc(b,c),"div",j)}var j=Wd(c,b),k=j.text.length,l=i?1/0:-1/0;return ff(be(j),d||0,null==e?k:e,function(a,b,c){var j=m("rtl"==c?b-1:a),n=m("rtl"==c?a:b-1),o=j.left,p=n.right;n.top-j.top>3&&(h(o,j.top,null,j.bottom),o=g,j.bottom<n.top&&h(o,j.bottom,null,n.top)),null==e&&b==k&&(p=f),null==d&&0==a&&(o=g),l=i?Math.min(n.top,l):Math.max(n.bottom,l),g+1>o&&(o=g),h(o,n.top,p-o,n.bottom)}),l}var b=a.display,c=a.doc,d=a.doc.sel,e=document.createDocumentFragment(),f=b.lineSpace.offsetWidth,g=eb(a.display);if(d.from.line==d.to.line)i(d.from.line,d.from.ch,d.to.ch);else{for(var l,n,j=Wd(c,d.from.line),k=j,m=[d.from.line,d.from.ch];l=od(k);){var o=l.find();if(m.push(o.from.ch,o.to.line,o.to.ch),o.to.line==d.to.line){m.push(d.to.ch),n=!0;break}k=Wd(c,o.to.line)}if(n)for(var p=0;m.length>p;p+=3)i(m[p],m[p+1],m[p+2]);else{var q,r,s=Wd(c,d.to.line);q=d.from.ch?i(d.from.line,d.from.ch,null,!1):ae(a,j)-b.viewOffset,r=d.to.ch?i(d.to.line,nd(s)?null:0,d.to.ch,!0):ae(a,s)-b.viewOffset,r>q&&h(g,q,null,r)}}Ue(b.selectionDiv,e),b.selectionDiv.style.display=""}function $(a){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursor.style.visibility=b.otherCursor.style.visibility="",b.blinker=setInterval(function(){b.cursor.offsetHeight&&(b.cursor.style.visibility=b.otherCursor.style.visibility=(c=!c)?"":"hidden")},a.options.cursorBlinkRate)}function _(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.showingTo&&a.state.highlight.set(b,Ne(ab,a))}function ab(a){var b=a.doc;if(b.frontier<b.first&&(b.frontier=b.first),!(b.frontier>=a.display.showingTo)){var f,c=+new Date+a.options.workTime,d=Tc(b.mode,cb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.showingTo+500),function(g){if(b.frontier>=a.display.showingFrom){var h=g.styles;g.styles=Cd(a,g,d);for(var i=!h||h.length!=g.styles.length,j=0;!i&&h.length>j;++j)i=h[j]!=g.styles[j];i&&(f&&f.end==b.frontier?f.end++:e.push(f={start:b.frontier,end:b.frontier+1})),g.stateAfter=Tc(b.mode,d)}else Ed(a,g,d),g.stateAfter=0==b.frontier%5?Tc(b.mode,d):null;return++b.frontier,+new Date>c?(_(a,a.options.workDelay),!0):void 0}),e.length&&vb(a,function(){for(var a=0;e.length>a;++a)yb(this,e[a].start,e[a].end)})()}}function bb(a,b){for(var c,d,e=a.doc,f=b,g=b-100;f>g;--f){if(e.first>=f)return e.first;var h=Wd(e,f-1);if(h.stateAfter)return f;var i=Ee(h.text,null,a.options.tabSize);(null==d||c>i)&&(d=f-1,c=i)}return d}function cb(a,b){var c=a.doc,d=a.display;if(!c.mode.startState)return!0;var e=bb(a,b),f=e>c.first&&Wd(c,e-1).stateAfter;return f=f?Tc(c.mode,f):Uc(c.mode),c.iter(e,b,function(g){Ed(a,g,f);var h=e==b-1||0==e%5||e>=d.showingFrom&&d.showingTo>e;g.stateAfter=h?Tc(c.mode,f):null,++e}),f}function db(a){return a.lineSpace.offsetTop}function eb(a){var b=Ue(a.measure,Se("pre",null,null,"text-align: left")).appendChild(Se("span","x"));return b.offsetLeft}function fb(a,b,c,d){var e=-1;d=d||gb(a,b);for(var f=c;;f+=e){var g=d[f];if(g)break;0>e&&0==f&&(e=1)}return{left:c>f?g.right:g.left,right:f>c?g.left:g.right,top:g.top,bottom:g.bottom}}function gb(a,b){for(var c=a.display,d=a.display.measureLineCache,e=0;d.length>e;++e){var f=d[e];if(f.text==b.text&&f.markedSpans==b.markedSpans&&c.scroller.clientWidth==f.width&&f.classes==b.textClass+"|"+b.bgClass+"|"+b.wrapClass)return f.measure}var g=hb(a,b),f={text:b.text,width:c.scroller.clientWidth,markedSpans:b.markedSpans,measure:g,classes:b.textClass+"|"+b.bgClass+"|"+b.wrapClass};return 16==d.length?d[++c.measureLineCachePos%16]=f:d.push(f),g}function hb(a,e){var f=a.display,g=Me(e.text.length),h=Hd(a,e,g);if(b&&!c&&!a.options.lineWrapping&&h.childNodes.length>100){for(var i=document.createDocumentFragment(),j=10,k=h.childNodes.length,l=0,m=Math.ceil(k/j);m>l;++l){for(var n=Se("div",null,null,"display: inline-block"),o=0;j>o&&k;++o)n.appendChild(h.firstChild),--k;i.appendChild(n)}h.appendChild(i)}Ue(f.measure,h);var p=We(f.lineDiv),q=[],r=Me(e.text.length),s=h.offsetHeight;d&&f.measure.first!=h&&Ue(f.measure,h);for(var t,l=0;g.length>l;++l)if(t=g[l]){for(var u=We(t),v=Math.max(0,u.top-p.top),w=Math.min(u.bottom-p.top,s),o=0;q.length>o;o+=2){var x=q[o],y=q[o+1];if(!(x>w||v>y)&&(v>=x&&y>=w||x>=v&&w>=y||Math.min(w,y)-Math.max(v,x)>=w-v>>1)){q[o]=Math.min(v,x),q[o+1]=Math.max(w,y);break}}o==q.length&&q.push(v,w);var z=u.right;t.measureRight&&(z=We(t.measureRight).left),r[l]={left:u.left-p.left,right:z-p.left,top:o}}for(var t,l=0;r.length>l;++l)if(t=r[l]){var A=t.top;t.top=q[A],t.bottom=q[A+1]}if(!a.options.lineWrapping){var B=h.lastChild;3==B.nodeType&&(B=h.appendChild(Se("span","\u200b"))),r.width=We(B).right-p.left}return r}function ib(a){a.display.measureLineCache.length=a.display.measureLineCachePos=0,a.display.cachedCharWidth=a.display.cachedTextHeight=null,a.display.maxLineChanged=!0,a.display.lineNumChars=null}function jb(a,b,c,d){if(b.widgets)for(var e=0;b.widgets.length>e;++e)if(b.widgets[e].above){var f=wd(b.widgets[e]);c.top+=f,c.bottom+=f}if("line"==d)return c;d||(d="local");var g=ae(a,b);if("local"!=d&&(g-=a.display.viewOffset),"page"==d){var h=We(a.display.lineSpace);g+=h.top+(window.pageYOffset||(document.documentElement||document.body).scrollTop);var i=h.left+(window.pageXOffset||(document.documentElement||document.body).scrollLeft);c.left+=i,c.right+=i}return c.top+=g,c.bottom+=g,c}function kb(a,b,c,d){return d||(d=Wd(a.doc,b.line)),jb(a,d,fb(a,d,b.ch),c)}function lb(a,b,c,d,e){function f(b,f){var g=fb(a,d,b,e);return f?g.left=g.right:g.right=g.left,jb(a,d,g,c)}d=d||Wd(a.doc,b.line),e||(e=gb(a,d));var g=be(d),h=b.ch;if(!g)return f(h);for(var i,j,k=g[0].level,l=0;g.length>l;++l){var o,p,m=g[l],n=m.level%2;if(h>m.from&&m.to>h)return f(h,n);var q=n?m.to:m.from,r=n?m.from:m.to;if(q==h)p=l&&m.level<(o=g[l-1]).level?f(o.level%2?o.from:o.to-1,!0):f(n&&m.from!=m.to?h-1:h),n==k?i=p:j=p;else if(r==h){var o=g.length-1>l&&g[l+1];if(!n&&o&&o.from==o.to)continue;p=o&&m.level<o.level?f(o.level%2?o.to-1:o.from):f(n?h:h-1,!0),n==k?i=p:j=p}}return k&&!h&&(j=f(g[0].to-1)),i?(j&&(i.other=j),i):j}function mb(a,b,c){var d=new oc(a,b);return c&&(d.outside=!0),d}function nb(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return mb(d.first,0,!0);var e=_d(d,c),f=d.first+d.size-1;if(e>f)return mb(d.first+d.size-1,Wd(d,f).text.length,!0);for(0>b&&(b=0);;){var g=Wd(d,e),h=ob(a,g,e,b,c),i=od(g),j=i&&i.find();if(!(i&&h.ch>=j.from.ch))return h;e=j.to.line}}function ob(a,b,c,d,e){function j(d){var e=lb(a,oc(c,d),"line",b,i);return g=!0,f>e.bottom?Math.max(0,e.left-h):e.top>f?e.left+h:(g=!1,e.left)}var f=e-ae(a,b),g=!1,h=a.display.wrapper.clientWidth,i=gb(a,b),k=be(b),l=b.text.length,m=jf(b),n=kf(b),o=j(m),p=g,q=j(n),r=g;if(d>q)return mb(c,n,r);for(;;){if(k?n==m||n==nf(b,m,1):1>=n-m){for(var s=q-d>d-o,t=s?m:n;Re.test(b.text.charAt(t));)++t;var u=mb(c,t,s?p:r);return u.after=s,u}var v=Math.ceil(l/2),w=m+v;if(k){w=m;for(var x=0;v>x;++x)w=nf(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 qb(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==pb){pb=Se("pre");for(var b=0;49>b;++b)pb.appendChild(document.createTextNode("x")),pb.appendChild(Se("br"));pb.appendChild(document.createTextNode("x"))}Ue(a.measure,pb);var c=pb.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),Te(a.measure),c||1}function rb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=Se("span","x"),c=Se("pre",[b]);Ue(a.measure,c);var d=b.offsetWidth;return d>2&&(a.cachedCharWidth=d),d||10}function tb(a){a.curOp={changes:[],updateInput:null,userSelChange:null,textChanged:null,selectionChanged:!1,updateMaxLine:!1,updateScrollPos:!1,id:++sb},xe++||(we=[])}function ub(a){var b=a.curOp,c=a.doc,d=a.display;if(a.curOp=null,b.updateMaxLine&&H(a),d.maxLineChanged&&!a.options.lineWrapping){var e=gb(a,d.maxLine).width;d.sizer.style.minWidth=Math.max(0,e+3+Be)+"px",d.maxLineChanged=!1;var f=Math.max(0,d.sizer.offsetLeft+d.sizer.offsetWidth-d.scroller.clientWidth);c.scrollLeft>f&&!b.updateScrollPos&&Pb(a,Math.min(d.scroller.scrollLeft,f),!0)}var g,h;if(b.updateScrollPos)g=b.updateScrollPos;else if(b.selectionChanged&&d.scroller.clientHeight){var i=lb(a,c.sel.head);g=Ec(a,i.left,i.top,i.left,i.bottom)}(b.changes.length||g&&null!=g.scrollTop)&&(h=P(a,b.changes,g&&g.scrollTop)),!h&&b.selectionChanged&&X(a),b.updateScrollPos?(d.scroller.scrollTop=d.scrollbarV.scrollTop=c.scrollTop=g.scrollTop,d.scroller.scrollLeft=d.scrollbarH.scrollLeft=c.scrollLeft=g.scrollLeft,L(a)):g&&Bc(a),b.selectionChanged&&$(a),a.state.focused&&b.updateInput&&Cb(a,b.userSelChange);var j=b.maybeHiddenMarkers,k=b.maybeUnhiddenMarkers;if(j)for(var l=0;j.length>l;++l)j[l].lines.length||ve(j[l],"hide");if(k)for(var l=0;k.length>l;++l)k[l].lines.length&&ve(k[l],"unhide");var m;if(--xe||(m=we,we=null),b.textChanged&&ve(a,"change",a,b.textChanged),b.selectionChanged&&ve(a,"cursorActivity",a),m)for(var l=0;m.length>l;++l)m[l]()}function vb(a,b){return function(){var c=a||this,d=!c.curOp;d&&tb(c);try{var e=b.apply(c,arguments)}finally{d&&ub(c)}return e}}function wb(a){return function(){var c,b=this.cm&&!this.cm.curOp;b&&tb(this.cm);try{c=a.apply(this,arguments)}finally{b&&ub(this.cm)}return c}}function xb(a,b){var d,c=!a.curOp;c&&tb(a);try{d=b()}finally{c&&ub(a)}return d}function yb(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),a.curOp.changes.push({from:b,to:c,diff:d})}function zb(a){a.display.pollingFast||a.display.poll.set(a.options.pollInterval,function(){Bb(a),a.state.focused&&zb(a)})}function Ab(a){function c(){var d=Bb(a);d||b?(a.display.pollingFast=!1,zb(a)):(b=!0,a.display.poll.set(60,c))}var b=!1;a.display.pollingFast=!0,a.display.poll.set(20,c)}function Bb(a){var c=a.display.input,d=a.display.prevInput,e=a.doc,f=e.sel;if(!a.state.focused||cf(c)||Eb(a))return!1;var g=c.value;if(g==d&&pc(f.from,f.to))return!1;if(b&&g&&0===c.selectionStart)return Cb(a,!0),!1;var h=!a.curOp;h&&tb(a),f.shift=!1;for(var i=0,j=Math.min(d.length,g.length);j>i&&d[i]==g[i];)++i;var k=f.from,l=f.to;d.length>i?k=oc(k.line,k.ch-(d.length-i)):a.state.overwrite&&pc(k,l)&&!a.state.pasteIncoming&&(l=oc(l.line,Math.min(Wd(e,l.line).text.length,l.ch+(g.length-i))));var m=a.curOp.updateInput;return hc(a.doc,{from:k,to:l,text:bf(g.slice(i)),origin:a.state.pasteIncoming?"paste":"+input"},"end"),a.curOp.updateInput=m,g.length>1e3?c.value=a.display.prevInput="":a.display.prevInput=g,h&&ub(a),a.state.pasteIncoming=!1,!0}function Cb(a,b){var c,d,e=a.doc;pc(e.sel.from,e.sel.to)?b&&(a.display.prevInput=a.display.input.value=""):(a.display.prevInput="",c=df&&(e.sel.to.line-e.sel.from.line>100||(d=a.getSelection()).length>1e3),a.display.input.value=c?"-":d||a.getSelection(),a.state.focused&&Ie(a.display.input)),a.display.inaccurateSelection=c}function Db(a){"nocursor"==a.options.readOnly||o&&document.activeElement==a.display.input||a.display.input.focus()}function Eb(a){return a.options.readOnly||a.doc.cantEdit}function Fb(a){function c(){a.state.focused&&setTimeout(Ne(Db,a),0)}function d(){b.cachedCharWidth=b.cachedTextHeight=null,ib(a),xb(a,Ne(yb,a))}function e(){for(var a=b.wrapper.parentNode;a&&a!=document.body;a=a.parentNode);a?setTimeout(e,5e3):ue(window,"resize",d)}function f(b){a.options.onDragEvent&&a.options.onDragEvent(a,ne(b))||qe(b)}function g(){b.inaccurateSelection&&(b.prevInput="",b.inaccurateSelection=!1,b.input.value=a.getSelection(),Ie(b.input))}var b=a.display;te(b.scroller,"mousedown",vb(a,Kb)),te(b.scroller,"dblclick",vb(a,oe)),te(b.lineSpace,"selectstart",function(a){Gb(b,a)||oe(a)}),t||te(b.scroller,"contextmenu",function(b){cc(a,b)}),te(b.scroller,"scroll",function(){Ob(a,b.scroller.scrollTop),Pb(a,b.scroller.scrollLeft,!0),ve(a,"scroll",a)}),te(b.scrollbarV,"scroll",function(){Ob(a,b.scrollbarV.scrollTop)}),te(b.scrollbarH,"scroll",function(){Pb(a,b.scrollbarH.scrollLeft)}),te(b.scroller,"mousewheel",function(b){Sb(a,b)}),te(b.scroller,"DOMMouseScroll",function(b){Sb(a,b)}),te(b.scrollbarH,"mousedown",c),te(b.scrollbarV,"mousedown",c),te(b.wrapper,"scroll",function(){b.wrapper.scrollTop=b.wrapper.scrollLeft=0}),te(window,"resize",d),setTimeout(e,5e3),te(b.input,"keyup",vb(a,function(b){a.options.onKeyEvent&&a.options.onKeyEvent(a,ne(b))||16==b.keyCode&&(a.doc.sel.shift=!1)})),te(b.input,"input",Ne(Ab,a)),te(b.input,"keydown",vb(a,Zb)),te(b.input,"keypress",vb(a,$b)),te(b.input,"focus",Ne(_b,a)),te(b.input,"blur",Ne(ac,a)),a.options.dragDrop&&(te(b.scroller,"dragstart",function(b){Nb(a,b)}),te(b.scroller,"dragenter",f),te(b.scroller,"dragover",f),te(b.scroller,"drop",vb(a,Lb))),te(b.scroller,"paste",function(c){Gb(b,c)||(Db(a),Ab(a))}),te(b.input,"paste",function(){a.state.pasteIncoming=!0,Ab(a)}),te(b.input,"cut",g),te(b.input,"copy",g),j&&te(b.sizer,"mouseup",function(){document.activeElement==b.input&&b.input.blur(),Db(a)})}function Gb(a,b){for(var c=re(b);c!=a.wrapper;c=c.parentNode){if(!c)return!0;if(/\bCodeMirror-(?:line)?widget\b/.test(c.className)||c.parentNode==a.sizer&&c!=a.mover)return!0}}function Hb(a,b,c){var d=a.display;if(!c){var e=re(b);if(e==d.scrollbarH||e==d.scrollbarH.firstChild||e==d.scrollbarV||e==d.scrollbarV.firstChild||e==d.scrollbarFiller)return null}var f,g,h=We(d.lineSpace);try{f=b.clientX,g=b.clientY}catch(b){return null}return nb(a,f-h.left,g-h.top)}function Kb(a){function p(a){if("single"==j)return wc(c.doc,tc(f,h),a),void 0;if(n=tc(f,n),o=tc(f,o),"double"==j){var b=Jc(Wd(f,a.line).text,a);qc(a,n)?wc(c.doc,b.from,o):wc(c.doc,n,b.to)}else"triple"==j&&(qc(a,n)?wc(c.doc,o,tc(f,oc(a.line,0))):wc(c.doc,n,tc(f,oc(a.line+1,0))))}function s(a){var b=++r,e=Hb(c,a,!0);if(e)if(pc(e,l)){var h=a.clientY<q.top?-20:a.clientY>q.bottom?20:0;h&&setTimeout(vb(c,function(){r==b&&(d.scroller.scrollTop+=h,s(a))}),50)}else{c.state.focused||_b(c),l=e,p(e);var g=K(d,f);(e.line>=g.to||e.line<g.from)&&setTimeout(vb(c,function(){r==b&&s(a)}),150)}}function u(a){r=1/0;var b=Hb(c,a);b&&p(b),oe(a),Db(c),ue(document,"mousemove",v),ue(document,"mouseup",w)}var c=this,d=c.display,f=c.doc,g=f.sel;if(g.shift=a.shiftKey,Gb(d,a))return e||(d.scroller.draggable=!1,setTimeout(function(){d.scroller.draggable=!0},100)),void 0;if(!Mb(c,a)){var h=Hb(c,a);switch(se(a)){case 3:return t&&cc.call(c,c,a),void 0;case 2:return h&&wc(c.doc,h),setTimeout(Ne(Db,c),20),oe(a),void 0}if(!h)return re(a)==d.scroller&&oe(a),void 0;c.state.focused||_b(c);var i=+new Date,j="single";if(Jb&&Jb.time>i-400&&pc(Jb.pos,h))j="triple",oe(a),setTimeout(Ne(Db,c),20),Kc(c,h.line);else if(Ib&&Ib.time>i-400&&pc(Ib.pos,h)){j="double",Jb={time:i,pos:h},oe(a);var k=Jc(Wd(f,h.line).text,h);wc(c.doc,k.from,k.to)}else Ib={time:i,pos:h};var l=h;if(c.options.dragDrop&&Xe&&!Eb(c)&&!pc(g.from,g.to)&&!qc(h,g.from)&&!qc(g.to,h)&&"single"==j){var m=vb(c,function(b){e&&(d.scroller.draggable=!1),c.state.draggingText=!1,ue(document,"mouseup",m),ue(d.scroller,"drop",m),10>Math.abs(a.clientX-b.clientX)+Math.abs(a.clientY-b.clientY)&&(oe(b),wc(c.doc,h),Db(c))});return e&&(d.scroller.draggable=!0),c.state.draggingText=m,d.scroller.dragDrop&&d.scroller.dragDrop(),te(document,"mouseup",m),te(d.scroller,"drop",m),void 0}oe(a),"single"==j&&wc(c.doc,tc(f,h));var n=g.from,o=g.to,q=We(d.wrapper),r=0,v=vb(c,function(a){b||se(a)?s(a):u(a)}),w=vb(c,u);te(document,"mousemove",v),te(document,"mouseup",w)}}function Lb(a){var b=this;if(!(Gb(b.display,a)||b.options.onDragEvent&&b.options.onDragEvent(b,ne(a)))){oe(a);var c=Hb(b,a,!0),d=a.dataTransfer.files;if(c&&!Eb(b))if(d&&d.length&&window.FileReader&&window.File)for(var e=d.length,f=Array(e),g=0,h=function(a,d){var h=new FileReader;h.onload=function(){f[d]=h.result,++g==e&&(c=tc(b.doc,c),nc(b.doc,f.join(""),c,"around","paste"))},h.readAsText(a)},i=0;e>i;++i)h(d[i],i);else{if(b.state.draggingText&&!qc(c,b.doc.sel.from)&&!qc(b.doc.sel.to,c))return b.state.draggingText(a),setTimeout(Ne(Db,b),20),void 0;try{var f=a.dataTransfer.getData("Text");if(f){var j=b.doc.sel.from,k=b.doc.sel.to;yc(b.doc,c,c),b.state.draggingText&&nc(b.doc,"",j,k,"paste"),b.replaceSelection(f,null,"paste"),Db(b),_b(b)}}catch(a){}}}}function Mb(a,b){var c=a.display;try{var d=b.clientX,e=b.clientY}catch(b){return!1}if(d>=Math.floor(We(c.gutters).right))return!1;if(oe(b),!Ae(a,"gutterClick"))return!0;var f=We(c.lineDiv);if(e>f.bottom)return!0;e-=f.top-c.viewOffset;for(var g=0;a.options.gutters.length>g;++g){var h=c.gutters.childNodes[g];if(h&&We(h).right>=d){var i=_d(a.doc,e),j=a.options.gutters[g];ye(a,"gutterClick",a,i,j,b);break}}return!0}function Nb(a,b){if(!Gb(a.display,b)){var c=a.getSelection();if(b.dataTransfer.setData("Text",c),b.dataTransfer.setDragImage&&!i){var d=Se("img",null,null,"position: fixed; left: 0; top: 0;");h&&(d.width=d.height=1,a.display.wrapper.appendChild(d),d._top=d.offsetTop),b.dataTransfer.setDragImage(d,0,0),h&&d.parentNode.removeChild(d)}}}function Ob(b,c){2>Math.abs(b.doc.scrollTop-c)||(b.doc.scrollTop=c,a||P(b,[],c),b.display.scroller.scrollTop!=c&&(b.display.scroller.scrollTop=c),b.display.scrollbarV.scrollTop!=c&&(b.display.scrollbarV.scrollTop=c),a&&P(b,[]))}function Pb(a,b,c){(c?b==a.doc.scrollLeft:2>Math.abs(a.doc.scrollLeft-b))||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,L(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbarH.scrollLeft!=b&&(a.display.scrollbarH.scrollLeft=b))}function Sb(b,c){var d=c.wheelDeltaX,f=c.wheelDeltaY;if(null==d&&c.detail&&c.axis==c.HORIZONTAL_AXIS&&(d=c.detail),null==f&&c.detail&&c.axis==c.VERTICAL_AXIS?f=c.detail:null==f&&(f=c.wheelDelta),f&&p&&e)for(var g=c.target;g!=j;g=g.parentNode)if(g.lineObj){b.display.currentWheelTarget=g;
-break}var i=b.display,j=i.scroller;if(d&&!a&&!h&&null!=Rb)return f&&Ob(b,Math.max(0,Math.min(j.scrollTop+f*Rb,j.scrollHeight-j.clientHeight))),Pb(b,Math.max(0,Math.min(j.scrollLeft+d*Rb,j.scrollWidth-j.clientWidth))),oe(c),i.wheelStartX=null,void 0;if(f&&null!=Rb){var k=f*Rb,l=b.doc.scrollTop,m=l+i.wrapper.clientHeight;0>k?l=Math.max(0,l+k-50):m=Math.min(b.doc.height,m+k+50),P(b,[],{top:l,bottom:m})}20>Qb&&(null==i.wheelStartX?(i.wheelStartX=j.scrollLeft,i.wheelStartY=j.scrollTop,i.wheelDX=d,i.wheelDY=f,setTimeout(function(){if(null!=i.wheelStartX){var a=j.scrollLeft-i.wheelStartX,b=j.scrollTop-i.wheelStartY,c=b&&i.wheelDY&&b/i.wheelDY||a&&i.wheelDX&&a/i.wheelDX;i.wheelStartX=i.wheelStartY=null,c&&(Rb=(Rb*Qb+c)/(Qb+1),++Qb)}},200)):(i.wheelDX+=d,i.wheelDY+=f))}function Tb(a,b,c){if("string"==typeof b&&(b=Vc[b],!b))return!1;a.display.pollingFast&&Bb(a)&&(a.display.pollingFast=!1);var d=a.doc,e=d.sel.shift,f=!1;try{Eb(a)&&(a.state.suppressEdits=!0),c&&(d.sel.shift=!1),f=b(a)!=Ce}finally{d.sel.shift=e,a.state.suppressEdits=!1}return f}function Ub(a){var b=a.state.keyMaps.slice(0);return b.push(a.options.keyMap),a.options.extraKeys&&b.unshift(a.options.extraKeys),b}function Wb(a,b){var c=Xc(a.options.keyMap),e=c.auto;clearTimeout(Vb),e&&!Zc(b)&&(Vb=setTimeout(function(){Xc(a.options.keyMap)==c&&(a.options.keyMap=e.call?e.call(null,a):e)},50));var f=$c(b,!0),g=!1;if(!f)return!1;var h=Ub(a);return g=b.shiftKey?Yc("Shift-"+f,h,function(b){return Tb(a,b,!0)})||Yc(f,h,function(b){return"string"==typeof b&&/^go[A-Z]/.test(b)?Tb(a,b):void 0}):Yc(f,h,function(b){return Tb(a,b)}),"stop"==g&&(g=!1),g&&(oe(b),$(a),d&&(b.oldKeyCode=b.keyCode,b.keyCode=0)),g}function Xb(a,b,c){var d=Yc("'"+c+"'",Ub(a),function(b){return Tb(a,b,!0)});return d&&(oe(b),$(a)),d}function Zb(a){var c=this;if(c.state.focused||_b(c),b&&27==a.keyCode&&(a.returnValue=!1),!c.options.onKeyEvent||!c.options.onKeyEvent(c,ne(a))){var d=a.keyCode;c.doc.sel.shift=16==d||a.shiftKey;var e=Wb(c,a);h&&(Yb=e?d:null,!e&&88==d&&!df&&(p?a.metaKey:a.ctrlKey)&&c.replaceSelection(""))}}function $b(a){var b=this;if(!b.options.onKeyEvent||!b.options.onKeyEvent(b,ne(a))){var c=a.keyCode,d=a.charCode;if(h&&c==Yb)return Yb=null,oe(a),void 0;if(!(h&&(!a.which||10>a.which)||j)||!Wb(b,a)){var e=String.fromCharCode(null==d?c:d);this.options.electricChars&&this.doc.mode.electricChars&&this.options.smartIndent&&!Eb(this)&&this.doc.mode.electricChars.indexOf(e)>-1&&setTimeout(vb(b,function(){Fc(b,b.doc.sel.to.line,"smart")}),75),Xb(b,a,e)||Ab(b)}}}function _b(a){"nocursor"!=a.options.readOnly&&(a.state.focused||(ve(a,"focus",a),a.state.focused=!0,-1==a.display.wrapper.className.search(/\bCodeMirror-focused\b/)&&(a.display.wrapper.className+=" CodeMirror-focused"),Cb(a,!0)),zb(a),$(a))}function ac(a){a.state.focused&&(ve(a,"blur",a),a.state.focused=!1,a.display.wrapper.className=a.display.wrapper.className.replace(" CodeMirror-focused","")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.doc.sel.shift=!1)},150)}function cc(a,c){function k(){if(e.inputDiv.style.position="relative",e.input.style.cssText=j,d&&(e.scrollbarV.scrollTop=e.scroller.scrollTop=i),zb(a),null!=e.input.selectionStart&&(!b||d)){clearTimeout(bc);var c=e.input.value=" "+(pc(f.from,f.to)?"":e.input.value),g=0;e.prevInput=" ",e.input.selectionStart=1,e.input.selectionEnd=c.length;var h=function(){" "==e.prevInput&&0==e.input.selectionStart?vb(a,Vc.selectAll)(a):10>g++?bc=setTimeout(h,500):Cb(a)};bc=setTimeout(h,200)}}var e=a.display,f=a.doc.sel;if(!Gb(e,c)){var g=Hb(a,c),i=e.scroller.scrollTop;if(g&&!h){(pc(f.from,f.to)||qc(g,f.from)||!qc(g,f.to))&&vb(a,yc)(a.doc,g,g);var j=e.input.style.cssText;if(e.inputDiv.style.position="absolute",e.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(c.clientY-5)+"px; left: "+(c.clientX-5)+"px; z-index: 1000; background: white; outline: none;"+"border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);",Db(a),Cb(a,!0),pc(f.from,f.to)&&(e.input.value=e.prevInput=" "),t){qe(c);var l=function(){ue(window,"mouseup",l),setTimeout(k,20)};te(window,"mouseup",l)}else setTimeout(k,50)}}}function dc(a){return oc(a.from.line+a.text.length-1,He(a.text).length+(1==a.text.length?a.from.ch:0))}function ec(a,b,c){if(!qc(b.from,c))return tc(a,c);var d=b.text.length-1-(b.to.line-b.from.line);if(c.line>b.to.line+d){var e=c.line-d,f=a.first+a.size-1;return e>f?oc(f,Wd(a,f).text.length):uc(c,Wd(a,e).text.length)}if(c.line==b.to.line+d)return uc(c,He(b.text).length+(1==b.text.length?b.from.ch:0)+Wd(a,b.to.line).text.length-b.to.ch);var g=c.line-b.from.line;return uc(c,b.text[g].length+(g?0:b.from.ch))}function fc(a,b,c){if(c&&"object"==typeof c)return{anchor:ec(a,b,c.anchor),head:ec(a,b,c.head)};if("start"==c)return{anchor:b.from,head:b.from};var d=dc(b);if("around"==c)return{anchor:b.from,head:d};if("end"==c)return{anchor:d,head:d};var e=function(a){if(qc(a,b.from))return a;if(!qc(b.to,a))return d;var c=a.line+b.text.length-(b.to.line-b.from.line)-1,e=a.ch;return a.line==b.to.line&&(e+=d.ch-b.to.ch),oc(c,e)};return{anchor:e(a.sel.anchor),head:e(a.sel.head)}}function gc(a,b){var c={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,update:function(b,c,d,e){b&&(this.from=tc(a,b)),c&&(this.to=tc(a,c)),d&&(this.text=d),void 0!==e&&(this.origin=e)},cancel:function(){this.canceled=!0}};return ve(a,"beforeChange",a,c),a.cm&&ve(a.cm,"beforeChange",a.cm,c),c.canceled?null:{from:c.from,to:c.to,text:c.text,origin:c.origin}}function hc(a,b,c,d){if(a.cm){if(!a.cm.curOp)return vb(a.cm,hc)(a,b,c,d);if(a.cm.state.suppressEdits)return}if(!(Ae(a,"beforeChange")||a.cm&&Ae(a.cm,"beforeChange"))||(b=gc(a,b))){var e=u&&!d&&ld(a,b.from,b.to);if(e){for(var f=e.length-1;f>=1;--f)ic(a,{from:e[f].from,to:e[f].to,text:[""]});e.length&&ic(a,{from:e[0].from,to:e[0].to,text:b.text},c)}else ic(a,b,c)}}function ic(a,b,c){var d=fc(a,b,c);fe(a,b,d,a.cm?a.cm.curOp.id:0/0),lc(a,b,d,jd(a,b));var e=[];Ud(a,function(a,c){c||-1!=Je(e,a.history)||(le(a.history,b),e.push(a.history)),lc(a,b,null,jd(a,b))})}function jc(a,b){var c=a.history,d=("undo"==b?c.done:c.undone).pop();if(d){c.dirtyCounter+="undo"==b?-1:1;var e={changes:[],anchorBefore:d.anchorAfter,headBefore:d.headAfter,anchorAfter:d.anchorBefore,headAfter:d.headBefore};("undo"==b?c.undone:c.done).push(e);for(var f=d.changes.length-1;f>=0;--f){var g=d.changes[f];g.origin=b,e.changes.push(ee(a,g));var h=f?fc(a,g,null):{anchor:d.anchorBefore,head:d.headBefore};lc(a,g,h,kd(a,g));var i=[];Ud(a,function(a,b){b||-1!=Je(i,a.history)||(le(a.history,g),i.push(a.history)),lc(a,g,null,kd(a,g))})}}}function kc(a,b){function c(a){return oc(a.line+b,a.ch)}a.first+=b,a.cm&&yb(a.cm,a.first,a.first,b),a.sel.head=c(a.sel.head),a.sel.anchor=c(a.sel.anchor),a.sel.from=c(a.sel.from),a.sel.to=c(a.sel.to)}function lc(a,b,c,d){if(a.cm&&!a.cm.curOp)return vb(a.cm,lc)(a,b,c,d);if(b.to.line<a.first)return kc(a,b.text.length-1-(b.to.line-b.from.line)),void 0;if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);kc(a,e),b={from:oc(a.first,0),to:oc(b.to.line+e,b.to.ch),text:[He(b.text)],origin:b.origin}}var f=a.lastLine();b.to.line>f&&(b={from:b.from,to:oc(f,Wd(a,f).text.length),text:[b.text[0]],origin:b.origin}),c||(c=fc(a,b,null)),a.cm?mc(a.cm,b,d,c):Nd(a,b,d,c)}}function mc(a,b,c,d){var e=a.doc,f=a.display,g=b.from,h=b.to,i=!1,j=g.line;a.options.lineWrapping||(j=$d(pd(e,Wd(e,g.line))),e.iter(j,h.line+1,function(a){return a==f.maxLine?(i=!0,!0):void 0})),Nd(e,b,c,d,A(a)),a.options.lineWrapping||(e.iter(j,g.line+b.text.length,function(a){var b=G(e,a);b>f.maxLineLength&&(f.maxLine=a,f.maxLineLength=b,f.maxLineChanged=!0,i=!1)}),i&&(a.curOp.updateMaxLine=!0)),e.frontier=Math.min(e.frontier,g.line),_(a,400);var k=b.text.length-(h.line-g.line)-1;if(yb(a,g.line,h.line+1,k),Ae(a,"change")){var l={from:g,to:h,text:b.text,origin:b.origin};if(a.curOp.textChanged){for(var m=a.curOp.textChanged;m.next;m=m.next);m.next=l}else a.curOp.textChanged=l}}function nc(a,b,c,d,e){if(d||(d=c),qc(d,c)){var f=d;d=c,c=f}"string"==typeof b&&(b=bf(b)),hc(a,{from:c,to:d,text:b,origin:e},null)}function oc(a,b){return this instanceof oc?(this.line=a,this.ch=b,void 0):new oc(a,b)}function pc(a,b){return a.line==b.line&&a.ch==b.ch}function qc(a,b){return a.line<b.line||a.line==b.line&&a.ch<b.ch}function rc(a){return oc(a.line,a.ch)}function sc(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function tc(a,b){if(b.line<a.first)return oc(a.first,0);var c=a.first+a.size-1;return b.line>c?oc(c,Wd(a,c).text.length):uc(b,Wd(a,b.line).text.length)}function uc(a,b){var c=a.ch;return null==c||c>b?oc(a.line,b):0>c?oc(a.line,0):a}function vc(a,b){return b>=a.first&&a.first+a.size>b}function wc(a,b,c,d){if(a.sel.shift||a.sel.extend){var e=a.sel.anchor;if(c){var f=qc(b,e);f!=qc(c,e)?(e=b,b=c):f!=qc(b,c)&&(b=c)}yc(a,e,b,d)}else yc(a,b,c||b,d);a.cm&&(a.cm.curOp.userSelChange=!0)}function xc(a,b,c){var d={anchor:b,head:c};return ve(a,"beforeSelectionChange",a,d),a.cm&&ve(a.cm,"beforeSelectionChange",a.cm,d),d.anchor=tc(a,d.anchor),d.head=tc(a,d.head),d}function yc(a,b,c,d,e){if(!e&&Ae(a,"beforeSelectionChange")||a.cm&&Ae(a.cm,"beforeSelectionChange")){var f=xc(a,b,c);c=f.head,b=f.anchor}var g=a.sel;if(g.goalColumn=null,(e||!pc(b,g.anchor))&&(b=Ac(a,b,d,"push"!=e)),(e||!pc(c,g.head))&&(c=Ac(a,c,d,"push"!=e)),!pc(g.anchor,b)||!pc(g.head,c)){g.anchor=b,g.head=c;var h=qc(c,b);g.from=h?c:b,g.to=h?b:c,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0),ye(a,"cursorActivity",a)}}function zc(a){yc(a.doc,a.doc.sel.from,a.doc.sel.to,null,"push")}function Ac(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var i,h=Wd(a,f.line);if(h.markedSpans){for(var j=0;h.markedSpans.length>j;++j){var k=h.markedSpans[j],l=k.marker;if((null==k.from||(l.inclusiveLeft?k.from<=f.ch:k.from<f.ch))&&(null==k.to||(l.inclusiveRight?k.to>=f.ch:k.to>f.ch))){if(d&&l.clearOnEnter){(i||(i=[])).push(l);continue}if(!l.atomic)continue;var m=l.find()[0>g?"from":"to"];if(pc(m,f)&&(m.ch+=g,0>m.ch?m=m.line>a.first?tc(a,oc(m.line-1)):null:m.ch>h.text.length&&(m=m.line<a.first+a.size-1?oc(m.line+1,0):null),!m)){if(e)return d?(a.cantEdit=!0,oc(a.first,0)):Ac(a,b,c,!0);e=!0,m=b,g=-g}f=m;continue a}}if(i)for(var j=0;i.length>j;++j)i[j].clear()}return f}}function Bc(a){var b=Cc(a,a.doc.sel.head);if(a.state.focused){var c=a.display,d=We(c.sizer),e=null;if(0>b.top+d.top?e=!0:b.bottom+d.top>(window.innerHeight||document.documentElement.clientHeight)&&(e=!1),null!=e&&!m){var f="none"==c.cursor.style.display;f&&(c.cursor.style.display="",c.cursor.style.left=b.left+"px",c.cursor.style.top=b.top-c.viewOffset+"px"),c.cursor.scrollIntoView(e),f&&(c.cursor.style.display="none")}}}function Cc(a,b){for(;;){var c=!1,d=lb(a,b),e=Ec(a,d.left,d.top,d.left,d.bottom),f=a.doc.scrollTop,g=a.doc.scrollLeft;if(null!=e.scrollTop&&(Ob(a,e.scrollTop),Math.abs(a.doc.scrollTop-f)>1&&(c=!0)),null!=e.scrollLeft&&(Pb(a,e.scrollLeft),Math.abs(a.doc.scrollLeft-g)>1&&(c=!0)),!c)return d}}function Dc(a,b,c,d,e){var f=Ec(a,b,c,d,e);null!=f.scrollTop&&Ob(a,f.scrollTop),null!=f.scrollLeft&&Pb(a,f.scrollLeft)}function Ec(a,b,c,d,e){var f=a.display,g=db(f);c+=g,e+=g;var h=f.scroller.clientHeight-Be,i=f.scroller.scrollTop,j={},k=a.doc.height+2*g,l=g+10>c,m=e+g>k-10;i>c?j.scrollTop=l?0:Math.max(0,c):e>i+h&&(j.scrollTop=(m?k:e)-h);var n=f.scroller.clientWidth-Be,o=f.scroller.scrollLeft;b+=f.gutters.offsetWidth,d+=f.gutters.offsetWidth;var p=f.gutters.offsetWidth,q=p+10>b;return o+p>b||q?(q&&(b=0),j.scrollLeft=Math.max(0,b-10-p)):d>n+o-3&&(j.scrollLeft=d+10-n),j}function Fc(a,b,c,d){var e=a.doc;if(c||(c="add"),"smart"==c)if(a.doc.mode.indent)var f=cb(a,b);else c="prev";var k,g=a.options.tabSize,h=Wd(e,b),i=Ee(h.text,null,g),j=h.text.match(/^\s*/)[0];if("smart"==c&&(k=a.doc.mode.indent(f,h.text.slice(j.length),h.text),k==Ce)){if(!d)return;c="prev"}"prev"==c?k=b>e.first?Ee(Wd(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c&&(k=i-a.options.indentUnit),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+="	";k>m&&(l+=Ge(k-m)),l!=j&&nc(a.doc,l,oc(b,0),oc(b,j.length),"+input"),h.stateAfter=null}function Gc(a,b,c){var d=b,e=b,f=a.doc;return"number"==typeof b?e=Wd(f,sc(f,b)):d=$d(b),null==d?null:c(e,d)?(yb(a,d,d+1),e):null}function Hc(a,b,c,d,e){function j(){var b=f+c;return a.first>b||b>=a.first+a.size?i=!1:(f=b,h=Wd(a,b))}function k(a){var b=(e?nf:of)(h,g,c,!0);if(null==b){if(a||!j())return i=!1;g=e?(0>c?kf:jf)(h):0>c?h.text.length:0}else g=b;return!0}var f=b.line,g=b.ch,h=Wd(a,f),i=!0;if("char"==d)k();else if("column"==d)k(!0);else if("word"==d)for(var l=!1;!(0>c)||k();){if(Pe(h.text.charAt(g)))l=!0;else if(l){0>c&&(c=1,k());break}if(c>0&&!k())break}var m=Ac(a,oc(f,g),c,!0);return i||(m.hitSide=!0),m}function Ic(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}else"line"==d&&(g=c>0?b.bottom+3:b.top-3);for(;;){var i=nb(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 Jc(a,b){var c=b.ch,d=b.ch;if(a){b.after===!1||d==a.length?--c:++d;for(var e=a.charAt(c),f=Pe(e)?Pe:/\s/.test(e)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!Pe(a)};c>0&&f(a.charAt(c-1));)--c;for(;a.length>d&&f(a.charAt(d));)++d}return{from:oc(b.line,c),to:oc(b.line,d)}}function Kc(a,b){wc(a.doc,oc(b,0),tc(a.doc,oc(b+1,0)))}function Nc(a,b,c,d){w.defaults[a]=b,c&&(Lc[a]=d?function(a,b,d){d!=Oc&&c(a,b,d)}:c)}function Tc(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}function Uc(a,b,c){return a.startState?a.startState(b,c):!0}function Xc(a){return"string"==typeof a?Wc[a]:a}function Yc(a,b,c){function d(b){b=Xc(b);var e=b[a];if(e===!1)return"stop";if(null!=e&&c(e))return!0;if(b.nofallthrough)return"stop";var f=b.fallthrough;if(null==f)return!1;if("[object Array]"!=Object.prototype.toString.call(f))return d(f);for(var g=0,h=f.length;h>g;++g){var i=d(f[g]);if(i)return i}return!1}for(var e=0;b.length>e;++e){var f=d(b[e]);if(f)return f}}function Zc(a){var b=ef[a.keyCode];return"Ctrl"==b||"Alt"==b||"Shift"==b||"Mod"==b}function $c(a,b){var c=ef[a.keyCode];return null==c||a.altGraphKey?!1:(a.altKey&&(c="Alt-"+c),(s?a.metaKey:a.ctrlKey)&&(c="Ctrl-"+c),(s?a.ctrlKey:a.metaKey)&&(c="Cmd-"+c),!b&&a.shiftKey&&(c="Shift-"+c),c)}function _c(a,b){this.pos=this.start=0,this.string=a,this.tabSize=b||8}function ad(a,b){this.lines=[],this.type=b,this.doc=a}function bd(a,b,c,d,e){if(d&&d.shared)return dd(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return vb(a.cm,bd)(a,b,c,d,e);var f=new ad(a,e);if("range"==e&&!qc(b,c))return f;d&&Le(d,f),f.replacedWith&&(f.collapsed=!0,f.replacedWith=Se("span",[f.replacedWith],"CodeMirror-widget")),f.collapsed&&(v=!0);var i,j,l,g=b.line,h=0,k=a.cm;if(a.iter(g,c.line+1,function(d){k&&f.collapsed&&!k.options.lineWrapping&&pd(a,d)==k.display.maxLine&&(l=!0);var e={from:null,to:null,marker:f};h+=d.text.length,g==b.line&&(e.from=b.ch,h-=b.ch),g==c.line&&(e.to=c.ch,h-=d.text.length-c.ch),f.collapsed&&(g==c.line&&(j=md(d,c.ch)),g==b.line?i=md(d,b.ch):Zd(d,0)),gd(d,e),++g}),f.collapsed&&a.iter(b.line,c.line+1,function(b){qd(a,b)&&Zd(b,0)}),f.readOnly&&(u=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory()),f.collapsed){if(i!=j)throw Error("Inserting collapsed marker overlapping an existing one");f.size=h,f.atomic=!0}return k&&(l&&(k.curOp.updateMaxLine=!0),(f.className||f.startStyle||f.endStyle||f.collapsed)&&yb(k,b.line,c.line+1),f.atomic&&zc(k)),f}function cd(a,b){this.markers=a,this.primary=b;for(var c=0,d=this;a.length>c;++c)a[c].parent=this,te(a[c],"clear",function(){d.clear()})}function dd(a,b,c,d,e){d=Le(d),d.shared=!1;var f=[bd(a,b,c,d,e)],g=f[0];return Ud(a,function(a){f.push(bd(a,tc(a,b),tc(a,c),d,e));for(var h=0;a.linked.length>h;++h)if(a.linked[h].isParent)return;g=He(f)}),new cd(f,g)}function ed(a,b){if(a)for(var c=0;a.length>c;++c){var d=a[c];if(d.marker==b)return d}}function fd(a,b){for(var c,d=0;a.length>d;++d)a[d]!=b&&(c||(c=[])).push(a[d]);return c}function gd(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[b],b.marker.attachLine(a)}function hd(a,b,c){if(a)for(var e,d=0;a.length>d;++d){var f=a[d],g=f.marker,h=null==f.from||(g.inclusiveLeft?b>=f.from:b>f.from);if(h||"bookmark"==g.type&&f.from==b&&(!c||!f.marker.insertLeft)){var i=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);(e||(e=[])).push({from:f.from,to:i?null:f.to,marker:g})}}return e}function id(a,b,c){if(a)for(var e,d=0;a.length>d;++d){var f=a[d],g=f.marker,h=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);if(h||"bookmark"==g.type&&f.from==b&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?b>=f.from:b>f.from);(e||(e=[])).push({from:i?null:f.from-b,to:null==f.to?null:f.to-b,marker:g})}}return e}function jd(a,b){var c=vc(a,b.from.line)&&Wd(a,b.from.line).markedSpans,d=vc(a,b.to.line)&&Wd(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=pc(b.from,b.to),h=hd(c,e,g),i=id(d,f,g),j=1==b.text.length,k=He(b.text).length+(j?e:0);if(h)for(var l=0;h.length>l;++l){var m=h[l];if(null==m.to){var n=ed(i,m.marker);n?j&&(m.to=null==n.to?null:n.to+k):m.to=e}}if(i)for(var l=0;i.length>l;++l){var m=i[l];if(null!=m.to&&(m.to+=k),null==m.from){var n=ed(h,m.marker);n||(m.from=k,j&&(h||(h=[])).push(m))}else m.from+=k,j&&(h||(h=[])).push(m)}var o=[h];if(!j){var q,p=b.text.length-2;if(p>0&&h)for(var l=0;h.length>l;++l)null==h[l].to&&(q||(q=[])).push({from:null,to:null,marker:h[l].marker});for(var l=0;p>l;++l)o.push(q);o.push(i)}return o}function kd(a,b){var c=he(a,b),d=jd(a,b);if(!c)return d;if(!d)return c;for(var e=0;c.length>e;++e){var f=c[e],g=d[e];if(f&&g)a:for(var h=0;g.length>h;++h){for(var i=g[h],j=0;f.length>j;++j)if(f[j].marker==i.marker)continue a;f.push(i)}else g&&(c[e]=g)}return c}function ld(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;a.markedSpans.length>b;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=Je(d,c)||(d||(d=[])).push(c)}}),!d)return null;for(var e=[{from:b,to:c}],f=0;d.length>f;++f)for(var g=d[f],h=g.find(),i=0;e.length>i;++i){var j=e[i];if(!qc(j.to,h.from)&&!qc(h.to,j.from)){var k=[i,1];(qc(j.from,h.from)||!g.inclusiveLeft&&pc(j.from,h.from))&&k.push({from:j.from,to:h.from}),(qc(h.to,j.to)||!g.inclusiveRight&&pc(j.to,h.to))&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-1}}return e}function md(a,b){var d,c=v&&a.markedSpans;if(c)for(var e,f=0;c.length>f;++f)e=c[f],e.marker.collapsed&&(null==e.from||b>e.from)&&(null==e.to||e.to>b)&&(!d||d.width<e.marker.width)&&(d=e.marker);return d}function nd(a){return md(a,-1)}function od(a){return md(a,a.text.length+1)}function pd(a,b){for(var c;c=nd(b);)b=Wd(a,c.find().from.line);return b}function qd(a,b){var c=v&&b.markedSpans;if(c)for(var d,e=0;c.length>e;++e)if(d=c[e],d.marker.collapsed){if(null==d.from)return!0;if(0==d.from&&d.marker.inclusiveLeft&&rd(a,b,d))return!0}}function rd(a,b,c){if(null==c.to){var d=c.marker.find().to,e=Wd(a,d.line);return rd(a,e,ed(e.markedSpans,c.marker))}if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var f,g=0;b.markedSpans.length>g;++g)if(f=b.markedSpans[g],f.marker.collapsed&&f.from==c.to&&(f.marker.inclusiveLeft||c.marker.inclusiveRight)&&rd(a,b,f))return!0}function sd(a){var b=a.markedSpans;if(b){for(var c=0;b.length>c;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function td(a,b){if(b){for(var c=0;b.length>c;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function vd(a){return function(){var b=!this.cm.curOp;b&&tb(this.cm);try{var c=a.apply(this,arguments)}finally{b&&ub(this.cm)}return c}}function wd(a){return null!=a.height?a.height:(a.node.parentNode&&1==a.node.parentNode.nodeType||Ue(a.cm.display.measure,Se("div",[a.node],null,"position: relative")),a.height=a.node.offsetHeight)}function xd(a,b,c,d){var e=new ud(a,c,d);return e.noHScroll&&(a.display.alignWidgets=!0),Gc(a,b,function(b){if((b.widgets||(b.widgets=[])).push(e),e.line=b,!qd(a.doc,b)||e.showIfHidden){var c=ae(a,b)<a.display.scroller.scrollTop;Zd(b,b.height+wd(e)),c&&(a.curOp.updateScrollPos={scrollTop:a.doc.scrollTop+e.height,scrollLeft:a.doc.scrollLeft})}return!0}),e}function yd(a,b,c){var d={text:a};return td(d,b),d.height=c?c(d):1,d}function zd(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null),null!=a.order&&(a.order=null),sd(a),td(a,c);var e=d?d(a):1;e!=a.height&&Zd(a,e),ye(a,"change")}function Ad(a){a.parent=null,sd(a)}function Bd(a,b,c,d,e){var f=a.options.flattenSpans,g="",h=null,i=new _c(b,a.options.tabSize);for(""==b&&c.blankLine&&c.blankLine(d);!i.eol();){var j=c.token(i,d);i.pos>5e3&&(f=!1,i.pos=Math.min(b.length,i.start+5e4),j=null);var k=i.current();i.start=i.pos,f&&h==j?g+=k:(g&&e(g,h),g=k,h=j)}g&&e(g,h)}function Cd(a,b,c){var d=[a.state.modeGen];Bd(a,b.text,a.doc.mode,c,function(a,b){d.push(a,b)});for(var e=0;a.state.overlays.length>e;++e){var f=a.state.overlays[e],g=1;Bd(a,b.text,f.mode,!0,function(a,b){for(var c=g,e=a.length;e;){var h=d[g],i=h.length;e>=i?e-=i:(d.splice(g,1,h.slice(0,e),d[g+1],h.slice(e)),e=0),g+=2}if(b)if(f.opaque)d.splice(c,g-c,a,b),g=c+2;else for(;g>c;c+=2){var h=d[c+1];d[c+1]=h?h+" "+b:b}})}return d}function Dd(a,b){return b.styles&&b.styles[0]==a.state.modeGen||(b.styles=Cd(a,b,b.stateAfter=cb(a,$d(b)))),b.styles}function Ed(a,b,c){var d=a.doc.mode,e=new _c(b.text,a.options.tabSize);for(""==b.text&&d.blankLine&&d.blankLine(c);!e.eol()&&5e3>=e.pos;)d.token(e,c),e.start=e.pos}function Gd(a){return a?Fd[a]||(Fd[a]="cm-"+a.replace(/ +/g," cm-")):null}function Hd(a,c,d){for(var e,g,h,f=c,i=!0;e=nd(f);)i=!1,f=Wd(a.doc,e.find().from.line),g||(g=f);var j={pre:Se("pre"),col:0,pos:0,display:!d,measure:null,addedOne:!1,cm:a};f.textClass&&(j.pre.className=f.textClass);do{j.measure=f==c&&d,j.pos=0,j.addToken=j.measure?Kd:Jd,d&&h&&f!=c&&!j.addedOne&&(d[0]=j.pre.appendChild(af(a.display.measure)),j.addedOne=!0);var k=Md(f,j,Dd(a,f));h=f==g,k&&(f=Wd(a.doc,k.to.line),i=!1)}while(k);d&&!j.addedOne&&(d[0]=j.pre.appendChild(i?Se("span","\u00a0"):af(a.display.measure))),j.pre.firstChild||qd(a.doc,c)||j.pre.appendChild(document.createTextNode("\u00a0"));var l;if(d&&b&&(l=be(f))){var m=l.length-1;l[m].from==l[m].to&&--m;var n=l[m],o=l[m-1];if(n.from+1==n.to&&o&&n.level<o.level){var p=d[j.pos-1];p&&p.parentNode.insertBefore(p.measureRight=af(a.display.measure),p.nextSibling)}}return j.pre}function Jd(a,b,c,d,e){if(b){if(Id.test(b))for(var f=document.createDocumentFragment(),g=0;;){Id.lastIndex=g;var h=Id.exec(b),i=h?h.index-g:b.length-g;if(i&&(f.appendChild(document.createTextNode(b.slice(g,g+i))),a.col+=i),!h)break;if(g+=i+1,"	"==h[0]){var j=a.cm.options.tabSize,k=j-a.col%j;f.appendChild(Se("span",Ge(k),"cm-tab")),a.col+=k}else{var l=Se("span","\u2022","cm-invalidchar");l.title="\\u"+h[0].charCodeAt(0).toString(16),f.appendChild(l),a.col+=1}}else{a.col+=b.length;var f=document.createTextNode(b)}if(c||d||e||a.measure){var m=c||"";return d&&(m+=d),e&&(m+=e),a.pre.appendChild(Se("span",[f],m))}a.pre.appendChild(f)}}function Kd(a,b,c,d,e){for(var f=0;b.length>f;++f){var g=b.charAt(f),h=0==f;g>="\ud800"&&"\udbff">g&&b.length-1>f?(g=b.slice(f,f+2),++f):f&&a.cm.options.lineWrapping&&Ye.test(b.slice(f-1,f+1))&&a.pre.appendChild(Se("wbr")),a.measure[a.pos]=Jd(a,g,c,h&&d,f==b.length-1&&e),a.pos+=g.length}b.length&&(a.addedOne=!0)}function Ld(a,b,c){c&&(a.display||(c=c.cloneNode(!0)),a.pre.appendChild(c),a.measure&&b&&(a.measure[a.pos]=c,a.addedOne=!0)),a.pos+=b}function Md(a,b,c){var d=a.markedSpans;if(d)for(var j,l,m,n,o,f=a.text,g=f.length,h=0,e=1,i="",k=0;;){if(k==h){l=m=n="",o=null,k=1/0;for(var p=null,q=0;d.length>q;++q){var r=d[q],s=r.marker;h>=r.from&&(null==r.to||r.to>h)?(null!=r.to&&k>r.to&&(k=r.to,m=""),s.className&&(l+=" "+s.className),s.startStyle&&r.from==h&&(n+=" "+s.startStyle),s.endStyle&&r.to==k&&(m+=" "+s.endStyle),s.collapsed&&(!o||o.marker.width<s.width)&&(o=r)):r.from>h&&k>r.from&&(k=r.from),"bookmark"==s.type&&r.from==h&&s.replacedWith&&(p=s.replacedWith)}if(o&&(o.from||0)==h&&(Ld(b,(null==o.to?g:o.to)-h,null!=o.from&&o.marker.replacedWith),null==o.to))return o.marker.find();p&&!o&&Ld(b,0,p)}if(h>=g)break;for(var t=Math.min(g,k);;){if(i){var u=h+i.length;if(!o){var v=u>t?i.slice(0,t-h):i;b.addToken(b,v,j?j+l:l,n,h+v.length==k?m:"")}if(u>=t){i=i.slice(t-h),h=t;break}h=u,n=""}i=c[e++],j=Gd(c[e++])}}else for(var e=1;c.length>e;e+=2)b.addToken(b,c[e],Gd(c[e+1]))}function Nd(a,b,c,d,e){function f(a){return c?c[a]:null}var g=b.from,h=b.to,i=b.text,j=Wd(a,g.line),k=Wd(a,h.line),l=He(i),m=f(i.length-1),n=h.line-g.line;if(0==g.ch&&0==h.ch&&""==l){for(var o=0,p=i.length-1,q=[];p>o;++o)q.push(yd(i[o],f(o),e));zd(k,k.text,m,e),n&&a.remove(g.line,n),q.length&&a.insert(g.line,q)}else if(j==k)if(1==i.length)zd(j,j.text.slice(0,g.ch)+l+j.text.slice(h.ch),m,e);else{for(var q=[],o=1,p=i.length-1;p>o;++o)q.push(yd(i[o],f(o),e));q.push(yd(l+j.text.slice(h.ch),m,e)),zd(j,j.text.slice(0,g.ch)+i[0],f(0),e),a.insert(g.line+1,q)}else if(1==i.length)zd(j,j.text.slice(0,g.ch)+i[0]+k.text.slice(h.ch),f(0),e),a.remove(g.line+1,n);else{zd(j,j.text.slice(0,g.ch)+i[0],f(0),e),zd(k,l+k.text.slice(h.ch),m,e);for(var o=1,p=i.length-1,q=[];p>o;++o)q.push(yd(i[o],f(o),e));n>1&&a.remove(g.line+1,n-1),a.insert(g.line+1,q)}ye(a,"change",a,b),yc(a,d.anchor,d.head,null,!0)}function Od(a){this.lines=a,this.parent=null;for(var b=0,c=a.length,d=0;c>b;++b)a[b].parent=this,d+=a[b].height;this.height=d}function Pd(a){this.children=a;for(var b=0,c=0,d=0,e=a.length;e>d;++d){var f=a[d];b+=f.chunkSize(),c+=f.height,f.parent=this}this.size=b,this.height=c,this.parent=null}function Ud(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;a.linked.length>g;++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 Vd(a,b){if(b.cm)throw Error("This document is already in use.");a.doc=b,b.cm=a,B(a),y(a),a.options.lineWrapping||H(a),a.options.mode=b.modeOption,yb(a)}function Wd(a,b){for(b-=a.first;!a.lines;)for(var c=0;;++c){var d=a.children[c],e=d.chunkSize();if(e>b){a=d;break}b-=e}return a.lines[b]}function Xd(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 Yd(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)}),d}function Zd(a,b){for(var c=b-a.height,d=a;d;d=d.parent)d.height+=c}function $d(a){if(null==a.parent)return null;for(var b=a.parent,c=Je(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 _d(a,b){var c=a.first;a:do{for(var d=0,e=a.children.length;e>d;++d){var f=a.children[d],g=f.height;if(g>b){a=f;continue a}b-=g,c+=f.chunkSize()}return c}while(!a.lines);for(var d=0,e=a.lines.length;e>d;++d){var h=a.lines[d],i=h.height;if(i>b)break;b-=i}return c+d}function ae(a,b){b=pd(a.doc,b);for(var c=0,d=b.parent,e=0;d.lines.length>e;++e){var f=d.lines[e];if(f==b)break;c+=f.height}for(var g=d.parent;g;d=g,g=d.parent)for(var e=0;g.children.length>e;++e){var h=g.children[e];if(h==d)break;c+=h.height}return c}function be(a){var b=a.order;return null==b&&(b=a.order=pf(a.text)),b}function ce(){return{done:[],undone:[],undoDepth:1/0,lastTime:0,lastOp:null,lastOrigin:null,dirtyCounter:0}}function de(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 ee(a,b){var c={from:b.from,to:dc(b),text:Xd(a,b.from,b.to)};return de(a,c,b.from.line,b.to.line+1),Ud(a,function(a){de(a,c,b.from.line,b.to.line+1)},!0),c}function fe(a,b,c,d){var e=a.history;e.undone.length=0;var f=+new Date,g=He(e.done);if(g&&(e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&e.lastTime>f-600||"*"==b.origin.charAt(0)))){var h=He(g.changes);pc(b.from,b.to)&&pc(b.from,h.to)?h.to=dc(b):g.changes.push(ee(a,b)),g.anchorAfter=c.anchor,g.headAfter=c.head}else{for(g={changes:[ee(a,b)],anchorBefore:a.sel.anchor,headBefore:a.sel.head,anchorAfter:c.anchor,headAfter:c.head},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift();0>e.dirtyCounter?e.dirtyCounter=0/0:e.dirtyCounter++}e.lastTime=f,e.lastOp=d,e.lastOrigin=b.origin}function ge(a){if(!a)return null;for(var c,b=0;a.length>b;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);return c?c.length?c:null:a}function he(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=0,e=[];b.text.length>d;++d)e.push(ge(c[d]));return e}function ie(a,b){for(var c=0,d=[];a.length>c;++c){var e=a[c],f=e.changes,g=[];d.push({changes:g,anchorBefore:e.anchorBefore,headBefore:e.headBefore,anchorAfter:e.anchorAfter,headAfter:e.headAfter});for(var h=0;f.length>h;++h){var j,i=f[h];if(g.push({from:i.from,to:i.to,text:i.text}),b)for(var k in i)(j=k.match(/^spans_(\d+)$/))&&Je(b,Number(j[1]))>-1&&(He(g)[k]=i[k],delete i[k])}}return d}function je(a,b,c,d){a.line>c?a.line+=d:a.line>b&&(a.line=b,a.ch=0)}function ke(a,b,c,d){for(var e=0;a.length>e;++e){for(var f=a[e],g=!0,h=0;f.changes.length>h;++h){var i=f.changes[h];if(f.copied||(i.from=rc(i.from),i.to=rc(i.to)),i.from.line>c)i.from.line+=d,i.to.line+=d;else if(i.to.line>=b){g=!1;break}}f.copied||(f.anchorBefore=rc(f.anchorBefore),f.headBefore=rc(f.headBefore),f.anchorAfter=rc(f.anchorAfter),f.readAfter=rc(f.headAfter),f.copied=!0),g?(je(f.anchorBefore),je(f.headBefore),je(f.anchorAfter),je(f.headAfter)):(a.splice(0,e+1),e=0)}}function le(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;ke(a.done,c,d,e),ke(a.undone,c,d,e)}function me(){qe(this)}function ne(a){return a.stop||(a.stop=me),a}function oe(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function pe(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function qe(a){oe(a),pe(a)}function re(a){return a.target||a.srcElement}function se(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?b=3:4&a.button&&(b=2)),p&&a.ctrlKey&&1==b&&(b=3),b}function te(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)}}function ue(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;d.length>e;++e)if(d[e]==c){d.splice(e,1);break}}}function ve(a,b){var c=a._handlers&&a._handlers[b];if(c)for(var d=Array.prototype.slice.call(arguments,2),e=0;c.length>e;++e)c[e].apply(null,d)}function ye(a,b){function e(a){return function(){a.apply(null,d)}}var c=a._handlers&&a._handlers[b];if(c){var d=Array.prototype.slice.call(arguments,2);we||(++xe,we=[],setTimeout(ze,0));for(var f=0;c.length>f;++f)we.push(e(c[f]))}}function ze(){--xe;var a=we;we=null;for(var b=0;a.length>b;++b)a[b]()}function Ae(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}function De(){this.id=null}function Ee(a,b,c){null==b&&(b=a.search(/[^\s\u00a0]/),-1==b&&(b=a.length));for(var d=0,e=0;b>d;++d)"	"==a.charAt(d)?e+=c-e%c:++e;return e}function Ge(a){for(;a>=Fe.length;)Fe.push(He(Fe)+" ");return Fe[a]}function He(a){return a[a.length-1]}function Ie(a){n?(a.selectionStart=0,a.selectionEnd=a.value.length):a.select()}function Je(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 Ke(a,b){function c(){}c.prototype=a;var d=new c;return b&&Le(b,d),d}function Le(a,b){b||(b={});for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}function Me(a){for(var b=[],c=0;a>c;++c)b.push(void 0);return b}function Ne(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function Pe(a){return/\w/.test(a)||a>"\u0080"&&(a.toUpperCase()!=a.toLowerCase()||Oe.test(a))}function Qe(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;
-return!0}function Se(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)Ve(e,b);else if(b)for(var f=0;b.length>f;++f)e.appendChild(b[f]);return e}function Te(a){if(b)for(;a.firstChild;)a.removeChild(a.firstChild);else a.innerHTML="";return a}function Ue(a,b){return Te(a).appendChild(b)}function Ve(a,b){d?(a.innerHTML="",a.appendChild(document.createTextNode(b))):a.textContent=b}function We(a){return a.getBoundingClientRect()}function $e(a){if(null!=Ze)return Ze;var b=Se("div",null,null,"width: 50px; height: 50px; overflow-x: scroll");return Ue(a,b),b.offsetWidth&&(Ze=b.offsetHeight-b.clientHeight),Ze||0}function af(a){if(null==_e){var b=Se("span","\u200b");Ue(a,Se("span",[b,document.createTextNode("x")])),0!=a.firstChild.offsetHeight&&(_e=1>=b.offsetWidth&&b.offsetHeight>2&&!c)}return _e?Se("span","\u200b"):Se("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px")}function ff(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=0;a.length>e;++e){var f=a[e];(c>f.from&&f.to>b||b==c&&f.to==b)&&d(Math.max(f.from,b),Math.min(f.to,c),1==f.level?"rtl":"ltr")}}function gf(a){return a.level%2?a.to:a.from}function hf(a){return a.level%2?a.from:a.to}function jf(a){var b=be(a);return b?gf(b[0]):0}function kf(a){var b=be(a);return b?hf(He(b)):a.text.length}function lf(a,b){var c=Wd(a.doc,b),d=pd(a.doc,c);d!=c&&(b=$d(d));var e=be(d),f=e?e[0].level%2?kf(d):jf(d):0;return oc(b,f)}function mf(a,b){for(var c,d;c=od(d=Wd(a.doc,b));)b=c.find().to.line;var e=be(d),f=e?e[0].level%2?jf(d):kf(d):d.text.length;return oc(b,f)}function nf(a,b,c,d){var e=be(a);if(!e)return of(a,b,c,d);for(var f=d?function(b,c){do b+=c;while(b>0&&Re.test(a.text.charAt(b)));return b}:function(a,b){return a+b},g=e[0].level,h=0;e.length>h;++h){var i=e[h],j=i.level%2==g;if(b>i.from&&i.to>b||j&&(i.from==b||i.to==b))break}for(var k=f(b,i.level%2?-c:c);null!=k;)if(i.level%2==g){if(!(i.from>k||k>i.to))break;i=e[h+=c],k=i&&(c>0==i.level%2?f(i.to,-1):f(i.from,1))}else if(k==gf(i))i=e[--h],k=i&&hf(i);else{if(k!=hf(i))break;i=e[++h],k=i&&gf(i)}return 0>k||k>a.text.length?null:k}function of(a,b,c,d){var e=b+c;if(d)for(;e>0&&Re.test(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=b&&(null==document.documentMode||8>document.documentMode),d=b&&(null==document.documentMode||9>document.documentMode),e=/WebKit\//.test(navigator.userAgent),f=e&&/Qt\/\d+\.\d+/.test(navigator.userAgent),g=/Chrome\//.test(navigator.userAgent),h=/Opera\//.test(navigator.userAgent),i=/Apple Computer/.test(navigator.vendor),j=/KHTML\//.test(navigator.userAgent),k=/Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent),l=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),m=/PhantomJS/.test(navigator.userAgent),n=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),o=n||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),p=n||/Mac/.test(navigator.platform),q=/windows/i.test(navigator.platform),r=h&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);r&&(r=Number(r[1]));var pb,Ib,Jb,s=p&&(f||h&&(null==r||12.11>r)),t=a||b&&!d,u=!1,v=!1,sb=0,Qb=0,Rb=null;b?Rb=-.53:a?Rb=15:g?Rb=-.7:i&&(Rb=-1/3);var Vb,bc,Yb=null;w.Pos=oc,w.prototype={focus:function(){window.focus(),Db(this),_b(this),Ab(this)},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,Lc.hasOwnProperty(a)&&vb(this,Lc[a])(this,b,d))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a){this.state.keyMaps.push(a)},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;b.length>c;++c)if(("string"==typeof a?b[c].name:b[c])==a)return b.splice(c,1),!0},addOverlay:vb(null,function(a,b){var c=a.token?a:w.getMode(this.options,a);if(c.startState)throw Error("Overlays may not be stateful.");this.state.overlays.push({mode:c,modeSpec:a,opaque:b&&b.opaque}),this.state.modeGen++,yb(this)}),removeOverlay:vb(null,function(a){for(var b=this.state.overlays,c=0;b.length>c;++c)if(b[c].modeSpec==a)return b.splice(c,1),this.state.modeGen++,yb(this),void 0}),indentLine:vb(null,function(a,b,c){"string"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract"),vc(this.doc,a)&&Fc(this,a,b,c)}),indentSelection:vb(null,function(a){var b=this.doc.sel;if(pc(b.from,b.to))return Fc(this,b.from.line,a);for(var c=b.to.line-(b.to.ch?0:1),d=b.from.line;c>=d;++d)Fc(this,d,a)}),getTokenAt:function(a){var b=this.doc;a=tc(b,a);for(var c=cb(this,a.line),d=this.doc.mode,e=Wd(b,a.line),f=new _c(e.text,this.options.tabSize);f.pos<a.ch&&!f.eol();){f.start=f.pos;var g=d.token(f,c)}return{start:f.start,end:f.pos,string:f.current(),className:g||null,type:g||null,state:c}},getStateAfter:function(a){var b=this.doc;return a=sc(b,null==a?b.first+b.size-1:a),cb(this,a+1)},cursorCoords:function(a,b){var c,d=this.doc.sel;return c=null==a?d.head:"object"==typeof a?tc(this.doc,a):a?d.from:d.to,lb(this,c,b||"page")},charCoords:function(a,b){return kb(this,tc(this.doc,a),b||"page")},coordsChar:function(a){var b=We(this.display.lineSpace),c=window.pageYOffset||(document.documentElement||document.body).scrollTop,d=window.pageXOffset||(document.documentElement||document.body).scrollLeft;return nb(this,a.left-b.left-d,a.top-b.top-c)},defaultTextHeight:function(){return qb(this.display)},setGutterMarker:vb(null,function(a,b,c){return Gc(this,a,function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&Qe(d)&&(a.gutterMarkers=null),!0})}),clearGutter:vb(null,function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,yb(b,d,d+1),Qe(c.gutterMarkers)&&(c.gutterMarkers=null)),++d})}),addLineClass:vb(null,function(a,b,c){return Gc(this,a,function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"wrapClass";if(a[d]){if(RegExp("\\b"+c+"\\b").test(a[d]))return!1;a[d]+=" "+c}else a[d]=c;return!0})}),removeLineClass:vb(null,function(a,b,c){return Gc(this,a,function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"wrapClass",e=a[d];if(!e)return!1;if(null==c)a[d]=null;else{var f=e.replace(RegExp("^"+c+"\\b\\s*|\\s*\\b"+c+"\\b"),"");if(f==e)return!1;a[d]=f||null}return!0})}),addLineWidget:vb(null,function(a,b,c){return xd(this,a,b,c)}),removeLineWidget:function(a){a.clear()},lineInfo:function(a){if("number"==typeof a){if(!vc(this.doc,a))return null;var b=a;if(a=Wd(this.doc,a),!a)return null}else{var b=$d(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.showingFrom,to:this.display.showingTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=lb(this,tc(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",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:i>=a.bottom+b.offsetHeight&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+db(f)+"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&&Dc(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},triggerOnKeyDown:vb(null,Zb),execCommand:function(a){return Vc[a](this)},findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);for(var f=0,g=tc(this.doc,a);b>f&&(g=Hc(this.doc,g,e,c,d),!g.hitSide);++f);return g},moveH:vb(null,function(a,b){var d,c=this.doc.sel;d=c.shift||c.extend||pc(c.from,c.to)?Hc(this.doc,c.head,a,b,this.options.rtlMoveVisually):0>a?c.from:c.to,wc(this.doc,d,d,a)}),deleteH:vb(null,function(a,b){var c=this.doc.sel;pc(c.from,c.to)?nc(this.doc,"",c.from,Hc(this.doc,c.head,a,b,!1),"+delete"):nc(this.doc,"",c.from,c.to,"+delete"),this.curOp.userSelChange=!0}),findPosV:function(a,b,c,d){var e=1,f=d;0>b&&(e=-1,b=-b);for(var g=0,h=tc(this.doc,a);b>g;++g){var i=lb(this,h,"div");if(null==f?f=i.left:i.left=f,h=Ic(this,i,e,c),h.hitSide)break}return h},moveV:vb(null,function(a,b){var c=this.doc.sel,d=lb(this,c.head,"div");null!=c.goalColumn&&(d.left=c.goalColumn);var e=Ic(this,d,a,b);"page"==b&&(this.display.scrollbarV.scrollTop+=kb(this,e,"div").top-d.top),wc(this.doc,e,e,a),c.goalColumn=d.left}),toggleOverwrite:function(){(this.state.overwrite=!this.state.overwrite)?this.display.cursor.className+=" CodeMirror-overwrite":this.display.cursor.className=this.display.cursor.className.replace(" CodeMirror-overwrite","")},scrollTo:vb(null,function(a,b){this.curOp.updateScrollPos={scrollLeft:a,scrollTop:b}}),getScrollInfo:function(){var a=this.display.scroller,b=Be;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-b,width:a.scrollWidth-b,clientHeight:a.clientHeight-b,clientWidth:a.clientWidth-b}},scrollIntoView:function(a){"number"==typeof a&&(a=oc(a,0)),a&&null==a.line?Dc(this,a.left,a.top,a.right,a.bottom):(a=a?tc(this.doc,a):this.doc.sel.head,Cc(this,a))},setSize:function(a,b){function c(a){return"number"==typeof a||/^\d+$/.test(a+"")?a+"px":a}null!=a&&(this.display.wrapper.style.width=c(a)),null!=b&&(this.display.wrapper.style.height=c(b)),this.refresh()},on:function(a,b){te(this,a,b)},off:function(a,b){ue(this,a,b)},operation:function(a){return xb(this,a)},refresh:vb(null,function(){ib(this),this.curOp.updateScrollPos={scrollTop:this.doc.scrollTop,scrollLeft:this.doc.scrollLeft},yb(this)}),swapDoc:vb(null,function(a){var b=this.doc;return b.cm=null,Vd(this,a),ib(this),this.curOp.updateScrollPos={scrollTop:a.scrollTop,scrollLeft:a.scrollLeft},b}),getInputField:function(){return this.display.input},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};var Lc=w.optionHandlers={},Mc=w.defaults={},Oc=w.Init={toString:function(){return"CodeMirror.Init"}};Nc("value","",function(a,b){a.setValue(b)},!0),Nc("mode",null,function(a,b){a.doc.modeOption=b,y(a)},!0),Nc("indentUnit",2,y,!0),Nc("indentWithTabs",!1),Nc("smartIndent",!0),Nc("tabSize",4,function(a){y(a),ib(a),yb(a)},!0),Nc("electricChars",!0),Nc("rtlMoveVisually",!q),Nc("theme","default",function(a){D(a),E(a)},!0),Nc("keyMap","default",C),Nc("extraKeys",null),Nc("onKeyEvent",null),Nc("onDragEvent",null),Nc("lineWrapping",!1,z,!0),Nc("gutters",[],function(a){I(a.options),E(a)},!0),Nc("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?O(a.display)+"px":"0",a.refresh()},!0),Nc("lineNumbers",!1,function(a){I(a.options),E(a)},!0),Nc("firstLineNumber",1,E,!0),Nc("lineNumberFormatter",function(a){return a},E,!0),Nc("showCursorWhenSelecting",!1,X,!0),Nc("readOnly",!1,function(a,b){"nocursor"==b?(ac(a),a.display.input.blur()):b||Cb(a,!0)}),Nc("dragDrop",!0),Nc("cursorBlinkRate",530),Nc("cursorHeight",1),Nc("workTime",100),Nc("workDelay",100),Nc("flattenSpans",!0),Nc("pollInterval",100),Nc("undoDepth",40,function(a,b){a.doc.history.undoDepth=b}),Nc("viewportMargin",10,function(a){a.refresh()},!0),Nc("tabindex",null,function(a,b){a.display.input.tabIndex=b||""}),Nc("autofocus",null);var Pc=w.modes={},Qc=w.mimeModes={};w.defineMode=function(a,b){if(w.defaults.mode||"null"==a||(w.defaults.mode=a),arguments.length>2){b.dependencies=[];for(var c=2;arguments.length>c;++c)b.dependencies.push(arguments[c])}Pc[a]=b},w.defineMIME=function(a,b){Qc[a]=b},w.resolveMode=function(a){if("string"==typeof a&&Qc.hasOwnProperty(a))a=Qc[a];else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return w.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},w.getMode=function(a,b){b=w.resolveMode(b);var c=Pc[b.name];if(!c)return w.getMode(a,"text/plain");var d=c(a,b);if(Rc.hasOwnProperty(b.name)){var e=Rc[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}return d.name=b.name,d},w.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),w.defineMIME("text/plain","null");var Rc=w.modeExtensions={};w.extendMode=function(a,b){var c=Rc.hasOwnProperty(a)?Rc[a]:Rc[a]={};Le(b,c)},w.defineExtension=function(a,b){w.prototype[a]=b},w.defineOption=Nc;var Sc=[];w.defineInitHook=function(a){Sc.push(a)},w.copyState=Tc,w.startState=Uc,w.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);b=c.state,a=c.mode}return c||{mode:a,state:b}};var Vc=w.commands={selectAll:function(a){a.setSelection(oc(a.firstLine(),0),oc(a.lastLine()))},killLine:function(a){var b=a.getCursor(!0),c=a.getCursor(!1),d=!pc(b,c);d||a.getLine(b.line).length!=b.ch?a.replaceRange("",b,d?c:oc(b.line),"+delete"):a.replaceRange("",b,oc(b.line+1,0),"+delete")},deleteLine:function(a){var b=a.getCursor().line;a.replaceRange("",oc(b,0),oc(b),"+delete")},undo:function(a){a.undo()},redo:function(a){a.redo()},goDocStart:function(a){a.extendSelection(oc(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(oc(a.lastLine()))},goLineStart:function(a){a.extendSelection(lf(a,a.getCursor().line))},goLineStartSmart:function(a){var b=a.getCursor(),c=lf(a,b.line),d=a.getLineHandle(c.line),e=be(d);if(e&&0!=e[0].level)a.extendSelection(c);else{var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&f>=b.ch&&b.ch;a.extendSelection(oc(c.line,g?0:f))}},goLineEnd:function(a){a.extendSelection(mf(a,a.getCursor().line))},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")},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")},indentAuto:function(a){a.indentSelection("smart")},indentMore:function(a){a.indentSelection("add")},indentLess:function(a){a.indentSelection("subtract")},insertTab:function(a){a.replaceSelection("	","end","+input")},defaultTab:function(a){a.somethingSelected()?a.indentSelection("add"):a.replaceSelection("	","end","+input")},transposeChars:function(a){var b=a.getCursor(),c=a.getLine(b.line);b.ch>0&&b.ch<c.length-1&&a.replaceRange(c.charAt(b.ch)+c.charAt(b.ch-1),oc(b.line,b.ch-1),oc(b.line,b.ch+1))},newlineAndIndent:function(a){vb(a,function(){a.replaceSelection("\n","end","+input"),a.indentLine(a.getCursor().line,null,!0)})()},toggleOverwrite:function(a){a.toggleOverwrite()}},Wc=w.keyMap={};Wc.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite"},Wc.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Alt-Up":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Down":"goDocEnd","Ctrl-Left":"goWordLeft","Ctrl-Right":"goWordRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delWordBefore","Ctrl-Delete":"delWordAfter","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",fallthrough:"basic"},Wc.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goWordLeft","Alt-Right":"goWordRight","Cmd-Left":"goLineStart","Cmd-Right":"goLineEnd","Alt-Backspace":"delWordBefore","Ctrl-Alt-Backspace":"delWordAfter","Alt-Delete":"delWordAfter","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",fallthrough:["basic","emacsy"]},Wc["default"]=p?Wc.macDefault:Wc.pcDefault,Wc.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"},w.lookupKey=Yc,w.isModifierKey=Zc,w.keyName=$c,w.fromTextArea=function(a,b){function e(){a.value=i.getValue()}if(b||(b={}),b.value=a.value,!b.tabindex&&a.tabindex&&(b.tabindex=a.tabindex),null==b.autofocus){var c=document.body;try{c=document.activeElement}catch(d){}b.autofocus=c==a||null!=a.getAttribute("autofocus")&&c==document.body}if(a.form){te(a.form,"submit",e);var f=a.form,g=f.submit;try{var h=f.submit=function(){e(),f.submit=g,f.submit(),f.submit=h}}catch(d){}}a.style.display="none";var i=w(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return i.save=e,i.getTextArea=function(){return a},i.toTextArea=function(){e(),a.parentNode.removeChild(i.getWrapperElement()),a.style.display="",a.form&&(ue(a.form,"submit",e),"function"==typeof a.form.submit&&(a.form.submit=g))},i},_c.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return 0==this.pos},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 Ee(this.string,this.start,this.tabSize)},indentation:function(){return Ee(this.string,null,this.tabSize)},match:function(a,b,c){if("string"!=typeof a){var e=this.string.slice(this.pos).match(a);return e&&e.index>0?null:(e&&b!==!1&&(this.pos+=e[0].length),e)}var d=function(a){return c?a.toLowerCase():a};return d(this.string).indexOf(d(a),this.pos)==this.pos?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)}},w.StringStream=_c,w.TextMarker=ad,ad.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;b&&tb(a);for(var c=null,d=null,e=0;this.lines.length>e;++e){var f=this.lines[e],g=ed(f.markedSpans,this);null!=g.to&&(d=$d(f)),f.markedSpans=fd(f.markedSpans,g),null!=g.from?c=$d(f):this.collapsed&&!qd(this.doc,f)&&a&&Zd(f,qb(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(var e=0;this.lines.length>e;++e){var h=pd(a.doc,this.lines[e]),i=G(a.doc,h);i>a.display.maxLineLength&&(a.display.maxLine=h,a.display.maxLineLength=i,a.display.maxLineChanged=!0)}null!=c&&a&&yb(a,c,d+1),this.lines.length=0,this.explicitlyCleared=!0,this.collapsed&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&zc(a)),b&&ub(a),ye(this,"clear")}},ad.prototype.find=function(){for(var a,b,c=0;this.lines.length>c;++c){var d=this.lines[c],e=ed(d.markedSpans,this);if(null!=e.from||null!=e.to){var f=$d(d);null!=e.from&&(a=oc(f,e.from)),null!=e.to&&(b=oc(f,e.to))}}return"bookmark"==this.type?a:a&&{from:a,to:b}},ad.prototype.getOptions=function(a){var b=this.replacedWith;return{className:this.className,inclusiveLeft:this.inclusiveLeft,inclusiveRight:this.inclusiveRight,atomic:this.atomic,collapsed:this.collapsed,clearOnEnter:this.clearOnEnter,replacedWith:a?b&&b.cloneNode(!0):b,readOnly:this.readOnly,startStyle:this.startStyle,endStyle:this.endStyle}},ad.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=Je(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)},ad.prototype.detachLine=function(a){if(this.lines.splice(Je(this.lines,a),1),!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;(b.maybeHiddenMarkers||(b.maybeHiddenMarkers=[])).push(this)}},w.SharedTextMarker=cd,cd.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;this.markers.length>a;++a)this.markers[a].clear();ye(this,"clear")}},cd.prototype.find=function(){return this.primary.find()},cd.prototype.getOptions=function(a){var b=this.primary.getOptions(a);return b.shared=!0,b};var ud=w.LineWidget=function(a,b,c){for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.cm=a,this.node=b};ud.prototype.clear=vd(function(){var a=this.line.widgets,b=$d(this.line);if(null!=b&&a){for(var c=0;a.length>c;++c)a[c]==this&&a.splice(c--,1);a.length||(this.line.widgets=null),Zd(this.line,Math.max(0,this.line.height-wd(this))),yb(this.cm,b,b+1)}}),ud.prototype.changed=vd(function(){var a=this.height;this.height=null;var b=wd(this)-a;if(b){Zd(this.line,this.line.height+b);var c=$d(this.line);yb(this.cm,c,c+1)}});var Fd={},Id=/[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g;Od.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,Ad(e),ye(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.splice.apply(a,[a.length,0].concat(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,e=b.length;e>d;++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}},Pd.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;this.children.length>c;++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(25>this.size-b){var h=[];this.collapse(h),this.children=[new Od(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0,c=this.children.length;c>b;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length,this.height+=c;for(var d=0,e=this.children.length;e>d;++d){var f=this.children[d],g=f.chunkSize();if(g>=a){if(f.insertInner(a,b,c),f.lines&&f.lines.length>50){for(;f.lines.length>50;){var h=f.lines.splice(f.lines.length-25,25),i=new Od(h);f.height-=i.height,this.children.splice(d+1,0,i),i.parent=this}this.maybeSpill()}break}a-=g}},maybeSpill:function(){if(!(10>=this.children.length)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new Pd(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=Je(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new Pd(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,e=this.children.length;e>d;++d){var f=this.children[d],g=f.chunkSize();if(g>a){var h=Math.min(b,g-a);if(f.iterN(a,h,c))return!0;if(0==(b-=h))break;a=0}else a-=g}}};var Qd=0,Rd=w.Doc=function(a,b,c){if(!(this instanceof Rd))return new Rd(a,b,c);null==c&&(c=0),Pd.call(this,[new Od([yd("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.history=ce(),this.frontier=c;var d=oc(c,0);this.sel={from:d,to:d,head:d,anchor:d,shift:!1,extend:!1,goalColumn:null},this.id=++Qd,this.modeOption=b,"string"==typeof a&&(a=bf(a)),Nd(this,{from:d,to:d,text:a},null,{head:d,anchor:d})};Rd.prototype=Ke(Pd.prototype,{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,e=b.length;e>d;++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=Yd(this,this.first,this.first+this.size);return a===!1?b:b.join(a||"\n")},setValue:function(a){var b=oc(this.first,0),c=this.first+this.size-1;hc(this,{from:b,to:oc(c,Wd(this,c).text.length),text:bf(a),origin:"setValue"},{head:b,anchor:b},!0)},replaceRange:function(a,b,c,d){b=tc(this,b),c=c?tc(this,c):b,nc(this,a,b,c,d)},getRange:function(a,b,c){var d=Xd(this,tc(this,a),tc(this,b));return c===!1?d:d.join(c||"\n")},getLine:function(a){var b=this.getLineHandle(a);return b&&b.text},setLine:function(a,b){vc(this,a)&&nc(this,b,oc(a,0),tc(this,oc(a)))},removeLine:function(a){vc(this,a)&&nc(this,"",oc(a,0),tc(this,oc(a+1,0)))},getLineHandle:function(a){return vc(this,a)?Wd(this,a):void 0},getLineNumber:function(a){return $d(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return tc(this,a)},getCursor:function(a){var c,b=this.sel;return c=null==a||"head"==a?b.head:"anchor"==a?b.anchor:"end"==a||a===!1?b.to:b.from,rc(c)},somethingSelected:function(){return!pc(this.sel.head,this.sel.anchor)},setCursor:wb(function(a,b,c){var d=tc(this,"number"==typeof a?oc(a,b||0):a);c?wc(this,d):yc(this,d,d)}),setSelection:wb(function(a,b){yc(this,tc(this,a),tc(this,b||a))}),extendSelection:wb(function(a,b){wc(this,tc(this,a),b&&tc(this,b))}),getSelection:function(a){return this.getRange(this.sel.from,this.sel.to,a)},replaceSelection:function(a,b,c){hc(this,{from:this.sel.from,to:this.sel.to,text:bf(a),origin:c},b||"around")},undo:wb(function(){jc(this,"undo")}),redo:wb(function(){jc(this,"redo")}),setExtending:function(a){this.sel.extend=a},historySize:function(){var a=this.history;return{undo:a.done.length,redo:a.undone.length}},clearHistory:function(){this.history=ce()},markClean:function(){this.history.dirtyCounter=0,this.history.lastOp=this.history.lastOrigin=null},isClean:function(){return 0==this.history.dirtyCounter},getHistory:function(){return{done:ie(this.history.done),undone:ie(this.history.undone)}},setHistory:function(a){var b=this.history=ce();b.done=a.done.slice(0),b.undone=a.undone.slice(0)},markText:function(a,b,c){return bd(this,tc(this,a),tc(this,b),c,"range")},setBookmark:function(a,b){var c={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft};return a=tc(this,a),bd(this,a,a,c,"bookmark")},findMarksAt:function(a){a=tc(this,a);var b=[],c=Wd(this,a.line).markedSpans;if(c)for(var d=0;c.length>d;++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},getAllMarks:function(){var a=[];return this.iter(function(b){var c=b.markedSpans;if(c)for(var d=0;c.length>d;++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,++c,void 0)}),tc(this,oc(c,b))},indexFromPos:function(a){a=tc(this,a);var b=a.ch;return a.line<this.first||0>a.ch?0:(this.iter(this.first,a.line,function(a){b+=a.text.length+1}),b)},copy:function(a){var b=new Rd(Yd(this,this.first,this.first+this.size),this.modeOption,this.first);return b.scrollTop=this.scrollTop,b.scrollLeft=this.scrollLeft,b.sel={from:this.sel.from,to:this.sel.to,head:this.sel.head,anchor:this.sel.anchor,shift:this.sel.shift,extend:!1,goalColumn:this.sel.goalColumn},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&&c>a.to&&(c=a.to);var d=new Rd(Yd(this,b,c),a.mode||this.modeOption,b);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}],d},unlinkDoc:function(a){if(a instanceof w&&(a=a.doc),this.linked)for(var b=0;this.linked.length>b;++b){var c=this.linked[b];if(c.doc==a){this.linked.splice(b,1),a.unlinkDoc(this);break}}if(a.history==this.history){var d=[a.id];Ud(a,function(a){d.push(a.id)},!0),a.history=ce(),a.history.done=ie(this.history.done,d),a.history.undone=ie(this.history.undone,d)}},iterLinkedDocs:function(a){Ud(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm}}),Rd.prototype.eachLine=Rd.prototype.iter;var Sd="iter insert remove copy getEditor".split(" ");for(var Td in Rd.prototype)Rd.prototype.hasOwnProperty(Td)&&0>Je(Sd,Td)&&(w.prototype[Td]=function(a){return function(){return a.apply(this.doc,arguments)}}(Rd.prototype[Td]));w.e_stop=qe,w.e_preventDefault=oe,w.e_stopPropagation=pe;var we,xe=0;w.on=te,w.off=ue,w.signal=ve;var Be=30,Ce=w.Pass={toString:function(){return"CodeMirror.Pass"}};De.prototype={set:function(a,b){clearTimeout(this.id),this.id=setTimeout(b,a)}},w.countColumn=Ee;var Fe=[""],Oe=/[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/,Re=/[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F\udc00-\udfff]/;w.replaceGetRect=function(a){We=a};var Xe=function(){if(d)return!1;var a=Se("div");return"draggable"in a||"dragDrop"in a}(),Ye=/^$/;a?Ye=/$'/:i?Ye=/\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/:g&&(Ye=/\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/);var Ze,_e,bf=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/)};w.splitLines=bf;var cf=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},df=function(){var a=Se("div");return"oncopy"in a?!0:(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)}(),ef={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:";",91:"Mod",92:"Mod",93:"Mod",109:"-",107:"=",127:"Delete",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63276:"PageUp",63277:"PageDown",63275:"End",63273:"Home",63234:"Left",63232:"Up",63235:"Right",63233:"Down",63302:"Insert",63272:"Delete"};w.keyNames=ef,function(){for(var a=0;10>a;a++)ef[a+48]=a+"";for(var a=65;90>=a;a++)ef[a]=String.fromCharCode(a);for(var a=1;12>=a;a++)ef[a+111]=ef[a+63235]="F"+a}();var pf=function(){function c(c){return 255>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&1791>=c?b.charAt(c-1536):c>=1792&&2220>=c?"r":"L"}var a="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL",b="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr",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 l,b=a.length,j=[],k=0;b>k;++k)j.push(l=c(a.charCodeAt(k)));for(var k=0,m=i;b>k;++k){var l=j[k];"m"==l?j[k]=m:m=l}for(var k=0,n=i;b>k;++k){var l=j[k];"1"==l&&"r"==n?j[k]="n":f.test(l)&&(n=l,"r"==l&&(j[k]="R"))
-}for(var k=1,m=j[0];b-1>k;++k){var l=j[k];"+"==l&&"1"==m&&"1"==j[k+1]?j[k]="1":","!=l||m!=j[k+1]||"1"!=m&&"n"!=m||(j[k]=m),m=l}for(var k=0;b>k;++k){var l=j[k];if(","==l)j[k]="N";else if("%"==l){for(var o=k+1;b>o&&"%"==j[o];++o);for(var p=k&&"!"==j[k-1]||b-1>o&&"1"==j[o]?"1":"N",q=k;o>q;++q)j[q]=p;k=o-1}}for(var k=0,n=i;b>k;++k){var l=j[k];"L"==n&&"1"==l?j[k]="L":f.test(l)&&(n=l)}for(var k=0;b>k;++k)if(e.test(j[k])){for(var o=k+1;b>o&&e.test(j[o]);++o);for(var r="L"==(k?j[k-1]:i),s="L"==(b-1>o?j[o]:i),p=r||s?"L":"R",q=k;o>q;++q)j[q]=p;k=o-1}for(var u,t=[],k=0;b>k;)if(g.test(j[k])){var v=k;for(++k;b>k&&g.test(j[k]);++k);t.push({from:v,to:k,level:0})}else{var w=k,x=t.length;for(++k;b>k&&"L"!=j[k];++k);for(var q=w;k>q;)if(h.test(j[q])){q>w&&t.splice(x,0,{from:w,to:q,level:1});var y=q;for(++q;k>q&&h.test(j[q]);++q);t.splice(x,0,{from:y,to:q,level:2}),w=q}else++q;k>w&&t.splice(x,0,{from:w,to:k,level:1})}return 1==t[0].level&&(u=a.match(/^\s+/))&&(t[0].from=u[0].length,t.unshift({from:0,to:u[0].length,level:0})),1==He(t).level&&(u=a.match(/\s+$/))&&(He(t).to-=u[0].length,t.push({from:b-u[0].length,to:b,level:0})),t[0].level!=He(t).level&&t.push({from:b,to:b,level:t[0].level}),t}}();return w.version="3.1",w}();(No newline at end of file)
 
public/javascripts/lib/mergely/mergely.css (deleted)
--- public/javascripts/lib/mergely/mergely.css
@@ -1,35 +0,0 @@
-
-/* required */
-.mergely-column textarea { width: 80px; height: 200px; }
-.mergely-column { float: left; }
-.mergely-margin { float: left; }
-.mergely-canvas { float: left; width: 28px; display:none; }
-
-/* resizeable */
-.mergely-resizer { width: 100%; height: 100%; }
-
-/* style configuration */
-.mergely-column { border: 1px solid #ccc; }
-.mergely-active { border: 1px solid #d8f59e; } /* #a3d1ff */
-
-.mergely.a.rhs.start { border-top: 1px solid #d8f59e; } /* #a3d1ff */
-.mergely.a.lhs.start.end,
-.mergely.a.rhs.end { border-bottom: 1px solid #d8f59e; } /* #a3d1ff */
-.mergely.a.rhs { background-color: #eeffcc; color:#000; } /* #ddeeff */
-.mergely.a.lhs.start.end.first { border-bottom: 0; border-top: 1px solid #d8f59e; } /* #a3d1ff */
-
-.mergely.d.lhs { background-color: #edc0c0; }
-.mergely.d.lhs.end,
-.mergely.d.rhs.start.end { border-bottom: 1px solid #ff7f7f; }
-.mergely.d.rhs.start.end.first { border-bottom: 0; border-top: 1px solid #ff7f7f; }
-.mergely.d.lhs.start { border-top: 1px solid #ff7f7f; }
-
-.mergely.c.lhs,
-.mergely.c.rhs { background-color: #fafafa; }
-.mergely.c.lhs.start,
-.mergely.c.rhs.start { border-top: 1px solid #a3a3a3; }
-.mergely.c.lhs.end,
-.mergely.c.rhs.end { border-bottom: 1px solid #a3a3a3; }
-
-.mergely.ch.a.rhs { background-color: #eeffcc; color:#000; } /* #ddeeff */
-.mergely.ch.d.lhs { background-color: #edc0c0; text-decoration: line-through; color: #888; }
 
public/javascripts/lib/mergely/mergely.js (deleted)
--- public/javascripts/lib/mergely/mergely.js
@@ -1,1497 +0,0 @@
-Mgly = {};
-
-Mgly.Timer = function(){
-	var self = this;
-	self.start = function() { self.t0 = new Date().getTime(); }
-	self.stop = function() {
-		var t1 = new Date().getTime();
-		var d = t1 - self.t0; 
-		self.t0 = t1;
-		return d;
-	}
-	self.start();
-}
-
-Mgly.ChangeExpression = new RegExp(/(\d+(?:,\d+)?)([acd])(\d+(?:,\d+)?)/);
-
-Mgly.DiffParser = function(diff) {
-	var changes = [];
-	var change_id = 0;
-	// parse diff
-	var diff_lines = diff.split(/\n/);
-	for (var i = 0; i < diff_lines.length; ++i) {
-		if (diff_lines[i].length == 0) continue;
-		var change = {};
-		var test = Mgly.ChangeExpression.exec(diff_lines[i]);
-		if (test == null) continue;
-		// lines are zero-based
-		var fr = test[1].split(',');
-		change['lhs-line-from'] = fr[0] - 1;
-		if (fr.length == 1) change['lhs-line-to'] = fr[0] - 1;
-		else change['lhs-line-to'] = fr[1] - 1;
-		var to = test[3].split(',');
-		change['rhs-line-from'] = to[0] - 1;
-		if (to.length == 1) change['rhs-line-to'] = to[0] - 1;
-		else change['rhs-line-to'] = to[1] - 1;
-		change['op'] = test[2];
-		changes[change_id++] = change;
-	}
-	return changes;
-}
-
-Mgly.sizeOf = function(obj) {
-	var size = 0, key;
-	for (key in obj) {
-		if (obj.hasOwnProperty(key)) size++;
-	}
-	return size;
-}
-
-Mgly.LCS = function(x, y) {
-	this.x = x.replace(/[ ]{1}/g, '\n');
-	this.y = y.replace(/[ ]{1}/g, '\n');
-}
-jQuery.extend(Mgly.LCS.prototype, {
-	clear: function() { this.ready = 0; },
-	diff: function(added, removed) {
-		var d = new Mgly.diff(this.x, this.y, {ignorews: false});
-		var changes = Mgly.DiffParser(d.normal_form());
-		var li = 0, lj = 0;
-		for (var i = 0; i < changes.length; ++i) {
-			var change = changes[i];
-			if (change.op != 'a') {
-				// find the starting index of the line
-				li = d.getLines('lhs').slice(0, change['lhs-line-from']).join(' ').length;
-				// get the index of the the span of the change
-				lj = change['lhs-line-to'] + 1;
-				// get the changed text
-				var lchange = d.getLines('lhs').slice(change['lhs-line-from'], lj).join(' ');
-				if (change.op == 'd') lchange += ' ';// include the leading space
-				else if (li > 0 && change.op == 'c') li += 1; // ignore leading space if not first word
-				// output the changed index and text
-				removed(li, li + lchange.length);
-			}
-			if (change.op != 'd') {
-				// find the starting index of the line
-				li = d.getLines('lhs').slice(0, change['rhs-line-from']).join(' ').length;
-				// get the index of the the span of the change
-				lj = change['rhs-line-to'] + 1;
-				// get the changed text
-				var rchange = d.getLines('lhs').slice(change['rhs-line-from'], lj).join(' ');
-				if (change.op == 'a') rchange += ' ';// include the leading space
-				else if (li > 0 && change.op == 'c') li += 1; // ignore leading space if not first word
-				// output the changed index and text
-				added(li, li + rchange.length);
-			}
-		}
-	}
-});
-
-Mgly.CodeifyText = function(settings) {
-    this._max_code = 0;
-    this._diff_codes = {};
-	this.ctxs = {};
-	this.options = {ignorews: false};
-	jQuery.extend(this, settings);
-	this.lhs = settings.lhs.split('\n');
-	this.rhs = settings.rhs.split('\n');
-}
-
-jQuery.extend(Mgly.CodeifyText.prototype, {
-	getCodes: function(side) {
-		if (!this.ctxs.hasOwnProperty(side)) {
-			var ctx = this._diff_ctx(this[side]);
-			this.ctxs[side] = ctx;
-			ctx.codes.length = Object.keys(ctx.codes).length;
-		}
-		return this.ctxs[side].codes;
-	},
-	getLines: function(side) {
-		return this.ctxs[side].lines;
-	},
-	_diff_ctx: function(lines) {
-		var ctx = {i: 0, codes: {}, lines: lines};
-		this._codeify(lines, ctx);
-		return ctx;
-	},
-	_codeify: function(lines, ctx) {
-		var code = this._max_code;
-		for (var i = 0; i < lines.length; ++i) {
-			var line = lines[i];
-			if (this.options.ignorews) {
-				line = line.replace(/\s+/g, '');
-			}
-			var aCode = this._diff_codes[line];
-			if (aCode != undefined) {
-				ctx.codes[i] = aCode;
-			}
-			else {
-				this._max_code++;
-				this._diff_codes[line] = this._max_code;
-				ctx.codes[i] = this._max_code;
-			}
-		}
-	}
-});
-
-Mgly.diff = function(lhs, rhs, options) {
-	var opts = jQuery.extend({ignorews: false}, options);
-	this.codeify = new Mgly.CodeifyText({
-		lhs: lhs,
-		rhs: rhs,
-		options: opts
-	});
-	var lhs_ctx = {
-		codes: this.codeify.getCodes('lhs'),
-		modified: {}
-	};
-	var rhs_ctx = {
-		codes: this.codeify.getCodes('rhs'),
-		modified: {}
-	};
-	var max = (lhs_ctx.codes.length + rhs_ctx.codes.length + 1);
-	var vector_d = Array( 2 * max + 2 );
-	var vector_u = Array( 2 * max + 2 );
-	this._lcs(lhs_ctx, 0, lhs_ctx.codes.length, rhs_ctx, 0, rhs_ctx.codes.length, vector_u, vector_d);
-	this._optimize(lhs_ctx);
-	this._optimize(rhs_ctx);
-	this.items = this._create_diffs(lhs_ctx, rhs_ctx);
-};
-
-jQuery.extend(Mgly.diff.prototype, {
-	changes: function() { return this.items; },
-	getLines: function(side) {
-		return this.codeify.getLines(side);
-	},
-	normal_form: function() {
-		var nf = '';
-		for (var index = 0; index < this.items.length; ++index) {
-			var item = this.items[index];
-			var lhs_str = '';
-			var rhs_str = '';
-			var change = 'c';
-			if (item.lhs_deleted_count == 0 && item.rhs_inserted_count > 0) change = 'a';
-			else if (item.lhs_deleted_count > 0 && item.rhs_inserted_count == 0) change = 'd';
-			
-			if (item.lhs_deleted_count == 1) lhs_str = item.lhs_start + 1;
-			else if (item.lhs_deleted_count == 0) lhs_str = item.lhs_start;
-			else lhs_str = (item.lhs_start + 1) + ',' + (item.lhs_start + item.lhs_deleted_count);
-			
-			if (item.rhs_inserted_count == 1) rhs_str = item.rhs_start + 1;
-			else if (item.rhs_inserted_count == 0) rhs_str = item.rhs_start;
-			else rhs_str = (item.rhs_start + 1) + ',' + (item.rhs_start + item.rhs_inserted_count);
-			nf += lhs_str + change + rhs_str + '\n';
-			if (this.rhs_lines && this.lhs_lines) {
-				// if rhs/lhs lines have been retained, output contextual diff
-				for (var i = item.lhs_start; i < item.lhs_start + item.lhs_deleted_count; ++i) {
-					nf += '< ' + this.lhs_lines[i] + '\n';
-				}
-				if (item.rhs_inserted_count && item.lhs_deleted_count) nf += '---\n';
-				for (var i = item.rhs_start; i < item.rhs_start + item.rhs_inserted_count; ++i) {
-					nf += '> ' + this.rhs_lines[i] + '\n';
-				}
-			}
-		}
-		return nf;
-	},
-	_lcs: function(lhs_ctx, lhs_lower, lhs_upper, rhs_ctx, rhs_lower, rhs_upper, vector_u, vector_d) {
-		while ( (lhs_lower < lhs_upper) && (rhs_lower < rhs_upper) && (lhs_ctx.codes[lhs_lower] == rhs_ctx.codes[rhs_lower]) ) {
-			++lhs_lower;
-			++rhs_lower;
-		}
-		while ( (lhs_lower < lhs_upper) && (rhs_lower < rhs_upper) && (lhs_ctx.codes[lhs_upper - 1] == rhs_ctx.codes[rhs_upper - 1]) ) {
-			--lhs_upper;
-			--rhs_upper;
-		}
-		if (lhs_lower == lhs_upper) {
-			while (rhs_lower < rhs_upper) {
-				rhs_ctx.modified[ rhs_lower++ ] = true;
-			}
-		}
-		else if (rhs_lower == rhs_upper) {
-			while (lhs_lower < lhs_upper) {
-				lhs_ctx.modified[ lhs_lower++ ] = true;
-			}
-		}
-		else {
-			var sms = this._sms(lhs_ctx, lhs_lower, lhs_upper, rhs_ctx, rhs_lower, rhs_upper, vector_u, vector_d);
-			this._lcs(lhs_ctx, lhs_lower, sms.x, rhs_ctx, rhs_lower, sms.y, vector_u, vector_d);
-			this._lcs(lhs_ctx, sms.x, lhs_upper, rhs_ctx, sms.y, rhs_upper, vector_u, vector_d);
-		}
-	},
-	_sms: function(lhs_ctx, lhs_lower, lhs_upper, rhs_ctx, rhs_lower, rhs_upper, vector_u, vector_d) {
-		var max = lhs_ctx.codes.length + rhs_ctx.codes.length + 1;
-		var kdown = lhs_lower - rhs_lower;
-		var kup = lhs_upper - rhs_upper;
-		var delta = (lhs_upper - lhs_lower) - (rhs_upper - rhs_lower);
-		var odd = (delta & 1) != 0;
-		var offset_down = max - kdown;
-		var offset_up = max - kup;
-		var maxd = ((lhs_upper - lhs_lower + rhs_upper - rhs_lower) / 2) + 1;
-		vector_d[ offset_down + kdown + 1 ] = lhs_lower;
-		vector_u[ offset_up + kup - 1 ] = lhs_upper;
-		var ret = {x:0,y:0};
-		for (var d = 0; d <= maxd; ++d) {
-			for (var k = kdown - d; k <= kdown + d; k += 2) {
-				var x, y;
-				if (k == kdown - d) {
-					x = vector_d[ offset_down + k + 1 ];//down
-				}
-				else {
-					x = vector_d[ offset_down + k - 1 ] + 1;//right
-					if ((k < (kdown + d)) && (vector_d[ offset_down + k + 1 ] >= x)) {
-						x = vector_d[ offset_down + k + 1 ];//down
-					}
-				}
-				y = x - k;
-				// find the end of the furthest reaching forward D-path in diagonal k.
-				while ((x < lhs_upper) && (y < rhs_upper) && (lhs_ctx.codes[x] == rhs_ctx.codes[y])) {
-					x++; y++;
-				}
-				vector_d[ offset_down + k ] = x;
-				// overlap ?
-				if (odd && (kup - d < k) && (k < kup + d)) {
-					if (vector_u[offset_up + k] <= vector_d[offset_down + k]) {
-						ret.x = vector_d[offset_down + k];
-						ret.y = vector_d[offset_down + k] - k;
-						return (ret);
-					}
-				}
-			}
-			// Extend the reverse path.
-			for (var k = kup - d; k <= kup + d; k += 2) {
-				// find the only or better starting point
-				var x, y;
-				if (k == kup + d) {
-					x = vector_u[offset_up + k - 1]; // up
-				} else {
-					x = vector_u[offset_up + k + 1] - 1; // left
-					if ((k > kup - d) && (vector_u[offset_up + k - 1] < x))
-						x = vector_u[offset_up + k - 1]; // up
-				}
-				y = x - k;
-				while ((x > lhs_lower) && (y > rhs_lower) && (lhs_ctx.codes[x - 1] == rhs_ctx.codes[y - 1])) {
-					// diagonal
-					x--;
-					y--;
-				}
-				vector_u[offset_up + k] = x;
-				// overlap ?
-				if (!odd && (kdown - d <= k) && (k <= kdown + d)) {
-					if (vector_u[offset_up + k] <= vector_d[offset_down + k]) {
-						ret.x = vector_d[offset_down + k];
-						ret.y = vector_d[offset_down + k] - k;
-						return (ret);
-					}
-				}
-			}
-		}
-		throw "the algorithm should never come here.";
-	},
-	_optimize: function(ctx) {
-		var start = 0, end = 0;
-		while (start < ctx.length) {
-			while ((start < ctx.length) && (ctx.modified[start] == undefined || ctx.modified[start] == false)) {
-				start++;
-			}
-			end = start;
-			while ((end < ctx.length) && (ctx.modified[end] == true)) {
-				end++;
-			}
-			if ((end < ctx.length) && (ctx.ctx[start] == ctx.codes[end])) {
-				ctx.modified[start] = false;
-				ctx.modified[end] = true;
-			}
-			else {
-				start = end;
-			}
-		}
-	},
-	_create_diffs: function(lhs_ctx, rhs_ctx) {
-		var items = [];
-		var lhs_start = 0, rhs_start = 0;
-		var lhs_line = 0, rhs_line = 0;
-
-		while (lhs_line < lhs_ctx.codes.length || rhs_line < rhs_ctx.codes.length) {
-			if ((lhs_line < lhs_ctx.codes.length) && (!lhs_ctx.modified[lhs_line])
-				&& (rhs_line < rhs_ctx.codes.length) && (!rhs_ctx.modified[rhs_line])) {
-				// equal lines
-				lhs_line++;
-				rhs_line++;
-			}
-			else {
-				// maybe deleted and/or inserted lines
-				lhs_start = lhs_line;
-				rhs_start = rhs_line;
-
-				while (lhs_line < lhs_ctx.codes.length && (rhs_line >= rhs_ctx.codes.length || lhs_ctx.modified[lhs_line]))
-					lhs_line++;
-
-				while (rhs_line < rhs_ctx.codes.length && (lhs_line >= lhs_ctx.codes.length || rhs_ctx.modified[rhs_line]))
-					rhs_line++;
-
-				if ((lhs_start < lhs_line) || (rhs_start < rhs_line)) {
-					// store a new difference-item
-					items.push({
-						lhs_start: lhs_start,
-						rhs_start: rhs_start,
-						lhs_deleted_count: lhs_line - lhs_start,
-						rhs_inserted_count: rhs_line - rhs_start
-					});
-				}
-			}
-		}
-		return items;
-	}
-});
-
-Mgly.mergely = function(el, options) {
-	if (el) {
-		this.init(el, options);
-	}
-};
-
-jQuery.extend(Mgly.mergely.prototype, {
-	name: 'mergely',
-	//http://jupiterjs.com/news/writing-the-perfect-jquery-plugin
-	init: function(el, options) {
-		this.diffView = new Mgly.CodeMirrorDiffView(el, options);
-		this.bind(el);
-	},
-	bind: function(el) {
-		this.diffView.bind(el);
-	}
-});
-
-Mgly.CodeMirrorDiffView = function(el, options) {
-	CodeMirror.defineExtension('centerOnCursor', function() {
-		var coords = this.cursorCoords(null, 'local');
-		this.scrollTo(null, 
-			(coords.y + coords.yBot) / 2 - (this.getScrollerElement().clientHeight / 2));
-	});
-	this.init(el, options);
-};
-
-jQuery.extend(Mgly.CodeMirrorDiffView.prototype, {
-	init: function(el, options) {
-		this.settings = {
-			autoupdate: true,
-			autoresize: true,
-			rhs_margin: 'right',
-			lcs: true,
-			sidebar: true,
-			viewport: false,
-			ignorews: false,
-			fadein: 'fast',
-			editor_width: '400px',
-			editor_height: '400px',
-			resize_timeout: 500,
-			change_timeout: 150,
-			fgcolor: {
-			    a:'#b0d860',//'#4ba3fa',
-			    c:'#a3a3a3',
-			    d:'#ff7f7f'
-		    },
-			bgcolor: '#eee',
-			vpcolor: 'rgba(0, 0, 200, 0.5)',
-			lhs: function(setValue) { },
-			rhs: function(setValue) { },
-			loaded: function() { },
-			//_auto_height: function(h) { return h - 20; },
-			_auto_width: function(w) { return w; },
-			resize: function(init) {
-				var scrollbar = init ? 16 : 0;
-				var w = jQuery(el).parent().width() + scrollbar;
-				if (this.width == 'auto') {
-					w = this._auto_width(w);
-				}
-				else {
-					w = this.width;
-					this.editor_width = w;
-				}
-				if (this.height == 'auto') {
-					//h = this._auto_height(h);
-					h = jQuery(el).parent().height();
-				}
-				else {
-					h = this.height;
-					this.editor_height = h;
-				}
-				var content_width = w / 2.0 - 2 * 8 - 8;
-				var content_height = h;
-				var self = jQuery(el);
-				self.find('.mergely-column').css({ width: content_width + 'px' });
-				self.find('.mergely-column, .mergely-canvas, .mergely-margin, .mergely-column textarea, .CodeMirror-scroll, .cm-s-default').css({ height: content_height + 'px' });
-				self.find('.mergely-canvas').css({ height: content_height + 'px' });
-				self.find('.mergely-column textarea').css({ width: content_width + 'px' });
-				self.css({ width: w, height: h, clear: 'both' });
-				if (self.css('display') == 'none') {
-					if (this.fadein != false) self.fadeIn(this.fadein);
-					else self.show();
-					if (this.loaded) this.loaded();
-				}
-				if (this.resized) this.resized();
-			},
-			_debug: '', //scroll,draw,calc,diff,markup,change
-			resized: function() { }
-		};
-		var cmsettings = {
-			mode: 'text/plain',
-			readOnly: false,
-			lineWrapping: false,
-			lineNumbers: true,
-			gutters: ['merge', 'CodeMirror-linenumbers']
-		}
-		this.lhs_cmsettings = {};
-		this.rhs_cmsettings = {};
-		
-		// save this element for faster queries
-		this.element = jQuery(el);
-		
-		// save options if there are any
-		if (options && options.cmsettings) jQuery.extend(this.lhs_cmsettings, cmsettings, options.cmsettings, options.lhs_cmsettings);
-		if (options && options.cmsettings) jQuery.extend(this.rhs_cmsettings, cmsettings, options.cmsettings, options.rhs_cmsettings);
-		if (options) jQuery.extend(this.settings, options);
-		
-		// bind if the element is destroyed
-		this.element.bind('destroyed', jQuery.proxy(this.teardown, this));
-
-		// save this instance in jQuery data, binding this view to the node
-		jQuery.data(el, 'mergely', this);
-	},
-	unbind: function() {
-		if (this.changed_timeout != null) clearTimeout(this.changed_timeout);
-		this.editor[this.id + '-lhs'].toTextArea();
-		this.editor[this.id + '-rhs'].toTextArea();
-	},
-	destroy: function() {
-		this.element.unbind('destroyed', this.teardown);
-		this.teardown();
-	},
-	teardown: function() {
-		this.unbind();
-	},
-	lhs: function(text) {
-		this.editor[this.id + '-lhs'].setValue(text);
-	},
-	rhs: function(text) {
-		this.editor[this.id + '-rhs'].setValue(text);
-	},
-	update: function() {
-		this._changing(this.id + '-lhs', this.id + '-rhs');
-	},
-	unmarkup: function() {
-		this._clear();
-	},
-	scrollTo: function(side, num) {
-		var le = this.editor[this.id + '-lhs'];
-		var re = this.editor[this.id + '-rhs'];
-		if (side == 'lhs') {
-			le.setCursor(num);
-			le.centerOnCursor();
-		}
-		else {
-			re.setCursor(num);
-			re.centerOnCursor();
-		}
-	},
-	options: function(opts) {
-		if (opts) {
-			jQuery.extend(this.settings, opts);
-			if (opts.autoresize) this.resize();
-			if (opts.autoupdate) this.update();
-			if (opts.hasOwnProperty('rhs_margin')) {
-				// dynamically swap the margin
-				if (opts.rhs_margin == 'left') {
-					this.element.find('.mergely-margin:last-child').insertAfter(
-						this.element.find('.mergely-canvas'));
-				}
-				else {
-					var target = this.element.find('.mergely-margin').last();
-					target.appendTo(target.parent());
-				}
-			}
-			if (opts.hasOwnProperty('sidebar')) {
-				// dynamically enable sidebars
-				if (opts.sidebar) {
-					jQuery(this.element).find('.mergely-margin').css({display: 'block'});
-				}
-				else {
-					jQuery(this.element).find('.mergely-margin').css({display: 'none'});
-				}
-			}
-		}
-		else {
-			return this.settings;
-		}
-	},
-	swap: function() {
-		if (this.lhs_cmsettings.readOnly || this.rhs_cmsettings.readOnly) return;
-		var le = this.editor[this.id + '-lhs'];
-		var re = this.editor[this.id + '-rhs'];
-		var tmp = re.getValue();
-		re.setValue(le.getValue());
-		le.setValue(tmp);
-	},
-	merge: function(side) {
-		var le = this.editor[this.id + '-lhs'];
-		var re = this.editor[this.id + '-rhs'];
-		if (side == 'lhs' && !this.lhs_cmsettings.readOnly) le.setValue(re.getValue());
-		else if (!this.rhs_cmsettings.readOnly) re.setValue(le.getValue());
-	},
-	get: function(side) {
-		var ed = this.editor[this.id + '-' + side];
-		var t = ed.getValue();
-		if (t == undefined) return '';
-		return t;
-	},
-	clear: function(side) {
-		if (side == 'lhs' && this.lhs_cmsettings.readOnly) return;
-		if (side == 'rhs' && this.rhs_cmsettings.readOnly) return;
-		var ed = this.editor[this.id + '-' + side];
-		ed.setValue('');
-	},
-	cm: function(side) {
-		return this.editor[this.id + '-' + side];
-	},
-	search: function(side, query, direction) {
-		var le = this.editor[this.id + '-lhs'];
-		var re = this.editor[this.id + '-rhs'];
-		var editor;
-		if (side == 'lhs') editor = le;
-		else editor = re;
-		direction = (direction == 'prev') ? 'findPrevious' : 'findNext';
-		if ((editor.getSelection().length == 0) || (this.prev_query[side] != query)) {
-			this.cursor[this.id] = editor.getSearchCursor(query, { line: 0, ch: 0 }, false);
-			this.prev_query[side] = query;
-		}
-		var cursor = this.cursor[this.id];
-		
-		if (cursor[direction]()) {
-			editor.setSelection(cursor.from(), cursor.to());
-		}
-		else {
-			cursor = editor.getSearchCursor(query, { line: 0, ch: 0 }, false);
-		}
-	},
-	resize: function() {
-		this.settings.resize();
-		this._changing(this.id + '-lhs', this.id + '-rhs');
-	},
-	diff: function() {
-		var lhs = this.editor[this.id + '-lhs'].getValue();
-		var rhs = this.editor[this.id + '-rhs'].getValue();
-		var d = new Mgly.diff(lhs, rhs, this.settings);
-		return d.normal_form();
-	},
-	bind: function(el) {
-		jQuery(this.element).hide();//hide
-		this.id = jQuery(el).attr('id');
-		var height = this.settings.editor_height;
-		var width = this.settings.editor_width;
-		this.changed_timeout = null;
-		this.chfns = {};
-		this.chfns[this.id + '-lhs'] = [];
-		this.chfns[this.id + '-rhs'] = [];
-		this.prev_query = [];
-		this.cursor = [];
-		this._skipscroll = {};
-		this.change_exp = new RegExp(/(\d+(?:,\d+)?)([acd])(\d+(?:,\d+)?)/);
-		var merge_lhs_button;
-		var merge_rhs_button;
-		if (jQuery.button != undefined) {
-			//jquery ui
-			merge_lhs_button = '<button title="Merge left"></button>';
-			merge_rhs_button = '<button title="Merge right"></button>';
-		}
-		else {
-			// homebrew
-			var style = 'opacity:0.4;width:10px;height:15px;background-color:#888;cursor:pointer;text-align:center;color:#eee;border:1px solid: #222;margin-right:5px;';
-			merge_lhs_button = '<div style="' + style + '" title="Merge left">&lt;</div>';
-			merge_rhs_button = '<div style="' + style + '" title="Merge right">&gt;</div>';
-		}
-		this.merge_rhs_button = jQuery(merge_rhs_button);
-		this.merge_lhs_button = jQuery(merge_lhs_button);
-		
-		// create the textarea and canvas elements
-		jQuery(this.element).append(jQuery('<div class="mergely-margin" style="height: ' + height + '"><canvas id="' + this.id + '-lhs-margin" width="8px" height="' + height + '"></canvas></div>'));
-		jQuery(this.element).append(jQuery('<div style="position:relative;width:' + width + '; height:' + height + '" id="' + this.id + '-editor-lhs" class="mergely-column"><textarea style="" id="' + this.id + '-lhs"></textarea></div>'));
-		jQuery(this.element).append(jQuery('<div class="mergely-canvas" style="height: ' + height + '"><canvas id="' + this.id + '-lhs-' + this.id + '-rhs-canvas" style="width:28px" width="28px" height="' + height + '"></canvas></div>'));
-		var rmargin = jQuery('<div class="mergely-margin" style="height: ' + height + '"><canvas id="' + this.id + '-rhs-margin" width="8px" height="' + height + '"></canvas></div>');
-		if (!this.settings.sidebar) {
-			jQuery(this.element).find('.mergely-margin').css({display: 'none'});
-		}
-		if (this.settings.rhs_margin == 'left') {
-			jQuery(this.element).append(rmargin);
-		}
-		jQuery(this.element).append(jQuery('<div style="width:' + width + '; height:' + height + '" id="' + this.id + '-editor-rhs" class="mergely-column"><textarea style="" id="' + this.id + '-rhs"></textarea></div>'));
-		if (this.settings.rhs_margin != 'left') {
-			jQuery(this.element).append(rmargin);
-		}
-		//codemirror
-		var cmstyle = '#' + this.id + ' .CodeMirror-gutter-text { padding: 5px 0 0 0; }' +
-			'#' + this.id + ' .CodeMirror-lines pre, ' + '#' + this.id + ' .CodeMirror-gutter-text pre { line-height: 18px; }' +
-			'.CodeMirror-linewidget { overflow: hidden; };';
-		if (this.settings.autoresize) {
-			cmstyle += this.id + ' .CodeMirror-scroll { height: 100%; overflow: auto; }';
-		}
-		jQuery('<style type="text/css">' + cmstyle + '</style>').appendTo('head');
-
-		//bind
-		var rhstx = jQuery('#' + this.id + '-rhs').get(0);
-		if (!rhstx) {
-			console.error('rhs textarea not defined - Mergely not initialized properly');
-			return;
-		}
-		var lhstx = jQuery('#' + this.id + '-lhs').get(0);
-		if (!rhstx) {
-			console.error('lhs textarea not defined - Mergely not initialized properly');
-			return;
-		}
-		var self = this;
-		this.editor = [];
-		this.editor[this.id + '-lhs'] = CodeMirror.fromTextArea(lhstx, this.lhs_cmsettings);
-		this.editor[this.id + '-rhs'] = CodeMirror.fromTextArea(rhstx, this.rhs_cmsettings);
-		this.editor[this.id + '-lhs'].on('change', function(){ if (self.settings.autoupdate) self._changing(self.id + '-lhs', self.id + '-rhs'); });
-		this.editor[this.id + '-lhs'].on('scroll', function(){ self._scrolling(self.id + '-lhs'); });
-		this.editor[this.id + '-rhs'].on('change', function(){ if (self.settings.autoupdate) self._changing(self.id + '-lhs', self.id + '-rhs'); });
-		this.editor[this.id + '-rhs'].on('scroll', function(){ self._scrolling(self.id + '-rhs'); });
-		// resize
-		if (this.settings.autoresize) {
-			var sz_timeout1 = null;
-			var sz = function(init) {
-				//self.em_height = null; //recalculate
-				if (self.settings.resize) self.settings.resize(init);
-				self.editor[self.id + '-lhs'].refresh();
-				self.editor[self.id + '-rhs'].refresh();
-				if (self.settings.autoupdate) {
-					self._changing(self.id + '-lhs', self.id + '-rhs');
-				}
-			}
-			jQuery(window).resize(
-				function () {
-					if (sz_timeout1) clearTimeout(sz_timeout1);
-					sz_timeout1 = setTimeout(sz, self.settings.resize_timeout);
-				}
-			);
-			sz(true);
-		}
-		//bind
-		
-		if (this.settings.lhs) {
-			var setv = this.editor[this.id + '-lhs'].getDoc().setValue;
-			this.settings.lhs(setv.bind(this.editor[this.id + '-lhs'].getDoc()));
-		}
-		if (this.settings.rhs) {
-			var setv = this.editor[this.id + '-rhs'].getDoc().setValue;
-			this.settings.rhs(setv.bind(this.editor[this.id + '-rhs'].getDoc()));
-		}
-	},
-	
-	_scrolling: function(editor_name) {
-		if (this._skipscroll[editor_name] === true) {
-			// scrolling one side causes the other to event - ignore it
-			this._skipscroll[editor_name] = false;
-			return;
-		}
-		var scroller = jQuery(this.editor[editor_name].getScrollerElement());
-		if (this.midway == undefined) {
-			this.midway = (scroller.height() / 2.0 + scroller.offset().top).toFixed(2);
-		}
-		// balance-line
-		var midline = this.editor[editor_name].coordsChar({left:0, top:this.midway});
-		var top_to = scroller.scrollTop();
-		var left_to = scroller.scrollLeft();
-		
-		this.trace('scroll', 'side', editor_name);
-		this.trace('scroll', 'midway', this.midway);
-		this.trace('scroll', 'midline', midline);
-		this.trace('scroll', 'top_to', top_to);
-		this.trace('scroll', 'left_to', left_to);
-		
-		var editor_name1 = this.id + '-lhs';
-		var editor_name2 = this.id + '-rhs';
-		
-		for (var name in this.editor) {
-			if (!this.editor.hasOwnProperty(name)) continue;
-			if (editor_name == name) continue; //same editor
-			var this_side = editor_name.replace(this.id + '-', '');
-			var other_side = name.replace(this.id + '-', '');
-			var top_adjust = 0;
-			
-			// find the last change that is less than or within the midway point
-			// do not move the rhs until the lhs end point is >= the rhs end point.
-			var last_change = null;
-			var force_scroll = false;
-			for (var i = 0; i < this.changes.length; ++i) {
-				var change = this.changes[i];
-				if ((midline.line >= change[this_side+'-line-from'])) {
-					last_change = change;
-					if (midline.line >= last_change[this_side+'-line-to']) {
-						if (!change.hasOwnProperty(this_side+'-y-start') ||
-							!change.hasOwnProperty(this_side+'-y-end') ||
-							!change.hasOwnProperty(other_side+'-y-start') ||
-							!change.hasOwnProperty(other_side+'-y-end')){
-							// change outside of viewport
-							force_scroll = true;
-						}
-						else {
-							top_adjust += 
-								(change[this_side+'-y-end'] - change[this_side+'-y-start']) - 
-								(change[other_side+'-y-end'] - change[other_side+'-y-start']);
-						}
-					}
-				}
-			}
-			
-			var vp = this.editor[name].getViewport();
-			var scroll = true;
-			if (last_change) {
-				this.trace('scroll', 'last change before midline', last_change);
-				if (midline.line >= vp.from && midline <= vp.to) {
-					scroll = false;
-				}
-			}
-			this.trace('scroll', 'scroll', scroll);
-			if (scroll || force_scroll) {
-				// scroll the other side
-				this.trace('scroll', 'scrolling other side', top_to - top_adjust);
-				var scroller = jQuery(this.editor[name].getScrollerElement());
-				this._skipscroll[name] = true;//disable next event
-				scroller.scrollTop(top_to - top_adjust).scrollLeft(left_to);
-			}
-			else this.trace('scroll', 'not scrolling other side');
-			
-			if (this.settings.autoupdate) {
-				var timer = new Mgly.Timer();
-				this._calculate_offsets(editor_name1, editor_name2, this.changes);
-				this.trace('change', 'offsets time', timer.stop());
-				this._markup_changes(editor_name1, editor_name2, this.changes);
-				this.trace('change', 'markup time', timer.stop());
-				this._draw_diff(editor_name1, editor_name2, this.changes);
-				this.trace('change', 'draw time', timer.stop());
-			}
-			this.trace('scroll', 'scrolled');
-		}
-	},
-	_changing: function(editor_name1, editor_name2) {
-		this.trace('change', 'changing-timeout', this.changed_timeout);
-		var self = this;
-		if (this.changed_timeout != null) clearTimeout(this.changed_timeout);
-		this.changed_timeout = setTimeout(function(){
-			var timer = new Mgly.Timer();
-			self._changed(editor_name1, editor_name2);
-			self.trace('change', 'total time', timer.stop());
-		}, this.settings.change_timeout);
-	},
-	_changed: function(editor_name1, editor_name2) {
-		this._clear();
-		this._diff(editor_name1, editor_name2);
-	},
-	_clear: function() {
-		var self = this;
-		for (var name in this.editor) {
-			if (!this.editor.hasOwnProperty(name)) continue;
-			var editor = this.editor[name];
-			var fns = self.chfns[name];
-			// clear editor changes
-			editor.operation(function() {
-				var timer = new Mgly.Timer();
-				for (var i = 0, l = editor.lineCount(); i < l; ++i) {
-					editor.removeLineClass(i, 'background');
-				}
-				for (var i = 0; i < fns.length; ++i) {
-					//var edid = editor.getDoc().id;
-					var change = fns[i];
-					//if (change.doc.id != edid) continue;
-					if (change.lines.length) {
-						self.trace('change', 'clear text', change.lines[0].text);
-					}
-					change.clear();
-				}
-				editor.clearGutter('merge');
-				self.trace('change', 'clear time', timer.stop());
-			});
-		}
-		self.chfns[name] = [];
-		
-		var ex = this._draw_info(this.id + '-lhs', this.id + '-rhs');
-		var ctx_lhs = ex.clhs.get(0).getContext('2d');
-		var ctx_rhs = ex.crhs.get(0).getContext('2d');
-		var ctx = ex.dcanvas.getContext('2d');
-		
-		ctx_lhs.beginPath();
-		ctx_lhs.fillStyle = this.settings.bgcolor;
-		ctx_lhs.strokeStyle = '#888';
-		ctx_lhs.fillRect(0, 0, 6.5, ex.visible_page_height);
-		ctx_lhs.strokeRect(0, 0, 6.5, ex.visible_page_height);
-
-		ctx_rhs.beginPath();
-		ctx_rhs.fillStyle = this.settings.bgcolor;
-		ctx_rhs.strokeStyle = '#888';
-		ctx_rhs.fillRect(0, 0, 6.5, ex.visible_page_height);
-		ctx_rhs.strokeRect(0, 0, 6.5, ex.visible_page_height);
-		
-		ctx.beginPath();
-		ctx.fillStyle = '#fff';
-		ctx.fillRect(0, 0, this.draw_mid_width, ex.visible_page_height);
-	},
-	_diff: function(editor_name1, editor_name2) {
-		var lhs = this.editor[editor_name1].getValue();
-		var rhs = this.editor[editor_name2].getValue();
-		var timer = new Mgly.Timer();
-		var d = new Mgly.diff(lhs, rhs, this.settings);
-		this.trace('change', 'diff time', timer.stop());
-		this.changes = Mgly.DiffParser(d.normal_form());
-		this.trace('change', 'parse time', timer.stop());
-		this._calculate_offsets(editor_name1, editor_name2, this.changes);
-		this.trace('change', 'offsets time', timer.stop());
-		this._markup_changes(editor_name1, editor_name2, this.changes);
-		this.trace('change', 'markup time', timer.stop());
-		this._draw_diff(editor_name1, editor_name2, this.changes);
-		this.trace('change', 'draw time', timer.stop());
-	},
-	_parse_diff: function (editor_name1, editor_name2, diff) {
-		this.trace('diff', 'diff results:\n', diff);
-		var changes = [];
-		var change_id = 0;
-		// parse diff
-		var diff_lines = diff.split(/\n/);
-		for (var i = 0; i < diff_lines.length; ++i) {
-			if (diff_lines[i].length == 0) continue;
-			var change = {};
-			var test = this.change_exp.exec(diff_lines[i]);
-			if (test == null) continue;
-			// lines are zero-based
-			var fr = test[1].split(',');
-			change['lhs-line-from'] = fr[0] - 1;
-			if (fr.length == 1) change['lhs-line-to'] = fr[0] - 1;
-			else change['lhs-line-to'] = fr[1] - 1;
-			var to = test[3].split(',');
-			change['rhs-line-from'] = to[0] - 1;
-			if (to.length == 1) change['rhs-line-to'] = to[0] - 1;
-			else change['rhs-line-to'] = to[1] - 1;
-			// TODO: optimize for changes that are adds/removes
-			if (change['lhs-line-from'] < 0) change['lhs-line-from'] = 0;
-			if (change['lhs-line-to'] < 0) change['lhs-line-to'] = 0;
-			if (change['rhs-line-from'] < 0) change['rhs-line-from'] = 0;
-			if (change['rhs-line-to'] < 0) change['rhs-line-to'] = 0;
-			change['op'] = test[2];
-			changes[change_id++] = change;
-			this.trace('diff', 'change', change);
-		}
-		return changes;
-	},
-	_get_viewport: function(editor_name1, editor_name2) {
-		var lhsvp = this.editor[editor_name1].getViewport();
-		var rhsvp = this.editor[editor_name2].getViewport();
-		return {from: Math.min(lhsvp.from, rhsvp.from), to: Math.max(lhsvp.to, rhsvp.to)};
-	},
-	_is_change_in_view: function(vp, change) {
-		if (!this.settings.viewport) return true;
-		if ((change['lhs-line-from'] < vp.from && change['lhs-line-to'] < vp.to) ||
-			(change['lhs-line-from'] > vp.from && change['lhs-line-to'] > vp.to) ||
-			(change['rhs-line-from'] < vp.from && change['rhs-line-to'] < vp.to) ||
-			(change['rhs-line-from'] > vp.from && change['rhs-line-to'] > vp.to)) {
-			// if the change is outside the viewport, skip
-			return false;
-		}
-		return true;
-	},
-	_calculate_offsets: function (editor_name1, editor_name2, changes) {
-		if (this.em_height == null) {
-			// this is the distance from the top of the screen
-			var topnode = jQuery('#' + this.id + ' .CodeMirror-measure').first();
-			var top_offset = topnode.offset().top - 4;
-			if (!top_offset) return;//try again
-			this.draw_top_offset = 0.5 - top_offset;
-			this.em_height = this.editor[editor_name1].defaultTextHeight();
-			if (!this.em_height) {
-				console.warn('Failed to calculate offsets, using 18 by default');
-				this.em_height = 18;
-			}
-			this.draw_lhs_min = 0.5;
-			var c = jQuery('#' + editor_name1 + '-' + editor_name2 + '-canvas');
-			if (!c.length) {
-				console.error('failed to find canvas', '#' + editor_name1 + '-' + editor_name2 + '-canvas');
-			}
-			if (!c.width()) {
-				console.error('canvas width is 0');
-				return;
-			}
-			this.draw_mid_width = jQuery('#' + editor_name1 + '-' + editor_name2 + '-canvas').width();
-			this.draw_rhs_max = this.draw_mid_width - 0.5; //24.5;
-			this.draw_lhs_width = 5;
-			this.draw_rhs_width = 5;
-			this.trace('calc', 'change offsets calculated', {top_offset: top_offset, lhs_min: this.draw_lhs_min, rhs_max: this.draw_rhs_max, lhs_width: this.draw_lhs_width, rhs_width: this.draw_rhs_width});
-		}
-		var lhschc = this.editor[editor_name1].charCoords({line: 0});
-		var rhschc = this.editor[editor_name2].charCoords({line: 0});
-		var vp = this._get_viewport(editor_name1, editor_name2);
-		
-		for (var i = 0; i < changes.length; ++i) {
-			var change = changes[i];
-			
-			if (!this.settings.sidebar && !this._is_change_in_view(vp, change)) {
-				// if the change is outside the viewport, skip
-				delete change['lhs-y-start'];
-				delete change['lhs-y-end'];
-				delete change['rhs-y-start'];
-				delete change['rhs-y-end'];
-				continue;
-			}
-			var llf = change['lhs-line-from'] >= 0 ? change['lhs-line-from'] : 0;
-			var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
-			var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
-			var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
-			
-			var ls, le, rs, re;
-			if (this.editor[editor_name1].getOption('lineWrapping') || this.editor[editor_name1].getOption('lineWrapping')) {
-				// If using line-wrapping, we must get the height of the line
-				var tls = this.editor[editor_name1].cursorCoords({line: llf, ch: 0}, 'page');
-				var lhssh = this.editor[editor_name1].getLineHandle(llf);
-				ls = { top: tls.top, bottom: tls.top + lhssh.height };
-
-				var tle = this.editor[editor_name1].cursorCoords({line: llt, ch: 0}, 'page');
-				var lhseh = this.editor[editor_name1].getLineHandle(llt);
-				le = { top: tle.top, bottom: tle.top + lhseh.height };
-				
-				var tls = this.editor[editor_name2].cursorCoords({line: rlf, ch: 0}, 'page');
-				var rhssh = this.editor[editor_name2].getLineHandle(rlf);
-				rs = { top: tls.top, bottom: tls.top + rhssh.height };
-
-				var tle = this.editor[editor_name2].cursorCoords({line: rlt, ch: 0}, 'page');
-				var rhseh = this.editor[editor_name2].getLineHandle(rlt);
-				re = { top: tle.top, bottom: tle.top + rhseh.height };
-			}
-			else {
-				// If not using line-wrapping, we can calculate the line position
-				ls = { 
-					top: lhschc.top + llf * this.em_height, 
-					bottom: lhschc.bottom + llf * this.em_height + 2
-				};
-				le = {
-					top: lhschc.top + llt * this.em_height, 
-					bottom: lhschc.bottom + llt * this.em_height + 2
-				};
-				rs = {
-					top: rhschc.top + rlf * this.em_height, 
-					bottom: rhschc.bottom + rlf * this.em_height + 2
-				};
-				re = {
-					top: rhschc.top + rlt * this.em_height, 
-					bottom: rhschc.bottom + rlt * this.em_height + 2
-				};
-			}
-			
-			if (change['op'] == 'a') {
-				// adds (right), normally start from the end of the lhs,
-				// except for the case when the start of the rhs is 0
-				if (rlf > 0) {
-					ls.top = ls.bottom;
-					ls.bottom += this.em_height;
-					le = ls;
-				}
-			}
-			else if (change['op'] == 'd') {
-				// deletes (left) normally finish from the end of the rhs,
-				// except for the case when the start of the lhs is 0
-				if (llf > 0) {
-					rs.top = rs.bottom;
-					rs.bottom += this.em_height;
-					re = rs;
-				}
-			}
-			change['lhs-y-start'] = this.draw_top_offset + ls.top;
-			if (change['op'] == 'c' || change['op'] == 'd') {
-				change['lhs-y-end'] = this.draw_top_offset + le.bottom;
-			}
-			else {
-				change['lhs-y-end'] = this.draw_top_offset + le.top;
-			}
-			change['rhs-y-start'] = this.draw_top_offset + rs.top;
-			if (change['op'] == 'c' || change['op'] == 'a') {
-				change['rhs-y-end'] = this.draw_top_offset + re.bottom;
-			}
-			else {
-				change['rhs-y-end'] = this.draw_top_offset + re.top;
-			}
-			this.trace('calc', 'change calculated', i, change);
-		}
-		return changes;
-	},
-	_markup_changes: function (editor_name1, editor_name2, changes) {
-		jQuery('.merge-button').remove(); // clear
-		
-		var self = this;
-		var led = this.editor[editor_name1];
-		var red = this.editor[editor_name2];
-
-		var timer = new Mgly.Timer();
-		led.operation(function() {
-			for (var i = 0; i < changes.length; ++i) {
-				var change = changes[i];
-				var llf = change['lhs-line-from'] >= 0 ? change['lhs-line-from'] : 0;
-				var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
-				var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
-				var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
-				
-				var clazz = ['mergely', 'lhs', change['op'], 'cid-' + i];
-				led.addLineClass(llf, 'background', 'start');
-				led.addLineClass(llt, 'background', 'end');
-				
-				if (llf == 0 && llt == 0 && rlf == 0) {
-					led.addLineClass(llf, 'background', clazz.join(' '));
-					led.addLineClass(llf, 'background', 'first');
-				}
-				else {
-					// apply change for each line in-between the changed lines
-					for (var j = llf; j <= llt; ++j) {
-						led.addLineClass(j, 'background', clazz.join(' '));
-						led.addLineClass(j, 'background', clazz.join(' '));
-					}
-				}
-				
-				if (!red.getOption('readOnly')) {
-					// add widgets to lhs, if rhs is not read only
-					var rhs_button = self.merge_rhs_button.clone();
-					if (rhs_button.button) {
-						//jquery-ui support
-						rhs_button.button({icons: {primary: 'ui-icon-triangle-1-e'}, text: false});
-					}
-					rhs_button.addClass('merge-button');
-					rhs_button.attr('id', 'merge-rhs-' + i);
-					led.setGutterMarker(llf, 'merge', rhs_button.get(0));
-				}
-			}
-		});
-
-		var vp = this._get_viewport(editor_name1, editor_name2);
-		
-		this.trace('change', 'markup lhs-editor time', timer.stop());
-		red.operation(function() {
-			for (var i = 0; i < changes.length; ++i) {
-				var change = changes[i];
-				var llf = change['lhs-line-from'] >= 0 ? change['lhs-line-from'] : 0;
-				var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
-				var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
-				var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
-				
-				if (!self._is_change_in_view(vp, change)) {
-					// if the change is outside the viewport, skip
-					continue;
-				}
-				
-				var clazz = ['mergely', 'rhs', change['op'], 'cid-' + i];
-				red.addLineClass(rlf, 'background', 'start');
-				red.addLineClass(rlt, 'background', 'end');
-				
-				if (rlf == 0 && rlt == 0 && llf == 0) {
-					red.addLineClass(rlf, 'background', clazz.join(' '));
-					red.addLineClass(rlf, 'background', 'first');
-				}
-				else {
-					// apply change for each line in-between the changed lines
-					for (var j = rlf; j <= rlt; ++j) {
-						red.addLineClass(j, 'background', clazz.join(' '));
-						red.addLineClass(j, 'background', clazz.join(' '));
-					}
-				}
-
-				if (!led.getOption('readOnly')) {
-					// add widgets to rhs, if lhs is not read only
-					var lhs_button = self.merge_lhs_button.clone();
-					if (lhs_button.button) {
-						//jquery-ui support
-						lhs_button.button({icons: {primary: 'ui-icon-triangle-1-w'}, text: false});
-					}
-					lhs_button.addClass('merge-button');
-					lhs_button.attr('id', 'merge-lhs-' + i);
-					red.setGutterMarker(rlf, 'merge', lhs_button.get(0));
-				}
-			}
-		});
-		this.trace('change', 'markup rhs-editor time', timer.stop());
-		
-		// mark text deleted, LCS changes
-		var marktext = [];
-		for (var i = 0; this.settings.lcs && i < changes.length; ++i) {
-			var change = changes[i];
-			var llf = change['lhs-line-from'] >= 0 ? change['lhs-line-from'] : 0;
-			var llt = change['lhs-line-to'] >= 0 ? change['lhs-line-to'] : 0;
-			var rlf = change['rhs-line-from'] >= 0 ? change['rhs-line-from'] : 0;
-			var rlt = change['rhs-line-to'] >= 0 ? change['rhs-line-to'] : 0;
-			
-			if (!this._is_change_in_view(vp, change)) {
-				// if the change is outside the viewport, skip
-				continue;
-			}
-			if (change['op'] == 'd') {
-				// apply delete to cross-out (left-hand side only)
-				var from = llf;
-				var to = llt;
-				var to_ln = led.lineInfo(to);
-				if (to_ln) {
-					marktext.push([led, {line:from, ch:0}, {line:to, ch:to_ln.text.length}, {className: 'mergely ch d lhs'}]);
-				}
-			}
-			else if (change['op'] == 'c') {
-				// apply LCS changes to each line
-				for (var j = llf, k = rlf, p = 0; 
-					 ((j >= 0) && (j <= llt)) || ((k >= 0) && (k <= rlt));
-					 ++j, ++k) {
-					if (k + p > rlt) {
-						// lhs continues past rhs, mark lhs as deleted
-						var lhs_line = led.getLine( j );
-						marktext.push([led, {line:j, ch:0}, {line:j, ch:lhs_line.length}, {className: 'mergely ch d lhs'}]);
-						continue;
-					}
-					if (j + p > llt) {
-						// rhs continues past lhs, mark rhs as added
-						var rhs_line = red.getLine( k );
-						marktext.push([red, {line:k, ch:0}, {line:k, ch:rhs_line.length}, {className: 'mergely ch a rhs'}]);
-						continue;
-					}
-					var lhs_line = led.getLine( j );
-					var rhs_line = red.getLine( k );
-					var lhs_start = { line: -1, ch: -1 };
-					var lhs_stop = { line: -1, ch: -1 };
-					var rhs_start = { line: -1, ch: -1 };
-					var rhs_stop = { line: -1, ch: -1 };
-					
-					var lcs = new Mgly.LCS(lhs_line, rhs_line);
-					lcs.diff(
-						function (from, to) {//added
-							marktext.push([red, {line:k, ch:from}, {line:k, ch:to}, {className: 'mergely ch a rhs'}]);
-						},
-						removed = function (from, to) {//removed
-							marktext.push([led, {line:j, ch:from}, {line:j, ch:to}, {className: 'mergely ch d lhs'}]);
-						}
-					);
-				}
-			}
-		}
-		this.trace('change', 'LCS marktext time', timer.stop());
-		
-		// mark changes outside closure
-		led.operation(function() {
-			// apply lhs markup
-			for (var i = 0; i < marktext.length; ++i) {
-				var m = marktext[i];
-				if (m[0].doc.id != led.getDoc().id) continue;
-				self.chfns[self.id + '-lhs'].push(m[0].markText(m[1], m[2], m[3]));
-			}
-		});
-		red.operation(function() {
-			// apply lhs markup
-			for (var i = 0; i < marktext.length; ++i) {
-				var m = marktext[i];
-				if (m[0].doc.id != red.getDoc().id) continue;
-				self.chfns[self.id + '-rhs'].push(m[0].markText(m[1], m[2], m[3]));
-			}
-		});
-		this.trace('change', 'LCS markup time', timer.stop());
-		
-		// merge buttons
-		var ed = {lhs:led, rhs:red};
-		jQuery('.merge-button').on('click', function(ev){
-			// side of mouseenter
-			var side = 'rhs';
-			var oside = 'lhs';
-			var parent = jQuery(this).parents('#' + self.id + '-editor-lhs');
-			if (parent.length) {
-				side = 'lhs';
-				oside = 'rhs';
-			}
-			var pos = ed[side].coordsChar({left:ev.pageX, top:ev.pageY});
-
-			// get the change id
-			var cid = null;
-			var info = ed[side].lineInfo(pos.line);
-			jQuery.each(info.bgClass.split(' '), function(i, clazz) {
-				if (clazz.indexOf('cid-') == 0) {
-					cid = parseInt(clazz.split('-')[1], 10);
-					return false;
-				}
-			});
-			var change = self.changes[cid];
-
-			var line = {lhs: ed['lhs'].lineInfo(llt), rhs: ed['rhs'].lineInfo(rlt)};
-	
-			var text = ed[side].getRange(
-				CodeMirror.Pos(change[side + '-line-from'], 0),
-				CodeMirror.Pos(change[side + '-line-to'] + 1, 0));
-			
-			if (change['op'] == 'c') {
-				ed[oside].replaceRange(text,
-					CodeMirror.Pos(change[oside + '-line-from'], 0),
-					CodeMirror.Pos(change[oside + '-line-to'] + 1, 0));
-			}
-			else if (side == 'rhs') {
-				if (change['op'] == 'a') {
-					ed[oside].replaceRange(text,
-						CodeMirror.Pos(change[oside + '-line-from'] + 1, 0),
-						CodeMirror.Pos(change[oside + '-line-to'] + 1, 0));
-				}
-				else {// 'd'
-					var from = parseInt(change[oside + '-line-from']);
-					var to = parseInt(change[oside + '-line-to']);
-					for (var i = to; i >= from; --i) {
-						ed[oside].removeLine(i);
-					}
-				}
-			}
-			else if (side == 'lhs') {
-				if (change['op'] == 'a') {
-					var from = parseInt(change[oside + '-line-from']);
-					var to = parseInt(change[oside + '-line-to']);
-					for (var i = to; i >= from; --i) {
-						ed[oside].removeLine(i);
-					}
-				}
-				else {// 'd'
-					ed[oside].replaceRange( text,
-						CodeMirror.Pos(change[oside + '-line-from'] + 1, 0));
-				}
-			}
-			//reset
-			ed['lhs'].setValue(ed['lhs'].getValue());
-			ed['rhs'].setValue(ed['rhs'].getValue());
-			return false;
-		});
-		this.trace('change', 'markup buttons time', timer.stop());
-	},
-	_draw_info: function(editor_name1, editor_name2) {
-		var visible_page_height = jQuery(this.editor[editor_name1].getScrollerElement()).height();
-		var gutter_height = jQuery(this.editor[editor_name1].getScrollerElement()).children(':first-child').height();
-		var dcanvas = document.getElementById(editor_name1 + '-' + editor_name2 + '-canvas');
-		if (dcanvas == undefined) throw 'Failed to find: ' + editor_name1 + '-' + editor_name2 + '-canvas';
-		var clhs = jQuery('#' + this.id + '-lhs-margin');
-		var crhs = jQuery('#' + this.id + '-rhs-margin');
-		return {
-			visible_page_height: visible_page_height,
-			gutter_height: gutter_height,
-			visible_page_ratio: (visible_page_height / gutter_height),
-			margin_ratio: (visible_page_height / gutter_height),
-			lhs_scroller: jQuery(this.editor[editor_name1].getScrollerElement()),
-			rhs_scroller: jQuery(this.editor[editor_name2].getScrollerElement()),
-			lhs_lines: this.editor[editor_name1].lineCount(),
-			rhs_lines: this.editor[editor_name2].lineCount(),
-			dcanvas: dcanvas,
-			clhs: clhs,
-			crhs: crhs,
-			lhs_xyoffset: jQuery(clhs).offset(),
-			rhs_xyoffset: jQuery(crhs).offset()
-		};
-	},
-	_draw_diff: function(editor_name1, editor_name2, changes) {
-		var ex = this._draw_info(editor_name1, editor_name2);
-		var mcanvas_lhs = ex.clhs.get(0);
-		var mcanvas_rhs = ex.crhs.get(0);
-		var ctx = ex.dcanvas.getContext('2d');
-		var ctx_lhs = mcanvas_lhs.getContext('2d');
-		var ctx_rhs = mcanvas_rhs.getContext('2d');
-
-		this.trace('draw', 'visible_page_height', ex.visible_page_height);
-		this.trace('draw', 'gutter_height', ex.gutter_height);
-		this.trace('draw', 'visible_page_ratio', ex.visible_page_ratio);
-		this.trace('draw', 'lhs-scroller-top', ex.lhs_scroller.scrollTop());
-		this.trace('draw', 'rhs-scroller-top', ex.rhs_scroller.scrollTop());
-		
-		jQuery.each(jQuery.find('#' + this.id + ' canvas'), function () {
-			jQuery(this).get(0).height = ex.visible_page_height;
-		});
-		
-		ex.clhs.unbind('click');
-		ex.crhs.unbind('click');
-		
-		ctx_lhs.beginPath();
-		ctx_lhs.fillStyle = this.settings.bgcolor;
-		ctx_lhs.strokeStyle = '#888';
-		ctx_lhs.fillRect(0, 0, 6.5, ex.visible_page_height);
-		ctx_lhs.strokeRect(0, 0, 6.5, ex.visible_page_height);
-
-		ctx_rhs.beginPath();
-		ctx_rhs.fillStyle = this.settings.bgcolor;
-		ctx_rhs.strokeStyle = '#888';
-		ctx_rhs.fillRect(0, 0, 6.5, ex.visible_page_height);
-		ctx_rhs.strokeRect(0, 0, 6.5, ex.visible_page_height);
-
-		var vp = this._get_viewport(editor_name1, editor_name2);
-		for (var i = 0; i < changes.length; ++i) {
-			var change = changes[i];
-
-			this.trace('draw', change);
-			// margin indicators
-			var lhs_y_start = ((change['lhs-y-start'] + ex.lhs_scroller.scrollTop()) * ex.visible_page_ratio);
-			var lhs_y_end = ((change['lhs-y-end'] + ex.lhs_scroller.scrollTop()) * ex.visible_page_ratio) + 1;
-			var rhs_y_start = ((change['rhs-y-start'] + ex.rhs_scroller.scrollTop()) * ex.visible_page_ratio);
-			var rhs_y_end = ((change['rhs-y-end'] + ex.rhs_scroller.scrollTop()) * ex.visible_page_ratio) + 1;
-			this.trace('draw', 'marker calculated', lhs_y_start, lhs_y_end, rhs_y_start, rhs_y_end);
-
-			ctx_lhs.beginPath();
-			ctx_lhs.fillStyle = this.settings.fgcolor[change['op']];
-			ctx_lhs.strokeStyle = '#000';
-			ctx_lhs.lineWidth = 0.5;
-			ctx_lhs.fillRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
-			ctx_lhs.strokeRect(1.5, lhs_y_start, 4.5, Math.max(lhs_y_end - lhs_y_start, 5));
-
-			ctx_rhs.beginPath();
-			ctx_rhs.fillStyle = this.settings.fgcolor[change['op']];
-			ctx_rhs.strokeStyle = '#000';
-			ctx_rhs.lineWidth = 0.5;
-			ctx_rhs.fillRect(1.5, rhs_y_start, 4.5, Math.max(rhs_y_end - rhs_y_start, 5));
-			ctx_rhs.strokeRect(1.5, rhs_y_start, 4.5, Math.max(rhs_y_end - rhs_y_start, 5));
-			
-			if (!this._is_change_in_view(vp, change)) {
-				continue;
-			}
-			
-			lhs_y_start = change['lhs-y-start'];
-			lhs_y_end = change['lhs-y-end'];
-			rhs_y_start = change['rhs-y-start'];
-			rhs_y_end = change['rhs-y-end'];
-			
-			var radius = 3;
-			
-			// draw left box
-			ctx.beginPath();
-			ctx.strokeStyle = this.settings.fgcolor[change['op']];
-			ctx.lineWidth = 1;
-			
-			var rectWidth = this.draw_lhs_width;
-			var rectHeight = lhs_y_end - lhs_y_start - 1;
-			var rectX = this.draw_lhs_min;
-			var rectY = lhs_y_start;
-			// top and top top-right corner
-			
-			// draw left box
-			ctx.moveTo(rectX, rectY);
-			if (navigator.appName == 'Microsoft Internet Explorer') {
-				// IE arcs look awful
-				ctx.lineTo(this.draw_lhs_min + this.draw_lhs_width, lhs_y_start);
-				ctx.lineTo(this.draw_lhs_min + this.draw_lhs_width, lhs_y_end + 1);
-				ctx.lineTo(this.draw_lhs_min, lhs_y_end + 1);
-			}
-			else {
-				if (rectHeight <= 0) {
-					ctx.lineTo(rectX + rectWidth, rectY);
-				}
-				else {
-					ctx.arcTo(rectX + rectWidth, rectY, rectX + rectWidth, rectY + radius, radius);
-					ctx.arcTo(rectX + rectWidth, rectY + rectHeight, rectX + rectWidth - radius, rectY + rectHeight, radius);
-				}
-				// bottom line
-				ctx.lineTo(rectX, rectY + rectHeight);
-			}
-			ctx.stroke();
-			
-			rectWidth = this.draw_rhs_width;
-			rectHeight = rhs_y_end - rhs_y_start - 1;
-			rectX = this.draw_rhs_max;
-			rectY = rhs_y_start;
-
-			// draw right box
-			ctx.moveTo(rectX, rectY);
-			if (navigator.appName == 'Microsoft Internet Explorer') {
-				ctx.lineTo(this.draw_rhs_max - this.draw_rhs_width, rhs_y_start);
-				ctx.lineTo(this.draw_rhs_max - this.draw_rhs_width, rhs_y_end + 1);
-				ctx.lineTo(this.draw_rhs_max, rhs_y_end + 1);
-			}
-			else {
-				if (rectHeight <= 0) {
-					ctx.lineTo(rectX - rectWidth, rectY);
-				}
-				else {
-					ctx.arcTo(rectX - rectWidth, rectY, rectX - rectWidth, rectY + radius, radius);
-					ctx.arcTo(rectX - rectWidth, rectY + rectHeight, rectX - radius, rectY + rectHeight, radius);
-				}
-				ctx.lineTo(rectX, rectY + rectHeight);
-			}
-			ctx.stroke();
-			
-			// connect boxes
-			var cx = this.draw_lhs_min + this.draw_lhs_width;
-			var cy = lhs_y_start + (lhs_y_end + 1 - lhs_y_start) / 2.0;
-			var dx = this.draw_rhs_max - this.draw_rhs_width;
-			var dy = rhs_y_start + (rhs_y_end + 1 - rhs_y_start) / 2.0;
-			ctx.moveTo(cx, cy);
-			if (cy == dy) {
-				ctx.lineTo(dx, dy);
-			}
-			else {
-				// fancy!
-				ctx.bezierCurveTo(
-					cx + 12, cy - 3, // control-1 X,Y
-					dx - 12, dy - 3, // control-2 X,Y
-					dx, dy);
-			}
-			ctx.stroke();
-		}
-
-		// visible window feedback
-		ctx_lhs.fillStyle = this.settings.vpcolor;
-		ctx_rhs.fillStyle = this.settings.vpcolor;
-		
-		var lto = ex.clhs.height() * ex.visible_page_ratio;
-		var lfrom = (ex.lhs_scroller.scrollTop() / ex.gutter_height) * ex.clhs.height();
-		var rto = ex.crhs.height() * ex.visible_page_ratio;
-		var rfrom = (ex.rhs_scroller.scrollTop() / ex.gutter_height) * ex.crhs.height();
-		this.trace('draw', 'cls.height', ex.clhs.height());
-		this.trace('draw', 'lhs_scroller.scrollTop()', ex.lhs_scroller.scrollTop());
-		this.trace('draw', 'gutter_height', ex.gutter_height);
-		this.trace('draw', 'visible_page_ratio', ex.visible_page_ratio);
-		this.trace('draw', 'lhs from', lfrom, 'lhs to', lto);
-		this.trace('draw', 'rhs from', rfrom, 'rhs to', rto);
-		
-		ctx_lhs.fillRect(1.5, lfrom, 4.5, lto);
-		ctx_rhs.fillRect(1.5, rfrom, 4.5, rto);
-		
-		ex.clhs.click(function (ev) {
-			var y = ev.pageY - ex.lhs_xyoffset.top - (lto / 2);
-			var sto = Math.max(0, (y / mcanvas_lhs.height) * ex.lhs_scroller.get(0).scrollHeight);
-			ex.lhs_scroller.scrollTop(sto);
-		});
-		ex.crhs.click(function (ev) {
-			var y = ev.pageY - ex.rhs_xyoffset.top - (rto / 2);
-			var sto = Math.max(0, (y / mcanvas_rhs.height) * ex.rhs_scroller.get(0).scrollHeight);			
-			ex.rhs_scroller.scrollTop(sto);
-		});
-	},
-	trace: function(name) {
-		if(this.settings._debug.indexOf(name) >= 0) {
-			arguments[0] = name+':';
-			console.log([].slice.apply(arguments));
-		} 
-	}
-});
-
-jQuery.pluginMaker = function(plugin) {
-	// add the plugin function as a jQuery plugin
-	jQuery.fn[plugin.prototype.name] = function(options) {
-		// get the arguments 
-		var args = jQuery.makeArray(arguments),
-		after = args.slice(1);
-		var rc = undefined;
-		this.each(function() {
-			// see if we have an instance
-			var instance = jQuery.data(this, plugin.prototype.name);
-			if (instance) {
-				// call a method on the instance
-				if (typeof options == "string") {
-					rc = instance[options].apply(instance, after);
-				} else if (instance.update) {
-					// call update on the instance
-					return instance.update.apply(instance, args);
-				}
-			} else {
-				// create the plugin
-				new plugin(this, options);
-			}
-		});
-		if (rc != undefined) return rc;
-	};
-};
-
-// make the mergely widget
-jQuery.pluginMaker(Mgly.mergely);
 
public/javascripts/lib/mergely/mergely.min.js (deleted)
--- public/javascripts/lib/mergely/mergely.min.js
@@ -1,6 +0,0 @@
-/**
- * Copyright (c) 2013 by Jamie Peabody, http://www.mergely.com
- * All rights reserved.
- * Version: 3.3.3 2013-06-24
- */
-Mgly={},Mgly.Timer=function(){var a=this;a.start=function(){a.t0=(new Date).getTime()},a.stop=function(){var b=(new Date).getTime(),c=b-a.t0;return a.t0=b,c},a.start()},Mgly.ChangeExpression=RegExp(/(\d+(?:,\d+)?)([acd])(\d+(?:,\d+)?)/),Mgly.DiffParser=function(a){for(var b=[],c=0,d=a.split(/\n/),e=0;d.length>e;++e)if(0!=d[e].length){var f={},g=Mgly.ChangeExpression.exec(d[e]);if(null!=g){var h=g[1].split(",");f["lhs-line-from"]=h[0]-1,f["lhs-line-to"]=1==h.length?h[0]-1:h[1]-1;var i=g[3].split(",");f["rhs-line-from"]=i[0]-1,f["rhs-line-to"]=1==i.length?i[0]-1:i[1]-1,f.op=g[2],b[c++]=f}}return b},Mgly.sizeOf=function(a){var c,b=0;for(c in a)a.hasOwnProperty(c)&&b++;return b},Mgly.LCS=function(a,b){this.x=a.replace(/[ ]{1}/g,"\n"),this.y=b.replace(/[ ]{1}/g,"\n")},jQuery.extend(Mgly.LCS.prototype,{clear:function(){this.ready=0},diff:function(a,b){for(var c=new Mgly.diff(this.x,this.y,retain_lines=!0,ignore_ws=!1),d=Mgly.DiffParser(c.normal_form()),e=0,f=0,g=0;d.length>g;++g){var h=d[g];if("a"!=h.op){e=c.lhs_lines.slice(0,h["lhs-line-from"]).join(" ").length,f=h["lhs-line-to"]+1;var i=c.lhs_lines.slice(h["lhs-line-from"],f).join(" ");"d"==h.op?i+=" ":e>0&&"c"==h.op&&(e+=1),b(e,e+i.length)}if("d"!=h.op){e=c.rhs_lines.slice(0,h["rhs-line-from"]).join(" ").length,f=h["rhs-line-to"]+1;var j=c.rhs_lines.slice(h["rhs-line-from"],f).join(" ");"a"==h.op?j+=" ":e>0&&"c"==h.op&&(e+=1),a(e,e+j.length)}}}}),Mgly.diff=function(a,b,c,d){this.diff_codes={},this.max_code=0;var e=a.split("\n"),f=b.split("\n");0==a.length&&(e=[]),0==b.length&&(f=[]);var g=Object();g.data=this._diff_codes(e,d),g.modified={},g.length=Mgly.sizeOf(g.data);var h=Object();h.data=this._diff_codes(f,d),h.modified={},h.length=Mgly.sizeOf(h.data);var i=g.length+h.length+1,j=Array(2*i+2),k=Array(2*i+2);this._lcs(g,0,g.length,h,0,h.length,k,j),this._optimize(g),this._optimize(h),this.items=this._create_diffs(g,h),c&&(this.lhs_lines=e,this.rhs_lines=f)},jQuery.extend(Mgly.diff.prototype,{changes:function(){return this.items},normal_form:function(){for(var a="",b=0;this.items.length>b;++b){var c=this.items[b],d="",e="",f="c";if(0==c.lhs_deleted_count&&c.rhs_inserted_count>0?f="a":c.lhs_deleted_count>0&&0==c.rhs_inserted_count&&(f="d"),d=1==c.lhs_deleted_count?c.lhs_start+1:0==c.lhs_deleted_count?c.lhs_start:c.lhs_start+1+","+(c.lhs_start+c.lhs_deleted_count),e=1==c.rhs_inserted_count?c.rhs_start+1:0==c.rhs_inserted_count?c.rhs_start:c.rhs_start+1+","+(c.rhs_start+c.rhs_inserted_count),a+=d+f+e+"\n",this.rhs_lines&&this.lhs_lines){for(var g=c.lhs_start;c.lhs_start+c.lhs_deleted_count>g;++g)a+="< "+this.lhs_lines[g]+"\n";c.rhs_inserted_count&&c.lhs_deleted_count&&(a+="---\n");for(var g=c.rhs_start;c.rhs_start+c.rhs_inserted_count>g;++g)a+="> "+this.rhs_lines[g]+"\n"}}return a},_diff_codes:function(a,b){this.max_code;for(var d={},e=0;a.length>e;++e){var f=a[e];b&&(f=f.replace(/\s+/g,""));var g=this.diff_codes[f];void 0!=g?d[e]=g:(this.max_code++,this.diff_codes[f]=this.max_code,d[e]=this.max_code)}return d},_lcs:function(a,b,c,d,e,f,g,h){for(;c>b&&f>e&&a.data[b]==d.data[e];)++b,++e;for(;c>b&&f>e&&a.data[c-1]==d.data[f-1];)--c,--f;if(b==c)for(;f>e;)d.modified[e++]=!0;else if(e==f)for(;c>b;)a.modified[b++]=!0;else{var i=this._sms(a,b,c,d,e,f,g,h);this._lcs(a,b,i.x,d,e,i.y,g,h),this._lcs(a,i.x,c,d,i.y,f,g,h)}},_sms:function(a,b,c,d,e,f,g,h){var i=a.length+d.length+1,j=b-e,k=c-f,l=c-b-(f-e),m=0!=(1&l),n=i-j,o=i-k,p=(c-b+f-e)/2+1;h[n+j+1]=b,g[o+k-1]=c;for(var q={x:0,y:0},r=0;p>=r;++r){for(var s=j-r;j+r>=s;s+=2){var t,u;for(s==j-r?t=h[n+s+1]:(t=h[n+s-1]+1,j+r>s&&h[n+s+1]>=t&&(t=h[n+s+1])),u=t-s;c>t&&f>u&&a.data[t]==d.data[u];)t++,u++;if(h[n+s]=t,m&&s>k-r&&k+r>s&&g[o+s]<=h[n+s])return q.x=h[n+s],q.y=h[n+s]-s,q}for(var s=k-r;k+r>=s;s+=2){var t,u;for(s==k+r?t=g[o+s-1]:(t=g[o+s+1]-1,s>k-r&&t>g[o+s-1]&&(t=g[o+s-1])),u=t-s;t>b&&u>e&&a.data[t-1]==d.data[u-1];)t--,u--;if(g[o+s]=t,!m&&s>=j-r&&j+r>=s&&g[o+s]<=h[n+s])return q.x=h[n+s],q.y=h[n+s]-s,q}}throw"the algorithm should never come here."},_optimize:function(a){for(var b=0,c=0;a.length>b;){for(;a.length>b&&(void 0==a.modified[b]||0==a.modified[b]);)b++;for(c=b;a.length>c&&1==a.modified[c];)c++;a.length>c&&a.data[b]==a.data[c]?(a.modified[b]=!1,a.modified[c]=!0):b=c}},_create_diffs:function(a,b){for(var c=[],d=0,e=0,f=0,g=0;a.length>f||b.length>g;)if(a.length>f&&!a.modified[f]&&b.length>g&&!b.modified[g])f++,g++;else{for(d=f,e=g;a.length>f&&(g>=b.length||a.modified[f]);)f++;for(;b.length>g&&(f>=a.length||b.modified[g]);)g++;if(f>d||g>e){var h=Object();h.lhs_start=d,h.rhs_start=e,h.lhs_deleted_count=f-d,h.rhs_inserted_count=g-e,c.push(h)}}return c}}),Mgly.mergely=function(a,b){CodeMirror.defineExtension("centerOnCursor",function(){var a=this.cursorCoords(null,"local");this.scrollTo(null,(a.y+a.yBot)/2-this.getScrollerElement().clientHeight/2)}),a&&this.init(a,b)},jQuery.extend(Mgly.mergely.prototype,{name:"mergely",init:function(a,b){this.settings={autoupdate:!0,autoresize:!0,rhs_margin:"right",lcs:!0,sidebar:!0,viewport:!1,ignorews:!1,fadein:"fast",editor_width:"400px",editor_height:"400px",resize_timeout:500,change_timeout:150,fgcolor:{a:"#4ba3fa",c:"#a3a3a3",d:"#ff7f7f"},bgcolor:"#eee",vpcolor:"rgba(0, 0, 200, 0.5)",lhs:function(){},rhs:function(){},loaded:function(){},_auto_width:function(a){return a},resize:function(b){var c=b?16:0,d=jQuery(a).parent().width()+c;"auto"==this.width?d=this._auto_width(d):(d=this.width,this.editor_width=d),"auto"==this.height?h=jQuery(a).parent().height():(h=this.height,this.editor_height=h);var e=d/2-16-8,f=h,g=jQuery(a);g.find(".mergely-column").css({width:e+"px"}),g.find(".mergely-column, .mergely-canvas, .mergely-margin, .mergely-column textarea, .CodeMirror-scroll, .cm-s-default").css({height:f+"px"}),g.find(".mergely-canvas").css({height:f+"px"}),g.find(".mergely-column textarea").css({width:e+"px"}),g.css({width:d,height:h,clear:"both"}),"none"==g.css("display")&&(0!=this.fadein?g.fadeIn(this.fadein):g.show(),this.loaded&&this.loaded()),this.resized&&this.resized()},_debug:"",resized:function(){}};var c={mode:"text/plain",readOnly:!1,lineWrapping:!1,lineNumbers:!0,gutters:["merge","CodeMirror-linenumbers"]};this.lhs_cmsettings={},this.rhs_cmsettings={},this.element=jQuery(a),b&&b.cmsettings&&jQuery.extend(this.lhs_cmsettings,c,b.cmsettings,b.lhs_cmsettings),b&&b.cmsettings&&jQuery.extend(this.rhs_cmsettings,c,b.cmsettings,b.rhs_cmsettings),b&&jQuery.extend(this.settings,b),this.element.bind("destroyed",jQuery.proxy(this.teardown,this)),jQuery.data(a,this.name,this),this._setup(a)},bind:function(){var a=jQuery("#"+this.id+"-rhs").get(0);if(!a)return console.error("rhs textarea not defined - Mergely not initialized properly"),void 0;var b=jQuery("#"+this.id+"-lhs").get(0);if(!a)return console.error("lhs textarea not defined - Mergely not initialized properly"),void 0;var c=this;if(this.editor=[],this.editor[this.id+"-lhs"]=CodeMirror.fromTextArea(b,this.lhs_cmsettings),this.editor[this.id+"-rhs"]=CodeMirror.fromTextArea(a,this.rhs_cmsettings),this.editor[this.id+"-lhs"].on("change",function(){c.settings.autoupdate&&c._changing(c.id+"-lhs",c.id+"-rhs")}),this.editor[this.id+"-lhs"].on("scroll",function(){c._scrolling(c.id+"-lhs")}),this.editor[this.id+"-rhs"].on("change",function(){c.settings.autoupdate&&c._changing(c.id+"-lhs",c.id+"-rhs")}),this.editor[this.id+"-rhs"].on("scroll",function(){c._scrolling(c.id+"-rhs")}),this.settings.autoresize){var d=null,e=function(a){c.settings.resize&&c.settings.resize(a),c.editor[c.id+"-lhs"].refresh(),c.editor[c.id+"-rhs"].refresh(),c.settings.autoupdate&&c._changing(c.id+"-lhs",c.id+"-rhs")};jQuery(window).resize(function(){d&&clearTimeout(d),d=setTimeout(e,c.settings.resize_timeout)}),e(!0)}},unbind:function(){null!=this.changed_timeout&&clearTimeout(this.changed_timeout),this.editor[this.id+"-lhs"].toTextArea(),this.editor[this.id+"-rhs"].toTextArea()},destroy:function(){this.element.unbind("destroyed",this.teardown),this.teardown()},teardown:function(){this.unbind()},lhs:function(a){this.editor[this.id+"-lhs"].setValue(a)},rhs:function(a){this.editor[this.id+"-rhs"].setValue(a)},update:function(){this._changing(this.id+"-lhs",this.id+"-rhs")},unmarkup:function(){this._clear()},scrollTo:function(a,b){var c=this.editor[this.id+"-lhs"],d=this.editor[this.id+"-rhs"];"lhs"==a?(c.setCursor(b),c.centerOnCursor()):(d.setCursor(b),d.centerOnCursor())},options:function(a){if(!a)return this.settings;if(jQuery.extend(this.settings,a),a.autoresize&&this.resize(),a.autoupdate&&this.update(),a.hasOwnProperty("rhs_margin"))if("left"==a.rhs_margin)this.element.find(".mergely-margin:last-child").insertAfter(this.element.find(".mergely-canvas"));else{var b=this.element.find(".mergely-margin").last();b.appendTo(b.parent())}a.hasOwnProperty("sidebar")&&(a.sidebar?jQuery(this.element).find(".mergely-margin").css({display:"block"}):jQuery(this.element).find(".mergely-margin").css({display:"none"}))},swap:function(){if(!this.lhs_cmsettings.readOnly&&!this.rhs_cmsettings.readOnly){var a=this.editor[this.id+"-lhs"],b=this.editor[this.id+"-rhs"],c=b.getValue();b.setValue(a.getValue()),a.setValue(c)}},merge:function(a){var b=this.editor[this.id+"-lhs"],c=this.editor[this.id+"-rhs"];"lhs"!=a||this.lhs_cmsettings.readOnly?this.rhs_cmsettings.readOnly||c.setValue(b.getValue()):b.setValue(c.getValue())},get:function(a){var b=this.editor[this.id+"-"+a],c=b.getValue();return void 0==c?"":c},clear:function(a){if(!("lhs"==a&&this.lhs_cmsettings.readOnly||"rhs"==a&&this.rhs_cmsettings.readOnly)){var b=this.editor[this.id+"-"+a];b.setValue("")}},cm:function(a){return this.editor[this.id+"-"+a]},search:function(a,b,c){var f,d=this.editor[this.id+"-lhs"],e=this.editor[this.id+"-rhs"];f="lhs"==a?d:e,c="prev"==c?"findPrevious":"findNext",(0==f.getSelection().length||this.prev_query[a]!=b)&&(this.cursor[this.id]=f.getSearchCursor(b,{line:0,ch:0},!1),this.prev_query[a]=b);var g=this.cursor[this.id];g[c]()?f.setSelection(g.from(),g.to()):g=f.getSearchCursor(b,{line:0,ch:0},!1)},resize:function(){this.settings.resize(),this._changing(this.id+"-lhs",this.id+"-rhs")},diff:function(){var a=this.editor[this.id+"-lhs"].getValue(),b=this.editor[this.id+"-rhs"].getValue(),c=new Mgly.diff(a,b,retain_lines=!0,ignore_ws=this.settings.ignorews);return c.normal_form()},_setup:function(a){jQuery(this.element).hide(),this.id=jQuery(a).attr("id");var b=this.settings.editor_height,c=this.settings.editor_width;this.changed_timeout=null,this.chfns={},this.chfns[this.id+"-lhs"]=[],this.chfns[this.id+"-rhs"]=[],this.prev_query=[],this.cursor=[],this._skipscroll={},this.change_exp=RegExp(/(\d+(?:,\d+)?)([acd])(\d+(?:,\d+)?)/);var d,e;if(void 0!=jQuery.button)d='<button title="Merge left"></button>',e='<button title="Merge right"></button>';else{var f="opacity:0.4;width:10px;height:15px;background-color:#888;cursor:pointer;text-align:center;color:#eee;border:1px solid: #222;margin-right:5px;";d='<div style="'+f+'" title="Merge left">&lt;</div>',e='<div style="'+f+'" title="Merge right">&gt;</div>'}this.merge_rhs_button=jQuery(e),this.merge_lhs_button=jQuery(d),jQuery(this.element).append(jQuery('<div class="mergely-margin" style="height: '+b+'"><canvas id="'+this.id+'-lhs-margin" width="8px" height="'+b+'"></canvas></div>')),jQuery(this.element).append(jQuery('<div style="position:relative;width:'+c+"; height:"+b+'" id="'+this.id+'-editor-lhs" class="mergely-column"><textarea style="" id="'+this.id+'-lhs"></textarea></div>')),jQuery(this.element).append(jQuery('<div class="mergely-canvas" style="height: '+b+'"><canvas id="'+this.id+"-lhs-"+this.id+'-rhs-canvas" style="width:28px" width="28px" height="'+b+'"></canvas></div>'));var g=jQuery('<div class="mergely-margin" style="height: '+b+'"><canvas id="'+this.id+'-rhs-margin" width="8px" height="'+b+'"></canvas></div>');this.settings.sidebar||jQuery(this.element).find(".mergely-margin").css({display:"none"}),"left"==this.settings.rhs_margin&&jQuery(this.element).append(g),jQuery(this.element).append(jQuery('<div style="width:'+c+"; height:"+b+'" id="'+this.id+'-editor-rhs" class="mergely-column"><textarea style="" id="'+this.id+'-rhs"></textarea></div>')),"left"!=this.settings.rhs_margin&&jQuery(this.element).append(g);var h="#"+this.id+" .CodeMirror-gutter-text { padding: 5px 0 0 0; }"+"#"+this.id+" .CodeMirror-lines pre, "+"#"+this.id+" .CodeMirror-gutter-text pre { line-height: 18px; }"+".CodeMirror-linewidget { overflow: hidden; };";if(this.settings.autoresize&&(h+=this.id+" .CodeMirror-scroll { height: 100%; overflow: auto; }"),jQuery('<style type="text/css">'+h+"</style>").appendTo("head"),this.bind(),this.settings.lhs){var i=this.editor[this.id+"-lhs"].getDoc().setValue;this.settings.lhs(i.bind(this.editor[this.id+"-lhs"].getDoc()))}if(this.settings.rhs){var i=this.editor[this.id+"-rhs"].getDoc().setValue;this.settings.rhs(i.bind(this.editor[this.id+"-rhs"].getDoc()))}},_scrolling:function(a){if(this._skipscroll[a]===!0)return this._skipscroll[a]=!1,void 0;var b=jQuery(this.editor[a].getScrollerElement());void 0==this.midway&&(this.midway=(b.height()/2+b.offset().top).toFixed(2));var c=this.editor[a].coordsChar({left:0,top:this.midway}),d=b.scrollTop(),e=b.scrollLeft();this.trace("scroll","side",a),this.trace("scroll","midway",this.midway),this.trace("scroll","midline",c),this.trace("scroll","top_to",d),this.trace("scroll","left_to",e);var f=this.id+"-lhs",g=this.id+"-rhs";for(var h in this.editor)if(this.editor.hasOwnProperty(h)&&a!=h){for(var i=a.replace(this.id+"-",""),j=h.replace(this.id+"-",""),k=0,l=null,m=!1,n=0;this.changes.length>n;++n){var o=this.changes[n];c.line>=o[i+"-line-from"]&&(l=o,c.line>=l[i+"-line-to"]&&(o.hasOwnProperty(i+"-y-start")&&o.hasOwnProperty(i+"-y-end")&&o.hasOwnProperty(j+"-y-start")&&o.hasOwnProperty(j+"-y-end")?k+=o[i+"-y-end"]-o[i+"-y-start"]-(o[j+"-y-end"]-o[j+"-y-start"]):m=!0))}var p=this.editor[h].getViewport(),q=!0;if(l&&(this.trace("scroll","last change before midline",l),c.line>=p.from&&p.to>=c&&(q=!1)),this.trace("scroll","scroll",q),q||m){this.trace("scroll","scrolling other side",d-k);var b=jQuery(this.editor[h].getScrollerElement());this._skipscroll[h]=!0,b.scrollTop(d-k).scrollLeft(e)}else this.trace("scroll","not scrolling other side");if(this.settings.autoupdate){var r=new Mgly.Timer;this._calculate_offsets(f,g,this.changes),this.trace("change","offsets time",r.stop()),this._markup_changes(f,g,this.changes),this.trace("change","markup time",r.stop()),this._draw_diff(f,g,this.changes),this.trace("change","draw time",r.stop())}this.trace("scroll","scrolled")}},_changing:function(a,b){this.trace("change","changing-timeout",this.changed_timeout);var c=this;null!=this.changed_timeout&&clearTimeout(this.changed_timeout),this.changed_timeout=setTimeout(function(){var d=new Mgly.Timer;c._changed(a,b),c.trace("change","total time",d.stop())},this.settings.change_timeout)},_changed:function(a,b){this._clear(),this._diff(a,b)},_clear:function(){var a=this;for(var b in this.editor)if(this.editor.hasOwnProperty(b)){var c=this.editor[b],d=a.chfns[b];c.operation(function(){for(var b=new Mgly.Timer,e=0,f=c.lineCount();f>e;++e)c.removeLineClass(e,"background");for(var e=0;d.length>e;++e){var g=d[e];g.lines.length&&a.trace("change","clear text",g.lines[0].text),g.clear()}c.clearGutter("merge"),a.trace("change","clear time",b.stop())})}a.chfns[b]=[];var e=this._draw_info(this.id+"-lhs",this.id+"-rhs"),f=e.clhs.get(0).getContext("2d"),g=e.crhs.get(0).getContext("2d"),h=e.dcanvas.getContext("2d");f.beginPath(),f.fillStyle=this.settings.bgcolor,f.strokeStyle="#888",f.fillRect(0,0,6.5,e.visible_page_height),f.strokeRect(0,0,6.5,e.visible_page_height),g.beginPath(),g.fillStyle=this.settings.bgcolor,g.strokeStyle="#888",g.fillRect(0,0,6.5,e.visible_page_height),g.strokeRect(0,0,6.5,e.visible_page_height),h.beginPath(),h.fillStyle="#fff",h.fillRect(0,0,this.draw_mid_width,e.visible_page_height)},_diff:function(a,b){var c=this.editor[a].getValue(),d=this.editor[b].getValue(),e=new Mgly.Timer,f=new Mgly.diff(c,d,!1,this.settings.ignorews);this.trace("change","diff time",e.stop()),this.changes=Mgly.DiffParser(f.normal_form()),this.trace("change","parse time",e.stop()),this._calculate_offsets(a,b,this.changes),this.trace("change","offsets time",e.stop()),this._markup_changes(a,b,this.changes),this.trace("change","markup time",e.stop()),this._draw_diff(a,b,this.changes),this.trace("change","draw time",e.stop())},_parse_diff:function(a,b,c){this.trace("diff","diff results:\n",c);for(var d=[],e=0,f=c.split(/\n/),g=0;f.length>g;++g)if(0!=f[g].length){var h={},i=this.change_exp.exec(f[g]);if(null!=i){var j=i[1].split(",");h["lhs-line-from"]=j[0]-1,h["lhs-line-to"]=1==j.length?j[0]-1:j[1]-1;var k=i[3].split(",");h["rhs-line-from"]=k[0]-1,h["rhs-line-to"]=1==k.length?k[0]-1:k[1]-1,0>h["lhs-line-from"]&&(h["lhs-line-from"]=0),0>h["lhs-line-to"]&&(h["lhs-line-to"]=0),0>h["rhs-line-from"]&&(h["rhs-line-from"]=0),0>h["rhs-line-to"]&&(h["rhs-line-to"]=0),h.op=i[2],d[e++]=h,this.trace("diff","change",h)}}return d},_get_viewport:function(a,b){var c=this.editor[a].getViewport(),d=this.editor[b].getViewport();return{from:Math.min(c.from,d.from),to:Math.max(c.to,d.to)}},_is_change_in_view:function(a,b){return this.settings.viewport?b["lhs-line-from"]<a.from&&b["lhs-line-to"]<a.to||b["lhs-line-from"]>a.from&&b["lhs-line-to"]>a.to||b["rhs-line-from"]<a.from&&b["rhs-line-to"]<a.to||b["rhs-line-from"]>a.from&&b["rhs-line-to"]>a.to?!1:!0:!0},_calculate_offsets:function(a,b,c){if(null==this.em_height){var d=jQuery("#"+this.id+" .CodeMirror-measure").first(),e=d.offset().top-4;if(!e)return;this.draw_top_offset=.5-e,this.em_height=this.editor[a].defaultTextHeight(),this.em_height||(console.warn("Failed to calculate offsets, using 18 by default"),this.em_height=18),this.draw_lhs_min=.5;var f=jQuery("#"+a+"-"+b+"-canvas");if(f.length||console.error("failed to find canvas","#"+a+"-"+b+"-canvas"),!f.width())return console.error("canvas width is 0"),void 0;this.draw_mid_width=jQuery("#"+a+"-"+b+"-canvas").width(),this.draw_rhs_max=this.draw_mid_width-.5,this.draw_lhs_width=5,this.draw_rhs_width=5,this.trace("calc","change offsets calculated",{top_offset:e,lhs_min:this.draw_lhs_min,rhs_max:this.draw_rhs_max,lhs_width:this.draw_lhs_width,rhs_width:this.draw_rhs_width})}for(var g=this.editor[a].charCoords({line:0}),h=this.editor[b].charCoords({line:0}),i=this._get_viewport(a,b),j=0;c.length>j;++j){var k=c[j];if(this.settings.sidebar||this._is_change_in_view(i,k)){var p,q,r,s,l=k["lhs-line-from"]>=0?k["lhs-line-from"]:0,m=k["lhs-line-to"]>=0?k["lhs-line-to"]:0,n=k["rhs-line-from"]>=0?k["rhs-line-from"]:0,o=k["rhs-line-to"]>=0?k["rhs-line-to"]:0;if(this.editor[a].getOption("lineWrapping")||this.editor[a].getOption("lineWrapping")){var t=this.editor[a].cursorCoords({line:l,ch:0},"page"),u=this.editor[a].getLineHandle(l);p={top:t.top,bottom:t.top+u.height};var v=this.editor[a].cursorCoords({line:m,ch:0},"page"),w=this.editor[a].getLineHandle(m);q={top:v.top,bottom:v.top+w.height};var t=this.editor[b].cursorCoords({line:n,ch:0},"page"),x=this.editor[b].getLineHandle(n);r={top:t.top,bottom:t.top+x.height};var v=this.editor[b].cursorCoords({line:o,ch:0},"page"),y=this.editor[b].getLineHandle(o);s={top:v.top,bottom:v.top+y.height}}else p={top:g.top+l*this.em_height,bottom:g.bottom+l*this.em_height+2},q={top:g.top+m*this.em_height,bottom:g.bottom+m*this.em_height+2},r={top:h.top+n*this.em_height,bottom:h.bottom+n*this.em_height+2},s={top:h.top+o*this.em_height,bottom:h.bottom+o*this.em_height+2};"a"==k.op?n>0&&(p.top=p.bottom,p.bottom+=this.em_height,q=p):"d"==k.op&&l>0&&(r.top=r.bottom,r.bottom+=this.em_height,s=r),k["lhs-y-start"]=this.draw_top_offset+p.top,k["lhs-y-end"]="c"==k.op||"d"==k.op?this.draw_top_offset+q.bottom:this.draw_top_offset+q.top,k["rhs-y-start"]=this.draw_top_offset+r.top,k["rhs-y-end"]="c"==k.op||"a"==k.op?this.draw_top_offset+s.bottom:this.draw_top_offset+s.top,this.trace("calc","change calculated",j,k)}else delete k["lhs-y-start"],delete k["lhs-y-end"],delete k["rhs-y-start"],delete k["rhs-y-end"]}return c},_markup_changes:function(a,b,c){jQuery(".merge-button").remove();var d=this,e=this.editor[a],f=this.editor[b],g=new Mgly.Timer;e.operation(function(){for(var a=0;c.length>a;++a){var b=c[a],g=b["lhs-line-from"]>=0?b["lhs-line-from"]:0,h=b["lhs-line-to"]>=0?b["lhs-line-to"]:0,i=b["rhs-line-from"]>=0?b["rhs-line-from"]:0;b["rhs-line-to"]>=0?b["rhs-line-to"]:0;var k=["mergely","lhs",b.op,"cid-"+a];if(e.addLineClass(g,"background","start"),e.addLineClass(h,"background","end"),0==g&&0==h&&0==i)e.addLineClass(g,"background",k.join(" ")),e.addLineClass(g,"background","first");else for(var l=g;h>=l;++l)e.addLineClass(l,"background",k.join(" ")),e.addLineClass(l,"background",k.join(" "));if(!f.getOption("readOnly")){var m=d.merge_rhs_button.clone();m.button&&m.button({icons:{primary:"ui-icon-triangle-1-e"},text:!1}),m.addClass("merge-button"),m.attr("id","merge-rhs-"+a),e.setGutterMarker(g,"merge",m.get(0))}}});var h=this._get_viewport(a,b);this.trace("change","markup lhs-editor time",g.stop()),f.operation(function(){for(var a=0;c.length>a;++a){var b=c[a],g=b["lhs-line-from"]>=0?b["lhs-line-from"]:0;b["lhs-line-to"]>=0?b["lhs-line-to"]:0;var j=b["rhs-line-from"]>=0?b["rhs-line-from"]:0,k=b["rhs-line-to"]>=0?b["rhs-line-to"]:0;if(d._is_change_in_view(h,b)){var l=["mergely","rhs",b.op,"cid-"+a];if(f.addLineClass(j,"background","start"),f.addLineClass(k,"background","end"),0==j&&0==k&&0==g)f.addLineClass(j,"background",l.join(" ")),f.addLineClass(j,"background","first");else for(var m=j;k>=m;++m)f.addLineClass(m,"background",l.join(" ")),f.addLineClass(m,"background",l.join(" "));if(!e.getOption("readOnly")){var n=d.merge_lhs_button.clone();n.button&&n.button({icons:{primary:"ui-icon-triangle-1-w"},text:!1}),n.addClass("merge-button"),n.attr("id","merge-lhs-"+a),f.setGutterMarker(j,"merge",n.get(0))}}}}),this.trace("change","markup rhs-editor time",g.stop());for(var i=[],j=0;this.settings.lcs&&c.length>j;++j){var k=c[j],l=k["lhs-line-from"]>=0?k["lhs-line-from"]:0,m=k["lhs-line-to"]>=0?k["lhs-line-to"]:0,n=k["rhs-line-from"]>=0?k["rhs-line-from"]:0,o=k["rhs-line-to"]>=0?k["rhs-line-to"]:0;if(this._is_change_in_view(h,k))if("d"==k.op){var p=l,q=m,r=e.lineInfo(q);r&&i.push([e,{line:p,ch:0},{line:q,ch:r.text.length},{className:"mergely ch d lhs"}])}else if("c"==k.op)for(var s=l,t=n,u=0;s>=0&&m>=s||t>=0&&o>=t;++s,++t)if(t+u>o){var v=e.getLine(s);i.push([e,{line:s,ch:0},{line:s,ch:v.length},{className:"mergely ch d lhs"}])}else if(s+u>m){var w=f.getLine(t);i.push([f,{line:t,ch:0},{line:t,ch:w.length},{className:"mergely ch a rhs"}])}else{var v=e.getLine(s),w=f.getLine(t),B=new Mgly.LCS(v,w);B.diff(function(a,b){i.push([f,{line:t,ch:a},{line:t,ch:b},{className:"mergely ch a rhs"}])},removed=function(a,b){i.push([e,{line:s,ch:a},{line:s,ch:b},{className:"mergely ch d lhs"}])})}}this.trace("change","LCS marktext time",g.stop()),e.operation(function(){for(var a=0;i.length>a;++a){var b=i[a];b[0].doc.id==e.getDoc().id&&d.chfns[d.id+"-lhs"].push(b[0].markText(b[1],b[2],b[3]))}}),f.operation(function(){for(var a=0;i.length>a;++a){var b=i[a];b[0].doc.id==f.getDoc().id&&d.chfns[d.id+"-rhs"].push(b[0].markText(b[1],b[2],b[3]))}}),this.trace("change","LCS markup time",g.stop());var C={lhs:e,rhs:f};jQuery(".merge-button").on("click",function(a){var b="rhs",c="lhs",e=jQuery(this).parents("#"+d.id+"-editor-lhs");e.length&&(b="lhs",c="rhs");var f=C[b].coordsChar({left:a.pageX,top:a.pageY}),g=null,h=C[b].lineInfo(f.line);jQuery.each(h.bgClass.split(" "),function(a,b){return 0==b.indexOf("cid-")?(g=parseInt(b.split("-")[1],10),!1):void 0});var i=d.changes[g];({lhs:C.lhs.lineInfo(m),rhs:C.rhs.lineInfo(o)});var k=C[b].getRange(CodeMirror.Pos(i[b+"-line-from"],0),CodeMirror.Pos(i[b+"-line-to"]+1,0));if("c"==i.op)C[c].replaceRange(k,CodeMirror.Pos(i[c+"-line-from"],0),CodeMirror.Pos(i[c+"-line-to"]+1,0));else if("rhs"==b)if("a"==i.op)C[c].replaceRange(k,CodeMirror.Pos(i[c+"-line-from"]+1,0),CodeMirror.Pos(i[c+"-line-to"]+1,0));else for(var l=parseInt(i[c+"-line-from"]),n=parseInt(i[c+"-line-to"]),p=n;p>=l;--p)C[c].removeLine(p);else if("lhs"==b)if("a"==i.op)for(var l=parseInt(i[c+"-line-from"]),n=parseInt(i[c+"-line-to"]),p=n;p>=l;--p)C[c].removeLine(p);else C[c].replaceRange(k,CodeMirror.Pos(i[c+"-line-from"]+1,0));return C.lhs.setValue(C.lhs.getValue()),C.rhs.setValue(C.rhs.getValue()),!1}),this.trace("change","markup buttons time",g.stop())},_draw_info:function(a,b){var c=jQuery(this.editor[a].getScrollerElement()).height(),d=jQuery(this.editor[a].getScrollerElement()).children(":first-child").height(),e=document.getElementById(a+"-"+b+"-canvas");if(void 0==e)throw"Failed to find: "+a+"-"+b+"-canvas";var f=jQuery("#"+this.id+"-lhs-margin"),g=jQuery("#"+this.id+"-rhs-margin");return{visible_page_height:c,gutter_height:d,visible_page_ratio:c/d,margin_ratio:c/d,lhs_scroller:jQuery(this.editor[a].getScrollerElement()),rhs_scroller:jQuery(this.editor[b].getScrollerElement()),lhs_lines:this.editor[a].lineCount(),rhs_lines:this.editor[b].lineCount(),dcanvas:e,clhs:f,crhs:g,lhs_xyoffset:jQuery(f).offset(),rhs_xyoffset:jQuery(g).offset()}},_draw_diff:function(a,b,c){var d=this._draw_info(a,b),e=d.clhs.get(0),f=d.crhs.get(0),g=d.dcanvas.getContext("2d"),h=e.getContext("2d"),i=f.getContext("2d");this.trace("draw","visible_page_height",d.visible_page_height),this.trace("draw","gutter_height",d.gutter_height),this.trace("draw","visible_page_ratio",d.visible_page_ratio),this.trace("draw","lhs-scroller-top",d.lhs_scroller.scrollTop()),this.trace("draw","rhs-scroller-top",d.rhs_scroller.scrollTop()),jQuery.each(jQuery.find("#"+this.id+" canvas"),function(){jQuery(this).get(0).height=d.visible_page_height}),d.clhs.unbind("click"),d.crhs.unbind("click"),h.beginPath(),h.fillStyle=this.settings.bgcolor,h.strokeStyle="#888",h.fillRect(0,0,6.5,d.visible_page_height),h.strokeRect(0,0,6.5,d.visible_page_height),i.beginPath(),i.fillStyle=this.settings.bgcolor,i.strokeStyle="#888",i.fillRect(0,0,6.5,d.visible_page_height),i.strokeRect(0,0,6.5,d.visible_page_height);for(var j=this._get_viewport(a,b),k=0;c.length>k;++k){var l=c[k];this.trace("draw",l);var m=(l["lhs-y-start"]+d.lhs_scroller.scrollTop())*d.visible_page_ratio,n=(l["lhs-y-end"]+d.lhs_scroller.scrollTop())*d.visible_page_ratio+1,o=(l["rhs-y-start"]+d.rhs_scroller.scrollTop())*d.visible_page_ratio,p=(l["rhs-y-end"]+d.rhs_scroller.scrollTop())*d.visible_page_ratio+1;if(this.trace("draw","marker calculated",m,n,o,p),h.beginPath(),h.fillStyle=this.settings.fgcolor[l.op],h.strokeStyle="#000",h.lineWidth=.5,h.fillRect(1.5,m,4.5,Math.max(n-m,5)),h.strokeRect(1.5,m,4.5,Math.max(n-m,5)),i.beginPath(),i.fillStyle=this.settings.fgcolor[l.op],i.strokeStyle="#000",i.lineWidth=.5,i.fillRect(1.5,o,4.5,Math.max(p-o,5)),i.strokeRect(1.5,o,4.5,Math.max(p-o,5)),this._is_change_in_view(j,l)){m=l["lhs-y-start"],n=l["lhs-y-end"],o=l["rhs-y-start"],p=l["rhs-y-end"];var q=3;g.beginPath(),g.strokeStyle=this.settings.fgcolor[l.op],g.lineWidth=1;var r=this.draw_lhs_width,s=n-m-1,t=this.draw_lhs_min,u=m;g.moveTo(t,u),"Microsoft Internet Explorer"==navigator.appName?(g.lineTo(this.draw_lhs_min+this.draw_lhs_width,m),g.lineTo(this.draw_lhs_min+this.draw_lhs_width,n+1),g.lineTo(this.draw_lhs_min,n+1)):(0>=s?g.lineTo(t+r,u):(g.arcTo(t+r,u,t+r,u+q,q),g.arcTo(t+r,u+s,t+r-q,u+s,q)),g.lineTo(t,u+s)),g.stroke(),r=this.draw_rhs_width,s=p-o-1,t=this.draw_rhs_max,u=o,g.moveTo(t,u),"Microsoft Internet Explorer"==navigator.appName?(g.lineTo(this.draw_rhs_max-this.draw_rhs_width,o),g.lineTo(this.draw_rhs_max-this.draw_rhs_width,p+1),g.lineTo(this.draw_rhs_max,p+1)):(0>=s?g.lineTo(t-r,u):(g.arcTo(t-r,u,t-r,u+q,q),g.arcTo(t-r,u+s,t-q,u+s,q)),g.lineTo(t,u+s)),g.stroke();var v=this.draw_lhs_min+this.draw_lhs_width,w=m+(n+1-m)/2,x=this.draw_rhs_max-this.draw_rhs_width,y=o+(p+1-o)/2;g.moveTo(v,w),w==y?g.lineTo(x,y):g.bezierCurveTo(v+12,w-3,x-12,y-3,x,y),g.stroke()}}h.fillStyle=this.settings.vpcolor,i.fillStyle=this.settings.vpcolor;var z=d.clhs.height()*d.visible_page_ratio,A=d.lhs_scroller.scrollTop()/d.gutter_height*d.clhs.height(),B=d.crhs.height()*d.visible_page_ratio,C=d.rhs_scroller.scrollTop()/d.gutter_height*d.crhs.height();this.trace("draw","cls.height",d.clhs.height()),this.trace("draw","lhs_scroller.scrollTop()",d.lhs_scroller.scrollTop()),this.trace("draw","gutter_height",d.gutter_height),this.trace("draw","visible_page_ratio",d.visible_page_ratio),this.trace("draw","lhs from",A,"lhs to",z),this.trace("draw","rhs from",C,"rhs to",B),h.fillRect(1.5,A,4.5,z),i.fillRect(1.5,C,4.5,B),d.clhs.click(function(a){var b=a.pageY-d.lhs_xyoffset.top-to/2,c=Math.max(0,b/e.height*d.lhs_scroller.get(0).scrollHeight);d.lhs_scroller.scrollTop(c)}),d.crhs.click(function(a){var b=a.pageY-d.rhs_xyoffset.top-to/2,c=Math.max(0,b/f.height*d.rhs_scroller.get(0).scrollHeight);d.rhs_scroller.scrollTop(c)})},trace:function(a){this.settings._debug.indexOf(a)>=0&&(arguments[0]=a+":",console.log([].slice.apply(arguments)))}}),jQuery.pluginMaker=function(a){jQuery.fn[a.prototype.name]=function(b){var c=jQuery.makeArray(arguments),d=c.slice(1),e=void 0;return this.each(function(){var f=jQuery.data(this,a.prototype.name);if(f){if("string"==typeof b)e=f[b].apply(f,d);else if(f.update)return f.update.apply(f,c)}else new a(this,b)}),void 0!=e?e:void 0}},jQuery.pluginMaker(Mgly.mergely);(No newline at end of file)
 
public/javascripts/lib/mergely/searchcursor.js (deleted)
--- public/javascripts/lib/mergely/searchcursor.js
@@ -1,131 +0,0 @@
-(function(){
-  var Pos = CodeMirror.Pos;
-
-  function SearchCursor(cm, query, pos, caseFold) {
-    this.atOccurrence = false; this.cm = cm;
-    if (caseFold == null && typeof query == "string") caseFold = false;
-
-    pos = pos ? cm.clipPos(pos) : Pos(0, 0);
-    this.pos = {from: pos, to: pos};
-
-    // The matches method is filled in based on the type of query.
-    // It takes a position and a direction, and returns an object
-    // describing the next occurrence of the query, or null if no
-    // more matches were found.
-    if (typeof query != "string") { // Regexp match
-      if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
-      this.matches = function(reverse, pos) {
-        if (reverse) {
-          query.lastIndex = 0;
-          var line = cm.getLine(pos.line).slice(0, pos.ch), match = query.exec(line), start = 0;
-          while (match) {
-            start += match.index + 1;
-            line = line.slice(start);
-            query.lastIndex = 0;
-            var newmatch = query.exec(line);
-            if (newmatch) match = newmatch;
-            else break;
-          }
-          start--;
-        } else {
-          query.lastIndex = pos.ch;
-          var line = cm.getLine(pos.line), match = query.exec(line),
-          start = match && match.index;
-        }
-        if (match && match[0])
-          return {from: Pos(pos.line, start),
-                  to: Pos(pos.line, start + match[0].length),
-                  match: match};
-      };
-    } else { // String query
-      if (caseFold) query = query.toLowerCase();
-      var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
-      var target = query.split("\n");
-      // Different methods for single-line and multi-line queries
-      if (target.length == 1) {
-        if (!query.length) {
-          // Empty string would match anything and never progress, so
-          // we define it to match nothing instead.
-          this.matches = function() {};
-        } else {
-          this.matches = function(reverse, pos) {
-            var line = fold(cm.getLine(pos.line)), len = query.length, match;
-            if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1)
-                        : (match = line.indexOf(query, pos.ch)) != -1)
-              return {from: Pos(pos.line, match),
-                      to: Pos(pos.line, match + len)};
-          };
-        }
-      } else {
-        this.matches = function(reverse, pos) {
-          var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(cm.getLine(ln));
-          var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
-          if (reverse ? offsetA >= pos.ch || offsetA != match.length
-              : offsetA <= pos.ch || offsetA != line.length - match.length)
-            return;
-          for (;;) {
-            if (reverse ? !ln : ln == cm.lineCount() - 1) return;
-            line = fold(cm.getLine(ln += reverse ? -1 : 1));
-            match = target[reverse ? --idx : ++idx];
-            if (idx > 0 && idx < target.length - 1) {
-              if (line != match) return;
-              else continue;
-            }
-            var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length);
-            if (reverse ? offsetB != line.length - match.length : offsetB != match.length)
-              return;
-            var start = Pos(pos.line, offsetA), end = Pos(ln, offsetB);
-            return {from: reverse ? end : start, to: reverse ? start : end};
-          }
-        };
-      }
-    }
-  }
-
-  SearchCursor.prototype = {
-    findNext: function() {return this.find(false);},
-    findPrevious: function() {return this.find(true);},
-
-    find: function(reverse) {
-      var self = this, pos = this.cm.clipPos(reverse ? this.pos.from : this.pos.to);
-      function savePosAndFail(line) {
-        var pos = Pos(line, 0);
-        self.pos = {from: pos, to: pos};
-        self.atOccurrence = false;
-        return false;
-      }
-
-      for (;;) {
-        if (this.pos = this.matches(reverse, pos)) {
-          if (!this.pos.from || !this.pos.to) { console.log(this.matches, this.pos); }
-          this.atOccurrence = true;
-          return this.pos.match || true;
-        }
-        if (reverse) {
-          if (!pos.line) return savePosAndFail(0);
-          pos = Pos(pos.line-1, this.cm.getLine(pos.line-1).length);
-        }
-        else {
-          var maxLine = this.cm.lineCount();
-          if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
-          pos = Pos(pos.line + 1, 0);
-        }
-      }
-    },
-
-    from: function() {if (this.atOccurrence) return this.pos.from;},
-    to: function() {if (this.atOccurrence) return this.pos.to;},
-
-    replace: function(newText) {
-      if (!this.atOccurrence) return;
-      var lines = CodeMirror.splitLines(newText);
-      this.cm.replaceRange(lines, this.pos.from, this.pos.to);
-      this.pos.to = Pos(this.pos.from.line + lines.length - 1,
-                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));
-    }
-  };
-
-  CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
-    return new SearchCursor(this, query, pos, caseFold);
-  });
-})();(No newline at end of file)
public/javascripts/service/yobi.code.SvnDiff.js
--- public/javascripts/service/yobi.code.SvnDiff.js
+++ public/javascripts/service/yobi.code.SvnDiff.js
@@ -28,7 +28,6 @@
             _initFileDownloader();
             _initToggleCommentsButton();
             _initMiniMap();
-            _initMergely();
         }
 
         /**
@@ -82,13 +81,6 @@
             htElement.welMiniMapWrap = htElement.welMiniMap.find(".minimap-wrap");
             htElement.welMiniMapCurr = htElement.welMiniMapWrap.find(".minimap-curr");
             htElement.welMiniMapLinks = htElement.welMiniMapWrap.find(".minimap-links");
-
-            // FullDiff (Mergely)
-            htElement.welMergelyWrap = $("#compare");
-            htElement.welMergely = $("#mergely");
-            htElement.welMergelyPathTitle = htElement.welMergelyWrap.find(".path > span");
-            htElement.welMergelyCommitFrom = htElement.welMergelyWrap.find(".compare-from");
-            htElement.welMergelyCommitTo = htElement.welMergelyWrap.find(".compare-to");
         }
 
         /**
@@ -109,13 +101,10 @@
 
             $(window).on("resize", _initMiniMap);
             $(window).on("scroll", _updateMiniMapCurr);
-            $(window).on("resize", _resizeMergely);
 
             $('.diff-wrap').on('click','td.linenum',_onClickLineNumA);
 
             $('.diff-wrap').on('click','[data-toggle="commentBoxToggle"]',_onClickCommentBoxToggleBtn);
-
-            $('.diff-wrap').on('click','[data-toggle="mergely"]',_onClickBtnFullDiff);
         }
 
         /**
@@ -367,13 +356,9 @@
                 var welDiffMeta = $('<div/>',{class:'diff-partial-meta'});
                 var welDiffMetaCommit = $('<div/>',{class:'diff-partial-commit'});
                 var welDiffMetaFile = $('<div/>',{class:'diff-partial-file'});
-                var welDiffMetaUtility = $('<div/>',{class:'diff-partial-utility'});
                 var welDiffCodeWrap = $('<div/>',{class:'diff-partial-code'});
                 var welDiffCodeTable = $('<table/>',{class:'diff-container show-comments'});
                 var welDiffCodeTableBody = $('<tbody/>');
-                var welFullDiff = $('<button/>',{class:'ybtn ybtn-small',type:'button'})
-                                    .attr('data-toggle','mergely')
-                                    .text(Messages("code.fullDiff"));
 
                 var aLine = sDiffRow.split('\n').slice(0,-1);
                 var sPath;
@@ -414,8 +399,6 @@
                                 if(aMatch[1]==='---') {
                                     sPath = aMatch[2];
                                     welDiffCodeTable.attr('data-path-a',sPath);
-                                    welFullDiff.attr('data-path-a',sPath);
-                                    welFullDiff.attr('data-commit-a',htVar.sParentCommitId);
 
                                     var welCommit = _makeCommitLink(sPath,htVar.sParentCommitId);
                                     welDiffMetaCommit.append(welCommit);
@@ -424,10 +407,6 @@
                                     sPath = aMatch[2] == "/dev/null" ? sPath : aMatch[2];
                                     welDiffCodeTable.attr('data-path-b',sPath);
                                     welDiffCodeTable.attr('data-file-path',sPath);
-
-                                    welFullDiff.attr('data-path-b',sPath);
-                                    welFullDiff.attr('data-path',sPath);
-                                    welFullDiff.attr('data-commit-b',htVar.sCommitId);
 
                                     var welCommit = _makeCommitLink(sPath,htVar.sCommitId);
                                     welDiffMetaCommit.append(welCommit);
@@ -488,13 +467,10 @@
                                 break;
                         }
                     });
-
-                    welDiffMetaUtility.append(welFullDiff);
                 }
 
                 welDiffMeta.append(welDiffMetaCommit);
                 welDiffMeta.append(welDiffMetaFile);
-                welDiffMeta.append(welDiffMetaUtility);
                 welDiffCodeTable.append(welDiffCodeTableBody);
                 welDiffCodeWrap.append(welDiffCodeTable);
                 welDiffWrapInner.append(welDiffMeta);
@@ -543,98 +519,6 @@
             welRow.append(welCellLineB);
             welRow.append(welCellCode);
             return welRow;
-        }
-
-        /**
-         * Mergely 초기화
-         */
-        function _initMergely(){
-            var htWrapSize = _getMergelyWrapSize();
-
-            htElement.welMergely.mergely({
-                "width" : "auto",
-                // "height": "auto",
-                "height": (htWrapSize.nWrapHeight - 100) + "px",
-                "editor_width": ((htWrapSize.nWrapWidth - 92) / 2) + "px",
-                "editor_height": (htWrapSize.nWrapHeight - 100) + "px",
-                "cmsettings":{"readOnly": true, "lineNumbers": true}
-            });
-        }
-
-        /**
-         * Mergely wrapper 크기 반환
-         */
-        function _getMergelyWrapSize(){
-            return {
-                "nWrapWidth" : window.innerWidth - 100,
-                "nWrapHeight": window.innerHeight - (window.innerHeight * 0.2)
-            };
-        }
-
-        /**
-         * fullDiff 버튼 클릭시 이벤트 핸들러
-         *
-         * @param {Wrapped Event} weEvt
-         */
-        function _onClickBtnFullDiff(weEvt){
-            var welTarget = $(weEvt.target);
-            var sToId   = welTarget.data("commitA");
-            var sFromId = welTarget.data("commitB");
-            var sPath   = welTarget.data("path");
-            sPath = sPath.indexOf("/") === 0 ? sPath.substr(1) : sPath;
-            var sRawURLFrom = $yobi.tmpl(htVar.sTplRawURL, {"commitId": sToId, "path": sPath});
-            var sRawURLTo = $yobi.tmpl(htVar.sTplRawURL, {"commitId": sFromId, "path": sPath});
-
-            // UpdateText
-            htElement.welMergelyPathTitle.text(sPath);
-            htElement.welMergelyCommitFrom.text(sFromId);
-            htElement.welMergelyCommitTo.text(sToId);
-            htElement.welMergelyWrap.modal();
-
-            _resizeMergely();
-            _updateMergely(sRawURLFrom, sRawURLTo);
-        }
-
-        /**
-         * 두 코드를 가져다 fullDiff 에 표시하는 함수
-         *
-         * @param {String} sRawURLFrom
-         * @param {String} sRawURLTo
-         */
-        function _updateMergely(sRawURLFrom, sRawURLTo){
-            // lhs = from
-            $.get(sRawURLFrom).done(function(sData){
-                htElement.welMergely.mergely("lhs", sData);
-                htElement.welMergely.mergely("resize");
-                htElement.welMergely.mergely("update");
-            });
-
-            // rhs = to
-            $.get(sRawURLTo).done(function(sData){
-                htElement.welMergely.mergely("rhs", sData);
-                htElement.welMergely.mergely("resize");
-                htElement.welMergely.mergely("update");
-            });
-        }
-
-        /**
-         * Mergely 영역 크기 조절
-         */
-        function _resizeMergely(){
-            var htWrapSize = _getMergelyWrapSize();
-            var nWidth = ((htWrapSize.nWrapWidth - 92) / 2);
-            var nHeight = (htWrapSize.nWrapHeight - 100);
-
-            htElement.welMergelyWrap.css({
-                "width" : htWrapSize.nWrapWidth + "px",
-                "height": htWrapSize.nWrapHeight + "px",
-                "margin-left": -(htWrapSize.nWrapWidth / 2) + "px"
-            });
-            htElement.welMergely.mergely("cm", "rhs").setSize(nWidth + "px", nHeight + "px");
-            htElement.welMergely.mergely("cm", "lhs").setSize(nWidth + "px", nHeight + "px");
-
-            $(".mergely-column").width(nWidth).height(nHeight);
-            $(".CodeMirror").height(nHeight);
         }
 
         /**
Add a comment