diff --git a/lib/client/edit.js b/lib/client/edit.js
index 9feda662..ab3748fa 100644
--- a/lib/client/edit.js
+++ b/lib/client/edit.js
@@ -13,6 +13,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch;
Edit = this,
Diff,
Ace,
+ Modelist,
Msg,
Dialog = DOM.Dialog,
Key = CloudCmd.Key,
@@ -39,7 +40,8 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch;
}
this.show = function(pValue) {
- var lName = DOM.getCurrentName(),
+ var lMode,
+ lName = DOM.getCurrentName(),
lExt = Util.getExtension(lName),
lUseWorker = Util.strCmp(lExt, ['.js', '.json']);
@@ -66,6 +68,13 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch;
enableSnippets : true
});
+
+ if (!Modelist)
+ Modelist = ace.require('ace/ext/modelist');
+
+ lMode = Modelist.getModeForPath(lName).mode;
+ Ace.session.setMode(lMode);
+
if (Util.isString(pValue)) {
Ace.setValue(pValue);
CloudCmd.View.show(Element, focus);
@@ -116,7 +125,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch;
lSession = Ace.getSession();
Ace.setTheme('ace/theme/tomorrow_night_blue');
- lSession.setMode('ace/mode/javascript');
+
Ace.setShowPrintMargin(false);
Ace.setShowInvisibles(true);
lSession.setUseSoftTabs(true);
@@ -202,6 +211,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch;
DIR + 'theme-tomorrow_night_blue.js',
DIR + 'ext-language_tools.js',
DIR + 'ext-searchbox.js',
+ DIR + 'ext-modelist.js',
DIR + 'snippets/javascript.js',
DIR + 'mode-javascript.js',
],
diff --git a/lib/client/edit/mode-javascript.js b/lib/client/edit/mode-javascript.js
index bf541754..ee603eaa 100644
--- a/lib/client/edit/mode-javascript.js
+++ b/lib/client/edit/mode-javascript.js
@@ -42,12 +42,10 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
var Mode = function() {
- var highlighter = new JavaScriptHighlightRules();
+ this.HighlightRules = JavaScriptHighlightRules;
- this.$tokenizer = new Tokenizer(highlighter.getRules());
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = new CstyleBehaviour();
- this.$keywordList = highlighter.$keywordList;
this.foldingRules = new CStyleFoldMode();
};
oop.inherits(Mode, TextMode);
@@ -60,7 +58,7 @@ oop.inherits(Mode, TextMode);
this.getNextLineIndent = function(state, line, tab) {
var indent = this.$getIndent(line);
- var tokenizedLine = this.$tokenizer.getLineTokens(line, state);
+ var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
var tokens = tokenizedLine.tokens;
var endState = tokenizedLine.state;
diff --git a/lib/client/edit/snippets/actionscript.js b/lib/client/edit/snippets/actionscript.js
new file mode 100644
index 00000000..5d144064
--- /dev/null
+++ b/lib/client/edit/snippets/actionscript.js
@@ -0,0 +1,164 @@
+ace.define('ace/snippets/actionscript', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet main\n\
+ package {\n\
+ import flash.display.*;\n\
+ import flash.Events.*;\n\
+ \n\
+ public class Main extends Sprite {\n\
+ public function Main ( ) {\n\
+ trace(\"start\");\n\
+ stage.scaleMode = StageScaleMode.NO_SCALE;\n\
+ stage.addEventListener(Event.RESIZE, resizeListener);\n\
+ }\n\
+ \n\
+ private function resizeListener (e:Event):void {\n\
+ trace(\"The application window changed size!\");\n\
+ trace(\"New width: \" + stage.stageWidth);\n\
+ trace(\"New height: \" + stage.stageHeight);\n\
+ }\n\
+ \n\
+ }\n\
+ \n\
+ }\n\
+snippet class\n\
+ ${1:public|internal} class ${2:name} ${3:extends } {\n\
+ public function $2 ( ) {\n\
+ (\"start\");\n\
+ }\n\
+ }\n\
+snippet all\n\
+ package name {\n\
+\n\
+ ${1:public|internal|final} class ${2:name} ${3:extends } {\n\
+ private|public| static const FOO = \"abc\";\n\
+ private|public| static var BAR = \"abc\";\n\
+\n\
+ // class initializer - no JIT !! one time setup\n\
+ if Cababilities.os == \"Linux|MacOS\" {\n\
+ FOO = \"other\";\n\
+ }\n\
+\n\
+ // constructor:\n\
+ public function $2 ( ){\n\
+ super2();\n\
+ trace(\"start\");\n\
+ }\n\
+ public function name (a, b...){\n\
+ super.name(..);\n\
+ lable:break\n\
+ }\n\
+ }\n\
+ }\n\
+\n\
+ function A(){\n\
+ // A can only be accessed within this file\n\
+ }\n\
+snippet switch\n\
+ switch(${1}){\n\
+ case ${2}:\n\
+ ${3}\n\
+ break;\n\
+ default:\n\
+ }\n\
+snippet case\n\
+ case ${1}:\n\
+ ${2}\n\
+ break;\n\
+snippet package\n\
+ package ${1:package}{\n\
+ ${2}\n\
+ }\n\
+snippet wh\n\
+ while ${1:cond}{\n\
+ ${2}\n\
+ }\n\
+snippet do\n\
+ do {\n\
+ ${2}\n\
+ } while (${1:cond})\n\
+snippet while\n\
+ while ${1:cond}{\n\
+ ${2}\n\
+ }\n\
+snippet for enumerate names\n\
+ for (${1:var} in ${2:object}){\n\
+ ${3}\n\
+ }\n\
+snippet for enumerate values\n\
+ for each (${1:var} in ${2:object}){\n\
+ ${3}\n\
+ }\n\
+snippet get_set\n\
+ function get ${1:name} {\n\
+ return ${2}\n\
+ }\n\
+ function set $1 (newValue) {\n\
+ ${3}\n\
+ }\n\
+snippet interface\n\
+ interface name {\n\
+ function method(${1}):${2:returntype};\n\
+ }\n\
+snippet try\n\
+ try {\n\
+ ${1}\n\
+ } catch (error:ErrorType) {\n\
+ ${2}\n\
+ } finally {\n\
+ ${3}\n\
+ }\n\
+# For Loop (same as c.snippet)\n\
+snippet for for (..) {..}\n\
+ for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\n\
+ ${4:/* code */}\n\
+ }\n\
+# Custom For Loop\n\
+snippet forr\n\
+ for (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) {\n\
+ ${5:/* code */}\n\
+ }\n\
+# If Condition\n\
+snippet if\n\
+ if (${1:/* condition */}) {\n\
+ ${2:/* code */}\n\
+ }\n\
+snippet el\n\
+ else {\n\
+ ${1}\n\
+ }\n\
+# Ternary conditional\n\
+snippet t\n\
+ ${1:/* condition */} ? ${2:a} : ${3:b}\n\
+snippet fun\n\
+ function ${1:function_name}(${2})${3}\n\
+ {\n\
+ ${4:/* code */}\n\
+ }\n\
+# FlxSprite (usefull when using the flixel library)\n\
+snippet FlxSprite\n\
+ package\n\
+ {\n\
+ import org.flixel.*\n\
+\n\
+ public class ${1:ClassName} extends ${2:FlxSprite}\n\
+ {\n\
+ public function $1(${3: X:Number, Y:Number}):void\n\
+ {\n\
+ super(X,Y);\n\
+ ${4: //code...}\n\
+ }\n\
+\n\
+ override public function update():void\n\
+ {\n\
+ super.update();\n\
+ ${5: //code...}\n\
+ }\n\
+ }\n\
+ }\n\
+\n\
+";
+exports.scope = "actionscript";
+
+});
diff --git a/lib/client/edit/snippets/asciidoc.js b/lib/client/edit/snippets/asciidoc.js
new file mode 100644
index 00000000..a0f6d84a
--- /dev/null
+++ b/lib/client/edit/snippets/asciidoc.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/asciidoc', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "asciidoc";
+
+});
diff --git a/lib/client/edit/snippets/assembly_x86.js b/lib/client/edit/snippets/assembly_x86.js
new file mode 100644
index 00000000..13d226ca
--- /dev/null
+++ b/lib/client/edit/snippets/assembly_x86.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/assembly_x86', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "assembly_x86";
+
+});
diff --git a/lib/client/edit/snippets/batchfile.js b/lib/client/edit/snippets/batchfile.js
new file mode 100644
index 00000000..c6dea23e
--- /dev/null
+++ b/lib/client/edit/snippets/batchfile.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/batchfile', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "batchfile";
+
+});
diff --git a/lib/client/edit/snippets/c_cpp.js b/lib/client/edit/snippets/c_cpp.js
new file mode 100644
index 00000000..95d09c84
--- /dev/null
+++ b/lib/client/edit/snippets/c_cpp.js
@@ -0,0 +1,138 @@
+ace.define('ace/snippets/c_cpp', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "## STL Collections\n\
+# std::array\n\
+snippet array\n\
+ std::array<${1:T}, ${2:N}> ${3};${4}\n\
+# std::vector\n\
+snippet vector\n\
+ std::vector<${1:T}> ${2};${3}\n\
+# std::deque\n\
+snippet deque\n\
+ std::deque<${1:T}> ${2};${3}\n\
+# std::forward_list\n\
+snippet flist\n\
+ std::forward_list<${1:T}> ${2};${3}\n\
+# std::list\n\
+snippet list\n\
+ std::list<${1:T}> ${2};${3}\n\
+# std::set\n\
+snippet set\n\
+ std::set<${1:T}> ${2};${3}\n\
+# std::map\n\
+snippet map\n\
+ std::map<${1:Key}, ${2:T}> ${3};${4}\n\
+# std::multiset\n\
+snippet mset\n\
+ std::multiset<${1:T}> ${2};${3}\n\
+# std::multimap\n\
+snippet mmap\n\
+ std::multimap<${1:Key}, ${2:T}> ${3};${4}\n\
+# std::unordered_set\n\
+snippet uset\n\
+ std::unordered_set<${1:T}> ${2};${3}\n\
+# std::unordered_map\n\
+snippet umap\n\
+ std::unordered_map<${1:Key}, ${2:T}> ${3};${4}\n\
+# std::unordered_multiset\n\
+snippet umset\n\
+ std::unordered_multiset<${1:T}> ${2};${3}\n\
+# std::unordered_multimap\n\
+snippet ummap\n\
+ std::unordered_multimap<${1:Key}, ${2:T}> ${3};${4}\n\
+# std::stack\n\
+snippet stack\n\
+ std::stack<${1:T}> ${2};${3}\n\
+# std::queue\n\
+snippet queue\n\
+ std::queue<${1:T}> ${2};${3}\n\
+# std::priority_queue\n\
+snippet pqueue\n\
+ std::priority_queue<${1:T}> ${2};${3}\n\
+##\n\
+## Access Modifiers\n\
+# private\n\
+snippet pri\n\
+ private\n\
+# protected\n\
+snippet pro\n\
+ protected\n\
+# public\n\
+snippet pub\n\
+ public\n\
+# friend\n\
+snippet fr\n\
+ friend\n\
+# mutable\n\
+snippet mu\n\
+ mutable\n\
+## \n\
+## Class\n\
+# class\n\
+snippet cl\n\
+ class ${1:`Filename('$1', 'name')`} \n\
+ {\n\
+ public:\n\
+ $1(${2});\n\
+ ~$1();\n\
+\n\
+ private:\n\
+ ${3:/* data */}\n\
+ };\n\
+# member function implementation\n\
+snippet mfun\n\
+ ${4:void} ${1:`Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) {\n\
+ ${5:/* code */}\n\
+ }\n\
+# namespace\n\
+snippet ns\n\
+ namespace ${1:`Filename('', 'my')`} {\n\
+ ${2}\n\
+ } /* namespace $1 */\n\
+##\n\
+## Input/Output\n\
+# std::cout\n\
+snippet cout\n\
+ std::cout << ${1} << std::endl;${2}\n\
+# std::cin\n\
+snippet cin\n\
+ std::cin >> ${1};${2}\n\
+##\n\
+## Iteration\n\
+# for i \n\
+snippet fori\n\
+ for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\n\
+ ${4:/* code */}\n\
+ }${5}\n\
+\n\
+# foreach\n\
+snippet fore\n\
+ for (${1:auto} ${2:i} : ${3:container}) {\n\
+ ${4:/* code */}\n\
+ }${5}\n\
+# iterator\n\
+snippet iter\n\
+ for (${1:std::vector}<${2:type}>::${3:const_iterator} ${4:i} = ${5:container}.begin(); $4 != $5.end(); ++$4) {\n\
+ ${6}\n\
+ }${7}\n\
+\n\
+# auto iterator\n\
+snippet itera\n\
+ for (auto ${1:i} = $1.begin(); $1 != $1.end(); ++$1) {\n\
+ ${2:std::cout << *$1 << std::endl;}\n\
+ }${3}\n\
+##\n\
+## Lambdas\n\
+# lamda (one line)\n\
+snippet ld\n\
+ [${1}](${2}){${3:/* code */}}${4}\n\
+# lambda (multi-line)\n\
+snippet lld\n\
+ [${1}](${2}){\n\
+ ${3:/* code */}\n\
+ }${4}\n\
+";
+exports.scope = "c_cpp";
+
+});
diff --git a/lib/client/edit/snippets/coffee.js b/lib/client/edit/snippets/coffee.js
new file mode 100644
index 00000000..3c690a4a
--- /dev/null
+++ b/lib/client/edit/snippets/coffee.js
@@ -0,0 +1,102 @@
+ace.define('ace/snippets/coffee', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# Closure loop\n\
+snippet forindo\n\
+ for ${1:name} in ${2:array}\n\
+ do ($1) ->\n\
+ ${3:// body}\n\
+# Array comprehension\n\
+snippet fora\n\
+ for ${1:name} in ${2:array}\n\
+ ${3:// body...}\n\
+# Object comprehension\n\
+snippet foro\n\
+ for ${1:key}, ${2:value} of ${3:object}\n\
+ ${4:// body...}\n\
+# Range comprehension (inclusive)\n\
+snippet forr\n\
+ for ${1:name} in [${2:start}..${3:finish}]\n\
+ ${4:// body...}\n\
+snippet forrb\n\
+ for ${1:name} in [${2:start}..${3:finish}] by ${4:step}\n\
+ ${5:// body...}\n\
+# Range comprehension (exclusive)\n\
+snippet forrex\n\
+ for ${1:name} in [${2:start}...${3:finish}]\n\
+ ${4:// body...}\n\
+snippet forrexb\n\
+ for ${1:name} in [${2:start}...${3:finish}] by ${4:step}\n\
+ ${5:// body...}\n\
+# Function\n\
+snippet fun\n\
+ (${1:args}) ->\n\
+ ${2:// body...}\n\
+# Function (bound)\n\
+snippet bfun\n\
+ (${1:args}) =>\n\
+ ${2:// body...}\n\
+# Class\n\
+snippet cla class ..\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ ${2}\n\
+snippet cla class .. constructor: ..\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ constructor: (${2:args}) ->\n\
+ ${3}\n\
+\n\
+ ${4}\n\
+snippet cla class .. extends ..\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} extends ${2:ParentClass}\n\
+ ${3}\n\
+snippet cla class .. extends .. constructor: ..\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} extends ${2:ParentClass}\n\
+ constructor: (${3:args}) ->\n\
+ ${4}\n\
+\n\
+ ${5}\n\
+# If\n\
+snippet if\n\
+ if ${1:condition}\n\
+ ${2:// body...}\n\
+# If __ Else\n\
+snippet ife\n\
+ if ${1:condition}\n\
+ ${2:// body...}\n\
+ else\n\
+ ${3:// body...}\n\
+# Else if\n\
+snippet elif\n\
+ else if ${1:condition}\n\
+ ${2:// body...}\n\
+# Ternary If\n\
+snippet ifte\n\
+ if ${1:condition} then ${2:value} else ${3:other}\n\
+# Unless\n\
+snippet unl\n\
+ ${1:action} unless ${2:condition}\n\
+# Switch\n\
+snippet swi\n\
+ switch ${1:object}\n\
+ when ${2:value}\n\
+ ${3:// body...}\n\
+\n\
+# Log\n\
+snippet log\n\
+ console.log ${1}\n\
+# Try __ Catch\n\
+snippet try\n\
+ try\n\
+ ${1}\n\
+ catch ${2:error}\n\
+ ${3}\n\
+# Require\n\
+snippet req\n\
+ ${2:$1} = require '${1:sys}'${3}\n\
+# Export\n\
+snippet exp\n\
+ ${1:root} = exports ? this\n\
+";
+exports.scope = "coffee";
+
+});
diff --git a/lib/client/edit/snippets/csharp.js b/lib/client/edit/snippets/csharp.js
new file mode 100644
index 00000000..cccf4c57
--- /dev/null
+++ b/lib/client/edit/snippets/csharp.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/csharp', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "csharp";
+
+});
diff --git a/lib/client/edit/snippets/css.js b/lib/client/edit/snippets/css.js
new file mode 100644
index 00000000..79fbb1fb
--- /dev/null
+++ b/lib/client/edit/snippets/css.js
@@ -0,0 +1,974 @@
+ace.define('ace/snippets/css', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet .\n\
+ ${1} {\n\
+ ${2}\n\
+ }\n\
+snippet !\n\
+ !important\n\
+snippet bdi:m+\n\
+ -moz-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\n\
+snippet bdi:m\n\
+ -moz-border-image: ${1};\n\
+snippet bdrz:m\n\
+ -moz-border-radius: ${1};\n\
+snippet bxsh:m+\n\
+ -moz-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\
+snippet bxsh:m\n\
+ -moz-box-shadow: ${1};\n\
+snippet bdi:w+\n\
+ -webkit-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\n\
+snippet bdi:w\n\
+ -webkit-border-image: ${1};\n\
+snippet bdrz:w\n\
+ -webkit-border-radius: ${1};\n\
+snippet bxsh:w+\n\
+ -webkit-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\
+snippet bxsh:w\n\
+ -webkit-box-shadow: ${1};\n\
+snippet @f\n\
+ @font-face {\n\
+ font-family: ${1};\n\
+ src: url(${2});\n\
+ }\n\
+snippet @i\n\
+ @import url(${1});\n\
+snippet @m\n\
+ @media ${1:print} {\n\
+ ${2}\n\
+ }\n\
+snippet bg+\n\
+ background: #${1:FFF} url(${2}) ${3:0} ${4:0} ${5:no-repeat};\n\
+snippet bga\n\
+ background-attachment: ${1};\n\
+snippet bga:f\n\
+ background-attachment: fixed;\n\
+snippet bga:s\n\
+ background-attachment: scroll;\n\
+snippet bgbk\n\
+ background-break: ${1};\n\
+snippet bgbk:bb\n\
+ background-break: bounding-box;\n\
+snippet bgbk:c\n\
+ background-break: continuous;\n\
+snippet bgbk:eb\n\
+ background-break: each-box;\n\
+snippet bgcp\n\
+ background-clip: ${1};\n\
+snippet bgcp:bb\n\
+ background-clip: border-box;\n\
+snippet bgcp:cb\n\
+ background-clip: content-box;\n\
+snippet bgcp:nc\n\
+ background-clip: no-clip;\n\
+snippet bgcp:pb\n\
+ background-clip: padding-box;\n\
+snippet bgc\n\
+ background-color: #${1:FFF};\n\
+snippet bgc:t\n\
+ background-color: transparent;\n\
+snippet bgi\n\
+ background-image: url(${1});\n\
+snippet bgi:n\n\
+ background-image: none;\n\
+snippet bgo\n\
+ background-origin: ${1};\n\
+snippet bgo:bb\n\
+ background-origin: border-box;\n\
+snippet bgo:cb\n\
+ background-origin: content-box;\n\
+snippet bgo:pb\n\
+ background-origin: padding-box;\n\
+snippet bgpx\n\
+ background-position-x: ${1};\n\
+snippet bgpy\n\
+ background-position-y: ${1};\n\
+snippet bgp\n\
+ background-position: ${1:0} ${2:0};\n\
+snippet bgr\n\
+ background-repeat: ${1};\n\
+snippet bgr:n\n\
+ background-repeat: no-repeat;\n\
+snippet bgr:x\n\
+ background-repeat: repeat-x;\n\
+snippet bgr:y\n\
+ background-repeat: repeat-y;\n\
+snippet bgr:r\n\
+ background-repeat: repeat;\n\
+snippet bgz\n\
+ background-size: ${1};\n\
+snippet bgz:a\n\
+ background-size: auto;\n\
+snippet bgz:ct\n\
+ background-size: contain;\n\
+snippet bgz:cv\n\
+ background-size: cover;\n\
+snippet bg\n\
+ background: ${1};\n\
+snippet bg:ie\n\
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1}',sizingMethod='${2:crop}');\n\
+snippet bg:n\n\
+ background: none;\n\
+snippet bd+\n\
+ border: ${1:1px} ${2:solid} #${3:000};\n\
+snippet bdb+\n\
+ border-bottom: ${1:1px} ${2:solid} #${3:000};\n\
+snippet bdbc\n\
+ border-bottom-color: #${1:000};\n\
+snippet bdbi\n\
+ border-bottom-image: url(${1});\n\
+snippet bdbi:n\n\
+ border-bottom-image: none;\n\
+snippet bdbli\n\
+ border-bottom-left-image: url(${1});\n\
+snippet bdbli:c\n\
+ border-bottom-left-image: continue;\n\
+snippet bdbli:n\n\
+ border-bottom-left-image: none;\n\
+snippet bdblrz\n\
+ border-bottom-left-radius: ${1};\n\
+snippet bdbri\n\
+ border-bottom-right-image: url(${1});\n\
+snippet bdbri:c\n\
+ border-bottom-right-image: continue;\n\
+snippet bdbri:n\n\
+ border-bottom-right-image: none;\n\
+snippet bdbrrz\n\
+ border-bottom-right-radius: ${1};\n\
+snippet bdbs\n\
+ border-bottom-style: ${1};\n\
+snippet bdbs:n\n\
+ border-bottom-style: none;\n\
+snippet bdbw\n\
+ border-bottom-width: ${1};\n\
+snippet bdb\n\
+ border-bottom: ${1};\n\
+snippet bdb:n\n\
+ border-bottom: none;\n\
+snippet bdbk\n\
+ border-break: ${1};\n\
+snippet bdbk:c\n\
+ border-break: close;\n\
+snippet bdcl\n\
+ border-collapse: ${1};\n\
+snippet bdcl:c\n\
+ border-collapse: collapse;\n\
+snippet bdcl:s\n\
+ border-collapse: separate;\n\
+snippet bdc\n\
+ border-color: #${1:000};\n\
+snippet bdci\n\
+ border-corner-image: url(${1});\n\
+snippet bdci:c\n\
+ border-corner-image: continue;\n\
+snippet bdci:n\n\
+ border-corner-image: none;\n\
+snippet bdf\n\
+ border-fit: ${1};\n\
+snippet bdf:c\n\
+ border-fit: clip;\n\
+snippet bdf:of\n\
+ border-fit: overwrite;\n\
+snippet bdf:ow\n\
+ border-fit: overwrite;\n\
+snippet bdf:r\n\
+ border-fit: repeat;\n\
+snippet bdf:sc\n\
+ border-fit: scale;\n\
+snippet bdf:sp\n\
+ border-fit: space;\n\
+snippet bdf:st\n\
+ border-fit: stretch;\n\
+snippet bdi\n\
+ border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\n\
+snippet bdi:n\n\
+ border-image: none;\n\
+snippet bdl+\n\
+ border-left: ${1:1px} ${2:solid} #${3:000};\n\
+snippet bdlc\n\
+ border-left-color: #${1:000};\n\
+snippet bdli\n\
+ border-left-image: url(${1});\n\
+snippet bdli:n\n\
+ border-left-image: none;\n\
+snippet bdls\n\
+ border-left-style: ${1};\n\
+snippet bdls:n\n\
+ border-left-style: none;\n\
+snippet bdlw\n\
+ border-left-width: ${1};\n\
+snippet bdl\n\
+ border-left: ${1};\n\
+snippet bdl:n\n\
+ border-left: none;\n\
+snippet bdlt\n\
+ border-length: ${1};\n\
+snippet bdlt:a\n\
+ border-length: auto;\n\
+snippet bdrz\n\
+ border-radius: ${1};\n\
+snippet bdr+\n\
+ border-right: ${1:1px} ${2:solid} #${3:000};\n\
+snippet bdrc\n\
+ border-right-color: #${1:000};\n\
+snippet bdri\n\
+ border-right-image: url(${1});\n\
+snippet bdri:n\n\
+ border-right-image: none;\n\
+snippet bdrs\n\
+ border-right-style: ${1};\n\
+snippet bdrs:n\n\
+ border-right-style: none;\n\
+snippet bdrw\n\
+ border-right-width: ${1};\n\
+snippet bdr\n\
+ border-right: ${1};\n\
+snippet bdr:n\n\
+ border-right: none;\n\
+snippet bdsp\n\
+ border-spacing: ${1};\n\
+snippet bds\n\
+ border-style: ${1};\n\
+snippet bds:ds\n\
+ border-style: dashed;\n\
+snippet bds:dtds\n\
+ border-style: dot-dash;\n\
+snippet bds:dtdtds\n\
+ border-style: dot-dot-dash;\n\
+snippet bds:dt\n\
+ border-style: dotted;\n\
+snippet bds:db\n\
+ border-style: double;\n\
+snippet bds:g\n\
+ border-style: groove;\n\
+snippet bds:h\n\
+ border-style: hidden;\n\
+snippet bds:i\n\
+ border-style: inset;\n\
+snippet bds:n\n\
+ border-style: none;\n\
+snippet bds:o\n\
+ border-style: outset;\n\
+snippet bds:r\n\
+ border-style: ridge;\n\
+snippet bds:s\n\
+ border-style: solid;\n\
+snippet bds:w\n\
+ border-style: wave;\n\
+snippet bdt+\n\
+ border-top: ${1:1px} ${2:solid} #${3:000};\n\
+snippet bdtc\n\
+ border-top-color: #${1:000};\n\
+snippet bdti\n\
+ border-top-image: url(${1});\n\
+snippet bdti:n\n\
+ border-top-image: none;\n\
+snippet bdtli\n\
+ border-top-left-image: url(${1});\n\
+snippet bdtli:c\n\
+ border-corner-image: continue;\n\
+snippet bdtli:n\n\
+ border-corner-image: none;\n\
+snippet bdtlrz\n\
+ border-top-left-radius: ${1};\n\
+snippet bdtri\n\
+ border-top-right-image: url(${1});\n\
+snippet bdtri:c\n\
+ border-top-right-image: continue;\n\
+snippet bdtri:n\n\
+ border-top-right-image: none;\n\
+snippet bdtrrz\n\
+ border-top-right-radius: ${1};\n\
+snippet bdts\n\
+ border-top-style: ${1};\n\
+snippet bdts:n\n\
+ border-top-style: none;\n\
+snippet bdtw\n\
+ border-top-width: ${1};\n\
+snippet bdt\n\
+ border-top: ${1};\n\
+snippet bdt:n\n\
+ border-top: none;\n\
+snippet bdw\n\
+ border-width: ${1};\n\
+snippet bd\n\
+ border: ${1};\n\
+snippet bd:n\n\
+ border: none;\n\
+snippet b\n\
+ bottom: ${1};\n\
+snippet b:a\n\
+ bottom: auto;\n\
+snippet bxsh+\n\
+ box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\
+snippet bxsh\n\
+ box-shadow: ${1};\n\
+snippet bxsh:n\n\
+ box-shadow: none;\n\
+snippet bxz\n\
+ box-sizing: ${1};\n\
+snippet bxz:bb\n\
+ box-sizing: border-box;\n\
+snippet bxz:cb\n\
+ box-sizing: content-box;\n\
+snippet cps\n\
+ caption-side: ${1};\n\
+snippet cps:b\n\
+ caption-side: bottom;\n\
+snippet cps:t\n\
+ caption-side: top;\n\
+snippet cl\n\
+ clear: ${1};\n\
+snippet cl:b\n\
+ clear: both;\n\
+snippet cl:l\n\
+ clear: left;\n\
+snippet cl:n\n\
+ clear: none;\n\
+snippet cl:r\n\
+ clear: right;\n\
+snippet cp\n\
+ clip: ${1};\n\
+snippet cp:a\n\
+ clip: auto;\n\
+snippet cp:r\n\
+ clip: rect(${1:0} ${2:0} ${3:0} ${4:0});\n\
+snippet c\n\
+ color: #${1:000};\n\
+snippet ct\n\
+ content: ${1};\n\
+snippet ct:a\n\
+ content: attr(${1});\n\
+snippet ct:cq\n\
+ content: close-quote;\n\
+snippet ct:c\n\
+ content: counter(${1});\n\
+snippet ct:cs\n\
+ content: counters(${1});\n\
+snippet ct:ncq\n\
+ content: no-close-quote;\n\
+snippet ct:noq\n\
+ content: no-open-quote;\n\
+snippet ct:n\n\
+ content: normal;\n\
+snippet ct:oq\n\
+ content: open-quote;\n\
+snippet coi\n\
+ counter-increment: ${1};\n\
+snippet cor\n\
+ counter-reset: ${1};\n\
+snippet cur\n\
+ cursor: ${1};\n\
+snippet cur:a\n\
+ cursor: auto;\n\
+snippet cur:c\n\
+ cursor: crosshair;\n\
+snippet cur:d\n\
+ cursor: default;\n\
+snippet cur:ha\n\
+ cursor: hand;\n\
+snippet cur:he\n\
+ cursor: help;\n\
+snippet cur:m\n\
+ cursor: move;\n\
+snippet cur:p\n\
+ cursor: pointer;\n\
+snippet cur:t\n\
+ cursor: text;\n\
+snippet d\n\
+ display: ${1};\n\
+snippet d:mib\n\
+ display: -moz-inline-box;\n\
+snippet d:mis\n\
+ display: -moz-inline-stack;\n\
+snippet d:b\n\
+ display: block;\n\
+snippet d:cp\n\
+ display: compact;\n\
+snippet d:ib\n\
+ display: inline-block;\n\
+snippet d:itb\n\
+ display: inline-table;\n\
+snippet d:i\n\
+ display: inline;\n\
+snippet d:li\n\
+ display: list-item;\n\
+snippet d:n\n\
+ display: none;\n\
+snippet d:ri\n\
+ display: run-in;\n\
+snippet d:tbcp\n\
+ display: table-caption;\n\
+snippet d:tbc\n\
+ display: table-cell;\n\
+snippet d:tbclg\n\
+ display: table-column-group;\n\
+snippet d:tbcl\n\
+ display: table-column;\n\
+snippet d:tbfg\n\
+ display: table-footer-group;\n\
+snippet d:tbhg\n\
+ display: table-header-group;\n\
+snippet d:tbrg\n\
+ display: table-row-group;\n\
+snippet d:tbr\n\
+ display: table-row;\n\
+snippet d:tb\n\
+ display: table;\n\
+snippet ec\n\
+ empty-cells: ${1};\n\
+snippet ec:h\n\
+ empty-cells: hide;\n\
+snippet ec:s\n\
+ empty-cells: show;\n\
+snippet exp\n\
+ expression()\n\
+snippet fl\n\
+ float: ${1};\n\
+snippet fl:l\n\
+ float: left;\n\
+snippet fl:n\n\
+ float: none;\n\
+snippet fl:r\n\
+ float: right;\n\
+snippet f+\n\
+ font: ${1:1em} ${2:Arial},${3:sans-serif};\n\
+snippet fef\n\
+ font-effect: ${1};\n\
+snippet fef:eb\n\
+ font-effect: emboss;\n\
+snippet fef:eg\n\
+ font-effect: engrave;\n\
+snippet fef:n\n\
+ font-effect: none;\n\
+snippet fef:o\n\
+ font-effect: outline;\n\
+snippet femp\n\
+ font-emphasize-position: ${1};\n\
+snippet femp:a\n\
+ font-emphasize-position: after;\n\
+snippet femp:b\n\
+ font-emphasize-position: before;\n\
+snippet fems\n\
+ font-emphasize-style: ${1};\n\
+snippet fems:ac\n\
+ font-emphasize-style: accent;\n\
+snippet fems:c\n\
+ font-emphasize-style: circle;\n\
+snippet fems:ds\n\
+ font-emphasize-style: disc;\n\
+snippet fems:dt\n\
+ font-emphasize-style: dot;\n\
+snippet fems:n\n\
+ font-emphasize-style: none;\n\
+snippet fem\n\
+ font-emphasize: ${1};\n\
+snippet ff\n\
+ font-family: ${1};\n\
+snippet ff:c\n\
+ font-family: ${1:'Monotype Corsiva','Comic Sans MS'},cursive;\n\
+snippet ff:f\n\
+ font-family: ${1:Capitals,Impact},fantasy;\n\
+snippet ff:m\n\
+ font-family: ${1:Monaco,'Courier New'},monospace;\n\
+snippet ff:ss\n\
+ font-family: ${1:Helvetica,Arial},sans-serif;\n\
+snippet ff:s\n\
+ font-family: ${1:Georgia,'Times New Roman'},serif;\n\
+snippet fza\n\
+ font-size-adjust: ${1};\n\
+snippet fza:n\n\
+ font-size-adjust: none;\n\
+snippet fz\n\
+ font-size: ${1};\n\
+snippet fsm\n\
+ font-smooth: ${1};\n\
+snippet fsm:aw\n\
+ font-smooth: always;\n\
+snippet fsm:a\n\
+ font-smooth: auto;\n\
+snippet fsm:n\n\
+ font-smooth: never;\n\
+snippet fst\n\
+ font-stretch: ${1};\n\
+snippet fst:c\n\
+ font-stretch: condensed;\n\
+snippet fst:e\n\
+ font-stretch: expanded;\n\
+snippet fst:ec\n\
+ font-stretch: extra-condensed;\n\
+snippet fst:ee\n\
+ font-stretch: extra-expanded;\n\
+snippet fst:n\n\
+ font-stretch: normal;\n\
+snippet fst:sc\n\
+ font-stretch: semi-condensed;\n\
+snippet fst:se\n\
+ font-stretch: semi-expanded;\n\
+snippet fst:uc\n\
+ font-stretch: ultra-condensed;\n\
+snippet fst:ue\n\
+ font-stretch: ultra-expanded;\n\
+snippet fs\n\
+ font-style: ${1};\n\
+snippet fs:i\n\
+ font-style: italic;\n\
+snippet fs:n\n\
+ font-style: normal;\n\
+snippet fs:o\n\
+ font-style: oblique;\n\
+snippet fv\n\
+ font-variant: ${1};\n\
+snippet fv:n\n\
+ font-variant: normal;\n\
+snippet fv:sc\n\
+ font-variant: small-caps;\n\
+snippet fw\n\
+ font-weight: ${1};\n\
+snippet fw:b\n\
+ font-weight: bold;\n\
+snippet fw:br\n\
+ font-weight: bolder;\n\
+snippet fw:lr\n\
+ font-weight: lighter;\n\
+snippet fw:n\n\
+ font-weight: normal;\n\
+snippet f\n\
+ font: ${1};\n\
+snippet h\n\
+ height: ${1};\n\
+snippet h:a\n\
+ height: auto;\n\
+snippet l\n\
+ left: ${1};\n\
+snippet l:a\n\
+ left: auto;\n\
+snippet lts\n\
+ letter-spacing: ${1};\n\
+snippet lh\n\
+ line-height: ${1};\n\
+snippet lisi\n\
+ list-style-image: url(${1});\n\
+snippet lisi:n\n\
+ list-style-image: none;\n\
+snippet lisp\n\
+ list-style-position: ${1};\n\
+snippet lisp:i\n\
+ list-style-position: inside;\n\
+snippet lisp:o\n\
+ list-style-position: outside;\n\
+snippet list\n\
+ list-style-type: ${1};\n\
+snippet list:c\n\
+ list-style-type: circle;\n\
+snippet list:dclz\n\
+ list-style-type: decimal-leading-zero;\n\
+snippet list:dc\n\
+ list-style-type: decimal;\n\
+snippet list:d\n\
+ list-style-type: disc;\n\
+snippet list:lr\n\
+ list-style-type: lower-roman;\n\
+snippet list:n\n\
+ list-style-type: none;\n\
+snippet list:s\n\
+ list-style-type: square;\n\
+snippet list:ur\n\
+ list-style-type: upper-roman;\n\
+snippet lis\n\
+ list-style: ${1};\n\
+snippet lis:n\n\
+ list-style: none;\n\
+snippet mb\n\
+ margin-bottom: ${1};\n\
+snippet mb:a\n\
+ margin-bottom: auto;\n\
+snippet ml\n\
+ margin-left: ${1};\n\
+snippet ml:a\n\
+ margin-left: auto;\n\
+snippet mr\n\
+ margin-right: ${1};\n\
+snippet mr:a\n\
+ margin-right: auto;\n\
+snippet mt\n\
+ margin-top: ${1};\n\
+snippet mt:a\n\
+ margin-top: auto;\n\
+snippet m\n\
+ margin: ${1};\n\
+snippet m:4\n\
+ margin: ${1:0} ${2:0} ${3:0} ${4:0};\n\
+snippet m:3\n\
+ margin: ${1:0} ${2:0} ${3:0};\n\
+snippet m:2\n\
+ margin: ${1:0} ${2:0};\n\
+snippet m:0\n\
+ margin: 0;\n\
+snippet m:a\n\
+ margin: auto;\n\
+snippet mah\n\
+ max-height: ${1};\n\
+snippet mah:n\n\
+ max-height: none;\n\
+snippet maw\n\
+ max-width: ${1};\n\
+snippet maw:n\n\
+ max-width: none;\n\
+snippet mih\n\
+ min-height: ${1};\n\
+snippet miw\n\
+ min-width: ${1};\n\
+snippet op\n\
+ opacity: ${1};\n\
+snippet op:ie\n\
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100});\n\
+snippet op:ms\n\
+ -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100})';\n\
+snippet orp\n\
+ orphans: ${1};\n\
+snippet o+\n\
+ outline: ${1:1px} ${2:solid} #${3:000};\n\
+snippet oc\n\
+ outline-color: ${1:#000};\n\
+snippet oc:i\n\
+ outline-color: invert;\n\
+snippet oo\n\
+ outline-offset: ${1};\n\
+snippet os\n\
+ outline-style: ${1};\n\
+snippet ow\n\
+ outline-width: ${1};\n\
+snippet o\n\
+ outline: ${1};\n\
+snippet o:n\n\
+ outline: none;\n\
+snippet ovs\n\
+ overflow-style: ${1};\n\
+snippet ovs:a\n\
+ overflow-style: auto;\n\
+snippet ovs:mq\n\
+ overflow-style: marquee;\n\
+snippet ovs:mv\n\
+ overflow-style: move;\n\
+snippet ovs:p\n\
+ overflow-style: panner;\n\
+snippet ovs:s\n\
+ overflow-style: scrollbar;\n\
+snippet ovx\n\
+ overflow-x: ${1};\n\
+snippet ovx:a\n\
+ overflow-x: auto;\n\
+snippet ovx:h\n\
+ overflow-x: hidden;\n\
+snippet ovx:s\n\
+ overflow-x: scroll;\n\
+snippet ovx:v\n\
+ overflow-x: visible;\n\
+snippet ovy\n\
+ overflow-y: ${1};\n\
+snippet ovy:a\n\
+ overflow-y: auto;\n\
+snippet ovy:h\n\
+ overflow-y: hidden;\n\
+snippet ovy:s\n\
+ overflow-y: scroll;\n\
+snippet ovy:v\n\
+ overflow-y: visible;\n\
+snippet ov\n\
+ overflow: ${1};\n\
+snippet ov:a\n\
+ overflow: auto;\n\
+snippet ov:h\n\
+ overflow: hidden;\n\
+snippet ov:s\n\
+ overflow: scroll;\n\
+snippet ov:v\n\
+ overflow: visible;\n\
+snippet pb\n\
+ padding-bottom: ${1};\n\
+snippet pl\n\
+ padding-left: ${1};\n\
+snippet pr\n\
+ padding-right: ${1};\n\
+snippet pt\n\
+ padding-top: ${1};\n\
+snippet p\n\
+ padding: ${1};\n\
+snippet p:4\n\
+ padding: ${1:0} ${2:0} ${3:0} ${4:0};\n\
+snippet p:3\n\
+ padding: ${1:0} ${2:0} ${3:0};\n\
+snippet p:2\n\
+ padding: ${1:0} ${2:0};\n\
+snippet p:0\n\
+ padding: 0;\n\
+snippet pgba\n\
+ page-break-after: ${1};\n\
+snippet pgba:aw\n\
+ page-break-after: always;\n\
+snippet pgba:a\n\
+ page-break-after: auto;\n\
+snippet pgba:l\n\
+ page-break-after: left;\n\
+snippet pgba:r\n\
+ page-break-after: right;\n\
+snippet pgbb\n\
+ page-break-before: ${1};\n\
+snippet pgbb:aw\n\
+ page-break-before: always;\n\
+snippet pgbb:a\n\
+ page-break-before: auto;\n\
+snippet pgbb:l\n\
+ page-break-before: left;\n\
+snippet pgbb:r\n\
+ page-break-before: right;\n\
+snippet pgbi\n\
+ page-break-inside: ${1};\n\
+snippet pgbi:a\n\
+ page-break-inside: auto;\n\
+snippet pgbi:av\n\
+ page-break-inside: avoid;\n\
+snippet pos\n\
+ position: ${1};\n\
+snippet pos:a\n\
+ position: absolute;\n\
+snippet pos:f\n\
+ position: fixed;\n\
+snippet pos:r\n\
+ position: relative;\n\
+snippet pos:s\n\
+ position: static;\n\
+snippet q\n\
+ quotes: ${1};\n\
+snippet q:en\n\
+ quotes: '\\201C' '\\201D' '\\2018' '\\2019';\n\
+snippet q:n\n\
+ quotes: none;\n\
+snippet q:ru\n\
+ quotes: '\\00AB' '\\00BB' '\\201E' '\\201C';\n\
+snippet rz\n\
+ resize: ${1};\n\
+snippet rz:b\n\
+ resize: both;\n\
+snippet rz:h\n\
+ resize: horizontal;\n\
+snippet rz:n\n\
+ resize: none;\n\
+snippet rz:v\n\
+ resize: vertical;\n\
+snippet r\n\
+ right: ${1};\n\
+snippet r:a\n\
+ right: auto;\n\
+snippet tbl\n\
+ table-layout: ${1};\n\
+snippet tbl:a\n\
+ table-layout: auto;\n\
+snippet tbl:f\n\
+ table-layout: fixed;\n\
+snippet tal\n\
+ text-align-last: ${1};\n\
+snippet tal:a\n\
+ text-align-last: auto;\n\
+snippet tal:c\n\
+ text-align-last: center;\n\
+snippet tal:l\n\
+ text-align-last: left;\n\
+snippet tal:r\n\
+ text-align-last: right;\n\
+snippet ta\n\
+ text-align: ${1};\n\
+snippet ta:c\n\
+ text-align: center;\n\
+snippet ta:l\n\
+ text-align: left;\n\
+snippet ta:r\n\
+ text-align: right;\n\
+snippet td\n\
+ text-decoration: ${1};\n\
+snippet td:l\n\
+ text-decoration: line-through;\n\
+snippet td:n\n\
+ text-decoration: none;\n\
+snippet td:o\n\
+ text-decoration: overline;\n\
+snippet td:u\n\
+ text-decoration: underline;\n\
+snippet te\n\
+ text-emphasis: ${1};\n\
+snippet te:ac\n\
+ text-emphasis: accent;\n\
+snippet te:a\n\
+ text-emphasis: after;\n\
+snippet te:b\n\
+ text-emphasis: before;\n\
+snippet te:c\n\
+ text-emphasis: circle;\n\
+snippet te:ds\n\
+ text-emphasis: disc;\n\
+snippet te:dt\n\
+ text-emphasis: dot;\n\
+snippet te:n\n\
+ text-emphasis: none;\n\
+snippet th\n\
+ text-height: ${1};\n\
+snippet th:a\n\
+ text-height: auto;\n\
+snippet th:f\n\
+ text-height: font-size;\n\
+snippet th:m\n\
+ text-height: max-size;\n\
+snippet th:t\n\
+ text-height: text-size;\n\
+snippet ti\n\
+ text-indent: ${1};\n\
+snippet ti:-\n\
+ text-indent: -9999px;\n\
+snippet tj\n\
+ text-justify: ${1};\n\
+snippet tj:a\n\
+ text-justify: auto;\n\
+snippet tj:d\n\
+ text-justify: distribute;\n\
+snippet tj:ic\n\
+ text-justify: inter-cluster;\n\
+snippet tj:ii\n\
+ text-justify: inter-ideograph;\n\
+snippet tj:iw\n\
+ text-justify: inter-word;\n\
+snippet tj:k\n\
+ text-justify: kashida;\n\
+snippet tj:t\n\
+ text-justify: tibetan;\n\
+snippet to+\n\
+ text-outline: ${1:0} ${2:0} #${3:000};\n\
+snippet to\n\
+ text-outline: ${1};\n\
+snippet to:n\n\
+ text-outline: none;\n\
+snippet tr\n\
+ text-replace: ${1};\n\
+snippet tr:n\n\
+ text-replace: none;\n\
+snippet tsh+\n\
+ text-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\
+snippet tsh\n\
+ text-shadow: ${1};\n\
+snippet tsh:n\n\
+ text-shadow: none;\n\
+snippet tt\n\
+ text-transform: ${1};\n\
+snippet tt:c\n\
+ text-transform: capitalize;\n\
+snippet tt:l\n\
+ text-transform: lowercase;\n\
+snippet tt:n\n\
+ text-transform: none;\n\
+snippet tt:u\n\
+ text-transform: uppercase;\n\
+snippet tw\n\
+ text-wrap: ${1};\n\
+snippet tw:no\n\
+ text-wrap: none;\n\
+snippet tw:n\n\
+ text-wrap: normal;\n\
+snippet tw:s\n\
+ text-wrap: suppress;\n\
+snippet tw:u\n\
+ text-wrap: unrestricted;\n\
+snippet t\n\
+ top: ${1};\n\
+snippet t:a\n\
+ top: auto;\n\
+snippet va\n\
+ vertical-align: ${1};\n\
+snippet va:bl\n\
+ vertical-align: baseline;\n\
+snippet va:b\n\
+ vertical-align: bottom;\n\
+snippet va:m\n\
+ vertical-align: middle;\n\
+snippet va:sub\n\
+ vertical-align: sub;\n\
+snippet va:sup\n\
+ vertical-align: super;\n\
+snippet va:tb\n\
+ vertical-align: text-bottom;\n\
+snippet va:tt\n\
+ vertical-align: text-top;\n\
+snippet va:t\n\
+ vertical-align: top;\n\
+snippet v\n\
+ visibility: ${1};\n\
+snippet v:c\n\
+ visibility: collapse;\n\
+snippet v:h\n\
+ visibility: hidden;\n\
+snippet v:v\n\
+ visibility: visible;\n\
+snippet whsc\n\
+ white-space-collapse: ${1};\n\
+snippet whsc:ba\n\
+ white-space-collapse: break-all;\n\
+snippet whsc:bs\n\
+ white-space-collapse: break-strict;\n\
+snippet whsc:k\n\
+ white-space-collapse: keep-all;\n\
+snippet whsc:l\n\
+ white-space-collapse: loose;\n\
+snippet whsc:n\n\
+ white-space-collapse: normal;\n\
+snippet whs\n\
+ white-space: ${1};\n\
+snippet whs:n\n\
+ white-space: normal;\n\
+snippet whs:nw\n\
+ white-space: nowrap;\n\
+snippet whs:pl\n\
+ white-space: pre-line;\n\
+snippet whs:pw\n\
+ white-space: pre-wrap;\n\
+snippet whs:p\n\
+ white-space: pre;\n\
+snippet wid\n\
+ widows: ${1};\n\
+snippet w\n\
+ width: ${1};\n\
+snippet w:a\n\
+ width: auto;\n\
+snippet wob\n\
+ word-break: ${1};\n\
+snippet wob:ba\n\
+ word-break: break-all;\n\
+snippet wob:bs\n\
+ word-break: break-strict;\n\
+snippet wob:k\n\
+ word-break: keep-all;\n\
+snippet wob:l\n\
+ word-break: loose;\n\
+snippet wob:n\n\
+ word-break: normal;\n\
+snippet wos\n\
+ word-spacing: ${1};\n\
+snippet wow\n\
+ word-wrap: ${1};\n\
+snippet wow:no\n\
+ word-wrap: none;\n\
+snippet wow:n\n\
+ word-wrap: normal;\n\
+snippet wow:s\n\
+ word-wrap: suppress;\n\
+snippet wow:u\n\
+ word-wrap: unrestricted;\n\
+snippet z\n\
+ z-index: ${1};\n\
+snippet z:a\n\
+ z-index: auto;\n\
+snippet zoo\n\
+ zoom: 1;\n\
+";
+exports.scope = "css";
+
+});
diff --git a/lib/client/edit/snippets/dart.js b/lib/client/edit/snippets/dart.js
new file mode 100644
index 00000000..bd655734
--- /dev/null
+++ b/lib/client/edit/snippets/dart.js
@@ -0,0 +1,90 @@
+ace.define('ace/snippets/dart', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet lib\n\
+ library ${1};\n\
+ ${2}\n\
+snippet im\n\
+ import '${1}';\n\
+ ${2}\n\
+snippet pa\n\
+ part '${1}';\n\
+ ${2}\n\
+snippet pao\n\
+ part of ${1};\n\
+ ${2}\n\
+snippet main\n\
+ void main() {\n\
+ ${1:/* code */}\n\
+ }\n\
+snippet st\n\
+ static ${1}\n\
+snippet fi\n\
+ final ${1}\n\
+snippet re\n\
+ return ${1}\n\
+snippet br\n\
+ break;\n\
+snippet th\n\
+ throw ${1}\n\
+snippet cl\n\
+ class ${1:`Filename(\"\", \"untitled\")`} ${2}\n\
+snippet imp\n\
+ implements ${1}\n\
+snippet ext\n\
+ extends ${1}\n\
+snippet if\n\
+ if (${1:true}) {\n\
+ ${2}\n\
+ }\n\
+snippet ife\n\
+ if (${1:true}) {\n\
+ ${2}\n\
+ } else {\n\
+ ${3}\n\
+ }\n\
+snippet el\n\
+ else\n\
+snippet sw\n\
+ switch (${1}) {\n\
+ ${2}\n\
+ }\n\
+snippet cs\n\
+ case ${1}:\n\
+ ${2}\n\
+snippet de\n\
+ default:\n\
+ ${1}\n\
+snippet for\n\
+ for (var ${2:i} = 0, len = ${1:things}.length; $2 < len; ${3:++}$2) {\n\
+ ${4:$1[$2]}\n\
+ }\n\
+snippet fore\n\
+ for (final ${2:item} in ${1:itemList}) {\n\
+ ${3:/* code */}\n\
+ }\n\
+snippet wh\n\
+ while (${1:/* condition */}) {\n\
+ ${2:/* code */}\n\
+ }\n\
+snippet dowh\n\
+ do {\n\
+ ${2:/* code */}\n\
+ } while (${1:/* condition */});\n\
+snippet as\n\
+ assert(${1:/* condition */});\n\
+snippet try\n\
+ try {\n\
+ ${2}\n\
+ } catch (${1:Exception e}) {\n\
+ }\n\
+snippet tryf\n\
+ try {\n\
+ ${2}\n\
+ } catch (${1:Exception e}) {\n\
+ } finally {\n\
+ }\n\
+";
+exports.scope = "dart";
+
+});
diff --git a/lib/client/edit/snippets/diff.js b/lib/client/edit/snippets/diff.js
new file mode 100644
index 00000000..d39023cc
--- /dev/null
+++ b/lib/client/edit/snippets/diff.js
@@ -0,0 +1,18 @@
+ace.define('ace/snippets/diff', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# DEP-3 (http://dep.debian.net/deps/dep3/) style patch header\n\
+snippet header DEP-3 style header\n\
+ Description: ${1}\n\
+ Origin: ${2:vendor|upstream|other}, ${3:url of the original patch}\n\
+ Bug: ${4:url in upstream bugtracker}\n\
+ Forwarded: ${5:no|not-needed|url}\n\
+ Author: ${6:`g:snips_author`}\n\
+ Reviewed-by: ${7:name and email}\n\
+ Last-Update: ${8:`strftime(\"%Y-%m-%d\")`}\n\
+ Applied-Upstream: ${9:upstream version|url|commit}\n\
+\n\
+";
+exports.scope = "diff";
+
+});
diff --git a/lib/client/edit/snippets/django.js b/lib/client/edit/snippets/django.js
new file mode 100644
index 00000000..97eefc03
--- /dev/null
+++ b/lib/client/edit/snippets/django.js
@@ -0,0 +1,115 @@
+ace.define('ace/snippets/django', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# Model Fields\n\
+\n\
+# Note: Optional arguments are using defaults that match what Django will use\n\
+# as a default, e.g. with max_length fields. Doing this as a form of self\n\
+# documentation and to make it easy to know whether you should override the\n\
+# default or not.\n\
+\n\
+# Note: Optional arguments that are booleans will use the opposite since you\n\
+# can either not specify them, or override them, e.g. auto_now_add=False.\n\
+\n\
+snippet auto\n\
+ ${1:FIELDNAME} = models.AutoField(${2})\n\
+snippet bool\n\
+ ${1:FIELDNAME} = models.BooleanField(${2:default=True})\n\
+snippet char\n\
+ ${1:FIELDNAME} = models.CharField(max_length=${2}${3:, blank=True})\n\
+snippet comma\n\
+ ${1:FIELDNAME} = models.CommaSeparatedIntegerField(max_length=${2}${3:, blank=True})\n\
+snippet date\n\
+ ${1:FIELDNAME} = models.DateField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\n\
+snippet datetime\n\
+ ${1:FIELDNAME} = models.DateTimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\n\
+snippet decimal\n\
+ ${1:FIELDNAME} = models.DecimalField(max_digits=${2}, decimal_places=${3})\n\
+snippet email\n\
+ ${1:FIELDNAME} = models.EmailField(max_length=${2:75}${3:, blank=True})\n\
+snippet file\n\
+ ${1:FIELDNAME} = models.FileField(upload_to=${2:path/for/upload}${3:, max_length=100})\n\
+snippet filepath\n\
+ ${1:FIELDNAME} = models.FilePathField(path=${2:\"/abs/path/to/dir\"}${3:, max_length=100}${4:, match=\"*.ext\"}${5:, recursive=True}${6:, blank=True, })\n\
+snippet float\n\
+ ${1:FIELDNAME} = models.FloatField(${2})\n\
+snippet image\n\
+ ${1:FIELDNAME} = models.ImageField(upload_to=${2:path/for/upload}${3:, height_field=height, width_field=width}${4:, max_length=100})\n\
+snippet int\n\
+ ${1:FIELDNAME} = models.IntegerField(${2})\n\
+snippet ip\n\
+ ${1:FIELDNAME} = models.IPAddressField(${2})\n\
+snippet nullbool\n\
+ ${1:FIELDNAME} = models.NullBooleanField(${2})\n\
+snippet posint\n\
+ ${1:FIELDNAME} = models.PositiveIntegerField(${2})\n\
+snippet possmallint\n\
+ ${1:FIELDNAME} = models.PositiveSmallIntegerField(${2})\n\
+snippet slug\n\
+ ${1:FIELDNAME} = models.SlugField(max_length=${2:50}${3:, blank=True})\n\
+snippet smallint\n\
+ ${1:FIELDNAME} = models.SmallIntegerField(${2})\n\
+snippet text\n\
+ ${1:FIELDNAME} = models.TextField(${2:blank=True})\n\
+snippet time\n\
+ ${1:FIELDNAME} = models.TimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\n\
+snippet url\n\
+ ${1:FIELDNAME} = models.URLField(${2:verify_exists=False}${3:, max_length=200}${4:, blank=True})\n\
+snippet xml\n\
+ ${1:FIELDNAME} = models.XMLField(schema_path=${2:None}${3:, blank=True})\n\
+# Relational Fields\n\
+snippet fk\n\
+ ${1:FIELDNAME} = models.ForeignKey(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, to_field=''})\n\
+snippet m2m\n\
+ ${1:FIELDNAME} = models.ManyToManyField(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, symmetrical=False}${6:, through=''}${7:, db_table=''})\n\
+snippet o2o\n\
+ ${1:FIELDNAME} = models.OneToOneField(${2:OtherModel}${3:, parent_link=True}${4:, related_name=''}${5:, limit_choices_to=}${6:, to_field=''})\n\
+\n\
+# Code Skeletons\n\
+\n\
+snippet form\n\
+ class ${1:FormName}(forms.Form):\n\
+ \"\"\"${2:docstring}\"\"\"\n\
+ ${3}\n\
+\n\
+snippet model\n\
+ class ${1:ModelName}(models.Model):\n\
+ \"\"\"${2:docstring}\"\"\"\n\
+ ${3}\n\
+ \n\
+ class Meta:\n\
+ ${4}\n\
+ \n\
+ def __unicode__(self):\n\
+ ${5}\n\
+ \n\
+ def save(self, force_insert=False, force_update=False):\n\
+ ${6}\n\
+ \n\
+ @models.permalink\n\
+ def get_absolute_url(self):\n\
+ return ('${7:view_or_url_name}' ${8})\n\
+\n\
+snippet modeladmin\n\
+ class ${1:ModelName}Admin(admin.ModelAdmin):\n\
+ ${2}\n\
+ \n\
+ admin.site.register($1, $1Admin)\n\
+ \n\
+snippet tabularinline\n\
+ class ${1:ModelName}Inline(admin.TabularInline):\n\
+ model = $1\n\
+\n\
+snippet stackedinline\n\
+ class ${1:ModelName}Inline(admin.StackedInline):\n\
+ model = $1\n\
+\n\
+snippet r2r\n\
+ return render_to_response('${1:template.html}', {\n\
+ ${2}\n\
+ }${3:, context_instance=RequestContext(request)}\n\
+ )\n\
+";
+exports.scope = "django";
+
+});
diff --git a/lib/client/edit/snippets/ejs.js b/lib/client/edit/snippets/ejs.js
new file mode 100644
index 00000000..bdeec6ce
--- /dev/null
+++ b/lib/client/edit/snippets/ejs.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/ejs', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "ejs";
+
+});
diff --git a/lib/client/edit/snippets/erlang.js b/lib/client/edit/snippets/erlang.js
new file mode 100644
index 00000000..b40f8d19
--- /dev/null
+++ b/lib/client/edit/snippets/erlang.js
@@ -0,0 +1,167 @@
+ace.define('ace/snippets/erlang', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# module and export all\n\
+snippet mod\n\
+ -module(${1:`Filename('', 'my')`}).\n\
+ \n\
+ -compile([export_all]).\n\
+ \n\
+ start() ->\n\
+ ${2}\n\
+ \n\
+ stop() ->\n\
+ ok.\n\
+# define directive\n\
+snippet def\n\
+ -ace.define(${1:macro}, ${2:body}).${3}\n\
+# export directive\n\
+snippet exp\n\
+ -export([${1:function}/${2:arity}]).\n\
+# include directive\n\
+snippet inc\n\
+ -include(\"${1:file}\").${2}\n\
+# behavior directive\n\
+snippet beh\n\
+ -behaviour(${1:behaviour}).${2}\n\
+# if expression\n\
+snippet if\n\
+ if\n\
+ ${1:guard} ->\n\
+ ${2:body}\n\
+ end\n\
+# case expression\n\
+snippet case\n\
+ case ${1:expression} of\n\
+ ${2:pattern} ->\n\
+ ${3:body};\n\
+ end\n\
+# anonymous function\n\
+snippet fun\n\
+ fun (${1:Parameters}) -> ${2:body} end${3}\n\
+# try...catch\n\
+snippet try\n\
+ try\n\
+ ${1}\n\
+ catch\n\
+ ${2:_:_} -> ${3:got_some_exception}\n\
+ end\n\
+# record directive\n\
+snippet rec\n\
+ -record(${1:record}, {\n\
+ ${2:field}=${3:value}}).${4}\n\
+# todo comment\n\
+snippet todo\n\
+ %% TODO: ${1}\n\
+## Snippets below (starting with '%') are in EDoc format.\n\
+## See http://www.erlang.org/doc/apps/edoc/chapter.html#id56887 for more details\n\
+# doc comment\n\
+snippet %d\n\
+ %% @doc ${1}\n\
+# end of doc comment\n\
+snippet %e\n\
+ %% @end\n\
+# specification comment\n\
+snippet %s\n\
+ %% @spec ${1}\n\
+# private function marker\n\
+snippet %p\n\
+ %% @private\n\
+# OTP application\n\
+snippet application\n\
+ -module(${1:`Filename('', 'my')`}).\n\
+\n\
+ -behaviour(application).\n\
+\n\
+ -export([start/2, stop/1]).\n\
+\n\
+ start(_Type, _StartArgs) ->\n\
+ case ${2:root_supervisor}:start_link() of\n\
+ {ok, Pid} ->\n\
+ {ok, Pid};\n\
+ Other ->\n\
+ {error, Other}\n\
+ end.\n\
+\n\
+ stop(_State) ->\n\
+ ok. \n\
+# OTP supervisor\n\
+snippet supervisor\n\
+ -module(${1:`Filename('', 'my')`}).\n\
+\n\
+ -behaviour(supervisor).\n\
+\n\
+ %% API\n\
+ -export([start_link/0]).\n\
+\n\
+ %% Supervisor callbacks\n\
+ -export([init/1]).\n\
+\n\
+ -ace.define(SERVER, ?MODULE).\n\
+\n\
+ start_link() ->\n\
+ supervisor:start_link({local, ?SERVER}, ?MODULE, []).\n\
+\n\
+ init([]) ->\n\
+ Server = {${2:my_server}, {$2, start_link, []},\n\
+ permanent, 2000, worker, [$2]},\n\
+ Children = [Server],\n\
+ RestartStrategy = {one_for_one, 0, 1},\n\
+ {ok, {RestartStrategy, Children}}.\n\
+# OTP gen_server\n\
+snippet gen_server\n\
+ -module(${1:`Filename('', 'my')`}).\n\
+\n\
+ -behaviour(gen_server).\n\
+\n\
+ %% API\n\
+ -export([\n\
+ start_link/0\n\
+ ]).\n\
+\n\
+ %% gen_server callbacks\n\
+ -export([init/1, handle_call/3, handle_cast/2, handle_info/2,\n\
+ terminate/2, code_change/3]).\n\
+\n\
+ -ace.define(SERVER, ?MODULE).\n\
+\n\
+ -record(state, {}).\n\
+\n\
+ %%%===================================================================\n\
+ %%% API\n\
+ %%%===================================================================\n\
+\n\
+ start_link() ->\n\
+ gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).\n\
+\n\
+ %%%===================================================================\n\
+ %%% gen_server callbacks\n\
+ %%%===================================================================\n\
+\n\
+ init([]) ->\n\
+ {ok, #state{}}.\n\
+\n\
+ handle_call(_Request, _From, State) ->\n\
+ Reply = ok,\n\
+ {reply, Reply, State}.\n\
+\n\
+ handle_cast(_Msg, State) ->\n\
+ {noreply, State}.\n\
+\n\
+ handle_info(_Info, State) ->\n\
+ {noreply, State}.\n\
+\n\
+ terminate(_Reason, _State) ->\n\
+ ok.\n\
+\n\
+ code_change(_OldVsn, State, _Extra) ->\n\
+ {ok, State}.\n\
+\n\
+ %%%===================================================================\n\
+ %%% Internal functions\n\
+ %%%===================================================================\n\
+\n\
+";
+exports.scope = "erlang";
+
+});
diff --git a/lib/client/edit/snippets/haml.js b/lib/client/edit/snippets/haml.js
new file mode 100644
index 00000000..50199971
--- /dev/null
+++ b/lib/client/edit/snippets/haml.js
@@ -0,0 +1,27 @@
+ace.define('ace/snippets/haml', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet t\n\
+ %table\n\
+ %tr\n\
+ %th\n\
+ ${1:headers}\n\
+ %tr\n\
+ %td\n\
+ ${2:headers}\n\
+snippet ul\n\
+ %ul\n\
+ %li\n\
+ ${1:item}\n\
+ %li\n\
+snippet =rp\n\
+ = render :partial => '${1:partial}'\n\
+snippet =rpl\n\
+ = render :partial => '${1:partial}', :locals => {}\n\
+snippet =rpc\n\
+ = render :partial => '${1:partial}', :collection => @$1\n\
+\n\
+";
+exports.scope = "haml";
+
+});
diff --git a/lib/client/edit/snippets/handlebars.js b/lib/client/edit/snippets/handlebars.js
new file mode 100644
index 00000000..5aec6e97
--- /dev/null
+++ b/lib/client/edit/snippets/handlebars.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/handlebars', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "handlebars";
+
+});
diff --git a/lib/client/edit/snippets/haskell.js b/lib/client/edit/snippets/haskell.js
new file mode 100644
index 00000000..e107ece8
--- /dev/null
+++ b/lib/client/edit/snippets/haskell.js
@@ -0,0 +1,89 @@
+ace.define('ace/snippets/haskell', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet lang\n\
+ {-# LANGUAGE ${1:OverloadedStrings} #-}\n\
+snippet info\n\
+ -- |\n\
+ -- Module : ${1:Module.Namespace}\n\
+ -- Copyright : ${2:Author} ${3:2011-2012}\n\
+ -- License : ${4:BSD3}\n\
+ --\n\
+ -- Maintainer : ${5:email@something.com}\n\
+ -- Stability : ${6:experimental}\n\
+ -- Portability : ${7:unknown}\n\
+ --\n\
+ -- ${8:Description}\n\
+ --\n\
+snippet import\n\
+ import ${1:Data.Text}\n\
+snippet import2\n\
+ import ${1:Data.Text} (${2:head})\n\
+snippet importq\n\
+ import qualified ${1:Data.Text} as ${2:T}\n\
+snippet inst\n\
+ instance ${1:Monoid} ${2:Type} where\n\
+ ${3}\n\
+snippet type\n\
+ type ${1:Type} = ${2:Type}\n\
+snippet data\n\
+ data ${1:Type} = ${2:$1} ${3:Int}\n\
+snippet newtype\n\
+ newtype ${1:Type} = ${2:$1} ${3:Int}\n\
+snippet class\n\
+ class ${1:Class} a where\n\
+ ${2}\n\
+snippet module\n\
+ module `substitute(substitute(expand('%:r'), '[/\\\\]','.','g'),'^\\%(\\l*\\.\\)\\?','','')` (\n\
+ ) where\n\
+ `expand('%') =~ 'Main' ? \"\\n\\nmain = do\\n print \\\"hello world\\\"\" : \"\"`\n\
+\n\
+snippet const\n\
+ ${1:name} :: ${2:a}\n\
+ $1 = ${3:undefined}\n\
+snippet fn\n\
+ ${1:fn} :: ${2:a} -> ${3:a}\n\
+ $1 ${4} = ${5:undefined}\n\
+snippet fn2\n\
+ ${1:fn} :: ${2:a} -> ${3:a} -> ${4:a}\n\
+ $1 ${5} = ${6:undefined}\n\
+snippet ap\n\
+ ${1:map} ${2:fn} ${3:list}\n\
+snippet do\n\
+ do\n\
+ \n\
+snippet λ\n\
+ \\${1:x} -> ${2}\n\
+snippet \\\n\
+ \\${1:x} -> ${2}\n\
+snippet <-\n\
+ ${1:a} <- ${2:m a}\n\
+snippet ←\n\
+ ${1:a} <- ${2:m a}\n\
+snippet ->\n\
+ ${1:m a} -> ${2:a}\n\
+snippet →\n\
+ ${1:m a} -> ${2:a}\n\
+snippet tup\n\
+ (${1:a}, ${2:b})\n\
+snippet tup2\n\
+ (${1:a}, ${2:b}, ${3:c})\n\
+snippet tup3\n\
+ (${1:a}, ${2:b}, ${3:c}, ${4:d})\n\
+snippet rec\n\
+ ${1:Record} { ${2:recFieldA} = ${3:undefined}\n\
+ , ${4:recFieldB} = ${5:undefined}\n\
+ }\n\
+snippet case\n\
+ case ${1:something} of\n\
+ ${2} -> ${3}\n\
+snippet let\n\
+ let ${1} = ${2}\n\
+ in ${3}\n\
+snippet where\n\
+ where\n\
+ ${1:fn} = ${2:undefined}\n\
+";
+exports.scope = "haskell";
+
+});
diff --git a/lib/client/edit/snippets/html.js b/lib/client/edit/snippets/html.js
new file mode 100644
index 00000000..66857671
--- /dev/null
+++ b/lib/client/edit/snippets/html.js
@@ -0,0 +1,835 @@
+ace.define('ace/snippets/html', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# Some useful Unicode entities\n\
+# Non-Breaking Space\n\
+snippet nbs\n\
+ \n\
+# ←\n\
+snippet left\n\
+ ←\n\
+# →\n\
+snippet right\n\
+ →\n\
+# ↑\n\
+snippet up\n\
+ ↑\n\
+# ↓\n\
+snippet down\n\
+ ↓\n\
+# ↩\n\
+snippet return\n\
+ ↩\n\
+# ⇤\n\
+snippet backtab\n\
+ ⇤\n\
+# ⇥\n\
+snippet tab\n\
+ ⇥\n\
+# ⇧\n\
+snippet shift\n\
+ ⇧\n\
+# ⌃\n\
+snippet ctrl\n\
+ ⌃\n\
+# ⌅\n\
+snippet enter\n\
+ ⌅\n\
+# ⌘\n\
+snippet cmd\n\
+ ⌘\n\
+# ⌥\n\
+snippet option\n\
+ ⌥\n\
+# ⌦\n\
+snippet delete\n\
+ ⌦\n\
+# ⌫\n\
+snippet backspace\n\
+ ⌫\n\
+# ⎋\n\
+snippet esc\n\
+ ⎋\n\
+# Generic Doctype\n\
+snippet doctype HTML 4.01 Strict\n\
+ \n\
+snippet doctype HTML 4.01 Transitional\n\
+ \n\
+snippet doctype HTML 5\n\
+ \n\
+snippet doctype XHTML 1.0 Frameset\n\
+ \n\
+snippet doctype XHTML 1.0 Strict\n\
+ \n\
+snippet doctype XHTML 1.0 Transitional\n\
+ \n\
+snippet doctype XHTML 1.1\n\
+ \n\
+# HTML Doctype 4.01 Strict\n\
+snippet docts\n\
+ \n\
+# HTML Doctype 4.01 Transitional\n\
+snippet doct\n\
+ \n\
+# HTML Doctype 5\n\
+snippet doct5\n\
+ \n\
+# XHTML Doctype 1.0 Frameset\n\
+snippet docxf\n\
+ \n\
+# XHTML Doctype 1.0 Strict\n\
+snippet docxs\n\
+ \n\
+# XHTML Doctype 1.0 Transitional\n\
+snippet docxt\n\
+ \n\
+# XHTML Doctype 1.1\n\
+snippet docx\n\
+ \n\
+# Attributes\n\
+snippet attr\n\
+ ${1:attribute}=\"${2:property}\"\n\
+snippet attr+\n\
+ ${1:attribute}=\"${2:property}\" attr+${3}\n\
+snippet .\n\
+ class=\"${1}\"${2}\n\
+snippet #\n\
+ id=\"${1}\"${2}\n\
+snippet alt\n\
+ alt=\"${1}\"${2}\n\
+snippet charset\n\
+ charset=\"${1:utf-8}\"${2}\n\
+snippet data\n\
+ data-${1}=\"${2:$1}\"${3}\n\
+snippet for\n\
+ for=\"${1}\"${2}\n\
+snippet height\n\
+ height=\"${1}\"${2}\n\
+snippet href\n\
+ href=\"${1:#}\"${2}\n\
+snippet lang\n\
+ lang=\"${1:en}\"${2}\n\
+snippet media\n\
+ media=\"${1}\"${2}\n\
+snippet name\n\
+ name=\"${1}\"${2}\n\
+snippet rel\n\
+ rel=\"${1}\"${2}\n\
+snippet scope\n\
+ scope=\"${1:row}\"${2}\n\
+snippet src\n\
+ src=\"${1}\"${2}\n\
+snippet title=\n\
+ title=\"${1}\"${2}\n\
+snippet type\n\
+ type=\"${1}\"${2}\n\
+snippet value\n\
+ value=\"${1}\"${2}\n\
+snippet width\n\
+ width=\"${1}\"${2}\n\
+# Elements\n\
+snippet a\n\
+ ${2:$1}\n\
+snippet a.\n\
+ ${3:$1}\n\
+snippet a#\n\
+ ${3:$1}\n\
+snippet a:ext\n\
+ ${2:$1}\n\
+snippet a:mail\n\
+ ${3:email me}\n\
+snippet abbr\n\
+ ${2}\n\
+snippet address\n\
+
\n\
+ ${1}\n\
+ \n\
+snippet area\n\
+ \n\
+snippet area+\n\
+ \n\
+ area+${5}\n\
+snippet area:c\n\
+ \n\
+snippet area:d\n\
+ \n\
+snippet area:p\n\
+ \n\
+snippet area:r\n\
+ \n\
+snippet article\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet article.\n\
+ \n\
+ ${2}\n\
+ \n\
+snippet article#\n\
+ \n\
+ ${2}\n\
+ \n\
+snippet aside\n\
+ \n\
+snippet aside.\n\
+ \n\
+snippet aside#\n\
+ \n\
+snippet audio\n\
+ \n\
+snippet b\n\
+ ${1}\n\
+snippet base\n\
+ \n\
+snippet bdi\n\
+ ${1}\n\
+snippet bdo\n\
+ ${2}\n\
+snippet bdo:l\n\
+ ${1}\n\
+snippet bdo:r\n\
+ ${1}\n\
+snippet blockquote\n\
+ \n\
+ ${1}\n\
+
\n\
+snippet body\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet br\n\
+
${1}\n\
+snippet button\n\
+ \n\
+snippet button.\n\
+ \n\
+snippet button#\n\
+ \n\
+snippet button:s\n\
+ \n\
+snippet button:r\n\
+ \n\
+snippet canvas\n\
+ \n\
+snippet caption\n\
+ ${1}\n\
+snippet cite\n\
+ ${1}\n\
+snippet code\n\
+ ${1}\n\
+snippet col\n\
+ ${1}\n\
+snippet col+\n\
+ \n\
+ col+${1}\n\
+snippet colgroup\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet colgroup+\n\
+ \n\
+ \n\
+ col+${1}\n\
+ \n\
+snippet command\n\
+ \n\
+snippet command:c\n\
+ \n\
+snippet command:r\n\
+ \n\
+snippet datagrid\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet datalist\n\
+ \n\
+snippet datatemplate\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet dd\n\
+ ${1}\n\
+snippet dd.\n\
+ ${2}\n\
+snippet dd#\n\
+ ${2}\n\
+snippet del\n\
+ ${1}\n\
+snippet details\n\
+ ${1} \n\
+snippet dfn\n\
+ ${1}\n\
+snippet dialog\n\
+ \n\
+snippet div\n\
+ \n\
+ ${1}\n\
+
\n\
+snippet div.\n\
+ \n\
+ ${2}\n\
+
\n\
+snippet div#\n\
+ \n\
+ ${2}\n\
+
\n\
+snippet dl\n\
+ \n\
+ ${1}\n\
+
\n\
+snippet dl.\n\
+ \n\
+ ${2}\n\
+
\n\
+snippet dl#\n\
+ \n\
+ ${2}\n\
+
\n\
+snippet dl+\n\
+ \n\
+ - ${1}
\n\
+ - ${2}
\n\
+ dt+${3}\n\
+
\n\
+snippet dt\n\
+ ${1}\n\
+snippet dt.\n\
+ ${2}\n\
+snippet dt#\n\
+ ${2}\n\
+snippet dt+\n\
+ ${1}\n\
+ ${2}\n\
+ dt+${3}\n\
+snippet em\n\
+ ${1}\n\
+snippet embed\n\
+ \n\
+snippet fieldset\n\
+ \n\
+snippet fieldset.\n\
+ \n\
+snippet fieldset#\n\
+ \n\
+snippet fieldset+\n\
+ \n\
+ fieldset+${3}\n\
+snippet figcaption\n\
+ ${1}\n\
+snippet figure\n\
+ ${1}\n\
+snippet footer\n\
+ \n\
+snippet footer.\n\
+ \n\
+snippet footer#\n\
+ \n\
+snippet form\n\
+ \n\
+snippet form.\n\
+ \n\
+snippet form#\n\
+ \n\
+snippet h1\n\
+ ${1}
\n\
+snippet h1.\n\
+ ${2}
\n\
+snippet h1#\n\
+ ${2}
\n\
+snippet h2\n\
+ ${1}
\n\
+snippet h2.\n\
+ ${2}
\n\
+snippet h2#\n\
+ ${2}
\n\
+snippet h3\n\
+ ${1}
\n\
+snippet h3.\n\
+ ${2}
\n\
+snippet h3#\n\
+ ${2}
\n\
+snippet h4\n\
+ ${1}
\n\
+snippet h4.\n\
+ ${2}
\n\
+snippet h4#\n\
+ ${2}
\n\
+snippet h5\n\
+ ${1}
\n\
+snippet h5.\n\
+ ${2}
\n\
+snippet h5#\n\
+ ${2}
\n\
+snippet h6\n\
+ ${1}
\n\
+snippet h6.\n\
+ ${2}
\n\
+snippet h6#\n\
+ ${2}
\n\
+snippet head\n\
+ \n\
+ \n\
+\n\
+ ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\
+ ${2}\n\
+ \n\
+snippet header\n\
+ \n\
+snippet header.\n\
+ \n\
+snippet header#\n\
+ \n\
+snippet hgroup\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet hgroup.\n\
+ \n\
+ ${2}\n\
+ \n\
+snippet hr\n\
+
${1}\n\
+snippet html\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet xhtml\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet html5\n\
+ \n\
+ \n\
+ \n\
+ \n\
+ ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\
+ ${2:meta}\n\
+ \n\
+ \n\
+ ${3:body}\n\
+ \n\
+ \n\
+snippet i\n\
+ ${1}\n\
+snippet iframe\n\
+ ${2}\n\
+snippet iframe.\n\
+ ${3}\n\
+snippet iframe#\n\
+ ${3}\n\
+snippet img\n\
+
${3}\n\
+snippet img.\n\
+
${4}\n\
+snippet img#\n\
+
${4}\n\
+snippet input\n\
+ ${5}\n\
+snippet input.\n\
+ ${6}\n\
+snippet input:text\n\
+ ${4}\n\
+snippet input:submit\n\
+ ${4}\n\
+snippet input:hidden\n\
+ ${4}\n\
+snippet input:button\n\
+ ${4}\n\
+snippet input:image\n\
+ ${5}\n\
+snippet input:checkbox\n\
+ ${3}\n\
+snippet input:radio\n\
+ ${3}\n\
+snippet input:color\n\
+ ${4}\n\
+snippet input:date\n\
+ ${4}\n\
+snippet input:datetime\n\
+ ${4}\n\
+snippet input:datetime-local\n\
+ ${4}\n\
+snippet input:email\n\
+ ${4}\n\
+snippet input:file\n\
+ ${4}\n\
+snippet input:month\n\
+ ${4}\n\
+snippet input:number\n\
+ ${4}\n\
+snippet input:password\n\
+ ${4}\n\
+snippet input:range\n\
+ ${4}\n\
+snippet input:reset\n\
+ ${4}\n\
+snippet input:search\n\
+ ${4}\n\
+snippet input:time\n\
+ ${4}\n\
+snippet input:url\n\
+ ${4}\n\
+snippet input:week\n\
+ ${4}\n\
+snippet ins\n\
+ ${1}\n\
+snippet kbd\n\
+ ${1}\n\
+snippet keygen\n\
+ ${1}\n\
+snippet label\n\
+ \n\
+snippet label:i\n\
+ \n\
+ ${7}\n\
+snippet label:s\n\
+ \n\
+ \n\
+snippet legend\n\
+ \n\
+snippet legend+\n\
+ \n\
+snippet li\n\
+ ${1}\n\
+snippet li.\n\
+ ${2}\n\
+snippet li+\n\
+ ${1}\n\
+ li+${2}\n\
+snippet lia\n\
+ ${1}\n\
+snippet lia+\n\
+ ${1}\n\
+ lia+${3}\n\
+snippet link\n\
+ ${5}\n\
+snippet link:atom\n\
+ ${2}\n\
+snippet link:css\n\
+ ${4}\n\
+snippet link:favicon\n\
+ ${2}\n\
+snippet link:rss\n\
+ ${2}\n\
+snippet link:touch\n\
+ ${2}\n\
+snippet map\n\
+ \n\
+snippet map.\n\
+ \n\
+snippet map#\n\
+ \n\
+snippet map+\n\
+ ${7}\n\
+snippet mark\n\
+ ${1}\n\
+snippet menu\n\
+ \n\
+snippet menu:c\n\
+ \n\
+snippet menu:t\n\
+ \n\
+snippet meta\n\
+ ${3}\n\
+snippet meta:compat\n\
+ ${3}\n\
+snippet meta:refresh\n\
+ ${3}\n\
+snippet meta:utf\n\
+ ${3}\n\
+snippet meter\n\
+ ${1}\n\
+snippet nav\n\
+ \n\
+snippet nav.\n\
+ \n\
+snippet nav#\n\
+ \n\
+snippet noscript\n\
+ \n\
+snippet object\n\
+ ${4}\n\
+# Embed QT Movie\n\
+snippet movie\n\
+ ${6}\n\
+snippet ol\n\
+ \n\
+ ${1}\n\
+
\n\
+snippet ol.\n\
+ \n\
+ ${2}\n\
+
\n\
+snippet ol#\n\
+ \n\
+ ${2}\n\
+
\n\
+snippet ol+\n\
+ \n\
+ - ${1}
\n\
+ li+${2}\n\
+
\n\
+snippet opt\n\
+ \n\
+snippet opt+\n\
+ \n\
+ opt+${3}\n\
+snippet optt\n\
+ \n\
+snippet optgroup\n\
+ \n\
+snippet output\n\
+ \n\
+snippet p\n\
+ ${1}
\n\
+snippet param\n\
+ ${3}\n\
+snippet pre\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet progress\n\
+ \n\
+snippet q\n\
+ ${1}
\n\
+snippet rp\n\
+ \n\
+snippet rt\n\
+ \n\
+snippet ruby\n\
+ \n\
+ \n\
+ \n\
+snippet s\n\
+ ${1}\n\
+snippet samp\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet script\n\
+ \n\
+snippet scriptsrc\n\
+ \n\
+snippet section\n\
+ \n\
+snippet section.\n\
+ \n\
+snippet section#\n\
+ \n\
+snippet select\n\
+ \n\
+snippet select.\n\
+ \n\
+snippet select+\n\
+ \n\
+snippet small\n\
+ ${1}\n\
+snippet source\n\
+ \n\
+snippet span\n\
+ ${1}\n\
+snippet strong\n\
+ ${1}\n\
+snippet style\n\
+ \n\
+snippet sub\n\
+ ${1}\n\
+snippet summary\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet sup\n\
+ ${1}\n\
+snippet table\n\
+ \n\
+snippet table.\n\
+ \n\
+snippet table#\n\
+ \n\
+snippet tbody\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet td\n\
+ ${1} | \n\
+snippet td.\n\
+ ${2} | \n\
+snippet td#\n\
+ ${2} | \n\
+snippet td+\n\
+ ${1} | \n\
+ td+${2}\n\
+snippet textarea\n\
+ ${6}\n\
+snippet tfoot\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet th\n\
+ ${1} | \n\
+snippet th.\n\
+ ${2} | \n\
+snippet th#\n\
+ ${2} | \n\
+snippet th+\n\
+ ${1} | \n\
+ th+${2}\n\
+snippet thead\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet time\n\
+ \n\
+snippet title\n\
+ ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\
+snippet tr\n\
+ \n\
+ ${1}\n\
+
\n\
+snippet tr+\n\
+ \n\
+ | ${1} | \n\
+ td+${2}\n\
+
\n\
+snippet track\n\
+ ${6}\n\
+snippet ul\n\
+ \n\
+snippet ul.\n\
+ \n\
+snippet ul#\n\
+ \n\
+snippet ul+\n\
+ \n\
+ - ${1}
\n\
+ li+${2}\n\
+
\n\
+snippet var\n\
+ ${1}\n\
+snippet video\n\
+ ${8}\n\
+snippet wbr\n\
+ ${1}\n\
+";
+exports.scope = "html";
+
+});
diff --git a/lib/client/edit/snippets/html_completions.js b/lib/client/edit/snippets/html_completions.js
new file mode 100644
index 00000000..25c308a4
--- /dev/null
+++ b/lib/client/edit/snippets/html_completions.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/html_completions', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "html_completions";
+
+});
diff --git a/lib/client/edit/snippets/html_ruby.js b/lib/client/edit/snippets/html_ruby.js
new file mode 100644
index 00000000..8e0e7539
--- /dev/null
+++ b/lib/client/edit/snippets/html_ruby.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/html_ruby', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "html_ruby";
+
+});
diff --git a/lib/client/edit/snippets/ini.js b/lib/client/edit/snippets/ini.js
new file mode 100644
index 00000000..dea4a945
--- /dev/null
+++ b/lib/client/edit/snippets/ini.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/ini', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "ini";
+
+});
diff --git a/lib/client/edit/snippets/jade.js b/lib/client/edit/snippets/jade.js
new file mode 100644
index 00000000..964ddf4f
--- /dev/null
+++ b/lib/client/edit/snippets/jade.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/jade', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "jade";
+
+});
diff --git a/lib/client/edit/snippets/java.js b/lib/client/edit/snippets/java.js
new file mode 100644
index 00000000..c3972050
--- /dev/null
+++ b/lib/client/edit/snippets/java.js
@@ -0,0 +1,247 @@
+ace.define('ace/snippets/java', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "## Access Modifiers\n\
+snippet po\n\
+ protected\n\
+snippet pu\n\
+ public\n\
+snippet pr\n\
+ private\n\
+##\n\
+## Annotations\n\
+snippet before\n\
+ @Before\n\
+ static void ${1:intercept}(${2:args}) { ${3} }\n\
+snippet mm\n\
+ @ManyToMany\n\
+ ${1}\n\
+snippet mo\n\
+ @ManyToOne\n\
+ ${1}\n\
+snippet om\n\
+ @OneToMany${1:(cascade=CascadeType.ALL)}\n\
+ ${2}\n\
+snippet oo\n\
+ @OneToOne\n\
+ ${1}\n\
+##\n\
+## Basic Java packages and import\n\
+snippet im\n\
+ import\n\
+snippet j.b\n\
+ java.beans.\n\
+snippet j.i\n\
+ java.io.\n\
+snippet j.m\n\
+ java.math.\n\
+snippet j.n\n\
+ java.net.\n\
+snippet j.u\n\
+ java.util.\n\
+##\n\
+## Class\n\
+snippet cl\n\
+ class ${1:`Filename(\"\", \"untitled\")`} ${2}\n\
+snippet in\n\
+ interface ${1:`Filename(\"\", \"untitled\")`} ${2:extends Parent}${3}\n\
+snippet tc\n\
+ public class ${1:`Filename()`} extends ${2:TestCase}\n\
+##\n\
+## Class Enhancements\n\
+snippet ext\n\
+ extends \n\
+snippet imp\n\
+ implements\n\
+##\n\
+## Comments\n\
+snippet /*\n\
+ /*\n\
+ * ${1}\n\
+ */\n\
+##\n\
+## Constants\n\
+snippet co\n\
+ static public final ${1:String} ${2:var} = ${3};${4}\n\
+snippet cos\n\
+ static public final String ${1:var} = \"${2}\";${3}\n\
+##\n\
+## Control Statements\n\
+snippet case\n\
+ case ${1}:\n\
+ ${2}\n\
+snippet def\n\
+ default:\n\
+ ${2}\n\
+snippet el\n\
+ else\n\
+snippet elif\n\
+ else if (${1}) ${2}\n\
+snippet if\n\
+ if (${1}) ${2}\n\
+snippet sw\n\
+ switch (${1}) {\n\
+ ${2}\n\
+ }\n\
+##\n\
+## Create a Method\n\
+snippet m\n\
+ ${1:void} ${2:method}(${3}) ${4:throws }${5}\n\
+##\n\
+## Create a Variable\n\
+snippet v\n\
+ ${1:String} ${2:var}${3: = null}${4};${5}\n\
+##\n\
+## Enhancements to Methods, variables, classes, etc.\n\
+snippet ab\n\
+ abstract\n\
+snippet fi\n\
+ final\n\
+snippet st\n\
+ static\n\
+snippet sy\n\
+ synchronized\n\
+##\n\
+## Error Methods\n\
+snippet err\n\
+ System.err.print(\"${1:Message}\");\n\
+snippet errf\n\
+ System.err.printf(\"${1:Message}\", ${2:exception});\n\
+snippet errln\n\
+ System.err.println(\"${1:Message}\");\n\
+##\n\
+## Exception Handling\n\
+snippet as\n\
+ assert ${1:test} : \"${2:Failure message}\";${3}\n\
+snippet ca\n\
+ catch(${1:Exception} ${2:e}) ${3}\n\
+snippet thr\n\
+ throw\n\
+snippet ths\n\
+ throws\n\
+snippet try\n\
+ try {\n\
+ ${3}\n\
+ } catch(${1:Exception} ${2:e}) {\n\
+ }\n\
+snippet tryf\n\
+ try {\n\
+ ${3}\n\
+ } catch(${1:Exception} ${2:e}) {\n\
+ } finally {\n\
+ }\n\
+##\n\
+## Find Methods\n\
+snippet findall\n\
+ List<${1:listName}> ${2:items} = ${1}.findAll();${3}\n\
+snippet findbyid\n\
+ ${1:var} ${2:item} = ${1}.findById(${3});${4}\n\
+##\n\
+## Javadocs\n\
+snippet /**\n\
+ /**\n\
+ * ${1}\n\
+ */\n\
+snippet @au\n\
+ @author `system(\"grep \\`id -un\\` /etc/passwd | cut -d \\\":\\\" -f5 | cut -d \\\",\\\" -f1\")`\n\
+snippet @br\n\
+ @brief ${1:Description}\n\
+snippet @fi\n\
+ @file ${1:`Filename()`}.java\n\
+snippet @pa\n\
+ @param ${1:param}\n\
+snippet @re\n\
+ @return ${1:param}\n\
+##\n\
+## Logger Methods\n\
+snippet debug\n\
+ Logger.debug(${1:param});${2}\n\
+snippet error\n\
+ Logger.error(${1:param});${2}\n\
+snippet info\n\
+ Logger.info(${1:param});${2}\n\
+snippet warn\n\
+ Logger.warn(${1:param});${2}\n\
+##\n\
+## Loops\n\
+snippet enfor\n\
+ for (${1} : ${2}) ${3}\n\
+snippet for\n\
+ for (${1}; ${2}; ${3}) ${4}\n\
+snippet wh\n\
+ while (${1}) ${2}\n\
+##\n\
+## Main method\n\
+snippet main\n\
+ public static void main (String[] args) {\n\
+ ${1:/* code */}\n\
+ }\n\
+##\n\
+## Print Methods\n\
+snippet print\n\
+ System.out.print(\"${1:Message}\");\n\
+snippet printf\n\
+ System.out.printf(\"${1:Message}\", ${2:args});\n\
+snippet println\n\
+ System.out.println(${1});\n\
+##\n\
+## Render Methods\n\
+snippet ren\n\
+ render(${1:param});${2}\n\
+snippet rena\n\
+ renderArgs.put(\"${1}\", ${2});${3}\n\
+snippet renb\n\
+ renderBinary(${1:param});${2}\n\
+snippet renj\n\
+ renderJSON(${1:param});${2}\n\
+snippet renx\n\
+ renderXml(${1:param});${2}\n\
+##\n\
+## Setter and Getter Methods\n\
+snippet set\n\
+ ${1:public} void set${3:}(${2:String} ${4:}){\n\
+ this.$4 = $4;\n\
+ }\n\
+snippet get\n\
+ ${1:public} ${2:String} get${3:}(){\n\
+ return this.${4:};\n\
+ }\n\
+##\n\
+## Terminate Methods or Loops\n\
+snippet re\n\
+ return\n\
+snippet br\n\
+ break;\n\
+##\n\
+## Test Methods\n\
+snippet t\n\
+ public void test${1:Name}() throws Exception {\n\
+ ${2}\n\
+ }\n\
+snippet test\n\
+ @Test\n\
+ public void test${1:Name}() throws Exception {\n\
+ ${2}\n\
+ }\n\
+##\n\
+## Utils\n\
+snippet Sc\n\
+ Scanner\n\
+##\n\
+## Miscellaneous\n\
+snippet action\n\
+ public static void ${1:index}(${2:args}) { ${3} }\n\
+snippet rnf\n\
+ notFound(${1:param});${2}\n\
+snippet rnfin\n\
+ notFoundIfNull(${1:param});${2}\n\
+snippet rr\n\
+ redirect(${1:param});${2}\n\
+snippet ru\n\
+ unauthorized(${1:param});${2}\n\
+snippet unless\n\
+ (unless=${1:param});${2}\n\
+";
+exports.scope = "java";
+
+});
diff --git a/lib/client/edit/snippets/javascript.js b/lib/client/edit/snippets/javascript.js
index c8845fbe..a1b33e1a 100644
--- a/lib/client/edit/snippets/javascript.js
+++ b/lib/client/edit/snippets/javascript.js
@@ -13,7 +13,7 @@ snippet fun\n\
}\n\
# Anonymous Function\n\
regex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\n\
-name f\n\
+snippet f\n\
function${M1?: ${1:functionName}}($2) {\n\
${0:$TM_SELECTED_TEXT}\n\
}${M2?;}${M3?,}${M4?)}\n\
@@ -152,7 +152,7 @@ snippet sing\n\
return instance;\n\
}\n\
# class\n\
-name class\n\
+snippet class\n\
regex /^\\s*/clas{0,2}/\n\
var ${1:class} = function(${20}) {\n\
$40$0\n\
diff --git a/lib/client/edit/snippets/json.js b/lib/client/edit/snippets/json.js
new file mode 100644
index 00000000..838cfe3e
--- /dev/null
+++ b/lib/client/edit/snippets/json.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/json', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "json";
+
+});
diff --git a/lib/client/edit/snippets/jsoniq.js b/lib/client/edit/snippets/jsoniq.js
new file mode 100644
index 00000000..533a361f
--- /dev/null
+++ b/lib/client/edit/snippets/jsoniq.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/jsoniq', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "jsoniq";
+
+});
diff --git a/lib/client/edit/snippets/jsp.js b/lib/client/edit/snippets/jsp.js
new file mode 100644
index 00000000..a3989e44
--- /dev/null
+++ b/lib/client/edit/snippets/jsp.js
@@ -0,0 +1,106 @@
+ace.define('ace/snippets/jsp', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet @page\n\
+ <%@page contentType=\"text/html\" pageEncoding=\"UTF-8\"%>\n\
+snippet jstl\n\
+ <%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\n\
+ <%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\n\
+snippet jstl:c\n\
+ <%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\n\
+snippet jstl:fn\n\
+ <%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\n\
+snippet cpath\n\
+ ${pageContext.request.contextPath}\n\
+snippet cout\n\
+ \n\
+snippet cset\n\
+ \n\
+snippet cremove\n\
+ \n\
+snippet ccatch\n\
+ \n\
+snippet cif\n\
+ \n\
+ ${2}\n\
+ \n\
+snippet cchoose\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet cwhen\n\
+ \n\
+ ${2}\n\
+ \n\
+snippet cother\n\
+ \n\
+ ${1}\n\
+ \n\
+snippet cfore\n\
+ \n\
+ ${4:}\n\
+ \n\
+snippet cfort\n\
+ ${2:item1,item2,item3}\n\
+ \n\
+ ${5:}\n\
+ \n\
+snippet cparam\n\
+ \n\
+snippet cparam+\n\
+ \n\
+ cparam+${3}\n\
+snippet cimport\n\
+ \n\
+snippet cimport+\n\
+ \n\
+ \n\
+ cparam+${4}\n\
+ \n\
+snippet curl\n\
+ \n\
+ ${3}\n\
+snippet curl+\n\
+ \n\
+ \n\
+ cparam+${6}\n\
+ \n\
+ ${3}\n\
+snippet credirect\n\
+ \n\
+snippet contains\n\
+ ${fn:contains(${1:string}, ${2:substr})}\n\
+snippet contains:i\n\
+ ${fn:containsIgnoreCase(${1:string}, ${2:substr})}\n\
+snippet endswith\n\
+ ${fn:endsWith(${1:string}, ${2:suffix})}\n\
+snippet escape\n\
+ ${fn:escapeXml(${1:string})}\n\
+snippet indexof\n\
+ ${fn:indexOf(${1:string}, ${2:substr})}\n\
+snippet join\n\
+ ${fn:join(${1:collection}, ${2:delims})}\n\
+snippet length\n\
+ ${fn:length(${1:collection_or_string})}\n\
+snippet replace\n\
+ ${fn:replace(${1:string}, ${2:substr}, ${3:replace})}\n\
+snippet split\n\
+ ${fn:split(${1:string}, ${2:delims})}\n\
+snippet startswith\n\
+ ${fn:startsWith(${1:string}, ${2:prefix})}\n\
+snippet substr\n\
+ ${fn:substring(${1:string}, ${2:begin}, ${3:end})}\n\
+snippet substr:a\n\
+ ${fn:substringAfter(${1:string}, ${2:substr})}\n\
+snippet substr:b\n\
+ ${fn:substringBefore(${1:string}, ${2:substr})}\n\
+snippet lc\n\
+ ${fn:toLowerCase(${1:string})}\n\
+snippet uc\n\
+ ${fn:toUpperCase(${1:string})}\n\
+snippet trim\n\
+ ${fn:trim(${1:string})}\n\
+";
+exports.scope = "jsp";
+
+});
diff --git a/lib/client/edit/snippets/less.js b/lib/client/edit/snippets/less.js
new file mode 100644
index 00000000..d781e4f2
--- /dev/null
+++ b/lib/client/edit/snippets/less.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/less', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "less";
+
+});
diff --git a/lib/client/edit/snippets/livescript.js b/lib/client/edit/snippets/livescript.js
new file mode 100644
index 00000000..3aee2ef0
--- /dev/null
+++ b/lib/client/edit/snippets/livescript.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/livescript', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "livescript";
+
+});
diff --git a/lib/client/edit/snippets/makefile.js b/lib/client/edit/snippets/makefile.js
new file mode 100644
index 00000000..3e6215bd
--- /dev/null
+++ b/lib/client/edit/snippets/makefile.js
@@ -0,0 +1,11 @@
+ace.define('ace/snippets/makefile', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet ifeq\n\
+ ifeq (${1:cond0},${2:cond1})\n\
+ ${3:code}\n\
+ endif\n\
+";
+exports.scope = "makefile";
+
+});
diff --git a/lib/client/edit/snippets/markdown.js b/lib/client/edit/snippets/markdown.js
new file mode 100644
index 00000000..628cb656
--- /dev/null
+++ b/lib/client/edit/snippets/markdown.js
@@ -0,0 +1,95 @@
+ace.define('ace/snippets/markdown', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# Markdown\n\
+\n\
+# Includes octopress (http://octopress.org/) snippets\n\
+\n\
+snippet [\n\
+ [${1:text}](http://${2:address} \"${3:title}\")\n\
+snippet [*\n\
+ [${1:link}](${2:`@*`} \"${3:title}\")${4}\n\
+\n\
+snippet [:\n\
+ [${1:id}]: http://${2:url} \"${3:title}\"\n\
+snippet [:*\n\
+ [${1:id}]: ${2:`@*`} \"${3:title}\"\n\
+\n\
+snippet \n\
+snippet ${4}\n\
+\n\
+snippet ![:\n\
+ ![${1:id}]: ${2:url} \"${3:title}\"\n\
+snippet ![:*\n\
+ ![${1:id}]: ${2:`@*`} \"${3:title}\"\n\
+\n\
+snippet ===\n\
+regex /^/=+/=*//\n\
+ ${PREV_LINE/./=/g}\n\
+ \n\
+ ${0}\n\
+snippet ---\n\
+regex /^/-+/-*//\n\
+ ${PREV_LINE/./-/g}\n\
+ \n\
+ ${0}\n\
+snippet blockquote\n\
+ {% blockquote %}\n\
+ ${1:quote}\n\
+ {% endblockquote %}\n\
+\n\
+snippet blockquote-author\n\
+ {% blockquote ${1:author}, ${2:title} %}\n\
+ ${3:quote}\n\
+ {% endblockquote %}\n\
+\n\
+snippet blockquote-link\n\
+ {% blockquote ${1:author} ${2:URL} ${3:link_text} %}\n\
+ ${4:quote}\n\
+ {% endblockquote %}\n\
+\n\
+snippet bt-codeblock-short\n\
+ ```\n\
+ ${1:code_snippet}\n\
+ ```\n\
+\n\
+snippet bt-codeblock-full\n\
+ ``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\n\
+ ${5:code_snippet}\n\
+ ```\n\
+\n\
+snippet codeblock-short\n\
+ {% codeblock %}\n\
+ ${1:code_snippet}\n\
+ {% endcodeblock %}\n\
+\n\
+snippet codeblock-full\n\
+ {% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\n\
+ ${5:code_snippet}\n\
+ {% endcodeblock %}\n\
+\n\
+snippet gist-full\n\
+ {% gist ${1:gist_id} ${2:filename} %}\n\
+\n\
+snippet gist-short\n\
+ {% gist ${1:gist_id} %}\n\
+\n\
+snippet img\n\
+ {% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\n\
+\n\
+snippet youtube\n\
+ {% youtube ${1:video_id} %}\n\
+\n\
+# The quote should appear only once in the text. It is inherently part of it.\n\
+# See http://octopress.org/docs/plugins/pullquote/ for more info.\n\
+\n\
+snippet pullquote\n\
+ {% pullquote %}\n\
+ ${1:text} {\" ${2:quote} \"} ${3:text}\n\
+ {% endpullquote %}\n\
+";
+exports.scope = "markdown";
+
+});
diff --git a/lib/client/edit/snippets/matlab.js b/lib/client/edit/snippets/matlab.js
new file mode 100644
index 00000000..8e4a4037
--- /dev/null
+++ b/lib/client/edit/snippets/matlab.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/matlab', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "matlab";
+
+});
diff --git a/lib/client/edit/snippets/mysql.js b/lib/client/edit/snippets/mysql.js
new file mode 100644
index 00000000..3a49569e
--- /dev/null
+++ b/lib/client/edit/snippets/mysql.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/mysql', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "mysql";
+
+});
diff --git a/lib/client/edit/snippets/nix.js b/lib/client/edit/snippets/nix.js
new file mode 100644
index 00000000..fc4a18f3
--- /dev/null
+++ b/lib/client/edit/snippets/nix.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/nix', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "nix";
+
+});
diff --git a/lib/client/edit/snippets/objectivec.js b/lib/client/edit/snippets/objectivec.js
new file mode 100644
index 00000000..a74db180
--- /dev/null
+++ b/lib/client/edit/snippets/objectivec.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/objectivec', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "objectivec";
+
+});
diff --git a/lib/client/edit/snippets/pascal.js b/lib/client/edit/snippets/pascal.js
new file mode 100644
index 00000000..5b4721c7
--- /dev/null
+++ b/lib/client/edit/snippets/pascal.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/pascal', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "pascal";
+
+});
diff --git a/lib/client/edit/snippets/perl.js b/lib/client/edit/snippets/perl.js
new file mode 100644
index 00000000..16f2d3f7
--- /dev/null
+++ b/lib/client/edit/snippets/perl.js
@@ -0,0 +1,354 @@
+ace.define('ace/snippets/perl', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# #!/usr/bin/perl\n\
+snippet #!\n\
+ #!/usr/bin/env perl\n\
+\n\
+# Hash Pointer\n\
+snippet .\n\
+ =>\n\
+# Function\n\
+snippet sub\n\
+ sub ${1:function_name} {\n\
+ ${2:#body ...}\n\
+ }\n\
+# Conditional\n\
+snippet if\n\
+ if (${1}) {\n\
+ ${2:# body...}\n\
+ }\n\
+# Conditional if..else\n\
+snippet ife\n\
+ if (${1}) {\n\
+ ${2:# body...}\n\
+ }\n\
+ else {\n\
+ ${3:# else...}\n\
+ }\n\
+# Conditional if..elsif..else\n\
+snippet ifee\n\
+ if (${1}) {\n\
+ ${2:# body...}\n\
+ }\n\
+ elsif (${3}) {\n\
+ ${4:# elsif...}\n\
+ }\n\
+ else {\n\
+ ${5:# else...}\n\
+ }\n\
+# Conditional One-line\n\
+snippet xif\n\
+ ${1:expression} if ${2:condition};${3}\n\
+# Unless conditional\n\
+snippet unless\n\
+ unless (${1}) {\n\
+ ${2:# body...}\n\
+ }\n\
+# Unless conditional One-line\n\
+snippet xunless\n\
+ ${1:expression} unless ${2:condition};${3}\n\
+# Try/Except\n\
+snippet eval\n\
+ local $@;\n\
+ eval {\n\
+ ${1:# do something risky...}\n\
+ };\n\
+ if (my $e = $@) {\n\
+ ${2:# handle failure...}\n\
+ }\n\
+# While Loop\n\
+snippet wh\n\
+ while (${1}) {\n\
+ ${2:# body...}\n\
+ }\n\
+# While Loop One-line\n\
+snippet xwh\n\
+ ${1:expression} while ${2:condition};${3}\n\
+# C-style For Loop\n\
+snippet cfor\n\
+ for (my $${2:var} = 0; $$2 < ${1:count}; $$2${3:++}) {\n\
+ ${4:# body...}\n\
+ }\n\
+# For loop one-line\n\
+snippet xfor\n\
+ ${1:expression} for @${2:array};${3}\n\
+# Foreach Loop\n\
+snippet for\n\
+ foreach my $${1:x} (@${2:array}) {\n\
+ ${3:# body...}\n\
+ }\n\
+# Foreach Loop One-line\n\
+snippet fore\n\
+ ${1:expression} foreach @${2:array};${3}\n\
+# Package\n\
+snippet package\n\
+ package ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`};\n\
+\n\
+ ${2}\n\
+\n\
+ 1;\n\
+\n\
+ __END__\n\
+# Package syntax perl >= 5.14\n\
+snippet packagev514\n\
+ package ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`} ${2:0.99};\n\
+\n\
+ ${3}\n\
+\n\
+ 1;\n\
+\n\
+ __END__\n\
+#moose\n\
+snippet moose\n\
+ use Moose;\n\
+ use namespace::autoclean;\n\
+ ${1:#}BEGIN {extends '${2:ParentClass}'};\n\
+\n\
+ ${3}\n\
+# parent\n\
+snippet parent\n\
+ use parent qw(${1:Parent Class});\n\
+# Read File\n\
+snippet slurp\n\
+ my $${1:var} = do { local $/; open my $file, '<', \"${2:file}\"; <$file> };\n\
+ ${3}\n\
+# strict warnings\n\
+snippet strwar\n\
+ use strict;\n\
+ use warnings;\n\
+# older versioning with perlcritic bypass\n\
+snippet vers\n\
+ ## no critic\n\
+ our $VERSION = '${1:version}';\n\
+ eval $VERSION;\n\
+ ## use critic\n\
+# new 'switch' like feature\n\
+snippet switch\n\
+ use feature 'switch';\n\
+\n\
+# Anonymous subroutine\n\
+snippet asub\n\
+ sub {\n\
+ ${1:# body }\n\
+ }\n\
+\n\
+\n\
+\n\
+# Begin block\n\
+snippet begin\n\
+ BEGIN {\n\
+ ${1:# begin body}\n\
+ }\n\
+\n\
+# call package function with some parameter\n\
+snippet pkgmv\n\
+ __PACKAGE__->${1:package_method}(${2:var})\n\
+\n\
+# call package function without a parameter\n\
+snippet pkgm\n\
+ __PACKAGE__->${1:package_method}()\n\
+\n\
+# call package \"get_\" function without a parameter\n\
+snippet pkget\n\
+ __PACKAGE__->get_${1:package_method}()\n\
+\n\
+# call package function with a parameter\n\
+snippet pkgetv\n\
+ __PACKAGE__->get_${1:package_method}(${2:var})\n\
+\n\
+# complex regex\n\
+snippet qrx\n\
+ qr/\n\
+ ${1:regex}\n\
+ /xms\n\
+\n\
+#simpler regex\n\
+snippet qr/\n\
+ qr/${1:regex}/x\n\
+\n\
+#given\n\
+snippet given\n\
+ given ($${1:var}) {\n\
+ ${2:# cases}\n\
+ ${3:# default}\n\
+ }\n\
+\n\
+# switch-like case\n\
+snippet when\n\
+ when (${1:case}) {\n\
+ ${2:# body}\n\
+ }\n\
+\n\
+# hash slice\n\
+snippet hslice\n\
+ @{ ${1:hash} }{ ${2:array} }\n\
+\n\
+\n\
+# map\n\
+snippet map\n\
+ map { ${2: body } } ${1: @array } ;\n\
+\n\
+\n\
+\n\
+# Pod stub\n\
+snippet ppod\n\
+ =head1 NAME\n\
+\n\
+ ${1:ClassName} - ${2:ShortDesc}\n\
+\n\
+ =head1 SYNOPSIS\n\
+\n\
+ use $1;\n\
+\n\
+ ${3:# synopsis...}\n\
+\n\
+ =head1 DESCRIPTION\n\
+\n\
+ ${4:# longer description...}\n\
+\n\
+\n\
+ =head1 INTERFACE\n\
+\n\
+\n\
+ =head1 DEPENDENCIES\n\
+\n\
+\n\
+ =head1 SEE ALSO\n\
+\n\
+\n\
+# Heading for a subroutine stub\n\
+snippet psub\n\
+ =head2 ${1:MethodName}\n\
+\n\
+ ${2:Summary....}\n\
+\n\
+# Heading for inline subroutine pod\n\
+snippet psubi\n\
+ =head2 ${1:MethodName}\n\
+\n\
+ ${2:Summary...}\n\
+\n\
+\n\
+ =cut\n\
+# inline documented subroutine\n\
+snippet subpod\n\
+ =head2 $1\n\
+\n\
+ Summary of $1\n\
+\n\
+ =cut\n\
+\n\
+ sub ${1:subroutine_name} {\n\
+ ${2:# body...}\n\
+ }\n\
+# Subroutine signature\n\
+snippet parg\n\
+ =over 2\n\
+\n\
+ =item\n\
+ Arguments\n\
+\n\
+\n\
+ =over 3\n\
+\n\
+ =item\n\
+ C<${1:DataStructure}>\n\
+\n\
+ ${2:Sample}\n\
+\n\
+\n\
+ =back\n\
+\n\
+\n\
+ =item\n\
+ Return\n\
+\n\
+ =over 3\n\
+\n\
+\n\
+ =item\n\
+ C<${3:...return data}>\n\
+\n\
+\n\
+ =back\n\
+\n\
+\n\
+ =back\n\
+\n\
+\n\
+\n\
+# Moose has\n\
+snippet has\n\
+ has ${1:attribute} => (\n\
+ is => '${2:ro|rw}',\n\
+ isa => '${3:Str|Int|HashRef|ArrayRef|etc}',\n\
+ default => sub {\n\
+ ${4:defaultvalue}\n\
+ },\n\
+ ${5:# other attributes}\n\
+ );\n\
+\n\
+\n\
+# override\n\
+snippet override\n\
+ override ${1:attribute} => sub {\n\
+ ${2:# my $self = shift;};\n\
+ ${3:# my ($self, $args) = @_;};\n\
+ };\n\
+\n\
+\n\
+# use test classes\n\
+snippet tuse\n\
+ use Test::More;\n\
+ use Test::Deep; # (); # uncomment to stop prototype errors\n\
+ use Test::Exception;\n\
+\n\
+# local test lib\n\
+snippet tlib\n\
+ use lib qw{ ./t/lib };\n\
+\n\
+#test methods\n\
+snippet tmeths\n\
+ $ENV{TEST_METHOD} = '${1:regex}';\n\
+\n\
+# runtestclass\n\
+snippet trunner\n\
+ use ${1:test_class};\n\
+ $1->runtests();\n\
+\n\
+# Test::Class-style test\n\
+snippet tsub\n\
+ sub t${1:number}_${2:test_case} :Test(${3:num_of_tests}) {\n\
+ my $self = shift;\n\
+ ${4:# body}\n\
+\n\
+ }\n\
+\n\
+# Test::Routine-style test\n\
+snippet trsub\n\
+ test ${1:test_name} => { description => '${2:Description of test.}'} => sub {\n\
+ my ($self) = @_;\n\
+ ${3:# test code}\n\
+ };\n\
+\n\
+#prep test method\n\
+snippet tprep\n\
+ sub prep${1:number}_${2:test_case} :Test(startup) {\n\
+ my $self = shift;\n\
+ ${4:# body}\n\
+ }\n\
+\n\
+# cause failures to print stack trace\n\
+snippet debug_trace\n\
+ use Carp; # 'verbose';\n\
+ # cloak \"die\"\n\
+ # warn \"warning\"\n\
+ $SIG{'__DIE__'} = sub {\n\
+ require Carp; Carp::confess\n\
+ };\n\
+\n\
+";
+exports.scope = "perl";
+
+});
diff --git a/lib/client/edit/snippets/php.js b/lib/client/edit/snippets/php.js
new file mode 100644
index 00000000..5a23a1a9
--- /dev/null
+++ b/lib/client/edit/snippets/php.js
@@ -0,0 +1,384 @@
+ace.define('ace/snippets/php', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet \n\
+ \n\
+# this one is for php5.4\n\
+snippet =\n\
+ =${1}?>\n\
+snippet ns\n\
+ namespace ${1:Foo\\Bar\\Baz};\n\
+ ${2}\n\
+snippet use\n\
+ use ${1:Foo\\Bar\\Baz};\n\
+ ${2}\n\
+snippet c\n\
+ ${1:abstract }class ${2:$FILENAME}\n\
+ {\n\
+ ${3}\n\
+ }\n\
+snippet i\n\
+ interface ${1:$FILENAME}\n\
+ {\n\
+ ${2}\n\
+ }\n\
+snippet t.\n\
+ $this->${1}\n\
+snippet f\n\
+ function ${1:foo}(${2:array }${3:$bar})\n\
+ {\n\
+ ${4}\n\
+ }\n\
+# method\n\
+snippet m\n\
+ ${1:abstract }${2:protected}${3: static} function ${4:foo}(${5:array }${6:$bar})\n\
+ {\n\
+ ${7}\n\
+ }\n\
+# setter method\n\
+snippet sm \n\
+ /**\n\
+ * Sets the value of ${1:foo}\n\
+ *\n\
+ * @param ${2:$1} $$1 ${3:description}\n\
+ *\n\
+ * @return ${4:$FILENAME}\n\
+ */\n\
+ ${5:public} function set${6:$2}(${7:$2 }$$1)\n\
+ {\n\
+ $this->${8:$1} = $$1;\n\
+ return $this;\n\
+ }${9}\n\
+# getter method\n\
+snippet gm\n\
+ /**\n\
+ * Gets the value of ${1:foo}\n\
+ *\n\
+ * @return ${2:$1}\n\
+ */\n\
+ ${3:public} function get${4:$2}()\n\
+ {\n\
+ return $this->${5:$1};\n\
+ }${6}\n\
+#setter\n\
+snippet $s\n\
+ ${1:$foo}->set${2:Bar}(${3});\n\
+#getter\n\
+snippet $g\n\
+ ${1:$foo}->get${2:Bar}();\n\
+\n\
+# Tertiary conditional\n\
+snippet =?:\n\
+ $${1:foo} = ${2:true} ? ${3:a} : ${4};\n\
+snippet ?:\n\
+ ${1:true} ? ${2:a} : ${3}\n\
+\n\
+snippet C\n\
+ $_COOKIE['${1:variable}']${2}\n\
+snippet E\n\
+ $_ENV['${1:variable}']${2}\n\
+snippet F\n\
+ $_FILES['${1:variable}']${2}\n\
+snippet G\n\
+ $_GET['${1:variable}']${2}\n\
+snippet P\n\
+ $_POST['${1:variable}']${2}\n\
+snippet R\n\
+ $_REQUEST['${1:variable}']${2}\n\
+snippet S\n\
+ $_SERVER['${1:variable}']${2}\n\
+snippet SS\n\
+ $_SESSION['${1:variable}']${2}\n\
+ \n\
+# the following are old ones\n\
+snippet inc\n\
+ include '${1:file}';${2}\n\
+snippet inc1\n\
+ include_once '${1:file}';${2}\n\
+snippet req\n\
+ require '${1:file}';${2}\n\
+snippet req1\n\
+ require_once '${1:file}';${2}\n\
+# Start Docblock\n\
+snippet /*\n\
+ /**\n\
+ * ${1}\n\
+ */\n\
+# Class - post doc\n\
+snippet doc_cp\n\
+ /**\n\
+ * ${1:undocumented class}\n\
+ *\n\
+ * @package ${2:default}\n\
+ * @subpackage ${3:default}\n\
+ * @author ${4:`g:snips_author`}\n\
+ */${5}\n\
+# Class Variable - post doc\n\
+snippet doc_vp\n\
+ /**\n\
+ * ${1:undocumented class variable}\n\
+ *\n\
+ * @var ${2:string}\n\
+ */${3}\n\
+# Class Variable\n\
+snippet doc_v\n\
+ /**\n\
+ * ${3:undocumented class variable}\n\
+ *\n\
+ * @var ${4:string}\n\
+ */\n\
+ ${1:var} $${2};${5}\n\
+# Class\n\
+snippet doc_c\n\
+ /**\n\
+ * ${3:undocumented class}\n\
+ *\n\
+ * @package ${4:default}\n\
+ * @subpackage ${5:default}\n\
+ * @author ${6:`g:snips_author`}\n\
+ */\n\
+ ${1:}class ${2:}\n\
+ {\n\
+ ${7}\n\
+ } // END $1class $2\n\
+# Constant Definition - post doc\n\
+snippet doc_dp\n\
+ /**\n\
+ * ${1:undocumented constant}\n\
+ */${2}\n\
+# Constant Definition\n\
+snippet doc_d\n\
+ /**\n\
+ * ${3:undocumented constant}\n\
+ */\n\
+ ace.define(${1}, ${2});${4}\n\
+# Function - post doc\n\
+snippet doc_fp\n\
+ /**\n\
+ * ${1:undocumented function}\n\
+ *\n\
+ * @return ${2:void}\n\
+ * @author ${3:`g:snips_author`}\n\
+ */${4}\n\
+# Function signature\n\
+snippet doc_s\n\
+ /**\n\
+ * ${4:undocumented function}\n\
+ *\n\
+ * @return ${5:void}\n\
+ * @author ${6:`g:snips_author`}\n\
+ */\n\
+ ${1}function ${2}(${3});${7}\n\
+# Function\n\
+snippet doc_f\n\
+ /**\n\
+ * ${4:undocumented function}\n\
+ *\n\
+ * @return ${5:void}\n\
+ * @author ${6:`g:snips_author`}\n\
+ */\n\
+ ${1}function ${2}(${3})\n\
+ {${7}\n\
+ }\n\
+# Header\n\
+snippet doc_h\n\
+ /**\n\
+ * ${1}\n\
+ *\n\
+ * @author ${2:`g:snips_author`}\n\
+ * @version ${3:$Id$}\n\
+ * @copyright ${4:$2}, `strftime('%d %B, %Y')`\n\
+ * @package ${5:default}\n\
+ */\n\
+ \n\
+# Interface\n\
+snippet interface\n\
+ /**\n\
+ * ${2:undocumented class}\n\
+ *\n\
+ * @package ${3:default}\n\
+ * @author ${4:`g:snips_author`}\n\
+ */\n\
+ interface ${1:$FILENAME}\n\
+ {\n\
+ ${5}\n\
+ }\n\
+# class ...\n\
+snippet class\n\
+ /**\n\
+ * ${1}\n\
+ */\n\
+ class ${2:$FILENAME}\n\
+ {\n\
+ ${3}\n\
+ /**\n\
+ * ${4}\n\
+ */\n\
+ ${5:public} function ${6:__construct}(${7:argument})\n\
+ {\n\
+ ${8:// code...}\n\
+ }\n\
+ }\n\
+# ace.define(...)\n\
+snippet def\n\
+ ace.define('${1}'${2});${3}\n\
+# defined(...)\n\
+snippet def?\n\
+ ${1}defined('${2}')${3}\n\
+snippet wh\n\
+ while (${1:/* condition */}) {\n\
+ ${2:// code...}\n\
+ }\n\
+# do ... while\n\
+snippet do\n\
+ do {\n\
+ ${2:// code... }\n\
+ } while (${1:/* condition */});\n\
+snippet if\n\
+ if (${1:/* condition */}) {\n\
+ ${2:// code...}\n\
+ }\n\
+snippet ifil\n\
+ \n\
+ ${2:}\n\
+ \n\
+snippet ife\n\
+ if (${1:/* condition */}) {\n\
+ ${2:// code...}\n\
+ } else {\n\
+ ${3:// code...}\n\
+ }\n\
+ ${4}\n\
+snippet ifeil\n\
+ \n\
+ ${2:}\n\
+ \n\
+ ${3:}\n\
+ \n\
+ ${4}\n\
+snippet else\n\
+ else {\n\
+ ${1:// code...}\n\
+ }\n\
+snippet elseif\n\
+ elseif (${1:/* condition */}) {\n\
+ ${2:// code...}\n\
+ }\n\
+snippet switch\n\
+ switch ($${1:variable}) {\n\
+ case '${2:value}':\n\
+ ${3:// code...}\n\
+ break;\n\
+ ${5}\n\
+ default:\n\
+ ${4:// code...}\n\
+ break;\n\
+ }\n\
+snippet case\n\
+ case '${1:value}':\n\
+ ${2:// code...}\n\
+ break;${3}\n\
+snippet for\n\
+ for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {\n\
+ ${4: // code...}\n\
+ }\n\
+snippet foreach\n\
+ foreach ($${1:variable} as $${2:value}) {\n\
+ ${3:// code...}\n\
+ }\n\
+snippet foreachil\n\
+ \n\
+ ${3:}\n\
+ \n\
+snippet foreachk\n\
+ foreach ($${1:variable} as $${2:key} => $${3:value}) {\n\
+ ${4:// code...}\n\
+ }\n\
+snippet foreachkil\n\
+ $${3:value}): ?>\n\
+ ${4:}\n\
+ \n\
+# $... = array (...)\n\
+snippet array\n\
+ $${1:arrayName} = array('${2}' => ${3});${4}\n\
+snippet try\n\
+ try {\n\
+ ${2}\n\
+ } catch (${1:Exception} $e) {\n\
+ }\n\
+# lambda with closure\n\
+snippet lambda\n\
+ ${1:static }function (${2:args}) use (${3:&$x, $y /*put vars in scope (closure) */}) {\n\
+ ${4}\n\
+ };\n\
+# pre_dump();\n\
+snippet pd\n\
+ echo ''; var_dump(${1}); echo '';\n\
+# pre_dump(); die();\n\
+snippet pdd\n\
+ echo ''; var_dump(${1}); echo ''; die(${2:});\n\
+snippet vd\n\
+ var_dump(${1});\n\
+snippet vdd\n\
+ var_dump(${1}); die(${2:});\n\
+snippet http_redirect\n\
+ header (\"HTTP/1.1 301 Moved Permanently\"); \n\
+ header (\"Location: \".URL); \n\
+ exit();\n\
+# Getters & Setters\n\
+snippet gs\n\
+ /**\n\
+ * Gets the value of ${1:foo}\n\
+ *\n\
+ * @return ${2:$1}\n\
+ */\n\
+ public function get${3:$2}()\n\
+ {\n\
+ return $this->${4:$1};\n\
+ }\n\
+\n\
+ /**\n\
+ * Sets the value of $1\n\
+ *\n\
+ * @param $2 $$1 ${5:description}\n\
+ *\n\
+ * @return ${6:$FILENAME}\n\
+ */\n\
+ public function set$3(${7:$2 }$$1)\n\
+ {\n\
+ $this->$4 = $$1;\n\
+ return $this;\n\
+ }${8}\n\
+# anotation, get, and set, useful for doctrine\n\
+snippet ags\n\
+ /**\n\
+ * ${1:description}\n\
+ * \n\
+ * @${7}\n\
+ */\n\
+ ${2:protected} $${3:foo};\n\
+\n\
+ public function get${4:$3}()\n\
+ {\n\
+ return $this->$3;\n\
+ }\n\
+\n\
+ public function set$4(${5:$4 }$${6:$3})\n\
+ {\n\
+ $this->$3 = $$6;\n\
+ return $this;\n\
+ }\n\
+snippet rett\n\
+ return true;\n\
+snippet retf\n\
+ return false;\n\
+";
+exports.scope = "php";
+
+});
diff --git a/lib/client/edit/snippets/plain_text.js b/lib/client/edit/snippets/plain_text.js
new file mode 100644
index 00000000..1c76fdd7
--- /dev/null
+++ b/lib/client/edit/snippets/plain_text.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/plain_text', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "plain_text";
+
+});
diff --git a/lib/client/edit/snippets/powershell.js b/lib/client/edit/snippets/powershell.js
new file mode 100644
index 00000000..c7bc2d30
--- /dev/null
+++ b/lib/client/edit/snippets/powershell.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/powershell', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "powershell";
+
+});
diff --git a/lib/client/edit/snippets/properties.js b/lib/client/edit/snippets/properties.js
new file mode 100644
index 00000000..ec389d5d
--- /dev/null
+++ b/lib/client/edit/snippets/properties.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/properties', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "properties";
+
+});
diff --git a/lib/client/edit/snippets/python.js b/lib/client/edit/snippets/python.js
new file mode 100644
index 00000000..1a0be2aa
--- /dev/null
+++ b/lib/client/edit/snippets/python.js
@@ -0,0 +1,165 @@
+ace.define('ace/snippets/python', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet #!\n\
+ #!/usr/bin/env python\n\
+snippet imp\n\
+ import ${1:module}\n\
+snippet from\n\
+ from ${1:package} import ${2:module}\n\
+# Module Docstring\n\
+snippet docs\n\
+ '''\n\
+ File: ${1:`Filename('$1.py', 'foo.py')`}\n\
+ Author: ${2:`g:snips_author`}\n\
+ Description: ${3}\n\
+ '''\n\
+snippet wh\n\
+ while ${1:condition}:\n\
+ ${2:# TODO: write code...}\n\
+# dowh - does the same as do...while in other languages\n\
+snippet dowh\n\
+ while True:\n\
+ ${1:# TODO: write code...}\n\
+ if ${2:condition}:\n\
+ break\n\
+snippet with\n\
+ with ${1:expr} as ${2:var}:\n\
+ ${3:# TODO: write code...}\n\
+# New Class\n\
+snippet cl\n\
+ class ${1:ClassName}(${2:object}):\n\
+ \"\"\"${3:docstring for $1}\"\"\"\n\
+ def __init__(self, ${4:arg}):\n\
+ ${5:super($1, self).__init__()}\n\
+ self.$4 = $4\n\
+ ${6}\n\
+# New Function\n\
+snippet def\n\
+ def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\n\
+ \"\"\"${3:docstring for $1}\"\"\"\n\
+ ${4:# TODO: write code...}\n\
+snippet deff\n\
+ def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\n\
+ ${3:# TODO: write code...}\n\
+# New Method\n\
+snippet defs\n\
+ def ${1:mname}(self, ${2:arg}):\n\
+ ${3:# TODO: write code...}\n\
+# New Property\n\
+snippet property\n\
+ def ${1:foo}():\n\
+ doc = \"${2:The $1 property.}\"\n\
+ def fget(self):\n\
+ ${3:return self._$1}\n\
+ def fset(self, value):\n\
+ ${4:self._$1 = value}\n\
+# Ifs\n\
+snippet if\n\
+ if ${1:condition}:\n\
+ ${2:# TODO: write code...}\n\
+snippet el\n\
+ else:\n\
+ ${1:# TODO: write code...}\n\
+snippet ei\n\
+ elif ${1:condition}:\n\
+ ${2:# TODO: write code...}\n\
+# For\n\
+snippet for\n\
+ for ${1:item} in ${2:items}:\n\
+ ${3:# TODO: write code...}\n\
+# Encodes\n\
+snippet cutf8\n\
+ # -*- coding: utf-8 -*-\n\
+snippet clatin1\n\
+ # -*- coding: latin-1 -*-\n\
+snippet cascii\n\
+ # -*- coding: ascii -*-\n\
+# Lambda\n\
+snippet ld\n\
+ ${1:var} = lambda ${2:vars} : ${3:action}\n\
+snippet .\n\
+ self.\n\
+snippet try Try/Except\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+snippet try Try/Except/Else\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+ else:\n\
+ ${5:# TODO: write code...}\n\
+snippet try Try/Except/Finally\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+ finally:\n\
+ ${5:# TODO: write code...}\n\
+snippet try Try/Except/Else/Finally\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+ else:\n\
+ ${5:# TODO: write code...}\n\
+ finally:\n\
+ ${6:# TODO: write code...}\n\
+# if __name__ == '__main__':\n\
+snippet ifmain\n\
+ if __name__ == '__main__':\n\
+ ${1:main()}\n\
+# __magic__\n\
+snippet _\n\
+ __${1:init}__${2}\n\
+# python debugger (pdb)\n\
+snippet pdb\n\
+ import pdb; pdb.set_trace()\n\
+# ipython debugger (ipdb)\n\
+snippet ipdb\n\
+ import ipdb; ipdb.set_trace()\n\
+# ipython debugger (pdbbb)\n\
+snippet pdbbb\n\
+ import pdbpp; pdbpp.set_trace()\n\
+snippet pprint\n\
+ import pprint; pprint.pprint(${1})${2}\n\
+snippet \"\n\
+ \"\"\"\n\
+ ${1:doc}\n\
+ \"\"\"\n\
+# test function/method\n\
+snippet test\n\
+ def test_${1:description}(${2:`indent('.') ? 'self' : ''`}):\n\
+ ${3:# TODO: write code...}\n\
+# test case\n\
+snippet testcase\n\
+ class ${1:ExampleCase}(unittest.TestCase):\n\
+ \n\
+ def test_${2:description}(self):\n\
+ ${3:# TODO: write code...}\n\
+snippet fut\n\
+ from __future__ import ${1}\n\
+#getopt\n\
+snippet getopt\n\
+ try:\n\
+ # Short option syntax: \"hv:\"\n\
+ # Long option syntax: \"help\" or \"verbose=\"\n\
+ opts, args = getopt.getopt(sys.argv[1:], \"${1:short_options}\", [${2:long_options}])\n\
+ \n\
+ except getopt.GetoptError, err:\n\
+ # Print debug info\n\
+ print str(err)\n\
+ ${3:error_action}\n\
+\n\
+ for option, argument in opts:\n\
+ if option in (\"-h\", \"--help\"):\n\
+ ${4}\n\
+ elif option in (\"-v\", \"--verbose\"):\n\
+ verbose = argument\n\
+";
+exports.scope = "python";
+
+});
diff --git a/lib/client/edit/snippets/ruby.js b/lib/client/edit/snippets/ruby.js
new file mode 100644
index 00000000..7830e20a
--- /dev/null
+++ b/lib/client/edit/snippets/ruby.js
@@ -0,0 +1,935 @@
+ace.define('ace/snippets/ruby', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "########################################\n\
+# Ruby snippets - for Rails, see below #\n\
+########################################\n\
+\n\
+# encoding for Ruby 1.9\n\
+snippet enc\n\
+ # encoding: utf-8\n\
+\n\
+# #!/usr/bin/env ruby\n\
+snippet #!\n\
+ #!/usr/bin/env ruby\n\
+ # encoding: utf-8\n\
+\n\
+# New Block\n\
+snippet =b\n\
+ =begin rdoc\n\
+ ${1}\n\
+ =end\n\
+snippet y\n\
+ :yields: ${1:arguments}\n\
+snippet rb\n\
+ #!/usr/bin/env ruby -wKU\n\
+snippet beg\n\
+ begin\n\
+ ${3}\n\
+ rescue ${1:Exception} => ${2:e}\n\
+ end\n\
+\n\
+snippet req require\n\
+ require \"${1}\"${2}\n\
+snippet #\n\
+ # =>\n\
+snippet end\n\
+ __END__\n\
+snippet case\n\
+ case ${1:object}\n\
+ when ${2:condition}\n\
+ ${3}\n\
+ end\n\
+snippet when\n\
+ when ${1:condition}\n\
+ ${2}\n\
+snippet def\n\
+ def ${1:method_name}\n\
+ ${2}\n\
+ end\n\
+snippet deft\n\
+ def test_${1:case_name}\n\
+ ${2}\n\
+ end\n\
+snippet if\n\
+ if ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet ife\n\
+ if ${1:condition}\n\
+ ${2}\n\
+ else\n\
+ ${3}\n\
+ end\n\
+snippet elsif\n\
+ elsif ${1:condition}\n\
+ ${2}\n\
+snippet unless\n\
+ unless ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet while\n\
+ while ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet for\n\
+ for ${1:e} in ${2:c}\n\
+ ${3}\n\
+ end\n\
+snippet until\n\
+ until ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet cla class .. end\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ ${2}\n\
+ end\n\
+snippet cla class .. initialize .. end\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ def initialize(${2:args})\n\
+ ${3}\n\
+ end\n\
+ end\n\
+snippet cla class .. < ParentClass .. initialize .. end\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} < ${2:ParentClass}\n\
+ def initialize(${3:args})\n\
+ ${4}\n\
+ end\n\
+ end\n\
+snippet cla ClassName = Struct .. do .. end\n\
+ ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} = Struct.new(:${2:attr_names}) do\n\
+ def ${3:method_name}\n\
+ ${4}\n\
+ end\n\
+ end\n\
+snippet cla class BlankSlate .. initialize .. end\n\
+ class ${1:BlankSlate}\n\
+ instance_methods.each { |meth| undef_method(meth) unless meth =~ /\\A__/ }\n\
+ end\n\
+snippet cla class << self .. end\n\
+ class << ${1:self}\n\
+ ${2}\n\
+ end\n\
+# class .. < DelegateClass .. initialize .. end\n\
+snippet cla-\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} < DelegateClass(${2:ParentClass})\n\
+ def initialize(${3:args})\n\
+ super(${4:del_obj})\n\
+\n\
+ ${5}\n\
+ end\n\
+ end\n\
+snippet mod module .. end\n\
+ module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ ${2}\n\
+ end\n\
+snippet mod module .. module_function .. end\n\
+ module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ module_function\n\
+\n\
+ ${2}\n\
+ end\n\
+snippet mod module .. ClassMethods .. end\n\
+ module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ module ClassMethods\n\
+ ${2}\n\
+ end\n\
+\n\
+ module InstanceMethods\n\
+\n\
+ end\n\
+\n\
+ def self.included(receiver)\n\
+ receiver.extend ClassMethods\n\
+ receiver.send :include, InstanceMethods\n\
+ end\n\
+ end\n\
+# attr_reader\n\
+snippet r\n\
+ attr_reader :${1:attr_names}\n\
+# attr_writer\n\
+snippet w\n\
+ attr_writer :${1:attr_names}\n\
+# attr_accessor\n\
+snippet rw\n\
+ attr_accessor :${1:attr_names}\n\
+snippet atp\n\
+ attr_protected :${1:attr_names}\n\
+snippet ata\n\
+ attr_accessible :${1:attr_names}\n\
+# include Enumerable\n\
+snippet Enum\n\
+ include Enumerable\n\
+\n\
+ def each(&block)\n\
+ ${1}\n\
+ end\n\
+# include Comparable\n\
+snippet Comp\n\
+ include Comparable\n\
+\n\
+ def <=>(other)\n\
+ ${1}\n\
+ end\n\
+# extend Forwardable\n\
+snippet Forw-\n\
+ extend Forwardable\n\
+# def self\n\
+snippet defs\n\
+ def self.${1:class_method_name}\n\
+ ${2}\n\
+ end\n\
+# def method_missing\n\
+snippet defmm\n\
+ def method_missing(meth, *args, &blk)\n\
+ ${1}\n\
+ end\n\
+snippet defd\n\
+ def_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}\n\
+snippet defds\n\
+ def_delegators :${1:@del_obj}, :${2:del_methods}\n\
+snippet am\n\
+ alias_method :${1:new_name}, :${2:old_name}\n\
+snippet app\n\
+ if __FILE__ == $PROGRAM_NAME\n\
+ ${1}\n\
+ end\n\
+# usage_if()\n\
+snippet usai\n\
+ if ARGV.${1}\n\
+ abort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\n\
+ end\n\
+# usage_unless()\n\
+snippet usau\n\
+ unless ARGV.${1}\n\
+ abort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\n\
+ end\n\
+snippet array\n\
+ Array.new(${1:10}) { |${2:i}| ${3} }\n\
+snippet hash\n\
+ Hash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }\n\
+snippet file File.foreach() { |line| .. }\n\
+ File.foreach(${1:\"path/to/file\"}) { |${2:line}| ${3} }\n\
+snippet file File.read()\n\
+ File.read(${1:\"path/to/file\"})${2}\n\
+snippet Dir Dir.global() { |file| .. }\n\
+ Dir.glob(${1:\"dir/glob/*\"}) { |${2:file}| ${3} }\n\
+snippet Dir Dir[\"..\"]\n\
+ Dir[${1:\"glob/**/*.rb\"}]${2}\n\
+snippet dir\n\
+ Filename.dirname(__FILE__)\n\
+snippet deli\n\
+ delete_if { |${1:e}| ${2} }\n\
+snippet fil\n\
+ fill(${1:range}) { |${2:i}| ${3} }\n\
+# flatten_once()\n\
+snippet flao\n\
+ inject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}\n\
+snippet zip\n\
+ zip(${1:enums}) { |${2:row}| ${3} }\n\
+# downto(0) { |n| .. }\n\
+snippet dow\n\
+ downto(${1:0}) { |${2:n}| ${3} }\n\
+snippet ste\n\
+ step(${1:2}) { |${2:n}| ${3} }\n\
+snippet tim\n\
+ times { |${1:n}| ${2} }\n\
+snippet upt\n\
+ upto(${1:1.0/0.0}) { |${2:n}| ${3} }\n\
+snippet loo\n\
+ loop { ${1} }\n\
+snippet ea\n\
+ each { |${1:e}| ${2} }\n\
+snippet ead\n\
+ each do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet eab\n\
+ each_byte { |${1:byte}| ${2} }\n\
+snippet eac- each_char { |chr| .. }\n\
+ each_char { |${1:chr}| ${2} }\n\
+snippet eac- each_cons(..) { |group| .. }\n\
+ each_cons(${1:2}) { |${2:group}| ${3} }\n\
+snippet eai\n\
+ each_index { |${1:i}| ${2} }\n\
+snippet eaid\n\
+ each_index do |${1:i}|\n\
+ ${2}\n\
+ end\n\
+snippet eak\n\
+ each_key { |${1:key}| ${2} }\n\
+snippet eakd\n\
+ each_key do |${1:key}|\n\
+ ${2}\n\
+ end\n\
+snippet eal\n\
+ each_line { |${1:line}| ${2} }\n\
+snippet eald\n\
+ each_line do |${1:line}|\n\
+ ${2}\n\
+ end\n\
+snippet eap\n\
+ each_pair { |${1:name}, ${2:val}| ${3} }\n\
+snippet eapd\n\
+ each_pair do |${1:name}, ${2:val}|\n\
+ ${3}\n\
+ end\n\
+snippet eas-\n\
+ each_slice(${1:2}) { |${2:group}| ${3} }\n\
+snippet easd-\n\
+ each_slice(${1:2}) do |${2:group}|\n\
+ ${3}\n\
+ end\n\
+snippet eav\n\
+ each_value { |${1:val}| ${2} }\n\
+snippet eavd\n\
+ each_value do |${1:val}|\n\
+ ${2}\n\
+ end\n\
+snippet eawi\n\
+ each_with_index { |${1:e}, ${2:i}| ${3} }\n\
+snippet eawid\n\
+ each_with_index do |${1:e},${2:i}|\n\
+ ${3}\n\
+ end\n\
+snippet reve\n\
+ reverse_each { |${1:e}| ${2} }\n\
+snippet reved\n\
+ reverse_each do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet inj\n\
+ inject(${1:init}) { |${2:mem}, ${3:var}| ${4} }\n\
+snippet injd\n\
+ inject(${1:init}) do |${2:mem}, ${3:var}|\n\
+ ${4}\n\
+ end\n\
+snippet map\n\
+ map { |${1:e}| ${2} }\n\
+snippet mapd\n\
+ map do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet mapwi-\n\
+ enum_with_index.map { |${1:e}, ${2:i}| ${3} }\n\
+snippet sor\n\
+ sort { |a, b| ${1} }\n\
+snippet sorb\n\
+ sort_by { |${1:e}| ${2} }\n\
+snippet ran\n\
+ sort_by { rand }\n\
+snippet all\n\
+ all? { |${1:e}| ${2} }\n\
+snippet any\n\
+ any? { |${1:e}| ${2} }\n\
+snippet cl\n\
+ classify { |${1:e}| ${2} }\n\
+snippet col\n\
+ collect { |${1:e}| ${2} }\n\
+snippet cold\n\
+ collect do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet det\n\
+ detect { |${1:e}| ${2} }\n\
+snippet detd\n\
+ detect do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet fet\n\
+ fetch(${1:name}) { |${2:key}| ${3} }\n\
+snippet fin\n\
+ find { |${1:e}| ${2} }\n\
+snippet find\n\
+ find do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet fina\n\
+ find_all { |${1:e}| ${2} }\n\
+snippet finad\n\
+ find_all do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet gre\n\
+ grep(${1:/pattern/}) { |${2:match}| ${3} }\n\
+snippet sub\n\
+ ${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }\n\
+snippet sca\n\
+ scan(${1:/pattern/}) { |${2:match}| ${3} }\n\
+snippet scad\n\
+ scan(${1:/pattern/}) do |${2:match}|\n\
+ ${3}\n\
+ end\n\
+snippet max\n\
+ max { |a, b| ${1} }\n\
+snippet min\n\
+ min { |a, b| ${1} }\n\
+snippet par\n\
+ partition { |${1:e}| ${2} }\n\
+snippet pard\n\
+ partition do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet rej\n\
+ reject { |${1:e}| ${2} }\n\
+snippet rejd\n\
+ reject do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet sel\n\
+ select { |${1:e}| ${2} }\n\
+snippet seld\n\
+ select do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet lam\n\
+ lambda { |${1:args}| ${2} }\n\
+snippet doo\n\
+ do\n\
+ ${1}\n\
+ end\n\
+snippet dov\n\
+ do |${1:variable}|\n\
+ ${2}\n\
+ end\n\
+snippet :\n\
+ :${1:key} => ${2:\"value\"}${3}\n\
+snippet ope\n\
+ open(${1:\"path/or/url/or/pipe\"}, \"${2:w}\") { |${3:io}| ${4} }\n\
+# path_from_here()\n\
+snippet fpath\n\
+ File.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}\n\
+# unix_filter {}\n\
+snippet unif\n\
+ ARGF.each_line${1} do |${2:line}|\n\
+ ${3}\n\
+ end\n\
+# option_parse {}\n\
+snippet optp\n\
+ require \"optparse\"\n\
+\n\
+ options = {${1:default => \"args\"}}\n\
+\n\
+ ARGV.options do |opts|\n\
+ opts.banner = \"Usage: #{File.basename($PROGRAM_NAME)}\n\
+snippet opt\n\
+ opts.on( \"-${1:o}\", \"--${2:long-option-name}\", ${3:String},\n\
+ \"${4:Option description.}\") do |${5:opt}|\n\
+ ${6}\n\
+ end\n\
+snippet tc\n\
+ require \"test/unit\"\n\
+\n\
+ require \"${1:library_file_name}\"\n\
+\n\
+ class Test${2:$1} < Test::Unit::TestCase\n\
+ def test_${3:case_name}\n\
+ ${4}\n\
+ end\n\
+ end\n\
+snippet ts\n\
+ require \"test/unit\"\n\
+\n\
+ require \"tc_${1:test_case_file}\"\n\
+ require \"tc_${2:test_case_file}\"${3}\n\
+snippet as\n\
+ assert ${1:test}, \"${2:Failure message.}\"${3}\n\
+snippet ase\n\
+ assert_equal ${1:expected}, ${2:actual}${3}\n\
+snippet asne\n\
+ assert_not_equal ${1:unexpected}, ${2:actual}${3}\n\
+snippet asid\n\
+ assert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}\n\
+snippet asio\n\
+ assert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}\n\
+snippet asko\n\
+ assert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}\n\
+snippet asn\n\
+ assert_nil ${1:instance}${2}\n\
+snippet asnn\n\
+ assert_not_nil ${1:instance}${2}\n\
+snippet asm\n\
+ assert_match /${1:expected_pattern}/, ${2:actual_string}${3}\n\
+snippet asnm\n\
+ assert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}\n\
+snippet aso\n\
+ assert_operator ${1:left}, :${2:operator}, ${3:right}${4}\n\
+snippet asr\n\
+ assert_raise ${1:Exception} { ${2} }\n\
+snippet asrd\n\
+ assert_raise ${1:Exception} do\n\
+ ${2}\n\
+ end\n\
+snippet asnr\n\
+ assert_nothing_raised ${1:Exception} { ${2} }\n\
+snippet asnrd\n\
+ assert_nothing_raised ${1:Exception} do\n\
+ ${2}\n\
+ end\n\
+snippet asrt\n\
+ assert_respond_to ${1:object}, :${2:method}${3}\n\
+snippet ass assert_same(..)\n\
+ assert_same ${1:expected}, ${2:actual}${3}\n\
+snippet ass assert_send(..)\n\
+ assert_send [${1:object}, :${2:message}, ${3:args}]${4}\n\
+snippet asns\n\
+ assert_not_same ${1:unexpected}, ${2:actual}${3}\n\
+snippet ast\n\
+ assert_throws :${1:expected} { ${2} }\n\
+snippet astd\n\
+ assert_throws :${1:expected} do\n\
+ ${2}\n\
+ end\n\
+snippet asnt\n\
+ assert_nothing_thrown { ${1} }\n\
+snippet asntd\n\
+ assert_nothing_thrown do\n\
+ ${1}\n\
+ end\n\
+snippet fl\n\
+ flunk \"${1:Failure message.}\"${2}\n\
+# Benchmark.bmbm do .. end\n\
+snippet bm-\n\
+ TESTS = ${1:10_000}\n\
+ Benchmark.bmbm do |results|\n\
+ ${2}\n\
+ end\n\
+snippet rep\n\
+ results.report(\"${1:name}:\") { TESTS.times { ${2} }}\n\
+# Marshal.dump(.., file)\n\
+snippet Md\n\
+ File.open(${1:\"path/to/file.dump\"}, \"wb\") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}\n\
+# Mashal.load(obj)\n\
+snippet Ml\n\
+ File.open(${1:\"path/to/file.dump\"}, \"rb\") { |${2:file}| Marshal.load($2) }${3}\n\
+# deep_copy(..)\n\
+snippet deec\n\
+ Marshal.load(Marshal.dump(${1:obj_to_copy}))${2}\n\
+snippet Pn-\n\
+ PStore.new(${1:\"file_name.pstore\"})${2}\n\
+snippet tra\n\
+ transaction(${1:true}) { ${2} }\n\
+# xmlread(..)\n\
+snippet xml-\n\
+ REXML::Document.new(File.read(${1:\"path/to/file\"}))${2}\n\
+# xpath(..) { .. }\n\
+snippet xpa\n\
+ elements.each(${1:\"//Xpath\"}) do |${2:node}|\n\
+ ${3}\n\
+ end\n\
+# class_from_name()\n\
+snippet clafn\n\
+ split(\"::\").inject(Object) { |par, const| par.const_get(const) }\n\
+# singleton_class()\n\
+snippet sinc\n\
+ class << self; self end\n\
+snippet nam\n\
+ namespace :${1:`Filename()`} do\n\
+ ${2}\n\
+ end\n\
+snippet tas\n\
+ desc \"${1:Task description}\"\n\
+ task :${2:task_name => [:dependent, :tasks]} do\n\
+ ${3}\n\
+ end\n\
+# block\n\
+snippet b\n\
+ { |${1:var}| ${2} }\n\
+snippet begin\n\
+ begin\n\
+ raise 'A test exception.'\n\
+ rescue Exception => e\n\
+ puts e.message\n\
+ puts e.backtrace.inspect\n\
+ else\n\
+ # other exception\n\
+ ensure\n\
+ # always executed\n\
+ end\n\
+\n\
+#debugging\n\
+snippet debug\n\
+ require 'ruby-debug'; debugger; true;\n\
+snippet pry\n\
+ require 'pry'; binding.pry\n\
+\n\
+#############################################\n\
+# Rails snippets - for pure Ruby, see above #\n\
+#############################################\n\
+snippet art\n\
+ assert_redirected_to ${1::action => \"${2:index}\"}\n\
+snippet artnp\n\
+ assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})\n\
+snippet artnpp\n\
+ assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})\n\
+snippet artp\n\
+ assert_redirected_to ${1:model}_path(${2:@$1})\n\
+snippet artpp\n\
+ assert_redirected_to ${1:model}s_path\n\
+snippet asd\n\
+ assert_difference \"${1:Model}.${2:count}\", $1 do\n\
+ ${3}\n\
+ end\n\
+snippet asnd\n\
+ assert_no_difference \"${1:Model}.${2:count}\" do\n\
+ ${3}\n\
+ end\n\
+snippet asre\n\
+ assert_response :${1:success}, @response.body${2}\n\
+snippet asrj\n\
+ assert_rjs :${1:replace}, \"${2:dom id}\"\n\
+snippet ass assert_select(..)\n\
+ assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do}\n\
+snippet bf\n\
+ before_filter :${1:method}\n\
+snippet bt\n\
+ belongs_to :${1:association}\n\
+snippet crw\n\
+ cattr_accessor :${1:attr_names}\n\
+snippet defcreate\n\
+ def create\n\
+ @${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])\n\
+\n\
+ respond_to do |wants|\n\
+ if @$1.save\n\
+ flash[:notice] = '$2 was successfully created.'\n\
+ wants.html { redirect_to(@$1) }\n\
+ wants.xml { render :xml => @$1, :status => :created, :location => @$1 }\n\
+ else\n\
+ wants.html { render :action => \"new\" }\n\
+ wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\
+ end\n\
+ end\n\
+ end${3}\n\
+snippet defdestroy\n\
+ def destroy\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+ @$1.destroy\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html { redirect_to($1s_url) }\n\
+ wants.xml { head :ok }\n\
+ end\n\
+ end${3}\n\
+snippet defedit\n\
+ def edit\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+ end\n\
+snippet defindex\n\
+ def index\n\
+ @${1:model_class_name} = ${2:ModelClassName}.all\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html # index.html.erb\n\
+ wants.xml { render :xml => @$1s }\n\
+ end\n\
+ end${3}\n\
+snippet defnew\n\
+ def new\n\
+ @${1:model_class_name} = ${2:ModelClassName}.new\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html # new.html.erb\n\
+ wants.xml { render :xml => @$1 }\n\
+ end\n\
+ end${3}\n\
+snippet defshow\n\
+ def show\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html # show.html.erb\n\
+ wants.xml { render :xml => @$1 }\n\
+ end\n\
+ end${3}\n\
+snippet defupdate\n\
+ def update\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+\n\
+ respond_to do |wants|\n\
+ if @$1.update_attributes(params[:$1])\n\
+ flash[:notice] = '$2 was successfully updated.'\n\
+ wants.html { redirect_to(@$1) }\n\
+ wants.xml { head :ok }\n\
+ else\n\
+ wants.html { render :action => \"edit\" }\n\
+ wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\
+ end\n\
+ end\n\
+ end${3}\n\
+snippet flash\n\
+ flash[:${1:notice}] = \"${2}\"\n\
+snippet habtm\n\
+ has_and_belongs_to_many :${1:object}, :join_table => \"${2:table_name}\", :foreign_key => \"${3}_id\"${4}\n\
+snippet hm\n\
+ has_many :${1:object}\n\
+snippet hmd\n\
+ has_many :${1:other}s, :class_name => \"${2:$1}\", :foreign_key => \"${3:$1}_id\", :dependent => :destroy${4}\n\
+snippet hmt\n\
+ has_many :${1:object}, :through => :${2:object}\n\
+snippet ho\n\
+ has_one :${1:object}\n\
+snippet i18\n\
+ I18n.t('${1:type.key}')${2}\n\
+snippet ist\n\
+ <%= image_submit_tag(\"${1:agree.png}\", :id => \"${2:id}\"${3} %>\n\
+snippet log\n\
+ Rails.logger.${1:debug} ${2}\n\
+snippet log2\n\
+ RAILS_DEFAULT_LOGGER.${1:debug} ${2}\n\
+snippet logd\n\
+ logger.debug { \"${1:message}\" }${2}\n\
+snippet loge\n\
+ logger.error { \"${1:message}\" }${2}\n\
+snippet logf\n\
+ logger.fatal { \"${1:message}\" }${2}\n\
+snippet logi\n\
+ logger.info { \"${1:message}\" }${2}\n\
+snippet logw\n\
+ logger.warn { \"${1:message}\" }${2}\n\
+snippet mapc\n\
+ ${1:map}.${2:connect} '${3:controller/:action/:id}'\n\
+snippet mapca\n\
+ ${1:map}.catch_all \"*${2:anything}\", :controller => \"${3:default}\", :action => \"${4:error}\"${5}\n\
+snippet mapr\n\
+ ${1:map}.resource :${2:resource}\n\
+snippet maprs\n\
+ ${1:map}.resources :${2:resource}\n\
+snippet mapwo\n\
+ ${1:map}.with_options :${2:controller} => '${3:thing}' do |$3|\n\
+ ${4}\n\
+ end\n\
+snippet mbs\n\
+ before_save :${1:method}\n\
+snippet mcht\n\
+ change_table :${1:table_name} do |t|\n\
+ ${2}\n\
+ end\n\
+snippet mp\n\
+ map(&:${1:id})\n\
+snippet mrw\n\
+ mattr_accessor :${1:attr_names}\n\
+snippet oa\n\
+ order(\"${1:field}\")\n\
+snippet od\n\
+ order(\"${1:field} DESC\")\n\
+snippet pa\n\
+ params[:${1:id}]${2}\n\
+snippet ra\n\
+ render :action => \"${1:action}\"\n\
+snippet ral\n\
+ render :action => \"${1:action}\", :layout => \"${2:layoutname}\"\n\
+snippet rest\n\
+ respond_to do |wants|\n\
+ wants.${1:html} { ${2} }\n\
+ end\n\
+snippet rf\n\
+ render :file => \"${1:filepath}\"\n\
+snippet rfu\n\
+ render :file => \"${1:filepath}\", :use_full_path => ${2:false}\n\
+snippet ri\n\
+ render :inline => \"${1:<%= 'hello' %>}\"\n\
+snippet ril\n\
+ render :inline => \"${1:<%= 'hello' %>}\", :locals => { ${2::name} => \"${3:value}\"${4} }\n\
+snippet rit\n\
+ render :inline => \"${1:<%= 'hello' %>}\", :type => ${2::rxml}\n\
+snippet rjson\n\
+ render :json => ${1:text to render}\n\
+snippet rl\n\
+ render :layout => \"${1:layoutname}\"\n\
+snippet rn\n\
+ render :nothing => ${1:true}\n\
+snippet rns\n\
+ render :nothing => ${1:true}, :status => ${2:401}\n\
+snippet rp\n\
+ render :partial => \"${1:item}\"\n\
+snippet rpc\n\
+ render :partial => \"${1:item}\", :collection => ${2:@$1s}\n\
+snippet rpl\n\
+ render :partial => \"${1:item}\", :locals => { :${2:$1} => ${3:@$1}\n\
+snippet rpo\n\
+ render :partial => \"${1:item}\", :object => ${2:@$1}\n\
+snippet rps\n\
+ render :partial => \"${1:item}\", :status => ${2:500}\n\
+snippet rt\n\
+ render :text => \"${1:text to render}\"\n\
+snippet rtl\n\
+ render :text => \"${1:text to render}\", :layout => \"${2:layoutname}\"\n\
+snippet rtlt\n\
+ render :text => \"${1:text to render}\", :layout => ${2:true}\n\
+snippet rts\n\
+ render :text => \"${1:text to render}\", :status => ${2:401}\n\
+snippet ru\n\
+ render :update do |${1:page}|\n\
+ $1.${2}\n\
+ end\n\
+snippet rxml\n\
+ render :xml => ${1:text to render}\n\
+snippet sc\n\
+ scope :${1:name}, :where(:@${2:field} => ${3:value})\n\
+snippet sl\n\
+ scope :${1:name}, lambda do |${2:value}|\n\
+ where(\"${3:field = ?}\", ${4:bind var})\n\
+ end\n\
+snippet sha1\n\
+ Digest::SHA1.hexdigest(${1:string})\n\
+snippet sweeper\n\
+ class ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper\n\
+ observe $1\n\
+\n\
+ def after_save(${2:model_class_name})\n\
+ expire_cache($2)\n\
+ end\n\
+\n\
+ def after_destroy($2)\n\
+ expire_cache($2)\n\
+ end\n\
+\n\
+ def expire_cache($2)\n\
+ expire_page\n\
+ end\n\
+ end\n\
+snippet tcb\n\
+ t.boolean :${1:title}\n\
+ ${2}\n\
+snippet tcbi\n\
+ t.binary :${1:title}, :limit => ${2:2}.megabytes\n\
+ ${3}\n\
+snippet tcd\n\
+ t.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}\n\
+ ${4}\n\
+snippet tcda\n\
+ t.date :${1:title}\n\
+ ${2}\n\
+snippet tcdt\n\
+ t.datetime :${1:title}\n\
+ ${2}\n\
+snippet tcf\n\
+ t.float :${1:title}\n\
+ ${2}\n\
+snippet tch\n\
+ t.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}\n\
+ ${5}\n\
+snippet tci\n\
+ t.integer :${1:title}\n\
+ ${2}\n\
+snippet tcl\n\
+ t.integer :lock_version, :null => false, :default => 0\n\
+ ${1}\n\
+snippet tcr\n\
+ t.references :${1:taggable}, :polymorphic => { :default => '${2:Photo}' }\n\
+ ${3}\n\
+snippet tcs\n\
+ t.string :${1:title}\n\
+ ${2}\n\
+snippet tct\n\
+ t.text :${1:title}\n\
+ ${2}\n\
+snippet tcti\n\
+ t.time :${1:title}\n\
+ ${2}\n\
+snippet tcts\n\
+ t.timestamp :${1:title}\n\
+ ${2}\n\
+snippet tctss\n\
+ t.timestamps\n\
+ ${1}\n\
+snippet va\n\
+ validates_associated :${1:attribute}\n\
+snippet vao\n\
+ validates_acceptance_of :${1:terms}\n\
+snippet vc\n\
+ validates_confirmation_of :${1:attribute}\n\
+snippet ve\n\
+ validates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}\n\
+snippet vf\n\
+ validates_format_of :${1:attribute}, :with => /${2:regex}/\n\
+snippet vi\n\
+ validates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })\n\
+snippet vl\n\
+ validates_length_of :${1:attribute}, :within => ${2:3}..${3:20}\n\
+snippet vn\n\
+ validates_numericality_of :${1:attribute}\n\
+snippet vpo\n\
+ validates_presence_of :${1:attribute}\n\
+snippet vu\n\
+ validates_uniqueness_of :${1:attribute}\n\
+snippet wants\n\
+ wants.${1:js|xml|html} { ${2} }\n\
+snippet wc\n\
+ where(${1:\"conditions\"}${2:, bind_var})\n\
+snippet wh\n\
+ where(${1:field} => ${2:value})\n\
+snippet xdelete\n\
+ xhr :delete, :${1:destroy}, :id => ${2:1}${3}\n\
+snippet xget\n\
+ xhr :get, :${1:show}, :id => ${2:1}${3}\n\
+snippet xpost\n\
+ xhr :post, :${1:create}, :${2:object} => { ${3} }\n\
+snippet xput\n\
+ xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}\n\
+snippet test\n\
+ test \"should ${1:do something}\" do\n\
+ ${2}\n\
+ end\n\
+#migrations\n\
+snippet mac\n\
+ add_column :${1:table_name}, :${2:column_name}, :${3:data_type}\n\
+snippet mrc\n\
+ remove_column :${1:table_name}, :${2:column_name}\n\
+snippet mrnc\n\
+ rename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}\n\
+snippet mcc\n\
+ change_column :${1:table}, :${2:column}, :${3:type}\n\
+snippet mccc\n\
+ t.column :${1:title}, :${2:string}\n\
+snippet mct\n\
+ create_table :${1:table_name} do |t|\n\
+ t.column :${2:name}, :${3:type}\n\
+ end\n\
+snippet migration\n\
+ class ${1:class_name} < ActiveRecord::Migration\n\
+ def self.up\n\
+ ${2}\n\
+ end\n\
+\n\
+ def self.down\n\
+ end\n\
+ end\n\
+\n\
+snippet trc\n\
+ t.remove :${1:column}\n\
+snippet tre\n\
+ t.rename :${1:old_column_name}, :${2:new_column_name}\n\
+ ${3}\n\
+snippet tref\n\
+ t.references :${1:model}\n\
+\n\
+#rspec\n\
+snippet it\n\
+ it \"${1:spec_name}\" do\n\
+ ${2}\n\
+ end\n\
+snippet itp\n\
+ it \"${1:spec_name}\"\n\
+ ${2}\n\
+snippet desc\n\
+ describe ${1:class_name} do\n\
+ ${2}\n\
+ end\n\
+snippet cont\n\
+ context \"${1:message}\" do\n\
+ ${2}\n\
+ end\n\
+snippet bef\n\
+ before :${1:each} do\n\
+ ${2}\n\
+ end\n\
+snippet aft\n\
+ after :${1:each} do\n\
+ ${2}\n\
+ end\n\
+";
+exports.scope = "ruby";
+
+});
diff --git a/lib/client/edit/snippets/sass.js b/lib/client/edit/snippets/sass.js
new file mode 100644
index 00000000..b17eb4d7
--- /dev/null
+++ b/lib/client/edit/snippets/sass.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/sass', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "sass";
+
+});
diff --git a/lib/client/edit/snippets/scala.js b/lib/client/edit/snippets/scala.js
new file mode 100644
index 00000000..e9f7d033
--- /dev/null
+++ b/lib/client/edit/snippets/scala.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/scala', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "scala";
+
+});
diff --git a/lib/client/edit/snippets/sh.js b/lib/client/edit/snippets/sh.js
new file mode 100644
index 00000000..b052e858
--- /dev/null
+++ b/lib/client/edit/snippets/sh.js
@@ -0,0 +1,90 @@
+ace.define('ace/snippets/sh', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# Shebang. Executing bash via /usr/bin/env makes scripts more portable.\n\
+snippet #!\n\
+ #!/usr/bin/env bash\n\
+ \n\
+snippet if\n\
+ if [[ ${1:condition} ]]; then\n\
+ ${2:#statements}\n\
+ fi\n\
+snippet elif\n\
+ elif [[ ${1:condition} ]]; then\n\
+ ${2:#statements}\n\
+snippet for\n\
+ for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do\n\
+ ${3:#statements}\n\
+ done\n\
+snippet fori\n\
+ for ${1:needle} in ${2:haystack} ; do\n\
+ ${3:#statements}\n\
+ done\n\
+snippet wh\n\
+ while [[ ${1:condition} ]]; do\n\
+ ${2:#statements}\n\
+ done\n\
+snippet until\n\
+ until [[ ${1:condition} ]]; do\n\
+ ${2:#statements}\n\
+ done\n\
+snippet case\n\
+ case ${1:word} in\n\
+ ${2:pattern})\n\
+ ${3};;\n\
+ esac\n\
+snippet go \n\
+ while getopts '${1:o}' ${2:opts} \n\
+ do \n\
+ case $$2 in\n\
+ ${3:o0})\n\
+ ${4:#staments};;\n\
+ esac\n\
+ done\n\
+# Set SCRIPT_DIR variable to directory script is located.\n\
+snippet sdir\n\
+ SCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\
+# getopt\n\
+snippet getopt\n\
+ __ScriptVersion=\"${1:version}\"\n\
+\n\
+ #=== FUNCTION ================================================================\n\
+ # NAME: usage\n\
+ # DESCRIPTION: Display usage information.\n\
+ #===============================================================================\n\
+ function usage ()\n\
+ {\n\
+ cat <<- EOT\n\
+\n\
+ Usage : $${0:0} [options] [--] \n\
+\n\
+ Options: \n\
+ -h|help Display this message\n\
+ -v|version Display script version\n\
+\n\
+ EOT\n\
+ } # ---------- end of function usage ----------\n\
+\n\
+ #-----------------------------------------------------------------------\n\
+ # Handle command line arguments\n\
+ #-----------------------------------------------------------------------\n\
+\n\
+ while getopts \":hv\" opt\n\
+ do\n\
+ case $opt in\n\
+\n\
+ h|help ) usage; exit 0 ;;\n\
+\n\
+ v|version ) echo \"$${0:0} -- Version $__ScriptVersion\"; exit 0 ;;\n\
+\n\
+ \\? ) echo -e \"\\n Option does not exist : $OPTARG\\n\"\n\
+ usage; exit 1 ;;\n\
+\n\
+ esac # --- end of case ---\n\
+ done\n\
+ shift $(($OPTIND-1))\n\
+\n\
+";
+exports.scope = "sh";
+
+});
diff --git a/lib/client/edit/snippets/snippets.js b/lib/client/edit/snippets/snippets.js
new file mode 100644
index 00000000..25b10ecd
--- /dev/null
+++ b/lib/client/edit/snippets/snippets.js
@@ -0,0 +1,16 @@
+ace.define('ace/snippets/snippets', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# snippets for making snippets :)\n\
+snippet snip\n\
+ snippet ${1:trigger}\n\
+ ${2}\n\
+snippet msnip\n\
+ snippet ${1:trigger} ${2:description}\n\
+ ${3}\n\
+snippet v\n\
+ {VISUAL}\n\
+";
+exports.scope = "snippets";
+
+});
diff --git a/lib/client/edit/snippets/sql.js b/lib/client/edit/snippets/sql.js
new file mode 100644
index 00000000..a9b359ba
--- /dev/null
+++ b/lib/client/edit/snippets/sql.js
@@ -0,0 +1,33 @@
+ace.define('ace/snippets/sql', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "snippet tbl\n\
+ create table ${1:table} (\n\
+ ${2:columns}\n\
+ );\n\
+snippet col\n\
+ ${1:name} ${2:type} ${3:default ''} ${4:not null}\n\
+snippet ccol\n\
+ ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\n\
+snippet ncol\n\
+ ${1:name} number ${3:default 0} ${4:not null}\n\
+snippet dcol\n\
+ ${1:name} date ${3:default sysdate} ${4:not null}\n\
+snippet ind\n\
+ create index ${3:$1_$2} on ${1:table}(${2:column});\n\
+snippet uind\n\
+ create unique index ${1:name} on ${2:table}(${3:column});\n\
+snippet tblcom\n\
+ comment on table ${1:table} is '${2:comment}';\n\
+snippet colcom\n\
+ comment on column ${1:table}.${2:column} is '${3:comment}';\n\
+snippet addcol\n\
+ alter table ${1:table} add (${2:column} ${3:type});\n\
+snippet seq\n\
+ create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\n\
+snippet s*\n\
+ select * from ${1:table}\n\
+";
+exports.scope = "sql";
+
+});
diff --git a/lib/client/edit/snippets/stylus.js b/lib/client/edit/snippets/stylus.js
new file mode 100644
index 00000000..3369c4c3
--- /dev/null
+++ b/lib/client/edit/snippets/stylus.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/stylus', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "stylus";
+
+});
diff --git a/lib/client/edit/snippets/svg.js b/lib/client/edit/snippets/svg.js
new file mode 100644
index 00000000..24ff8ed0
--- /dev/null
+++ b/lib/client/edit/snippets/svg.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/svg', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "svg";
+
+});
diff --git a/lib/client/edit/snippets/tcl.js b/lib/client/edit/snippets/tcl.js
new file mode 100644
index 00000000..4347cbc9
--- /dev/null
+++ b/lib/client/edit/snippets/tcl.js
@@ -0,0 +1,99 @@
+ace.define('ace/snippets/tcl', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# #!/usr/bin/env tclsh\n\
+snippet #!\n\
+ #!/usr/bin/env tclsh\n\
+ \n\
+# Process\n\
+snippet pro\n\
+ proc ${1:function_name} {${2:args}} {\n\
+ ${3:#body ...}\n\
+ }\n\
+#xif\n\
+snippet xif\n\
+ ${1:expr}? ${2:true} : ${3:false}\n\
+# Conditional\n\
+snippet if\n\
+ if {${1}} {\n\
+ ${2:# body...}\n\
+ }\n\
+# Conditional if..else\n\
+snippet ife\n\
+ if {${1}} {\n\
+ ${2:# body...}\n\
+ } else {\n\
+ ${3:# else...}\n\
+ }\n\
+# Conditional if..elsif..else\n\
+snippet ifee\n\
+ if {${1}} {\n\
+ ${2:# body...}\n\
+ } elseif {${3}} {\n\
+ ${4:# elsif...}\n\
+ } else {\n\
+ ${5:# else...}\n\
+ }\n\
+# If catch then\n\
+snippet ifc\n\
+ if { [catch {${1:#do something...}} ${2:err}] } {\n\
+ ${3:# handle failure...}\n\
+ }\n\
+# Catch\n\
+snippet catch\n\
+ catch {${1}} ${2:err} ${3:options}\n\
+# While Loop\n\
+snippet wh\n\
+ while {${1}} {\n\
+ ${2:# body...}\n\
+ }\n\
+# For Loop\n\
+snippet for\n\
+ for {set ${2:var} 0} {$$2 < ${1:count}} {${3:incr} $2} {\n\
+ ${4:# body...}\n\
+ }\n\
+# Foreach Loop\n\
+snippet fore\n\
+ foreach ${1:x} {${2:#list}} {\n\
+ ${3:# body...}\n\
+ }\n\
+# after ms script...\n\
+snippet af\n\
+ after ${1:ms} ${2:#do something}\n\
+# after cancel id\n\
+snippet afc\n\
+ after cancel ${1:id or script}\n\
+# after idle\n\
+snippet afi\n\
+ after idle ${1:script}\n\
+# after info id\n\
+snippet afin\n\
+ after info ${1:id}\n\
+# Expr\n\
+snippet exp\n\
+ expr {${1:#expression here}}\n\
+# Switch\n\
+snippet sw\n\
+ switch ${1:var} {\n\
+ ${3:pattern 1} {\n\
+ ${4:#do something}\n\
+ }\n\
+ default {\n\
+ ${2:#do something}\n\
+ }\n\
+ }\n\
+# Case\n\
+snippet ca\n\
+ ${1:pattern} {\n\
+ ${2:#do something}\n\
+ }${3}\n\
+# Namespace eval\n\
+snippet ns\n\
+ namespace eval ${1:path} {${2:#script...}}\n\
+# Namespace current\n\
+snippet nsc\n\
+ namespace current\n\
+";
+exports.scope = "tcl";
+
+});
diff --git a/lib/client/edit/snippets/tex.js b/lib/client/edit/snippets/tex.js
new file mode 100644
index 00000000..ce490778
--- /dev/null
+++ b/lib/client/edit/snippets/tex.js
@@ -0,0 +1,197 @@
+ace.define('ace/snippets/tex', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "#PREAMBLE\n\
+#newcommand\n\
+snippet nc\n\
+ \\newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}}${4}\n\
+#usepackage\n\
+snippet up\n\
+ \\usepackage[${1:[options}]{${2:package}}\n\
+#newunicodechar\n\
+snippet nuc\n\
+ \\newunicodechar{${1}}{${2:\\ensuremath}${3:tex-substitute}}}\n\
+#DeclareMathOperator\n\
+snippet dmo\n\
+ \\DeclareMathOperator{${1}}{${2}}\n\
+\n\
+#DOCUMENT\n\
+# \\begin{}...\\end{}\n\
+snippet begin\n\
+ \\begin{${1:env}}\n\
+ ${2}\n\
+ \\end{$1}\n\
+# Tabular\n\
+snippet tab\n\
+ \\begin{${1:tabular}}{${2:c}}\n\
+ ${3}\n\
+ \\end{$1}\n\
+snippet thm\n\
+ \\begin[${1:author}]{${2:thm}}\n\
+ ${3}\n\
+ \\end{$1}\n\
+snippet center\n\
+ \\begin{center}\n\
+ ${1}\n\
+ \\end{center}\n\
+# Align(ed)\n\
+snippet ali\n\
+ \\begin{align${1:ed}}\n\
+ ${2}\n\
+ \\end{align$1}\n\
+# Gather(ed)\n\
+snippet gat\n\
+ \\begin{gather${1:ed}}\n\
+ ${2}\n\
+ \\end{gather$1}\n\
+# Equation\n\
+snippet eq\n\
+ \\begin{equation}\n\
+ ${1}\n\
+ \\end{equation}\n\
+# Equation\n\
+snippet eq*\n\
+ \\begin{equation*}\n\
+ ${1}\n\
+ \\end{equation*}\n\
+# Unnumbered Equation\n\
+snippet \\\n\
+ \\[\n\
+ ${1}\n\
+ \\]\n\
+# Enumerate\n\
+snippet enum\n\
+ \\begin{enumerate}\n\
+ \\item ${1}\n\
+ \\end{enumerate}\n\
+# Itemize\n\
+snippet itemize\n\
+ \\begin{itemize}\n\
+ \\item ${1}\n\
+ \\end{itemize}\n\
+# Description\n\
+snippet desc\n\
+ \\begin{description}\n\
+ \\item[${1}] ${2}\n\
+ \\end{description}\n\
+# Matrix\n\
+snippet mat\n\
+ \\begin{${1:p/b/v/V/B/small}matrix}\n\
+ ${2}\n\
+ \\end{$1matrix}\n\
+# Cases\n\
+snippet cas\n\
+ \\begin{cases}\n\
+ ${1:equation}, &\\text{ if }${2:case}\\\\\n\
+ ${3}\n\
+ \\end{cases}\n\
+# Split\n\
+snippet spl\n\
+ \\begin{split}\n\
+ ${1}\n\
+ \\end{split}\n\
+# Part\n\
+snippet part\n\
+ \\part{${1:part name}} % (fold)\n\
+ \\label{prt:${2:$1}}\n\
+ ${3}\n\
+ % part $2 (end)\n\
+# Chapter\n\
+snippet cha\n\
+ \\chapter{${1:chapter name}}\n\
+ \\label{cha:${2:$1}}\n\
+ ${3}\n\
+# Section\n\
+snippet sec\n\
+ \\section{${1:section name}}\n\
+ \\label{sec:${2:$1}}\n\
+ ${3}\n\
+# Sub Section\n\
+snippet sub\n\
+ \\subsection{${1:subsection name}}\n\
+ \\label{sub:${2:$1}}\n\
+ ${3}\n\
+# Sub Sub Section\n\
+snippet subs\n\
+ \\subsubsection{${1:subsubsection name}}\n\
+ \\label{ssub:${2:$1}}\n\
+ ${3}\n\
+# Paragraph\n\
+snippet par\n\
+ \\paragraph{${1:paragraph name}}\n\
+ \\label{par:${2:$1}}\n\
+ ${3}\n\
+# Sub Paragraph\n\
+snippet subp\n\
+ \\subparagraph{${1:subparagraph name}}\n\
+ \\label{subp:${2:$1}}\n\
+ ${3}\n\
+#References\n\
+snippet itd\n\
+ \\item[${1:description}] ${2:item}\n\
+snippet figure\n\
+ ${1:Figure}~\\ref{${2:fig:}}${3}\n\
+snippet table\n\
+ ${1:Table}~\\ref{${2:tab:}}${3}\n\
+snippet listing\n\
+ ${1:Listing}~\\ref{${2:list}}${3}\n\
+snippet section\n\
+ ${1:Section}~\\ref{${2:sec:}}${3}\n\
+snippet page\n\
+ ${1:page}~\\pageref{${2}}${3}\n\
+snippet index\n\
+ \\index{${1:index}}${2}\n\
+#Citations\n\
+snippet cite\n\
+ \\cite[${1}]{${2}}${3}\n\
+snippet fcite\n\
+ \\footcite[${1}]{${2}}${3}\n\
+#Formating text: italic, bold, underline, small capital, emphase ..\n\
+snippet it\n\
+ \\textit{${1:text}}\n\
+snippet bf\n\
+ \\textbf{${1:text}}\n\
+snippet under\n\
+ \\underline{${1:text}}\n\
+snippet emp\n\
+ \\emph{${1:text}}\n\
+snippet sc\n\
+ \\textsc{${1:text}}\n\
+#Choosing font\n\
+snippet sf\n\
+ \\textsf{${1:text}}\n\
+snippet rm\n\
+ \\textrm{${1:text}}\n\
+snippet tt\n\
+ \\texttt{${1:text}}\n\
+#misc\n\
+snippet ft\n\
+ \\footnote{${1:text}}\n\
+snippet fig\n\
+ \\begin{figure}\n\
+ \\begin{center}\n\
+ \\includegraphics[scale=${1}]{Figures/${2}}\n\
+ \\end{center}\n\
+ \\caption{${3}}\n\
+ \\label{fig:${4}}\n\
+ \\end{figure}\n\
+snippet tikz\n\
+ \\begin{figure}\n\
+ \\begin{center}\n\
+ \\begin{tikzpicture}[scale=${1:1}]\n\
+ ${2}\n\
+ \\end{tikzpicture}\n\
+ \\end{center}\n\
+ \\caption{${3}}\n\
+ \\label{fig:${4}}\n\
+ \\end{figure}\n\
+#math\n\
+snippet stackrel\n\
+ \\stackrel{${1:above}}{${2:below}} ${3}\n\
+snippet frac\n\
+ \\frac{${1:num}}{${2:denom}}\n\
+snippet sum\n\
+ \\sum^{${1:n}}_{${2:i=1}}{${3}}";
+exports.scope = "tex";
+
+});
diff --git a/lib/client/edit/snippets/text.js b/lib/client/edit/snippets/text.js
new file mode 100644
index 00000000..0834cfca
--- /dev/null
+++ b/lib/client/edit/snippets/text.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/text', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "text";
+
+});
diff --git a/lib/client/edit/snippets/textile.js b/lib/client/edit/snippets/textile.js
new file mode 100644
index 00000000..106849b7
--- /dev/null
+++ b/lib/client/edit/snippets/textile.js
@@ -0,0 +1,37 @@
+ace.define('ace/snippets/textile', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "# Jekyll post header\n\
+snippet header\n\
+ ---\n\
+ title: ${1:title}\n\
+ layout: post\n\
+ date: ${2:date} ${3:hour:minute:second} -05:00\n\
+ ---\n\
+\n\
+# Image\n\
+snippet img\n\
+ !${1:url}(${2:title}):${3:link}!\n\
+\n\
+# Table\n\
+snippet |\n\
+ |${1}|${2}\n\
+\n\
+# Link\n\
+snippet link\n\
+ \"${1:link text}\":${2:url}\n\
+\n\
+# Acronym\n\
+snippet (\n\
+ (${1:Expand acronym})${2}\n\
+\n\
+# Footnote\n\
+snippet fn\n\
+ [${1:ref number}] ${3}\n\
+\n\
+ fn$1. ${2:footnote}\n\
+ \n\
+";
+exports.scope = "textile";
+
+});
diff --git a/lib/client/edit/snippets/typescript.js b/lib/client/edit/snippets/typescript.js
new file mode 100644
index 00000000..0c0affd4
--- /dev/null
+++ b/lib/client/edit/snippets/typescript.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/typescript', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "typescript";
+
+});
diff --git a/lib/client/edit/snippets/xml.js b/lib/client/edit/snippets/xml.js
new file mode 100644
index 00000000..d26f8fdf
--- /dev/null
+++ b/lib/client/edit/snippets/xml.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/xml', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "xml";
+
+});
diff --git a/lib/client/edit/snippets/yaml.js b/lib/client/edit/snippets/yaml.js
new file mode 100644
index 00000000..1c2df806
--- /dev/null
+++ b/lib/client/edit/snippets/yaml.js
@@ -0,0 +1,7 @@
+ace.define('ace/snippets/yaml', ['require', 'exports', 'module' ], function(require, exports, module) {
+
+
+exports.snippetText = "";
+exports.scope = "yaml";
+
+});
diff --git a/lib/client/edit/worker-javascript.js b/lib/client/edit/worker-javascript.js
index 8beac737..08d7e996 100644
--- a/lib/client/edit/worker-javascript.js
+++ b/lib/client/edit/worker-javascript.js
@@ -19,15 +19,15 @@ window.ace = window;
window.normalizeModule = function(parentId, moduleName) {
if (moduleName.indexOf("!") !== -1) {
var chunks = moduleName.split("!");
- return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);
+ return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);
}
if (moduleName.charAt(0) == ".") {
var base = parentId.split("/").slice(0, -1).join("/");
- moduleName = base + "/" + moduleName;
+ moduleName = (base ? base + "/" : "") + moduleName;
while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
var previous = moduleName;
- moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
+ moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
}
}
@@ -42,9 +42,9 @@ window.require = function(parentId, id) {
if (!id.charAt)
throw new Error("worker.js require() accepts only (parentId, id) as arguments");
- id = normalizeModule(parentId, id);
+ id = window.normalizeModule(parentId, id);
- var module = require.modules[id];
+ var module = window.require.modules[id];
if (module) {
if (!module.initialized) {
module.initialized = true;
@@ -54,47 +54,60 @@ window.require = function(parentId, id) {
}
var chunks = id.split("/");
- chunks[0] = require.tlns[chunks[0]] || chunks[0];
+ if (!window.require.tlns)
+ return console.log("unable to load " + id);
+ chunks[0] = window.require.tlns[chunks[0]] || chunks[0];
var path = chunks.join("/") + ".js";
- require.id = id;
+ window.require.id = id;
importScripts(path);
- return require(parentId, id);
+ return window.require(parentId, id);
};
-
-require.modules = {};
-require.tlns = {};
+window.require.modules = {};
+window.require.tlns = {};
window.define = function(id, deps, factory) {
if (arguments.length == 2) {
factory = deps;
if (typeof id != "string") {
deps = id;
- id = require.id;
+ id = window.require.id;
}
} else if (arguments.length == 1) {
factory = id;
- id = require.id;
+ deps = []
+ id = window.require.id;
}
+ if (!deps.length)
+ deps = ['require', 'exports', 'module']
+
if (id.indexOf("text!") === 0)
return;
- var req = function(deps, factory) {
- return require(id, deps, factory);
+ var req = function(childId) {
+ return window.require(id, childId);
};
- require.modules[id] = {
+ window.require.modules[id] = {
exports: {},
factory: function() {
var module = this;
- var returnExports = factory(req, module.exports, module);
+ var returnExports = factory.apply(this, deps.map(function(dep) {
+ switch(dep) {
+ case 'require': return req
+ case 'exports': return module.exports
+ case 'module': return module
+ default: return req(dep)
+ }
+ }));
if (returnExports)
module.exports = returnExports;
return module;
}
};
};
+window.define.amd = {}
window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
require.tlns = topLevelNamespaces;
@@ -102,8 +115,8 @@ window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
window.initSender = function initSender() {
- var EventEmitter = require("ace/lib/event_emitter").EventEmitter;
- var oop = require("ace/lib/oop");
+ var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;
+ var oop = window.require("ace/lib/oop");
var Sender = function() {};
@@ -154,158 +167,7 @@ window.onmessage = function(e) {
sender._emit(msg.event, msg.data);
}
};
-})(this);
-
-ace.define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {
-
-
-var EventEmitter = {};
-var stopPropagation = function() { this.propagationStopped = true; };
-var preventDefault = function() { this.defaultPrevented = true; };
-
-EventEmitter._emit =
-EventEmitter._dispatchEvent = function(eventName, e) {
- this._eventRegistry || (this._eventRegistry = {});
- this._defaultHandlers || (this._defaultHandlers = {});
-
- var listeners = this._eventRegistry[eventName] || [];
- var defaultHandler = this._defaultHandlers[eventName];
- if (!listeners.length && !defaultHandler)
- return;
-
- if (typeof e != "object" || !e)
- e = {};
-
- if (!e.type)
- e.type = eventName;
- if (!e.stopPropagation)
- e.stopPropagation = stopPropagation;
- if (!e.preventDefault)
- e.preventDefault = preventDefault;
-
- for (var i=0; i 2;
+ if (obj == null) obj = [];
+ if (nativeReduce && obj.reduce === nativeReduce) {
+ if (context) iterator = _.bind(iterator, context);
+ return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+ }
+ each(obj, function(value, index, list) {
+ if (!initial) {
+ memo = value;
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, value, index, list);
+ }
+ });
+ if (!initial) throw new TypeError(reduceError);
+ return memo;
+ };
+ _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+ var initial = arguments.length > 2;
+ if (obj == null) obj = [];
+ if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+ if (context) iterator = _.bind(iterator, context);
+ return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+ }
+ var length = obj.length;
+ if (length !== +length) {
+ var keys = _.keys(obj);
+ length = keys.length;
+ }
+ each(obj, function(value, index, list) {
+ index = keys ? keys[--length] : --length;
+ if (!initial) {
+ memo = obj[index];
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, obj[index], index, list);
+ }
+ });
+ if (!initial) throw new TypeError(reduceError);
+ return memo;
+ };
+ _.find = _.detect = function(obj, iterator, context) {
+ var result;
+ any(obj, function(value, index, list) {
+ if (iterator.call(context, value, index, list)) {
+ result = value;
+ return true;
+ }
+ });
+ return result;
+ };
+ _.filter = _.select = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null) return results;
+ if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+ each(obj, function(value, index, list) {
+ if (iterator.call(context, value, index, list)) results[results.length] = value;
+ });
+ return results;
+ };
+ _.reject = function(obj, iterator, context) {
+ return _.filter(obj, function(value, index, list) {
+ return !iterator.call(context, value, index, list);
+ }, context);
+ };
+ _.every = _.all = function(obj, iterator, context) {
+ iterator || (iterator = _.identity);
+ var result = true;
+ if (obj == null) return result;
+ if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+ each(obj, function(value, index, list) {
+ if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+ });
+ return !!result;
+ };
+ var any = _.some = _.any = function(obj, iterator, context) {
+ iterator || (iterator = _.identity);
+ var result = false;
+ if (obj == null) return result;
+ if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+ each(obj, function(value, index, list) {
+ if (result || (result = iterator.call(context, value, index, list))) return breaker;
+ });
+ return !!result;
+ };
+ _.contains = _.include = function(obj, target) {
+ if (obj == null) return false;
+ if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+ return any(obj, function(value) {
+ return value === target;
+ });
+ };
+ _.invoke = function(obj, method) {
+ var args = slice.call(arguments, 2);
+ var isFunc = _.isFunction(method);
+ return _.map(obj, function(value) {
+ return (isFunc ? method : value[method]).apply(value, args);
+ });
+ };
+ _.pluck = function(obj, key) {
+ return _.map(obj, function(value){ return value[key]; });
+ };
+ _.where = function(obj, attrs, first) {
+ if (_.isEmpty(attrs)) return first ? null : [];
+ return _[first ? 'find' : 'filter'](obj, function(value) {
+ for (var key in attrs) {
+ if (attrs[key] !== value[key]) return false;
+ }
+ return true;
+ });
+ };
+ _.findWhere = function(obj, attrs) {
+ return _.where(obj, attrs, true);
+ };
+ _.max = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.max.apply(Math, obj);
+ }
+ if (!iterator && _.isEmpty(obj)) return -Infinity;
+ var result = {computed : -Infinity, value: -Infinity};
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ computed >= result.computed && (result = {value : value, computed : computed});
+ });
+ return result.value;
+ };
+ _.min = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.min.apply(Math, obj);
+ }
+ if (!iterator && _.isEmpty(obj)) return Infinity;
+ var result = {computed : Infinity, value: Infinity};
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ computed < result.computed && (result = {value : value, computed : computed});
+ });
+ return result.value;
+ };
+ _.shuffle = function(obj) {
+ var rand;
+ var index = 0;
+ var shuffled = [];
+ each(obj, function(value) {
+ rand = _.random(index++);
+ shuffled[index - 1] = shuffled[rand];
+ shuffled[rand] = value;
+ });
+ return shuffled;
+ };
+ var lookupIterator = function(value) {
+ return _.isFunction(value) ? value : function(obj){ return obj[value]; };
+ };
+ _.sortBy = function(obj, value, context) {
+ var iterator = lookupIterator(value);
+ return _.pluck(_.map(obj, function(value, index, list) {
+ return {
+ value : value,
+ index : index,
+ criteria : iterator.call(context, value, index, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index < right.index ? -1 : 1;
+ }), 'value');
+ };
+ var group = function(obj, value, context, behavior) {
+ var result = {};
+ var iterator = lookupIterator(value || _.identity);
+ each(obj, function(value, index) {
+ var key = iterator.call(context, value, index, obj);
+ behavior(result, key, value);
+ });
+ return result;
+ };
+ _.groupBy = function(obj, value, context) {
+ return group(obj, value, context, function(result, key, value) {
+ (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
+ });
+ };
+ _.countBy = function(obj, value, context) {
+ return group(obj, value, context, function(result, key) {
+ if (!_.has(result, key)) result[key] = 0;
+ result[key]++;
+ });
+ };
+ _.sortedIndex = function(array, obj, iterator, context) {
+ iterator = iterator == null ? _.identity : lookupIterator(iterator);
+ var value = iterator.call(context, obj);
+ var low = 0, high = array.length;
+ while (low < high) {
+ var mid = (low + high) >>> 1;
+ iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
+ }
+ return low;
+ };
+ _.toArray = function(obj) {
+ if (!obj) return [];
+ if (_.isArray(obj)) return slice.call(obj);
+ if (obj.length === +obj.length) return _.map(obj, _.identity);
+ return _.values(obj);
+ };
+ _.size = function(obj) {
+ if (obj == null) return 0;
+ return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
+ };
+ _.first = _.head = _.take = function(array, n, guard) {
+ if (array == null) return void 0;
+ return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+ };
+ _.initial = function(array, n, guard) {
+ return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+ };
+ _.last = function(array, n, guard) {
+ if (array == null) return void 0;
+ if ((n != null) && !guard) {
+ return slice.call(array, Math.max(array.length - n, 0));
+ } else {
+ return array[array.length - 1];
+ }
+ };
+ _.rest = _.tail = _.drop = function(array, n, guard) {
+ return slice.call(array, (n == null) || guard ? 1 : n);
+ };
+ _.compact = function(array) {
+ return _.filter(array, _.identity);
+ };
+ var flatten = function(input, shallow, output) {
+ each(input, function(value) {
+ if (_.isArray(value)) {
+ shallow ? push.apply(output, value) : flatten(value, shallow, output);
+ } else {
+ output.push(value);
+ }
+ });
+ return output;
+ };
+ _.flatten = function(array, shallow) {
+ return flatten(array, shallow, []);
+ };
+ _.without = function(array) {
+ return _.difference(array, slice.call(arguments, 1));
+ };
+ _.uniq = _.unique = function(array, isSorted, iterator, context) {
+ if (_.isFunction(isSorted)) {
+ context = iterator;
+ iterator = isSorted;
+ isSorted = false;
+ }
+ var initial = iterator ? _.map(array, iterator, context) : array;
+ var results = [];
+ var seen = [];
+ each(initial, function(value, index) {
+ if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
+ seen.push(value);
+ results.push(array[index]);
+ }
+ });
+ return results;
+ };
+ _.union = function() {
+ return _.uniq(concat.apply(ArrayProto, arguments));
+ };
+ _.intersection = function(array) {
+ var rest = slice.call(arguments, 1);
+ return _.filter(_.uniq(array), function(item) {
+ return _.every(rest, function(other) {
+ return _.indexOf(other, item) >= 0;
+ });
+ });
+ };
+ _.difference = function(array) {
+ var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
+ return _.filter(array, function(value){ return !_.contains(rest, value); });
+ };
+ _.zip = function() {
+ var args = slice.call(arguments);
+ var length = _.max(_.pluck(args, 'length'));
+ var results = new Array(length);
+ for (var i = 0; i < length; i++) {
+ results[i] = _.pluck(args, "" + i);
+ }
+ return results;
+ };
+ _.object = function(list, values) {
+ if (list == null) return {};
+ var result = {};
+ for (var i = 0, l = list.length; i < l; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ };
+ _.indexOf = function(array, item, isSorted) {
+ if (array == null) return -1;
+ var i = 0, l = array.length;
+ if (isSorted) {
+ if (typeof isSorted == 'number') {
+ i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
+ } else {
+ i = _.sortedIndex(array, item);
+ return array[i] === item ? i : -1;
+ }
+ }
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
+ for (; i < l; i++) if (array[i] === item) return i;
+ return -1;
+ };
+ _.lastIndexOf = function(array, item, from) {
+ if (array == null) return -1;
+ var hasIndex = from != null;
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
+ return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+ }
+ var i = (hasIndex ? from : array.length);
+ while (i--) if (array[i] === item) return i;
+ return -1;
+ };
+ _.range = function(start, stop, step) {
+ if (arguments.length <= 1) {
+ stop = start || 0;
+ start = 0;
+ }
+ step = arguments[2] || 1;
- if (canSetImmediate) {
- return function (f) { return window.setImmediate(f) };
+ var len = Math.max(Math.ceil((stop - start) / step), 0);
+ var idx = 0;
+ var range = new Array(len);
+
+ while(idx < len) {
+ range[idx++] = start;
+ start += step;
}
- if (canPost) {
- var queue = [];
- window.addEventListener('message', function (ev) {
- if (ev.source === window && ev.data === 'process-tick') {
- ev.stopPropagation();
- if (queue.length > 0) {
- var fn = queue.shift();
- fn();
- }
- }
- }, true);
-
- return function nextTick(fn) {
- queue.push(fn);
- window.postMessage('process-tick', '*');
- };
- }
-
- return function nextTick(fn) {
- setTimeout(fn, 0);
+ return range;
+ };
+ _.bind = function(func, context) {
+ if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+ var args = slice.call(arguments, 2);
+ return function() {
+ return func.apply(context, args.concat(slice.call(arguments)));
};
-})();
+ };
+ _.partial = function(func) {
+ var args = slice.call(arguments, 1);
+ return function() {
+ return func.apply(this, args.concat(slice.call(arguments)));
+ };
+ };
+ _.bindAll = function(obj) {
+ var funcs = slice.call(arguments, 1);
+ if (funcs.length === 0) funcs = _.functions(obj);
+ each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+ return obj;
+ };
+ _.memoize = function(func, hasher) {
+ var memo = {};
+ hasher || (hasher = _.identity);
+ return function() {
+ var key = hasher.apply(this, arguments);
+ return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+ };
+ };
+ _.delay = function(func, wait) {
+ var args = slice.call(arguments, 2);
+ return setTimeout(function(){ return func.apply(null, args); }, wait);
+ };
+ _.defer = function(func) {
+ return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+ };
+ _.throttle = function(func, wait) {
+ var context, args, timeout, result;
+ var previous = 0;
+ var later = function() {
+ previous = new Date;
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ };
+ _.debounce = function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments;
+ var later = function() {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ };
+ var callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) result = func.apply(context, args);
+ return result;
+ };
+ };
+ _.once = function(func) {
+ var ran = false, memo;
+ return function() {
+ if (ran) return memo;
+ ran = true;
+ memo = func.apply(this, arguments);
+ func = null;
+ return memo;
+ };
+ };
+ _.wrap = function(func, wrapper) {
+ return function() {
+ var args = [func];
+ push.apply(args, arguments);
+ return wrapper.apply(this, args);
+ };
+ };
+ _.compose = function() {
+ var funcs = arguments;
+ return function() {
+ var args = arguments;
+ for (var i = funcs.length - 1; i >= 0; i--) {
+ args = [funcs[i].apply(this, args)];
+ }
+ return args[0];
+ };
+ };
+ _.after = function(times, func) {
+ if (times <= 0) return func();
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ };
+ _.keys = nativeKeys || function(obj) {
+ if (obj !== Object(obj)) throw new TypeError('Invalid object');
+ var keys = [];
+ for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
+ return keys;
+ };
+ _.values = function(obj) {
+ var values = [];
+ for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
+ return values;
+ };
+ _.pairs = function(obj) {
+ var pairs = [];
+ for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
+ return pairs;
+ };
+ _.invert = function(obj) {
+ var result = {};
+ for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
+ return result;
+ };
+ _.functions = _.methods = function(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (_.isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+ };
+ _.extend = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ if (source) {
+ for (var prop in source) {
+ obj[prop] = source[prop];
+ }
+ }
+ });
+ return obj;
+ };
+ _.pick = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ each(keys, function(key) {
+ if (key in obj) copy[key] = obj[key];
+ });
+ return copy;
+ };
+ _.omit = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ for (var key in obj) {
+ if (!_.contains(keys, key)) copy[key] = obj[key];
+ }
+ return copy;
+ };
+ _.defaults = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ if (source) {
+ for (var prop in source) {
+ if (obj[prop] == null) obj[prop] = source[prop];
+ }
+ }
+ });
+ return obj;
+ };
+ _.clone = function(obj) {
+ if (!_.isObject(obj)) return obj;
+ return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+ };
+ _.tap = function(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ };
+ var eq = function(a, b, aStack, bStack) {
+ if (a === b) return a !== 0 || 1 / a == 1 / b;
+ if (a == null || b == null) return a === b;
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ var className = toString.call(a);
+ if (className != toString.call(b)) return false;
+ switch (className) {
+ case '[object String]':
+ return a == String(b);
+ case '[object Number]':
+ return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+ case '[object Date]':
+ case '[object Boolean]':
+ return +a == +b;
+ case '[object RegExp]':
+ return a.source == b.source &&
+ a.global == b.global &&
+ a.multiline == b.multiline &&
+ a.ignoreCase == b.ignoreCase;
+ }
+ if (typeof a != 'object' || typeof b != 'object') return false;
+ var length = aStack.length;
+ while (length--) {
+ if (aStack[length] == a) return bStack[length] == b;
+ }
+ aStack.push(a);
+ bStack.push(b);
+ var size = 0, result = true;
+ if (className == '[object Array]') {
+ size = a.length;
+ result = size == b.length;
+ if (result) {
+ while (size--) {
+ if (!(result = eq(a[size], b[size], aStack, bStack))) break;
+ }
+ }
+ } else {
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
+ _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
+ return false;
+ }
+ for (var key in a) {
+ if (_.has(a, key)) {
+ size++;
+ if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
+ }
+ }
+ if (result) {
+ for (key in b) {
+ if (_.has(b, key) && !(size--)) break;
+ }
+ result = !size;
+ }
+ }
+ aStack.pop();
+ bStack.pop();
+ return result;
+ };
+ _.isEqual = function(a, b) {
+ return eq(a, b, [], []);
+ };
+ _.isEmpty = function(obj) {
+ if (obj == null) return true;
+ if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+ for (var key in obj) if (_.has(obj, key)) return false;
+ return true;
+ };
+ _.isElement = function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ };
+ _.isArray = nativeIsArray || function(obj) {
+ return toString.call(obj) == '[object Array]';
+ };
+ _.isObject = function(obj) {
+ return obj === Object(obj);
+ };
+ each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+ _['is' + name] = function(obj) {
+ return toString.call(obj) == '[object ' + name + ']';
+ };
+ });
+ if (!_.isArguments(arguments)) {
+ _.isArguments = function(obj) {
+ return !!(obj && _.has(obj, 'callee'));
+ };
+ }
+ if (typeof (/./) !== 'function') {
+ _.isFunction = function(obj) {
+ return typeof obj === 'function';
+ };
+ }
+ _.isFinite = function(obj) {
+ return isFinite(obj) && !isNaN(parseFloat(obj));
+ };
+ _.isNaN = function(obj) {
+ return _.isNumber(obj) && obj != +obj;
+ };
+ _.isBoolean = function(obj) {
+ return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+ };
+ _.isNull = function(obj) {
+ return obj === null;
+ };
+ _.isUndefined = function(obj) {
+ return obj === void 0;
+ };
+ _.has = function(obj, key) {
+ return hasOwnProperty.call(obj, key);
+ };
+ _.noConflict = function() {
+ root._ = previousUnderscore;
+ return this;
+ };
+ _.identity = function(value) {
+ return value;
+ };
+ _.times = function(n, iterator, context) {
+ var accum = Array(n);
+ for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+ return accum;
+ };
+ _.random = function(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+ };
+ var entityMap = {
+ escape: {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '/': '/'
+ }
+ };
+ entityMap.unescape = _.invert(entityMap.escape);
+ var entityRegexes = {
+ escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
+ unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+ };
+ _.each(['escape', 'unescape'], function(method) {
+ _[method] = function(string) {
+ if (string == null) return '';
+ return ('' + string).replace(entityRegexes[method], function(match) {
+ return entityMap[method][match];
+ });
+ };
+ });
+ _.result = function(object, property) {
+ if (object == null) return null;
+ var value = object[property];
+ return _.isFunction(value) ? value.call(object) : value;
+ };
+ _.mixin = function(obj) {
+ each(_.functions(obj), function(name){
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return result.call(this, func.apply(_, args));
+ };
+ });
+ };
+ var idCounter = 0;
+ _.uniqueId = function(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+ };
+ _.templateSettings = {
+ evaluate : /<%([\s\S]+?)%>/g,
+ interpolate : /<%=([\s\S]+?)%>/g,
+ escape : /<%-([\s\S]+?)%>/g
+ };
+ var noMatch = /(.)^/;
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\t': 't',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
+ var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+ _.template = function(text, data, settings) {
+ var render;
+ settings = _.defaults({}, settings, _.templateSettings);
+ var matcher = new RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset)
+ .replace(escaper, function(match) { return '\\' + escapes[match]; });
-process.binding = function (name) {
- throw new Error('process.binding is not supported');
-}
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
-};
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ }
+ if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ }
+ if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+ index = offset + match.length;
+ return match;
+ });
+ source += "';\n";
+ if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + "return __p;\n";
+
+ try {
+ render = new Function(settings.variable || 'obj', '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ if (data) return render(data, _);
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+ template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+
+ return template;
+ };
+ _.chain = function(obj) {
+ return _(obj).chain();
+ };
+ var result = function(obj) {
+ return this._chain ? _(obj).chain() : obj;
+ };
+ _.mixin(_);
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ method.apply(obj, arguments);
+ if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
+ return result.call(this, obj);
+ };
+ });
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ return result.call(this, method.apply(this._wrapped, arguments));
+ };
+ });
+
+ _.extend(_.prototype, {
+ chain: function() {
+ this._chain = true;
+ return this;
+ },
+ value: function() {
+ return this._wrapped;
+ }
+
+ });
+
+}).call(this);
},
{}],
2:[function(req,module,exports){
-(function(process){if (!process.EventEmitter) process.EventEmitter = function () {};
-var EventEmitter = exports.EventEmitter = process.EventEmitter;
-var isArray = typeof Array.isArray === 'function'
- ? Array.isArray
- : function (xs) {
- return Object.prototype.toString.call(xs) === '[object Array]'
- }
-;
-function indexOf (xs, x) {
- if (xs.indexOf) return xs.indexOf(x);
- for (var i = 0; i < xs.length; i++) {
- if (x === xs[i]) return i;
- }
- return -1;
-}
-var defaultMaxListeners = 200;
-EventEmitter.prototype.setMaxListeners = function(n) {
- if (!this._events) this._events = {};
- this._events.maxListeners = n;
+
+var _ = req("underscore");
+
+var errors = {
+ E001: "Bad option: '{a}'.",
+ E002: "Bad option value.",
+ E003: "Expected a JSON value.",
+ E004: "Input is neither a string nor an array of strings.",
+ E005: "Input is empty.",
+ E006: "Unexpected early end of program.",
+ E007: "Missing \"use strict\" statement.",
+ E008: "Strict violation.",
+ E009: "Option 'validthis' can't be used in a global scope.",
+ E010: "'with' is not allowed in strict mode.",
+ E011: "const '{a}' has already been declared.",
+ E012: "const '{a}' is initialized to 'undefined'.",
+ E013: "Attempting to override '{a}' which is a constant.",
+ E014: "A regular expression literal can be confused with '/='.",
+ E015: "Unclosed regular expression.",
+ E016: "Invalid regular expression.",
+ E017: "Unclosed comment.",
+ E018: "Unbegun comment.",
+ E019: "Unmatched '{a}'.",
+ E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
+ E021: "Expected '{a}' and instead saw '{b}'.",
+ E022: "Line breaking error '{a}'.",
+ E023: "Missing '{a}'.",
+ E024: "Unexpected '{a}'.",
+ E025: "Missing ':' on a case clause.",
+ E026: "Missing '}' to match '{' from line {a}.",
+ E027: "Missing ']' to match '[' form line {a}.",
+ E028: "Illegal comma.",
+ E029: "Unclosed string.",
+ E030: "Expected an identifier and instead saw '{a}'.",
+ E031: "Bad assignment.", // FIXME: Rephrase
+ E032: "Expected a small integer or 'false' and instead saw '{a}'.",
+ E033: "Expected an operator and instead saw '{a}'.",
+ E034: "get/set are ES5 features.",
+ E035: "Missing property name.",
+ E036: "Expected to see a statement and instead saw a block.",
+ E037: null, // Vacant
+ E038: null, // Vacant
+ E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
+ E040: "Each value should have its own case label.",
+ E041: "Unrecoverable syntax error.",
+ E042: "Stopping.",
+ E043: "Too many errors.",
+ E044: "'{a}' is already defined and can't be redefined.",
+ E045: "Invalid for each loop.",
+ E046: "A yield statement shall be within a generator function (with syntax: `function*`)",
+ E047: "A generator function shall contain a yield statement.",
+ E048: "Let declaration not directly within block.",
+ E049: "A {a} cannot be named '{b}'.",
+ E050: "Mozilla requires the yield expression to be parenthesized here.",
+ E051: "Regular parameters cannot come after default parameters."
};
-
-EventEmitter.prototype.emit = function(type) {
- if (type === 'error') {
- if (!this._events || !this._events.error ||
- (isArray(this._events.error) && !this._events.error.length))
- {
- if (arguments[1] instanceof Error) {
- throw arguments[1]; // Unhandled 'error' event
- } else {
- throw new Error("Uncaught, unspecified 'error' event.");
- }
- return false;
- }
- }
-
- if (!this._events) return false;
- var handler = this._events[type];
- if (!handler) return false;
-
- if (typeof handler == 'function') {
- switch (arguments.length) {
- case 1:
- handler.call(this);
- break;
- case 2:
- handler.call(this, arguments[1]);
- break;
- case 3:
- handler.call(this, arguments[1], arguments[2]);
- break;
- default:
- var args = Array.prototype.slice.call(arguments, 1);
- handler.apply(this, args);
- }
- return true;
-
- } else if (isArray(handler)) {
- var args = Array.prototype.slice.call(arguments, 1);
-
- var listeners = handler.slice();
- for (var i = 0, l = listeners.length; i < l; i++) {
- listeners[i].apply(this, args);
- }
- return true;
-
- } else {
- return false;
- }
-};
-EventEmitter.prototype.addListener = function(type, listener) {
- if ('function' !== typeof listener) {
- throw new Error('addListener only takes instances of Function');
- }
-
- if (!this._events) this._events = {};
- this.emit('newListener', type, listener);
-
- if (!this._events[type]) {
- this._events[type] = listener;
- } else if (isArray(this._events[type])) {
- if (!this._events[type].warned) {
- var m;
- if (this._events.maxListeners !== undefined) {
- m = this._events.maxListeners;
- } else {
- m = defaultMaxListeners;
- }
-
- if (m && m > 0 && this._events[type].length > m) {
- this._events[type].warned = true;
- console.error('(node) warning: possible EventEmitter memory ' +
- 'leak detected. %d listeners added. ' +
- 'Use emitter.setMaxListeners() to increase limit.',
- this._events[type].length);
- console.trace();
- }
- }
- this._events[type].push(listener);
- } else {
- this._events[type] = [this._events[type], listener];
- }
-
- return this;
+var warnings = {
+ W001: "'hasOwnProperty' is a really bad name.",
+ W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
+ W003: "'{a}' was used before it was defined.",
+ W004: "'{a}' is already defined.",
+ W005: "A dot following a number can be confused with a decimal point.",
+ W006: "Confusing minuses.",
+ W007: "Confusing pluses.",
+ W008: "A leading decimal point can be confused with a dot: '{a}'.",
+ W009: "The array literal notation [] is preferrable.",
+ W010: "The object literal notation {} is preferrable.",
+ W011: "Unexpected space after '{a}'.",
+ W012: "Unexpected space before '{a}'.",
+ W013: "Missing space after '{a}'.",
+ W014: "Bad line breaking before '{a}'.",
+ W015: "Expected '{a}' to have an indentation at {b} instead at {c}.",
+ W016: "Unexpected use of '{a}'.",
+ W017: "Bad operand.",
+ W018: "Confusing use of '{a}'.",
+ W019: "Use the isNaN function to compare with NaN.",
+ W020: "Read only.",
+ W021: "'{a}' is a function.",
+ W022: "Do not assign to the exception parameter.",
+ W023: "Expected an identifier in an assignment and instead saw a function invocation.",
+ W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
+ W025: "Missing name in function declaration.",
+ W026: "Inner functions should be listed at the top of the outer function.",
+ W027: "Unreachable '{a}' after '{b}'.",
+ W028: "Label '{a}' on {b} statement.",
+ W030: "Expected an assignment or function call and instead saw an expression.",
+ W031: "Do not use 'new' for side effects.",
+ W032: "Unnecessary semicolon.",
+ W033: "Missing semicolon.",
+ W034: "Unnecessary directive \"{a}\".",
+ W035: "Empty block.",
+ W036: "Unexpected /*member '{a}'.",
+ W037: "'{a}' is a statement label.",
+ W038: "'{a}' used out of scope.",
+ W039: "'{a}' is not allowed.",
+ W040: "Possible strict violation.",
+ W041: "Use '{a}' to compare with '{b}'.",
+ W042: "Avoid EOL escaping.",
+ W043: "Bad escaping of EOL. Use option multistr if needed.",
+ W044: "Bad or unnecessary escaping.",
+ W045: "Bad number '{a}'.",
+ W046: "Don't use extra leading zeros '{a}'.",
+ W047: "A trailing decimal point can be confused with a dot: '{a}'.",
+ W048: "Unexpected control character in regular expression.",
+ W049: "Unexpected escaped character '{a}' in regular expression.",
+ W050: "JavaScript URL.",
+ W051: "Variables should not be deleted.",
+ W052: "Unexpected '{a}'.",
+ W053: "Do not use {a} as a constructor.",
+ W054: "The Function constructor is a form of eval.",
+ W055: "A constructor name should start with an uppercase letter.",
+ W056: "Bad constructor.",
+ W057: "Weird construction. Is 'new' unnecessary?",
+ W058: "Missing '()' invoking a constructor.",
+ W059: "Avoid arguments.{a}.",
+ W060: "document.write can be a form of eval.",
+ W061: "eval can be harmful.",
+ W062: "Wrap an immediate function invocation in parens " +
+ "to assist the reader in understanding that the expression " +
+ "is the result of a function, and not the function itself.",
+ W063: "Math is not a function.",
+ W064: "Missing 'new' prefix when invoking a constructor.",
+ W065: "Missing radix parameter.",
+ W066: "Implied eval. Consider passing a function instead of a string.",
+ W067: "Bad invocation.",
+ W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
+ W069: "['{a}'] is better written in dot notation.",
+ W070: "Extra comma. (it breaks older versions of IE)",
+ W071: "This function has too many statements. ({a})",
+ W072: "This function has too many parameters. ({a})",
+ W073: "Blocks are nested too deeply. ({a})",
+ W074: "This function's cyclomatic complexity is too high. ({a})",
+ W075: "Duplicate key '{a}'.",
+ W076: "Unexpected parameter '{a}' in get {b} function.",
+ W077: "Expected a single parameter in set {a} function.",
+ W078: "Setter is defined without getter.",
+ W079: "Redefinition of '{a}'.",
+ W080: "It's not necessary to initialize '{a}' to 'undefined'.",
+ W081: "Too many var statements.",
+ W082: "Function declarations should not be placed in blocks. " +
+ "Use a function expression or move the statement to the top of " +
+ "the outer function.",
+ W083: "Don't make functions within a loop.",
+ W084: "Assignment in conditional expression",
+ W085: "Don't use 'with'.",
+ W086: "Expected a 'break' statement before '{a}'.",
+ W087: "Forgotten 'debugger' statement?",
+ W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
+ W089: "The body of a for in should be wrapped in an if statement to filter " +
+ "unwanted properties from the prototype.",
+ W090: "'{a}' is not a statement label.",
+ W091: "'{a}' is out of scope.",
+ W092: "Wrap the /regexp/ literal in parens to disambiguate the slash operator.",
+ W093: "Did you mean to return a conditional instead of an assignment?",
+ W094: "Unexpected comma.",
+ W095: "Expected a string and instead saw {a}.",
+ W096: "The '{a}' key may produce unexpected results.",
+ W097: "Use the function form of \"use strict\".",
+ W098: "'{a}' is defined but never used.",
+ W099: "Mixed spaces and tabs.",
+ W100: "This character may get silently deleted by one or more browsers.",
+ W101: "Line is too long.",
+ W102: "Trailing whitespace.",
+ W103: "The '{a}' property is deprecated.",
+ W104: "'{a}' is only available in JavaScript 1.7.",
+ W105: "Unexpected {a} in '{b}'.",
+ W106: "Identifier '{a}' is not in camel case.",
+ W107: "Script URL.",
+ W108: "Strings must use doublequote.",
+ W109: "Strings must use singlequote.",
+ W110: "Mixed double and single quotes.",
+ W112: "Unclosed string.",
+ W113: "Control character in string: {a}.",
+ W114: "Avoid {a}.",
+ W115: "Octal literals are not allowed in strict mode.",
+ W116: "Expected '{a}' and instead saw '{b}'.",
+ W117: "'{a}' is not defined.",
+ W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
+ W119: "'{a}' is only available in ES6 (use esnext option).",
+ W120: "You might be leaking a variable ({a}) here."
};
-EventEmitter.prototype.on = EventEmitter.prototype.addListener;
-
-EventEmitter.prototype.once = function(type, listener) {
- var self = this;
- self.on(type, function g() {
- self.removeListener(type, g);
- listener.apply(this, arguments);
- });
-
- return this;
+var info = {
+ I001: "Comma warnings can be turned off with 'laxcomma'.",
+ I002: "Reserved words as properties can be used under the 'es5' option.",
+ I003: "ES5 option is now set per default"
};
-EventEmitter.prototype.removeListener = function(type, listener) {
- if ('function' !== typeof listener) {
- throw new Error('removeListener only takes instances of Function');
- }
- if (!this._events || !this._events[type]) return this;
+exports.errors = {};
+exports.warnings = {};
+exports.info = {};
- var list = this._events[type];
+_.each(errors, function (desc, code) {
+ exports.errors[code] = { code: code, desc: desc };
+});
- if (isArray(list)) {
- var i = indexOf(list, listener);
- if (i < 0) return this;
- list.splice(i, 1);
- if (list.length == 0)
- delete this._events[type];
- } else if (this._events[type] === listener) {
- delete this._events[type];
- }
+_.each(warnings, function (desc, code) {
+ exports.warnings[code] = { code: code, desc: desc };
+});
- return this;
-};
+_.each(info, function (desc, code) {
+ exports.info[code] = { code: code, desc: desc };
+});
-EventEmitter.prototype.removeAllListeners = function(type) {
- if (arguments.length === 0) {
- this._events = {};
- return this;
- }
- if (type && this._events && this._events[type]) this._events[type] = null;
- return this;
-};
-
-EventEmitter.prototype.listeners = function(type) {
- if (!this._events) this._events = {};
- if (!this._events[type]) this._events[type] = [];
- if (!isArray(this._events[type])) {
- this._events[type] = [this._events[type]];
- }
- return this._events[type];
-};
-
-})(req("__browserify_process"))
},
-{"__browserify_process":1}],
+{"underscore":1}],
3:[function(req,module,exports){
-(function(){// jshint -W001
exports.reservedVars = {
arguments : false,
@@ -2379,6 +3264,7 @@ exports.browser = {
clearTimeout : false,
close : false,
closed : false,
+ CustomEvent : false,
DataView : false,
DOMParser : false,
defaultStatus : false,
@@ -2458,6 +3344,7 @@ exports.browser = {
MessageChannel : false,
MessageEvent : false,
MessagePort : false,
+ MouseEvent : false,
moveBy : false,
moveTo : false,
MutationObserver : false,
@@ -2896,283 +3783,9 @@ exports.yui = {
};
-})()
},
{}],
-4:[function(req,module,exports){
-
-"use string";
-exports.unsafeString =
- /@cc|<\/?|script|\]\s*\]|<\s*!|</i;
-exports.unsafeChars =
- /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
-exports.needEsc =
- /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
-
-exports.needEscGlobal =
- /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-exports.starSlash = /\*\//;
-exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;
-exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i;
-exports.fallsThrough = /^\s*\/\*\s*falls?\sthrough\s*\*\/\s*$/;
-
-},
-{}],
-5:[function(req,module,exports){
-
-
-var state = {
- syntax: {},
-
- reset: function () {
- this.tokens = {
- prev: null,
- next: null,
- curr: null
- };
-
- this.option = {};
- this.ignored = {};
- this.directive = {};
- this.jsonMode = false;
- this.jsonWarnings = [];
- this.lines = [];
- this.tab = "";
- this.cache = {}; // Node.JS doesn't have Map. Sniff.
- }
-};
-
-exports.state = state;
-
-},
-{}],
-6:[function(req,module,exports){
-(function(){
-
-exports.register = function (linter) {
-
- linter.on("Identifier", function style_scanProto(data) {
- if (linter.getOption("proto")) {
- return;
- }
-
- if (data.name === "__proto__") {
- linter.warn("W103", {
- line: data.line,
- char: data.char,
- data: [ data.name ]
- });
- }
- });
-
- linter.on("Identifier", function style_scanIterator(data) {
- if (linter.getOption("iterator")) {
- return;
- }
-
- if (data.name === "__iterator__") {
- linter.warn("W104", {
- line: data.line,
- char: data.char,
- data: [ data.name ]
- });
- }
- });
-
- linter.on("Identifier", function style_scanDangling(data) {
- if (!linter.getOption("nomen")) {
- return;
- }
- if (data.name === "_") {
- return;
- }
- if (linter.getOption("node")) {
- if (/^(__dirname|__filename)$/.test(data.name) && !data.isProperty) {
- return;
- }
- }
-
- if (/^(_+.*|.*_+)$/.test(data.name)) {
- linter.warn("W105", {
- line: data.line,
- char: data.from,
- data: [ "dangling '_'", data.name ]
- });
- }
- });
-
- linter.on("Identifier", function style_scanCamelCase(data) {
- if (!linter.getOption("camelcase")) {
- return;
- }
-
- if (data.name.replace(/^_+/, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {
- linter.warn("W106", {
- line: data.line,
- char: data.from,
- data: [ data.name ]
- });
- }
- });
-
- linter.on("String", function style_scanQuotes(data) {
- var quotmark = linter.getOption("quotmark");
- var code;
-
- if (!quotmark) {
- return;
- }
-
- if (quotmark === "single" && data.quote !== "'") {
- code = "W109";
- }
-
- if (quotmark === "double" && data.quote !== "\"") {
- code = "W108";
- }
-
- if (quotmark === true) {
- if (!linter.getCache("quotmark")) {
- linter.setCache("quotmark", data.quote);
- }
-
- if (linter.getCache("quotmark") !== data.quote) {
- code = "W110";
- }
- }
-
- if (code) {
- linter.warn(code, {
- line: data.line,
- char: data.char,
- });
- }
- });
-
- linter.on("Number", function style_scanNumbers(data) {
- if (data.value.charAt(0) === ".") {
- linter.warn("W008", {
- line: data.line,
- char: data.char,
- data: [ data.value ]
- });
- }
-
- if (data.value.substr(data.value.length - 1) === ".") {
- linter.warn("W047", {
- line: data.line,
- char: data.char,
- data: [ data.value ]
- });
- }
-
- if (/^00+/.test(data.value)) {
- linter.warn("W046", {
- line: data.line,
- char: data.char,
- data: [ data.value ]
- });
- }
- });
-
- linter.on("String", function style_scanJavaScriptURLs(data) {
- var re = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i;
-
- if (linter.getOption("scripturl")) {
- return;
- }
-
- if (re.test(data.value)) {
- linter.warn("W107", {
- line: data.line,
- char: data.char
- });
- }
- });
-};
-})()
-},
-{}],
-7:[function(req,module,exports){
-(function(global){/*global window, global*/
-var functions = [
- [log, "log"]
- , [info, "info"]
- , [warn, "warn"]
- , [error, "error"]
- , [time, "time"]
- , [timeEnd, "timeEnd"]
- , [trace, "trace"]
- , [dir, "dir"]
- , [assert, "assert"]
-]
-
-for (var i = 0; i < functions.length; i++) {
- var tuple = functions[i]
- var f = tuple[0]
- var name = tuple[1]
-
- if (!console[name]) {
- console[name] = f
- }
-}
-
-module.exports = console
-
-function log() {}
-
-function info() {}
-
-function warn() {}
-
-function error() {}
-
-function time(label) {}
-
-function timeEnd(label) {}
-
-function trace() {}
-
-function dir(object) {}
-
-function assert(expression) {}
-
-})(window)
-},
-{}],
-"jshint":[function(req,module,exports){
-module.exports=req('E/GbHF');
-},
-{}],"E/GbHF":[function(req,module,exports){
-(function(){/*!
- * JSHint, by JSHint Community.
- *
- * This file (and this file only) is licensed under the same slightly modified
- * MIT license that JSLint is. It stops evil-doers everywhere:
- *
- * Copyright (c) 2002 Douglas Crockford (www.JSLint.com)
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * The Software shall be used for Good, not Evil.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
+"n4bKNg":[function(req,module,exports){
var _ = req("underscore");
var events = req("events");
@@ -3369,12 +3982,13 @@ var JSHINT = (function () {
if (!token.reserved) {
return false;
}
+ var meta = token.meta;
- if (token.meta && token.meta.isFutureReservedWord) {
- if (state.option.inES5(true) && !token.meta.es5) {
+ if (meta && meta.isFutureReservedWord && state.option.inES5()) {
+ if (!meta.es5) {
return false;
}
- if (token.meta.strictOnly) {
+ if (meta.strictOnly) {
if (!state.option.strict && !state.directive["use strict"]) {
return false;
}
@@ -3421,6 +4035,7 @@ var JSHINT = (function () {
if (state.option.shelljs) {
combine(predefined, vars.shelljs);
+ combine(predefined, vars.node);
}
if (state.option.phantom) {
@@ -3503,7 +4118,8 @@ var JSHINT = (function () {
line: line,
character: chr,
message: message + " (" + percentage + "% scanned).",
- raw: message
+ raw: message,
+ code: code
};
}
@@ -3647,14 +4263,14 @@ var JSHINT = (function () {
function doOption() {
var nt = state.tokens.next;
- var body = nt.body.split(",").map(function (s) { return s.trim(); });
+ var body = nt.body.match(/(-\s+)?[^\s,]+(?:\s*:\s*(-\s+)?[^\s,]+)?/g);
var predef = {};
if (nt.type === "globals") {
body.forEach(function (g) {
g = g.split(":");
- var key = g[0];
- var val = g[1];
+ var key = (g[0] || "").trim();
+ var val = (g[1] || "").trim();
if (key.charAt(0) === "-") {
key = key.slice(1);
@@ -3921,6 +4537,22 @@ var JSHINT = (function () {
}
}
+ function isInfix(token) {
+ return token.infix || (!token.identifier && !!token.led);
+ }
+
+ function isEndOfExpr() {
+ var curr = state.tokens.curr;
+ var next = state.tokens.next;
+ if (next.id === ";" || next.id === "}" || next.id === ":") {
+ return true;
+ }
+ if (isInfix(next) === isInfix(curr) || (curr.id === "yield" && state.option.inMoz(true))) {
+ return curr.line !== next.line;
+ }
+ return false;
+ }
+
function expression(rbp, initial) {
var left, isArray = false, isObject = false, isLetExpr = false;
if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") {
@@ -3954,10 +4586,7 @@ var JSHINT = (function () {
error("E030", state.tokens.curr, state.tokens.curr.id);
}
- var end_of_expr = state.tokens.next.identifier &&
- !state.tokens.curr.led &&
- state.tokens.curr.line !== state.tokens.next.line;
- while (rbp < state.tokens.next.lbp && !end_of_expr) {
+ while (rbp < state.tokens.next.lbp && !isEndOfExpr()) {
isArray = state.tokens.curr.value === "Array";
isObject = state.tokens.curr.value === "Object";
if (left && (left.value || (left.first && left.first.value))) {
@@ -4042,7 +4671,7 @@ var JSHINT = (function () {
left = left || state.tokens.curr;
right = right || state.tokens.next;
if (!state.option.laxbreak && left.line !== right.line) {
- warning("W014", right, right.id);
+ warning("W014", right, right.value);
} else if (state.option.white) {
left = left || state.tokens.curr;
right = right || state.tokens.next;
@@ -4075,26 +4704,29 @@ var JSHINT = (function () {
}
}
+ function nobreakcomma(left, right) {
+ if (left.line !== right.line) {
+ if (!state.option.laxcomma) {
+ if (comma.first) {
+ warning("I001");
+ comma.first = false;
+ }
+ warning("W014", left, right.value);
+ }
+ } else if (!left.comment && left.character !== right.from && state.option.white) {
+ left.from += (left.character - left.from);
+ warning("W011", left, left.value);
+ }
+ }
function comma(opts) {
opts = opts || {};
if (!opts.peek) {
- if (state.tokens.curr.line !== state.tokens.next.line) {
- if (!state.option.laxcomma) {
- if (comma.first) {
- warning("I001");
- comma.first = false;
- }
- warning("W014", state.tokens.curr, state.tokens.next.value);
- }
- } else if (!state.tokens.curr.comment &&
- state.tokens.curr.character !== state.tokens.next.from && state.option.white) {
- state.tokens.curr.from += (state.tokens.curr.character - state.tokens.curr.from);
- warning("W011", state.tokens.curr, state.tokens.curr.value);
- }
-
+ nobreakcomma(state.tokens.curr, state.tokens.next);
advance(",");
+ } else {
+ nobreakcomma(state.tokens.prev, state.tokens.curr);
}
if (state.tokens.next.value !== "]" && state.tokens.next.value !== "}") {
@@ -4116,7 +4748,6 @@ var JSHINT = (function () {
case "in":
case "instanceof":
case "return":
- case "yield":
case "switch":
case "throw":
case "try":
@@ -4243,6 +4874,7 @@ var JSHINT = (function () {
function infix(s, f, p, w) {
var x = symbol(s, p);
reserveName(x);
+ x.infix = true;
x.led = function (left) {
if (!w) {
nobreaknonadjacent(state.tokens.prev, state.tokens.curr);
@@ -4324,10 +4956,8 @@ var JSHINT = (function () {
node.type === "undefined");
}
- function assignop(s) {
- symbol(s, 20).exps = true;
-
- return infix(s, function (left, that) {
+ function assignop(s, f, p) {
+ var x = infix(s, typeof f === "function" ? f : function (left, that) {
that.left = left;
if (left) {
@@ -4349,7 +4979,7 @@ var JSHINT = (function () {
warning("E031", that);
}
- that.right = expression(19);
+ that.right = expression(10);
return that;
} else if (left.id === "[") {
if (state.tokens.curr.left.first) {
@@ -4363,13 +4993,13 @@ var JSHINT = (function () {
} else if (left.left.value === "arguments" && !state.directive["use strict"]) {
warning("E031", that);
}
- that.right = expression(19);
+ that.right = expression(10);
return that;
} else if (left.identifier && !isReserved(left)) {
if (funct[left.value] === "exception") {
warning("W022", left);
}
- that.right = expression(19);
+ that.right = expression(10);
return that;
}
@@ -4379,7 +5009,11 @@ var JSHINT = (function () {
}
error("E031", that);
- }, 20);
+ }, p);
+
+ x.exps = true;
+ x.assign = true;
+ return x;
}
@@ -4399,8 +5033,7 @@ var JSHINT = (function () {
function bitwiseassignop(s) {
- symbol(s, 20).exps = true;
- return infix(s, function (left, that) {
+ return assignop(s, function (left, that) {
if (state.option.bitwise) {
warning("W016", that, that.id);
}
@@ -4409,7 +5042,7 @@ var JSHINT = (function () {
if (left) {
if (left.id === "." || left.id === "[" ||
(left.identifier && !isReserved(left))) {
- expression(19);
+ expression(10);
return that;
}
if (left === state.syntax["function"]) {
@@ -4446,7 +5079,6 @@ var JSHINT = (function () {
advance();
var curr = state.tokens.curr;
- var meta = curr.meta || {};
var val = state.tokens.curr.value;
if (!isReserved(curr)) {
@@ -4454,7 +5086,7 @@ var JSHINT = (function () {
}
if (prop) {
- if (state.option.inES5() || meta.isFutureReservedWord) {
+ if (state.option.inES5()) {
return val;
}
}
@@ -4535,7 +5167,7 @@ var JSHINT = (function () {
isundef(funct, "W117", tok.token, tok.id);
});
advance("=");
- destructuringExpressionMatch(values, expression(5, true));
+ destructuringExpressionMatch(values, expression(10, true));
advance(";");
return;
}
@@ -4742,7 +5374,7 @@ var JSHINT = (function () {
}
}
}
- expression(5);
+ expression(10);
if (state.option.strict && funct["(context)"]["(global)"]) {
if (!m["use strict"] && !state.directive["use strict"]) {
@@ -4987,7 +5619,7 @@ var JSHINT = (function () {
return that;
}
while (true) {
- if (!(expr = expression(5))) {
+ if (!(expr = expression(10))) {
break;
}
that.exprs.push(expr);
@@ -4996,8 +5628,10 @@ var JSHINT = (function () {
}
}
return that;
- }, 5, true);
+ }, 10, true);
+
infix("?", function (left, that) {
+ increaseComplexityCount();
that.left = left;
that.right = expression(10);
advance(":");
@@ -5005,7 +5639,13 @@ var JSHINT = (function () {
return that;
}, 30);
- infix("||", "or", 40);
+ var orPrecendence = 40;
+ infix("||", function (left, that) {
+ increaseComplexityCount();
+ that.left = left;
+ that.right = expression(orPrecendence);
+ return that;
+ }, orPrecendence);
infix("&&", "and", 50);
bitwise("|", "bitor", 70);
bitwise("^", "bitxor", 80);
@@ -5099,7 +5739,7 @@ var JSHINT = (function () {
prefix("--", "predec");
state.syntax["--"].exps = true;
prefix("delete", function () {
- var p = expression(5);
+ var p = expression(10);
if (!p || (p.id !== "." && p.id !== "[")) {
warning("W051");
}
@@ -5330,7 +5970,7 @@ var JSHINT = (function () {
exprs.push(bracket.left[t].token);
}
} else {
- exprs.push(expression(5));
+ exprs.push(expression(10));
}
if (state.tokens.next.id !== ",") {
break;
@@ -5371,7 +6011,7 @@ var JSHINT = (function () {
infix("[", function (left, that) {
nobreak(state.tokens.prev, state.tokens.curr);
nospace();
- var e = expression(5), s;
+ var e = expression(10), s;
if (e && e.type === "(string)") {
if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) {
warning("W061", that);
@@ -5402,7 +6042,7 @@ var JSHINT = (function () {
res.exps = true;
funct["(comparray)"].stack();
- res.right = expression(5);
+ res.right = expression(10);
advance("for");
if (state.tokens.next.value === "each") {
advance("each");
@@ -5412,13 +6052,13 @@ var JSHINT = (function () {
}
advance("(");
funct["(comparray)"].setState("define");
- res.left = expression(5);
+ res.left = expression(10);
advance(")");
if (state.tokens.next.value === "if") {
advance("if");
advance("(");
funct["(comparray)"].setState("filter");
- res.filter = expression(5);
+ res.filter = expression(10);
advance(")");
}
advance("]");
@@ -5503,6 +6143,7 @@ var JSHINT = (function () {
var ident;
var tokens = [];
var t;
+ var pastDefault = false;
if (parsed) {
if (parsed instanceof Array) {
@@ -5568,6 +6209,19 @@ var JSHINT = (function () {
params.push(ident);
addlabel(ident, "unused", state.tokens.curr);
}
+ if (pastDefault) {
+ if (state.tokens.next.id !== "=") {
+ error("E051", state.tokens.current);
+ }
+ }
+ if (state.tokens.next.id === "=") {
+ if (!state.option.inESNext()) {
+ warning("W119", state.tokens.next, "default parameters");
+ }
+ advance("=");
+ pastDefault = true;
+ expression(10);
+ }
if (state.tokens.next.id === ",") {
comma();
} else {
@@ -6007,9 +6661,9 @@ var JSHINT = (function () {
warning("W080", state.tokens.prev, state.tokens.prev.value);
}
if (peek(0).id === "=" && state.tokens.next.identifier) {
- error("E037", state.tokens.next, state.tokens.next.value);
+ warning("W120", state.tokens.next, state.tokens.next.value);
}
- value = expression(5);
+ value = expression(10);
if (lone) {
tokens[0].first = value;
} else {
@@ -6072,9 +6726,9 @@ var JSHINT = (function () {
warning("W080", state.tokens.prev, state.tokens.prev.value);
}
if (peek(0).id === "=" && state.tokens.next.identifier) {
- error("E038", state.tokens.next, state.tokens.next.value);
+ warning("W120", state.tokens.next, state.tokens.next.value);
}
- value = expression(5);
+ value = expression(10);
if (lone) {
tokens[0].first = value;
} else {
@@ -6152,9 +6806,9 @@ var JSHINT = (function () {
warning("W080", state.tokens.prev, state.tokens.prev.value);
}
if (peek(0).id === "=" && state.tokens.next.identifier) {
- error("E037", state.tokens.next, state.tokens.next.value);
+ warning("W120", state.tokens.next, state.tokens.next.value);
}
- value = expression(5);
+ value = expression(10);
if (lone) {
tokens[0].first = value;
} else {
@@ -6729,30 +7383,39 @@ var JSHINT = (function () {
return this;
}).exps = true;
- stmt("yield", function () {
- if (state.option.inESNext(true) && funct["(generator)"] !== true) {
+ (function (x) {
+ x.exps = true;
+ x.lbp = 25;
+ }(prefix("yield", function () {
+ var prev = state.tokens.prev;
+ if (state.option.inESNext(true) && !funct["(generator)"]) {
error("E046", state.tokens.curr, "yield");
} else if (!state.option.inESNext()) {
warning("W104", state.tokens.curr, "yield");
}
funct["(generator)"] = "yielded";
- if (this.line === state.tokens.next.line) {
+ if (this.line === state.tokens.next.line || !state.option.inMoz(true)) {
if (state.tokens.next.id === "(regexp)")
warning("W092");
- if (state.tokens.next.id !== ";" && !state.tokens.next.reach) {
- nonadjacent(state.tokens.curr, state.tokens.next);
- this.first = expression(0);
+ if (state.tokens.next.id !== ";" && !state.tokens.next.reach && state.tokens.next.nud) {
+ nobreaknonadjacent(state.tokens.curr, state.tokens.next);
+ this.first = expression(10);
if (this.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) {
warningAt("W093", this.first.line, this.first.character);
}
}
+
+ if (state.option.inMoz(true) && state.tokens.next.id !== ")" &&
+ (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) {
+ error("E050", this);
+ }
} else if (!state.option.asi) {
nolinebreak(this); // always warn (Line breaking error)
}
return this;
- }).exps = true;
+ })));
stmt("throw", function () {
@@ -6763,6 +7426,104 @@ var JSHINT = (function () {
return this;
}).exps = true;
+ stmt("import", function () {
+ if (!state.option.inESNext()) {
+ warning("W119", state.tokens.curr, "import");
+ }
+
+ if (state.tokens.next.identifier) {
+ this.name = identifier();
+ addlabel(this.name, "unused", state.tokens.curr);
+ } else {
+ advance("{");
+ for (;;) {
+ var importName;
+ if (state.tokens.next.type === "default") {
+ importName = "default";
+ advance("default");
+ } else {
+ importName = identifier();
+ }
+ if (state.tokens.next.value === "as") {
+ advance("as");
+ importName = identifier();
+ }
+ addlabel(importName, "unused", state.tokens.curr);
+
+ if (state.tokens.next.value === ",") {
+ advance(",");
+ } else if (state.tokens.next.value === "}") {
+ advance("}");
+ break;
+ } else {
+ error("E024", state.tokens.next, state.tokens.next.value);
+ break;
+ }
+ }
+ }
+
+ advance("from");
+ advance("(string)");
+ return this;
+ }).exps = true;
+
+ stmt("export", function () {
+ if (!state.option.inESNext()) {
+ warning("W119", state.tokens.curr, "export");
+ }
+
+ if (state.tokens.next.type === "default") {
+ advance("default");
+ if (state.tokens.next.id === "function" || state.tokens.next.id === "class") {
+ this.block = true;
+ }
+ this.exportee = expression(10);
+
+ return this;
+ }
+
+ if (state.tokens.next.value === "{") {
+ advance("{");
+ for (;;) {
+ identifier();
+
+ if (state.tokens.next.value === ",") {
+ advance(",");
+ } else if (state.tokens.next.value === "}") {
+ advance("}");
+ break;
+ } else {
+ error("E024", state.tokens.next, state.tokens.next.value);
+ break;
+ }
+ }
+ return this;
+ }
+
+ if (state.tokens.next.id === "var") {
+ advance("var");
+ state.syntax["var"].fud.call(state.syntax["var"].fud);
+ } else if (state.tokens.next.id === "let") {
+ advance("let");
+ state.syntax["let"].fud.call(state.syntax["let"].fud);
+ } else if (state.tokens.next.id === "const") {
+ advance("const");
+ state.syntax["const"].fud.call(state.syntax["const"].fud);
+ } else if (state.tokens.next.id === "function") {
+ this.block = true;
+ advance("function");
+ state.syntax["function"].fud();
+ } else if (state.tokens.next.id === "class") {
+ this.block = true;
+ advance("class");
+ state.syntax["class"].fud();
+ } else {
+ error("E024", state.tokens.next, state.tokens.next.value);
+ }
+
+ return this;
+ }).exps = true;
+
FutureReservedWord("abstract");
FutureReservedWord("boolean");
FutureReservedWord("byte");
@@ -7396,6 +8157,7 @@ var JSHINT = (function () {
JSHINT.errors.push({
scope : "(main)",
raw : err.raw,
+ code : err.code,
reason : err.message,
line : err.line || nt.line,
character : err.character || nt.from
@@ -7507,220 +8269,9 @@ if (typeof exports === "object" && exports) {
exports.JSHINT = JSHINT;
}
-})()
},
-{"events":2,"../shared/vars.js":3,"../shared/messages.js":10,"./lex.js":11,"./reg.js":4,"./state.js":5,"./style.js":6,"console-browserify":7,"underscore":12}],
-10:[function(req,module,exports){
-(function(){
-
-var _ = req("underscore");
-
-var errors = {
- E001: "Bad option: '{a}'.",
- E002: "Bad option value.",
- E003: "Expected a JSON value.",
- E004: "Input is neither a string nor an array of strings.",
- E005: "Input is empty.",
- E006: "Unexpected early end of program.",
- E007: "Missing \"use strict\" statement.",
- E008: "Strict violation.",
- E009: "Option 'validthis' can't be used in a global scope.",
- E010: "'with' is not allowed in strict mode.",
- E011: "const '{a}' has already been declared.",
- E012: "const '{a}' is initialized to 'undefined'.",
- E013: "Attempting to override '{a}' which is a constant.",
- E014: "A regular expression literal can be confused with '/='.",
- E015: "Unclosed regular expression.",
- E016: "Invalid regular expression.",
- E017: "Unclosed comment.",
- E018: "Unbegun comment.",
- E019: "Unmatched '{a}'.",
- E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
- E021: "Expected '{a}' and instead saw '{b}'.",
- E022: "Line breaking error '{a}'.",
- E023: "Missing '{a}'.",
- E024: "Unexpected '{a}'.",
- E025: "Missing ':' on a case clause.",
- E026: "Missing '}' to match '{' from line {a}.",
- E027: "Missing ']' to match '[' form line {a}.",
- E028: "Illegal comma.",
- E029: "Unclosed string.",
- E030: "Expected an identifier and instead saw '{a}'.",
- E031: "Bad assignment.", // FIXME: Rephrase
- E032: "Expected a small integer or 'false' and instead saw '{a}'.",
- E033: "Expected an operator and instead saw '{a}'.",
- E034: "get/set are ES5 features.",
- E035: "Missing property name.",
- E036: "Expected to see a statement and instead saw a block.",
- E037: "Constant {a} was not declared correctly.",
- E038: "Variable {a} was not declared correctly.",
- E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",
- E040: "Each value should have its own case label.",
- E041: "Unrecoverable syntax error.",
- E042: "Stopping.",
- E043: "Too many errors.",
- E044: "'{a}' is already defined and can't be redefined.",
- E045: "Invalid for each loop.",
- E046: "A yield statement shall be within a generator function (with syntax: `function*`)",
- E047: "A generator function shall contain a yield statement.",
- E048: "Let declaration not directly within block.",
- E049: "A {a} cannot be named '{b}'."
-};
-
-var warnings = {
- W001: "'hasOwnProperty' is a really bad name.",
- W002: "Value of '{a}' may be overwritten in IE 8 and earlier.",
- W003: "'{a}' was used before it was defined.",
- W004: "'{a}' is already defined.",
- W005: "A dot following a number can be confused with a decimal point.",
- W006: "Confusing minuses.",
- W007: "Confusing pluses.",
- W008: "A leading decimal point can be confused with a dot: '{a}'.",
- W009: "The array literal notation [] is preferrable.",
- W010: "The object literal notation {} is preferrable.",
- W011: "Unexpected space after '{a}'.",
- W012: "Unexpected space before '{a}'.",
- W013: "Missing space after '{a}'.",
- W014: "Bad line breaking before '{a}'.",
- W015: "Expected '{a}' to have an indentation at {b} instead at {c}.",
- W016: "Unexpected use of '{a}'.",
- W017: "Bad operand.",
- W018: "Confusing use of '{a}'.",
- W019: "Use the isNaN function to compare with NaN.",
- W020: "Read only.",
- W021: "'{a}' is a function.",
- W022: "Do not assign to the exception parameter.",
- W023: "Expected an identifier in an assignment and instead saw a function invocation.",
- W024: "Expected an identifier and instead saw '{a}' (a reserved word).",
- W025: "Missing name in function declaration.",
- W026: "Inner functions should be listed at the top of the outer function.",
- W027: "Unreachable '{a}' after '{b}'.",
- W028: "Label '{a}' on {b} statement.",
- W030: "Expected an assignment or function call and instead saw an expression.",
- W031: "Do not use 'new' for side effects.",
- W032: "Unnecessary semicolon.",
- W033: "Missing semicolon.",
- W034: "Unnecessary directive \"{a}\".",
- W035: "Empty block.",
- W036: "Unexpected /*member '{a}'.",
- W037: "'{a}' is a statement label.",
- W038: "'{a}' used out of scope.",
- W039: "'{a}' is not allowed.",
- W040: "Possible strict violation.",
- W041: "Use '{a}' to compare with '{b}'.",
- W042: "Avoid EOL escaping.",
- W043: "Bad escaping of EOL. Use option multistr if needed.",
- W044: "Bad or unnecessary escaping.",
- W045: "Bad number '{a}'.",
- W046: "Don't use extra leading zeros '{a}'.",
- W047: "A trailing decimal point can be confused with a dot: '{a}'.",
- W048: "Unexpected control character in regular expression.",
- W049: "Unexpected escaped character '{a}' in regular expression.",
- W050: "JavaScript URL.",
- W051: "Variables should not be deleted.",
- W052: "Unexpected '{a}'.",
- W053: "Do not use {a} as a constructor.",
- W054: "The Function constructor is a form of eval.",
- W055: "A constructor name should start with an uppercase letter.",
- W056: "Bad constructor.",
- W057: "Weird construction. Is 'new' unnecessary?",
- W058: "Missing '()' invoking a constructor.",
- W059: "Avoid arguments.{a}.",
- W060: "document.write can be a form of eval.",
- W061: "eval can be harmful.",
- W062: "Wrap an immediate function invocation in parens " +
- "to assist the reader in understanding that the expression " +
- "is the result of a function, and not the function itself.",
- W063: "Math is not a function.",
- W064: "Missing 'new' prefix when invoking a constructor.",
- W065: "Missing radix parameter.",
- W066: "Implied eval. Consider passing a function instead of a string.",
- W067: "Bad invocation.",
- W068: "Wrapping non-IIFE function literals in parens is unnecessary.",
- W069: "['{a}'] is better written in dot notation.",
- W070: "Extra comma. (it breaks older versions of IE)",
- W071: "This function has too many statements. ({a})",
- W072: "This function has too many parameters. ({a})",
- W073: "Blocks are nested too deeply. ({a})",
- W074: "This function's cyclomatic complexity is too high. ({a})",
- W075: "Duplicate key '{a}'.",
- W076: "Unexpected parameter '{a}' in get {b} function.",
- W077: "Expected a single parameter in set {a} function.",
- W078: "Setter is defined without getter.",
- W079: "Redefinition of '{a}'.",
- W080: "It's not necessary to initialize '{a}' to 'undefined'.",
- W081: "Too many var statements.",
- W082: "Function declarations should not be placed in blocks. " +
- "Use a function expression or move the statement to the top of " +
- "the outer function.",
- W083: "Don't make functions within a loop.",
- W084: "Assignment in conditional expression",
- W085: "Don't use 'with'.",
- W086: "Expected a 'break' statement before '{a}'.",
- W087: "Forgotten 'debugger' statement?",
- W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.",
- W089: "The body of a for in should be wrapped in an if statement to filter " +
- "unwanted properties from the prototype.",
- W090: "'{a}' is not a statement label.",
- W091: "'{a}' is out of scope.",
- W092: "Wrap the /regexp/ literal in parens to disambiguate the slash operator.",
- W093: "Did you mean to return a conditional instead of an assignment?",
- W094: "Unexpected comma.",
- W095: "Expected a string and instead saw {a}.",
- W096: "The '{a}' key may produce unexpected results.",
- W097: "Use the function form of \"use strict\".",
- W098: "'{a}' is defined but never used.",
- W099: "Mixed spaces and tabs.",
- W100: "This character may get silently deleted by one or more browsers.",
- W101: "Line is too long.",
- W102: "Trailing whitespace.",
- W103: "The '{a}' property is deprecated.",
- W104: "'{a}' is only available in JavaScript 1.7.",
- W105: "Unexpected {a} in '{b}'.",
- W106: "Identifier '{a}' is not in camel case.",
- W107: "Script URL.",
- W108: "Strings must use doublequote.",
- W109: "Strings must use singlequote.",
- W110: "Mixed double and single quotes.",
- W112: "Unclosed string.",
- W113: "Control character in string: {a}.",
- W114: "Avoid {a}.",
- W115: "Octal literals are not allowed in strict mode.",
- W116: "Expected '{a}' and instead saw '{b}'.",
- W117: "'{a}' is not defined.",
- W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).",
- W119: "'{a}' is only available in ES6 (use esnext option)."
-};
-
-var info = {
- I001: "Comma warnings can be turned off with 'laxcomma'.",
- I002: "Reserved words as properties can be used under the 'es5' option.",
- I003: "ES5 option is now set per default"
-};
-
-exports.errors = {};
-exports.warnings = {};
-exports.info = {};
-
-_.each(errors, function (desc, code) {
- exports.errors[code] = { code: code, desc: desc };
-});
-
-_.each(warnings, function (desc, code) {
- exports.warnings[code] = { code: code, desc: desc };
-});
-
-_.each(info, function (desc, code) {
- exports.info[code] = { code: code, desc: desc };
-});
-
-})()
-},
-{"underscore":12}],
-11:[function(req,module,exports){
-(function(){/*
- * Lexical analysis and token construction.
- */
+{"../shared/messages.js":2,"../shared/vars.js":3,"./lex.js":5,"./reg.js":6,"./state.js":7,"./style.js":8,"console-browserify":9,"events":10,"underscore":1}],
+5:[function(req,module,exports){
@@ -8912,12 +9463,13 @@ Lexer.prototype = {
if (!token.reserved) {
return false;
}
+ var meta = token.meta;
- if (token.meta && token.meta.isFutureReservedWord) {
- if (state.option.inES5(true) && !token.meta.es5) {
+ if (meta && meta.isFutureReservedWord && state.option.inES5()) {
+ if (!meta.es5) {
return false;
}
- if (token.meta.strictOnly) {
+ if (meta.strictOnly) {
if (!state.option.strict && !state.directive["use strict"]) {
return false;
}
@@ -9100,878 +9652,434 @@ Lexer.prototype = {
exports.Lexer = Lexer;
-})()
},
-{"events":2,"./reg.js":4,"./state.js":5,"underscore":12}],
-12:[function(req,module,exports){
-(function(){// Underscore.js 1.4.4
+{"./reg.js":6,"./state.js":7,"events":10,"underscore":1}],
+6:[function(req,module,exports){
-(function() {
- var root = this;
- var previousUnderscore = root._;
- var breaker = {};
- var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
- var push = ArrayProto.push,
- slice = ArrayProto.slice,
- concat = ArrayProto.concat,
- toString = ObjProto.toString,
- hasOwnProperty = ObjProto.hasOwnProperty;
- var
- nativeForEach = ArrayProto.forEach,
- nativeMap = ArrayProto.map,
- nativeReduce = ArrayProto.reduce,
- nativeReduceRight = ArrayProto.reduceRight,
- nativeFilter = ArrayProto.filter,
- nativeEvery = ArrayProto.every,
- nativeSome = ArrayProto.some,
- nativeIndexOf = ArrayProto.indexOf,
- nativeLastIndexOf = ArrayProto.lastIndexOf,
- nativeIsArray = Array.isArray,
- nativeKeys = Object.keys,
- nativeBind = FuncProto.bind;
- var _ = function(obj) {
- if (obj instanceof _) return obj;
- if (!(this instanceof _)) return new _(obj);
- this._wrapped = obj;
- };
- if (typeof exports !== 'undefined') {
- if (typeof module !== 'undefined' && module.exports) {
- exports = module.exports = _;
+"use string";
+exports.unsafeString =
+ /@cc|<\/?|script|\]\s*\]|<\s*!|</i;
+exports.unsafeChars =
+ /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
+exports.needEsc =
+ /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/;
+
+exports.needEscGlobal =
+ /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+exports.starSlash = /\*\//;
+exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;
+exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i;
+exports.fallsThrough = /^\s*\/\*\s*falls?\sthrough\s*\*\/\s*$/;
+
+},
+{}],
+7:[function(req,module,exports){
+
+
+var state = {
+ syntax: {},
+
+ reset: function () {
+ this.tokens = {
+ prev: null,
+ next: null,
+ curr: null
+ };
+
+ this.option = {};
+ this.ignored = {};
+ this.directive = {};
+ this.jsonMode = false;
+ this.jsonWarnings = [];
+ this.lines = [];
+ this.tab = "";
+ this.cache = {}; // Node.JS doesn't have Map. Sniff.
+ }
+};
+
+exports.state = state;
+
+},
+{}],
+8:[function(req,module,exports){
+
+
+exports.register = function (linter) {
+
+ linter.on("Identifier", function style_scanProto(data) {
+ if (linter.getOption("proto")) {
+ return;
+ }
+
+ if (data.name === "__proto__") {
+ linter.warn("W103", {
+ line: data.line,
+ char: data.char,
+ data: [ data.name ]
+ });
+ }
+ });
+
+ linter.on("Identifier", function style_scanIterator(data) {
+ if (linter.getOption("iterator")) {
+ return;
+ }
+
+ if (data.name === "__iterator__") {
+ linter.warn("W104", {
+ line: data.line,
+ char: data.char,
+ data: [ data.name ]
+ });
+ }
+ });
+
+ linter.on("Identifier", function style_scanDangling(data) {
+ if (!linter.getOption("nomen")) {
+ return;
+ }
+ if (data.name === "_") {
+ return;
+ }
+ if (linter.getOption("node")) {
+ if (/^(__dirname|__filename)$/.test(data.name) && !data.isProperty) {
+ return;
+ }
+ }
+
+ if (/^(_+.*|.*_+)$/.test(data.name)) {
+ linter.warn("W105", {
+ line: data.line,
+ char: data.from,
+ data: [ "dangling '_'", data.name ]
+ });
+ }
+ });
+
+ linter.on("Identifier", function style_scanCamelCase(data) {
+ if (!linter.getOption("camelcase")) {
+ return;
+ }
+
+ if (data.name.replace(/^_+/, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {
+ linter.warn("W106", {
+ line: data.line,
+ char: data.from,
+ data: [ data.name ]
+ });
+ }
+ });
+
+ linter.on("String", function style_scanQuotes(data) {
+ var quotmark = linter.getOption("quotmark");
+ var code;
+
+ if (!quotmark) {
+ return;
+ }
+
+ if (quotmark === "single" && data.quote !== "'") {
+ code = "W109";
+ }
+
+ if (quotmark === "double" && data.quote !== "\"") {
+ code = "W108";
+ }
+
+ if (quotmark === true) {
+ if (!linter.getCache("quotmark")) {
+ linter.setCache("quotmark", data.quote);
+ }
+
+ if (linter.getCache("quotmark") !== data.quote) {
+ code = "W110";
+ }
+ }
+
+ if (code) {
+ linter.warn(code, {
+ line: data.line,
+ char: data.char,
+ });
+ }
+ });
+
+ linter.on("Number", function style_scanNumbers(data) {
+ if (data.value.charAt(0) === ".") {
+ linter.warn("W008", {
+ line: data.line,
+ char: data.char,
+ data: [ data.value ]
+ });
+ }
+
+ if (data.value.substr(data.value.length - 1) === ".") {
+ linter.warn("W047", {
+ line: data.line,
+ char: data.char,
+ data: [ data.value ]
+ });
+ }
+
+ if (/^00+/.test(data.value)) {
+ linter.warn("W046", {
+ line: data.line,
+ char: data.char,
+ data: [ data.value ]
+ });
+ }
+ });
+
+ linter.on("String", function style_scanJavaScriptURLs(data) {
+ var re = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i;
+
+ if (linter.getOption("scripturl")) {
+ return;
+ }
+
+ if (re.test(data.value)) {
+ linter.warn("W107", {
+ line: data.line,
+ char: data.char
+ });
+ }
+ });
+};
+},
+{}],
+9:[function(req,module,exports){
+
+},
+{}],
+10:[function(req,module,exports){
+var process=req("__browserify_process");if (!process.EventEmitter) process.EventEmitter = function () {};
+
+var EventEmitter = exports.EventEmitter = process.EventEmitter;
+var isArray = typeof Array.isArray === 'function'
+ ? Array.isArray
+ : function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]'
+ }
+;
+function indexOf (xs, x) {
+ if (xs.indexOf) return xs.indexOf(x);
+ for (var i = 0; i < xs.length; i++) {
+ if (x === xs[i]) return i;
+ }
+ return -1;
+}
+var defaultMaxListeners = 200;
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!this._events) this._events = {};
+ this._events.maxListeners = n;
+};
+
+
+EventEmitter.prototype.emit = function(type) {
+ if (type === 'error') {
+ if (!this._events || !this._events.error ||
+ (isArray(this._events.error) && !this._events.error.length))
+ {
+ if (arguments[1] instanceof Error) {
+ throw arguments[1]; // Unhandled 'error' event
+ } else {
+ throw new Error("Uncaught, unspecified 'error' event.");
+ }
+ return false;
}
- exports._ = _;
- } else {
- root._ = _;
}
- _.VERSION = '1.4.4';
- var each = _.each = _.forEach = function(obj, iterator, context) {
- if (obj == null) return;
- if (nativeForEach && obj.forEach === nativeForEach) {
- obj.forEach(iterator, context);
- } else if (obj.length === +obj.length) {
- for (var i = 0, l = obj.length; i < l; i++) {
- if (iterator.call(context, obj[i], i, obj) === breaker) return;
- }
- } else {
- for (var key in obj) {
- if (_.has(obj, key)) {
- if (iterator.call(context, obj[key], key, obj) === breaker) return;
- }
- }
- }
- };
- _.map = _.collect = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
- each(obj, function(value, index, list) {
- results[results.length] = iterator.call(context, value, index, list);
- });
- return results;
- };
- var reduceError = 'Reduce of empty array with no initial value';
- _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
- var initial = arguments.length > 2;
- if (obj == null) obj = [];
- if (nativeReduce && obj.reduce === nativeReduce) {
- if (context) iterator = _.bind(iterator, context);
- return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
- }
- each(obj, function(value, index, list) {
- if (!initial) {
- memo = value;
- initial = true;
- } else {
- memo = iterator.call(context, memo, value, index, list);
- }
- });
- if (!initial) throw new TypeError(reduceError);
- return memo;
- };
- _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
- var initial = arguments.length > 2;
- if (obj == null) obj = [];
- if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
- if (context) iterator = _.bind(iterator, context);
- return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
- }
- var length = obj.length;
- if (length !== +length) {
- var keys = _.keys(obj);
- length = keys.length;
- }
- each(obj, function(value, index, list) {
- index = keys ? keys[--length] : --length;
- if (!initial) {
- memo = obj[index];
- initial = true;
- } else {
- memo = iterator.call(context, memo, obj[index], index, list);
- }
- });
- if (!initial) throw new TypeError(reduceError);
- return memo;
- };
- _.find = _.detect = function(obj, iterator, context) {
- var result;
- any(obj, function(value, index, list) {
- if (iterator.call(context, value, index, list)) {
- result = value;
- return true;
- }
- });
- return result;
- };
- _.filter = _.select = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
- each(obj, function(value, index, list) {
- if (iterator.call(context, value, index, list)) results[results.length] = value;
- });
- return results;
- };
- _.reject = function(obj, iterator, context) {
- return _.filter(obj, function(value, index, list) {
- return !iterator.call(context, value, index, list);
- }, context);
- };
- _.every = _.all = function(obj, iterator, context) {
- iterator || (iterator = _.identity);
- var result = true;
- if (obj == null) return result;
- if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
- each(obj, function(value, index, list) {
- if (!(result = result && iterator.call(context, value, index, list))) return breaker;
- });
- return !!result;
- };
- var any = _.some = _.any = function(obj, iterator, context) {
- iterator || (iterator = _.identity);
- var result = false;
- if (obj == null) return result;
- if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
- each(obj, function(value, index, list) {
- if (result || (result = iterator.call(context, value, index, list))) return breaker;
- });
- return !!result;
- };
- _.contains = _.include = function(obj, target) {
- if (obj == null) return false;
- if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
- return any(obj, function(value) {
- return value === target;
- });
- };
- _.invoke = function(obj, method) {
- var args = slice.call(arguments, 2);
- var isFunc = _.isFunction(method);
- return _.map(obj, function(value) {
- return (isFunc ? method : value[method]).apply(value, args);
- });
- };
- _.pluck = function(obj, key) {
- return _.map(obj, function(value){ return value[key]; });
- };
- _.where = function(obj, attrs, first) {
- if (_.isEmpty(attrs)) return first ? null : [];
- return _[first ? 'find' : 'filter'](obj, function(value) {
- for (var key in attrs) {
- if (attrs[key] !== value[key]) return false;
- }
- return true;
- });
- };
- _.findWhere = function(obj, attrs) {
- return _.where(obj, attrs, true);
- };
- _.max = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
- return Math.max.apply(Math, obj);
- }
- if (!iterator && _.isEmpty(obj)) return -Infinity;
- var result = {computed : -Infinity, value: -Infinity};
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- computed >= result.computed && (result = {value : value, computed : computed});
- });
- return result.value;
- };
- _.min = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
- return Math.min.apply(Math, obj);
- }
- if (!iterator && _.isEmpty(obj)) return Infinity;
- var result = {computed : Infinity, value: Infinity};
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- computed < result.computed && (result = {value : value, computed : computed});
- });
- return result.value;
- };
- _.shuffle = function(obj) {
- var rand;
- var index = 0;
- var shuffled = [];
- each(obj, function(value) {
- rand = _.random(index++);
- shuffled[index - 1] = shuffled[rand];
- shuffled[rand] = value;
- });
- return shuffled;
- };
- var lookupIterator = function(value) {
- return _.isFunction(value) ? value : function(obj){ return obj[value]; };
- };
- _.sortBy = function(obj, value, context) {
- var iterator = lookupIterator(value);
- return _.pluck(_.map(obj, function(value, index, list) {
- return {
- value : value,
- index : index,
- criteria : iterator.call(context, value, index, list)
- };
- }).sort(function(left, right) {
- var a = left.criteria;
- var b = right.criteria;
- if (a !== b) {
- if (a > b || a === void 0) return 1;
- if (a < b || b === void 0) return -1;
- }
- return left.index < right.index ? -1 : 1;
- }), 'value');
- };
- var group = function(obj, value, context, behavior) {
- var result = {};
- var iterator = lookupIterator(value || _.identity);
- each(obj, function(value, index) {
- var key = iterator.call(context, value, index, obj);
- behavior(result, key, value);
- });
- return result;
- };
- _.groupBy = function(obj, value, context) {
- return group(obj, value, context, function(result, key, value) {
- (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
- });
- };
- _.countBy = function(obj, value, context) {
- return group(obj, value, context, function(result, key) {
- if (!_.has(result, key)) result[key] = 0;
- result[key]++;
- });
- };
- _.sortedIndex = function(array, obj, iterator, context) {
- iterator = iterator == null ? _.identity : lookupIterator(iterator);
- var value = iterator.call(context, obj);
- var low = 0, high = array.length;
- while (low < high) {
- var mid = (low + high) >>> 1;
- iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
- }
- return low;
- };
- _.toArray = function(obj) {
- if (!obj) return [];
- if (_.isArray(obj)) return slice.call(obj);
- if (obj.length === +obj.length) return _.map(obj, _.identity);
- return _.values(obj);
- };
- _.size = function(obj) {
- if (obj == null) return 0;
- return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
- };
- _.first = _.head = _.take = function(array, n, guard) {
- if (array == null) return void 0;
- return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
- };
- _.initial = function(array, n, guard) {
- return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
- };
- _.last = function(array, n, guard) {
- if (array == null) return void 0;
- if ((n != null) && !guard) {
- return slice.call(array, Math.max(array.length - n, 0));
- } else {
- return array[array.length - 1];
- }
- };
- _.rest = _.tail = _.drop = function(array, n, guard) {
- return slice.call(array, (n == null) || guard ? 1 : n);
- };
- _.compact = function(array) {
- return _.filter(array, _.identity);
- };
- var flatten = function(input, shallow, output) {
- each(input, function(value) {
- if (_.isArray(value)) {
- shallow ? push.apply(output, value) : flatten(value, shallow, output);
- } else {
- output.push(value);
- }
- });
- return output;
- };
- _.flatten = function(array, shallow) {
- return flatten(array, shallow, []);
- };
- _.without = function(array) {
- return _.difference(array, slice.call(arguments, 1));
- };
- _.uniq = _.unique = function(array, isSorted, iterator, context) {
- if (_.isFunction(isSorted)) {
- context = iterator;
- iterator = isSorted;
- isSorted = false;
- }
- var initial = iterator ? _.map(array, iterator, context) : array;
- var results = [];
- var seen = [];
- each(initial, function(value, index) {
- if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
- seen.push(value);
- results.push(array[index]);
- }
- });
- return results;
- };
- _.union = function() {
- return _.uniq(concat.apply(ArrayProto, arguments));
- };
- _.intersection = function(array) {
- var rest = slice.call(arguments, 1);
- return _.filter(_.uniq(array), function(item) {
- return _.every(rest, function(other) {
- return _.indexOf(other, item) >= 0;
- });
- });
- };
- _.difference = function(array) {
- var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
- return _.filter(array, function(value){ return !_.contains(rest, value); });
- };
- _.zip = function() {
- var args = slice.call(arguments);
- var length = _.max(_.pluck(args, 'length'));
- var results = new Array(length);
- for (var i = 0; i < length; i++) {
- results[i] = _.pluck(args, "" + i);
- }
- return results;
- };
- _.object = function(list, values) {
- if (list == null) return {};
- var result = {};
- for (var i = 0, l = list.length; i < l; i++) {
- if (values) {
- result[list[i]] = values[i];
- } else {
- result[list[i][0]] = list[i][1];
- }
- }
- return result;
- };
- _.indexOf = function(array, item, isSorted) {
- if (array == null) return -1;
- var i = 0, l = array.length;
- if (isSorted) {
- if (typeof isSorted == 'number') {
- i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
- } else {
- i = _.sortedIndex(array, item);
- return array[i] === item ? i : -1;
- }
- }
- if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
- for (; i < l; i++) if (array[i] === item) return i;
- return -1;
- };
- _.lastIndexOf = function(array, item, from) {
- if (array == null) return -1;
- var hasIndex = from != null;
- if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
- return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
- }
- var i = (hasIndex ? from : array.length);
- while (i--) if (array[i] === item) return i;
- return -1;
- };
- _.range = function(start, stop, step) {
- if (arguments.length <= 1) {
- stop = start || 0;
- start = 0;
- }
- step = arguments[2] || 1;
+ if (!this._events) return false;
+ var handler = this._events[type];
+ if (!handler) return false;
- var len = Math.max(Math.ceil((stop - start) / step), 0);
- var idx = 0;
- var range = new Array(len);
-
- while(idx < len) {
- range[idx++] = start;
- start += step;
+ if (typeof handler == 'function') {
+ switch (arguments.length) {
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ default:
+ var args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
}
-
- return range;
- };
- _.bind = function(func, context) {
- if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
- var args = slice.call(arguments, 2);
- return function() {
- return func.apply(context, args.concat(slice.call(arguments)));
- };
- };
- _.partial = function(func) {
- var args = slice.call(arguments, 1);
- return function() {
- return func.apply(this, args.concat(slice.call(arguments)));
- };
- };
- _.bindAll = function(obj) {
- var funcs = slice.call(arguments, 1);
- if (funcs.length === 0) funcs = _.functions(obj);
- each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
- return obj;
- };
- _.memoize = function(func, hasher) {
- var memo = {};
- hasher || (hasher = _.identity);
- return function() {
- var key = hasher.apply(this, arguments);
- return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
- };
- };
- _.delay = function(func, wait) {
- var args = slice.call(arguments, 2);
- return setTimeout(function(){ return func.apply(null, args); }, wait);
- };
- _.defer = function(func) {
- return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
- };
- _.throttle = function(func, wait) {
- var context, args, timeout, result;
- var previous = 0;
- var later = function() {
- previous = new Date;
- timeout = null;
- result = func.apply(context, args);
- };
- return function() {
- var now = new Date;
- var remaining = wait - (now - previous);
- context = this;
- args = arguments;
- if (remaining <= 0) {
- clearTimeout(timeout);
- timeout = null;
- previous = now;
- result = func.apply(context, args);
- } else if (!timeout) {
- timeout = setTimeout(later, remaining);
- }
- return result;
- };
- };
- _.debounce = function(func, wait, immediate) {
- var timeout, result;
- return function() {
- var context = this, args = arguments;
- var later = function() {
- timeout = null;
- if (!immediate) result = func.apply(context, args);
- };
- var callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) result = func.apply(context, args);
- return result;
- };
- };
- _.once = function(func) {
- var ran = false, memo;
- return function() {
- if (ran) return memo;
- ran = true;
- memo = func.apply(this, arguments);
- func = null;
- return memo;
- };
- };
- _.wrap = function(func, wrapper) {
- return function() {
- var args = [func];
- push.apply(args, arguments);
- return wrapper.apply(this, args);
- };
- };
- _.compose = function() {
- var funcs = arguments;
- return function() {
- var args = arguments;
- for (var i = funcs.length - 1; i >= 0; i--) {
- args = [funcs[i].apply(this, args)];
- }
- return args[0];
- };
- };
- _.after = function(times, func) {
- if (times <= 0) return func();
- return function() {
- if (--times < 1) {
- return func.apply(this, arguments);
- }
- };
- };
- _.keys = nativeKeys || function(obj) {
- if (obj !== Object(obj)) throw new TypeError('Invalid object');
- var keys = [];
- for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
- return keys;
- };
- _.values = function(obj) {
- var values = [];
- for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
- return values;
- };
- _.pairs = function(obj) {
- var pairs = [];
- for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
- return pairs;
- };
- _.invert = function(obj) {
- var result = {};
- for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
- return result;
- };
- _.functions = _.methods = function(obj) {
- var names = [];
- for (var key in obj) {
- if (_.isFunction(obj[key])) names.push(key);
- }
- return names.sort();
- };
- _.extend = function(obj) {
- each(slice.call(arguments, 1), function(source) {
- if (source) {
- for (var prop in source) {
- obj[prop] = source[prop];
- }
- }
- });
- return obj;
- };
- _.pick = function(obj) {
- var copy = {};
- var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
- each(keys, function(key) {
- if (key in obj) copy[key] = obj[key];
- });
- return copy;
- };
- _.omit = function(obj) {
- var copy = {};
- var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
- for (var key in obj) {
- if (!_.contains(keys, key)) copy[key] = obj[key];
- }
- return copy;
- };
- _.defaults = function(obj) {
- each(slice.call(arguments, 1), function(source) {
- if (source) {
- for (var prop in source) {
- if (obj[prop] == null) obj[prop] = source[prop];
- }
- }
- });
- return obj;
- };
- _.clone = function(obj) {
- if (!_.isObject(obj)) return obj;
- return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
- };
- _.tap = function(obj, interceptor) {
- interceptor(obj);
- return obj;
- };
- var eq = function(a, b, aStack, bStack) {
- if (a === b) return a !== 0 || 1 / a == 1 / b;
- if (a == null || b == null) return a === b;
- if (a instanceof _) a = a._wrapped;
- if (b instanceof _) b = b._wrapped;
- var className = toString.call(a);
- if (className != toString.call(b)) return false;
- switch (className) {
- case '[object String]':
- return a == String(b);
- case '[object Number]':
- return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
- case '[object Date]':
- case '[object Boolean]':
- return +a == +b;
- case '[object RegExp]':
- return a.source == b.source &&
- a.global == b.global &&
- a.multiline == b.multiline &&
- a.ignoreCase == b.ignoreCase;
- }
- if (typeof a != 'object' || typeof b != 'object') return false;
- var length = aStack.length;
- while (length--) {
- if (aStack[length] == a) return bStack[length] == b;
- }
- aStack.push(a);
- bStack.push(b);
- var size = 0, result = true;
- if (className == '[object Array]') {
- size = a.length;
- result = size == b.length;
- if (result) {
- while (size--) {
- if (!(result = eq(a[size], b[size], aStack, bStack))) break;
- }
- }
- } else {
- var aCtor = a.constructor, bCtor = b.constructor;
- if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
- _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
- return false;
- }
- for (var key in a) {
- if (_.has(a, key)) {
- size++;
- if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
- }
- }
- if (result) {
- for (key in b) {
- if (_.has(b, key) && !(size--)) break;
- }
- result = !size;
- }
- }
- aStack.pop();
- bStack.pop();
- return result;
- };
- _.isEqual = function(a, b) {
- return eq(a, b, [], []);
- };
- _.isEmpty = function(obj) {
- if (obj == null) return true;
- if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
- for (var key in obj) if (_.has(obj, key)) return false;
return true;
- };
- _.isElement = function(obj) {
- return !!(obj && obj.nodeType === 1);
- };
- _.isArray = nativeIsArray || function(obj) {
- return toString.call(obj) == '[object Array]';
- };
- _.isObject = function(obj) {
- return obj === Object(obj);
- };
- each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
- _['is' + name] = function(obj) {
- return toString.call(obj) == '[object ' + name + ']';
- };
+
+ } else if (isArray(handler)) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ var listeners = handler.slice();
+ for (var i = 0, l = listeners.length; i < l; i++) {
+ listeners[i].apply(this, args);
+ }
+ return true;
+
+ } else {
+ return false;
+ }
+};
+EventEmitter.prototype.addListener = function(type, listener) {
+ if ('function' !== typeof listener) {
+ throw new Error('addListener only takes instances of Function');
+ }
+
+ if (!this._events) this._events = {};
+ this.emit('newListener', type, listener);
+
+ if (!this._events[type]) {
+ this._events[type] = listener;
+ } else if (isArray(this._events[type])) {
+ if (!this._events[type].warned) {
+ var m;
+ if (this._events.maxListeners !== undefined) {
+ m = this._events.maxListeners;
+ } else {
+ m = defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ console.trace();
+ }
+ }
+ this._events[type].push(listener);
+ } else {
+ this._events[type] = [this._events[type], listener];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ var self = this;
+ self.on(type, function g() {
+ self.removeListener(type, g);
+ listener.apply(this, arguments);
});
- if (!_.isArguments(arguments)) {
- _.isArguments = function(obj) {
- return !!(obj && _.has(obj, 'callee'));
- };
+
+ return this;
+};
+
+EventEmitter.prototype.removeListener = function(type, listener) {
+ if ('function' !== typeof listener) {
+ throw new Error('removeListener only takes instances of Function');
}
- if (typeof (/./) !== 'function') {
- _.isFunction = function(obj) {
- return typeof obj === 'function';
- };
+ if (!this._events || !this._events[type]) return this;
+
+ var list = this._events[type];
+
+ if (isArray(list)) {
+ var i = indexOf(list, listener);
+ if (i < 0) return this;
+ list.splice(i, 1);
+ if (list.length == 0)
+ delete this._events[type];
+ } else if (this._events[type] === listener) {
+ delete this._events[type];
}
- _.isFinite = function(obj) {
- return isFinite(obj) && !isNaN(parseFloat(obj));
- };
- _.isNaN = function(obj) {
- return _.isNumber(obj) && obj != +obj;
- };
- _.isBoolean = function(obj) {
- return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
- };
- _.isNull = function(obj) {
- return obj === null;
- };
- _.isUndefined = function(obj) {
- return obj === void 0;
- };
- _.has = function(obj, key) {
- return hasOwnProperty.call(obj, key);
- };
- _.noConflict = function() {
- root._ = previousUnderscore;
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ if (arguments.length === 0) {
+ this._events = {};
return this;
- };
- _.identity = function(value) {
- return value;
- };
- _.times = function(n, iterator, context) {
- var accum = Array(n);
- for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
- return accum;
- };
- _.random = function(min, max) {
- if (max == null) {
- max = min;
- min = 0;
- }
- return min + Math.floor(Math.random() * (max - min + 1));
- };
- var entityMap = {
- escape: {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": ''',
- '/': '/'
- }
- };
- entityMap.unescape = _.invert(entityMap.escape);
- var entityRegexes = {
- escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
- unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
- };
- _.each(['escape', 'unescape'], function(method) {
- _[method] = function(string) {
- if (string == null) return '';
- return ('' + string).replace(entityRegexes[method], function(match) {
- return entityMap[method][match];
- });
- };
- });
- _.result = function(object, property) {
- if (object == null) return null;
- var value = object[property];
- return _.isFunction(value) ? value.call(object) : value;
- };
- _.mixin = function(obj) {
- each(_.functions(obj), function(name){
- var func = _[name] = obj[name];
- _.prototype[name] = function() {
- var args = [this._wrapped];
- push.apply(args, arguments);
- return result.call(this, func.apply(_, args));
- };
- });
- };
- var idCounter = 0;
- _.uniqueId = function(prefix) {
- var id = ++idCounter + '';
- return prefix ? prefix + id : id;
- };
- _.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/g
- };
- var noMatch = /(.)^/;
- var escapes = {
- "'": "'",
- '\\': '\\',
- '\r': 'r',
- '\n': 'n',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
+ }
+ if (type && this._events && this._events[type]) this._events[type] = null;
+ return this;
+};
- var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
- _.template = function(text, data, settings) {
- var render;
- settings = _.defaults({}, settings, _.templateSettings);
- var matcher = new RegExp([
- (settings.escape || noMatch).source,
- (settings.interpolate || noMatch).source,
- (settings.evaluate || noMatch).source
- ].join('|') + '|$', 'g');
- var index = 0;
- var source = "__p+='";
- text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
- source += text.slice(index, offset)
- .replace(escaper, function(match) { return '\\' + escapes[match]; });
+EventEmitter.prototype.listeners = function(type) {
+ if (!this._events) this._events = {};
+ if (!this._events[type]) this._events[type] = [];
+ if (!isArray(this._events[type])) {
+ this._events[type] = [this._events[type]];
+ }
+ return this._events[type];
+};
- if (escape) {
- source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- }
- if (interpolate) {
- source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- }
- if (evaluate) {
- source += "';\n" + evaluate + "\n__p+='";
- }
- index = offset + match.length;
- return match;
- });
- source += "';\n";
- if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+EventEmitter.listenerCount = function(emitter, type) {
+ var ret;
+ if (!emitter._events || !emitter._events[type])
+ ret = 0;
+ else if (typeof emitter._events[type] === 'function')
+ ret = 1;
+ else
+ ret = emitter._events[type].length;
+ return ret;
+};
- source = "var __t,__p='',__j=Array.prototype.join," +
- "print=function(){__p+=__j.call(arguments,'');};\n" +
- source + "return __p;\n";
-
- try {
- render = new Function(settings.variable || 'obj', '_', source);
- } catch (e) {
- e.source = source;
- throw e;
- }
-
- if (data) return render(data, _);
- var template = function(data) {
- return render.call(this, data, _);
- };
- template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
-
- return template;
- };
- _.chain = function(obj) {
- return _(obj).chain();
- };
- var result = function(obj) {
- return this._chain ? _(obj).chain() : obj;
- };
- _.mixin(_);
- each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
- var method = ArrayProto[name];
- _.prototype[name] = function() {
- var obj = this._wrapped;
- method.apply(obj, arguments);
- if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
- return result.call(this, obj);
- };
- });
- each(['concat', 'join', 'slice'], function(name) {
- var method = ArrayProto[name];
- _.prototype[name] = function() {
- return result.call(this, method.apply(this._wrapped, arguments));
- };
- });
-
- _.extend(_.prototype, {
- chain: function() {
- this._chain = true;
- return this;
- },
- value: function() {
- return this._wrapped;
- }
-
- });
-
-}).call(this);
-
-})()
},
-{}]
-},{},["E/GbHF"])
+{"__browserify_process":11}],
+11:[function(req,module,exports){
+
+var process = module.exports = {};
+
+process.nextTick = (function () {
+ var canSetImmediate = typeof window !== 'undefined'
+ && window.setImmediate;
+ var canPost = typeof window !== 'undefined'
+ && window.postMessage && window.addEventListener
+ ;
+
+ if (canSetImmediate) {
+ return function (f) { return window.setImmediate(f) };
+ }
+
+ if (canPost) {
+ var queue = [];
+ window.addEventListener('message', function (ev) {
+ if (ev.source === window && ev.data === 'process-tick') {
+ ev.stopPropagation();
+ if (queue.length > 0) {
+ var fn = queue.shift();
+ fn();
+ }
+ }
+ }, true);
+
+ return function nextTick(fn) {
+ queue.push(fn);
+ window.postMessage('process-tick', '*');
+ };
+ }
+
+ return function nextTick(fn) {
+ setTimeout(fn, 0);
+ };
+})();
+
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+}
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+
+},
+{}],
+"jshint":[function(req,module,exports){
+module.exports=req('n4bKNg');
+},
+{}]},{},["n4bKNg"])
;
function req() {return require.apply(this, arguments)}