diff --git a/node_modules/snapdragon/LICENSE b/node_modules/snapdragon/LICENSE
new file mode 100644
index 0000000..1e49edf
--- /dev/null
+++ b/node_modules/snapdragon/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2016, 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/snapdragon/README.md b/node_modules/snapdragon/README.md
new file mode 100644
index 0000000..4006e10
--- /dev/null
+++ b/node_modules/snapdragon/README.md
@@ -0,0 +1,321 @@
+# snapdragon [![NPM version](https://img.shields.io/npm/v/snapdragon.svg?style=flat)](https://www.npmjs.com/package/snapdragon) [![NPM downloads](https://img.shields.io/npm/dm/snapdragon.svg?style=flat)](https://npmjs.org/package/snapdragon) [![Build Status](https://img.shields.io/travis/jonschlinkert/snapdragon.svg?style=flat)](https://travis-ci.org/jonschlinkert/snapdragon)
+
+> Fast, pluggable and easy-to-use parser-renderer factory.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save snapdragon
+```
+
+Created by [jonschlinkert](https://github.com/jonschlinkert) and [doowb](https://github.com/doowb).
+
+**Features**
+
+* Bootstrap your own parser, get sourcemap support for free
+* All parsing and compiling is handled by simple, reusable middleware functions
+* Inspired by the parsers in [pug](http://jade-lang.com) and [css](https://github.com/reworkcss/css).
+
+## History
+
+### v0.5.0
+
+**Breaking changes**
+
+Substantial breaking changes were made in v0.5.0! Most of these changes are part of a larger refactor that will be finished in 0.6.0, including the introduction of a `Lexer` class.
+
+* Renderer was renamed to `Compiler`
+* the `.render` method was renamed to `.compile`
+* Many other smaller changes. A more detailed overview will be provided in 0.6.0. If you don't have to time review code, I recommend you wait for the 0.6.0 release.
+
+## Usage examples
+
+```js
+var Snapdragon = require('snapdragon');
+var snapdragon = new Snapdragon();
+```
+
+**Parse**
+
+```js
+var ast = snapdragon.parser('some string', options)
+  // parser middleware that can be called by other middleware
+  .set('foo', function () {})
+  // parser middleware, runs immediately in the order defined
+  .use(bar())
+  .use(baz())
+```
+
+**Render**
+
+```js
+// pass the `ast` from the parse method
+var res = snapdragon.compiler(ast)
+  // compiler middleware, called when the name of the middleware
+  // matches the `node.type` (defined in a parser middleware)
+  .set('bar', function () {})
+  .set('baz', function () {})
+  .compile()
+```
+
+See the [examples](./examples/).
+
+## Getting started
+
+**Parsers**
+
+Parsers are middleware functions used for parsing a string into an ast node.
+
+```js
+var ast = snapdragon.parser(str, options)
+  .use(function() {
+    var pos = this.position();
+    var m = this.match(/^\./);
+    if (!m) return;
+    return pos({
+      // `type` specifies the compiler to use
+      type: 'dot',
+      val: m[0]
+    });
+  })
+```
+
+**AST node**
+
+When the parser finds a match, `pos()` is called, pushing a token for that node onto the ast that looks something like:
+
+```js
+{ type: 'dot',
+  val: '.',
+  position:
+   { start: { lineno: 1, column: 1 },
+     end: { lineno: 1, column: 2 } }}
+```
+
+**Renderers**
+
+Renderers are _named_ middleware functions that visit over an array of ast nodes to compile a string.
+
+```js
+var res = snapdragon.compiler(ast)
+  .set('dot', function (node) {
+    console.log(node.val)
+    //=> '.'
+    return this.emit(node.val);
+  })
+```
+
+**Source maps**
+
+If you want source map support, make sure to emit the position as well.
+
+```js
+var res = snapdragon.compiler(ast)
+  .set('dot', function (node) {
+    return this.emit(node.val, node.position);
+  })
+```
+
+## Docs
+
+### Parser middleware
+
+A parser middleware is a function that returns an abject called a `token`. This token is pushed onto the AST as a node.
+
+**Example token**
+
+```js
+{ type: 'dot',
+  val: '.',
+  position:
+   { start: { lineno: 1, column: 1 },
+     end: { lineno: 1, column: 2 } }}
+```
+
+**Example parser middleware**
+
+Match a single `.` in a string:
+
+1. Get the starting position by calling `this.position()`
+2. pass a regex for matching a single dot to the `.match` method
+3. if **no match** is found, return `undefined`
+4. if a **match** is found, `pos()` is called, which returns a token with:
+  - `type`: the name of the [compiler] to use
+  - `val`: The actual value captured by the regex. In this case, a `.`. Note that you can capture and return whatever will be needed by the corresponding [compiler].
+  - The ending position: automatically calculated by adding the length of the first capture group to the starting position.
+
+## Renderer middleware
+
+Renderers are run when the name of the compiler middleware matches the `type` defined on an ast `node` (which is defined in a parser).
+
+**Example**
+
+Exercise: Parse a dot, then compile it as an escaped dot.
+
+```js
+var ast = snapdragon.parser('.')
+  .use(function () {
+    var pos = this.position();
+    var m = this.match(/^\./);
+    if (!m) return;
+    return pos({
+      // define the `type` of compiler to use
+      type: 'dot',
+      val: m[0]
+    })
+  })
+
+var result = snapdragon.compiler(ast)
+  .set('dot', function (node) {
+    return this.emit('\\' + node.val);
+  })
+  .compile()
+
+console.log(result.output);
+//=> '\.'
+```
+
+## API
+
+### [Parser](lib/parser.js#L19)
+
+Create a new `Parser` with the given `input` and `options`.
+
+**Params**
+
+* `input` **{String}**
+* `options` **{Object}**
+
+### [.define](lib/parser.js#L103)
+
+Define a non-enumberable property on the `Parser` instance.
+
+**Example**
+
+```js
+parser.define('foo', 'bar');
+```
+
+**Params**
+
+* `key` **{String}**: propery name
+* `val` **{any}**: property value
+* `returns` **{Object}**: Returns the Parser instance for chaining.
+
+Set parser `name` with the given `fn`
+
+**Params**
+
+* `name` **{String}**
+* `fn` **{Function}**
+
+Get parser `name`
+
+**Params**
+
+* `name` **{String}**
+
+Push a `token` onto the `type` stack.
+
+**Params**
+
+* `type` **{String}**
+* `returns` **{Object}** `token`
+
+Pop a token off of the `type` stack
+
+**Params**
+
+* `type` **{String}**
+* `returns` **{Object}**: Returns a token
+
+Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`.
+
+**Params**
+
+* `type` **{String}**
+* `returns` **{Boolean}**
+
+**Example**
+
+```js
+parser.isType(node, 'brace');
+```
+
+**Params**
+
+* `node` **{Object}**
+* `type` **{String}**
+* `returns` **{Boolean}**
+
+### [.define](lib/compiler.js#L71)
+
+Define a non-enumberable property on the `Compiler` instance.
+
+**Example**
+
+```js
+compiler.define('foo', 'bar');
+```
+
+**Params**
+
+* `key` **{String}**: propery name
+* `val` **{any}**: property value
+* `returns` **{Object}**: Returns the Compiler instance for chaining.
+
+## About
+
+### Related projects
+
+* [braces](https://www.npmjs.com/package/braces): Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces… [more](https://github.com/jonschlinkert/braces) | [homepage](https://github.com/jonschlinkert/braces "Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces specification.")
+* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.")
+* [extglob](https://www.npmjs.com/package/extglob): Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to… [more](https://github.com/jonschlinkert/extglob) | [homepage](https://github.com/jonschlinkert/extglob "Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to glob patterns.")
+* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
+
+### Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+### Contributors
+
+| **Commits** | **Contributor**<br/> | 
+| --- | --- |
+| 106 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 2 | [doowb](https://github.com/doowb) |
+
+### Building docs
+
+_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_
+
+To generate the readme and API documentation with [verb](https://github.com/verbose/verb):
+
+```sh
+$ npm install -g verb verb-generate-readme && verb
+```
+
+### Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm install -d && npm test
+```
+
+### Author
+
+**Jon Schlinkert**
+
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT license](https://github.com/jonschlinkert/snapdragon/blob/master/LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 10, 2016._
\ No newline at end of file
diff --git a/node_modules/snapdragon/index.js b/node_modules/snapdragon/index.js
new file mode 100644
index 0000000..235b464
--- /dev/null
+++ b/node_modules/snapdragon/index.js
@@ -0,0 +1,174 @@
+'use strict';
+
+var Base = require('base');
+var define = require('define-property');
+var Compiler = require('./lib/compiler');
+var Parser = require('./lib/parser');
+var utils = require('./lib/utils');
+var regexCache = {};
+var cache = {};
+
+/**
+ * Create a new instance of `Snapdragon` with the given `options`.
+ *
+ * ```js
+ * var snapdragon = new Snapdragon();
+ * ```
+ *
+ * @param {Object} `options`
+ * @api public
+ */
+
+function Snapdragon(options) {
+  Base.call(this, null, options);
+  this.options = utils.extend({source: 'string'}, this.options);
+  this.compiler = new Compiler(this.options);
+  this.parser = new Parser(this.options);
+
+  Object.defineProperty(this, 'compilers', {
+    get: function() {
+      return this.compiler.compilers;
+    }
+  });
+
+  Object.defineProperty(this, 'parsers', {
+    get: function() {
+      return this.parser.parsers;
+    }
+  });
+
+  Object.defineProperty(this, 'regex', {
+    get: function() {
+      return this.parser.regex;
+    }
+  });
+}
+
+/**
+ * Inherit Base
+ */
+
+Base.extend(Snapdragon);
+
+/**
+ * Add a parser to `snapdragon.parsers` for capturing the given `type` using
+ * the specified regex or parser function. A function is useful if you need
+ * to customize how the token is created and/or have access to the parser
+ * instance to check options, etc.
+ *
+ * ```js
+ * snapdragon
+ *   .capture('slash', /^\//)
+ *   .capture('dot', function() {
+ *     var pos = this.position();
+ *     var m = this.match(/^\./);
+ *     if (!m) return;
+ *     return pos({
+ *       type: 'dot',
+ *       val: m[0]
+ *     });
+ *   });
+ * ```
+ * @param {String} `type`
+ * @param {RegExp|Function} `regex`
+ * @return {Object} Returns the parser instance for chaining
+ * @api public
+ */
+
+Snapdragon.prototype.capture = function() {
+  return this.parser.capture.apply(this.parser, arguments);
+};
+
+/**
+ * Register a plugin `fn`.
+ *
+ * ```js
+ * var snapdragon = new Snapdgragon([options]);
+ * snapdragon.use(function() {
+ *   console.log(this);          //<= snapdragon instance
+ *   console.log(this.parser);   //<= parser instance
+ *   console.log(this.compiler); //<= compiler instance
+ * });
+ * ```
+ * @param {Object} `fn`
+ * @api public
+ */
+
+Snapdragon.prototype.use = function(fn) {
+  fn.call(this, this);
+  return this;
+};
+
+/**
+ * Parse the given `str`.
+ *
+ * ```js
+ * var snapdragon = new Snapdgragon([options]);
+ * // register parsers
+ * snapdragon.parser.use(function() {});
+ *
+ * // parse
+ * var ast = snapdragon.parse('foo/bar');
+ * console.log(ast);
+ * ```
+ * @param {String} `str`
+ * @param {Object} `options` Set `options.sourcemap` to true to enable source maps.
+ * @return {Object} Returns an AST.
+ * @api public
+ */
+
+Snapdragon.prototype.parse = function(str, options) {
+  this.options = utils.extend({}, this.options, options);
+  var parsed = this.parser.parse(str, this.options);
+
+  // add non-enumerable parser reference
+  define(parsed, 'parser', this.parser);
+  return parsed;
+};
+
+/**
+ * Compile the given `AST`.
+ *
+ * ```js
+ * var snapdragon = new Snapdgragon([options]);
+ * // register plugins
+ * snapdragon.use(function() {});
+ * // register parser plugins
+ * snapdragon.parser.use(function() {});
+ * // register compiler plugins
+ * snapdragon.compiler.use(function() {});
+ *
+ * // parse
+ * var ast = snapdragon.parse('foo/bar');
+ *
+ * // compile
+ * var res = snapdragon.compile(ast);
+ * console.log(res.output);
+ * ```
+ * @param {Object} `ast`
+ * @param {Object} `options`
+ * @return {Object} Returns an object with an `output` property with the rendered string.
+ * @api public
+ */
+
+Snapdragon.prototype.compile = function(ast, options) {
+  this.options = utils.extend({}, this.options, options);
+  var compiled = this.compiler.compile(ast, this.options);
+
+  // add non-enumerable compiler reference
+  define(compiled, 'compiler', this.compiler);
+  return compiled;
+};
+
+/**
+ * Expose `Snapdragon`
+ */
+
+module.exports = Snapdragon;
+
+/**
+ * Expose `Parser` and `Compiler`
+ */
+
+module.exports.Compiler = Compiler;
+module.exports.Parser = Parser;
diff --git a/node_modules/snapdragon/lib/compiler.js b/node_modules/snapdragon/lib/compiler.js
new file mode 100644
index 0000000..0ce9d21
--- /dev/null
+++ b/node_modules/snapdragon/lib/compiler.js
@@ -0,0 +1,177 @@
+'use strict';
+
+var use = require('use');
+var define = require('define-property');
+var debug = require('debug')('snapdragon:compiler');
+var utils = require('./utils');
+
+/**
+ * Create a new `Compiler` with the given `options`.
+ * @param {Object} `options`
+ */
+
+function Compiler(options, state) {
+  debug('initializing', __filename);
+  this.options = utils.extend({source: 'string'}, options);
+  this.state = state || {};
+  this.compilers = {};
+  this.output = '';
+  this.set('eos', function(node) {
+    return this.emit(node.val, node);
+  });
+  this.set('noop', function(node) {
+    return this.emit(node.val, node);
+  });
+  this.set('bos', function(node) {
+    return this.emit(node.val, node);
+  });
+  use(this);
+}
+
+/**
+ * Prototype methods
+ */
+
+Compiler.prototype = {
+
+  /**
+   * Throw an error message with details including the cursor position.
+   * @param {String} `msg` Message to use in the Error.
+   */
+
+  error: function(msg, node) {
+    var pos = node.position || {start: {column: 0}};
+    var message = this.options.source + ' column:' + pos.start.column + ': ' + msg;
+
+    var err = new Error(message);
+    err.reason = msg;
+    err.column = pos.start.column;
+    err.source = this.pattern;
+
+    if (this.options.silent) {
+      this.errors.push(err);
+    } else {
+      throw err;
+    }
+  },
+
+  /**
+   * Define a non-enumberable property on the `Compiler` instance.
+   *
+   * ```js
+   * compiler.define('foo', 'bar');
+   * ```
+   * @name .define
+   * @param {String} `key` propery name
+   * @param {any} `val` property value
+   * @return {Object} Returns the Compiler instance for chaining.
+   * @api public
+   */
+
+  define: function(key, val) {
+    define(this, key, val);
+    return this;
+  },
+
+  /**
+   * Emit `node.val`
+   */
+
+  emit: function(str, node) {
+    this.output += str;
+    return str;
+  },
+
+  /**
+   * Add a compiler `fn` with the given `name`
+   */
+
+  set: function(name, fn) {
+    this.compilers[name] = fn;
+    return this;
+  },
+
+  /**
+   * Get compiler `name`.
+   */
+
+  get: function(name) {
+    return this.compilers[name];
+  },
+
+  /**
+   * Get the previous AST node.
+   */
+
+  prev: function(n) {
+    return this.ast.nodes[this.idx - (n || 1)] || { type: 'bos', val: '' };
+  },
+
+  /**
+   * Get the next AST node.
+   */
+
+  next: function(n) {
+    return this.ast.nodes[this.idx + (n || 1)] || { type: 'eos', val: '' };
+  },
+
+  /**
+   * Visit `node`.
+   */
+
+  visit: function(node, nodes, i) {
+    var fn = this.compilers[node.type];
+    this.idx = i;
+
+    if (typeof fn !== 'function') {
+      throw this.error('compiler "' + node.type + '" is not registered', node);
+    }
+    return fn.call(this, node, nodes, i);
+  },
+
+  /**
+   * Map visit over array of `nodes`.
+   */
+
+  mapVisit: function(nodes) {
+    if (!Array.isArray(nodes)) {
+      throw new TypeError('expected an array');
+    }
+    var len = nodes.length;
+    var idx = -1;
+    while (++idx < len) {
+      this.visit(nodes[idx], nodes, idx);
+    }
+    return this;
+  },
+
+  /**
+   * Compile `ast`.
+   */
+
+  compile: function(ast, options) {
+    var opts = utils.extend({}, this.options, options);
+    this.ast = ast;
+    this.parsingErrors = this.ast.errors;
+    this.output = '';
+
+    // source map support
+    if (opts.sourcemap) {
+      var sourcemaps = require('./source-maps');
+      sourcemaps(this);
+      this.mapVisit(this.ast.nodes);
+      this.applySourceMaps();
+      this.map = opts.sourcemap === 'generator' ? this.map : this.map.toJSON();
+      return this;
+    }
+
+    this.mapVisit(this.ast.nodes);
+    return this;
+  }
+};
+
+/**
+ * Expose `Compiler`
+ */
+
+module.exports = Compiler;
diff --git a/node_modules/snapdragon/lib/parser.js b/node_modules/snapdragon/lib/parser.js
new file mode 100644
index 0000000..a5a9b31
--- /dev/null
+++ b/node_modules/snapdragon/lib/parser.js
@@ -0,0 +1,533 @@
+'use strict';
+
+var use = require('use');
+var util = require('util');
+var Cache = require('map-cache');
+var define = require('define-property');
+var debug = require('debug')('snapdragon:parser');
+var Position = require('./position');
+var utils = require('./utils');
+
+/**
+ * Create a new `Parser` with the given `input` and `options`.
+ * @param {String} `input`
+ * @param {Object} `options`
+ * @api public
+ */
+
+function Parser(options) {
+  debug('initializing', __filename);
+  this.options = utils.extend({source: 'string'}, options);
+  this.init(this.options);
+  use(this);
+}
+
+/**
+ * Prototype methods
+ */
+
+Parser.prototype = {
+  constructor: Parser,
+
+  init: function(options) {
+    this.orig = '';
+    this.input = '';
+    this.parsed = '';
+
+    this.column = 1;
+    this.line = 1;
+
+    this.regex = new Cache();
+    this.errors = this.errors || [];
+    this.parsers = this.parsers || {};
+    this.types = this.types || [];
+    this.sets = this.sets || {};
+    this.fns = this.fns || [];
+    this.currentType = 'root';
+
+    var pos = this.position();
+    this.bos = pos({type: 'bos', val: ''});
+
+    this.ast = {
+      type: 'root',
+      errors: this.errors,
+      nodes: [this.bos]
+    };
+
+    define(this.bos, 'parent', this.ast);
+    this.nodes = [this.ast];
+
+    this.count = 0;
+    this.setCount = 0;
+    this.stack = [];
+  },
+
+  /**
+   * Throw a formatted error with the cursor column and `msg`.
+   * @param {String} `msg` Message to use in the Error.
+   */
+
+  error: function(msg, node) {
+    var pos = node.position || {start: {column: 0, line: 0}};
+    var line = pos.start.line;
+    var column = pos.start.column;
+    var source = this.options.source;
+
+    var message = source + ' <line:' + line + ' column:' + column + '>: ' + msg;
+    var err = new Error(message);
+    err.source = source;
+    err.reason = msg;
+    err.pos = pos;
+
+    if (this.options.silent) {
+      this.errors.push(err);
+    } else {
+      throw err;
+    }
+  },
+
+  /**
+   * Define a non-enumberable property on the `Parser` instance.
+   *
+   * ```js
+   * parser.define('foo', 'bar');
+   * ```
+   * @name .define
+   * @param {String} `key` propery name
+   * @param {any} `val` property value
+   * @return {Object} Returns the Parser instance for chaining.
+   * @api public
+   */
+
+  define: function(key, val) {
+    define(this, key, val);
+    return this;
+  },
+
+  /**
+   * Mark position and patch `node.position`.
+   */
+
+  position: function() {
+    var start = { line: this.line, column: this.column };
+    var self = this;
+
+    return function(node) {
+      define(node, 'position', new Position(start, self));
+      return node;
+    };
+  },
+
+  /**
+   * Set parser `name` with the given `fn`
+   * @param {String} `name`
+   * @param {Function} `fn`
+   * @api public
+   */
+
+  set: function(type, fn) {
+    if (this.types.indexOf(type) === -1) {
+      this.types.push(type);
+    }
+    this.parsers[type] = fn.bind(this);
+    return this;
+  },
+
+  /**
+   * Get parser `name`
+   * @param {String} `name`
+   * @api public
+   */
+
+  get: function(name) {
+    return this.parsers[name];
+  },
+
+  /**
+   * Push a `token` onto the `type` stack.
+   *
+   * @param {String} `type`
+   * @return {Object} `token`
+   * @api public
+   */
+
+  push: function(type, token) {
+    this.sets[type] = this.sets[type] || [];
+    this.count++;
+    this.stack.push(token);
+    return this.sets[type].push(token);
+  },
+
+  /**
+   * Pop a token off of the `type` stack
+   * @param {String} `type`
+   * @returns {Object} Returns a token
+   * @api public
+   */
+
+  pop: function(type) {
+    this.sets[type] = this.sets[type] || [];
+    this.count--;
+    this.stack.pop();
+    return this.sets[type].pop();
+  },
+
+  /**
+   * Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`.
+   *
+   * @param {String} `type`
+   * @return {Boolean}
+   * @api public
+   */
+
+  isInside: function(type) {
+    this.sets[type] = this.sets[type] || [];
+    return this.sets[type].length > 0;
+  },
+
+  /**
+   * Return true if `node` is the given `type`.
+   *
+   * ```js
+   * parser.isType(node, 'brace');
+   * ```
+   * @param {Object} `node`
+   * @param {String} `type`
+   * @return {Boolean}
+   * @api public
+   */
+
+  isType: function(node, type) {
+    return node && node.type === type;
+  },
+
+  /**
+   * Get the previous AST node
+   * @return {Object}
+   */
+
+  prev: function(n) {
+    return this.stack.length > 0
+      ? utils.last(this.stack, n)
+      : utils.last(this.nodes, n);
+  },
+
+  /**
+   * Update line and column based on `str`.
+   */
+
+  consume: function(len) {
+    this.input = this.input.substr(len);
+  },
+
+  /**
+   * Update column based on `str`.
+   */
+
+  updatePosition: function(str, len) {
+    var lines = str.match(/\n/g);
+    if (lines) this.line += lines.length;
+    var i = str.lastIndexOf('\n');
+    this.column = ~i ? len - i : this.column + len;
+    this.parsed += str;
+    this.consume(len);
+  },
+
+  /**
+   * Match `regex`, return captures, and update the cursor position by `match[0]` length.
+   * @param {RegExp} `regex`
+   * @return {Object}
+   */
+
+  match: function(regex) {
+    var m = regex.exec(this.input);
+    if (m) {
+      this.updatePosition(m[0], m[0].length);
+      return m;
+    }
+  },
+
+  /**
+   * Capture `type` with the given regex.
+   * @param {String} `type`
+   * @param {RegExp} `regex`
+   * @return {Function}
+   */
+
+  capture: function(type, regex) {
+    if (typeof regex === 'function') {
+      return this.set.apply(this, arguments);
+    }
+
+    this.regex.set(type, regex);
+    this.set(type, function() {
+      var parsed = this.parsed;
+      var pos = this.position();
+      var m = this.match(regex);
+      if (!m || !m[0]) return;
+
+      var prev = this.prev();
+      var node = pos({
+        type: type,
+        val: m[0],
+        parsed: parsed,
+        rest: this.input
+      });
+
+      if (m[1]) {
+        node.inner = m[1];
+      }
+
+      define(node, 'inside', this.stack.length > 0);
+      define(node, 'parent', prev);
+      prev.nodes.push(node);
+    }.bind(this));
+    return this;
+  },
+
+  /**
+   * Create a parser with open and close for parens,
+   * brackets or braces
+   */
+
+  capturePair: function(type, openRegex, closeRegex, fn) {
+    this.sets[type] = this.sets[type] || [];
+
+    /**
+     * Open
+     */
+
+    this.set(type + '.open', function() {
+      var parsed = this.parsed;
+      var pos = this.position();
+      var m = this.match(openRegex);
+      if (!m || !m[0]) return;
+
+      var val = m[0];
+      this.setCount++;
+      this.specialChars = true;
+      var open = pos({
+        type: type + '.open',
+        val: val,
+        rest: this.input
+      });
+
+      if (typeof m[1] !== 'undefined') {
+        open.inner = m[1];
+      }
+
+      var prev = this.prev();
+      var node = pos({
+        type: type,
+        nodes: [open]
+      });
+
+      define(node, 'rest', this.input);
+      define(node, 'parsed', parsed);
+      define(node, 'prefix', m[1]);
+      define(node, 'parent', prev);
+      define(open, 'parent', node);
+
+      if (typeof fn === 'function') {
+        fn.call(this, open, node);
+      }
+
+      this.push(type, node);
+      prev.nodes.push(node);
+    });
+
+    /**
+     * Close
+     */
+
+    this.set(type + '.close', function() {
+      var pos = this.position();
+      var m = this.match(closeRegex);
+      if (!m || !m[0]) return;
+
+      var parent = this.pop(type);
+      var node = pos({
+        type: type + '.close',
+        rest: this.input,
+        suffix: m[1],
+        val: m[0]
+      });
+
+      if (!this.isType(parent, type)) {
+        if (this.options.strict) {
+          throw new Error('missing opening "' + type + '"');
+        }
+
+        this.setCount--;
+        node.escaped = true;
+        return node;
+      }
+
+      if (node.suffix === '\\') {
+        parent.escaped = true;
+        node.escaped = true;
+      }
+
+      parent.nodes.push(node);
+      define(node, 'parent', parent);
+    });
+
+    return this;
+  },
+
+  /**
+   * Capture end-of-string
+   */
+
+  eos: function() {
+    var pos = this.position();
+    if (this.input) return;
+    var prev = this.prev();
+
+    while (prev.type !== 'root' && !prev.visited) {
+      if (this.options.strict === true) {
+        throw new SyntaxError('invalid syntax:' + util.inspect(prev, null, 2));
+      }
+
+      if (!hasDelims(prev)) {
+        prev.parent.escaped = true;
+        prev.escaped = true;
+      }
+
+      visit(prev, function(node) {
+        if (!hasDelims(node.parent)) {
+          node.parent.escaped = true;
+          node.escaped = true;
+        }
+      });
+
+      prev = prev.parent;
+    }
+
+    var tok = pos({
+      type: 'eos',
+      val: this.append || ''
+    });
+
+    define(tok, 'parent', this.ast);
+    return tok;
+  },
+
+  /**
+   * Run parsers to advance the cursor position
+   */
+
+  next: function() {
+    var parsed = this.parsed;
+    var len = this.types.length;
+    var idx = -1;
+    var tok;
+
+    while (++idx < len) {
+      if ((tok = this.parsers[this.types[idx]].call(this))) {
+        define(tok, 'rest', this.input);
+        define(tok, 'parsed', parsed);
+        this.last = tok;
+        return tok;
+      }
+    }
+  },
+
+  /**
+   * Parse the given string.
+   * @return {Array}
+   */
+
+  parse: function(input) {
+    if (typeof input !== 'string') {
+      throw new TypeError('expected a string');
+    }
+
+    this.init(this.options);
+    this.orig = input;
+    this.input = input;
+    var self = this;
+
+    function parse() {
+      // check input before calling `.next()`
+      input = self.input;
+
+      // get the next AST ndoe
+      var node = self.next();
+      if (node) {
+        var prev = self.prev();
+        if (prev) {
+          define(node, 'parent', prev);
+          if (prev.nodes) {
+            prev.nodes.push(node);
+          }
+        }
+
+        if (self.sets.hasOwnProperty(prev.type)) {
+          self.currentType = prev.type;
+        }
+      }
+
+      // if we got here but input is not changed, throw an error
+      if (self.input && input === self.input) {
+        throw new Error('no parsers registered for: "' + self.input.slice(0, 5) + '"');
+      }
+    }
+
+    while (this.input) parse();
+    if (this.stack.length && this.options.strict) {
+      var node = this.stack.pop();
+      throw this.error('missing opening ' + node.type + ': "' + this.orig + '"');
+    }
+
+    var eos = this.eos();
+    var tok = this.prev();
+    if (tok.type !== 'eos') {
+      this.ast.nodes.push(eos);
+    }
+
+    return this.ast;
+  }
+};
+
+/**
+ * Visit `node` with the given `fn`
+ */
+
+function visit(node, fn) {
+  if (!node.visited) {
+    define(node, 'visited', true);
+    return node.nodes ? mapVisit(node.nodes, fn) : fn(node);
+  }
+  return node;
+}
+
+/**
+ * Map visit over array of `nodes`.
+ */
+
+function mapVisit(nodes, fn) {
+  var len = nodes.length;
+  var idx = -1;
+  while (++idx < len) {
+    visit(nodes[idx], fn);
+  }
+}
+
+function hasOpen(node) {
+  return node.nodes && node.nodes[0].type === (node.type + '.open');
+}
+
+function hasClose(node) {
+  return node.nodes && utils.last(node.nodes).type === (node.type + '.close');
+}
+
+function hasDelims(node) {
+  return hasOpen(node) && hasClose(node);
+}
+
+/**
+ * Expose `Parser`
+ */
+
+module.exports = Parser;
diff --git a/node_modules/snapdragon/lib/position.js b/node_modules/snapdragon/lib/position.js
new file mode 100644
index 0000000..c859696
--- /dev/null
+++ b/node_modules/snapdragon/lib/position.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var define = require('define-property');
+
+/**
+ * Store position for a node
+ */
+
+module.exports = function Position(start, parser) {
+  this.start = start;
+  this.end = { line: parser.line, column: parser.column };
+  define(this, 'content', parser.orig);
+  define(this, 'source', parser.options.source);
+};
diff --git a/node_modules/snapdragon/lib/source-maps.js b/node_modules/snapdragon/lib/source-maps.js
new file mode 100644
index 0000000..d8e638b
--- /dev/null
+++ b/node_modules/snapdragon/lib/source-maps.js
@@ -0,0 +1,145 @@
+'use strict';
+
+var fs = require('fs');
+var path = require('path');
+var define = require('define-property');
+var utils = require('./utils');
+
+/**
+ * Expose `mixin()`.
+ * This code is based on `source-maps-support.js` in reworkcss/css
+ * https://github.com/reworkcss/css/blob/master/lib/stringify/source-map-support.js
+ * Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>
+ */
+
+module.exports = mixin;
+
+/**
+ * Mixin source map support into `compiler`.
+ *
+ * @param {Object} `compiler`
+ * @api public
+ */
+
+function mixin(compiler) {
+  define(compiler, '_comment', compiler.comment);
+  compiler.map = new utils.SourceMap.SourceMapGenerator();
+  compiler.position = { line: 1, column: 1 };
+  compiler.content = {};
+  compiler.files = {};
+
+  for (var key in exports) {
+    define(compiler, key, exports[key]);
+  }
+}
+
+/**
+ * Update position.
+ *
+ * @param {String} str
+ */
+
+exports.updatePosition = function(str) {
+  var lines = str.match(/\n/g);
+  if (lines) this.position.line += lines.length;
+  var i = str.lastIndexOf('\n');
+  this.position.column = ~i ? str.length - i : this.position.column + str.length;
+};
+
+/**
+ * Emit `str` with `position`.
+ *
+ * @param {String} str
+ * @param {Object} [pos]
+ * @return {String}
+ */
+
+exports.emit = function(str, node) {
+  var position = node.position || {};
+  var source = position.source;
+  if (source) {
+    if (position.filepath) {
+      source = utils.unixify(position.filepath);
+    }
+
+    this.map.addMapping({
+      source: source,
+      generated: {
+        line: this.position.line,
+        column: Math.max(this.position.column - 1, 0)
+      },
+      original: {
+        line: position.start.line,
+        column: position.start.column - 1
+      }
+    });
+
+    if (position.content) {
+      this.addContent(source, position);
+    }
+    if (position.filepath) {
+      this.addFile(source, position);
+    }
+
+    this.updatePosition(str);
+    this.output += str;
+  }
+  return str;
+};
+
+/**
+ * Adds a file to the source map output if it has not already been added
+ * @param {String} `file`
+ * @param {Object} `pos`
+ */
+
+exports.addFile = function(file, position) {
+  if (typeof position.content !== 'string') return;
+  if (Object.prototype.hasOwnProperty.call(this.files, file)) return;
+  this.files[file] = position.content;
+};
+
+/**
+ * Adds a content source to the source map output if it has not already been added
+ * @param {String} `source`
+ * @param {Object} `position`
+ */
+
+exports.addContent = function(source, position) {
+  if (typeof position.content !== 'string') return;
+  if (Object.prototype.hasOwnProperty.call(this.content, source)) return;
+  this.map.setSourceContent(source, position.content);
+};
+
+/**
+ * Applies any original source maps to the output and embeds the source file
+ * contents in the source map.
+ */
+
+exports.applySourceMaps = function() {
+  Object.keys(this.files).forEach(function(file) {
+    var content = this.files[file];
+    this.map.setSourceContent(file, content);
+
+    if (this.options.inputSourcemaps === true) {
+      var originalMap = utils.sourceMapResolve.resolveSync(content, file, fs.readFileSync);
+      if (originalMap) {
+        var map = new utils.SourceMap.SourceMapConsumer(originalMap.map);
+        var relativeTo = originalMap.sourcesRelativeTo;
+        this.map.applySourceMap(map, file, utils.unixify(path.dirname(relativeTo)));
+      }
+    }
+  }, this);
+};
+
+/**
+ * Process comments, drops sourceMap comments.
+ * @param {Object} node
+ */
+
+exports.comment = function(node) {
+  if (/^# sourceMappingURL=/.test(node.comment)) {
+    return this.emit('', node.position);
+  }
+  return this._comment(node);
+};
diff --git a/node_modules/snapdragon/lib/utils.js b/node_modules/snapdragon/lib/utils.js
new file mode 100644
index 0000000..33f07e1
--- /dev/null
+++ b/node_modules/snapdragon/lib/utils.js
@@ -0,0 +1,48 @@
+'use strict';
+
+/**
+ * Module dependencies
+ */
+
+exports.extend = require('extend-shallow');
+exports.SourceMap = require('source-map');
+exports.sourceMapResolve = require('source-map-resolve');
+
+/**
+ * Convert backslash in the given string to forward slashes
+ */
+
+exports.unixify = function(fp) {
+  return fp.split(/\\+/).join('/');
+};
+
+/**
+ * Return true if `val` is a non-empty string
+ *
+ * @param {String} `str`
+ * @return {Boolean}
+ */
+
+exports.isString = function(str) {
+  return str && typeof str === 'string';
+};
+
+/**
+ * Cast `val` to an array
+ * @return {Array}
+ */
+
+exports.arrayify = function(val) {
+  if (typeof val === 'string') return [val];
+  return val ? (Array.isArray(val) ? val : [val]) : [];
+};
+
+/**
+ * Get the last `n` element from the given `array`
+ * @param {Array} `array`
+ * @return {*}
+ */
+
+exports.last = function(arr, n) {
+  return arr[arr.length - (n || 1)];
+};
diff --git a/node_modules/snapdragon/node_modules/define-property/LICENSE b/node_modules/snapdragon/node_modules/define-property/LICENSE
new file mode 100644
index 0000000..65f90ac
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/define-property/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015, 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/snapdragon/node_modules/define-property/README.md b/node_modules/snapdragon/node_modules/define-property/README.md
new file mode 100644
index 0000000..8cac698
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/define-property/README.md
@@ -0,0 +1,77 @@
+# define-property [![NPM version](https://badge.fury.io/js/define-property.svg)](http://badge.fury.io/js/define-property)
+
+> Define a non-enumerable property on an object.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/)
+
+```sh
+$ npm i define-property --save
+```
+
+## Usage
+
+**Params**
+
+* `obj`: The object on which to define the property.
+* `prop`: The name of the property to be defined or modified.
+* `descriptor`: The descriptor for the property being defined or modified.
+
+```js
+var define = require('define-property');
+var obj = {};
+define(obj, 'foo', function(val) {
+  return val.toUpperCase();
+});
+
+console.log(obj);
+//=> {}
+
+console.log(obj.foo('bar'));
+//=> 'BAR'
+```
+
+**get/set**
+
+```js
+define(obj, 'foo', {
+  get: function() {},
+  set: function() {}
+});
+```
+
+## Related projects
+
+* [delegate-object](https://www.npmjs.com/package/delegate-object): Copy properties from an object to another object, where properties with function values will be… [more](https://www.npmjs.com/package/delegate-object) | [homepage](https://github.com/doowb/delegate-object)
+* [forward-object](https://www.npmjs.com/package/forward-object): Copy properties from an object to another object, where properties with function values will be… [more](https://www.npmjs.com/package/forward-object) | [homepage](https://github.com/doowb/forward-object)
+* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep)
+* [mixin-object](https://www.npmjs.com/package/mixin-object): Mixin the own and inherited properties of other objects onto the first object. Pass an… [more](https://www.npmjs.com/package/mixin-object) | [homepage](https://github.com/jonschlinkert/mixin-object)
+
+## Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm i -d && npm test
+```
+
+## Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/define-property/issues/new).
+
+## Author
+
+**Jon Schlinkert**
+
++ [github/jonschlinkert](https://github.com/jonschlinkert)
++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+## License
+
+Copyright © 2015 Jon Schlinkert
+Released under the MIT license.
+
+***
+
+_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on August 31, 2015._
diff --git a/node_modules/snapdragon/node_modules/define-property/index.js b/node_modules/snapdragon/node_modules/define-property/index.js
new file mode 100644
index 0000000..3e0e5e1
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/define-property/index.js
@@ -0,0 +1,31 @@
+/*!
+ * define-property <https://github.com/jonschlinkert/define-property>
+ *
+ * Copyright (c) 2015, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+'use strict';
+
+var isDescriptor = require('is-descriptor');
+
+module.exports = function defineProperty(obj, prop, val) {
+  if (typeof obj !== 'object' && typeof obj !== 'function') {
+    throw new TypeError('expected an object or function.');
+  }
+
+  if (typeof prop !== 'string') {
+    throw new TypeError('expected `prop` to be a string.');
+  }
+
+  if (isDescriptor(val) && ('set' in val || 'get' in val)) {
+    return Object.defineProperty(obj, prop, val);
+  }
+
+  return Object.defineProperty(obj, prop, {
+    configurable: true,
+    enumerable: false,
+    writable: true,
+    value: val
+  });
+};
diff --git a/node_modules/snapdragon/node_modules/define-property/package.json b/node_modules/snapdragon/node_modules/define-property/package.json
new file mode 100644
index 0000000..664ab6d
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/define-property/package.json
@@ -0,0 +1,82 @@
+{
+  "_from": "define-property@^0.2.5",
+  "_id": "define-property@0.2.5",
+  "_inBundle": false,
+  "_integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+  "_location": "/snapdragon/define-property",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "define-property@^0.2.5",
+    "name": "define-property",
+    "escapedName": "define-property",
+    "rawSpec": "^0.2.5",
+    "saveSpec": null,
+    "fetchSpec": "^0.2.5"
+  },
+  "_requiredBy": [
+    "/snapdragon"
+  ],
+  "_resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+  "_shasum": "c35b1ef918ec3c990f9a5bc57be04aacec5c8116",
+  "_spec": "define-property@^0.2.5",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\snapdragon",
+  "author": {
+    "name": "Jon Schlinkert",
+    "url": "https://github.com/jonschlinkert"
+  },
+  "bugs": {
+    "url": "https://github.com/jonschlinkert/define-property/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "is-descriptor": "^0.1.0"
+  },
+  "deprecated": false,
+  "description": "Define a non-enumerable property on an object.",
+  "devDependencies": {
+    "mocha": "*",
+    "should": "^7.0.4"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/jonschlinkert/define-property",
+  "keywords": [
+    "define",
+    "define-property",
+    "enumerable",
+    "key",
+    "non",
+    "non-enumerable",
+    "object",
+    "prop",
+    "property",
+    "value"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "define-property",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jonschlinkert/define-property.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "verb": {
+    "related": {
+      "list": [
+        "mixin-deep",
+        "mixin-object",
+        "delegate-object",
+        "forward-object"
+      ]
+    }
+  },
+  "version": "0.2.5"
+}
diff --git a/node_modules/snapdragon/node_modules/extend-shallow/LICENSE b/node_modules/snapdragon/node_modules/extend-shallow/LICENSE
new file mode 100644
index 0000000..fa30c4c
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/extend-shallow/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2015, 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/snapdragon/node_modules/extend-shallow/README.md b/node_modules/snapdragon/node_modules/extend-shallow/README.md
new file mode 100644
index 0000000..cdc45d4
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/extend-shallow/README.md
@@ -0,0 +1,61 @@
+# extend-shallow [![NPM version](https://badge.fury.io/js/extend-shallow.svg)](http://badge.fury.io/js/extend-shallow)  [![Build Status](https://travis-ci.org/jonschlinkert/extend-shallow.svg)](https://travis-ci.org/jonschlinkert/extend-shallow)
+
+> Extend an object with the properties of additional objects. node.js/javascript util.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/)
+
+```sh
+$ npm i extend-shallow --save
+```
+
+## Usage
+
+```js
+var extend = require('extend-shallow');
+
+extend({a: 'b'}, {c: 'd'})
+//=> {a: 'b', c: 'd'}
+```
+
+Pass an empty object to shallow clone:
+
+```js
+var obj = {};
+extend(obj, {a: 'b'}, {c: 'd'})
+//=> {a: 'b', c: 'd'}
+```
+
+## Related
+
+* [extend-shallow](https://github.com/jonschlinkert/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util.
+* [for-own](https://github.com/jonschlinkert/for-own): Iterate over the own enumerable properties of an object, and return an object with properties… [more](https://github.com/jonschlinkert/for-own)
+* [for-in](https://github.com/jonschlinkert/for-in): Iterate over the own and inherited enumerable properties of an objecte, and return an object… [more](https://github.com/jonschlinkert/for-in)
+* [is-plain-object](https://github.com/jonschlinkert/is-plain-object): Returns true if an object was created by the `Object` constructor.
+* [isobject](https://github.com/jonschlinkert/isobject): Returns true if the value is an object and not an array or null.
+* [kind-of](https://github.com/jonschlinkert/kind-of): Get the native type of a value.
+
+## Running tests
+
+Install dev dependencies:
+
+```sh
+$ npm i -d && npm test
+```
+
+## Author
+
+**Jon Schlinkert**
+
++ [github/jonschlinkert](https://github.com/jonschlinkert)
++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
+
+## License
+
+Copyright © 2015 Jon Schlinkert
+Released under the MIT license.
+
+***
+
+_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on June 29, 2015._
\ No newline at end of file
diff --git a/node_modules/snapdragon/node_modules/extend-shallow/index.js b/node_modules/snapdragon/node_modules/extend-shallow/index.js
new file mode 100644
index 0000000..92a067f
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/extend-shallow/index.js
@@ -0,0 +1,33 @@
+'use strict';
+
+var isObject = require('is-extendable');
+
+module.exports = function extend(o/*, objects*/) {
+  if (!isObject(o)) { o = {}; }
+
+  var len = arguments.length;
+  for (var i = 1; i < len; i++) {
+    var obj = arguments[i];
+
+    if (isObject(obj)) {
+      assign(o, obj);
+    }
+  }
+  return o;
+};
+
+function assign(a, b) {
+  for (var key in b) {
+    if (hasOwn(b, key)) {
+      a[key] = b[key];
+    }
+  }
+}
+
+/**
+ * Returns true if the given `key` is an own property of `obj`.
+ */
+
+function hasOwn(obj, key) {
+  return Object.prototype.hasOwnProperty.call(obj, key);
+}
diff --git a/node_modules/snapdragon/node_modules/extend-shallow/package.json b/node_modules/snapdragon/node_modules/extend-shallow/package.json
new file mode 100644
index 0000000..bc3bfa0
--- /dev/null
+++ b/node_modules/snapdragon/node_modules/extend-shallow/package.json
@@ -0,0 +1,87 @@
+{
+  "_from": "extend-shallow@^2.0.1",
+  "_id": "extend-shallow@2.0.1",
+  "_inBundle": false,
+  "_integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+  "_location": "/snapdragon/extend-shallow",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "extend-shallow@^2.0.1",
+    "name": "extend-shallow",
+    "escapedName": "extend-shallow",
+    "rawSpec": "^2.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.1"
+  },
+  "_requiredBy": [
+    "/snapdragon"
+  ],
+  "_resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+  "_shasum": "51af7d614ad9a9f610ea1bafbb989d6b1c56890f",
+  "_spec": "extend-shallow@^2.0.1",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\snapdragon",
+  "author": {
+    "name": "Jon Schlinkert",
+    "url": "https://github.com/jonschlinkert"
+  },
+  "bugs": {
+    "url": "https://github.com/jonschlinkert/extend-shallow/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "is-extendable": "^0.1.0"
+  },
+  "deprecated": false,
+  "description": "Extend an object with the properties of additional objects. node.js/javascript util.",
+  "devDependencies": {
+    "array-slice": "^0.2.3",
+    "benchmarked": "^0.1.4",
+    "chalk": "^1.0.0",
+    "for-own": "^0.1.3",
+    "glob": "^5.0.12",
+    "is-plain-object": "^2.0.1",
+    "kind-of": "^2.0.0",
+    "minimist": "^1.1.1",
+    "mocha": "^2.2.5",
+    "should": "^7.0.1"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/jonschlinkert/extend-shallow",
+  "keywords": [
+    "assign",
+    "extend",
+    "javascript",
+    "js",
+    "keys",
+    "merge",
+    "obj",
+    "object",
+    "prop",
+    "properties",
+    "property",
+    "props",
+    "shallow",
+    "util",
+    "utility",
+    "utils",
+    "value"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "extend-shallow",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jonschlinkert/extend-shallow.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "version": "2.0.1"
+}
diff --git a/node_modules/snapdragon/package.json b/node_modules/snapdragon/package.json
new file mode 100644
index 0000000..744b3e8
--- /dev/null
+++ b/node_modules/snapdragon/package.json
@@ -0,0 +1,126 @@
+{
+  "_from": "snapdragon@^0.8.1",
+  "_id": "snapdragon@0.8.2",
+  "_inBundle": false,
+  "_integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+  "_location": "/snapdragon",
+  "_phantomChildren": {
+    "is-descriptor": "0.1.6",
+    "is-extendable": "0.1.1"
+  },
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "snapdragon@^0.8.1",
+    "name": "snapdragon",
+    "escapedName": "snapdragon",
+    "rawSpec": "^0.8.1",
+    "saveSpec": null,
+    "fetchSpec": "^0.8.1"
+  },
+  "_requiredBy": [
+    "/braces",
+    "/expand-brackets",
+    "/extglob",
+    "/micromatch",
+    "/nanomatch"
+  ],
+  "_resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+  "_shasum": "64922e7c565b0e14204ba1aa7d6964278d25182d",
+  "_spec": "snapdragon@^0.8.1",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\micromatch",
+  "author": {
+    "name": "Jon Schlinkert",
+    "url": "https://github.com/jonschlinkert"
+  },
+  "bugs": {
+    "url": "https://github.com/jonschlinkert/snapdragon/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Brian Woodward",
+      "url": "https://twitter.com/doowb"
+    },
+    {
+      "name": "Edward Betts",
+      "url": "http://edwardbetts.com"
+    },
+    {
+      "name": "Jon Schlinkert",
+      "url": "http://twitter.com/jonschlinkert"
+    }
+  ],
+  "dependencies": {
+    "base": "^0.11.1",
+    "debug": "^2.2.0",
+    "define-property": "^0.2.5",
+    "extend-shallow": "^2.0.1",
+    "map-cache": "^0.2.2",
+    "source-map": "^0.5.6",
+    "source-map-resolve": "^0.5.0",
+    "use": "^3.1.0"
+  },
+  "deprecated": false,
+  "description": "Fast, pluggable and easy-to-use parser-renderer factory.",
+  "devDependencies": {
+    "gulp": "^3.9.1",
+    "gulp-eslint": "^3.0.1",
+    "gulp-format-md": "^0.1.10",
+    "gulp-istanbul": "^1.1.1",
+    "gulp-mocha": "^3.0.1",
+    "gulp-unused": "^0.2.0",
+    "mocha": "^3.0.2"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js",
+    "lib"
+  ],
+  "homepage": "https://github.com/jonschlinkert/snapdragon",
+  "keywords": [
+    "lexer",
+    "snapdragon"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "snapdragon",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jonschlinkert/snapdragon.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "verb": {
+    "toc": false,
+    "layout": "default",
+    "tasks": [
+      "readme"
+    ],
+    "plugins": [
+      "gulp-format-md"
+    ],
+    "related": {
+      "description": "These libraries use snapdragon:",
+      "list": [
+        "braces",
+        "expand-brackets",
+        "extglob",
+        "micromatch"
+      ]
+    },
+    "reflinks": [
+      "css",
+      "pug",
+      "verb",
+      "verb-generate-readme"
+    ],
+    "lint": {
+      "reflinks": true
+    }
+  },
+  "version": "0.8.2"
+}
