diff --git a/node_modules/pseudomap/LICENSE b/node_modules/pseudomap/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/pseudomap/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/pseudomap/README.md b/node_modules/pseudomap/README.md
new file mode 100644
index 0000000..778bf01
--- /dev/null
+++ b/node_modules/pseudomap/README.md
@@ -0,0 +1,60 @@
+# pseudomap
+
+A thing that is a lot like ES6 `Map`, but without iterators, for use
+in environments where `for..of` syntax and `Map` are not available.
+
+If you need iterators, or just in general a more faithful polyfill to
+ES6 Maps, check out [es6-map](http://npm.im/es6-map).
+
+If you are in an environment where `Map` is supported, then that will
+be returned instead, unless `process.env.TEST_PSEUDOMAP` is set.
+
+You can use any value as keys, and any value as data.  Setting again
+with the identical key will overwrite the previous value.
+
+Internally, data is stored on an `Object.create(null)` style object.
+The key is coerced to a string to generate the key on the internal
+data-bag object.  The original key used is stored along with the data.
+
+In the event of a stringified-key collision, a new key is generated by
+appending an increasing number to the stringified-key until finding
+either the intended key or an empty spot.
+
+Note that because object traversal order of plain objects is not
+guaranteed to be identical to insertion order, the insertion order
+guarantee of `Map.prototype.forEach` is not guaranteed in this
+implementation.  However, in all versions of Node.js and V8 where this
+module works, `forEach` does traverse data in insertion order.
+
+## API
+
+Most of the [Map
+API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map),
+with the following exceptions:
+
+1. A `Map` object is not an iterator.
+2. `values`, `keys`, and `entries` methods are not implemented,
+   because they return iterators.
+3. The argument to the constructor can be an Array of `[key, value]`
+   pairs, or a `Map` or `PseudoMap` object.  But, since iterators
+   aren't used, passing any plain-old iterator won't initialize the
+   map properly.
+
+## USAGE
+
+Use just like a regular ES6 Map.
+
+```javascript
+var PseudoMap = require('pseudomap')
+
+// optionally provide a pseudomap, or an array of [key,value] pairs
+// as the argument to initialize the map with
+var myMap = new PseudoMap()
+
+myMap.set(1, 'number 1')
+myMap.set('1', 'string 1')
+var akey = {}
+var bkey = {}
+myMap.set(akey, { some: 'data' })
+myMap.set(bkey, { some: 'other data' })
+```
diff --git a/node_modules/pseudomap/map.js b/node_modules/pseudomap/map.js
new file mode 100644
index 0000000..7db1599
--- /dev/null
+++ b/node_modules/pseudomap/map.js
@@ -0,0 +1,9 @@
+if (process.env.npm_package_name === 'pseudomap' &&
+    process.env.npm_lifecycle_script === 'test')
+  process.env.TEST_PSEUDOMAP = 'true'
+
+if (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {
+  module.exports = Map
+} else {
+  module.exports = require('./pseudomap')
+}
diff --git a/node_modules/pseudomap/package.json b/node_modules/pseudomap/package.json
new file mode 100644
index 0000000..f536d5f
--- /dev/null
+++ b/node_modules/pseudomap/package.json
@@ -0,0 +1,54 @@
+{
+  "_from": "pseudomap@^1.0.2",
+  "_id": "pseudomap@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+  "_location": "/pseudomap",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "pseudomap@^1.0.2",
+    "name": "pseudomap",
+    "escapedName": "pseudomap",
+    "rawSpec": "^1.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.2"
+  },
+  "_requiredBy": [
+    "/lru-cache"
+  ],
+  "_resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+  "_shasum": "f052a28da70e618917ef0a8ac34c1ae5a68286b3",
+  "_spec": "pseudomap@^1.0.2",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\lru-cache",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/pseudomap/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "A thing that is a lot like ES6 `Map`, but without iterators, for use in environments where `for..of` syntax and `Map` are not available.",
+  "devDependencies": {
+    "tap": "^2.3.1"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "homepage": "https://github.com/isaacs/pseudomap#readme",
+  "license": "ISC",
+  "main": "map.js",
+  "name": "pseudomap",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/isaacs/pseudomap.git"
+  },
+  "scripts": {
+    "test": "tap test/*.js"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/pseudomap/pseudomap.js b/node_modules/pseudomap/pseudomap.js
new file mode 100644
index 0000000..25a21d8
--- /dev/null
+++ b/node_modules/pseudomap/pseudomap.js
@@ -0,0 +1,113 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty
+
+module.exports = PseudoMap
+
+function PseudoMap (set) {
+  if (!(this instanceof PseudoMap)) // whyyyyyyy
+    throw new TypeError("Constructor PseudoMap requires 'new'")
+
+  this.clear()
+
+  if (set) {
+    if ((set instanceof PseudoMap) ||
+        (typeof Map === 'function' && set instanceof Map))
+      set.forEach(function (value, key) {
+        this.set(key, value)
+      }, this)
+    else if (Array.isArray(set))
+      set.forEach(function (kv) {
+        this.set(kv[0], kv[1])
+      }, this)
+    else
+      throw new TypeError('invalid argument')
+  }
+}
+
+PseudoMap.prototype.forEach = function (fn, thisp) {
+  thisp = thisp || this
+  Object.keys(this._data).forEach(function (k) {
+    if (k !== 'size')
+      fn.call(thisp, this._data[k].value, this._data[k].key)
+  }, this)
+}
+
+PseudoMap.prototype.has = function (k) {
+  return !!find(this._data, k)
+}
+
+PseudoMap.prototype.get = function (k) {
+  var res = find(this._data, k)
+  return res && res.value
+}
+
+PseudoMap.prototype.set = function (k, v) {
+  set(this._data, k, v)
+}
+
+PseudoMap.prototype.delete = function (k) {
+  var res = find(this._data, k)
+  if (res) {
+    delete this._data[res._index]
+    this._data.size--
+  }
+}
+
+PseudoMap.prototype.clear = function () {
+  var data = Object.create(null)
+  data.size = 0
+
+  Object.defineProperty(this, '_data', {
+    value: data,
+    enumerable: false,
+    configurable: true,
+    writable: false
+  })
+}
+
+Object.defineProperty(PseudoMap.prototype, 'size', {
+  get: function () {
+    return this._data.size
+  },
+  set: function (n) {},
+  enumerable: true,
+  configurable: true
+})
+
+PseudoMap.prototype.values =
+PseudoMap.prototype.keys =
+PseudoMap.prototype.entries = function () {
+  throw new Error('iterators are not implemented in this version')
+}
+
+// Either identical, or both NaN
+function same (a, b) {
+  return a === b || a !== a && b !== b
+}
+
+function Entry (k, v, i) {
+  this.key = k
+  this.value = v
+  this._index = i
+}
+
+function find (data, k) {
+  for (var i = 0, s = '_' + k, key = s;
+       hasOwnProperty.call(data, key);
+       key = s + i++) {
+    if (same(data[key].key, k))
+      return data[key]
+  }
+}
+
+function set (data, k, v) {
+  for (var i = 0, s = '_' + k, key = s;
+       hasOwnProperty.call(data, key);
+       key = s + i++) {
+    if (same(data[key].key, k)) {
+      data[key].value = v
+      return
+    }
+  }
+  data.size++
+  data[key] = new Entry(k, v, key)
+}
diff --git a/node_modules/pseudomap/test/basic.js b/node_modules/pseudomap/test/basic.js
new file mode 100644
index 0000000..4378e45
--- /dev/null
+++ b/node_modules/pseudomap/test/basic.js
@@ -0,0 +1,86 @@
+var t = require('tap')
+
+process.env.TEST_PSEUDOMAP = 'true'
+
+var PM = require('../')
+runTests(PM)
+
+// if possible, verify that Map also behaves the same way
+if (typeof Map === 'function')
+  runTests(Map)
+
+
+function runTests (Map) {
+  t.throws(Map)
+
+  var m = new Map()
+
+  t.equal(m.size, 0)
+
+  m.set(1, '1 string')
+  t.equal(m.get(1), '1 string')
+  t.equal(m.size, 1)
+  m.size = 1000
+  t.equal(m.size, 1)
+  m.size = 0
+  t.equal(m.size, 1)
+
+  m = new Map([[1, 'number 1'], ['1', 'string 1']])
+  t.equal(m.get(1), 'number 1')
+  t.equal(m.get('1'), 'string 1')
+  t.equal(m.size, 2)
+
+  m = new Map(m)
+  t.equal(m.get(1), 'number 1')
+  t.equal(m.get('1'), 'string 1')
+  t.equal(m.size, 2)
+
+  var akey = {}
+  var bkey = {}
+  m.set(akey, { some: 'data' })
+  m.set(bkey, { some: 'other data' })
+  t.same(m.get(akey), { some: 'data' })
+  t.same(m.get(bkey), { some: 'other data' })
+  t.equal(m.size, 4)
+
+  var x = /x/
+  var y = /x/
+  m.set(x, 'x regex')
+  m.set(y, 'y regex')
+  t.equal(m.get(x), 'x regex')
+  m.set(x, 'x again')
+  t.equal(m.get(x), 'x again')
+  t.equal(m.size, 6)
+
+  m.set(NaN, 'not a number')
+  t.equal(m.get(NaN), 'not a number')
+  m.set(NaN, 'it is a ' + typeof NaN)
+  t.equal(m.get(NaN), 'it is a number')
+  m.set('NaN', 'stringie nan')
+  t.equal(m.get(NaN), 'it is a number')
+  t.equal(m.get('NaN'), 'stringie nan')
+  t.equal(m.size, 8)
+
+  m.delete(NaN)
+  t.equal(m.get(NaN), undefined)
+  t.equal(m.size, 7)
+
+  var expect = [
+    { value: 'number 1', key: 1 },
+    { value: 'string 1', key: '1' },
+    { value: { some: 'data' }, key: {} },
+    { value: { some: 'other data' }, key: {} },
+    { value: 'x again', key: /x/ },
+    { value: 'y regex', key: /x/ },
+    { value: 'stringie nan', key: 'NaN' }
+  ]
+  var actual = []
+
+  m.forEach(function (value, key) {
+    actual.push({ value: value, key: key })
+  })
+  t.same(actual, expect)
+
+  m.clear()
+  t.equal(m.size, 0)
+}
