diff --git a/node_modules/split-string/LICENSE b/node_modules/split-string/LICENSE
new file mode 100644
index 0000000..e33d14b
--- /dev/null
+++ b/node_modules/split-string/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2017, Jon Schlinkert.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/split-string/README.md b/node_modules/split-string/README.md
new file mode 100644
index 0000000..d622e44
--- /dev/null
+++ b/node_modules/split-string/README.md
@@ -0,0 +1,321 @@
+# split-string [![NPM version](https://img.shields.io/npm/v/split-string.svg?style=flat)](https://www.npmjs.com/package/split-string) [![NPM monthly downloads](https://img.shields.io/npm/dm/split-string.svg?style=flat)](https://npmjs.org/package/split-string) [![NPM total downloads](https://img.shields.io/npm/dt/split-string.svg?style=flat)](https://npmjs.org/package/split-string) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/split-string.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/split-string)
+
+> Split a string on a character except when the character is escaped.
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save split-string
+```
+
+<!-- section: Why use this? -->
+
+<details>
+<summary><strong>Why use this?</strong></summary>
+
+<br>
+
+Although it's easy to split on a string:
+
+```js
+console.log('a.b.c'.split('.'));
+//=> ['a', 'b', 'c']
+```
+
+It's more challenging to split a string whilst respecting escaped or quoted characters.
+
+**Bad**
+
+```js
+console.log('a\\.b.c'.split('.'));
+//=> ['a\\', 'b', 'c']
+
+console.log('"a.b.c".d'.split('.'));
+//=> ['"a', 'b', 'c"', 'd']
+```
+
+**Good**
+
+```js
+var split = require('split-string');
+console.log(split('a\\.b.c'));
+//=> ['a.b', 'c']
+
+console.log(split('"a.b.c".d'));
+//=> ['a.b.c', 'd']
+```
+
+See the [options](#options) to learn how to choose the separator or retain quotes or escaping.
+
+<br>
+
+</details>
+
+## Usage
+
+```js
+var split = require('split-string');
+
+split('a.b.c');
+//=> ['a', 'b', 'c']
+
+// respects escaped characters
+split('a.b.c\\.d');
+//=> ['a', 'b', 'c.d']
+
+// respects double-quoted strings
+split('a."b.c.d".e');
+//=> ['a', 'b.c.d', 'e']
+```
+
+**Brackets**
+
+Also respects brackets [unless disabled](#optionsbrackets):
+
+```js
+split('a (b c d) e', ' ');
+//=> ['a', '(b c d)', 'e']
+```
+
+## Options
+
+### options.brackets
+
+**Type**: `object|boolean`
+
+**Default**: `undefined`
+
+**Description**
+
+If enabled, split-string will not split inside brackets. The following brackets types are supported when `options.brackets` is `true`,
+
+```js
+{
+  '<': '>',
+  '(': ')',
+  '[': ']',
+  '{': '}'
+}
+```
+
+Or, if object of brackets must be passed, each property on the object must be a bracket type, where the property key is the opening delimiter and property value is the closing delimiter.
+
+**Examples**
+
+```js
+// no bracket support by default
+split('a.{b.c}');
+//=> [ 'a', '{b', 'c}' ]
+
+// support all basic bracket types: "<>{}[]()"
+split('a.{b.c}', {brackets: true});
+//=> [ 'a', '{b.c}' ]
+
+// also supports nested brackets 
+split('a.{b.{c.d}.e}.f', {brackets: true});
+//=> [ 'a', '{b.{c.d}.e}', 'f' ]
+
+// support only the specified brackets
+split('[a.b].(c.d)', {brackets: {'[': ']'}});
+//=> [ '[a.b]', '(c', 'd)' ]
+```
+
+### options.sep
+
+**Type**: `string`
+
+**Default**: `.`
+
+The separator/character to split on.
+
+**Example**
+
+```js
+split('a.b,c', {sep: ','});
+//=> ['a.b', 'c']
+
+// you can also pass the separator as string as the last argument
+split('a.b,c', ',');
+//=> ['a.b', 'c']
+```
+
+### options.keepEscaping
+
+**Type**: `boolean`
+
+**Default**: `undefined`
+
+Keep backslashes in the result.
+
+**Example**
+
+```js
+split('a.b\\.c');
+//=> ['a', 'b.c']
+
+split('a.b.\\c', {keepEscaping: true});
+//=> ['a', 'b\.c']
+```
+
+### options.keepQuotes
+
+**Type**: `boolean`
+
+**Default**: `undefined`
+
+Keep single- or double-quotes in the result.
+
+**Example**
+
+```js
+split('a."b.c.d".e');
+//=> ['a', 'b.c.d', 'e']
+
+split('a."b.c.d".e', {keepQuotes: true});
+//=> ['a', '"b.c.d"', 'e']
+
+split('a.\'b.c.d\'.e', {keepQuotes: true});
+//=> ['a', '\'b.c.d\'', 'e']
+```
+
+### options.keepDoubleQuotes
+
+**Type**: `boolean`
+
+**Default**: `undefined`
+
+Keep double-quotes in the result.
+
+**Example**
+
+```js
+split('a."b.c.d".e');
+//=> ['a', 'b.c.d', 'e']
+
+split('a."b.c.d".e', {keepDoubleQuotes: true});
+//=> ['a', '"b.c.d"', 'e']
+```
+
+### options.keepSingleQuotes
+
+**Type**: `boolean`
+
+**Default**: `undefined`
+
+Keep single-quotes in the result.
+
+**Example**
+
+```js
+split('a.\'b.c.d\'.e');
+//=> ['a', 'b.c.d', 'e']
+
+split('a.\'b.c.d\'.e', {keepSingleQuotes: true});
+//=> ['a', '\'b.c.d\'', 'e']
+```
+
+## Customizer
+
+**Type**: `function`
+
+**Default**: `undefined`
+
+Pass a function as the last argument to customize how tokens are added to the array.
+
+**Example**
+
+```js
+var arr = split('a.b', function(tok) {
+  if (tok.arr[tok.arr.length - 1] === 'a') {
+    tok.split = false;
+  }
+});
+console.log(arr);
+//=> ['a.b']
+```
+
+**Properties**
+
+The `tok` object has the following properties:
+
+* `tok.val` (string) The current value about to be pushed onto the result array
+* `tok.idx` (number) the current index in the string
+* `tok.str` (string) the entire string
+* `tok.arr` (array) the result array
+
+## Release history
+
+### v3.0.0 - 2017-06-17
+
+**Added**
+
+* adds support for brackets
+
+## About
+
+<details>
+<summary><strong>Contributing</strong></summary>
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+</details>
+
+<details>
+<summary><strong>Running Tests</strong></summary>
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+</details>
+
+<details>
+<summary><strong>Building docs</strong></summary>
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+</details>
+
+### Related projects
+
+You might also be interested in these projects:
+
+* [deromanize](https://www.npmjs.com/package/deromanize): Convert roman numerals to arabic numbers (useful for books, outlines, documentation, slide decks, etc) | [homepage](https://github.com/jonschlinkert/deromanize "Convert roman numerals to arabic numbers (useful for books, outlines, documentation, slide decks, etc)")
+* [randomatic](https://www.npmjs.com/package/randomatic): Generate randomized strings of a specified length using simple character sequences. The original generate-password. | [homepage](https://github.com/jonschlinkert/randomatic "Generate randomized strings of a specified length using simple character sequences. The original generate-password.")
+* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.")
+* [romanize](https://www.npmjs.com/package/romanize): Convert numbers to roman numerals (useful for books, outlines, documentation, slide decks, etc) | [homepage](https://github.com/jonschlinkert/romanize "Convert numbers to roman numerals (useful for books, outlines, documentation, slide decks, etc)")
+
+### Contributors
+
+| **Commits** | **Contributor** | 
+| --- | --- |
+| 28 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 9 | [doowb](https://github.com/doowb) |
+
+### Author
+
+**Jon Schlinkert**
+
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on November 19, 2017._
\ No newline at end of file
diff --git a/node_modules/split-string/index.js b/node_modules/split-string/index.js
new file mode 100644
index 0000000..7bc0ea9
--- /dev/null
+++ b/node_modules/split-string/index.js
@@ -0,0 +1,171 @@
+/*!
+ * split-string <https://github.com/jonschlinkert/split-string>
+ *
+ * Copyright (c) 2015-2017, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+'use strict';
+
+var extend = require('extend-shallow');
+
+module.exports = function(str, options, fn) {
+  if (typeof str !== 'string') {
+    throw new TypeError('expected a string');
+  }
+
+  if (typeof options === 'function') {
+    fn = options;
+    options = null;
+  }
+
+  // allow separator to be defined as a string
+  if (typeof options === 'string') {
+    options = { sep: options };
+  }
+
+  var opts = extend({sep: '.'}, options);
+  var quotes = opts.quotes || ['"', "'", '`'];
+  var brackets;
+
+  if (opts.brackets === true) {
+    brackets = {
+      '<': '>',
+      '(': ')',
+      '[': ']',
+      '{': '}'
+    };
+  } else if (opts.brackets) {
+    brackets = opts.brackets;
+  }
+
+  var tokens = [];
+  var stack = [];
+  var arr = [''];
+  var sep = opts.sep;
+  var len = str.length;
+  var idx = -1;
+  var closeIdx;
+
+  function expected() {
+    if (brackets && stack.length) {
+      return brackets[stack[stack.length - 1]];
+    }
+  }
+
+  while (++idx < len) {
+    var ch = str[idx];
+    var next = str[idx + 1];
+    var tok = { val: ch, idx: idx, arr: arr, str: str };
+    tokens.push(tok);
+
+    if (ch === '\\') {
+      tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next;
+      tok.escaped = true;
+      if (typeof fn === 'function') {
+        fn(tok);
+      }
+      arr[arr.length - 1] += tok.val;
+      idx++;
+      continue;
+    }
+
+    if (brackets && brackets[ch]) {
+      stack.push(ch);
+      var e = expected();
+      var i = idx + 1;
+
+      if (str.indexOf(e, i + 1) !== -1) {
+        while (stack.length && i < len) {
+          var s = str[++i];
+          if (s === '\\') {
+            s++;
+            continue;
+          }
+
+          if (quotes.indexOf(s) !== -1) {
+            i = getClosingQuote(str, s, i + 1);
+            continue;
+          }
+
+          e = expected();
+          if (stack.length && str.indexOf(e, i + 1) === -1) {
+            break;
+          }
+
+          if (brackets[s]) {
+            stack.push(s);
+            continue;
+          }
+
+          if (e === s) {
+            stack.pop();
+          }
+        }
+      }
+
+      closeIdx = i;
+      if (closeIdx === -1) {
+        arr[arr.length - 1] += ch;
+        continue;
+      }
+
+      ch = str.slice(idx, closeIdx + 1);
+      tok.val = ch;
+      tok.idx = idx = closeIdx;
+    }
+
+    if (quotes.indexOf(ch) !== -1) {
+      closeIdx = getClosingQuote(str, ch, idx + 1);
+      if (closeIdx === -1) {
+        arr[arr.length - 1] += ch;
+        continue;
+      }
+
+      if (keepQuotes(ch, opts) === true) {
+        ch = str.slice(idx, closeIdx + 1);
+      } else {
+        ch = str.slice(idx + 1, closeIdx);
+      }
+
+      tok.val = ch;
+      tok.idx = idx = closeIdx;
+    }
+
+    if (typeof fn === 'function') {
+      fn(tok, tokens);
+      ch = tok.val;
+      idx = tok.idx;
+    }
+
+    if (tok.val === sep && tok.split !== false) {
+      arr.push('');
+      continue;
+    }
+
+    arr[arr.length - 1] += tok.val;
+  }
+
+  return arr;
+};
+
+function getClosingQuote(str, ch, i, brackets) {
+  var idx = str.indexOf(ch, i);
+  if (str.charAt(idx - 1) === '\\') {
+    return getClosingQuote(str, ch, idx + 1);
+  }
+  return idx;
+}
+
+function keepQuotes(ch, opts) {
+  if (opts.keepDoubleQuotes === true && ch === '"') return true;
+  if (opts.keepSingleQuotes === true && ch === "'") return true;
+  return opts.keepQuotes;
+}
+
+function keepEscaping(opts, str, idx) {
+  if (typeof opts.keepEscaping === 'function') {
+    return opts.keepEscaping(str, idx);
+  }
+  return opts.keepEscaping === true || str[idx + 1] === '\\';
+}
diff --git a/node_modules/split-string/package.json b/node_modules/split-string/package.json
new file mode 100644
index 0000000..e3eae6b
--- /dev/null
+++ b/node_modules/split-string/package.json
@@ -0,0 +1,103 @@
+{
+  "_from": "split-string@^3.0.2",
+  "_id": "split-string@3.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+  "_location": "/split-string",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "split-string@^3.0.2",
+    "name": "split-string",
+    "escapedName": "split-string",
+    "rawSpec": "^3.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.2"
+  },
+  "_requiredBy": [
+    "/braces",
+    "/set-value"
+  ],
+  "_resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+  "_shasum": "7cb09dda3a86585705c64b39a6466038682e8fe2",
+  "_spec": "split-string@^3.0.2",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\braces",
+  "author": {
+    "name": "Jon Schlinkert",
+    "url": "https://github.com/jonschlinkert"
+  },
+  "bugs": {
+    "url": "https://github.com/jonschlinkert/split-string/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Brian Woodward",
+      "url": "https://twitter.com/doowb"
+    },
+    {
+      "name": "Jon Schlinkert",
+      "url": "http://twitter.com/jonschlinkert"
+    }
+  ],
+  "dependencies": {
+    "extend-shallow": "^3.0.0"
+  },
+  "deprecated": false,
+  "description": "Split a string on a character except when the character is escaped.",
+  "devDependencies": {
+    "gulp-format-md": "^1.0.0",
+    "mocha": "^3.5.3"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/jonschlinkert/split-string",
+  "keywords": [
+    "character",
+    "escape",
+    "split",
+    "string"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "split-string",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jonschlinkert/split-string.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "verb": {
+    "toc": false,
+    "layout": "default",
+    "titles": [
+      ".",
+      "install",
+      "Why use this?"
+    ],
+    "related": {
+      "list": [
+        "deromanize",
+        "randomatic",
+        "repeat-string",
+        "romanize"
+      ]
+    },
+    "tasks": [
+      "readme"
+    ],
+    "plugins": [
+      "gulp-format-md"
+    ],
+    "lint": {
+      "reflinks": true
+    }
+  },
+  "version": "3.1.0"
+}
