From 4143bba89f0c53311e197a74aa5ee75267b25dc8 Mon Sep 17 00:00:00 2001 From: bwhitn Date: Sat, 1 Jul 2017 00:40:22 -0400 Subject: [PATCH 01/30] This adds the ability to move the file data from Utils.displayFilesAsHTML to the input. --- src/core/Utils.js | 7 +++++++ src/web/Manager.js | 1 + src/web/OutputWaiter.js | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/core/Utils.js b/src/core/Utils.js index 9011880f..4fd464cc 100755 --- a/src/core/Utils.js +++ b/src/core/Utils.js @@ -942,6 +942,12 @@ const Utils = { "aria-controls='collapse" + i + "' " + "title=\"Show/hide contents of '" + Utils.escapeHtml(file.fileName) + "'\">🔍"; + const hexFileData = Utils.byteArrayToHex(new Uint8Array(file.bytes)); + + const switchFileDataToInput = ""; + const html = "
" + "
diff --git a/src/web/stylesheets/layout/_banner.css b/src/web/stylesheets/layout/_banner.css index df994ea5..cb902157 100644 --- a/src/web/stylesheets/layout/_banner.css +++ b/src/web/stylesheets/layout/_banner.css @@ -10,19 +10,15 @@ position: absolute; height: 30px; width: 100%; - text-align: center; line-height: 30px; border-bottom: 1px solid var(--primary-border-colour); color: var(--banner-font-colour); background-color: var(--banner-bg-colour); } -.banner-right { - float: right; - margin-right: 10px; -} - #banner img { margin-bottom: 2px; margin-left: 8px; + padding-right: 10px; } + From 183c57643bf401bc7a95ba983b944558bfcf2f29 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Mon, 3 Jul 2017 15:25:14 +0000 Subject: [PATCH 04/30] Tidied up changes to filetime operations and brought tests up to date --- src/core/config/OperationConfig.js | 4 ++-- src/core/operations/DateTime.js | 16 ++++++++++++---- test/tests/operations/DateTime.js | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 89cd9e44..f8d9fe6d 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -2303,7 +2303,7 @@ const OperationConfig = { value: DateTime.UNITS }, { - name: "Input Format", + name: "Input format", type: "option", value: DateTime.FILETIME_FORMATS } @@ -2321,7 +2321,7 @@ const OperationConfig = { value: DateTime.UNITS }, { - name: "Output Format", + name: "Output format", type: "option", value: DateTime.FILETIME_FORMATS } diff --git a/src/core/operations/DateTime.js b/src/core/operations/DateTime.js index dcfa2faf..b665a2b5 100755 --- a/src/core/operations/DateTime.js +++ b/src/core/operations/DateTime.js @@ -89,14 +89,17 @@ const DateTime = { * @returns {string} */ runFromFiletimeToUnix: function(input, args) { - let units = args[0]; - let format = args[1]; + let units = args[0], + format = args[1]; + if (format === "Hex") { input = new BigInteger(input, 16); } else { input = new BigInteger(input); } + input = input.subtract(new BigInteger("116444736000000000")); + if (units === "Seconds (s)"){ input = input.divide(new BigInteger("10000000")); } else if (units === "Milliseconds (ms)") { @@ -108,6 +111,7 @@ const DateTime = { } else { throw "Unrecognised unit"; } + return input.toString(); }, @@ -121,9 +125,11 @@ const DateTime = { * @returns {string} */ runToFiletimeFromUnix: function(input, args) { - let units = args[0]; - let format = args[1]; + let units = args[0], + format = args[1]; + input = new BigInteger(input); + if (units === "Seconds (s)"){ input = input.multiply(new BigInteger("10000000")); } else if (units === "Milliseconds (ms)") { @@ -135,7 +141,9 @@ const DateTime = { } else { throw "Unrecognised unit"; } + input = input.add(new BigInteger("116444736000000000")); + if (format === "Hex"){ return input.toString(16); } else { diff --git a/test/tests/operations/DateTime.js b/test/tests/operations/DateTime.js index 7ee445ff..f8226ac6 100644 --- a/test/tests/operations/DateTime.js +++ b/test/tests/operations/DateTime.js @@ -16,7 +16,7 @@ TestRegister.addTests([ recipeConfig: [ { op: "Windows Filetime to UNIX Timestamp", - args: ["Nanoseconds (ns)"], + args: ["Nanoseconds (ns)", "Decimal"], }, ], }, @@ -27,7 +27,7 @@ TestRegister.addTests([ recipeConfig: [ { op: "UNIX Timestamp to Windows Filetime", - args: ["Nanoseconds (ns)"], + args: ["Nanoseconds (ns)", "Decimal"], }, ], }, From 85d41085de88a5f1ea5411ffe712dc265b76d380 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Mon, 3 Jul 2017 15:25:52 +0000 Subject: [PATCH 05/30] 5.11.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05cee769..b89f13c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cyberchef", - "version": "5.10.7", + "version": "5.11.1", "lockfileVersion": 1, "dependencies": { "abab": { diff --git a/package.json b/package.json index f37f376c..826b38d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cyberchef", - "version": "5.11.0", + "version": "5.11.1", "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.", "author": "n1474335 ", "homepage": "https://gchq.github.io/CyberChef", From c460c2bf6b2ce1db33a524176dbe09509f4d5acd Mon Sep 17 00:00:00 2001 From: n1474335 Date: Fri, 7 Jul 2017 13:23:58 +0000 Subject: [PATCH 06/30] Replaced hexToByteArray with fromHex and byteArrayToHex with toHex. Switched displayFilesAsHTML operation to use template strings and introduced markup formatting method. --- src/core/Ingredient.js | 2 +- src/core/Utils.js | 150 ++++++++++++------------------- src/core/operations/BitwiseOp.js | 4 +- src/core/operations/IP.js | 4 +- src/web/OutputWaiter.js | 1 + 5 files changed, 62 insertions(+), 99 deletions(-) diff --git a/src/core/Ingredient.js b/src/core/Ingredient.js index 543f732b..e8d8a8cc 100755 --- a/src/core/Ingredient.js +++ b/src/core/Ingredient.js @@ -73,7 +73,7 @@ Ingredient.prepare = function(data, type) { case "byteArray": if (typeof data == "string") { data = data.replace(/\s+/g, ""); - return Utils.hexToByteArray(data); + return Utils.fromHex(data); } else { return data; } diff --git a/src/core/Utils.js b/src/core/Utils.js index 3af4ca5b..8bfef0a8 100755 --- a/src/core/Utils.js +++ b/src/core/Utils.js @@ -340,50 +340,6 @@ const Utils = { }, - /** - * Translates a hex string into an array of bytes. - * - * @param {string} hexStr - * @returns {byteArray} - * - * @example - * // returns [0xfe, 0x09, 0xa7] - * Utils.hexToByteArray("fe09a7"); - */ - hexToByteArray: function(hexStr) { - // TODO: Handle errors i.e. input string is not hex - if (!hexStr) return []; - hexStr = hexStr.replace(/\s+/g, ""); - const byteArray = []; - for (let i = 0; i < hexStr.length; i += 2) { - byteArray.push(parseInt(hexStr.substr(i, 2), 16)); - } - return byteArray; - }, - - - /** - * Translates an array of bytes to a hex string. - * - * @param {byteArray} byteArray - * @param {string} [delim=" "] - * @returns {string} - * - * @example - * // returns "fe09a7" - * Utils.byteArrayToHex([0xfe, 0x09, 0xa7], ""); - */ - byteArrayToHex: function(byteArray, delim) { - if (!byteArray) return ""; - delim = typeof delim === "undefined" ? " " : delim; - let hexStr = ""; - for (let i = 0; i < byteArray.length; i++) { - hexStr += Utils.hex(byteArray[i]) + delim; - } - return hexStr.slice(0, hexStr.length - delim.length); - }, - - /** * Converts a string to a byte array. * Treats the string as UTF-8 if any values are over 255. @@ -828,7 +784,7 @@ const Utils = { if (removeScriptAndStyle) { htmlStr = htmlStr.replace(/<(script|style)[^>]*>.*<\/(script|style)>/gmi, ""); } - return htmlStr.replace(/<[^>\n]+>/g, ""); + return htmlStr.replace(/<[^>]+>/g, ""); }, @@ -946,16 +902,19 @@ const Utils = { * @returns {html} */ displayFilesAsHTML: function(files) { + /* and used to denote newlines and spaces in HTML markup. + * If a non-html operation is used, all markup will be removed but these + * whitespace chars will remain for formatting purposes. + */ + const formatDirectory = function(file) { - const html = "
" + - "" + - "
"; + const html = `
+ +
`; return html; }; @@ -966,52 +925,52 @@ const Utils = { ); const blobUrl = URL.createObjectURL(blob); - const downloadAnchorElem = "\u21B4"; + const viewFileElem = ``; - const expandFileContentsElem = "🔍"; + const downloadFileElem = `💾`; - const hexFileData = Utils.byteArrayToHex(new Uint8Array(file.bytes)); + const hexFileData = Utils.toHexFast(new Uint8Array(file.bytes)); - const switchFileDataToInput = ""; + const switchToInputElem = ``; - const html = "
" + - "" + - "
" + - "
" + - "
" + Utils.escapeHtml(file.contents) + "
" + - "
" + - "
"; + const html = `
+ +
+
+
${Utils.escapeHtml(file.contents)}
+
+
+
`; return html; }; - let html = "
" + - files.length + - " file(s) found
\n"; + let html = `
+ ${files.length} file(s) found +
`; + files.forEach(function(file, i) { if (typeof file.contents !== "undefined") { html += formatFile(file, i); @@ -1019,7 +978,10 @@ const Utils = { html += formatDirectory(file); } }); - return html; + + return html.replace(/(?:(
(?:\n|.)*<\/pre>)|\s{2,})/g, "$1") // Remove whitespace from markup
+            .replace(//g, "\n") // Replace  with newlines
+            .replace(//g, " "); // Replace  with spaces
     },
 
 
diff --git a/src/core/operations/BitwiseOp.js b/src/core/operations/BitwiseOp.js
index 7a4675f6..5b7fb741 100755
--- a/src/core/operations/BitwiseOp.js
+++ b/src/core/operations/BitwiseOp.js
@@ -142,12 +142,12 @@ const BitwiseOp = {
 
 
         for (let key = 1, l = Math.pow(256, keyLength); key < l; key++) {
-            result = BitwiseOp._bitOp(input, Utils.hexToByteArray(key.toString(16)), BitwiseOp._xor, nullPreserving, differential);
+            result = BitwiseOp._bitOp(input, Utils.fromHex(key.toString(16)), BitwiseOp._xor, nullPreserving, differential);
             resultUtf8 = Utils.byteArrayToUtf8(result);
             if (crib !== "" && resultUtf8.search(regex) === -1) continue;
             if (printKey) output += "Key = " + Utils.hex(key, (2*keyLength)) + ": ";
             if (outputHex)
-                output += Utils.byteArrayToHex(result) + "\n";
+                output += Utils.toHex(result) + "\n";
             else
                 output += Utils.printable(resultUtf8, false) + "\n";
             if (printKey) output += "\n";
diff --git a/src/core/operations/IP.js b/src/core/operations/IP.js
index 8a852789..4c3eb5de 100755
--- a/src/core/operations/IP.js
+++ b/src/core/operations/IP.js
@@ -283,7 +283,7 @@ const IP = {
                     baIp.push(decimal & 255);
                     break;
                 case "Hex":
-                    baIp = Utils.hexToByteArray(lines[i]);
+                    baIp = Utils.fromHex(lines[i]);
                     break;
                 default:
                     throw "Unsupported input IP format";
@@ -516,7 +516,7 @@ const IP = {
             "Destination IP address" + IP._ipv4ToStr(dstIP) + "";
 
         if (ihl > 5) {
-            output += "Options" + Utils.byteArrayToHex(options) + "";
+            output += "Options" + Utils.toHex(options) + "";
         }
 
         return output + "";
diff --git a/src/web/OutputWaiter.js b/src/web/OutputWaiter.js
index 3523db18..ee5d57ca 100755
--- a/src/web/OutputWaiter.js
+++ b/src/web/OutputWaiter.js
@@ -172,6 +172,7 @@ OutputWaiter.prototype.undoSwitchClick = function() {
  * Moves a files data for items created via Utils.displayFilesAsHTML to the input.
  */
 OutputWaiter.prototype.fileSwitch = function(e) {
+    e.preventDefault();
     this.switchOrigData = this.manager.input.get();
     this.app.setInput(e.target.getAttribute("fileValue"));
     document.getElementById("undo-switch").disabled = false;

From 7e310a8de7241d6dd9aa1b113008e469ffa8bac7 Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Fri, 7 Jul 2017 13:26:51 +0000
Subject: [PATCH 07/30] Moved file switch listener to correct block

---
 src/web/Manager.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/web/Manager.js b/src/web/Manager.js
index dddeead7..8166f606 100755
--- a/src/web/Manager.js
+++ b/src/web/Manager.js
@@ -145,6 +145,7 @@ Manager.prototype.initialiseEventListeners = function() {
     document.getElementById("output-html").addEventListener("mousemove", this.highlighter.outputHtmlMousemove.bind(this.highlighter));
     this.addMultiEventListener("#output-text", "mousedown dblclick select",  this.highlighter.outputMousedown, this.highlighter);
     this.addMultiEventListener("#output-html", "mousedown dblclick select",  this.highlighter.outputHtmlMousedown, this.highlighter);
+    this.addDynamicListener(".file-switch", "click", this.output.fileSwitch, this.output);
 
     // Options
     document.getElementById("options").addEventListener("click", this.options.optionsClick.bind(this.options));
@@ -158,7 +159,6 @@ Manager.prototype.initialiseEventListeners = function() {
 
     // Misc
     document.getElementById("alert-close").addEventListener("click", this.app.alertCloseClick.bind(this.app));
-    this.addDynamicListener(".file-switch", "click", this.output.fileSwitch, this.output);
 };
 
 

From 7c5dd2bd78f41796ee576d0bd299a9e963cd30a1 Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Fri, 7 Jul 2017 13:30:27 +0000
Subject: [PATCH 08/30] 5.11.2

---
 package-lock.json | 2 +-
 package.json      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b89f13c9..08a60670 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "5.11.1",
+  "version": "5.11.2",
   "lockfileVersion": 1,
   "dependencies": {
     "abab": {
diff --git a/package.json b/package.json
index 826b38d9..d7c05817 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "5.11.1",
+  "version": "5.11.2",
   "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
   "author": "n1474335 ",
   "homepage": "https://gchq.github.io/CyberChef",

From d16e1a445135d9afc1bcbd4e385f6d24df8dec8f Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Mon, 10 Jul 2017 11:49:41 +0000
Subject: [PATCH 09/30] Fixed bug in 'Show Base64 offsets' where highlights did
 not show

---
 src/core/operations/Base64.js | 36 +++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/core/operations/Base64.js b/src/core/operations/Base64.js
index 069a2b63..c6d9ce6c 100755
--- a/src/core/operations/Base64.js
+++ b/src/core/operations/Base64.js
@@ -221,15 +221,15 @@ const Base64 = {
             offset0 = "" +
                 staticSection + "" +
-                "" + offset0.substr(offset0.length - 3, 1) + "" +
-                "" + offset0.substr(offset0.length - 2) + "";
+                "" + offset0.substr(offset0.length - 3, 1) + "" +
+                "" + offset0.substr(offset0.length - 2) + "";
         } else if (len0 % 4 === 3) {
             staticSection = offset0.slice(0, -2);
             offset0 = "" +
                 staticSection + "" +
-                "" + offset0.substr(offset0.length - 2, 1) + "" +
-                "" + offset0.substr(offset0.length - 1) + "";
+                "" + offset0.substr(offset0.length - 2, 1) + "" +
+                "" + offset0.substr(offset0.length - 1) + "";
         } else {
             staticSection = offset0;
             offset0 = "" + offset1.substr(0, 1) + "" +
-            "" + offset1.substr(1, 1) + "";
+        padding = "" + offset1.substr(0, 1) + "" +
+            "" + offset1.substr(1, 1) + "";
         offset1 = offset1.substr(2);
         if (len1 % 4 === 2) {
             staticSection = offset1.slice(0, -3);
             offset1 = padding + "" +
                 staticSection + "" +
-                "" + offset1.substr(offset1.length - 3, 1) + "" +
-                "" + offset1.substr(offset1.length - 2) + "";
+                "" + offset1.substr(offset1.length - 3, 1) + "" +
+                "" + offset1.substr(offset1.length - 2) + "";
         } else if (len1 % 4 === 3) {
             staticSection = offset1.slice(0, -2);
             offset1 = padding + "" +
                 staticSection + "" +
-                "" + offset1.substr(offset1.length - 2, 1) + "" +
-                "" + offset1.substr(offset1.length - 1) + "";
+                "" + offset1.substr(offset1.length - 2, 1) + "" +
+                "" + offset1.substr(offset1.length - 1) + "";
         } else {
             staticSection = offset1;
             offset1 = padding +  "" + offset2.substr(0, 2) + "" +
-            "" + offset2.substr(2, 1) + "";
+        padding = "" + offset2.substr(0, 2) + "" +
+            "" + offset2.substr(2, 1) + "";
         offset2 = offset2.substr(3);
         if (len2 % 4 === 2) {
             staticSection = offset2.slice(0, -3);
             offset2 = padding + "" +
                 staticSection + "" +
-                "" + offset2.substr(offset2.length - 3, 1) + "" +
-                "" + offset2.substr(offset2.length - 2) + "";
+                "" + offset2.substr(offset2.length - 3, 1) + "" +
+                "" + offset2.substr(offset2.length - 2) + "";
         } else if (len2 % 4 === 3) {
             staticSection = offset2.slice(0, -2);
             offset2 = padding + "" +
                 staticSection + "" +
-                "" + offset2.substr(offset2.length - 2, 1) + "" +
-                "" + offset2.substr(offset2.length - 1) + "";
+                "" + offset2.substr(offset2.length - 2, 1) + "" +
+                "" + offset2.substr(offset2.length - 1) + "";
         } else {
             staticSection = offset2;
             offset2 = padding +  "green could change if the input is surrounded by more data." +
-            "\nCharacters highlighted in red are for padding purposes only." +
+        return (showVariable ? "Characters highlighted in green could change if the input is surrounded by more data." +
+            "\nCharacters highlighted in red are for padding purposes only." +
             "\nUnhighlighted characters are static." +
             "\nHover over the static sections to see what they decode to on their own.\n" +
             "\nOffset 0: " + offset0 +

From 645e540c668f8a87ed0441df4676176506b8baef Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Mon, 10 Jul 2017 11:49:48 +0000
Subject: [PATCH 10/30] 5.11.3

---
 package-lock.json | 2 +-
 package.json      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 08a60670..9a2a3ff7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "5.11.2",
+  "version": "5.11.3",
   "lockfileVersion": 1,
   "dependencies": {
     "abab": {
diff --git a/package.json b/package.json
index d7c05817..a6ce1a01 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "5.11.2",
+  "version": "5.11.3",
   "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
   "author": "n1474335 ",
   "homepage": "https://gchq.github.io/CyberChef",

From 2555de7712b8caee213f1e7fe695273784e0907a Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Wed, 12 Jul 2017 12:49:10 +0000
Subject: [PATCH 11/30] Fixed bug in firefox where recipes containing an =
 character would not load from the URL

---
 src/core/Utils.js | 7 ++++++-
 src/web/App.js    | 7 ++++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/core/Utils.js b/src/core/Utils.js
index 8bfef0a8..6bcfced1 100755
--- a/src/core/Utils.js
+++ b/src/core/Utils.js
@@ -1000,9 +1000,14 @@ const Utils = {
         if (paramStr === "") return {};
 
         // Cut off ? or # and split on &
-        const params = paramStr.substr(1).split("&");
+        if (paramStr[0] === "?" ||
+            paramStr[0] === "#") {
+            paramStr = paramStr.substr(1);
+        }
 
+        const params = paramStr.split("&");
         const result = {};
+
         for (let i = 0; i < params.length; i++) {
             const param = params[i].split("=");
             if (param.length !== 2) {
diff --git a/src/web/App.js b/src/web/App.js
index fd11b85b..693e3efb 100755
--- a/src/web/App.js
+++ b/src/web/App.js
@@ -400,7 +400,12 @@ App.prototype.addFavourite = function(name) {
  */
 App.prototype.loadURIParams = function() {
     // Load query string or hash from URI (depending on which is populated)
-    const params = window.location.search || window.location.hash;
+    // We prefer getting the hash by splitting the href rather than referencing
+    // location.hash as some browsers (Firefox) automatically URL decode it,
+    // which cause issues.
+    const params = window.location.search ||
+        window.location.href.split("#")[1] ||
+        window.location.hash;
     this.uriParams = Utils.parseURIParams(params);
 
     // Pause auto-bake while loading but don't modify `this.autoBake_`

From 086d5272ac54aeb935a198e39028702bb45ab757 Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Wed, 12 Jul 2017 12:49:22 +0000
Subject: [PATCH 12/30] 5.11.4

---
 package-lock.json | 2 +-
 package.json      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9a2a3ff7..accf3fa4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "5.11.3",
+  "version": "5.11.4",
   "lockfileVersion": 1,
   "dependencies": {
     "abab": {
diff --git a/package.json b/package.json
index a6ce1a01..a8fa56d6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cyberchef",
-  "version": "5.11.3",
+  "version": "5.11.4",
   "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
   "author": "n1474335 ",
   "homepage": "https://gchq.github.io/CyberChef",

From 72ec9df1b1ddaff73ab7230f35c97eb3af99ad15 Mon Sep 17 00:00:00 2001
From: n1474335 
Date: Wed, 12 Jul 2017 14:34:45 +0000
Subject: [PATCH 13/30] Fixed option naming conventions

---
 src/web/html/index.html | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/web/html/index.html b/src/web/html/index.html
index 62c560fd..aa63b520 100755
--- a/src/web/html/index.html
+++ b/src/web/html/index.html
@@ -272,32 +272,32 @@
                             
                         
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +
- - + +