diff --git a/Makefile b/Makefile index dcedcb78..c3f94cde 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ build: git rev-parse HEAD > .git-ref mkdir -p build/src - mkdir -p build/demo + mkdir -p build/demo/kitchen-sink mkdir -p build/textarea/src - cp demo/styles.css build/demo/styles.css - cp demo/logo.png build/demo/logo.png + cp -r demo/kitchen-sink/styles.css build/demo/kitchen-sink/styles.css + cp demo/kitchen-sink/logo.png build/demo/kitchen-sink/logo.png ./Makefile.dryice.js normal ./Makefile.dryice.js bm diff --git a/Makefile.dryice.js b/Makefile.dryice.js index a2877f0c..a705fcf4 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -95,7 +95,7 @@ var aceProject = [ ]; if (target == "normal") { - aceProject.push(aceHome + '/demo'); + //aceProject.push(aceHome + '/demo'); copy({ source: "build_support/editor.html", @@ -349,7 +349,7 @@ function demo() { source: [ copy.source.commonjs({ project: project, - require: [ "pilot/index", "ace/defaults", "demo/boot" ] + require: [ "pilot/index", "ace/defaults", "demo/kitchen-sink/boot" ] }) ], filter: [ copy.filter.moduleDefines ], @@ -358,8 +358,7 @@ function demo() { copy({ source: { root: project, - include: /demo\/docs\/.*$/, - exclude: /tests?\// + include: /demo\/kitchen-sink\/docs\/.*$/, }, filter: [ copy.filter.addDefines ], dest: demo @@ -367,8 +366,7 @@ function demo() { copy({ source: { root: project, - include: /.*\.css$/, - exclude: /tests?\// + include: /ace\/.*\.css$/, }, filter: [ copy.filter.addDefines ], dest: demo @@ -377,11 +375,11 @@ function demo() { copy({ source: demo, filter: [ filterTextPlugin ], - dest: 'build/demo/kitchen-sink-uncompressed.js' + dest: 'build/demo/kitchen-sink/kitchen-sink-uncompressed.js' }); copy({ source: demo, filter: [ copy.filter.uglifyjs, filterTextPlugin ], - dest: 'build/demo/kitchen-sink.js' + dest: 'build/demo/kitchen-sink/kitchen-sink.js' }); } diff --git a/demo/boot.js b/demo/kitchen-sink/boot.js similarity index 96% rename from demo/boot.js rename to demo/kitchen-sink/boot.js index 93d9badb..a91c37e7 100644 --- a/demo/boot.js +++ b/demo/kitchen-sink/boot.js @@ -40,7 +40,7 @@ define(function(require, exports, module) { require("pilot/fixoldbrowsers"); require("pilot/plugin_manager"); require("pilot/environment"); -require("demo/demo"); +require("demo/kitchen-sink/demo"); require("pilot/index"); require("ace/defaults"); @@ -50,7 +50,7 @@ var catalog = require("pilot/plugin_manager").catalog; catalog.registerPlugins(plugins).then(function() { var env = require("pilot/environment").create(); catalog.startupPlugins({ env: env }).then(function() { - require("demo/demo").launch(env); + require("demo/kitchen-sink/demo").launch(env); }); }); diff --git a/demo/demo.js b/demo/kitchen-sink/demo.js similarity index 90% rename from demo/demo.js rename to demo/kitchen-sink/demo.js index 4723dff0..ab059f20 100644 --- a/demo/demo.js +++ b/demo/kitchen-sink/demo.js @@ -125,7 +125,7 @@ exports.launch = function(env) { modesByName[m.name] = m; }); - var loreIpsum = require("ace/requirejs/text!demo/docs/plaintext.txt"); + var loreIpsum = require("ace/requirejs/text!demo/kitchen-sink/docs/plaintext.txt"); for (var i = 0; i < 5; i++) { loreIpsum += loreIpsum; } @@ -133,108 +133,108 @@ exports.launch = function(env) { var docs = [ new Doc( "javascript", "JavaScript", - require("ace/requirejs/text!demo/docs/javascript.js") + require("ace/requirejs/text!demo/kitchen-sink/docs/javascript.js") ), new WrappedDoc("text", "Plain Text", loreIpsum), new Doc( "coffee", "Coffeescript", - require("ace/requirejs/text!demo/docs/coffeescript.coffee") + require("ace/requirejs/text!demo/kitchen-sink/docs/coffeescript.coffee") ), new Doc( "json", "JSON", - require("ace/requirejs/text!demo/docs/json.json") + require("ace/requirejs/text!demo/kitchen-sink/docs/json.json") ), new Doc( "css", "CSS", - require("ace/requirejs/text!demo/docs/css.css") + require("ace/requirejs/text!demo/kitchen-sink/docs/css.css") ), new Doc( "scss", "SCSS", - require("ace/requirejs/text!demo/docs/scss.scss") + require("ace/requirejs/text!demo/kitchen-sink/docs/scss.scss") ), new Doc( "html", "HTML", - require("ace/requirejs/text!demo/docs/html.html") + require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") ), new Doc( "xml", "XML", - require("ace/requirejs/text!demo/docs/xml.xml") + require("ace/requirejs/text!demo/kitchen-sink/docs/xml.xml") ), new Doc( "svg", "SVG", - require("ace/requirejs/text!demo/docs/svg.svg") + require("ace/requirejs/text!demo/kitchen-sink/docs/svg.svg") ), new Doc( "php", "PHP", - require("ace/requirejs/text!demo/docs/php.php") + require("ace/requirejs/text!demo/kitchen-sink/docs/php.php") ), new Doc( "coldfusion", "ColdFusion", - require("ace/requirejs/text!demo/docs/coldfusion.cfm") + require("ace/requirejs/text!demo/kitchen-sink/docs/coldfusion.cfm") ), new Doc( "python", "Python", - require("ace/requirejs/text!demo/docs/python.py") + require("ace/requirejs/text!demo/kitchen-sink/docs/python.py") ), new Doc( "ruby", "Ruby", - require("ace/requirejs/text!demo/docs/ruby.rb") + require("ace/requirejs/text!demo/kitchen-sink/docs/ruby.rb") ), new Doc( "perl", "Perl", - require("ace/requirejs/text!demo/docs/perl.pl") + require("ace/requirejs/text!demo/kitchen-sink/docs/perl.pl") ), new Doc( "ocaml", "OCaml", - require("ace/requirejs/text!demo/docs/ocaml.ml") + require("ace/requirejs/text!demo/kitchen-sink/docs/ocaml.ml") ), new Doc( "lua", "Lua", - require("ace/requirejs/text!demo/docs/lua.lua") + require("ace/requirejs/text!demo/kitchen-sink/docs/lua.lua") ), new Doc( "java", "Java", - require("ace/requirejs/text!demo/docs/java.java") + require("ace/requirejs/text!demo/kitchen-sink/docs/java.java") ), new Doc( "clojure", "Clojure", - require("ace/requirejs/text!demo/docs/clojure.clj") + require("ace/requirejs/text!demo/kitchen-sink/docs/clojure.clj") ), new Doc( "groovy", "Groovy", - require("ace/requirejs/text!demo/docs/groovy.groovy") + require("ace/requirejs/text!demo/kitchen-sink/docs/groovy.groovy") ), new Doc( "scala", "Scala", - require("ace/requirejs/text!demo/docs/scala.scala") + require("ace/requirejs/text!demo/kitchen-sink/docs/scala.scala") ), new Doc( "csharp", "C#", - require("ace/requirejs/text!demo/docs/csharp.cs") + require("ace/requirejs/text!demo/kitchen-sink/docs/csharp.cs") ), new Doc( "powershell", "Powershell", - require("ace/requirejs/text!demo/docs/powershell.ps1") + require("ace/requirejs/text!demo/kitchen-sink/docs/powershell.ps1") ), new Doc( "c_cpp", "C/C++", - require("ace/requirejs/text!demo/docs/cpp.cpp") + require("ace/requirejs/text!demo/kitchen-sink/docs/cpp.cpp") ), new Doc( "markdown", "Markdown", - require("ace/requirejs/text!demo/docs/markdown.md") + require("ace/requirejs/text!demo/kitchen-sink/docs/markdown.md") ), new WrappedDoc( "markdown", "Markdown", - require("ace/requirejs/text!demo/docs/markdown.md") + require("ace/requirejs/text!demo/kitchen-sink/docs/markdown.md") ), new WrappedDoc( "textile", "Textile", - require("ace/requirejs/text!demo/docs/textile.textile") + require("ace/requirejs/text!demo/kitchen-sink/docs/textile.textile") ), new WrappedDoc( "latex", "LaTeX", - require("ace/requirejs/text!demo/docs/latex.tex") + require("ace/requirejs/text!demo/kitchen-sink/docs/latex.tex") ) ]; diff --git a/demo/docs/clojure.clj b/demo/kitchen-sink/docs/clojure.clj similarity index 100% rename from demo/docs/clojure.clj rename to demo/kitchen-sink/docs/clojure.clj diff --git a/demo/docs/coffeescript.coffee b/demo/kitchen-sink/docs/coffeescript.coffee similarity index 100% rename from demo/docs/coffeescript.coffee rename to demo/kitchen-sink/docs/coffeescript.coffee diff --git a/demo/docs/coldfusion.cfm b/demo/kitchen-sink/docs/coldfusion.cfm similarity index 100% rename from demo/docs/coldfusion.cfm rename to demo/kitchen-sink/docs/coldfusion.cfm diff --git a/demo/docs/cpp.cpp b/demo/kitchen-sink/docs/cpp.cpp similarity index 100% rename from demo/docs/cpp.cpp rename to demo/kitchen-sink/docs/cpp.cpp diff --git a/demo/docs/csharp.cs b/demo/kitchen-sink/docs/csharp.cs similarity index 100% rename from demo/docs/csharp.cs rename to demo/kitchen-sink/docs/csharp.cs diff --git a/demo/docs/css.css b/demo/kitchen-sink/docs/css.css similarity index 100% rename from demo/docs/css.css rename to demo/kitchen-sink/docs/css.css diff --git a/demo/docs/groovy.groovy b/demo/kitchen-sink/docs/groovy.groovy similarity index 100% rename from demo/docs/groovy.groovy rename to demo/kitchen-sink/docs/groovy.groovy diff --git a/demo/docs/html.html b/demo/kitchen-sink/docs/html.html similarity index 100% rename from demo/docs/html.html rename to demo/kitchen-sink/docs/html.html diff --git a/demo/docs/java.java b/demo/kitchen-sink/docs/java.java similarity index 100% rename from demo/docs/java.java rename to demo/kitchen-sink/docs/java.java diff --git a/demo/docs/javascript.js b/demo/kitchen-sink/docs/javascript.js similarity index 100% rename from demo/docs/javascript.js rename to demo/kitchen-sink/docs/javascript.js diff --git a/demo/docs/json.json b/demo/kitchen-sink/docs/json.json similarity index 100% rename from demo/docs/json.json rename to demo/kitchen-sink/docs/json.json diff --git a/demo/docs/latex.tex b/demo/kitchen-sink/docs/latex.tex similarity index 100% rename from demo/docs/latex.tex rename to demo/kitchen-sink/docs/latex.tex diff --git a/demo/docs/lua.lua b/demo/kitchen-sink/docs/lua.lua similarity index 100% rename from demo/docs/lua.lua rename to demo/kitchen-sink/docs/lua.lua diff --git a/demo/docs/markdown.md b/demo/kitchen-sink/docs/markdown.md similarity index 100% rename from demo/docs/markdown.md rename to demo/kitchen-sink/docs/markdown.md diff --git a/demo/docs/ocaml.ml b/demo/kitchen-sink/docs/ocaml.ml similarity index 100% rename from demo/docs/ocaml.ml rename to demo/kitchen-sink/docs/ocaml.ml diff --git a/demo/docs/perl.pl b/demo/kitchen-sink/docs/perl.pl similarity index 100% rename from demo/docs/perl.pl rename to demo/kitchen-sink/docs/perl.pl diff --git a/demo/docs/php.php b/demo/kitchen-sink/docs/php.php similarity index 100% rename from demo/docs/php.php rename to demo/kitchen-sink/docs/php.php diff --git a/demo/docs/plaintext.txt b/demo/kitchen-sink/docs/plaintext.txt similarity index 100% rename from demo/docs/plaintext.txt rename to demo/kitchen-sink/docs/plaintext.txt diff --git a/demo/docs/powershell.ps1 b/demo/kitchen-sink/docs/powershell.ps1 similarity index 100% rename from demo/docs/powershell.ps1 rename to demo/kitchen-sink/docs/powershell.ps1 diff --git a/demo/docs/python.py b/demo/kitchen-sink/docs/python.py similarity index 100% rename from demo/docs/python.py rename to demo/kitchen-sink/docs/python.py diff --git a/demo/docs/ruby.rb b/demo/kitchen-sink/docs/ruby.rb similarity index 100% rename from demo/docs/ruby.rb rename to demo/kitchen-sink/docs/ruby.rb diff --git a/demo/docs/scala.scala b/demo/kitchen-sink/docs/scala.scala similarity index 100% rename from demo/docs/scala.scala rename to demo/kitchen-sink/docs/scala.scala diff --git a/demo/docs/scss.scss b/demo/kitchen-sink/docs/scss.scss similarity index 100% rename from demo/docs/scss.scss rename to demo/kitchen-sink/docs/scss.scss diff --git a/demo/docs/sql.sql b/demo/kitchen-sink/docs/sql.sql similarity index 100% rename from demo/docs/sql.sql rename to demo/kitchen-sink/docs/sql.sql diff --git a/demo/docs/svg.svg b/demo/kitchen-sink/docs/svg.svg similarity index 100% rename from demo/docs/svg.svg rename to demo/kitchen-sink/docs/svg.svg diff --git a/demo/docs/textile.textile b/demo/kitchen-sink/docs/textile.textile similarity index 100% rename from demo/docs/textile.textile rename to demo/kitchen-sink/docs/textile.textile diff --git a/demo/docs/xml.xml b/demo/kitchen-sink/docs/xml.xml similarity index 100% rename from demo/docs/xml.xml rename to demo/kitchen-sink/docs/xml.xml diff --git a/demo/icons/Readme.txt b/demo/kitchen-sink/icons/Readme.txt similarity index 100% rename from demo/icons/Readme.txt rename to demo/kitchen-sink/icons/Readme.txt diff --git a/demo/icons/epl.html b/demo/kitchen-sink/icons/epl.html similarity index 100% rename from demo/icons/epl.html rename to demo/kitchen-sink/icons/epl.html diff --git a/demo/icons/error_obj.gif b/demo/kitchen-sink/icons/error_obj.gif similarity index 100% rename from demo/icons/error_obj.gif rename to demo/kitchen-sink/icons/error_obj.gif diff --git a/demo/icons/warning_obj.gif b/demo/kitchen-sink/icons/warning_obj.gif similarity index 100% rename from demo/icons/warning_obj.gif rename to demo/kitchen-sink/icons/warning_obj.gif diff --git a/demo/logo.png b/demo/kitchen-sink/logo.png similarity index 100% rename from demo/logo.png rename to demo/kitchen-sink/logo.png diff --git a/demo/require.js b/demo/kitchen-sink/require.js similarity index 100% rename from demo/require.js rename to demo/kitchen-sink/require.js diff --git a/demo/styles.css b/demo/kitchen-sink/styles.css similarity index 100% rename from demo/styles.css rename to demo/kitchen-sink/styles.css diff --git a/demo/static-highlighter/client.html b/demo/static-highlighter/client.html new file mode 100644 index 00000000..561add80 --- /dev/null +++ b/demo/static-highlighter/client.html @@ -0,0 +1,48 @@ + + + + + + Static Code highlighter using Ace + + + + +

Client Side Syntax Highlighting

+ +

Syntax highlighting using Ace language modes and themes.

+ +
+ + + + + + diff --git a/demo/static-highlighter/server.js b/demo/static-highlighter/server.js new file mode 100644 index 00000000..a58b00b6 --- /dev/null +++ b/demo/static-highlighter/server.js @@ -0,0 +1,36 @@ +/** + * Simple node.js server, which generates the synax highlighted version of itself + * using the Ace modes and themes on the server and serving a static web page. + */ + +// include ace search path and modules +require("../../support/paths"); + +// load jsdom, which is required by Ace +require("ace/test/mockdom"); + +var http = require("http"); +var fs = require("fs"); + +// load the highlighter and the desired mode and theme +var highlighter = require("ace/ext/static_highlight"); +var JavaScriptMode = require("ace/mode/javascript").Mode; +var theme = require("ace/theme/twilight"); + +var port = process.env.PORT || 2222; + +http.createServer(function(req, res) { + res.writeHead(200, {"Content-Type": "text/html"}); + + fs.readFile(__filename, "utf8", function(err, data) { + var highlighted = highlighter.render(data, new JavaScriptMode(), theme); + res.end('\n\ +\n\ +:html:\n\ +'.replace(":css:", highlighted.css).replace(":html:", highlighted.html)); + }); +}).listen(port); + +console.log("Listening on port " + port); \ No newline at end of file diff --git a/kitchen-sink.html b/kitchen-sink.html index 572e71c4..9c7a90d7 100644 --- a/kitchen-sink.html +++ b/kitchen-sink.html @@ -6,7 +6,7 @@ Ace Kitchen Sink - + - +
@@ -189,20 +189,20 @@ - + diff --git a/lib/ace/ext/static.css b/lib/ace/ext/static.css new file mode 100644 index 00000000..d048034f --- /dev/null +++ b/lib/ace/ext/static.css @@ -0,0 +1,22 @@ +.ace_editor { + font-family: 'Monaco', 'Menlo', 'Droid Sans Mono', 'Courier New', monospace; + font-size: 12px; +} + +.ace_editor .ace_gutter { + width: 25px !important; + display: block; + float: left; + text-align: right; + padding: 0 3px 0 0; + margin-right: 3px; +} + +.ace-row { clear: both; } + +*.ace_gutter-cell { + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + user-select: none; +} \ No newline at end of file diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js new file mode 100644 index 00000000..bcdf10eb --- /dev/null +++ b/lib/ace/ext/static_highlight.js @@ -0,0 +1,95 @@ +/* vim:ts=4:sts=4:sw=4: + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Jan Jongboom + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { + +var EditSession = require("ace/edit_session").EditSession; +var TextLayer = require("ace/layer/text").Text; +var baseStyles = require("ace/requirejs/text!ace/ext/static.css"); + +/** Transforms a given input code snippet into HTML using the given mode +* +* @param {string} input Code snippet +* @param {mode} mode Mode loaded from /ace/mode (use 'ServerSideHiglighter.getMode') +* @param {string} r Code snippet +* @returns {object} An object containing: html, css +*/ + +exports.render = function(input, mode, theme) { + var session = new EditSession(""); + session.setMode(mode); + session.setUseWorker(false); + + var textLayer = new TextLayer(document.createElement("div")); + textLayer.setSession(session); + textLayer.config = { + characterWidth: 10, + lineHeight: 20 + }; + + session.setValue(input); + + var stringBuilder = []; + var length = session.getLength(); + var tokens = session.getTokens(0, length - 1); + + for(var ix = 0; ix < length; ix++) { + var lineTokens = tokens[ix].tokens; + stringBuilder.push("
"); + stringBuilder.push("" + (ix+1) + ""); + textLayer.$renderLine(stringBuilder, 0, lineTokens, true); + stringBuilder.push("
"); + } + + // let's prepare the whole html + var html = "
\ +
\ + :code\ +
\ +
".replace(/:cssClass/, theme.cssClass).replace(/:code/, stringBuilder.join("")); + + textLayer.destroy(); + + return { + css: baseStyles + theme.cssText, + html: html + }; +}; + +}); \ No newline at end of file diff --git a/lib/ace/ext/static_highlight_test.js b/lib/ace/ext/static_highlight_test.js new file mode 100644 index 00000000..e2658073 --- /dev/null +++ b/lib/ace/ext/static_highlight_test.js @@ -0,0 +1,74 @@ +if (typeof process !== "undefined") { + require("../../../support/paths"); + require("ace/test/mockdom"); +} + +var assert = require("assert"); +var highlighter = require("./static_highlight"); +var JavaScriptMode = require("ace/mode/javascript").Mode; + +// Execution ORDER: test.setUpSuite, setUp, testFn, tearDown, test.tearDownSuite +module.exports = { + timeout: 10000, + + "test simple snippet": function(next) { + var theme = require("ace/theme/tomorrow"); + var snippet = "/** this is a function\n\ +*\n\ +*/\n\ +function hello (a, b, c) {\n\ + console.log(a * b + c + 'sup?');\n\ +}"; + var mode = new JavaScriptMode(); + + var isError = false, result; + try { + result = highlighter.render(snippet, mode, theme); + } + catch (e) { + console.log(e); + isError = true; + } + // todo: write something more meaningful + assert.equal(isError, false); + + next(); + }, + + "test css from theme is used": function(next) { + var theme = require("ace/theme/tomorrow"); + var snippet = "/** this is a function\n\ +*\n\ +*/\n\ +function hello (a, b, c) {\n\ + console.log(a * b + c + 'sup?');\n\ +}"; + var mode = new JavaScriptMode(); + + var isError = false, result; + result = highlighter.render(snippet, mode, theme); + + assert.equal(result.css, theme.cssText); + + next(); + }, + + "test theme classname should be in output html": function (next) { + var theme = require("ace/theme/tomorrow"); + var snippet = "/** this is a function\n\ +*\n\ +*/\n\ +function hello (a, b, c) {\n\ + console.log(a * b + c + 'sup?');\n\ +}"; + var mode = new JavaScriptMode(); + + var isError = false, result; + result = highlighter.render(snippet, mode, theme); + assert.equal(!!result.html.match(/
/), true); + + next(); + } +}; + +!module.parent && require("asyncjs").test.testcase(module.exports).exec(); diff --git a/lib/ace/test/mockrenderer.js b/lib/ace/test/mockrenderer.js index 3c0c4342..ad8a24d7 100644 --- a/lib/ace/test/mockrenderer.js +++ b/lib/ace/test/mockrenderer.js @@ -161,4 +161,8 @@ MockRenderer.prototype.textToScreenCoordinates = function() { } }; +MockRenderer.prototype.adjustWrapLimit = function () { + +}; + }); diff --git a/lib/ace/theme/tomorrow.js b/lib/ace/theme/tomorrow.js index 977c4d33..e91cd3c5 100644 --- a/lib/ace/theme/tomorrow.js +++ b/lib/ace/theme/tomorrow.js @@ -37,9 +37,7 @@ define(function(require, exports, module) { - var dom = require("pilot/dom"); - - var cssText = ".ace-tomorrow .ace_editor {\ + exports.cssText = ".ace-tomorrow .ace_editor {\ border: 2px solid rgb(159, 159, 159);\ }\ \ @@ -254,8 +252,5 @@ background-color:#8959A8;\ \ }"; - // import CSS once - dom.importCssString(cssText); - exports.cssClass = "ace-tomorrow"; }); \ No newline at end of file diff --git a/support/pilot b/support/pilot index c720ab56..f1ac22a9 160000 --- a/support/pilot +++ b/support/pilot @@ -1 +1 @@ -Subproject commit c720ab56a80ba8cc10d0c86a9c4f1fa9cfc83b1b +Subproject commit f1ac22a9bc806772ae68fd67d800fc0625518346