diff --git a/modules/hardware/atkseriallink.js b/modules/hardware/atkseriallink.js
index c1d21cd44c48e341aed04b4ace57a16e9a27de5d..615acb7449fb7418562f04bb4c71ca513ed9fbdc 100644
--- a/modules/hardware/atkseriallink.js
+++ b/modules/hardware/atkseriallink.js
@@ -27,7 +27,7 @@ function ATKSerialLink() {
     state.portStatus = 'closed' // or we hope it will be 
 
     atkSerialLink.init = function(){
-        findSerialPort()
+        //findSerialPort()
     }
 
     /*
@@ -74,7 +74,7 @@ function ATKSerialLink() {
                 serialport = new SerialPort(state.portName, {
                     baudRate: 250000
                 })
-                state.portStatus = 'opening'
+                //state.portStatus = 'opening'
                 serialport.on('open', function() {
                     state.portStatus = 'open'
                 })
@@ -150,6 +150,7 @@ function ATKSerialLink() {
         // we'll make sure it's what we think it will be
         // console.log("PORT DATA")
         var dtArray = new Array()
+        console.log('sp data', data)
         if (Buffer.isBuffer(data)) {
             for (var i = 0; i < data.length; i++) {
                 dtArray[i] = data[i]
diff --git a/package-lock.json b/package-lock.json
index c36b3529307813e28adaeecb7bb29d35fef8edb5..dca5b7ebeff08120e3ea3cb71ac8ee8ea85d4cd4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
       "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-1.0.5.tgz",
       "integrity": "sha512-GCz/v/KG2Wv7SdQ2nv8jYGBY6D4h5tibj9bs0+pnryCDAr8xmmvnesFW15FIu4rwOMgsKhCHyp7roD8bRGs63A==",
       "requires": {
-        "safe-buffer": "^5.1.1"
+        "safe-buffer": "5.1.2"
       }
     },
     "@serialport/parser-cctalk": {
@@ -17,7 +17,7 @@
       "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-1.0.5.tgz",
       "integrity": "sha512-VdoG1rRXb5deHM1c9Akn9djoJuHn030v7owYHEqpJeS6Rs6wrC4Hrkw8NxvV9ZPlMqAJ+5uJCaAUzB1tbVd3rA==",
       "requires": {
-        "safe-buffer": "^5.1.1"
+        "safe-buffer": "5.1.2"
       }
     },
     "@serialport/parser-delimiter": {
@@ -25,7 +25,7 @@
       "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-1.0.5.tgz",
       "integrity": "sha512-srDzeNwGM/GjtqK/nFDRIDpcZ6XDgkakFMXBtNDSI+XP6fqO1ynEZok8ljKJxM2ay0CNG83C6/X2xIOHvWhFYQ==",
       "requires": {
-        "safe-buffer": "^5.1.1"
+        "safe-buffer": "5.1.2"
       }
     },
     "@serialport/parser-readline": {
@@ -33,8 +33,8 @@
       "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-1.0.5.tgz",
       "integrity": "sha512-QkZoCQPHwdZOMQk7SHz3QSp7xqK4jdNql9M80oXqWt7kNhFvNXguWzf17FfQrPRIb0qiz+96+P6uAOIi02Yxbg==",
       "requires": {
-        "@serialport/parser-delimiter": "^1.0.5",
-        "safe-buffer": "^5.1.1"
+        "@serialport/parser-delimiter": "1.0.5",
+        "safe-buffer": "5.1.2"
       }
     },
     "@serialport/parser-ready": {
@@ -42,7 +42,7 @@
       "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-1.0.5.tgz",
       "integrity": "sha512-U/ZkxyY35Z7WrDc0O8TGcGPOdwv6fGVJcZq5vXVko2MRt8wiKVD192mmbfTRZXFAX+rARXtQa3ad3yJzXVhb1g==",
       "requires": {
-        "safe-buffer": "^5.1.1"
+        "safe-buffer": "5.1.2"
       }
     },
     "@serialport/parser-regex": {
@@ -50,7 +50,7 @@
       "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-1.0.5.tgz",
       "integrity": "sha512-sX3tRuwwwGV+CZbKEUAKZD/wtG8ZRcGxbiDIm8nyzsPCGv52ck3RlQ9Vp4K8fYjcrGGwm3BWizC4uSzaTLOk1A==",
       "requires": {
-        "safe-buffer": "^5.1.1"
+        "safe-buffer": "5.1.2"
       }
     },
     "abbrev": {
@@ -63,7 +63,7 @@
       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
       "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
       "requires": {
-        "mime-types": "~2.1.18",
+        "mime-types": "2.1.19",
         "negotiator": "0.6.1"
       }
     },
@@ -160,33 +160,33 @@
       "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz",
       "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=",
       "requires": {
-        "ansi-bgblack": "^0.1.1",
-        "ansi-bgblue": "^0.1.1",
-        "ansi-bgcyan": "^0.1.1",
-        "ansi-bggreen": "^0.1.1",
-        "ansi-bgmagenta": "^0.1.1",
-        "ansi-bgred": "^0.1.1",
-        "ansi-bgwhite": "^0.1.1",
-        "ansi-bgyellow": "^0.1.1",
-        "ansi-black": "^0.1.1",
-        "ansi-blue": "^0.1.1",
-        "ansi-bold": "^0.1.1",
-        "ansi-cyan": "^0.1.1",
-        "ansi-dim": "^0.1.1",
-        "ansi-gray": "^0.1.1",
-        "ansi-green": "^0.1.1",
-        "ansi-grey": "^0.1.1",
-        "ansi-hidden": "^0.1.1",
-        "ansi-inverse": "^0.1.1",
-        "ansi-italic": "^0.1.1",
-        "ansi-magenta": "^0.1.1",
-        "ansi-red": "^0.1.1",
-        "ansi-reset": "^0.1.1",
-        "ansi-strikethrough": "^0.1.1",
-        "ansi-underline": "^0.1.1",
-        "ansi-white": "^0.1.1",
-        "ansi-yellow": "^0.1.1",
-        "lazy-cache": "^2.0.1"
+        "ansi-bgblack": "0.1.1",
+        "ansi-bgblue": "0.1.1",
+        "ansi-bgcyan": "0.1.1",
+        "ansi-bggreen": "0.1.1",
+        "ansi-bgmagenta": "0.1.1",
+        "ansi-bgred": "0.1.1",
+        "ansi-bgwhite": "0.1.1",
+        "ansi-bgyellow": "0.1.1",
+        "ansi-black": "0.1.1",
+        "ansi-blue": "0.1.1",
+        "ansi-bold": "0.1.1",
+        "ansi-cyan": "0.1.1",
+        "ansi-dim": "0.1.1",
+        "ansi-gray": "0.1.1",
+        "ansi-green": "0.1.1",
+        "ansi-grey": "0.1.1",
+        "ansi-hidden": "0.1.1",
+        "ansi-inverse": "0.1.1",
+        "ansi-italic": "0.1.1",
+        "ansi-magenta": "0.1.1",
+        "ansi-red": "0.1.1",
+        "ansi-reset": "0.1.1",
+        "ansi-strikethrough": "0.1.1",
+        "ansi-underline": "0.1.1",
+        "ansi-white": "0.1.1",
+        "ansi-yellow": "0.1.1",
+        "lazy-cache": "2.0.2"
       }
     },
     "ansi-cyan": {
@@ -329,8 +329,8 @@
       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
       "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
       "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
+        "delegates": "1.0.0",
+        "readable-stream": "2.3.6"
       }
     },
     "arr-flatten": {
@@ -343,7 +343,7 @@
       "resolved": "https://registry.npmjs.org/arr-swap/-/arr-swap-1.0.1.tgz",
       "integrity": "sha1-FHWQ7WX8gVvAf+8Jl8Llgj1kNTQ=",
       "requires": {
-        "is-number": "^3.0.0"
+        "is-number": "3.0.0"
       },
       "dependencies": {
         "is-number": {
@@ -351,7 +351,7 @@
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           }
         }
       }
@@ -376,8 +376,8 @@
       "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
       "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
       "requires": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
+        "readable-stream": "2.3.6",
+        "safe-buffer": "5.1.2"
       }
     },
     "body-parser": {
@@ -386,15 +386,15 @@
       "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
       "requires": {
         "bytes": "3.0.0",
-        "content-type": "~1.0.4",
+        "content-type": "1.0.4",
         "debug": "2.6.9",
-        "depd": "~1.1.1",
-        "http-errors": "~1.6.2",
+        "depd": "1.1.2",
+        "http-errors": "1.6.3",
         "iconv-lite": "0.4.19",
-        "on-finished": "~2.3.0",
+        "on-finished": "2.3.0",
         "qs": "6.5.1",
         "raw-body": "2.3.2",
-        "type-is": "~1.6.15"
+        "type-is": "1.6.16"
       },
       "dependencies": {
         "debug": {
@@ -412,8 +412,8 @@
       "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
       "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
       "requires": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
+        "buffer-alloc-unsafe": "1.1.0",
+        "buffer-fill": "1.0.0"
       }
     },
     "buffer-alloc-unsafe": {
@@ -436,9 +436,9 @@
       "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-2.0.0.tgz",
       "integrity": "sha1-kv0XYxgteQM/XFxR0Lo1LlVnxpY=",
       "requires": {
-        "ansi-dim": "^0.1.1",
-        "debug": "^2.6.6",
-        "strip-color": "^0.1.0"
+        "ansi-dim": "0.1.1",
+        "debug": "2.6.9",
+        "strip-color": "0.1.0"
       },
       "dependencies": {
         "debug": {
@@ -461,10 +461,10 @@
       "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-1.0.0.tgz",
       "integrity": "sha512-hmJRX8x1QOJVV+GUjOBzi6iauhPqc9hIF6xitWRBbiPZOBb6vGo/mDRIK9P74RTKSQK7AE8B0DDWY/vpRrPmQw==",
       "requires": {
-        "for-own": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^5.0.0",
-        "shallow-clone": "^1.0.0"
+        "for-own": "1.0.0",
+        "is-plain-object": "2.0.4",
+        "kind-of": "5.1.0",
+        "shallow-clone": "1.0.0"
       },
       "dependencies": {
         "kind-of": {
@@ -484,8 +484,8 @@
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
       "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
       "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
+        "map-visit": "1.0.0",
+        "object-visit": "1.0.1"
       }
     },
     "commander": {
@@ -543,7 +543,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
       "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
       "requires": {
-        "ms": "^2.1.1"
+        "ms": "2.1.1"
       },
       "dependencies": {
         "ms": {
@@ -563,7 +563,7 @@
       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
       "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
       "requires": {
-        "mimic-response": "^1.0.0"
+        "mimic-response": "1.0.1"
       }
     },
     "deep-extend": {
@@ -576,7 +576,7 @@
       "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
       "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
       "requires": {
-        "is-descriptor": "^1.0.0"
+        "is-descriptor": "1.0.2"
       }
     },
     "delegates": {
@@ -614,7 +614,7 @@
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
       "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
       "requires": {
-        "once": "^1.4.0"
+        "once": "1.4.0"
       }
     },
     "error-symbol": {
@@ -627,11 +627,6 @@
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
     },
-    "escape-latex": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.1.1.tgz",
-      "integrity": "sha512-N2D6Z2kXh8x/pQNQH+natXDCwrzghhXMRII5dZ518mlTLeuba80NL0LCQyaahqOrAidoLivmmG6GKPnGhHse+A=="
-    },
     "etag": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -647,36 +642,36 @@
       "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
       "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
       "requires": {
-        "accepts": "~1.3.5",
+        "accepts": "1.3.5",
         "array-flatten": "1.1.1",
         "body-parser": "1.18.2",
         "content-disposition": "0.5.2",
-        "content-type": "~1.0.4",
+        "content-type": "1.0.4",
         "cookie": "0.3.1",
         "cookie-signature": "1.0.6",
         "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
+        "depd": "1.1.2",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
         "finalhandler": "1.1.1",
         "fresh": "0.5.2",
         "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
+        "methods": "1.1.2",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
         "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.3",
+        "proxy-addr": "2.0.4",
         "qs": "6.5.1",
-        "range-parser": "~1.2.0",
+        "range-parser": "1.2.0",
         "safe-buffer": "5.1.1",
         "send": "0.16.2",
         "serve-static": "1.13.2",
         "setprototypeof": "1.1.0",
-        "statuses": "~1.4.0",
-        "type-is": "~1.6.16",
+        "statuses": "1.4.0",
+        "type-is": "1.6.16",
         "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
+        "vary": "1.1.2"
       },
       "dependencies": {
         "debug": {
@@ -699,7 +694,7 @@
       "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
       "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
       "requires": {
-        "is-extendable": "^0.1.0"
+        "is-extendable": "0.1.1"
       }
     },
     "finalhandler": {
@@ -708,12 +703,12 @@
       "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
       "requires": {
         "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "statuses": "~1.4.0",
-        "unpipe": "~1.0.0"
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "statuses": "1.4.0",
+        "unpipe": "1.0.0"
       },
       "dependencies": {
         "debug": {
@@ -736,7 +731,7 @@
       "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
       "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
       "requires": {
-        "for-in": "^1.0.1"
+        "for-in": "1.0.2"
       }
     },
     "forwarded": {
@@ -744,11 +739,6 @@
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
     },
-    "fraction.js": {
-      "version": "4.0.9",
-      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.9.tgz",
-      "integrity": "sha512-qP1sNwdrcA+Vs5TTvGETuaaUmz4Tm48V6Jc+8Oh/gqvkb1d42s99w5kvSrZkIATp/mz3rV4CTef6xINkCofu+A=="
-    },
     "fresh": {
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -764,14 +754,14 @@
       "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
       "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
       "requires": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
+        "aproba": "1.2.0",
+        "console-control-strings": "1.1.0",
+        "has-unicode": "2.0.1",
+        "object-assign": "4.1.1",
+        "signal-exit": "3.0.2",
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wide-align": "1.1.3"
       }
     },
     "github-from-package": {
@@ -784,15 +774,20 @@
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
       "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
     },
+    "http": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz",
+      "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I="
+    },
     "http-errors": {
       "version": "1.6.3",
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
       "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
       "requires": {
-        "depd": "~1.1.2",
+        "depd": "1.1.2",
         "inherits": "2.0.3",
         "setprototypeof": "1.1.0",
-        "statuses": ">= 1.4.0 < 2"
+        "statuses": "1.4.0"
       }
     },
     "iconv-lite": {
@@ -825,7 +820,7 @@
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
       "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
       "requires": {
-        "kind-of": "^6.0.0"
+        "kind-of": "6.0.2"
       },
       "dependencies": {
         "kind-of": {
@@ -845,7 +840,7 @@
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
       "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
       "requires": {
-        "kind-of": "^6.0.0"
+        "kind-of": "6.0.2"
       },
       "dependencies": {
         "kind-of": {
@@ -860,9 +855,9 @@
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
       "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
       "requires": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
+        "is-accessor-descriptor": "1.0.0",
+        "is-data-descriptor": "1.0.0",
+        "kind-of": "6.0.2"
       },
       "dependencies": {
         "kind-of": {
@@ -882,7 +877,7 @@
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
       "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
       "requires": {
-        "number-is-nan": "^1.0.0"
+        "number-is-nan": "1.0.1"
       }
     },
     "is-number": {
@@ -895,7 +890,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "requires": {
-        "isobject": "^3.0.1"
+        "isobject": "3.0.1"
       }
     },
     "is-windows": {
@@ -923,7 +918,7 @@
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
       "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "requires": {
-        "is-buffer": "^1.1.5"
+        "is-buffer": "1.1.6"
       }
     },
     "koalas": {
@@ -936,7 +931,7 @@
       "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
       "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
       "requires": {
-        "set-getter": "^0.1.0"
+        "set-getter": "0.1.0"
       }
     },
     "log-ok": {
@@ -944,8 +939,8 @@
       "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
       "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=",
       "requires": {
-        "ansi-green": "^0.1.1",
-        "success-symbol": "^0.1.0"
+        "ansi-green": "0.1.1",
+        "success-symbol": "0.1.0"
       }
     },
     "log-utils": {
@@ -953,13 +948,13 @@
       "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz",
       "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=",
       "requires": {
-        "ansi-colors": "^0.2.0",
-        "error-symbol": "^0.1.0",
-        "info-symbol": "^0.1.0",
-        "log-ok": "^0.1.1",
-        "success-symbol": "^0.1.0",
-        "time-stamp": "^1.0.1",
-        "warning-symbol": "^0.1.0"
+        "ansi-colors": "0.2.0",
+        "error-symbol": "0.1.0",
+        "info-symbol": "0.1.0",
+        "log-ok": "0.1.1",
+        "success-symbol": "0.1.0",
+        "time-stamp": "1.1.0",
+        "warning-symbol": "0.1.0"
       }
     },
     "map-visit": {
@@ -967,22 +962,34 @@
       "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
       "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
       "requires": {
-        "object-visit": "^1.0.0"
+        "object-visit": "1.0.1"
       }
     },
     "mathjs": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-5.1.2.tgz",
-      "integrity": "sha512-ewA6m6omkS+VPkU6Qd60T2oPVvACG4r8ajD6M6OaWbO0nMQ4wr0ZHFHRjfuzpTb96Y5HT82rTeNqGGktBa5G/w==",
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-5.2.3.tgz",
+      "integrity": "sha1-Y28WgOo+YrsGhcsGiIQIk8weuEg=",
       "requires": {
         "complex.js": "2.0.11",
         "decimal.js": "10.0.1",
-        "escape-latex": "1.1.1",
-        "fraction.js": "4.0.9",
+        "escape-latex": "1.2.0",
+        "fraction.js": "4.0.10",
         "javascript-natural-sort": "0.7.1",
         "seed-random": "2.2.0",
         "tiny-emitter": "2.0.2",
         "typed-function": "1.1.0"
+      },
+      "dependencies": {
+        "escape-latex": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz",
+          "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="
+        },
+        "fraction.js": {
+          "version": "4.0.10",
+          "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.10.tgz",
+          "integrity": "sha512-MHkhk6ggCtwVhKR4pbF+aWrV+8cIVxyWhucESF/1NEcYDgRm4oze/2M09yGTGUQ3WQyZSdcoswJSThc2VGb+KQ=="
+        }
       }
     },
     "media-typer": {
@@ -1015,7 +1022,7 @@
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
       "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
       "requires": {
-        "mime-db": "~1.35.0"
+        "mime-db": "1.35.0"
       }
     },
     "mimic-response": {
@@ -1033,8 +1040,8 @@
       "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
       "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
       "requires": {
-        "for-in": "^0.1.3",
-        "is-extendable": "^0.1.1"
+        "for-in": "0.1.8",
+        "is-extendable": "0.1.1"
       },
       "dependencies": {
         "for-in": {
@@ -1084,7 +1091,7 @@
       "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.0.tgz",
       "integrity": "sha512-9g2twBGSP6wIR5PW7tXvAWnEWKJDH/VskdXp168xsw9VVxpEGov8K4jsP4/VeoC7b2ZAyzckvMCuQuQlw44lXg==",
       "requires": {
-        "semver": "^5.4.1"
+        "semver": "5.6.0"
       }
     },
     "node-webcam": {
@@ -1092,7 +1099,7 @@
       "resolved": "https://registry.npmjs.org/node-webcam/-/node-webcam-0.4.5.tgz",
       "integrity": "sha512-ZOwSLKb2D0Ie3P4Ja5ouuwmhQs4Xsda98LANkoKJJxqa39o/pLbR/khEqvn7YQpJeoZ+CXGmHuHfTalCB7PvyQ==",
       "requires": {
-        "nopt": "*"
+        "nopt": "4.0.1"
       }
     },
     "noop-logger": {
@@ -1105,8 +1112,8 @@
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
       "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
       "requires": {
-        "abbrev": "1",
-        "osenv": "^0.1.4"
+        "abbrev": "1.1.1",
+        "osenv": "0.1.5"
       }
     },
     "npmlog": {
@@ -1114,10 +1121,10 @@
       "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
       "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
       "requires": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
+        "are-we-there-yet": "1.1.5",
+        "console-control-strings": "1.1.0",
+        "gauge": "2.7.4",
+        "set-blocking": "2.0.0"
       }
     },
     "number-is-nan": {
@@ -1135,9 +1142,9 @@
       "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
       "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
       "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
+        "copy-descriptor": "0.1.1",
+        "define-property": "0.2.5",
+        "kind-of": "3.2.2"
       },
       "dependencies": {
         "define-property": {
@@ -1145,7 +1152,7 @@
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "requires": {
-            "is-descriptor": "^0.1.0"
+            "is-descriptor": "0.1.6"
           }
         },
         "is-accessor-descriptor": {
@@ -1153,7 +1160,7 @@
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
           "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           }
         },
         "is-data-descriptor": {
@@ -1161,7 +1168,7 @@
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
           "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           }
         },
         "is-descriptor": {
@@ -1169,9 +1176,9 @@
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
           "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
           },
           "dependencies": {
             "kind-of": {
@@ -1188,7 +1195,7 @@
       "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
       "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
       "requires": {
-        "isobject": "^3.0.0"
+        "isobject": "3.0.1"
       }
     },
     "on-finished": {
@@ -1204,7 +1211,7 @@
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "requires": {
-        "wrappy": "1"
+        "wrappy": "1.0.2"
       }
     },
     "os-homedir": {
@@ -1222,8 +1229,8 @@
       "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
       "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
       "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
       }
     },
     "parseurl": {
@@ -1246,21 +1253,21 @@
       "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz",
       "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==",
       "requires": {
-        "detect-libc": "^1.0.3",
-        "expand-template": "^1.0.2",
+        "detect-libc": "1.0.3",
+        "expand-template": "1.1.1",
         "github-from-package": "0.0.0",
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "node-abi": "^2.2.0",
-        "noop-logger": "^0.1.1",
-        "npmlog": "^4.0.1",
-        "os-homedir": "^1.0.1",
-        "pump": "^2.0.1",
-        "rc": "^1.1.6",
-        "simple-get": "^2.7.0",
-        "tar-fs": "^1.13.0",
-        "tunnel-agent": "^0.6.0",
-        "which-pm-runs": "^1.0.0"
+        "minimist": "1.2.0",
+        "mkdirp": "0.5.1",
+        "node-abi": "2.5.0",
+        "noop-logger": "0.1.1",
+        "npmlog": "4.1.2",
+        "os-homedir": "1.0.2",
+        "pump": "2.0.1",
+        "rc": "1.2.8",
+        "simple-get": "2.8.1",
+        "tar-fs": "1.16.3",
+        "tunnel-agent": "0.6.0",
+        "which-pm-runs": "1.0.0"
       }
     },
     "process-nextick-args": {
@@ -1278,7 +1285,7 @@
       "resolved": "https://registry.npmjs.org/prompt-actions/-/prompt-actions-3.0.2.tgz",
       "integrity": "sha512-dhz2Fl7vK+LPpmnQ/S/eSut4BnH4NZDLyddHKi5uTU/2PDn3grEMGkgsll16V5RpVUh/yxdiam0xsM0RD4xvtg==",
       "requires": {
-        "debug": "^2.6.8"
+        "debug": "2.6.9"
       },
       "dependencies": {
         "debug": {
@@ -1296,15 +1303,15 @@
       "resolved": "https://registry.npmjs.org/prompt-base/-/prompt-base-4.1.0.tgz",
       "integrity": "sha512-svGzgLUKZoqomz9SGMkf1hBG8Wl3K7JGuRCXc/Pv7xw8239hhaTBXrmjt7EXA9P/QZzdyT8uNWt9F/iJTXq75g==",
       "requires": {
-        "component-emitter": "^1.2.1",
-        "debug": "^3.0.1",
-        "koalas": "^1.0.2",
-        "log-utils": "^0.2.1",
-        "prompt-actions": "^3.0.2",
-        "prompt-question": "^5.0.1",
-        "readline-ui": "^2.2.3",
-        "readline-utils": "^2.2.3",
-        "static-extend": "^0.1.2"
+        "component-emitter": "1.2.1",
+        "debug": "3.2.6",
+        "koalas": "1.0.2",
+        "log-utils": "0.2.1",
+        "prompt-actions": "3.0.2",
+        "prompt-question": "5.0.2",
+        "readline-ui": "2.2.3",
+        "readline-utils": "2.2.3",
+        "static-extend": "0.1.2"
       }
     },
     "prompt-checkbox": {
@@ -1312,9 +1319,9 @@
       "resolved": "https://registry.npmjs.org/prompt-checkbox/-/prompt-checkbox-2.2.0.tgz",
       "integrity": "sha512-T/QWgkdUmKjRSr0FQlV8O+LfgmBk8PwDbWhzllm7mwWNAjs3qOVuru5Y1gV4/14L73zCncqcuwGwvnDyVcVgvA==",
       "requires": {
-        "ansi-cyan": "^0.1.1",
-        "debug": "^2.6.8",
-        "prompt-base": "^4.0.2"
+        "ansi-cyan": "0.1.1",
+        "debug": "2.6.9",
+        "prompt-base": "4.1.0"
       },
       "dependencies": {
         "debug": {
@@ -1332,22 +1339,22 @@
       "resolved": "https://registry.npmjs.org/prompt-choices/-/prompt-choices-4.1.0.tgz",
       "integrity": "sha512-ZNYLv6rW9z9n0WdwCkEuS+w5nUAGzRgtRt6GQ5aFNFz6MIcU7nHFlHOwZtzy7RQBk80KzUGPSRQphvMiQzB8pg==",
       "requires": {
-        "arr-flatten": "^1.1.0",
-        "arr-swap": "^1.0.1",
-        "choices-separator": "^2.0.0",
-        "clone-deep": "^4.0.0",
-        "collection-visit": "^1.0.0",
-        "define-property": "^2.0.2",
-        "is-number": "^6.0.0",
-        "kind-of": "^6.0.2",
-        "koalas": "^1.0.2",
-        "log-utils": "^0.2.1",
-        "pointer-symbol": "^1.0.0",
-        "radio-symbol": "^2.0.0",
-        "set-value": "^3.0.0",
-        "strip-color": "^0.1.0",
-        "terminal-paginator": "^2.0.2",
-        "toggle-array": "^1.0.1"
+        "arr-flatten": "1.1.0",
+        "arr-swap": "1.0.1",
+        "choices-separator": "2.0.0",
+        "clone-deep": "4.0.0",
+        "collection-visit": "1.0.0",
+        "define-property": "2.0.2",
+        "is-number": "6.0.0",
+        "kind-of": "6.0.2",
+        "koalas": "1.0.2",
+        "log-utils": "0.2.1",
+        "pointer-symbol": "1.0.0",
+        "radio-symbol": "2.0.0",
+        "set-value": "3.0.0",
+        "strip-color": "0.1.0",
+        "terminal-paginator": "2.0.2",
+        "toggle-array": "1.0.1"
       },
       "dependencies": {
         "clone-deep": {
@@ -1355,8 +1362,8 @@
           "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.0.tgz",
           "integrity": "sha512-aNJ5/7Bz2IYBb7nIj34TLGk78lBXpXUgV9qsLngtTvJ9+scsZNnlU0OX2S2N4ax/sUQt7sDBkXiGjGJEmNbXOQ==",
           "requires": {
-            "kind-of": "^6.0.2",
-            "shallow-clone": "^3.0.0"
+            "kind-of": "6.0.2",
+            "shallow-clone": "3.0.0"
           }
         },
         "define-property": {
@@ -1364,8 +1371,8 @@
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
           "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
           "requires": {
-            "is-descriptor": "^1.0.2",
-            "isobject": "^3.0.1"
+            "is-descriptor": "1.0.2",
+            "isobject": "3.0.1"
           }
         },
         "kind-of": {
@@ -1378,7 +1385,7 @@
           "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.0.tgz",
           "integrity": "sha512-Drg+nOI+ofeuslBf0nulyWLZhK1BZprqNvPJaiB4VvES+9gC6GG+qOVAfuO12zVSgxq9SKevcme7S3uDT6Be8w==",
           "requires": {
-            "kind-of": "^6.0.2"
+            "kind-of": "6.0.2"
           }
         }
       }
@@ -1388,9 +1395,9 @@
       "resolved": "https://registry.npmjs.org/prompt-list/-/prompt-list-3.2.0.tgz",
       "integrity": "sha512-PDao47cmC9+m2zEUghH+WIIascd8SuyyWO+akuUubd0XxOQyUH96HMdIcL3YnNS8kJUHwddH1rHVgL9vZA1QsQ==",
       "requires": {
-        "ansi-cyan": "^0.1.1",
-        "ansi-dim": "^0.1.1",
-        "prompt-radio": "^1.2.1"
+        "ansi-cyan": "0.1.1",
+        "ansi-dim": "0.1.1",
+        "prompt-radio": "1.2.1"
       }
     },
     "prompt-question": {
@@ -1398,13 +1405,13 @@
       "resolved": "https://registry.npmjs.org/prompt-question/-/prompt-question-5.0.2.tgz",
       "integrity": "sha512-wreaLbbu8f5+7zXds199uiT11Ojp59Z4iBi6hONlSLtsKGTvL2UY8VglcxQ3t/X4qWIxsNCg6aT4O8keO65v6Q==",
       "requires": {
-        "clone-deep": "^1.0.0",
-        "debug": "^3.0.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "kind-of": "^5.0.2",
-        "koalas": "^1.0.2",
-        "prompt-choices": "^4.0.5"
+        "clone-deep": "1.0.0",
+        "debug": "3.2.6",
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "kind-of": "5.1.0",
+        "koalas": "1.0.2",
+        "prompt-choices": "4.1.0"
       },
       "dependencies": {
         "kind-of": {
@@ -1419,8 +1426,8 @@
       "resolved": "https://registry.npmjs.org/prompt-radio/-/prompt-radio-1.2.1.tgz",
       "integrity": "sha512-vH1iAkgbWyvZBC1BTajydiHmwJP4F1b684gq0fm2wOjPVW1zaDo01OXWr/Dske0XdoHhtZFNMOXNj/ZUSRBywg==",
       "requires": {
-        "debug": "^2.6.8",
-        "prompt-checkbox": "^2.2.0"
+        "debug": "2.6.9",
+        "prompt-checkbox": "2.2.0"
       },
       "dependencies": {
         "debug": {
@@ -1438,7 +1445,7 @@
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
       "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
       "requires": {
-        "forwarded": "~0.1.2",
+        "forwarded": "0.1.2",
         "ipaddr.js": "1.8.0"
       }
     },
@@ -1447,8 +1454,8 @@
       "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
       "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
       "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
+        "end-of-stream": "1.4.1",
+        "once": "1.4.0"
       }
     },
     "qs": {
@@ -1461,9 +1468,9 @@
       "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-2.0.0.tgz",
       "integrity": "sha1-eqm/xQSFY21S3XbWqOYxspB5muE=",
       "requires": {
-        "ansi-gray": "^0.1.1",
-        "ansi-green": "^0.1.1",
-        "is-windows": "^1.0.1"
+        "ansi-gray": "0.1.1",
+        "ansi-green": "0.1.1",
+        "is-windows": "1.0.2"
       }
     },
     "range-parser": {
@@ -1495,7 +1502,7 @@
             "depd": "1.1.1",
             "inherits": "2.0.3",
             "setprototypeof": "1.0.3",
-            "statuses": ">= 1.3.1 < 2"
+            "statuses": "1.4.0"
           }
         },
         "setprototypeof": {
@@ -1510,10 +1517,10 @@
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
       "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
+        "deep-extend": "0.6.0",
+        "ini": "1.3.5",
+        "minimist": "1.2.0",
+        "strip-json-comments": "2.0.1"
       }
     },
     "readable-stream": {
@@ -1521,13 +1528,13 @@
       "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
       "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
       "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "2.0.0",
+        "safe-buffer": "5.1.2",
+        "string_decoder": "1.1.1",
+        "util-deprecate": "1.0.2"
       }
     },
     "readline": {
@@ -1540,10 +1547,10 @@
       "resolved": "https://registry.npmjs.org/readline-ui/-/readline-ui-2.2.3.tgz",
       "integrity": "sha512-ix7jz0PxqQqcIuq3yQTHv1TOhlD2IHO74aNO+lSuXsRYm1d+pdyup1yF3zKyLK1wWZrVNGjkzw5tUegO2IDy+A==",
       "requires": {
-        "component-emitter": "^1.2.1",
-        "debug": "^2.6.8",
-        "readline-utils": "^2.2.1",
-        "string-width": "^2.0.0"
+        "component-emitter": "1.2.1",
+        "debug": "2.6.9",
+        "readline-utils": "2.2.3",
+        "string-width": "2.1.1"
       },
       "dependencies": {
         "ansi-regex": {
@@ -1569,8 +1576,8 @@
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
           "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
           "requires": {
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^4.0.0"
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
           }
         },
         "strip-ansi": {
@@ -1578,7 +1585,7 @@
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
           "requires": {
-            "ansi-regex": "^3.0.0"
+            "ansi-regex": "3.0.0"
           }
         }
       }
@@ -1588,15 +1595,15 @@
       "resolved": "https://registry.npmjs.org/readline-utils/-/readline-utils-2.2.3.tgz",
       "integrity": "sha1-b4R9a48ZFcORtYHDZ81HhzhiNRo=",
       "requires": {
-        "arr-flatten": "^1.1.0",
-        "extend-shallow": "^2.0.1",
-        "is-buffer": "^1.1.5",
-        "is-number": "^3.0.0",
-        "is-windows": "^1.0.1",
-        "koalas": "^1.0.2",
+        "arr-flatten": "1.1.0",
+        "extend-shallow": "2.0.1",
+        "is-buffer": "1.1.6",
+        "is-number": "3.0.0",
+        "is-windows": "1.0.2",
+        "koalas": "1.0.2",
         "mute-stream": "0.0.7",
-        "strip-color": "^0.1.0",
-        "window-size": "^1.1.0"
+        "strip-color": "0.1.0",
+        "window-size": "1.1.1"
       },
       "dependencies": {
         "is-number": {
@@ -1604,7 +1611,7 @@
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           }
         }
       }
@@ -1630,18 +1637,18 @@
       "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
       "requires": {
         "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "destroy": "~1.0.4",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
+        "depd": "1.1.2",
+        "destroy": "1.0.4",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
         "fresh": "0.5.2",
-        "http-errors": "~1.6.2",
+        "http-errors": "1.6.3",
         "mime": "1.4.1",
         "ms": "2.0.0",
-        "on-finished": "~2.3.0",
-        "range-parser": "~1.2.0",
-        "statuses": "~1.4.0"
+        "on-finished": "2.3.0",
+        "range-parser": "1.2.0",
+        "statuses": "1.4.0"
       },
       "dependencies": {
         "debug": {
@@ -1659,20 +1666,20 @@
       "resolved": "https://registry.npmjs.org/serialport/-/serialport-6.2.2.tgz",
       "integrity": "sha512-BQqTR06ZXKwKB6rUjeANm3aIZo0rqNbQsrQX5zKEDcNY4rxiu5dvdcfIOaAGuZkhW7jAKJsgKC5TjeURtLVuOQ==",
       "requires": {
-        "@serialport/parser-byte-length": "^1.0.5",
-        "@serialport/parser-cctalk": "^1.0.5",
-        "@serialport/parser-delimiter": "^1.0.5",
-        "@serialport/parser-readline": "^1.0.5",
-        "@serialport/parser-ready": "^1.0.5",
-        "@serialport/parser-regex": "^1.0.5",
+        "@serialport/parser-byte-length": "1.0.5",
+        "@serialport/parser-cctalk": "1.0.5",
+        "@serialport/parser-delimiter": "1.0.5",
+        "@serialport/parser-readline": "1.0.5",
+        "@serialport/parser-ready": "1.0.5",
+        "@serialport/parser-regex": "1.0.5",
         "bindings": "1.3.0",
-        "commander": "^2.13.0",
-        "debug": "^3.1.0",
-        "nan": "^2.9.2",
-        "prebuild-install": "^4.0.0",
-        "promirepl": "^1.0.1",
-        "prompt-list": "^3.2.0",
-        "safe-buffer": "^5.1.2"
+        "commander": "2.19.0",
+        "debug": "3.2.6",
+        "nan": "2.11.1",
+        "prebuild-install": "4.0.0",
+        "promirepl": "1.0.1",
+        "prompt-list": "3.2.0",
+        "safe-buffer": "5.1.2"
       }
     },
     "serve-static": {
@@ -1680,9 +1687,9 @@
       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
       "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
       "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.2",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "parseurl": "1.3.2",
         "send": "0.16.2"
       }
     },
@@ -1696,7 +1703,7 @@
       "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
       "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
       "requires": {
-        "to-object-path": "^0.3.0"
+        "to-object-path": "0.3.0"
       }
     },
     "set-value": {
@@ -1704,7 +1711,7 @@
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.0.tgz",
       "integrity": "sha512-tqkg9wJ2TOsxbzIMG5NMAmzjdbDTAD0in7XuUzmFpJE4Ipi2QFBfgC2Z1/gfxcAmWCPsuutiEJyDIMRsrjrMOQ==",
       "requires": {
-        "is-plain-object": "^2.0.4"
+        "is-plain-object": "2.0.4"
       }
     },
     "setprototypeof": {
@@ -1717,9 +1724,9 @@
       "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
       "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
       "requires": {
-        "is-extendable": "^0.1.1",
-        "kind-of": "^5.0.0",
-        "mixin-object": "^2.0.1"
+        "is-extendable": "0.1.1",
+        "kind-of": "5.1.0",
+        "mixin-object": "2.0.1"
       },
       "dependencies": {
         "kind-of": {
@@ -1744,9 +1751,9 @@
       "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
       "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
       "requires": {
-        "decompress-response": "^3.3.0",
-        "once": "^1.3.1",
-        "simple-concat": "^1.0.0"
+        "decompress-response": "3.3.0",
+        "once": "1.4.0",
+        "simple-concat": "1.0.0"
       }
     },
     "static-extend": {
@@ -1754,8 +1761,8 @@
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
       "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
+        "define-property": "0.2.5",
+        "object-copy": "0.1.0"
       },
       "dependencies": {
         "define-property": {
@@ -1763,7 +1770,7 @@
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
           "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "requires": {
-            "is-descriptor": "^0.1.0"
+            "is-descriptor": "0.1.6"
           }
         },
         "is-accessor-descriptor": {
@@ -1771,7 +1778,7 @@
           "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
           "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           },
           "dependencies": {
             "kind-of": {
@@ -1779,7 +1786,7 @@
               "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "requires": {
-                "is-buffer": "^1.1.5"
+                "is-buffer": "1.1.6"
               }
             }
           }
@@ -1789,7 +1796,7 @@
           "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
           "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           },
           "dependencies": {
             "kind-of": {
@@ -1797,7 +1804,7 @@
               "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "requires": {
-                "is-buffer": "^1.1.5"
+                "is-buffer": "1.1.6"
               }
             }
           }
@@ -1807,9 +1814,9 @@
           "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
           "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
           "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
           }
         },
         "kind-of": {
@@ -1829,9 +1836,9 @@
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
       "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
       "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
+        "code-point-at": "1.1.0",
+        "is-fullwidth-code-point": "1.0.0",
+        "strip-ansi": "3.0.1"
       }
     },
     "string_decoder": {
@@ -1839,7 +1846,7 @@
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "requires": {
-        "safe-buffer": "~5.1.0"
+        "safe-buffer": "5.1.2"
       }
     },
     "strip-ansi": {
@@ -1847,7 +1854,7 @@
       "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "requires": {
-        "ansi-regex": "^2.0.0"
+        "ansi-regex": "2.1.1"
       }
     },
     "strip-color": {
@@ -1870,10 +1877,10 @@
       "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz",
       "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==",
       "requires": {
-        "chownr": "^1.0.1",
-        "mkdirp": "^0.5.1",
-        "pump": "^1.0.0",
-        "tar-stream": "^1.1.2"
+        "chownr": "1.1.1",
+        "mkdirp": "0.5.1",
+        "pump": "1.0.3",
+        "tar-stream": "1.6.2"
       },
       "dependencies": {
         "pump": {
@@ -1881,8 +1888,8 @@
           "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
           "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
           "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
+            "end-of-stream": "1.4.1",
+            "once": "1.4.0"
           }
         }
       }
@@ -1892,13 +1899,13 @@
       "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
       "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
       "requires": {
-        "bl": "^1.0.0",
-        "buffer-alloc": "^1.2.0",
-        "end-of-stream": "^1.0.0",
-        "fs-constants": "^1.0.0",
-        "readable-stream": "^2.3.0",
-        "to-buffer": "^1.1.1",
-        "xtend": "^4.0.0"
+        "bl": "1.2.2",
+        "buffer-alloc": "1.2.0",
+        "end-of-stream": "1.4.1",
+        "fs-constants": "1.0.0",
+        "readable-stream": "2.3.6",
+        "to-buffer": "1.1.1",
+        "xtend": "4.0.1"
       }
     },
     "terminal-paginator": {
@@ -1906,9 +1913,9 @@
       "resolved": "https://registry.npmjs.org/terminal-paginator/-/terminal-paginator-2.0.2.tgz",
       "integrity": "sha512-IZMT5ECF9p4s+sNCV8uvZSW9E1+9zy9Ji9xz2oee8Jfo7hUFpauyjxkhfRcIH6Lu3Wdepv5D1kVRc8Hx74/LfQ==",
       "requires": {
-        "debug": "^2.6.6",
-        "extend-shallow": "^2.0.1",
-        "log-utils": "^0.2.1"
+        "debug": "2.6.9",
+        "extend-shallow": "2.0.1",
+        "log-utils": "0.2.1"
       },
       "dependencies": {
         "debug": {
@@ -1941,7 +1948,7 @@
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
       "requires": {
-        "kind-of": "^3.0.2"
+        "kind-of": "3.2.2"
       }
     },
     "toggle-array": {
@@ -1949,7 +1956,7 @@
       "resolved": "https://registry.npmjs.org/toggle-array/-/toggle-array-1.0.1.tgz",
       "integrity": "sha1-y/WEB5K9UJfzMReugkyTKv/ofVg=",
       "requires": {
-        "isobject": "^3.0.0"
+        "isobject": "3.0.1"
       }
     },
     "tunnel-agent": {
@@ -1957,7 +1964,7 @@
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
       "requires": {
-        "safe-buffer": "^5.0.1"
+        "safe-buffer": "5.1.2"
       }
     },
     "type-is": {
@@ -1966,7 +1973,7 @@
       "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
       "requires": {
         "media-typer": "0.3.0",
-        "mime-types": "~2.1.18"
+        "mime-types": "2.1.19"
       }
     },
     "typed-function": {
@@ -2009,7 +2016,7 @@
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
       "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
       "requires": {
-        "string-width": "^1.0.2 || 2"
+        "string-width": "1.0.2"
       }
     },
     "window-size": {
@@ -2017,8 +2024,8 @@
       "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz",
       "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==",
       "requires": {
-        "define-property": "^1.0.0",
-        "is-number": "^3.0.0"
+        "define-property": "1.0.0",
+        "is-number": "3.0.0"
       },
       "dependencies": {
         "is-number": {
@@ -2026,7 +2033,7 @@
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "requires": {
-            "kind-of": "^3.0.2"
+            "kind-of": "3.2.2"
           }
         }
       }
@@ -2039,9 +2046,9 @@
     "ws": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz",
-      "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==",
+      "integrity": "sha1-EZqdv5LFThkOwY0Q6HHVXJXPk3M=",
       "requires": {
-        "async-limiter": "~1.0.0"
+        "async-limiter": "1.0.0"
       }
     },
     "xtend": {
diff --git a/programs/hwtst-5.json b/programs/fourmotors-oneplanner.json
similarity index 95%
rename from programs/hwtst-5.json
rename to programs/fourmotors-oneplanner.json
index fa74ebb2892b42966c146fc9f97acf89db050015..697d1c6512c539177379b487a6db5a9282d8af25 100644
--- a/programs/hwtst-5.json
+++ b/programs/fourmotors-oneplanner.json
@@ -20,12 +20,12 @@
       "inputs": {},
       "outputs": {},
       "state": {
-        "portName": "COM3",
+        "portName": "---",
         "connect": {
           "type": "button",
           "label": "click to find and connect"
         },
-        "portStatus": "open"
+        "portStatus": "closed"
       }
     },
     "ATKStepper-0": {
@@ -76,7 +76,7 @@
           "label": "test network"
         },
         "message": "click above to test network",
-        "route": "0,3",
+        "route": "0,0",
         "rate": 2000,
         "axis": "X",
         "spu": 200,
@@ -137,10 +137,10 @@
           "label": "test network"
         },
         "message": "click above to test network",
-        "route": "0,0",
+        "route": "0,3",
         "rate": 2000,
         "axis": "Y",
-        "spu": -200,
+        "spu": 200,
         "rawMove": -10,
         "makeMove": {
           "type": "button",
@@ -196,7 +196,7 @@
         "route": "0,5",
         "rate": 2000,
         "axis": "Y",
-        "spu": 200,
+        "spu": -200,
         "rawMove": -10,
         "makeMove": {
           "type": "button",
@@ -257,13 +257,13 @@
         "route": "0,1",
         "rate": 2000,
         "axis": "Z",
-        "spu": 200,
+        "spu": -200,
         "rawMove": -10,
         "makeMove": {
           "type": "button",
           "label": "test move"
         },
-        "lead": -6000,
+        "lead": 0,
         "position": 0
       }
     },
@@ -433,8 +433,8 @@
         "alt": "movements -> acceleration planned moves",
         "path": "./modules/motion/planner.js",
         "position": {
-          "left": 822,
-          "top": 1020
+          "left": 693,
+          "top": 1015
         }
       },
       "inputs": {
@@ -472,7 +472,12 @@
         },
         "moveComplete": {
           "emits": "number",
-          "calls": []
+          "calls": [
+            {
+              "parentId": "Multi-line Text Input-12",
+              "key": "req"
+            }
+          ]
         }
       },
       "state": {
@@ -493,12 +498,12 @@
           0,
           0
         ],
-        "isRunning": 1,
+        "isRunning": 0,
         "netWindow": 3,
         "netState": [
-          3,
-          3,
-          3
+          0,
+          0,
+          0
         ]
       }
     },
@@ -585,19 +590,19 @@
           "type": "multiline",
           "label": "lines complete",
           "rows": 11,
-          "value": "\n\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10"
+          "value": ""
         },
         "now": {
           "type": "multiline",
           "label": "line just out",
           "rows": 1,
-          "value": "G0 X20Y20Z0"
+          "value": ""
         },
         "incoming": {
           "type": "multiline",
           "label": "future lines",
           "rows": 36,
-          "value": "G0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\n"
+          "value": "G0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\n"
         }
       }
     }
diff --git a/programs/hwtest-4.json b/programs/hwtest-4.json
deleted file mode 100644
index 4d8925b6c6909aa047435cb6c69356cfdff6c376..0000000000000000000000000000000000000000
--- a/programs/hwtest-4.json
+++ /dev/null
@@ -1,590 +0,0 @@
-{
-  "description": {
-    "name": "new program",
-    "counter": 12
-  },
-  "modules": {
-    "Serialport ATK Link-1": {
-      "description": {
-        "id": "Serialport ATK Link-1",
-        "name": "Serialport ATK Link",
-        "alt": "window into hardware world",
-        "path": "./modules/hardware/atkseriallink.js",
-        "isHardware": true,
-        "isLink": true,
-        "position": {
-          "left": 1922,
-          "top": 383
-        }
-      },
-      "inputs": {},
-      "outputs": {},
-      "state": {
-        "portName": "COM3",
-        "connect": {
-          "type": "button",
-          "label": "click to find and connect"
-        },
-        "portStatus": "open"
-      }
-    },
-    "ATKStepper-0": {
-      "description": {
-        "id": "ATKStepper-0",
-        "name": "ATKStepper",
-        "alt": "software representation of stepper motor",
-        "path": "./modules/hardware/atkstepper.js",
-        "isHardware": true,
-        "position": {
-          "left": 1427,
-          "top": 127
-        }
-      },
-      "inputs": {
-        "trapezoid": {
-          "accepts": "move instruction"
-        },
-        "accel": {
-          "accepts": "number"
-        },
-        "rmtrig": {
-          "accepts": "event"
-        }
-      },
-      "outputs": {
-        "ack": {
-          "emits": "move acknowledgement",
-          "calls": []
-        },
-        "position": {
-          "emits": "number",
-          "calls": []
-        }
-      },
-      "state": {
-        "reset": {
-          "type": "button",
-          "label": "reset hardware"
-        },
-        "test": {
-          "type": "button",
-          "label": "test network"
-        },
-        "message": "click above to test network",
-        "route": "0,3",
-        "rate": 2000,
-        "axis": "X",
-        "spu": 200,
-        "rawMove": -10,
-        "makeMove": {
-          "type": "button",
-          "label": "test move"
-        },
-        "lead": 0,
-        "position": 0
-      }
-    },
-    "ATKStepper-2": {
-      "description": {
-        "id": "ATKStepper-2",
-        "name": "ATKStepper",
-        "alt": "software representation of stepper motor",
-        "path": "./modules/hardware/atkstepper.js",
-        "isHardware": true,
-        "position": {
-          "left": 1432,
-          "top": 504
-        }
-      },
-      "inputs": {
-        "trapezoid": {
-          "accepts": "move instruction"
-        },
-        "accel": {
-          "accepts": "number"
-        },
-        "rmtrig": {
-          "accepts": "event"
-        }
-      },
-      "outputs": {
-        "ack": {
-          "emits": "move acknowledgement",
-          "calls": []
-        },
-        "position": {
-          "emits": "number",
-          "calls": []
-        }
-      },
-      "state": {
-        "reset": {
-          "type": "button",
-          "label": "reset hardware"
-        },
-        "test": {
-          "type": "button",
-          "label": "test network"
-        },
-        "message": "click above to test network",
-        "route": "0,0",
-        "rate": 2000,
-        "axis": "Y",
-        "spu": -200,
-        "rawMove": -10,
-        "makeMove": {
-          "type": "button",
-          "label": "test move"
-        },
-        "lead": 0,
-        "position": 0
-      }
-    },
-    "ATKStepper-3": {
-      "description": {
-        "id": "ATKStepper-3",
-        "name": "ATKStepper",
-        "alt": "software representation of stepper motor",
-        "path": "./modules/hardware/atkstepper.js",
-        "isHardware": true,
-        "position": {
-          "left": 1438,
-          "top": 871
-        }
-      },
-      "inputs": {
-        "trapezoid": {
-          "accepts": "move instruction"
-        },
-        "accel": {
-          "accepts": "number"
-        },
-        "rmtrig": {
-          "accepts": "event"
-        }
-      },
-      "outputs": {
-        "ack": {
-          "emits": "move acknowledgement",
-          "calls": []
-        },
-        "position": {
-          "emits": "number",
-          "calls": []
-        }
-      },
-      "state": {
-        "reset": {
-          "type": "button",
-          "label": "reset hardware"
-        },
-        "test": {
-          "type": "button",
-          "label": "test network"
-        },
-        "message": "click above to test network",
-        "route": "0,5",
-        "rate": 2000,
-        "axis": "Y",
-        "spu": 200,
-        "rawMove": -10,
-        "makeMove": {
-          "type": "button",
-          "label": "test move"
-        },
-        "lead": 0,
-        "position": 0
-      }
-    },
-    "ATKStepper-4": {
-      "description": {
-        "id": "ATKStepper-4",
-        "name": "ATKStepper",
-        "alt": "software representation of stepper motor",
-        "path": "./modules/hardware/atkstepper.js",
-        "isHardware": true,
-        "position": {
-          "left": 1440,
-          "top": 1248
-        }
-      },
-      "inputs": {
-        "trapezoid": {
-          "accepts": "move instruction"
-        },
-        "accel": {
-          "accepts": "number"
-        },
-        "rmtrig": {
-          "accepts": "event"
-        }
-      },
-      "outputs": {
-        "ack": {
-          "emits": "move acknowledgement",
-          "calls": []
-        },
-        "position": {
-          "emits": "number",
-          "calls": []
-        }
-      },
-      "state": {
-        "reset": {
-          "type": "button",
-          "label": "reset hardware"
-        },
-        "test": {
-          "type": "button",
-          "label": "test network"
-        },
-        "message": "click above to test network",
-        "route": "0,1",
-        "rate": 2000,
-        "axis": "Z",
-        "spu": 200,
-        "rawMove": -10,
-        "makeMove": {
-          "type": "button",
-          "label": "test move"
-        },
-        "lead": -2000,
-        "position": 0
-      }
-    },
-    "ATKBBB-Servo-5": {
-      "description": {
-        "id": "ATKBBB-Servo-5",
-        "name": "ATKBBB-Servo",
-        "alt": "software representation of networked hardware object",
-        "path": "./modules/hardware/atkbreadboard.js",
-        "isHardware": true,
-        "position": {
-          "left": 1886,
-          "top": 1362
-        }
-      },
-      "inputs": {
-        "servoVal": {
-          "accepts": "number"
-        },
-        "adcRequest": {
-          "accepts": "event"
-        }
-      },
-      "outputs": {
-        "servoConf": {
-          "emits": "event",
-          "calls": []
-        },
-        "adcValue": {
-          "emits": "number",
-          "calls": []
-        }
-      },
-      "state": {
-        "reset": {
-          "type": "button",
-          "label": "reset hardware"
-        },
-        "test": {
-          "type": "button",
-          "label": "test network"
-        },
-        "message": "click above to test network",
-        "route": "0,2",
-        "servoButton": {
-          "type": "button",
-          "label": "SEND VALUE"
-        },
-        "servoVal": 0,
-        "adcButton": {
-          "type": "button",
-          "label": "REQUEST ADC CONVERSION"
-        }
-      }
-    },
-    "Button-7": {
-      "description": {
-        "id": "Button-7",
-        "name": "Button",
-        "alt": "for clicking",
-        "path": "./modules/ui/button.js",
-        "position": {
-          "left": 591,
-          "top": 332
-        }
-      },
-      "inputs": {
-        "thru": {
-          "accepts": "any"
-        }
-      },
-      "outputs": {
-        "whammy": {
-          "emits": "number",
-          "calls": [
-            {
-              "parentId": "delay-9",
-              "key": "thru"
-            },
-            {
-              "parentId": "number output-8",
-              "key": "evt"
-            }
-          ]
-        }
-      },
-      "state": {
-        "button": {
-          "type": "button",
-          "label": "WHAM"
-        }
-      }
-    },
-    "number output-8": {
-      "description": {
-        "id": "number output-8",
-        "name": "number output",
-        "alt": "for clicking",
-        "path": "./modules/ui/number.js",
-        "position": {
-          "left": 586,
-          "top": 566
-        }
-      },
-      "inputs": {
-        "thru": {
-          "accepts": "any"
-        },
-        "evt": {
-          "accepts": "any"
-        }
-      },
-      "outputs": {
-        "out": {
-          "emits": "number",
-          "calls": [
-            {
-              "parentId": "Multi-line Text Input-12",
-              "key": "req"
-            }
-          ]
-        }
-      },
-      "state": {
-        "number": 10,
-        "button": {
-          "type": "button",
-          "label": "WHAM"
-        }
-      }
-    },
-    "delay-9": {
-      "description": {
-        "id": "delay-9",
-        "name": "delay",
-        "alt": "in ... out",
-        "path": "./modules/util/delay.js",
-        "position": {
-          "left": 589,
-          "top": 464
-        }
-      },
-      "inputs": {
-        "thru": {
-          "accepts": "any"
-        }
-      },
-      "outputs": {
-        "out": {
-          "emits": "any",
-          "calls": [
-            {
-              "parentId": "Lookahead-Motion-Planner-10",
-              "key": "run"
-            }
-          ]
-        }
-      },
-      "state": {
-        "ms": 100
-      }
-    },
-    "Lookahead-Motion-Planner-10": {
-      "description": {
-        "id": "Lookahead-Motion-Planner-10",
-        "name": "Lookahead-Motion-Planner",
-        "alt": "movements -> acceleration planned moves",
-        "path": "./modules/motion/planner.js",
-        "position": {
-          "left": 822,
-          "top": 1020
-        }
-      },
-      "inputs": {
-        "instruction": {
-          "accepts": "move instruction"
-        },
-        "acks": {
-          "accepts": "move acknowledgement"
-        },
-        "run": {
-          "accepts": "boolean"
-        }
-      },
-      "outputs": {
-        "moves": {
-          "emits": "move instruction",
-          "calls": [
-            {
-              "parentId": "ATKStepper-0",
-              "key": "trapezoid"
-            },
-            {
-              "parentId": "ATKStepper-2",
-              "key": "trapezoid"
-            },
-            {
-              "parentId": "ATKStepper-3",
-              "key": "trapezoid"
-            },
-            {
-              "parentId": "ATKStepper-4",
-              "key": "trapezoid"
-            }
-          ]
-        },
-        "moveComplete": {
-          "emits": "number",
-          "calls": []
-        }
-      },
-      "state": {
-        "axisIDs": "X,Y,Z",
-        "reset": {
-          "type": "button",
-          "label": "reset planner"
-        },
-        "accel": 200,
-        "jd": 0.1,
-        "minSpeed": 1,
-        "startStop": {
-          "type": "button",
-          "label": "start / stop planner"
-        },
-        "position": [
-          0,
-          0,
-          0
-        ],
-        "isRunning": 0,
-        "netWindow": 3,
-        "netState": [
-          0,
-          0,
-          0
-        ]
-      }
-    },
-    "Gcode Parser-11": {
-      "description": {
-        "id": "Gcode Parser-11",
-        "name": "Gcode Parser",
-        "alt": "line of gcode -> planner recognized move",
-        "path": "./modules/parsing/gcode.js",
-        "position": {
-          "left": 583,
-          "top": 111
-        }
-      },
-      "inputs": {
-        "lineIn": {
-          "accepts": "string"
-        }
-      },
-      "outputs": {
-        "instructionOut": {
-          "emits": "move instruction",
-          "calls": [
-            {
-              "parentId": "Lookahead-Motion-Planner-10",
-              "key": "instruction"
-            }
-          ]
-        },
-        "modeChange": {
-          "emits": "string",
-          "calls": []
-        }
-      },
-      "state": {
-        "mode": "G0",
-        "G0": 1200,
-        "G1": 400
-      }
-    },
-    "Multi-line Text Input-12": {
-      "description": {
-        "id": "Multi-line Text Input-12",
-        "name": "Multi-line Text Input",
-        "alt": "sequential txt input",
-        "path": "./modules/ui/multiline.js",
-        "position": {
-          "left": 24,
-          "top": 99
-        }
-      },
-      "inputs": {
-        "req": {
-          "accepts": "number"
-        },
-        "lineIn": {
-          "accepts": "string"
-        },
-        "load": {
-          "accepts": "path"
-        }
-      },
-      "outputs": {
-        "lineOut": {
-          "emits": "string",
-          "calls": [
-            {
-              "parentId": "Gcode Parser-11",
-              "key": "lineIn"
-            }
-          ]
-        }
-      },
-      "state": {
-        "load": {
-          "type": "button",
-          "label": "LOAD"
-        },
-        "thru": {
-          "type": "button",
-          "label": "WHAM"
-        },
-        "previously": {
-          "type": "multiline",
-          "label": "lines complete",
-          "rows": 11,
-          "value": ""
-        },
-        "now": {
-          "type": "multiline",
-          "label": "line just out",
-          "rows": 1,
-          "value": ""
-        },
-        "incoming": {
-          "type": "multiline",
-          "label": "future lines",
-          "rows": 36,
-          "value": "G0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\nG0 F50 X10Y10Z10\nG0 X20Y20Z0\nG0 X0\nG0 Y10\n"
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/views.js b/views.js
index 689eb3dbe4faafa24f7a14ea4eba44941d32eadf..b9886e006f5db54f0db56a1d3c9828e2fea9f788 100644
--- a/views.js
+++ b/views.js
@@ -119,13 +119,15 @@ function socketRecv(evt) {
 }
 
 function socketSend(type, data) {
-    if (sckt) {
+    if (sckt.readyState === 1) {
         var msg = {
             type: type,
             data: data
         }
         //console.log('SEND', msg)
         sckt.send(JSON.stringify(msg))
+    } else {
+        throw 'on socketSend, ws not ready'
     }
 }