From 7e62e15217489fa966538e0e0c6a3e0df510c049 Mon Sep 17 00:00:00 2001
From: Dan Burzo <dburzo@sdl.com>
Date: Mon, 23 Sep 2013 14:21:22 +0300
Subject: [PATCH 01/22] Updated README

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 48b96f7..cb9f46f 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 pubsub
 ======
 
-`pubsub` is a small, fast\* JavaScript library that implements the [Publish/Subscribe](http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) pattern for web applications. You can find the annotated source code here: http://danburzo.github.io/appseeds
+`pubsub` is a small, fast\* JavaScript library that implements the [Publish/Subscribe](http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) pattern for web applications. Details here: http://danburzo.github.io/pubsub
 
 It's forked from [AppSeeds](http://github.com/danburzo/appseeds).
 

From d46058f44b7c23206aedbd8572888a610a3bc774 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Thu, 3 Mar 2016 00:46:55 +0200
Subject: [PATCH 02/22] Allow .pub() to be optimized by V8 engine

---
 Gruntfile.js                        |   2 +-
 docs/docco.css                      | 140 +++++++++++++++------------
 docs/public/fonts/roboto-black.eot  | Bin 0 -> 20702 bytes
 docs/public/fonts/roboto-black.ttf  | Bin 0 -> 44828 bytes
 docs/public/fonts/roboto-black.woff | Bin 0 -> 24536 bytes
 docs/pubsub.html                    | 145 ++++++++++++++--------------
 package.json                        |  12 +--
 pubsub.js                           |   5 +-
 pubsub.min.js                       |   2 +-
 9 files changed, 162 insertions(+), 144 deletions(-)
 create mode 100755 docs/public/fonts/roboto-black.eot
 create mode 100755 docs/public/fonts/roboto-black.ttf
 create mode 100755 docs/public/fonts/roboto-black.woff

diff --git a/Gruntfile.js b/Gruntfile.js
index b912d2c..2ac7718 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -48,7 +48,7 @@ module.exports = function(grunt) {
 
 	grunt.loadNpmTasks('grunt-contrib-uglify');
 	grunt.loadNpmTasks('grunt-contrib-qunit');
-	grunt.loadNpmTasks('grunt-docco2');
+	grunt.loadNpmTasks('grunt-docco');
 	grunt.loadNpmTasks('grunt-contrib-copy');
 	grunt.loadNpmTasks('grunt-contrib-clean');
 
diff --git a/docs/docco.css b/docs/docco.css
index 36582a6..b60f6fa 100644
--- a/docs/docco.css
+++ b/docs/docco.css
@@ -21,11 +21,11 @@
 }
 
 @font-face {
-    font-family: 'novecento-bold';
-    src: url('public/fonts/novecento-bold.eot');
-    src: url('public/fonts/novecento-bold.eot?#iefix') format('embedded-opentype'),
-         url('public/fonts/novecento-bold.woff') format('woff'),
-         url('public/fonts/novecento-bold.ttf') format('truetype');
+    font-family: 'roboto-black';
+    src: url('public/fonts/roboto-black.eot');
+    src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'),
+         url('public/fonts/roboto-black.woff') format('woff'),
+         url('public/fonts/roboto-black.ttf') format('truetype');
     font-weight: normal;
     font-style: normal;
 }
@@ -67,7 +67,7 @@ h1, h2, h3, h4, h5, h6 {
   color: #112233;
   line-height: 1em;
   font-weight: normal;
-  font-family: "novecento-bold";
+  font-family: "roboto-black";
   text-transform: uppercase;
   margin: 30px 0 15px 0;
 }
@@ -75,6 +75,9 @@ h1, h2, h3, h4, h5, h6 {
 h1 {
   margin-top: 40px;
 }
+h2 {
+  font-size: 1.26em;
+}
 
 hr {
   border: 0;
@@ -180,9 +183,18 @@ ul.sections > li > div {
   display: block;
 }
 
+#jump_page_wrapper{
+  position: fixed;
+  right: 0;
+  top: 0;
+  bottom: 0;
+}
+
 #jump_page {
   padding: 5px 0 3px;
   margin: 0 0 25px 25px;
+  max-height: 100%;
+  overflow: auto;
 }
 
 #jump_page .source {
@@ -382,125 +394,125 @@ pre code {
   background: #f8f8ff
 }
 
-pre .comment,
-pre .template_comment,
-pre .diff .header,
-pre .javadoc {
+pre .hljs-comment,
+pre .hljs-template_comment,
+pre .hljs-diff .hljs-header,
+pre .hljs-javadoc {
   color: #408080;
   font-style: italic
 }
 
-pre .keyword,
-pre .assignment,
-pre .literal,
-pre .css .rule .keyword,
-pre .winutils,
-pre .javascript .title,
-pre .lisp .title,
-pre .subst {
+pre .hljs-keyword,
+pre .hljs-assignment,
+pre .hljs-literal,
+pre .hljs-css .hljs-rule .hljs-keyword,
+pre .hljs-winutils,
+pre .hljs-javascript .hljs-title,
+pre .hljs-lisp .hljs-title,
+pre .hljs-subst {
   color: #954121;
   /*font-weight: bold*/
 }
 
-pre .number,
-pre .hexcolor {
+pre .hljs-number,
+pre .hljs-hexcolor {
   color: #40a070
 }
 
-pre .string,
-pre .tag .value,
-pre .phpdoc,
-pre .tex .formula {
+pre .hljs-string,
+pre .hljs-tag .hljs-value,
+pre .hljs-phpdoc,
+pre .hljs-tex .hljs-formula {
   color: #219161;
 }
 
-pre .title,
-pre .id {
+pre .hljs-title,
+pre .hljs-id {
   color: #19469D;
 }
-pre .params {
+pre .hljs-params {
   color: #00F;
 }
 
-pre .javascript .title,
-pre .lisp .title,
-pre .subst {
+pre .hljs-javascript .hljs-title,
+pre .hljs-lisp .hljs-title,
+pre .hljs-subst {
   font-weight: normal
 }
 
-pre .class .title,
-pre .haskell .label,
-pre .tex .command {
+pre .hljs-class .hljs-title,
+pre .hljs-haskell .hljs-label,
+pre .hljs-tex .hljs-command {
   color: #458;
   font-weight: bold
 }
 
-pre .tag,
-pre .tag .title,
-pre .rules .property,
-pre .django .tag .keyword {
+pre .hljs-tag,
+pre .hljs-tag .hljs-title,
+pre .hljs-rules .hljs-property,
+pre .hljs-django .hljs-tag .hljs-keyword {
   color: #000080;
   font-weight: normal
 }
 
-pre .attribute,
-pre .variable,
-pre .instancevar,
-pre .lisp .body {
+pre .hljs-attribute,
+pre .hljs-variable,
+pre .hljs-instancevar,
+pre .hljs-lisp .hljs-body {
   color: #008080
 }
 
-pre .regexp {
+pre .hljs-regexp {
   color: #B68
 }
 
-pre .class {
+pre .hljs-class {
   color: #458;
   font-weight: bold
 }
 
-pre .symbol,
-pre .ruby .symbol .string,
-pre .ruby .symbol .keyword,
-pre .ruby .symbol .keymethods,
-pre .lisp .keyword,
-pre .tex .special,
-pre .input_number {
+pre .hljs-symbol,
+pre .hljs-ruby .hljs-symbol .hljs-string,
+pre .hljs-ruby .hljs-symbol .hljs-keyword,
+pre .hljs-ruby .hljs-symbol .hljs-keymethods,
+pre .hljs-lisp .hljs-keyword,
+pre .hljs-tex .hljs-special,
+pre .hljs-input_number {
   color: #990073
 }
 
-pre .builtin,
-pre .constructor,
-pre .built_in,
-pre .lisp .title {
+pre .hljs-builtin,
+pre .hljs-constructor,
+pre .hljs-built_in,
+pre .hljs-lisp .hljs-title {
   color: #0086b3
 }
 
-pre .preprocessor,
-pre .pi,
-pre .doctype,
-pre .shebang,
-pre .cdata {
+pre .hljs-preprocessor,
+pre .hljs-pi,
+pre .hljs-doctype,
+pre .hljs-shebang,
+pre .hljs-cdata {
   color: #999;
   font-weight: bold
 }
 
-pre .deletion {
+pre .hljs-deletion {
   background: #fdd
 }
 
-pre .addition {
+pre .hljs-addition {
   background: #dfd
 }
 
-pre .diff .change {
+pre .hljs-diff .hljs-change {
   background: #0086b3
 }
 
-pre .chunk {
+pre .hljs-chunk {
   color: #aaa
 }
 
-pre .tex .formula {
+pre .hljs-tex .hljs-formula {
   opacity: 0.5;
 }
diff --git a/docs/public/fonts/roboto-black.eot b/docs/public/fonts/roboto-black.eot
new file mode 100755
index 0000000000000000000000000000000000000000..571ed49125910cd6b6b5a9259134dd2e8d37766e
GIT binary patch
diff --git a/docs/public/fonts/roboto-black.ttf b/docs/public/fonts/roboto-black.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..e0300b3ee3e85d54d01d8fb9c3821a44c448a920
GIT binary patch
diff --git a/docs/public/fonts/roboto-black.woff b/docs/public/fonts/roboto-black.woff
new file mode 100755
index 0000000000000000000000000000000000000000..642e5b60f7c662ab5bcf67cfc1089f50bfdd7b00
GIT binary patch
diff --git a/docs/pubsub.html b/docs/pubsub.html
index c27c2e3..349ec0b 100644
--- a/docs/pubsub.html
+++ b/docs/pubsub.html
@@ -33,7 +33,7 @@ <h1>pubsub.js</h1>
 <p>Fork &amp; contribute at <a href="https://github.com/danburzo/pubsub">github.com/danburzo/pubsub</a>. </p>
 <p>Download <a href="https://github.com/danburzo/pubsub/zipball/master">zip</a>, <a href="https://github.com/danburzo/pubsub/tarball/master">tar</a>. </p>
 <p>The guiding principles were: speed, terseness and progressive disclosure.</p>
-<h2>Annotated API</h2>
+<h2 id="annotated-api">Annotated API</h2>
 
             </div>
             
@@ -50,13 +50,13 @@ <h2>Annotated API</h2>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>(<span class="keyword">function</span>() {
-  <span class="keyword">var</span> root = <span class="keyword">this</span>;
+            <div class="content"><div class='highlight'><pre>(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
+  <span class="hljs-keyword">var</span> root = <span class="hljs-keyword">this</span>;
 
-  <span class="keyword">var</span> pubsub = root.pubsub = <span class="keyword">function</span>(options) {
-    <span class="keyword">this</span>.options = options;
-    <span class="keyword">this</span>._pubsubEvents = {};
-    <span class="keyword">this</span>._pubsubHappened = {};
+  <span class="hljs-keyword">var</span> pubsub = root.pubsub = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">options</span>) </span>{
+    <span class="hljs-keyword">this</span>.options = options;
+    <span class="hljs-keyword">this</span>._pubsubEvents = {};
+    <span class="hljs-keyword">this</span>._pubsubHappened = {};
   };</pre></div></div>
             
         </li>
@@ -72,9 +72,9 @@ <h2>Annotated API</h2>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>  pubsub.version = <span class="string">'0.1.0'</span>;
+            <div class="content"><div class='highlight'><pre>  pubsub.version = <span class="hljs-string">'0.1.0'</span>;
 
-  <span class="keyword">var</span> prototype = {</pre></div></div>
+  <span class="hljs-keyword">var</span> prototype = {</pre></div></div>
             
         </li>
         
@@ -82,10 +82,10 @@ <h2>Annotated API</h2>
         <li id="section-4">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-4">&#182;</a>
               </div>
-              <h3>pubsub.pub</h3>
+              <h3 id="pubsub-pub">pubsub.pub</h3>
 <p>Publish an event.</p>
 <ul>
 <li><strong>pub(event, [arg1, [arg2 …]])</strong><ul>
@@ -97,22 +97,25 @@ <h3>pubsub.pub</h3>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    pub: <span class="keyword">function</span>(eventString) {
-      <span class="keyword">var</span> eventComponents = <span class="keyword">this</span>.eventNamespace(eventString);
-      <span class="keyword">var</span> eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
-      <span class="keyword">for</span> (i = <span class="number">0</span>, ilen = eventComponents.length; i &lt; ilen; i++) {
-        eventArray = <span class="keyword">this</span>._pubsubEvents[event = eventComponents[i]] || [];
-        args = Array.prototype.slice.call(arguments, <span class="number">1</span>);
-        <span class="keyword">for</span> (j = <span class="number">0</span>, jlen = eventArray.length; j &lt; jlen; j++) {
+            <div class="content"><div class='highlight'><pre>    pub: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventString</span>) </span>{
+      <span class="hljs-keyword">var</span> eventComponents = <span class="hljs-keyword">this</span>.eventNamespace(eventString);
+      <span class="hljs-keyword">var</span> eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
+      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, ilen = eventComponents.length; i &lt; ilen; i++) {
+        eventArray = <span class="hljs-keyword">this</span>._pubsubEvents[event = eventComponents[i]] || [];
+        args = [];
+        <span class="hljs-keyword">for</span> (j = <span class="hljs-number">1</span>; j &lt; <span class="hljs-built_in">arguments</span>.length; j++) {
+          args.push(<span class="hljs-built_in">arguments</span>[j]);
+        }
+        <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>, jlen = eventArray.length; j &lt; jlen; j++) {
           subscriber = eventArray[j];
-          ret = subscriber[<span class="number">0</span>].apply(subscriber[<span class="number">1</span>] || <span class="keyword">this</span>, args);
-          <span class="keyword">if</span> (subscriber[<span class="number">2</span>] &amp;&amp; ret !== <span class="literal">false</span>) {
-            <span class="keyword">this</span>.unsub(event, subscriber[<span class="number">0</span>]);
+          ret = subscriber[<span class="hljs-number">0</span>].apply(subscriber[<span class="hljs-number">1</span>] || <span class="hljs-keyword">this</span>, args);
+          <span class="hljs-keyword">if</span> (subscriber[<span class="hljs-number">2</span>] &amp;&amp; ret !== <span class="hljs-literal">false</span>) {
+            <span class="hljs-keyword">this</span>.unsub(event, subscriber[<span class="hljs-number">0</span>]);
           }
         }
-        <span class="keyword">this</span>._pubsubHappened[event] = args;
+        <span class="hljs-keyword">this</span>._pubsubHappened[event] = args;
       }
-      <span class="keyword">return</span> <span class="keyword">this</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
     },</pre></div></div>
             
         </li>
@@ -121,17 +124,17 @@ <h3>pubsub.pub</h3>
         <li id="section-5">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-5">&#182;</a>
               </div>
-              <h3>pubsub.sub</h3>
+              <h3 id="pubsub-sub">pubsub.sub</h3>
 <p>Subscribe a function to one or more events.</p>
 <ul>
 <li><strong>sub(eventString, method, [thisArg, [flags]])</strong><ul>
 <li><em>eventString</em> one or more space-separated events;</li>
 <li><em>method</em> the function to subscribe to the events;</li>
 <li><em>thisArg</em> (optional) context for the method;</li>
-<li><em>flags</em> (optional) boleans to configure the subscribers&#39;s behavior:<ul>
+<li><em>flags</em> (optional) boleans to configure the subscribers’s behavior:<ul>
 <li><em>once</em> if true, the subscriber will self-unsubscribe after the first successful execution. Use <em>pubsub.once()</em> for clarity;</li>
 <li><em>recoup</em> if true, the subscriber will execute immediately if the event it subscribes to already happened. Use <em>pubsub.recoup()</em> for clarity.</li>
 </ul>
@@ -143,24 +146,24 @@ <h3>pubsub.sub</h3>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    sub: <span class="keyword">function</span>(eventStr, method, thisArg, flags) {
-      <span class="keyword">var</span> events = eventStr.split(<span class="regexp">/\s+/</span>), event, eventArray, i, len, oldArgs;
-      flags = flags || { once: <span class="literal">false</span>, recoup: <span class="literal">false</span> };
-      <span class="keyword">for</span> (i = <span class="number">0</span>, len = events.length; i &lt; len; i++) {
-        eventArray = <span class="keyword">this</span>._pubsubEvents[event = events[i]];
-        <span class="keyword">if</span> (eventArray) {
+            <div class="content"><div class='highlight'><pre>    sub: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method, thisArg, flags</span>) </span>{
+      <span class="hljs-keyword">var</span> events = eventStr.split(<span class="hljs-regexp">/\s+/</span>), event, eventArray, i, len, oldArgs;
+      flags = flags || { once: <span class="hljs-literal">false</span>, recoup: <span class="hljs-literal">false</span> };
+      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, len = events.length; i &lt; len; i++) {
+        eventArray = <span class="hljs-keyword">this</span>._pubsubEvents[event = events[i]];
+        <span class="hljs-keyword">if</span> (eventArray) {
           eventArray.push([method, thisArg, flags.once]);
-        } <span class="keyword">else</span> {
-          <span class="keyword">this</span>._pubsubEvents[event] = [[method, thisArg, flags.once]];
+        } <span class="hljs-keyword">else</span> {
+          <span class="hljs-keyword">this</span>._pubsubEvents[event] = [[method, thisArg, flags.once]];
         }
-        <span class="keyword">if</span> (flags.recoup) {
-          oldArgs = <span class="keyword">this</span>._pubsubHappened[event];
-          <span class="keyword">if</span> (oldArgs) {
-            method.apply(thisArg || <span class="keyword">this</span>, oldArgs);
+        <span class="hljs-keyword">if</span> (flags.recoup) {
+          oldArgs = <span class="hljs-keyword">this</span>._pubsubHappened[event];
+          <span class="hljs-keyword">if</span> (oldArgs) {
+            method.apply(thisArg || <span class="hljs-keyword">this</span>, oldArgs);
           }
         }
       }
-      <span class="keyword">return</span> <span class="keyword">this</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
     },</pre></div></div>
             
         </li>
@@ -169,10 +172,10 @@ <h3>pubsub.sub</h3>
         <li id="section-6">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-6">&#182;</a>
               </div>
-              <h3>pubsub.unsub</h3>
+              <h3 id="pubsub-unsub">pubsub.unsub</h3>
 <p>Unsubscribe a function from one or more events.</p>
 <ul>
 <li><strong>unsub(eventString, method)</strong><ul>
@@ -185,19 +188,19 @@ <h3>pubsub.unsub</h3>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    unsub: <span class="keyword">function</span>(eventStr, method) {
-      <span class="keyword">var</span> events = eventStr.split(<span class="regexp">/\s+/</span>), event, eventArray, newEventArray, i, j;
-      <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; events.length; i++) {
-        eventArray = <span class="keyword">this</span>._pubsubEvents[event = events[i]] || [];
+            <div class="content"><div class='highlight'><pre>    unsub: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method</span>) </span>{
+      <span class="hljs-keyword">var</span> events = eventStr.split(<span class="hljs-regexp">/\s+/</span>), event, eventArray, newEventArray, i, j;
+      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; events.length; i++) {
+        eventArray = <span class="hljs-keyword">this</span>._pubsubEvents[event = events[i]] || [];
         newEventArray = [];
-        <span class="keyword">for</span> (j = <span class="number">0</span>; method &amp;&amp; j &lt; eventArray.length; j++) {
-          <span class="keyword">if</span> (eventArray[j][<span class="number">0</span>] !== method) {
+        <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>; method &amp;&amp; j &lt; eventArray.length; j++) {
+          <span class="hljs-keyword">if</span> (eventArray[j][<span class="hljs-number">0</span>] !== method) {
             newEventArray.push(eventArray[j]);
           }
         }
-        <span class="keyword">this</span>._pubsubEvents[event] = newEventArray;
+        <span class="hljs-keyword">this</span>._pubsubEvents[event] = newEventArray;
       }
-      <span class="keyword">return</span> <span class="keyword">this</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
     },</pre></div></div>
             
         </li>
@@ -206,10 +209,10 @@ <h3>pubsub.unsub</h3>
         <li id="section-7">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-7">&#182;</a>
               </div>
-              <h3>pubsub.once</h3>
+              <h3 id="pubsub-once">pubsub.once</h3>
 <p>Subscribe to an event once. </p>
 <p>The function will be unsubscribed upon successful exectution.
 To mark the function execution as unsuccessful 
@@ -220,8 +223,8 @@ <h3>pubsub.once</h3>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    once: <span class="keyword">function</span>(eventStr, method, thisArg) {
-      <span class="keyword">return</span> <span class="keyword">this</span>.sub(eventStr, method, thisArg, { once: <span class="literal">true</span> });
+            <div class="content"><div class='highlight'><pre>    once: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method, thisArg</span>) </span>{
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.sub(eventStr, method, thisArg, { once: <span class="hljs-literal">true</span> });
     },</pre></div></div>
             
         </li>
@@ -230,10 +233,10 @@ <h3>pubsub.once</h3>
         <li id="section-8">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-8">&#182;</a>
               </div>
-              <h3>pubsub.recoup</h3>
+              <h3 id="pubsub-recoup">pubsub.recoup</h3>
 <p>Subscribe to an event, and execute immediately if that event was ever published before.</p>
 <p>If executed immediately, the subscriber will get as parameters the last values sent with the event.</p>
 <ul>
@@ -242,8 +245,8 @@ <h3>pubsub.recoup</h3>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    recoup: <span class="keyword">function</span>(eventStr, method, thisArg) {
-      <span class="keyword">return</span> <span class="keyword">this</span>.sub(eventStr, method, thisArg, { recoup: <span class="literal">true</span> });
+            <div class="content"><div class='highlight'><pre>    recoup: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method, thisArg</span>) </span>{
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.sub(eventStr, method, thisArg, { recoup: <span class="hljs-literal">true</span> });
     },</pre></div></div>
             
         </li>
@@ -252,15 +255,15 @@ <h3>pubsub.recoup</h3>
         <li id="section-9">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-9">&#182;</a>
               </div>
-              <h3>pubsub.eventSplitter</h3>
+              <h3 id="pubsub-eventsplitter">pubsub.eventSplitter</h3>
 <p>The character on which to split the event namespace.</p>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    eventSplitter: <span class="string">':'</span>,</pre></div></div>
+            <div class="content"><div class='highlight'><pre>    eventSplitter: <span class="hljs-string">':'</span>,</pre></div></div>
             
         </li>
         
@@ -268,26 +271,26 @@ <h3>pubsub.eventSplitter</h3>
         <li id="section-10">
             <div class="annotation">
               
-              <div class="pilwrap for-h3">
+              <div class="pilwrap ">
                 <a class="pilcrow" href="#section-10">&#182;</a>
               </div>
-              <h3>pubsub.eventNamespace</h3>
+              <h3 id="pubsub-eventnamespace">pubsub.eventNamespace</h3>
 <p>Parses the namespaced event string and returns an array of events to publish.
 The original implementation does: <code>&quot;path:to:event&quot; =&gt; [&quot;path&quot;, &quot;path:to&quot;, &quot;path:to:event&quot;]</code>.
 Overwrite the implementation to create your custom namespacing rules.</p>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>    eventNamespace: <span class="keyword">function</span>(eventString) {
-      <span class="keyword">var</span> events = [], str = <span class="string">''</span>, ch, i, splitter = <span class="keyword">this</span>.eventSplitter;
-      <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; eventString.length; i++) {
-        <span class="keyword">if</span> ((ch = eventString.charAt(i)) === splitter) {
+            <div class="content"><div class='highlight'><pre>    eventNamespace: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventString</span>) </span>{
+      <span class="hljs-keyword">var</span> events = [], str = <span class="hljs-string">''</span>, ch, i, splitter = <span class="hljs-keyword">this</span>.eventSplitter;
+      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; eventString.length; i++) {
+        <span class="hljs-keyword">if</span> ((ch = eventString.charAt(i)) === splitter) {
           events.push(str);
         }
         str += ch;
       }
       events.push(str);
-      <span class="keyword">return</span> events;
+      <span class="hljs-keyword">return</span> events;
     }
   };</pre></div></div>
             
@@ -300,16 +303,16 @@ <h3>pubsub.eventNamespace</h3>
               <div class="pilwrap ">
                 <a class="pilcrow" href="#section-11">&#182;</a>
               </div>
-              <p>Mix public methods into <code>pubsub</code>&#39;s prototype.</p>
+              <p>Mix public methods into <code>pubsub</code>‘s prototype.</p>
 
             </div>
             
-            <div class="content"><div class='highlight'><pre>  <span class="keyword">for</span> (<span class="keyword">var</span> i <span class="keyword">in</span> prototype) {
-    <span class="keyword">if</span> (prototype.hasOwnProperty(i)) {
+            <div class="content"><div class='highlight'><pre>  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-keyword">in</span> prototype) {
+    <span class="hljs-keyword">if</span> (prototype.hasOwnProperty(i)) {
       pubsub.prototype[i] = prototype[i];
     }
   }
-})(<span class="keyword">this</span>);</pre></div></div>
+})(<span class="hljs-keyword">this</span>);</pre></div></div>
             
         </li>
         
diff --git a/package.json b/package.json
index 822a64b..01a258e 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
 {
   "name": "pubsub",
-  "version": "0.1.0",
+  "version": "0.1.1",
   "devDependencies": {
-    "grunt": "~0.4.1",
-    "grunt-contrib-uglify": "~0.2.4",
-    "grunt-contrib-qunit": "~0.2.2",
-    "grunt-docco2": "~0.1.2",
+    "grunt": "^0.4.5",
     "grunt-contrib-clean": "~0.5.0",
-    "grunt-contrib-copy": "~0.4.1"
+    "grunt-contrib-copy": "~0.4.1",
+    "grunt-contrib-qunit": "^1.0.1",
+    "grunt-contrib-uglify": "~0.2.4",
+    "grunt-docco": "^0.4.0"
   }
 }
diff --git a/pubsub.js b/pubsub.js
index a5d5474..adbd966 100644
--- a/pubsub.js
+++ b/pubsub.js
@@ -35,7 +35,10 @@
       var eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
       for (i = 0, ilen = eventComponents.length; i < ilen; i++) {
         eventArray = this._pubsubEvents[event = eventComponents[i]] || [];
-        args = Array.prototype.slice.call(arguments, 1);
+        args = [];
+        for (j = 1; j < arguments.length; j++) {
+          args.push(arguments[j]);
+        }
         for (j = 0, jlen = eventArray.length; j < jlen; j++) {
           subscriber = eventArray[j];
           ret = subscriber[0].apply(subscriber[1] || this, args);
diff --git a/pubsub.min.js b/pubsub.min.js
index 624869b..7263137 100644
--- a/pubsub.min.js
+++ b/pubsub.min.js
@@ -1 +1 @@
-!function(){var a=this,b=a.pubsub=function(a){this.options=a,this._pubsubEvents={},this._pubsubHappened={}};b.version="0.1.0";var c={pub:function(a){var b,c,d,e,f,g,h,i,j,k=this.eventNamespace(a);for(c=0,d=k.length;d>c;c++){for(b=this._pubsubEvents[j=k[c]]||[],g=Array.prototype.slice.call(arguments,1),e=0,f=b.length;f>e;e++)h=b[e],i=h[0].apply(h[1]||this,g),h[2]&&i!==!1&&this.unsub(j,h[0]);this._pubsubHappened[j]=g}return this},sub:function(a,b,c,d){var e,f,g,h,i,j=a.split(/\s+/);for(d=d||{once:!1,recoup:!1},g=0,h=j.length;h>g;g++)f=this._pubsubEvents[e=j[g]],f?f.push([b,c,d.once]):this._pubsubEvents[e]=[[b,c,d.once]],d.recoup&&(i=this._pubsubHappened[e],i&&b.apply(c||this,i));return this},unsub:function(a,b){var c,d,e,f,g,h=a.split(/\s+/);for(f=0;f<h.length;f++){for(d=this._pubsubEvents[c=h[f]]||[],e=[],g=0;b&&g<d.length;g++)d[g][0]!==b&&e.push(d[g]);this._pubsubEvents[c]=e}return this},once:function(a,b,c){return this.sub(a,b,c,{once:!0})},recoup:function(a,b,c){return this.sub(a,b,c,{recoup:!0})},eventSplitter:":",eventNamespace:function(a){var b,c,d=[],e="",f=this.eventSplitter;for(c=0;c<a.length;c++)(b=a.charAt(c))===f&&d.push(e),e+=b;return d.push(e),d}};for(var d in c)c.hasOwnProperty(d)&&(b.prototype[d]=c[d])}(this);
\ No newline at end of file
+!function(){var a=this,b=a.pubsub=function(a){this.options=a,this._pubsubEvents={},this._pubsubHappened={}};b.version="0.1.0";var c={pub:function(a){var b,c,d,e,f,g,h,i,j,k=this.eventNamespace(a);for(c=0,d=k.length;d>c;c++){for(b=this._pubsubEvents[j=k[c]]||[],g=[],e=1;e<arguments.length;e++)g.push(arguments[e]);for(e=0,f=b.length;f>e;e++)h=b[e],i=h[0].apply(h[1]||this,g),h[2]&&i!==!1&&this.unsub(j,h[0]);this._pubsubHappened[j]=g}return this},sub:function(a,b,c,d){var e,f,g,h,i,j=a.split(/\s+/);for(d=d||{once:!1,recoup:!1},g=0,h=j.length;h>g;g++)f=this._pubsubEvents[e=j[g]],f?f.push([b,c,d.once]):this._pubsubEvents[e]=[[b,c,d.once]],d.recoup&&(i=this._pubsubHappened[e],i&&b.apply(c||this,i));return this},unsub:function(a,b){var c,d,e,f,g,h=a.split(/\s+/);for(f=0;f<h.length;f++){for(d=this._pubsubEvents[c=h[f]]||[],e=[],g=0;b&&g<d.length;g++)d[g][0]!==b&&e.push(d[g]);this._pubsubEvents[c]=e}return this},once:function(a,b,c){return this.sub(a,b,c,{once:!0})},recoup:function(a,b,c){return this.sub(a,b,c,{recoup:!0})},eventSplitter:":",eventNamespace:function(a){var b,c,d=[],e="",f=this.eventSplitter;for(c=0;c<a.length;c++)(b=a.charAt(c))===f&&d.push(e),e+=b;return d.push(e),d}};for(var d in c)c.hasOwnProperty(d)&&(b.prototype[d]=c[d])}(this);
\ No newline at end of file

From 3e9417d7997934e75cc8a56375d5fee593dd88c3 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Thu, 19 Jul 2018 16:08:30 +0300
Subject: [PATCH 03/22] Clean up for new era

---
 .gitignore                            |   3 +-
 Gruntfile.js                          |  57 ---
 docs/docco.css                        | 518 -------------------
 docs/fonts/aller-bold.eot             | Bin 29804 -> 0 bytes
 docs/fonts/aller-bold.ttf             | Bin 66836 -> 0 bytes
 docs/fonts/aller-bold.woff            | Bin 33244 -> 0 bytes
 docs/fonts/aller-light.eot            | Bin 29509 -> 0 bytes
 docs/fonts/aller-light.ttf            | Bin 68620 -> 0 bytes
 docs/fonts/aller-light.woff           | Bin 33124 -> 0 bytes
 docs/fonts/novecento-bold.eot         | Bin 18190 -> 0 bytes
 docs/fonts/novecento-bold.ttf         | Bin 48136 -> 0 bytes
 docs/fonts/novecento-bold.woff        | Bin 20576 -> 0 bytes
 docs/public/fonts/aller-bold.eot      | Bin 29804 -> 0 bytes
 docs/public/fonts/aller-bold.ttf      | Bin 66836 -> 0 bytes
 docs/public/fonts/aller-bold.woff     | Bin 33244 -> 0 bytes
 docs/public/fonts/aller-light.eot     | Bin 29509 -> 0 bytes
 docs/public/fonts/aller-light.ttf     | Bin 68620 -> 0 bytes
 docs/public/fonts/aller-light.woff    | Bin 33124 -> 0 bytes
 docs/public/fonts/novecento-bold.eot  | Bin 18190 -> 0 bytes
 docs/public/fonts/novecento-bold.ttf  | Bin 48136 -> 0 bytes
 docs/public/fonts/novecento-bold.woff | Bin 20576 -> 0 bytes
 docs/public/fonts/roboto-black.eot    | Bin 20702 -> 0 bytes
 docs/public/fonts/roboto-black.ttf    | Bin 44828 -> 0 bytes
 docs/public/fonts/roboto-black.woff   | Bin 24536 -> 0 bytes
 docs/public/stylesheets/normalize.css | 375 --------------
 docs/pubsub.html                      | 322 ------------
 docs/stylesheets/normalize.css        | 375 --------------
 index.html                            |  48 --
 package.json                          |  41 +-
 pubsub.js                             | 158 ------
 pubsub.min.js                         |   1 -
 rollup.config.js                      |  22 +
 src/pubsub.js                         | 142 ++++++
 test/tests.js                         | 158 ++++++
 tests/tests.html                      |  17 -
 tests/tests.js                        | 142 ------
 yarn.lock                             | 694 ++++++++++++++++++++++++++
 37 files changed, 1049 insertions(+), 2024 deletions(-)
 delete mode 100644 Gruntfile.js
 delete mode 100644 docs/docco.css
 delete mode 100644 docs/fonts/aller-bold.eot
 delete mode 100644 docs/fonts/aller-bold.ttf
 delete mode 100644 docs/fonts/aller-bold.woff
 delete mode 100644 docs/fonts/aller-light.eot
 delete mode 100644 docs/fonts/aller-light.ttf
 delete mode 100644 docs/fonts/aller-light.woff
 delete mode 100644 docs/fonts/novecento-bold.eot
 delete mode 100644 docs/fonts/novecento-bold.ttf
 delete mode 100644 docs/fonts/novecento-bold.woff
 delete mode 100644 docs/public/fonts/aller-bold.eot
 delete mode 100644 docs/public/fonts/aller-bold.ttf
 delete mode 100644 docs/public/fonts/aller-bold.woff
 delete mode 100644 docs/public/fonts/aller-light.eot
 delete mode 100644 docs/public/fonts/aller-light.ttf
 delete mode 100644 docs/public/fonts/aller-light.woff
 delete mode 100644 docs/public/fonts/novecento-bold.eot
 delete mode 100644 docs/public/fonts/novecento-bold.ttf
 delete mode 100644 docs/public/fonts/novecento-bold.woff
 delete mode 100755 docs/public/fonts/roboto-black.eot
 delete mode 100755 docs/public/fonts/roboto-black.ttf
 delete mode 100755 docs/public/fonts/roboto-black.woff
 delete mode 100644 docs/public/stylesheets/normalize.css
 delete mode 100644 docs/pubsub.html
 delete mode 100644 docs/stylesheets/normalize.css
 delete mode 100644 index.html
 delete mode 100644 pubsub.js
 delete mode 100644 pubsub.min.js
 create mode 100644 rollup.config.js
 create mode 100644 src/pubsub.js
 create mode 100644 test/tests.js
 delete mode 100644 tests/tests.html
 delete mode 100644 tests/tests.js
 create mode 100644 yarn.lock

diff --git a/.gitignore b/.gitignore
index bb93d68..6acc570 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 node_modules
-bower_components
\ No newline at end of file
+dist
+.DS_Store
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
deleted file mode 100644
index 2ac7718..0000000
--- a/Gruntfile.js
+++ /dev/null
@@ -1,57 +0,0 @@
-module.exports = function(grunt) {
-
-	grunt.initConfig({
-		qunit: {
-			all: {
-				options: {
-					urls: ['tests/tests.html']
-				}
-			}
-		},
-
-		uglify: {
-			all: {
-				files: {
-					'pubsub.min.js': 'pubsub.js'
-				}
-			}
-		},
-
-		docco: {
-			all: {
-				src: ['./pubsub.js'],
-				options: {
-					output: './docs'
-				}
-			}
-		},
-
-		// Copy & clean to counteract grunt-docco2 absurdities
-
-		copy: {
-			all: {
-				files: [{
-					expand: true,
-					cwd: 'undefined/',
-					dest: './docs',
-					src: ['**/*.*']
-				}]
-			}
-		},
-
-		clean: {
-			all: {
-				src: ['undefined']
-			}
-		}
-	});
-
-	grunt.loadNpmTasks('grunt-contrib-uglify');
-	grunt.loadNpmTasks('grunt-contrib-qunit');
-	grunt.loadNpmTasks('grunt-docco');
-	grunt.loadNpmTasks('grunt-contrib-copy');
-	grunt.loadNpmTasks('grunt-contrib-clean');
-
-	grunt.registerTask('default', 'test and build pubsub', ['qunit', 'uglify', 'docco', 'copy', 'clean']);
-
-};
\ No newline at end of file
diff --git a/docs/docco.css b/docs/docco.css
deleted file mode 100644
index b60f6fa..0000000
--- a/docs/docco.css
+++ /dev/null
@@ -1,518 +0,0 @@
-/*--------------------- Typography ----------------------------*/
-
-@font-face {
-    font-family: 'aller-light';
-    src: url('public/fonts/aller-light.eot');
-    src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'),
-         url('public/fonts/aller-light.woff') format('woff'),
-         url('public/fonts/aller-light.ttf') format('truetype');
-    font-weight: normal;
-    font-style: normal;
-}
-
-@font-face {
-    font-family: 'aller-bold';
-    src: url('public/fonts/aller-bold.eot');
-    src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'),
-         url('public/fonts/aller-bold.woff') format('woff'),
-         url('public/fonts/aller-bold.ttf') format('truetype');
-    font-weight: normal;
-    font-style: normal;
-}
-
-@font-face {
-    font-family: 'roboto-black';
-    src: url('public/fonts/roboto-black.eot');
-    src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'),
-         url('public/fonts/roboto-black.woff') format('woff'),
-         url('public/fonts/roboto-black.ttf') format('truetype');
-    font-weight: normal;
-    font-style: normal;
-}
-
-/*--------------------- Layout ----------------------------*/
-html { height: 100%; }
-body {
-  font-family: "aller-light";
-  font-size: 14px;
-  line-height: 18px;
-  color: #30404f;
-  margin: 0; padding: 0;
-  height:100%;
-}
-#container { min-height: 100%; }
-
-a {
-  color: #000;
-}
-
-b, strong {
-  font-weight: normal;
-  font-family: "aller-bold";
-}
-
-p {
-  margin: 15px 0 0px;
-}
-  .annotation ul, .annotation ol {
-    margin: 25px 0;
-  }
-    .annotation ul li, .annotation ol li {
-      font-size: 14px;
-      line-height: 18px;
-      margin: 10px 0;
-    }
-
-h1, h2, h3, h4, h5, h6 {
-  color: #112233;
-  line-height: 1em;
-  font-weight: normal;
-  font-family: "roboto-black";
-  text-transform: uppercase;
-  margin: 30px 0 15px 0;
-}
-
-h1 {
-  margin-top: 40px;
-}
-h2 {
-  font-size: 1.26em;
-}
-
-hr {
-  border: 0;
-  background: 1px #ddd;
-  height: 1px;
-  margin: 20px 0;
-}
-
-pre, tt, code {
-  font-size: 12px; line-height: 16px;
-  font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace;
-  margin: 0; padding: 0;
-}
-  .annotation pre {
-    display: block;
-    margin: 0;
-    padding: 7px 10px;
-    background: #fcfcfc;
-    -moz-box-shadow:    inset 0 0 10px rgba(0,0,0,0.1);
-    -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1);
-    box-shadow:         inset 0 0 10px rgba(0,0,0,0.1);
-    overflow-x: auto;
-  }
-    .annotation pre code {
-      border: 0;
-      padding: 0;
-      background: transparent;
-    }
-
-
-blockquote {
-  border-left: 5px solid #ccc;
-  margin: 0;
-  padding: 1px 0 1px 1em;
-}
-  .sections blockquote p {
-    font-family: Menlo, Consolas, Monaco, monospace;
-    font-size: 12px; line-height: 16px;
-    color: #999;
-    margin: 10px 0 0;
-    white-space: pre-wrap;
-  }
-
-ul.sections {
-  list-style: none;
-  padding:0 0 5px 0;;
-  margin:0;
-}
-
-/*
-  Force border-box so that % widths fit the parent
-  container without overlap because of margin/padding.
-
-  More Info : http://www.quirksmode.org/css/box.html
-*/
-ul.sections > li > div {
-  -moz-box-sizing: border-box;    /* firefox */
-  -ms-box-sizing: border-box;     /* ie */
-  -webkit-box-sizing: border-box; /* webkit */
-  -khtml-box-sizing: border-box;  /* konqueror */
-  box-sizing: border-box;         /* css3 */
-}
-
-
-/*---------------------- Jump Page -----------------------------*/
-#jump_to, #jump_page {
-  margin: 0;
-  background: white;
-  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;
-  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;
-  font: 16px Arial;
-  cursor: pointer;
-  text-align: right;
-  list-style: none;
-}
-
-#jump_to a {
-  text-decoration: none;
-}
-
-#jump_to a.large {
-  display: none;
-}
-#jump_to a.small {
-  font-size: 22px;
-  font-weight: bold;
-  color: #676767;
-}
-
-#jump_to, #jump_wrapper {
-  position: fixed;
-  right: 0; top: 0;
-  padding: 10px 15px;
-  margin:0;
-}
-
-#jump_wrapper {
-  display: none;
-  padding:0;
-}
-
-#jump_to:hover #jump_wrapper {
-  display: block;
-}
-
-#jump_page_wrapper{
-  position: fixed;
-  right: 0;
-  top: 0;
-  bottom: 0;
-}
-
-#jump_page {
-  padding: 5px 0 3px;
-  margin: 0 0 25px 25px;
-  max-height: 100%;
-  overflow: auto;
-}
-
-#jump_page .source {
-  display: block;
-  padding: 15px;
-  text-decoration: none;
-  border-top: 1px solid #eee;
-}
-
-#jump_page .source:hover {
-  background: #f5f5ff;
-}
-
-#jump_page .source:first-child {
-}
-
-/*---------------------- Low resolutions (> 320px) ---------------------*/
-@media only screen and (min-width: 320px) {
-  .pilwrap { display: none; }
-
-  ul.sections > li > div {
-    display: block;
-    padding:5px 10px 0 10px;
-  }
-
-  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {
-    padding-left: 30px;
-  }
-
-  ul.sections > li > div.content {
-    overflow-x:auto;
-    -webkit-box-shadow: inset 0 0 5px #e5e5ee;
-    box-shadow: inset 0 0 5px #e5e5ee;
-    border: 1px solid #dedede;
-    margin:5px 10px 5px 10px;
-    padding-bottom: 5px;
-  }
-
-  ul.sections > li > div.annotation pre {
-    margin: 7px 0 7px;
-    padding-left: 15px;
-  }
-
-  ul.sections > li > div.annotation p tt, .annotation code {
-    background: #f8f8ff;
-    border: 1px solid #dedede;
-    font-size: 12px;
-    padding: 0 0.2em;
-  }
-}
-
-/*----------------------  (> 481px) ---------------------*/
-@media only screen and (min-width: 481px) {
-  #container {
-    position: relative;
-  }
-  body {
-    background-color: #F5F5FF;
-    font-size: 15px;
-    line-height: 21px;
-  }
-  pre, tt, code {
-    line-height: 18px;
-  }
-  p, ul, ol {
-    margin: 0 0 15px;
-  }
-
-
-  #jump_to {
-    padding: 5px 10px;
-  }
-  #jump_wrapper {
-    padding: 0;
-  }
-  #jump_to, #jump_page {
-    font: 10px Arial;
-    text-transform: uppercase;
-  }
-  #jump_page .source {
-    padding: 5px 10px;
-  }
-  #jump_to a.large {
-    display: inline-block;
-  }
-  #jump_to a.small {
-    display: none;
-  }
-
-
-
-  #background {
-    position: absolute;
-    top: 0; bottom: 0;
-    width: 350px;
-    background: #fff;
-    border-right: 1px solid #e5e5ee;
-    z-index: -1;
-  }
-
-  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {
-    padding-left: 40px;
-  }
-
-  ul.sections > li {
-    white-space: nowrap;
-  }
-
-  ul.sections > li > div {
-    display: inline-block;
-  }
-
-  ul.sections > li > div.annotation {
-    max-width: 350px;
-    min-width: 350px;
-    min-height: 5px;
-    padding: 13px;
-    overflow-x: hidden;
-    white-space: normal;
-    vertical-align: top;
-    text-align: left;
-  }
-  ul.sections > li > div.annotation pre {
-    margin: 15px 0 15px;
-    padding-left: 15px;
-  }
-
-  ul.sections > li > div.content {
-    padding: 13px;
-    vertical-align: top;
-    border: none;
-    -webkit-box-shadow: none;
-    box-shadow: none;
-  }
-
-  .pilwrap {
-    position: relative;
-    display: inline;
-  }
-
-  .pilcrow {
-    font: 12px Arial;
-    text-decoration: none;
-    color: #454545;
-    position: absolute;
-    top: 3px; left: -20px;
-    padding: 1px 2px;
-    opacity: 0;
-    -webkit-transition: opacity 0.2s linear;
-  }
-    .for-h1 .pilcrow {
-      top: 47px;
-    }
-    .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow {
-      top: 35px;
-    }
-
-  ul.sections > li > div.annotation:hover .pilcrow {
-    opacity: 1;
-  }
-}
-
-/*---------------------- (> 1025px) ---------------------*/
-@media only screen and (min-width: 1025px) {
-
-  body {
-    font-size: 16px;
-    line-height: 24px;
-  }
-
-  #background {
-    width: 525px;
-  }
-  ul.sections > li > div.annotation {
-    max-width: 525px;
-    min-width: 525px;
-    padding: 10px 25px 1px 50px;
-  }
-  ul.sections > li > div.content {
-    padding: 9px 15px 16px 25px;
-  }
-}
-
-/*---------------------- Syntax Highlighting -----------------------------*/
-
-td.linenos { background-color: #f0f0f0; padding-right: 10px; }
-span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
-/*
-
-github.com style (c) Vasily Polovnyov <vast@whiteants.net>
-
-*/
-
-pre code {
-  display: block; padding: 0.5em;
-  color: #000;
-  background: #f8f8ff
-}
-
-pre .hljs-comment,
-pre .hljs-template_comment,
-pre .hljs-diff .hljs-header,
-pre .hljs-javadoc {
-  color: #408080;
-  font-style: italic
-}
-
-pre .hljs-keyword,
-pre .hljs-assignment,
-pre .hljs-literal,
-pre .hljs-css .hljs-rule .hljs-keyword,
-pre .hljs-winutils,
-pre .hljs-javascript .hljs-title,
-pre .hljs-lisp .hljs-title,
-pre .hljs-subst {
-  color: #954121;
-  /*font-weight: bold*/
-}
-
-pre .hljs-number,
-pre .hljs-hexcolor {
-  color: #40a070
-}
-
-pre .hljs-string,
-pre .hljs-tag .hljs-value,
-pre .hljs-phpdoc,
-pre .hljs-tex .hljs-formula {
-  color: #219161;
-}
-
-pre .hljs-title,
-pre .hljs-id {
-  color: #19469D;
-}
-pre .hljs-params {
-  color: #00F;
-}
-
-pre .hljs-javascript .hljs-title,
-pre .hljs-lisp .hljs-title,
-pre .hljs-subst {
-  font-weight: normal
-}
-
-pre .hljs-class .hljs-title,
-pre .hljs-haskell .hljs-label,
-pre .hljs-tex .hljs-command {
-  color: #458;
-  font-weight: bold
-}
-
-pre .hljs-tag,
-pre .hljs-tag .hljs-title,
-pre .hljs-rules .hljs-property,
-pre .hljs-django .hljs-tag .hljs-keyword {
-  color: #000080;
-  font-weight: normal
-}
-
-pre .hljs-attribute,
-pre .hljs-variable,
-pre .hljs-instancevar,
-pre .hljs-lisp .hljs-body {
-  color: #008080
-}
-
-pre .hljs-regexp {
-  color: #B68
-}
-
-pre .hljs-class {
-  color: #458;
-  font-weight: bold
-}
-
-pre .hljs-symbol,
-pre .hljs-ruby .hljs-symbol .hljs-string,
-pre .hljs-ruby .hljs-symbol .hljs-keyword,
-pre .hljs-ruby .hljs-symbol .hljs-keymethods,
-pre .hljs-lisp .hljs-keyword,
-pre .hljs-tex .hljs-special,
-pre .hljs-input_number {
-  color: #990073
-}
-
-pre .hljs-builtin,
-pre .hljs-constructor,
-pre .hljs-built_in,
-pre .hljs-lisp .hljs-title {
-  color: #0086b3
-}
-
-pre .hljs-preprocessor,
-pre .hljs-pi,
-pre .hljs-doctype,
-pre .hljs-shebang,
-pre .hljs-cdata {
-  color: #999;
-  font-weight: bold
-}
-
-pre .hljs-deletion {
-  background: #fdd
-}
-
-pre .hljs-addition {
-  background: #dfd
-}
-
-pre .hljs-diff .hljs-change {
-  background: #0086b3
-}
-
-pre .hljs-chunk {
-  color: #aaa
-}
-
-pre .hljs-tex .hljs-formula {
-  opacity: 0.5;
-}
diff --git a/docs/fonts/aller-bold.eot b/docs/fonts/aller-bold.eot
deleted file mode 100644
index 1b32532a8e40e483069482c3650c3ef22ef16bdd..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/aller-bold.ttf b/docs/fonts/aller-bold.ttf
deleted file mode 100644
index dc4cc9c27a59ab14fbb7444c6ab35c5b33a034f6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/aller-bold.woff b/docs/fonts/aller-bold.woff
deleted file mode 100644
index fa16fd0aba81582de121d833c7bc50e8f1b1b981..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/aller-light.eot b/docs/fonts/aller-light.eot
deleted file mode 100644
index 40bd654b5fe63501ae64d5673b5aa45051a69e65..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/aller-light.ttf b/docs/fonts/aller-light.ttf
deleted file mode 100644
index c2c72902a1b6ecb6e22376256a3ece17dd100a30..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/aller-light.woff b/docs/fonts/aller-light.woff
deleted file mode 100644
index 81a09d18ecdfdc5be11d55912268014b4d2d4d9f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/novecento-bold.eot b/docs/fonts/novecento-bold.eot
deleted file mode 100644
index 98a9a7fbabb1083aca5143bc306e228886ff2eeb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/novecento-bold.ttf b/docs/fonts/novecento-bold.ttf
deleted file mode 100644
index 2af39b08b07df11423ac44c1fb2ff0ca82e81346..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/fonts/novecento-bold.woff b/docs/fonts/novecento-bold.woff
deleted file mode 100644
index de558b5a29bcb4445be8ffd739c929bf4d3730af..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/aller-bold.eot b/docs/public/fonts/aller-bold.eot
deleted file mode 100644
index 1b32532a8e40e483069482c3650c3ef22ef16bdd..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/aller-bold.ttf b/docs/public/fonts/aller-bold.ttf
deleted file mode 100644
index dc4cc9c27a59ab14fbb7444c6ab35c5b33a034f6..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/aller-bold.woff b/docs/public/fonts/aller-bold.woff
deleted file mode 100644
index fa16fd0aba81582de121d833c7bc50e8f1b1b981..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/aller-light.eot b/docs/public/fonts/aller-light.eot
deleted file mode 100644
index 40bd654b5fe63501ae64d5673b5aa45051a69e65..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/aller-light.ttf b/docs/public/fonts/aller-light.ttf
deleted file mode 100644
index c2c72902a1b6ecb6e22376256a3ece17dd100a30..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/aller-light.woff b/docs/public/fonts/aller-light.woff
deleted file mode 100644
index 81a09d18ecdfdc5be11d55912268014b4d2d4d9f..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/novecento-bold.eot b/docs/public/fonts/novecento-bold.eot
deleted file mode 100644
index 98a9a7fbabb1083aca5143bc306e228886ff2eeb..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/novecento-bold.ttf b/docs/public/fonts/novecento-bold.ttf
deleted file mode 100644
index 2af39b08b07df11423ac44c1fb2ff0ca82e81346..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/novecento-bold.woff b/docs/public/fonts/novecento-bold.woff
deleted file mode 100644
index de558b5a29bcb4445be8ffd739c929bf4d3730af..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/roboto-black.eot b/docs/public/fonts/roboto-black.eot
deleted file mode 100755
index 571ed49125910cd6b6b5a9259134dd2e8d37766e..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/roboto-black.ttf b/docs/public/fonts/roboto-black.ttf
deleted file mode 100755
index e0300b3ee3e85d54d01d8fb9c3821a44c448a920..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/fonts/roboto-black.woff b/docs/public/fonts/roboto-black.woff
deleted file mode 100755
index 642e5b60f7c662ab5bcf67cfc1089f50bfdd7b00..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/docs/public/stylesheets/normalize.css b/docs/public/stylesheets/normalize.css
deleted file mode 100644
index 73abb76..0000000
--- a/docs/public/stylesheets/normalize.css
+++ /dev/null
@@ -1,375 +0,0 @@
-/*! normalize.css v2.0.1 | MIT License | git.io/normalize */
-
-/* ==========================================================================
-   HTML5 display definitions
-   ========================================================================== */
-
-/*
- * Corrects `block` display not defined in IE 8/9.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section,
-summary {
-    display: block;
-}
-
-/*
- * Corrects `inline-block` display not defined in IE 8/9.
- */
-
-audio,
-canvas,
-video {
-    display: inline-block;
-}
-
-/*
- * Prevents modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-
-audio:not([controls]) {
-    display: none;
-    height: 0;
-}
-
-/*
- * Addresses styling for `hidden` attribute not present in IE 8/9.
- */
-
-[hidden] {
-    display: none;
-}
-
-/* ==========================================================================
-   Base
-   ========================================================================== */
-
-/*
- * 1. Sets default font family to sans-serif.
- * 2. Prevents iOS text size adjust after orientation change, without disabling
- *    user zoom.
- */
-
-html {
-    font-family: sans-serif; /* 1 */
-    -webkit-text-size-adjust: 100%; /* 2 */
-    -ms-text-size-adjust: 100%; /* 2 */
-}
-
-/*
- * Removes default margin.
- */
-
-body {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Links
-   ========================================================================== */
-
-/*
- * Addresses `outline` inconsistency between Chrome and other browsers.
- */
-
-a:focus {
-    outline: thin dotted;
-}
-
-/*
- * Improves readability when focused and also mouse hovered in all browsers.
- */
-
-a:active,
-a:hover {
-    outline: 0;
-}
-
-/* ==========================================================================
-   Typography
-   ========================================================================== */
-
-/*
- * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,
- * Safari 5, and Chrome.
- */
-
-h1 {
-    font-size: 2em;
-}
-
-/*
- * Addresses styling not present in IE 8/9, Safari 5, and Chrome.
- */
-
-abbr[title] {
-    border-bottom: 1px dotted;
-}
-
-/*
- * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
- */
-
-b,
-strong {
-    font-weight: bold;
-}
-
-/*
- * Addresses styling not present in Safari 5 and Chrome.
- */
-
-dfn {
-    font-style: italic;
-}
-
-/*
- * Addresses styling not present in IE 8/9.
- */
-
-mark {
-    background: #ff0;
-    color: #000;
-}
-
-
-/*
- * Corrects font family set oddly in Safari 5 and Chrome.
- */
-
-code,
-kbd,
-pre,
-samp {
-    font-family: monospace, serif;
-    font-size: 1em;
-}
-
-/*
- * Improves readability of pre-formatted text in all browsers.
- */
-
-pre {
-    white-space: pre;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-}
-
-/*
- * Sets consistent quote types.
- */
-
-q {
-    quotes: "\201C" "\201D" "\2018" "\2019";
-}
-
-/*
- * Addresses inconsistent and variable font size in all browsers.
- */
-
-small {
-    font-size: 80%;
-}
-
-/*
- * Prevents `sub` and `sup` affecting `line-height` in all browsers.
- */
-
-sub,
-sup {
-    font-size: 75%;
-    line-height: 0;
-    position: relative;
-    vertical-align: baseline;
-}
-
-sup {
-    top: -0.5em;
-}
-
-sub {
-    bottom: -0.25em;
-}
-
-/* ==========================================================================
-   Embedded content
-   ========================================================================== */
-
-/*
- * Removes border when inside `a` element in IE 8/9.
- */
-
-img {
-    border: 0;
-}
-
-/*
- * Corrects overflow displayed oddly in IE 9.
- */
-
-svg:not(:root) {
-    overflow: hidden;
-}
-
-/* ==========================================================================
-   Figures
-   ========================================================================== */
-
-/*
- * Addresses margin not present in IE 8/9 and Safari 5.
- */
-
-figure {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Forms
-   ========================================================================== */
-
-/*
- * Define consistent border, margin, and padding.
- */
-
-fieldset {
-    border: 1px solid #c0c0c0;
-    margin: 0 2px;
-    padding: 0.35em 0.625em 0.75em;
-}
-
-/*
- * 1. Corrects color not being inherited in IE 8/9.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-
-legend {
-    border: 0; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/*
- * 1. Corrects font family not being inherited in all browsers.
- * 2. Corrects font size not being inherited in all browsers.
- * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome
- */
-
-button,
-input,
-select,
-textarea {
-    font-family: inherit; /* 1 */
-    font-size: 100%; /* 2 */
-    margin: 0; /* 3 */
-}
-
-/*
- * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-
-button,
-input {
-    line-height: normal;
-}
-
-/*
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- *    and `video` controls.
- * 2. Corrects inability to style clickable `input` types in iOS.
- * 3. Improves usability and consistency of cursor style between image-type
- *    `input` and others.
- */
-
-button,
-html input[type="button"], /* 1 */
-input[type="reset"],
-input[type="submit"] {
-    -webkit-appearance: button; /* 2 */
-    cursor: pointer; /* 3 */
-}
-
-/*
- * Re-set default cursor for disabled elements.
- */
-
-button[disabled],
-input[disabled] {
-    cursor: default;
-}
-
-/*
- * 1. Addresses box sizing set to `content-box` in IE 8/9.
- * 2. Removes excess padding in IE 8/9.
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-    box-sizing: border-box; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/*
- * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.
- * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome
- *    (include `-moz` to future-proof).
- */
-
-input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
-    -moz-box-sizing: content-box;
-    -webkit-box-sizing: content-box; /* 2 */
-    box-sizing: content-box;
-}
-
-/*
- * Removes inner padding and search cancel button in Safari 5 and Chrome
- * on OS X.
- */
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none;
-}
-
-/*
- * Removes inner padding and border in Firefox 4+.
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    border: 0;
-    padding: 0;
-}
-
-/*
- * 1. Removes default vertical scrollbar in IE 8/9.
- * 2. Improves readability and alignment in all browsers.
- */
-
-textarea {
-    overflow: auto; /* 1 */
-    vertical-align: top; /* 2 */
-}
-
-/* ==========================================================================
-   Tables
-   ========================================================================== */
-
-/*
- * Remove most spacing between table cells.
- */
-
-table {
-    border-collapse: collapse;
-    border-spacing: 0;
-}
\ No newline at end of file
diff --git a/docs/pubsub.html b/docs/pubsub.html
deleted file mode 100644
index 349ec0b..0000000
--- a/docs/pubsub.html
+++ /dev/null
@@ -1,322 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<head>
-  <title>pubsub.js</title>
-  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-  <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
-  <link rel="stylesheet" media="all" href="docco.css" />
-</head>
-<body>
-  <div id="container">
-    <div id="background"></div>
-    
-    <ul class="sections">
-        
-          <li id="title">
-              <div class="annotation">
-                  <h1>pubsub.js</h1>
-              </div>
-          </li>
-        
-        
-        
-        <li id="section-1">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-1">&#182;</a>
-              </div>
-              <p>   pubsub (c) 2013 Dan Burzo
-   pubsub can be freely distributed under the MIT license.
-Made by <a href="https://twitter.com/danburzo">@danburzo</a>.</p>
-<p>Fork &amp; contribute at <a href="https://github.com/danburzo/pubsub">github.com/danburzo/pubsub</a>. </p>
-<p>Download <a href="https://github.com/danburzo/pubsub/zipball/master">zip</a>, <a href="https://github.com/danburzo/pubsub/tarball/master">tar</a>. </p>
-<p>The guiding principles were: speed, terseness and progressive disclosure.</p>
-<h2 id="annotated-api">Annotated API</h2>
-
-            </div>
-            
-        </li>
-        
-        
-        <li id="section-2">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-2">&#182;</a>
-              </div>
-              <p>Encapsulate the library to protect global scope.</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
-  <span class="hljs-keyword">var</span> root = <span class="hljs-keyword">this</span>;
-
-  <span class="hljs-keyword">var</span> pubsub = root.pubsub = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">options</span>) </span>{
-    <span class="hljs-keyword">this</span>.options = options;
-    <span class="hljs-keyword">this</span>._pubsubEvents = {};
-    <span class="hljs-keyword">this</span>._pubsubHappened = {};
-  };</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-3">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-3">&#182;</a>
-              </div>
-              <p>Current version of the <code>pubsub</code>, using <a href="http://semver.org/">semantic versioning</a>.</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>  pubsub.version = <span class="hljs-string">'0.1.0'</span>;
-
-  <span class="hljs-keyword">var</span> prototype = {</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-4">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-4">&#182;</a>
-              </div>
-              <h3 id="pubsub-pub">pubsub.pub</h3>
-<p>Publish an event.</p>
-<ul>
-<li><strong>pub(event, [arg1, [arg2 …]])</strong><ul>
-<li><em>event</em> the event to trigger;</li>
-<li><em>arg1 … argN</em> (optional) any number of additional params to pass to the event subscribers.</li>
-</ul>
-</li>
-</ul>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    pub: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventString</span>) </span>{
-      <span class="hljs-keyword">var</span> eventComponents = <span class="hljs-keyword">this</span>.eventNamespace(eventString);
-      <span class="hljs-keyword">var</span> eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
-      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, ilen = eventComponents.length; i &lt; ilen; i++) {
-        eventArray = <span class="hljs-keyword">this</span>._pubsubEvents[event = eventComponents[i]] || [];
-        args = [];
-        <span class="hljs-keyword">for</span> (j = <span class="hljs-number">1</span>; j &lt; <span class="hljs-built_in">arguments</span>.length; j++) {
-          args.push(<span class="hljs-built_in">arguments</span>[j]);
-        }
-        <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>, jlen = eventArray.length; j &lt; jlen; j++) {
-          subscriber = eventArray[j];
-          ret = subscriber[<span class="hljs-number">0</span>].apply(subscriber[<span class="hljs-number">1</span>] || <span class="hljs-keyword">this</span>, args);
-          <span class="hljs-keyword">if</span> (subscriber[<span class="hljs-number">2</span>] &amp;&amp; ret !== <span class="hljs-literal">false</span>) {
-            <span class="hljs-keyword">this</span>.unsub(event, subscriber[<span class="hljs-number">0</span>]);
-          }
-        }
-        <span class="hljs-keyword">this</span>._pubsubHappened[event] = args;
-      }
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
-    },</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-5">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-5">&#182;</a>
-              </div>
-              <h3 id="pubsub-sub">pubsub.sub</h3>
-<p>Subscribe a function to one or more events.</p>
-<ul>
-<li><strong>sub(eventString, method, [thisArg, [flags]])</strong><ul>
-<li><em>eventString</em> one or more space-separated events;</li>
-<li><em>method</em> the function to subscribe to the events;</li>
-<li><em>thisArg</em> (optional) context for the method;</li>
-<li><em>flags</em> (optional) boleans to configure the subscribers’s behavior:<ul>
-<li><em>once</em> if true, the subscriber will self-unsubscribe after the first successful execution. Use <em>pubsub.once()</em> for clarity;</li>
-<li><em>recoup</em> if true, the subscriber will execute immediately if the event it subscribes to already happened. Use <em>pubsub.recoup()</em> for clarity.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<p><em>Note:</em> When subscribing to multiple events, make sure these events are published with the same (or similar) list of arguments.</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    sub: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method, thisArg, flags</span>) </span>{
-      <span class="hljs-keyword">var</span> events = eventStr.split(<span class="hljs-regexp">/\s+/</span>), event, eventArray, i, len, oldArgs;
-      flags = flags || { once: <span class="hljs-literal">false</span>, recoup: <span class="hljs-literal">false</span> };
-      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, len = events.length; i &lt; len; i++) {
-        eventArray = <span class="hljs-keyword">this</span>._pubsubEvents[event = events[i]];
-        <span class="hljs-keyword">if</span> (eventArray) {
-          eventArray.push([method, thisArg, flags.once]);
-        } <span class="hljs-keyword">else</span> {
-          <span class="hljs-keyword">this</span>._pubsubEvents[event] = [[method, thisArg, flags.once]];
-        }
-        <span class="hljs-keyword">if</span> (flags.recoup) {
-          oldArgs = <span class="hljs-keyword">this</span>._pubsubHappened[event];
-          <span class="hljs-keyword">if</span> (oldArgs) {
-            method.apply(thisArg || <span class="hljs-keyword">this</span>, oldArgs);
-          }
-        }
-      }
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
-    },</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-6">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-6">&#182;</a>
-              </div>
-              <h3 id="pubsub-unsub">pubsub.unsub</h3>
-<p>Unsubscribe a function from one or more events.</p>
-<ul>
-<li><strong>unsub(eventString, method)</strong><ul>
-<li><em>eventString</em> one or more space-separated events;</li>
-<li><em>method</em> (optional) the function to unsubscribe</li>
-</ul>
-</li>
-</ul>
-<p>If no <em>method</em> is provided, all attached methods will be unsubscribed from the event(s).</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    unsub: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method</span>) </span>{
-      <span class="hljs-keyword">var</span> events = eventStr.split(<span class="hljs-regexp">/\s+/</span>), event, eventArray, newEventArray, i, j;
-      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; events.length; i++) {
-        eventArray = <span class="hljs-keyword">this</span>._pubsubEvents[event = events[i]] || [];
-        newEventArray = [];
-        <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>; method &amp;&amp; j &lt; eventArray.length; j++) {
-          <span class="hljs-keyword">if</span> (eventArray[j][<span class="hljs-number">0</span>] !== method) {
-            newEventArray.push(eventArray[j]);
-          }
-        }
-        <span class="hljs-keyword">this</span>._pubsubEvents[event] = newEventArray;
-      }
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
-    },</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-7">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-7">&#182;</a>
-              </div>
-              <h3 id="pubsub-once">pubsub.once</h3>
-<p>Subscribe to an event once. </p>
-<p>The function will be unsubscribed upon successful exectution.
-To mark the function execution as unsuccessful 
-(and thus keep it subscribed), make it return <code>false</code>.</p>
-<ul>
-<li><strong>once(eventString, method, thisArg)</strong> identical to <em>pubsub.sub()</em>.</li>
-</ul>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    once: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method, thisArg</span>) </span>{
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.sub(eventStr, method, thisArg, { once: <span class="hljs-literal">true</span> });
-    },</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-8">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-8">&#182;</a>
-              </div>
-              <h3 id="pubsub-recoup">pubsub.recoup</h3>
-<p>Subscribe to an event, and execute immediately if that event was ever published before.</p>
-<p>If executed immediately, the subscriber will get as parameters the last values sent with the event.</p>
-<ul>
-<li><strong>recoup(eventString, method, thisArg)</strong> identical to <em>pubsub.sub()</em>.</li>
-</ul>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    recoup: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventStr, method, thisArg</span>) </span>{
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.sub(eventStr, method, thisArg, { recoup: <span class="hljs-literal">true</span> });
-    },</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-9">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-9">&#182;</a>
-              </div>
-              <h3 id="pubsub-eventsplitter">pubsub.eventSplitter</h3>
-<p>The character on which to split the event namespace.</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    eventSplitter: <span class="hljs-string">':'</span>,</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-10">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-10">&#182;</a>
-              </div>
-              <h3 id="pubsub-eventnamespace">pubsub.eventNamespace</h3>
-<p>Parses the namespaced event string and returns an array of events to publish.
-The original implementation does: <code>&quot;path:to:event&quot; =&gt; [&quot;path&quot;, &quot;path:to&quot;, &quot;path:to:event&quot;]</code>.
-Overwrite the implementation to create your custom namespacing rules.</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>    eventNamespace: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">eventString</span>) </span>{
-      <span class="hljs-keyword">var</span> events = [], str = <span class="hljs-string">''</span>, ch, i, splitter = <span class="hljs-keyword">this</span>.eventSplitter;
-      <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; eventString.length; i++) {
-        <span class="hljs-keyword">if</span> ((ch = eventString.charAt(i)) === splitter) {
-          events.push(str);
-        }
-        str += ch;
-      }
-      events.push(str);
-      <span class="hljs-keyword">return</span> events;
-    }
-  };</pre></div></div>
-            
-        </li>
-        
-        
-        <li id="section-11">
-            <div class="annotation">
-              
-              <div class="pilwrap ">
-                <a class="pilcrow" href="#section-11">&#182;</a>
-              </div>
-              <p>Mix public methods into <code>pubsub</code>‘s prototype.</p>
-
-            </div>
-            
-            <div class="content"><div class='highlight'><pre>  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-keyword">in</span> prototype) {
-    <span class="hljs-keyword">if</span> (prototype.hasOwnProperty(i)) {
-      pubsub.prototype[i] = prototype[i];
-    }
-  }
-})(<span class="hljs-keyword">this</span>);</pre></div></div>
-            
-        </li>
-        
-    </ul>
-  </div>
-</body>
-</html>
diff --git a/docs/stylesheets/normalize.css b/docs/stylesheets/normalize.css
deleted file mode 100644
index 73abb76..0000000
--- a/docs/stylesheets/normalize.css
+++ /dev/null
@@ -1,375 +0,0 @@
-/*! normalize.css v2.0.1 | MIT License | git.io/normalize */
-
-/* ==========================================================================
-   HTML5 display definitions
-   ========================================================================== */
-
-/*
- * Corrects `block` display not defined in IE 8/9.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section,
-summary {
-    display: block;
-}
-
-/*
- * Corrects `inline-block` display not defined in IE 8/9.
- */
-
-audio,
-canvas,
-video {
-    display: inline-block;
-}
-
-/*
- * Prevents modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-
-audio:not([controls]) {
-    display: none;
-    height: 0;
-}
-
-/*
- * Addresses styling for `hidden` attribute not present in IE 8/9.
- */
-
-[hidden] {
-    display: none;
-}
-
-/* ==========================================================================
-   Base
-   ========================================================================== */
-
-/*
- * 1. Sets default font family to sans-serif.
- * 2. Prevents iOS text size adjust after orientation change, without disabling
- *    user zoom.
- */
-
-html {
-    font-family: sans-serif; /* 1 */
-    -webkit-text-size-adjust: 100%; /* 2 */
-    -ms-text-size-adjust: 100%; /* 2 */
-}
-
-/*
- * Removes default margin.
- */
-
-body {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Links
-   ========================================================================== */
-
-/*
- * Addresses `outline` inconsistency between Chrome and other browsers.
- */
-
-a:focus {
-    outline: thin dotted;
-}
-
-/*
- * Improves readability when focused and also mouse hovered in all browsers.
- */
-
-a:active,
-a:hover {
-    outline: 0;
-}
-
-/* ==========================================================================
-   Typography
-   ========================================================================== */
-
-/*
- * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,
- * Safari 5, and Chrome.
- */
-
-h1 {
-    font-size: 2em;
-}
-
-/*
- * Addresses styling not present in IE 8/9, Safari 5, and Chrome.
- */
-
-abbr[title] {
-    border-bottom: 1px dotted;
-}
-
-/*
- * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
- */
-
-b,
-strong {
-    font-weight: bold;
-}
-
-/*
- * Addresses styling not present in Safari 5 and Chrome.
- */
-
-dfn {
-    font-style: italic;
-}
-
-/*
- * Addresses styling not present in IE 8/9.
- */
-
-mark {
-    background: #ff0;
-    color: #000;
-}
-
-
-/*
- * Corrects font family set oddly in Safari 5 and Chrome.
- */
-
-code,
-kbd,
-pre,
-samp {
-    font-family: monospace, serif;
-    font-size: 1em;
-}
-
-/*
- * Improves readability of pre-formatted text in all browsers.
- */
-
-pre {
-    white-space: pre;
-    white-space: pre-wrap;
-    word-wrap: break-word;
-}
-
-/*
- * Sets consistent quote types.
- */
-
-q {
-    quotes: "\201C" "\201D" "\2018" "\2019";
-}
-
-/*
- * Addresses inconsistent and variable font size in all browsers.
- */
-
-small {
-    font-size: 80%;
-}
-
-/*
- * Prevents `sub` and `sup` affecting `line-height` in all browsers.
- */
-
-sub,
-sup {
-    font-size: 75%;
-    line-height: 0;
-    position: relative;
-    vertical-align: baseline;
-}
-
-sup {
-    top: -0.5em;
-}
-
-sub {
-    bottom: -0.25em;
-}
-
-/* ==========================================================================
-   Embedded content
-   ========================================================================== */
-
-/*
- * Removes border when inside `a` element in IE 8/9.
- */
-
-img {
-    border: 0;
-}
-
-/*
- * Corrects overflow displayed oddly in IE 9.
- */
-
-svg:not(:root) {
-    overflow: hidden;
-}
-
-/* ==========================================================================
-   Figures
-   ========================================================================== */
-
-/*
- * Addresses margin not present in IE 8/9 and Safari 5.
- */
-
-figure {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Forms
-   ========================================================================== */
-
-/*
- * Define consistent border, margin, and padding.
- */
-
-fieldset {
-    border: 1px solid #c0c0c0;
-    margin: 0 2px;
-    padding: 0.35em 0.625em 0.75em;
-}
-
-/*
- * 1. Corrects color not being inherited in IE 8/9.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-
-legend {
-    border: 0; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/*
- * 1. Corrects font family not being inherited in all browsers.
- * 2. Corrects font size not being inherited in all browsers.
- * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome
- */
-
-button,
-input,
-select,
-textarea {
-    font-family: inherit; /* 1 */
-    font-size: 100%; /* 2 */
-    margin: 0; /* 3 */
-}
-
-/*
- * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-
-button,
-input {
-    line-height: normal;
-}
-
-/*
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- *    and `video` controls.
- * 2. Corrects inability to style clickable `input` types in iOS.
- * 3. Improves usability and consistency of cursor style between image-type
- *    `input` and others.
- */
-
-button,
-html input[type="button"], /* 1 */
-input[type="reset"],
-input[type="submit"] {
-    -webkit-appearance: button; /* 2 */
-    cursor: pointer; /* 3 */
-}
-
-/*
- * Re-set default cursor for disabled elements.
- */
-
-button[disabled],
-input[disabled] {
-    cursor: default;
-}
-
-/*
- * 1. Addresses box sizing set to `content-box` in IE 8/9.
- * 2. Removes excess padding in IE 8/9.
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-    box-sizing: border-box; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/*
- * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.
- * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome
- *    (include `-moz` to future-proof).
- */
-
-input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
-    -moz-box-sizing: content-box;
-    -webkit-box-sizing: content-box; /* 2 */
-    box-sizing: content-box;
-}
-
-/*
- * Removes inner padding and search cancel button in Safari 5 and Chrome
- * on OS X.
- */
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none;
-}
-
-/*
- * Removes inner padding and border in Firefox 4+.
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    border: 0;
-    padding: 0;
-}
-
-/*
- * 1. Removes default vertical scrollbar in IE 8/9.
- * 2. Improves readability and alignment in all browsers.
- */
-
-textarea {
-    overflow: auto; /* 1 */
-    vertical-align: top; /* 2 */
-}
-
-/* ==========================================================================
-   Tables
-   ========================================================================== */
-
-/*
- * Remove most spacing between table cells.
- */
-
-table {
-    border-collapse: collapse;
-    border-spacing: 0;
-}
\ No newline at end of file
diff --git a/index.html b/index.html
deleted file mode 100644
index 26cacc1..0000000
--- a/index.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<html>
-<head>
-	<title>pubsub</title>
-	<style type='text/css'>
-		body {
-			font-family: 'Helvetica', 'Arial', sans-serif;
-			color: #333;
-			padding: 2em 5em;
-		}
-
-		a {
-			text-decoration: none;
-			color: #c00;
-		}
-	</style>
-</head>
-<body>
-
-	<h1>Pub/Sub</h1>
-
-	<p><a href='http://github.com/danburzo/pubsub'><code>pubsub</code></a> is a small, fast JavaScript library that implements the <a href='http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern'>Publish/Subscribe pattern</a> for web applications. You can <a href='docs/pubsub.html'>read through the annotated source code</a>.<p>
-
-	<h2>In a nutshell</h2>
-
-	<pre><code>
-var ps = new pubsub();
-
-// subscribe to an event
-ps.sub('hello', function(person) {
-	console.log('Hi, ' + person + '!');
-});
-
-// publish an event
-ps.pub('hello', 'Dan');
-	</code></pre>
-
-	<p>More features:</p>
-	<ul>
-		<li>namespaced events, e.g. <code>namespace:event</code>;</li>
-		<li>subscribe to events were triggered prior to the subscription with <code>pubsub.recoup</code>;</li>
-		<li>execute a subscribed function only once, then unsubscribe with <code>pubsub.once</code>;</li>
-		<li><a href='http://jsperf.com/pubish-subscribe-performance'>it's fast</a>.</li>
-	</ul>
-
-
-</body>
-</html>
\ No newline at end of file
diff --git a/package.json b/package.json
index 01a258e..b925e7e 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,33 @@
 {
-  "name": "pubsub",
-  "version": "0.1.1",
-  "devDependencies": {
-    "grunt": "^0.4.5",
-    "grunt-contrib-clean": "~0.5.0",
-    "grunt-contrib-copy": "~0.4.1",
-    "grunt-contrib-qunit": "^1.0.1",
-    "grunt-contrib-uglify": "~0.2.4",
-    "grunt-docco": "^0.4.0"
-  }
+	"name": "@evercoder/pubsub",
+	"version": "0.1.2",
+	"main": "dist/pubsub.umd.js",
+	"module": "dist/pubsub.js",
+	"devDependencies": {
+		"husky": "^0.14.3",
+		"prettier": "^1.13.7",
+		"pretty-quick": "^1.6.0",
+		"rollup": "^0.63.2",
+		"rollup-plugin-buble": "^0.19.2",
+		"tape": "^4.9.1"
+	},
+	"scripts": {
+		"precommit": "pretty-quick --staged",
+		"start": "rollup -c -w",
+		"build": "rollup -c"
+	},
+	"prettier": {
+		"bracketSpacing": true,
+		"semi": true,
+		"singleQuote": true,
+		"trailingComma": "none",
+		"useTabs": true,
+		"tabWidth": 4,
+		"jsxBracketSameLine": false,
+		"arrowParens": "avoid",
+		"printWidth": 100
+	},
+	"files": [
+		"dist"
+	]
 }
diff --git a/pubsub.js b/pubsub.js
deleted file mode 100644
index adbd966..0000000
--- a/pubsub.js
+++ /dev/null
@@ -1,158 +0,0 @@
-//    pubsub (c) 2013 Dan Burzo
-//    pubsub can be freely distributed under the MIT license.
-// Made by [@danburzo](https://twitter.com/danburzo).
-//
-// Fork & contribute at [github.com/danburzo/pubsub](https://github.com/danburzo/pubsub). 
-//
-// Download [zip](https://github.com/danburzo/pubsub/zipball/master), [tar](https://github.com/danburzo/pubsub/tarball/master). 
-//
-// The guiding principles were: speed, terseness and progressive disclosure.
-//
-// ## Annotated API
-
-// Encapsulate the library to protect global scope.
-(function() {
-  var root = this;
-
-  var pubsub = root.pubsub = function(options) {
-    this.options = options;
-    this._pubsubEvents = {};
-    this._pubsubHappened = {};
-  };
-
-  // Current version of the `pubsub`, using [semantic versioning](http://semver.org/).
-  pubsub.version = '0.1.0';
-
-  var prototype = {
-    // ### pubsub.pub
-    // Publish an event.
-    //  
-    // * **pub(event, [arg1, [arg2 ...]])**
-    //  * *event* the event to trigger;
-    //  * *arg1 ... argN* (optional) any number of additional params to pass to the event subscribers.
-    pub: function(eventString) {
-      var eventComponents = this.eventNamespace(eventString);
-      var eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
-      for (i = 0, ilen = eventComponents.length; i < ilen; i++) {
-        eventArray = this._pubsubEvents[event = eventComponents[i]] || [];
-        args = [];
-        for (j = 1; j < arguments.length; j++) {
-          args.push(arguments[j]);
-        }
-        for (j = 0, jlen = eventArray.length; j < jlen; j++) {
-          subscriber = eventArray[j];
-          ret = subscriber[0].apply(subscriber[1] || this, args);
-          if (subscriber[2] && ret !== false) {
-            this.unsub(event, subscriber[0]);
-          }
-        }
-        this._pubsubHappened[event] = args;
-      }
-      return this;
-    },
-
-    // ### pubsub.sub
-    // Subscribe a function to one or more events.
-    //
-    //  * **sub(eventString, method, [thisArg, [flags]])**
-    //    * *eventString* one or more space-separated events;
-    //    * *method* the function to subscribe to the events;
-    //    * *thisArg* (optional) context for the method;
-    //    * *flags* (optional) boleans to configure the subscribers's behavior:
-    //      * *once* if true, the subscriber will self-unsubscribe after the first successful execution. Use *pubsub.once()* for clarity;
-    //      * *recoup* if true, the subscriber will execute immediately if the event it subscribes to already happened. Use *pubsub.recoup()* for clarity.
-    //
-    // *Note:* When subscribing to multiple events, make sure these events are published with the same (or similar) list of arguments.
-    sub: function(eventStr, method, thisArg, flags) {
-      var events = eventStr.split(/\s+/), event, eventArray, i, len, oldArgs;
-      flags = flags || { once: false, recoup: false };
-      for (i = 0, len = events.length; i < len; i++) {
-        eventArray = this._pubsubEvents[event = events[i]];
-        if (eventArray) {
-          eventArray.push([method, thisArg, flags.once]);
-        } else {
-          this._pubsubEvents[event] = [[method, thisArg, flags.once]];
-        }
-        if (flags.recoup) {
-          oldArgs = this._pubsubHappened[event];
-          if (oldArgs) {
-            method.apply(thisArg || this, oldArgs);
-          }
-        }
-      }
-      return this;
-    },
-
-    // ### pubsub.unsub
-    // Unsubscribe a function from one or more events.
-    //
-    //  * **unsub(eventString, method)**
-    //    * *eventString* one or more space-separated events;
-    //    * *method* (optional) the function to unsubscribe
-    //
-    // If no *method* is provided, all attached methods will be unsubscribed from the event(s).
-    unsub: function(eventStr, method) {
-      var events = eventStr.split(/\s+/), event, eventArray, newEventArray, i, j;
-      for (i = 0; i < events.length; i++) {
-        eventArray = this._pubsubEvents[event = events[i]] || [];
-        newEventArray = [];
-        for (j = 0; method && j < eventArray.length; j++) {
-          if (eventArray[j][0] !== method) {
-            newEventArray.push(eventArray[j]);
-          }
-        }
-        this._pubsubEvents[event] = newEventArray;
-      }
-      return this;
-    },
-
-    // ### pubsub.once
-    // Subscribe to an event once. 
-    // 
-    // The function will be unsubscribed upon successful exectution.
-    // To mark the function execution as unsuccessful 
-    // (and thus keep it subscribed), make it return `false`.
-    //
-    //  * **once(eventString, method, thisArg)** identical to *pubsub.sub()*.
-    once: function(eventStr, method, thisArg) {
-      return this.sub(eventStr, method, thisArg, { once: true });
-    },
-
-    // ### pubsub.recoup
-    // Subscribe to an event, and execute immediately if that event was ever published before.
-    //
-    // If executed immediately, the subscriber will get as parameters the last values sent with the event.
-    //
-    //  * **recoup(eventString, method, thisArg)** identical to *pubsub.sub()*.
-    recoup: function(eventStr, method, thisArg) {
-      return this.sub(eventStr, method, thisArg, { recoup: true });
-    },
-
-    // ### pubsub.eventSplitter
-    // The character on which to split the event namespace.
-    eventSplitter: ':',
-
-    // ### pubsub.eventNamespace
-    // Parses the namespaced event string and returns an array of events to publish.
-    // The original implementation does: `"path:to:event" => ["path", "path:to", "path:to:event"]`.
-    // Overwrite the implementation to create your custom namespacing rules.
-    eventNamespace: function(eventString) {
-      var events = [], str = '', ch, i, splitter = this.eventSplitter;
-      for (i = 0; i < eventString.length; i++) {
-        if ((ch = eventString.charAt(i)) === splitter) {
-          events.push(str);
-        }
-        str += ch;
-      }
-      events.push(str);
-      return events;
-    }
-  };
-
-  // Mix public methods into `pubsub`'s prototype.
-  for (var i in prototype) {
-    if (prototype.hasOwnProperty(i)) {
-      pubsub.prototype[i] = prototype[i];
-    }
-  }
-})(this);
\ No newline at end of file
diff --git a/pubsub.min.js b/pubsub.min.js
deleted file mode 100644
index 7263137..0000000
--- a/pubsub.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(){var a=this,b=a.pubsub=function(a){this.options=a,this._pubsubEvents={},this._pubsubHappened={}};b.version="0.1.0";var c={pub:function(a){var b,c,d,e,f,g,h,i,j,k=this.eventNamespace(a);for(c=0,d=k.length;d>c;c++){for(b=this._pubsubEvents[j=k[c]]||[],g=[],e=1;e<arguments.length;e++)g.push(arguments[e]);for(e=0,f=b.length;f>e;e++)h=b[e],i=h[0].apply(h[1]||this,g),h[2]&&i!==!1&&this.unsub(j,h[0]);this._pubsubHappened[j]=g}return this},sub:function(a,b,c,d){var e,f,g,h,i,j=a.split(/\s+/);for(d=d||{once:!1,recoup:!1},g=0,h=j.length;h>g;g++)f=this._pubsubEvents[e=j[g]],f?f.push([b,c,d.once]):this._pubsubEvents[e]=[[b,c,d.once]],d.recoup&&(i=this._pubsubHappened[e],i&&b.apply(c||this,i));return this},unsub:function(a,b){var c,d,e,f,g,h=a.split(/\s+/);for(f=0;f<h.length;f++){for(d=this._pubsubEvents[c=h[f]]||[],e=[],g=0;b&&g<d.length;g++)d[g][0]!==b&&e.push(d[g]);this._pubsubEvents[c]=e}return this},once:function(a,b,c){return this.sub(a,b,c,{once:!0})},recoup:function(a,b,c){return this.sub(a,b,c,{recoup:!0})},eventSplitter:":",eventNamespace:function(a){var b,c,d=[],e="",f=this.eventSplitter;for(c=0;c<a.length;c++)(b=a.charAt(c))===f&&d.push(e),e+=b;return d.push(e),d}};for(var d in c)c.hasOwnProperty(d)&&(b.prototype[d]=c[d])}(this);
\ No newline at end of file
diff --git a/rollup.config.js b/rollup.config.js
new file mode 100644
index 0000000..fd90204
--- /dev/null
+++ b/rollup.config.js
@@ -0,0 +1,22 @@
+import pkg from './package.json';
+import buble from 'rollup-plugin-buble';
+
+export default [
+	{
+		input: 'src/pubsub.js',
+		output: {
+			format: 'umd',
+			name: 'pubsub',
+			file: pkg.main
+		},
+		plugins: [buble()]
+	},
+	{
+		input: 'src/pubsub.js',
+		output: {
+			format: 'es',
+			file: pkg.module
+		},
+		plugins: [buble()]
+	}
+];
diff --git a/src/pubsub.js b/src/pubsub.js
new file mode 100644
index 0000000..5c13847
--- /dev/null
+++ b/src/pubsub.js
@@ -0,0 +1,142 @@
+class pubsub {
+	constructor(options) {
+		this.options = options;
+		this._pubsubEvents = {};
+		this._pubsubHappened = {};
+	}
+
+	// ### pubsub.pub
+	// Publish an event.
+	//
+	// * **pub(event, [arg1, [arg2 ...]])**
+	//  * *event* the event to trigger;
+	//  * *arg1 ... argN* (optional) any number of additional params to pass to the event subscribers.
+	pub(eventString) {
+		var eventComponents = this.eventNamespace(eventString);
+		var eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
+		for (i = 0, ilen = eventComponents.length; i < ilen; i++) {
+			eventArray = this._pubsubEvents[(event = eventComponents[i])] || [];
+			args = [];
+			for (j = 1; j < arguments.length; j++) {
+				args.push(arguments[j]);
+			}
+			for (j = 0, jlen = eventArray.length; j < jlen; j++) {
+				subscriber = eventArray[j];
+				ret = subscriber[0].apply(subscriber[1] || this, args);
+				if (subscriber[2] && ret !== false) {
+					this.unsub(event, subscriber[0]);
+				}
+			}
+			this._pubsubHappened[event] = args;
+		}
+		return this;
+	}
+
+	// ### pubsub.sub
+	// Subscribe a function to one or more events.
+	//
+	//  * **sub(eventString, method, [thisArg, [flags]])**
+	//    * *eventString* one or more space-separated events;
+	//    * *method* the function to subscribe to the events;
+	//    * *thisArg* (optional) context for the method;
+	//    * *flags* (optional) boleans to configure the subscribers's behavior:
+	//      * *once* if true, the subscriber will self-unsubscribe after the first successful execution. Use *pubsub.once()* for clarity;
+	//      * *recoup* if true, the subscriber will execute immediately if the event it subscribes to already happened. Use *pubsub.recoup()* for clarity.
+	//
+	// *Note:* When subscribing to multiple events, make sure these events are published with the same (or similar) list of arguments.
+	sub(eventStr, method, thisArg, flags) {
+		var events = eventStr.split(/\s+/),
+			event,
+			eventArray,
+			i,
+			len,
+			oldArgs;
+		flags = flags || { once: false, recoup: false };
+		for (i = 0, len = events.length; i < len; i++) {
+			eventArray = this._pubsubEvents[(event = events[i])];
+			if (eventArray) {
+				eventArray.push([method, thisArg, flags.once]);
+			} else {
+				this._pubsubEvents[event] = [[method, thisArg, flags.once]];
+			}
+			if (flags.recoup) {
+				oldArgs = this._pubsubHappened[event];
+				if (oldArgs) {
+					method.apply(thisArg || this, oldArgs);
+				}
+			}
+		}
+		return this;
+	}
+
+	// ### pubsub.unsub
+	// Unsubscribe a function from one or more events.
+	//
+	//  * **unsub(eventString, method)**
+	//    * *eventString* one or more space-separated events;
+	//    * *method* (optional) the function to unsubscribe
+	//
+	// If no *method* is provided, all attached methods will be unsubscribed from the event(s).
+	unsub(eventStr, method) {
+		var events = eventStr.split(/\s+/),
+			event,
+			eventArray,
+			newEventArray,
+			i,
+			j;
+		for (i = 0; i < events.length; i++) {
+			eventArray = this._pubsubEvents[(event = events[i])] || [];
+			newEventArray = [];
+			for (j = 0; method && j < eventArray.length; j++) {
+				if (eventArray[j][0] !== method) {
+					newEventArray.push(eventArray[j]);
+				}
+			}
+			this._pubsubEvents[event] = newEventArray;
+		}
+		return this;
+	}
+
+	// ### pubsub.once
+	// Subscribe to an event once.
+	//
+	// The function will be unsubscribed upon successful exectution.
+	// To mark the function execution as unsuccessful
+	// (and thus keep it subscribed), make it return `false`.
+	//
+	//  * **once(eventString, method, thisArg)** identical to *pubsub.sub()*.
+	once(eventStr, method, thisArg) {
+		return this.sub(eventStr, method, thisArg, { once: true });
+	}
+
+	// ### pubsub.recoup
+	// Subscribe to an event, and execute immediately if that event was ever published before.
+	//
+	// If executed immediately, the subscriber will get as parameters the last values sent with the event.
+	//
+	//  * **recoup(eventString, method, thisArg)** identical to *pubsub.sub()*.
+	recoup(eventStr, method, thisArg) {
+		return this.sub(eventStr, method, thisArg, { recoup: true });
+	}
+
+	// ### pubsub.eventNamespace
+	// Parses the namespaced event string and returns an array of events to publish.
+	// The original implementation does: `"path:to:event" => ["path", "path:to", "path:to:event"]`.
+	// Overwrite the implementation to create your custom namespacing rules.
+	eventNamespace(eventString) {
+		var events = [],
+			str = '',
+			ch,
+			i;
+		for (i = 0; i < eventString.length; i++) {
+			if ((ch = eventString.charAt(i)) === ':') {
+				events.push(str);
+			}
+			str += ch;
+		}
+		events.push(str);
+		return events;
+	}
+}
+
+export default pubsub;
diff --git a/test/tests.js b/test/tests.js
new file mode 100644
index 0000000..96314e8
--- /dev/null
+++ b/test/tests.js
@@ -0,0 +1,158 @@
+module('pubsub');
+
+test('PubSub basic use case', function() {
+	expect(2);
+	var ps = new pubsub();
+	ps.sub('topic', function() {
+		ok('here!', 'single subscriber');
+	});
+	ps.pub('topic');
+	var count = 0;
+	ps.sub('topic2', function() {
+		count++;
+	});
+	ps.sub('topic2', function() {
+		count++;
+	});
+	ps.sub('topic2', function() {
+		count++;
+	});
+	ps.sub('topic3', function() {
+		count++;
+	});
+	ps.pub('topic2');
+	strictEqual(count, 3, 'multiple subscribers');
+});
+
+test('PubSub.once()', function() {
+	expect(7);
+	var ps = new pubsub(),
+		ran = 0;
+	ps.sub('topic', function() {
+		ok('here!', 'im a recurring subscriber');
+	})
+		.once('topic', function() {
+			ok('here!', 'im a one-time subscriber');
+		})
+		.once('topic', function() {
+			ok('here!', 'im a two-time subscriber');
+			if (++ran < 2) return false;
+		})
+		.pub('topic')
+		.pub('topic')
+		.pub('topic')
+		.pub('topic');
+});
+
+test('PubSub.sub() to multiple events, .once() to multiple events', function() {
+	expect(9);
+	var ps = new pubsub();
+	ps.sub('topic1 topic2 topic3', function() {
+		ok('here!', 'im a subscriber');
+	});
+	ps.once('topic1 topic2 topic3', function() {
+		ok('here!', 'im a subscriber');
+	});
+	ps.pub('topic1')
+		.pub('topic2')
+		.pub('topic3');
+	ps.pub('topic1')
+		.pub('topic2')
+		.pub('topic3');
+});
+
+test('PubSub.unsub()', function() {
+	expect(2);
+	var ps = new pubsub();
+	var f = function() {
+		ok('here!', 'subscriber executed');
+	};
+	ps.sub('event1 event2', f);
+	ps.pub('event1');
+	ps.unsub('event2', f);
+	ps.pub('event1');
+	ps.unsub('event1', f);
+	ps.pub('event1');
+});
+
+test('PubSub.unsub() with non-subscribed method', function() {
+	expect(1);
+	var ps = new pubsub();
+	var f1 = function() {
+		ok('yay!', 'f1 triggered');
+	};
+	var f2 = function() {
+		/* no-op */
+	};
+	ps.sub('event', f1)
+		.unsub('event', f2)
+		.pub('event');
+});
+
+test('PubSub.unsub() with no method', function() {
+	expect(0);
+	var ps = new pubsub();
+	var f1 = function() {
+		ok('you should not see this', 'f1 triggered');
+	};
+	var f2 = function() {
+		ok('you should not see this', 'f1 triggered');
+	};
+	var f3 = function() {
+		ok('you should not see this', 'f1 triggered');
+	};
+	ps.sub('event', f1)
+		.sub('event', f2)
+		.sub('event', f3);
+	ps.unsub('event');
+});
+
+test('PubSub: namespaced events', function() {
+	expect(2);
+	var ps = new pubsub();
+	ps.sub('namespace:topic1', function() {
+		ok('here!', 'subscriber to topic1 in namespace');
+	});
+	ps.sub('namespace:topic2', function() {
+		ok('here!', 'subscriber to topic2 in namespace');
+	});
+	ps.sub('namespace', function() {
+		ok('here!', 'subscriber to entire namespace');
+	});
+	ps.sub('namespace2:topic1', function() {
+		ok('here!', 'subscriber to topic1 in different namespace');
+	});
+	ps.pub('namespace:topic1');
+});
+
+test('PubSub: nested namespaces', function() {
+	expect(3);
+	var ps = new pubsub();
+	ps.sub('parent:child:event', function() {
+		ok('here!', 'subscribed to specific event');
+	});
+	ps.sub('parent:child', function() {
+		ok('here!', 'subscribed to sub-namespace');
+	});
+	ps.sub('parent', function() {
+		ok('here!', 'subscribed to entire namespace');
+	});
+	ps.sub('child:event', function() {
+		ok('here!', 'subscribed to invalid namespace portion');
+	});
+	ps.pub('parent:child:event');
+});
+
+test('PubSub.recoup()', function() {
+	expect(4);
+	var ps = new pubsub();
+	ps.pub('event1', 1, 2, 3);
+	ps.pub('event2', 1, 2, 3);
+	ps.recoup('event1', function() {
+		strictEqual(arguments.length, 3, 'correct args');
+	});
+	ps.recoup('event1', function() {
+		strictEqual(arguments.length, 3, 'correct args');
+	});
+	ps.pub('event1', 3, 4, 5);
+});
diff --git a/tests/tests.html b/tests/tests.html
deleted file mode 100644
index d27850a..0000000
--- a/tests/tests.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-	<head>
-		<title>pubsub unit tests</title>
-		<link rel="stylesheet" href="../bower_components/qunit/qunit/qunit.css">
-		<script type='text/javascript' src="../bower_components/qunit/qunit/qunit.js"></script>
-		<script type='text/javascript' src="../pubsub.js"></script>
-		<script type='text/javascript' src="./tests.js"></script>
-	</head>
-	<body>
-		<h1 id="qunit-header">pubsub unit tests</h1>
-		<h2 id="qunit-banner"></h2>
-		<div id="qunit-testrunner-toolbar"></div>
-		<h2 id="qunit-userAgent"></h2>
-		<ol id="qunit-tests"></ol>
-	</body>
-</html>
\ No newline at end of file
diff --git a/tests/tests.js b/tests/tests.js
deleted file mode 100644
index 90d350a..0000000
--- a/tests/tests.js
+++ /dev/null
@@ -1,142 +0,0 @@
-module('pubsub');
-
-test('PubSub basic use case', function() {
-	expect(2);
-	var ps = new pubsub();
-	ps.sub('topic', function() {
-		ok('here!', 'single subscriber');
-	});
-	ps.pub('topic');
-	var count = 0;
-	ps.sub('topic2', function() { count++; });
-	ps.sub('topic2', function() { count++; });
-	ps.sub('topic2', function() { count++; });
-	ps.sub('topic3', function() { count++; });
-	ps.pub('topic2');
-	strictEqual(count, 3, 'multiple subscribers');
-});
-
-test('PubSub.once()', function() {
-  expect(7);
-  var ps = new pubsub(), ran = 0;
-  ps.sub('topic', function() {
-    ok('here!', 'im a recurring subscriber');
-  })
-  .once('topic', function() {
-    ok('here!', 'im a one-time subscriber');
-  })
-  .once('topic', function() {
-    ok('here!', 'im a two-time subscriber');
-    if (++ran < 2) return false;
-  })
-  .pub('topic')
-  .pub('topic')
-  .pub('topic')
-  .pub('topic');
-});
-
-test('PubSub.sub() to multiple events, .once() to multiple events', function() {
-  expect(9);
-  var ps = new pubsub();
-  ps.sub('topic1 topic2 topic3', function() {
-    ok('here!', 'im a subscriber');
-  });
-  ps.once('topic1 topic2 topic3', function() {
-    ok('here!', 'im a subscriber');
-  });
-  ps.pub('topic1').pub('topic2').pub('topic3');
-  ps.pub('topic1').pub('topic2').pub('topic3');
-});
-
-test('PubSub.unsub()', function() {
-  expect(2);
-  var ps = new pubsub();
-  var f = function() {
-    ok('here!', 'subscriber executed');
-  };
-  ps.sub('event1 event2', f);
-  ps.pub('event1');
-  ps.unsub('event2', f);
-  ps.pub('event1');
-  ps.unsub('event1', f);
-  ps.pub('event1');
-});
-
-test('PubSub.unsub() with non-subscribed method', function() {
-  expect(1);
-  var ps = new pubsub();
-  var f1 = function() {
-    ok('yay!', 'f1 triggered');
-  };
-  var f2 = function() {
-    /* no-op */
-  };
-  ps.sub('event', f1).unsub('event', f2).pub('event');
-});
-
-test('PubSub.unsub() with no method', function() {
-  expect(0);
-  var ps = new pubsub();
-  var f1 = function() {
-    ok('you should not see this', 'f1 triggered');
-  };
-  var f2 = function() {
-    ok('you should not see this', 'f1 triggered');
-  };
-  var f3 = function() {
-    ok('you should not see this', 'f1 triggered');
-  };
-  ps.sub('event', f1).sub('event', f2).sub('event', f3);
-  ps.unsub('event');
-
-});
-
-test('PubSub: namespaced events', function() {
-  expect(2);
-  var ps = new pubsub();
-  ps.sub('namespace:topic1', function() {
-    ok('here!', 'subscriber to topic1 in namespace');
-  });
-  ps.sub('namespace:topic2', function() {
-    ok('here!', 'subscriber to topic2 in namespace');
-  });
-  ps.sub('namespace', function() {
-    ok('here!', 'subscriber to entire namespace');
-  });
-  ps.sub('namespace2:topic1', function() {
-    ok('here!', 'subscriber to topic1 in different namespace');
-  });
-  ps.pub('namespace:topic1');
-});
-
-test('PubSub: nested namespaces', function() {
-  expect(3);
-  var ps = new pubsub();
-  ps.sub('parent:child:event', function() {
-    ok('here!', 'subscribed to specific event');
-  });
-  ps.sub('parent:child', function() {
-    ok('here!', 'subscribed to sub-namespace');
-  });
-  ps.sub('parent', function() {
-    ok('here!', 'subscribed to entire namespace');
-  });
-  ps.sub('child:event', function() {
-    ok('here!', 'subscribed to invalid namespace portion');
-  });
-  ps.pub('parent:child:event');
-});
-
-test('PubSub.recoup()', function() {
-  expect(4);
-  var ps = new pubsub();
-  ps.pub('event1', 1, 2, 3);
-  ps.pub('event2', 1, 2, 3);
-  ps.recoup('event1', function() {
-    strictEqual(arguments.length, 3, 'correct args');
-  });
-  ps.recoup('event1', function() {
-    strictEqual(arguments.length, 3, 'correct args');
-  });
-  ps.pub('event1', 3,4,5);
-});
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..fa3e957
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,694 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/estree@0.0.39":
+  version "0.0.39"
+  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+  version "10.5.2"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707"
+
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
+acorn-jsx@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e"
+  dependencies:
+    acorn "^5.0.3"
+
+acorn@^5.0.0, acorn@^5.0.3, acorn@^5.4.1:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  dependencies:
+    color-convert "^1.9.0"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+buble@^0.19.2:
+  version "0.19.3"
+  resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.3.tgz#01e9412062cff1da6f20342b6ecd72e7bf699d02"
+  dependencies:
+    acorn "^5.4.1"
+    acorn-dynamic-import "^3.0.0"
+    acorn-jsx "^4.1.1"
+    chalk "^2.3.1"
+    magic-string "^0.22.4"
+    minimist "^1.2.0"
+    os-homedir "^1.0.1"
+    vlq "^1.0.0"
+
+chalk@^2.3.0, chalk@^2.3.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+ci-info@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2"
+
+color-convert@^1.9.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+  dependencies:
+    color-name "1.1.1"
+
+color-name@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+cross-spawn@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+deep-equal@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+defined@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+es-abstract@^1.5.0:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+estree-walker@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39"
+
+execa@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^3.0.0"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+for-each@~0.3.3:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+  dependencies:
+    is-callable "^1.1.3"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob@~7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has@^1.0.1, has@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  dependencies:
+    function-bind "^1.1.1"
+
+husky@^0.14.3:
+  version "0.14.3"
+  resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3"
+  dependencies:
+    is-ci "^1.0.10"
+    normalize-path "^1.0.0"
+    strip-indent "^2.0.0"
+
+ignore@^3.3.7:
+  version "3.3.10"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+
+is-ci@^1.0.10:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
+  dependencies:
+    ci-info "^1.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+isarray@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+kind-of@^3.0.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^6.0.0:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lru-cache@^4.0.1:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+magic-string@^0.22.4:
+  version "0.22.5"
+  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+  dependencies:
+    vlq "^0.2.2"
+
+math-random@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+micromatch@^2.3.11:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mri@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.1.tgz#85aa26d3daeeeedf80dc5984af95cc5ca5cad9f1"
+
+normalize-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
+
+normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
+object-inspect@~1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
+
+object-keys@^1.0.8:
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+once@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+os-homedir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+prettier@^1.13.7:
+  version "1.13.7"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
+
+pretty-quick@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.6.0.tgz#afc3591eb5c4cf37614a305d489a8a40e57c9258"
+  dependencies:
+    chalk "^2.3.0"
+    execa "^0.8.0"
+    find-up "^2.1.0"
+    ignore "^3.3.7"
+    mri "^1.1.0"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+randomatic@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
+  dependencies:
+    is-number "^4.0.0"
+    kind-of "^6.0.0"
+    math-random "^1.0.1"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+resolve@~1.7.1:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
+  dependencies:
+    path-parse "^1.0.5"
+
+resumer@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
+  dependencies:
+    through "~2.3.4"
+
+rollup-plugin-buble@^0.19.2:
+  version "0.19.2"
+  resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz#c0590c7d3d475b5ed59f129764ec93710cc6e8dd"
+  dependencies:
+    buble "^0.19.2"
+    rollup-pluginutils "^2.0.1"
+
+rollup-pluginutils@^2.0.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz#478ace04bd7f6da2e724356ca798214884738fc4"
+  dependencies:
+    estree-walker "^0.5.2"
+    micromatch "^2.3.11"
+
+rollup@^0.63.2:
+  version "0.63.2"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.63.2.tgz#d27619204cd025c948d740972fb1d0da6aa64481"
+  dependencies:
+    "@types/estree" "0.0.39"
+    "@types/node" "*"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+string.prototype.trim@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.0"
+    function-bind "^1.0.2"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+
+supports-color@^5.3.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+  dependencies:
+    has-flag "^3.0.0"
+
+tape@^4.9.1:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9"
+  dependencies:
+    deep-equal "~1.0.1"
+    defined "~1.0.0"
+    for-each "~0.3.3"
+    function-bind "~1.1.1"
+    glob "~7.1.2"
+    has "~1.0.3"
+    inherits "~2.0.3"
+    minimist "~1.2.0"
+    object-inspect "~1.6.0"
+    resolve "~1.7.1"
+    resumer "~0.0.0"
+    string.prototype.trim "~1.1.2"
+    through "~2.3.8"
+
+through@~2.3.4, through@~2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+vlq@^0.2.2:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+
+vlq@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
+
+which@^1.2.9:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  dependencies:
+    isexe "^2.0.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"

From c6fb3dd0dfbe333064af8319a1d0fa3face296d6 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Thu, 19 Jul 2018 16:22:27 +0300
Subject: [PATCH 04/22] Updated tests

---
 package.json  |   3 +-
 src/pubsub.js | 106 +++++++++++++++++++++++++++++---------------------
 test/tests.js |  92 ++++++++++++++++++++++++-------------------
 3 files changed, 115 insertions(+), 86 deletions(-)

diff --git a/package.json b/package.json
index b925e7e..ceaf853 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,8 @@
 	"scripts": {
 		"precommit": "pretty-quick --staged",
 		"start": "rollup -c -w",
-		"build": "rollup -c"
+		"build": "rollup -c",
+		"test": "yarn build && tape test/tests.js"
 	},
 	"prettier": {
 		"bracketSpacing": true,
diff --git a/src/pubsub.js b/src/pubsub.js
index 5c13847..b119c3e 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -5,13 +5,17 @@ class pubsub {
 		this._pubsubHappened = {};
 	}
 
-	// ### pubsub.pub
-	// Publish an event.
-	//
-	// * **pub(event, [arg1, [arg2 ...]])**
-	//  * *event* the event to trigger;
-	//  * *arg1 ... argN* (optional) any number of additional params to pass to the event subscribers.
+	/*
+		Publish an event.
+		
+		* **pub(event, [arg1, [arg2 ...]])**
+		 * *event* the event to trigger;
+		 * *arg1 ... argN* (optional) any number of additional params to pass to the event subscribers.
+	*/
 	pub(eventString) {
+		if (!eventString) {
+			throw new Error('pubsub.pub() received empty event string');
+		}
 		var eventComponents = this.eventNamespace(eventString);
 		var eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
 		for (i = 0, ilen = eventComponents.length; i < ilen; i++) {
@@ -32,19 +36,23 @@ class pubsub {
 		return this;
 	}
 
-	// ### pubsub.sub
-	// Subscribe a function to one or more events.
-	//
-	//  * **sub(eventString, method, [thisArg, [flags]])**
-	//    * *eventString* one or more space-separated events;
-	//    * *method* the function to subscribe to the events;
-	//    * *thisArg* (optional) context for the method;
-	//    * *flags* (optional) boleans to configure the subscribers's behavior:
-	//      * *once* if true, the subscriber will self-unsubscribe after the first successful execution. Use *pubsub.once()* for clarity;
-	//      * *recoup* if true, the subscriber will execute immediately if the event it subscribes to already happened. Use *pubsub.recoup()* for clarity.
-	//
-	// *Note:* When subscribing to multiple events, make sure these events are published with the same (or similar) list of arguments.
+	/*
+		Subscribe a function to one or more events.
+		
+		 * **sub(eventString, method, [thisArg, [flags]])**
+		   * *eventString* one or more space-separated events;
+		   * *method* the function to subscribe to the events;
+		   * *thisArg* (optional) context for the method;
+		   * *flags* (optional) boleans to configure the subscribers's behavior:
+		     * *once* if true, the subscriber will self-unsubscribe after the first successful execution. Use *pubsub.once()* for clarity;
+		     * *recoup* if true, the subscriber will execute immediately if the event it subscribes to already happened. Use *pubsub.recoup()* for clarity.
+		
+		*Note:* When subscribing to multiple events, make sure these events are published with the same (or similar) list of arguments.
+	*/
 	sub(eventStr, method, thisArg, flags) {
+		if (!eventStr) {
+			throw new Error('pubsub.sub() received empty event string');
+		}
 		var events = eventStr.split(/\s+/),
 			event,
 			eventArray,
@@ -69,15 +77,19 @@ class pubsub {
 		return this;
 	}
 
-	// ### pubsub.unsub
-	// Unsubscribe a function from one or more events.
-	//
-	//  * **unsub(eventString, method)**
-	//    * *eventString* one or more space-separated events;
-	//    * *method* (optional) the function to unsubscribe
-	//
-	// If no *method* is provided, all attached methods will be unsubscribed from the event(s).
+	/*
+		Unsubscribe a function from one or more events.
+		
+		 * **unsub(eventString, method)**
+		   * *eventString* one or more space-separated events;
+		   * *method* (optional) the function to unsubscribe
+		
+		If no *method* is provided, all attached methods will be unsubscribed from the event(s).
+	*/
 	unsub(eventStr, method) {
+		if (!eventStr) {
+			throw new Error('pubsub.unsub() received empty event string');
+		}
 		var events = eventStr.split(/\s+/),
 			event,
 			eventArray,
@@ -97,32 +109,38 @@ class pubsub {
 		return this;
 	}
 
-	// ### pubsub.once
-	// Subscribe to an event once.
-	//
-	// The function will be unsubscribed upon successful exectution.
-	// To mark the function execution as unsuccessful
-	// (and thus keep it subscribed), make it return `false`.
-	//
-	//  * **once(eventString, method, thisArg)** identical to *pubsub.sub()*.
+	/*
+		### pubsub.once
+		Subscribe to an event once.
+		
+		The function will be unsubscribed upon successful exectution.
+		To mark the function execution as unsuccessful
+		(and thus keep it subscribed), make it return `false`.
+		
+		 * **once(eventString, method, thisArg)** identical to *pubsub.sub()*.
+	*/
 	once(eventStr, method, thisArg) {
 		return this.sub(eventStr, method, thisArg, { once: true });
 	}
 
-	// ### pubsub.recoup
-	// Subscribe to an event, and execute immediately if that event was ever published before.
-	//
-	// If executed immediately, the subscriber will get as parameters the last values sent with the event.
-	//
-	//  * **recoup(eventString, method, thisArg)** identical to *pubsub.sub()*.
+	/*
+		### pubsub.recoup
+		Subscribe to an event, and execute immediately if that event was ever published before.
+		
+		If executed immediately, the subscriber will get as parameters the last values sent with the event.
+		
+		 * **recoup(eventString, method, thisArg)** identical to *pubsub.sub()*.
+	*/
 	recoup(eventStr, method, thisArg) {
 		return this.sub(eventStr, method, thisArg, { recoup: true });
 	}
 
-	// ### pubsub.eventNamespace
-	// Parses the namespaced event string and returns an array of events to publish.
-	// The original implementation does: `"path:to:event" => ["path", "path:to", "path:to:event"]`.
-	// Overwrite the implementation to create your custom namespacing rules.
+	/*
+		### pubsub.eventNamespace
+		Parses the namespaced event string and returns an array of events to publish.
+		The original implementation does: `"path:to:event" => ["path", "path:to", "path:to:event"]`.
+		Overwrite the implementation to create your custom namespacing rules.
+	*/
 	eventNamespace(eventString) {
 		var events = [],
 			str = '',
diff --git a/test/tests.js b/test/tests.js
index 96314e8..605ce8d 100644
--- a/test/tests.js
+++ b/test/tests.js
@@ -1,10 +1,11 @@
-module('pubsub');
+let test = require('tape');
+let pubsub = require('../dist/pubsub.umd.js');
 
-test('PubSub basic use case', function() {
-	expect(2);
+test('PubSub basic use case', t => {
+	t.plan(2);
 	var ps = new pubsub();
 	ps.sub('topic', function() {
-		ok('here!', 'single subscriber');
+		t.pass('single subscriber');
 	});
 	ps.pub('topic');
 	var count = 0;
@@ -21,37 +22,39 @@ test('PubSub basic use case', function() {
 		count++;
 	});
 	ps.pub('topic2');
-	strictEqual(count, 3, 'multiple subscribers');
+	t.equal(count, 3, 'multiple subscribers');
+	t.end();
 });
 
-test('PubSub.once()', function() {
-	expect(7);
+test('PubSub.once()', t => {
+	t.plan(7);
 	var ps = new pubsub(),
 		ran = 0;
 	ps.sub('topic', function() {
-		ok('here!', 'im a recurring subscriber');
+		t.pass('im a recurring subscriber');
 	})
 		.once('topic', function() {
-			ok('here!', 'im a one-time subscriber');
+			t.pass('im a one-time subscriber');
 		})
 		.once('topic', function() {
-			ok('here!', 'im a two-time subscriber');
+			t.pass('im a two-time subscriber');
 			if (++ran < 2) return false;
 		})
 		.pub('topic')
 		.pub('topic')
 		.pub('topic')
 		.pub('topic');
+	t.end();
 });
 
-test('PubSub.sub() to multiple events, .once() to multiple events', function() {
-	expect(9);
+test('PubSub.sub() to multiple events, .once() to multiple events', t => {
+	t.plan(9);
 	var ps = new pubsub();
 	ps.sub('topic1 topic2 topic3', function() {
-		ok('here!', 'im a subscriber');
+		t.pass('im a subscriber');
 	});
 	ps.once('topic1 topic2 topic3', function() {
-		ok('here!', 'im a subscriber');
+		t.pass('im a subscriber');
 	});
 	ps.pub('topic1')
 		.pub('topic2')
@@ -59,13 +62,14 @@ test('PubSub.sub() to multiple events, .once() to multiple events', function() {
 	ps.pub('topic1')
 		.pub('topic2')
 		.pub('topic3');
+	t.end();
 });
 
-test('PubSub.unsub()', function() {
-	expect(2);
+test('PubSub.unsub()', t => {
+	t.plan(2);
 	var ps = new pubsub();
 	var f = function() {
-		ok('here!', 'subscriber executed');
+		t.pass('subscriber executed');
 	};
 	ps.sub('event1 event2', f);
 	ps.pub('event1');
@@ -73,13 +77,14 @@ test('PubSub.unsub()', function() {
 	ps.pub('event1');
 	ps.unsub('event1', f);
 	ps.pub('event1');
+	t.end();
 });
 
-test('PubSub.unsub() with non-subscribed method', function() {
-	expect(1);
+test('PubSub.unsub() with non-subscribed method', t => {
+	t.plan(1);
 	var ps = new pubsub();
 	var f1 = function() {
-		ok('yay!', 'f1 triggered');
+		t.pass('f1 triggered');
 	};
 	var f2 = function() {
 		/* no-op */
@@ -87,72 +92,77 @@ test('PubSub.unsub() with non-subscribed method', function() {
 	ps.sub('event', f1)
 		.unsub('event', f2)
 		.pub('event');
+	t.end();
 });
 
-test('PubSub.unsub() with no method', function() {
-	expect(0);
+test('PubSub.unsub() with no method', t => {
+	t.plan(0);
 	var ps = new pubsub();
 	var f1 = function() {
-		ok('you should not see this', 'f1 triggered');
+		t.pass('f1 triggered');
 	};
 	var f2 = function() {
-		ok('you should not see this', 'f1 triggered');
+		t.pass('f1 triggered');
 	};
 	var f3 = function() {
-		ok('you should not see this', 'f1 triggered');
+		t.pass('f1 triggered');
 	};
 	ps.sub('event', f1)
 		.sub('event', f2)
 		.sub('event', f3);
 	ps.unsub('event');
+	t.end();
 });
 
-test('PubSub: namespaced events', function() {
-	expect(2);
+test('PubSub: namespaced events', t => {
+	t.plan(2);
 	var ps = new pubsub();
 	ps.sub('namespace:topic1', function() {
-		ok('here!', 'subscriber to topic1 in namespace');
+		t.pass('subscriber to topic1 in namespace');
 	});
 	ps.sub('namespace:topic2', function() {
-		ok('here!', 'subscriber to topic2 in namespace');
+		t.pass('subscriber to topic2 in namespace');
 	});
 	ps.sub('namespace', function() {
-		ok('here!', 'subscriber to entire namespace');
+		t.pass('subscriber to entire namespace');
 	});
 	ps.sub('namespace2:topic1', function() {
-		ok('here!', 'subscriber to topic1 in different namespace');
+		t.pass('subscriber to topic1 in different namespace');
 	});
 	ps.pub('namespace:topic1');
+	t.end();
 });
 
-test('PubSub: nested namespaces', function() {
-	expect(3);
+test('PubSub: nested namespaces', t => {
+	t.plan(3);
 	var ps = new pubsub();
 	ps.sub('parent:child:event', function() {
-		ok('here!', 'subscribed to specific event');
+		t.pass('subscribed to specific event');
 	});
 	ps.sub('parent:child', function() {
-		ok('here!', 'subscribed to sub-namespace');
+		t.pass('subscribed to sub-namespace');
 	});
 	ps.sub('parent', function() {
-		ok('here!', 'subscribed to entire namespace');
+		t.pass('subscribed to entire namespace');
 	});
 	ps.sub('child:event', function() {
-		ok('here!', 'subscribed to invalid namespace portion');
+		t.pass('subscribed to invalid namespace portion');
 	});
 	ps.pub('parent:child:event');
+	t.end();
 });
 
-test('PubSub.recoup()', function() {
-	expect(4);
+test('PubSub.recoup()', t => {
+	t.plan(4);
 	var ps = new pubsub();
 	ps.pub('event1', 1, 2, 3);
 	ps.pub('event2', 1, 2, 3);
 	ps.recoup('event1', function() {
-		strictEqual(arguments.length, 3, 'correct args');
+		t.equal(arguments.length, 3, 'correct args');
 	});
 	ps.recoup('event1', function() {
-		strictEqual(arguments.length, 3, 'correct args');
+		t.equal(arguments.length, 3, 'correct args');
 	});
 	ps.pub('event1', 3, 4, 5);
+	t.end();
 });

From cf5f4e83d06d39281abf8749d705e44261fc24af Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Thu, 19 Jul 2018 16:25:06 +0300
Subject: [PATCH 05/22] Add private:false in package.json

---
 package.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package.json b/package.json
index ceaf853..caa8e45 100644
--- a/package.json
+++ b/package.json
@@ -3,6 +3,7 @@
 	"version": "0.1.2",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
+	"private": false,
 	"devDependencies": {
 		"husky": "^0.14.3",
 		"prettier": "^1.13.7",

From 157919d4164736394803119cfc5843e995ec773c Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 18:05:08 +0300
Subject: [PATCH 06/22] v0.2.0

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index caa8e45..ab9d26a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.1.2",
+	"version": "0.2.0",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From 55455bd8a80f557fec02c05d3613693a1b89f0ae Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 18:07:29 +0300
Subject: [PATCH 07/22] v0.2.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index ab9d26a..a9ad5d8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.0",
+	"version": "0.2.1",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From ce5d25e8a652bf3db8dec164b28b438724ea8361 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 18:08:07 +0300
Subject: [PATCH 08/22] Deprecation notices; fixes #7, fixes #4, fixes #2

---
 src/pubsub.js | 35 +++++++++++++++++++++++++++++------
 1 file changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/pubsub.js b/src/pubsub.js
index b119c3e..d638bb8 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -16,6 +16,13 @@ class pubsub {
 		if (!eventString) {
 			throw new Error('pubsub.pub() received empty event string');
 		}
+
+		if (arguments.length > 2) {
+			console.warn(
+				`[Deprecated]: Publishing an event with multiple arguments is deprecated. Re: ${eventString}`
+			);
+		}
+
 		var eventComponents = this.eventNamespace(eventString);
 		var eventArray, i, ilen, j, jlen, args, subscriber, ret, event;
 		for (i = 0, ilen = eventComponents.length; i < ilen; i++) {
@@ -53,12 +60,28 @@ class pubsub {
 		if (!eventStr) {
 			throw new Error('pubsub.sub() received empty event string');
 		}
-		var events = eventStr.split(/\s+/),
-			event,
-			eventArray,
-			i,
-			len,
-			oldArgs;
+
+		if (thisArg) {
+			console.warn(
+				`sub(): thisArg is deprecated, please bind your method manually. Re: ${eventStr}`
+			);
+		}
+
+		var events;
+
+		if (Array.isArray(eventStr)) {
+			events = eventStr;
+		} else {
+			events = eventStr.split(/\s+/);
+			if (events.length > 1) {
+				console.warn(
+					`Subscribing to space-separated events is deprecated; please use an array of events. Re: ${eventStr}`
+				);
+			}
+		}
+
+		var event, eventArray, i, len, oldArgs;
+
 		flags = flags || { once: false, recoup: false };
 		for (i = 0, len = events.length; i < len; i++) {
 			eventArray = this._pubsubEvents[(event = events[i])];

From 813764daf523886a2cad1fd2ef70b95d6a7d5877 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 18:12:13 +0300
Subject: [PATCH 09/22] Fixes #6; strict mode

---
 src/pubsub.js | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/pubsub.js b/src/pubsub.js
index d638bb8..21f1359 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -90,7 +90,20 @@ class pubsub {
 			} else {
 				this._pubsubEvents[event] = [[method, thisArg, flags.once]];
 			}
+
+			if (this.options.strict && this._pubsubHappened[event]) {
+				console.warn(
+					`Warning: subscribing to an event that already happened. Re: ${eventStr}`
+				);
+			}
+
 			if (flags.recoup) {
+				if (this.options.strict) {
+					console.warn(
+						`recoup() is deprecated; please find an alternative. Re: ${eventStr}`
+					);
+				}
+
 				oldArgs = this._pubsubHappened[event];
 				if (oldArgs) {
 					method.apply(thisArg || this, oldArgs);

From b305af97e08e7757cb6eb43c4613396513888a48 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 18:13:15 +0300
Subject: [PATCH 10/22] Fixes typo

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

diff --git a/src/pubsub.js b/src/pubsub.js
index 21f1359..382e49c 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -1,5 +1,5 @@
 class pubsub {
-	constructor(options) {
+	constructor(options = {}) {
 		this.options = options;
 		this._pubsubEvents = {};
 		this._pubsubHappened = {};

From 7eb2a2f874122d53519c93417f69dc692bc52030 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 18:13:31 +0300
Subject: [PATCH 11/22] v0.2.2

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index a9ad5d8..1424b64 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.1",
+	"version": "0.2.2",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From d9c90d78a323723e46c4921d67556cc9da2f974c Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 19:10:15 +0300
Subject: [PATCH 12/22] v0.2.3

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 1424b64..a07c74b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.2",
+	"version": "0.2.3",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From 2f6a3b4f9e8d66b863488cc6a631b49cdf7b64ef Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Tue, 4 Sep 2018 19:10:27 +0300
Subject: [PATCH 13/22] Adds log option

---
 rollup.config.js | 12 ++++++++++--
 src/pubsub.js    | 21 +++++++++++++++++++--
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/rollup.config.js b/rollup.config.js
index fd90204..12f4abf 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -9,7 +9,11 @@ export default [
 			name: 'pubsub',
 			file: pkg.main
 		},
-		plugins: [buble()]
+		plugins: [
+			buble({
+				objectAssign: 'Object.assign'
+			})
+		]
 	},
 	{
 		input: 'src/pubsub.js',
@@ -17,6 +21,10 @@ export default [
 			format: 'es',
 			file: pkg.module
 		},
-		plugins: [buble()]
+		plugins: [
+			buble({
+				objectAssign: 'Object.assign'
+			})
+		]
 	}
 ];
diff --git a/src/pubsub.js b/src/pubsub.js
index 382e49c..ca1c103 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -1,6 +1,18 @@
 class pubsub {
-	constructor(options = {}) {
-		this.options = options;
+	constructor(options) {
+		this.options = {
+			/*
+				Enables strict mode (shows more warnings)
+			 */
+			strict: false,
+
+			/*
+				Accepts a custom logger
+			 */
+			log: false,
+
+			...options
+		};
 		this._pubsubEvents = {};
 		this._pubsubHappened = {};
 	}
@@ -31,6 +43,11 @@ class pubsub {
 			for (j = 1; j < arguments.length; j++) {
 				args.push(arguments[j]);
 			}
+
+			if (this.options.log) {
+				this.options.log(event, args);
+			}
+
 			for (j = 0, jlen = eventArray.length; j < jlen; j++) {
 				subscriber = eventArray[j];
 				ret = subscriber[0].apply(subscriber[1] || this, args);

From 59f3efb645d76f5c3edadb53f00bcef10a3204ea Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Wed, 5 Sep 2018 08:09:58 +0300
Subject: [PATCH 14/22] v0.2.4

---
 README.md     | 52 ++++++++++++++++++++++++++++++++++++++++++++++-----
 package.json  |  2 +-
 src/pubsub.js | 21 +++++++++++++--------
 3 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index cb9f46f..e51b9ae 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,50 @@
-pubsub
-======
+# pubsub
 
-`pubsub` is a small, fast\* JavaScript library that implements the [Publish/Subscribe](http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) pattern for web applications. Details here: http://danburzo.github.io/pubsub
+`pubsub` is a small, fast JavaScript library that implements [Publish/Subscribe](http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) pattern for web applications.
 
-It's forked from [AppSeeds](http://github.com/danburzo/appseeds).
+## Usage
 
-\* [Benchmark test](http://jsperf.com/pubish-subscribe-performance).
\ No newline at end of file
+```js
+npm install --save @evercoder/pubsub
+```
+
+## API Reference
+
+§ **new pubsub**(_options_) creates a new message bus.
+
+Available options:
+
+-   **strict**: (Boolean, default `false`) deprecates some ways of using `pubsub` that we found were promoting error-prone code patterns and restricts the message bus to a subset of its API. See [Strict Mode](#strict-mode).
+
+```js
+import pubsub from '@evercoder/pubsub';
+
+let bus = new pubsub();
+```
+
+§ bus.**pub**(_event_, _payload_, ..._additional_args_) — publish an event.
+
+§ bus.**sub**(_event(s)_, _callback_, _thisArg_, _options_) — subscribe a callback to an event.
+
+Available options:
+
+-   **once** (Boolean, default `false`) whether the callback should unsubscribe itself from the event after being called once.
+-   **recoup** (Boolean, default `false`) whether the callback should be immediately executed if the event already happened before the subscription.
+
+§ bus.**recoup**(_event_, _callback_, _thisArg_) is a shortcut for calling `sub()` with the `recoup: true` option.
+
+§ bus.**once**(_event_, _callback_, _thisArg_) is a shortcut for calling `once()` with the `once: true` option.
+
+§ bus.**unsub**(_event_, _callback_) — unsubscribe a callback from an event.
+
+When _callback_ is omitted, all _callbacks_ on that particular event are unsubscribed.
+
+## Strict mode
+
+In strict mode, the following patterns log a warning:
+
+-   `pub()`-ing an event with multiple arguments; use a single argument for the payload. Will allow us to make the library faster in a future version by leveraging the browser's function optimization.
+-   `sub()`-ing to multiple events via a space-separated string; instead, you can send an array of events.
+-   `sub()`: using `thisArg`; instead, bind the listener manually with `bind()` or using an arrow function.
+-   `recoup()`: using it in any way;
+-   `unsub()` called without a listener; The default behavior here (unsubscribing _all_ listeners from the event) may cause hard-to-trace bugs.
diff --git a/package.json b/package.json
index a07c74b..5a13155 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.3",
+	"version": "0.2.4",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,
diff --git a/src/pubsub.js b/src/pubsub.js
index ca1c103..e932daa 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -29,9 +29,9 @@ class pubsub {
 			throw new Error('pubsub.pub() received empty event string');
 		}
 
-		if (arguments.length > 2) {
+		if (this.options.strict && arguments.length > 2) {
 			console.warn(
-				`[Deprecated]: Publishing an event with multiple arguments is deprecated. Re: ${eventString}`
+				`[Deprecated] pub(): Publishing an event with many arguments is deprecated; use a single argument for the payload. Re: ${eventString}`
 			);
 		}
 
@@ -78,9 +78,9 @@ class pubsub {
 			throw new Error('pubsub.sub() received empty event string');
 		}
 
-		if (thisArg) {
+		if (thisArg && this.options.strict) {
 			console.warn(
-				`sub(): thisArg is deprecated, please bind your method manually. Re: ${eventStr}`
+				`[Deprecated] sub(): thisArg is deprecated; bind method manually instead. Re: ${eventStr}`
 			);
 		}
 
@@ -90,9 +90,9 @@ class pubsub {
 			events = eventStr;
 		} else {
 			events = eventStr.split(/\s+/);
-			if (events.length > 1) {
+			if (this.options.strict && events.length > 1) {
 				console.warn(
-					`Subscribing to space-separated events is deprecated; please use an array of events. Re: ${eventStr}`
+					`[Deprecated] sub(): Subscribing to space-separated events is deprecated; use Array instead. Re: ${eventStr}`
 				);
 			}
 		}
@@ -110,14 +110,14 @@ class pubsub {
 
 			if (this.options.strict && this._pubsubHappened[event]) {
 				console.warn(
-					`Warning: subscribing to an event that already happened. Re: ${eventStr}`
+					`[Warn] Subscribing to an event that already happened. Re: ${eventStr}`
 				);
 			}
 
 			if (flags.recoup) {
 				if (this.options.strict) {
 					console.warn(
-						`recoup() is deprecated; please find an alternative. Re: ${eventStr}`
+						`[Deprecated] recoup(): this method is deprecated; please consider an alternative pattern. Re: ${eventStr}`
 					);
 				}
 
@@ -143,6 +143,11 @@ class pubsub {
 		if (!eventStr) {
 			throw new Error('pubsub.unsub() received empty event string');
 		}
+
+		if (this.options.strict && !method) {
+			console.warn(`[Deprecated] unsub(): called without a listener. Re: ${eventStr}`);
+		}
+
 		var events = eventStr.split(/\s+/),
 			event,
 			eventArray,

From 8dde97d6fecf7c0f2536402a0841703c5b5bc06f Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Wed, 5 Sep 2018 08:38:00 +0300
Subject: [PATCH 15/22] Adds more details to Strict Mode

---
 README.md | 86 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 74 insertions(+), 12 deletions(-)

diff --git a/README.md b/README.md
index e51b9ae..aea9d56 100644
--- a/README.md
+++ b/README.md
@@ -24,27 +24,89 @@ let bus = new pubsub();
 
 § bus.**pub**(_event_, _payload_, ..._additional_args_) — publish an event.
 
-§ bus.**sub**(_event(s)_, _callback_, _thisArg_, _options_) — subscribe a callback to an event.
+```js
+bus.pub('my-event', {
+	myprop: myvalue
+});
+```
+
+All `pub()` arguments after the event are forwarded as-is as arguments to the listeners.
+
+**Note:** Although the library supports multiple arguments, we plan to [deprecate this feature](#strict-mode).
+
+§ bus.**sub**(_event(s)_, _listener_, _thisArg_, _options_) — subscribe a listener to an event.
+
+```js
+bus.sub('my-event', function(payload) {
+	console.log(payload.myrop);
+	// ⇒ myvalue
+});
+```
 
 Available options:
 
--   **once** (Boolean, default `false`) whether the callback should unsubscribe itself from the event after being called once.
--   **recoup** (Boolean, default `false`) whether the callback should be immediately executed if the event already happened before the subscription.
+-   **once** (Boolean, default `false`) whether the listener should unsubscribe itself from the event after being called once.
+-   👎 **recoup** (Boolean, default `false`) whether the listener should be immediately executed if the event already happened before the subscription.
 
-§ bus.**recoup**(_event_, _callback_, _thisArg_) is a shortcut for calling `sub()` with the `recoup: true` option.
+§ 👎 bus.**recoup**(_event_, _listener_, _thisArg_) is a shortcut for calling `sub()` with the `recoup: true` option.
 
-§ bus.**once**(_event_, _callback_, _thisArg_) is a shortcut for calling `once()` with the `once: true` option.
+**Note:** This option [will be deprecated](#strict-mode).
 
-§ bus.**unsub**(_event_, _callback_) — unsubscribe a callback from an event.
+§ bus.**once**(_event_, _listener_, _thisArg_) is a shortcut for calling `once()` with the `once: true` option.
 
-When _callback_ is omitted, all _callbacks_ on that particular event are unsubscribed.
+§ bus.**unsub**(_event_, _listener_) — unsubscribe a listener from an event.
+
+**Note:** Currently, when _listener_ is omitted, all listeners on that particular event are unsubscribed. We plan to [deprecate this feature](#strict-mode).
 
 ## Strict mode
 
 In strict mode, the following patterns log a warning:
 
--   `pub()`-ing an event with multiple arguments; use a single argument for the payload. Will allow us to make the library faster in a future version by leveraging the browser's function optimization.
--   `sub()`-ing to multiple events via a space-separated string; instead, you can send an array of events.
--   `sub()`: using `thisArg`; instead, bind the listener manually with `bind()` or using an arrow function.
--   `recoup()`: using it in any way;
--   `unsub()` called without a listener; The default behavior here (unsubscribing _all_ listeners from the event) may cause hard-to-trace bugs.
+#### `pub()`-ing an event with multiple arguments
+
+> Always use a single argument for the payload.
+
+Handling multiple arguments means the library needs to manipulate the `arguments` object to properly forward them to the listeners. Renouncing this will allow us to make a faster library by leveraging browser code optimizations.
+
+#### `sub()`-ing to multiple events via a space-separated string
+
+> Always use an _array_ of events as the first argument to subscribe to many events at once.
+
+A previous version of the library did not support arrays and used space-separated strings. When using statically analyzable event names, it made you use an awkward construct:
+
+```js
+bus.sub([EVENT_A, EVENT_B].join(''), function() { ... });
+```
+
+#### `sub()`: using `thisArg`;
+
+> Instead, bind the listener manually with `bind()` or using an arrow function.
+
+```js
+bus.sub(
+	'myevent',
+	function() {
+		this.doSomething();
+	}.bind(this)
+);
+
+// or
+
+bus.sub('myevent', () => {
+	this.doSomething();
+});
+```
+
+Storing `thisArg` in the `pubsub` instance may create memory leaks.
+
+#### Using `recoup()`
+
+> Find an alternative where you can use a simple `sub()`.
+
+Similar to storing `thisArg` for `sub()`, storing the arguments with which `pub` was called, so that listeners could listen to that event retroactively, can create memory leaks or subtle inconsistencies in state.
+
+#### `unsub()` called without a listener
+
+> Always provide the listener you wish to unsubscribe.
+
+The default behavior here (unsubscribing _all_ listeners from the event) may cause hard-to-trace bugs if `unsub()` silently receives an undefined reference to a listener.

From 6a820668d31f7b4b1da59ce6a23fdc612e5c916d Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Wed, 5 Sep 2018 09:28:30 +0300
Subject: [PATCH 16/22] v0.2.5

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 5a13155..7c45069 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.4",
+	"version": "0.2.5",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From 046a4d9fca209f81022d06644a8b4330aa0b04c3 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Wed, 5 Sep 2018 09:28:47 +0300
Subject: [PATCH 17/22] Throw on sub without listener; log pub/sub/unsub

---
 README.md     |  2 +-
 src/pubsub.js | 18 +++++++++++++++---
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index aea9d56..866f450 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # pubsub
 
-`pubsub` is a small, fast JavaScript library that implements [Publish/Subscribe](http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) pattern for web applications.
+`pubsub` is a small, fast JavaScript library that implements the [Publish/Subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) pattern for web applications.
 
 ## Usage
 
diff --git a/src/pubsub.js b/src/pubsub.js
index e932daa..3e4d609 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -45,7 +45,7 @@ class pubsub {
 			}
 
 			if (this.options.log) {
-				this.options.log(event, args);
+				this.options.log('pub', event, args);
 			}
 
 			for (j = 0, jlen = eventArray.length; j < jlen; j++) {
@@ -75,15 +75,23 @@ class pubsub {
 	*/
 	sub(eventStr, method, thisArg, flags) {
 		if (!eventStr) {
-			throw new Error('pubsub.sub() received empty event string');
+			throw new Error('sub(): received empty event string');
 		}
 
-		if (thisArg && this.options.strict) {
+		if (!method) {
+			throw new Error('sub(): listener is undefined');
+		}
+
+		if (this.options.strict && thisArg) {
 			console.warn(
 				`[Deprecated] sub(): thisArg is deprecated; bind method manually instead. Re: ${eventStr}`
 			);
 		}
 
+		if (this.options.log) {
+			this.options.log('sub', eventStr, method, flags);
+		}
+
 		var events;
 
 		if (Array.isArray(eventStr)) {
@@ -148,6 +156,10 @@ class pubsub {
 			console.warn(`[Deprecated] unsub(): called without a listener. Re: ${eventStr}`);
 		}
 
+		if (this.options.log) {
+			this.options.log('unsub', eventStr, method, flags);
+		}
+
 		var events = eventStr.split(/\s+/),
 			event,
 			eventArray,

From cb09a76eea0ef2fb25eaa4951e411275faa77e95 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Wed, 5 Sep 2018 09:31:22 +0300
Subject: [PATCH 18/22] v0.2.6

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 7c45069..b6e6aa6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.5",
+	"version": "0.2.6",
 	"main": "dist/pubsub.umd.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From 1fe6219589d72ca2fb6672bfb18c9b10b272b992 Mon Sep 17 00:00:00 2001
From: Dan Burzo <danburzo@gmail.com>
Date: Wed, 5 Sep 2018 09:31:42 +0300
Subject: [PATCH 19/22] Fixes typo

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

diff --git a/src/pubsub.js b/src/pubsub.js
index 3e4d609..2918beb 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -157,7 +157,7 @@ class pubsub {
 		}
 
 		if (this.options.log) {
-			this.options.log('unsub', eventStr, method, flags);
+			this.options.log('unsub', eventStr, method);
 		}
 
 		var events = eventStr.split(/\s+/),

From a468beb460f8a034e7444751cb5d32e4a3402065 Mon Sep 17 00:00:00 2001
From: Dan Burzo <dan@danburzo.ro>
Date: Tue, 3 Aug 2021 23:38:49 +0300
Subject: [PATCH 20/22] Modernize deps; allow unsub() array

---
 package-lock.json | 1964 +++++++++++++++++++++++++++++++++++++++++++++
 package.json      |   17 +-
 rollup.config.js  |   30 -
 src/pubsub.js     |   16 +-
 test/tests.js     |   22 +-
 yarn.lock         |  694 ----------------
 6 files changed, 1999 insertions(+), 744 deletions(-)
 create mode 100644 package-lock.json
 delete mode 100644 rollup.config.js
 delete mode 100644 yarn.lock

diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..e90c07c
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1964 @@
+{
+	"name": "@evercoder/pubsub",
+	"version": "0.2.6",
+	"lockfileVersion": 2,
+	"requires": true,
+	"packages": {
+		"": {
+			"name": "@evercoder/pubsub",
+			"version": "0.2.6",
+			"devDependencies": {
+				"esbuild": "^0.12.17",
+				"esm": "^3.2.25",
+				"husky": "^0.14.3",
+				"prettier": "^1.13.7",
+				"pretty-quick": "^1.6.0",
+				"tape": "^4.9.1"
+			}
+		},
+		"node_modules/ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"dev": true,
+			"dependencies": {
+				"color-convert": "^1.9.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/array-differ": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz",
+			"integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==",
+			"dev": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/array-union": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+			"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+			"dev": true,
+			"dependencies": {
+				"array-uniq": "^1.0.1"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/array-uniq": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+			"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/arrify": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+			"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/balanced-match": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+			"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+			"dev": true
+		},
+		"node_modules/brace-expansion": {
+			"version": "1.1.11",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"dev": true,
+			"dependencies": {
+				"balanced-match": "^1.0.0",
+				"concat-map": "0.0.1"
+			}
+		},
+		"node_modules/call-bind": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+			"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+			"dev": true,
+			"dependencies": {
+				"function-bind": "^1.1.1",
+				"get-intrinsic": "^1.0.2"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"dev": true,
+			"dependencies": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/ci-info": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+			"integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+			"dev": true
+		},
+		"node_modules/color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"dev": true,
+			"dependencies": {
+				"color-name": "1.1.3"
+			}
+		},
+		"node_modules/color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+			"dev": true
+		},
+		"node_modules/concat-map": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+			"dev": true
+		},
+		"node_modules/cross-spawn": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+			"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+			"dev": true,
+			"dependencies": {
+				"lru-cache": "^4.0.1",
+				"shebang-command": "^1.2.0",
+				"which": "^1.2.9"
+			}
+		},
+		"node_modules/deep-equal": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+			"integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+			"dev": true,
+			"dependencies": {
+				"is-arguments": "^1.0.4",
+				"is-date-object": "^1.0.1",
+				"is-regex": "^1.0.4",
+				"object-is": "^1.0.1",
+				"object-keys": "^1.1.1",
+				"regexp.prototype.flags": "^1.2.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/define-properties": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+			"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+			"dev": true,
+			"dependencies": {
+				"object-keys": "^1.0.12"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/defined": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+			"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+			"dev": true
+		},
+		"node_modules/dotignore": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
+			"integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
+			"dev": true,
+			"dependencies": {
+				"minimatch": "^3.0.4"
+			},
+			"bin": {
+				"ignored": "bin/ignored"
+			}
+		},
+		"node_modules/es-abstract": {
+			"version": "1.18.5",
+			"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
+			"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"es-to-primitive": "^1.2.1",
+				"function-bind": "^1.1.1",
+				"get-intrinsic": "^1.1.1",
+				"has": "^1.0.3",
+				"has-symbols": "^1.0.2",
+				"internal-slot": "^1.0.3",
+				"is-callable": "^1.2.3",
+				"is-negative-zero": "^2.0.1",
+				"is-regex": "^1.1.3",
+				"is-string": "^1.0.6",
+				"object-inspect": "^1.11.0",
+				"object-keys": "^1.1.1",
+				"object.assign": "^4.1.2",
+				"string.prototype.trimend": "^1.0.4",
+				"string.prototype.trimstart": "^1.0.4",
+				"unbox-primitive": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/es-to-primitive": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+			"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+			"dev": true,
+			"dependencies": {
+				"is-callable": "^1.1.4",
+				"is-date-object": "^1.0.1",
+				"is-symbol": "^1.0.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/esbuild": {
+			"version": "0.12.17",
+			"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.17.tgz",
+			"integrity": "sha512-GshKJyVYUnlSXIZj/NheC2O0Kblh42CS7P1wJyTbbIHevTG4jYMS9NNw8EOd8dDWD0dzydYHS01MpZoUcQXB4g==",
+			"dev": true,
+			"hasInstallScript": true,
+			"bin": {
+				"esbuild": "bin/esbuild"
+			}
+		},
+		"node_modules/escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.8.0"
+			}
+		},
+		"node_modules/esm": {
+			"version": "3.2.25",
+			"resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+			"integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+			"dev": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/execa": {
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+			"integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+			"dev": true,
+			"dependencies": {
+				"cross-spawn": "^5.0.1",
+				"get-stream": "^3.0.0",
+				"is-stream": "^1.1.0",
+				"npm-run-path": "^2.0.0",
+				"p-finally": "^1.0.0",
+				"signal-exit": "^3.0.0",
+				"strip-eof": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/find-up": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+			"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+			"dev": true,
+			"dependencies": {
+				"locate-path": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/for-each": {
+			"version": "0.3.3",
+			"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+			"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+			"dev": true,
+			"dependencies": {
+				"is-callable": "^1.1.3"
+			}
+		},
+		"node_modules/fs.realpath": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+			"dev": true
+		},
+		"node_modules/function-bind": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+			"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+			"dev": true
+		},
+		"node_modules/get-intrinsic": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+			"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+			"dev": true,
+			"dependencies": {
+				"function-bind": "^1.1.1",
+				"has": "^1.0.3",
+				"has-symbols": "^1.0.1"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/get-stream": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+			"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/glob": {
+			"version": "7.1.7",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+			"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+			"dev": true,
+			"dependencies": {
+				"fs.realpath": "^1.0.0",
+				"inflight": "^1.0.4",
+				"inherits": "2",
+				"minimatch": "^3.0.4",
+				"once": "^1.3.0",
+				"path-is-absolute": "^1.0.0"
+			},
+			"engines": {
+				"node": "*"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/has": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+			"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+			"dev": true,
+			"dependencies": {
+				"function-bind": "^1.1.1"
+			},
+			"engines": {
+				"node": ">= 0.4.0"
+			}
+		},
+		"node_modules/has-bigints": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+			"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+			"dev": true,
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/has-symbols": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+			"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/husky": {
+			"version": "0.14.3",
+			"resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
+			"integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==",
+			"dev": true,
+			"hasInstallScript": true,
+			"dependencies": {
+				"is-ci": "^1.0.10",
+				"normalize-path": "^1.0.0",
+				"strip-indent": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/ignore": {
+			"version": "3.3.10",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+			"integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+			"dev": true
+		},
+		"node_modules/inflight": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"dev": true,
+			"dependencies": {
+				"once": "^1.3.0",
+				"wrappy": "1"
+			}
+		},
+		"node_modules/inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"dev": true
+		},
+		"node_modules/internal-slot": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+			"integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+			"dev": true,
+			"dependencies": {
+				"get-intrinsic": "^1.1.0",
+				"has": "^1.0.3",
+				"side-channel": "^1.0.4"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/is-arguments": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+			"integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-bigint": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+			"integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
+			"dev": true,
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-boolean-object": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+			"integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-callable": {
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+			"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-ci": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+			"integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+			"dev": true,
+			"dependencies": {
+				"ci-info": "^1.5.0"
+			},
+			"bin": {
+				"is-ci": "bin.js"
+			}
+		},
+		"node_modules/is-core-module": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz",
+			"integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==",
+			"dev": true,
+			"dependencies": {
+				"has": "^1.0.3"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-date-object": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
+			"integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-negative-zero": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+			"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-number-object": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+			"integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-regex": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+			"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"has-symbols": "^1.0.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-stream": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+			"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/is-string": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+			"integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/is-symbol": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+			"integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+			"dev": true,
+			"dependencies": {
+				"has-symbols": "^1.0.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/isexe": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+			"dev": true
+		},
+		"node_modules/locate-path": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+			"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+			"dev": true,
+			"dependencies": {
+				"p-locate": "^2.0.0",
+				"path-exists": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/lru-cache": {
+			"version": "4.1.5",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+			"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+			"dev": true,
+			"dependencies": {
+				"pseudomap": "^1.0.2",
+				"yallist": "^2.1.2"
+			}
+		},
+		"node_modules/minimatch": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"dev": true,
+			"dependencies": {
+				"brace-expansion": "^1.1.7"
+			},
+			"engines": {
+				"node": "*"
+			}
+		},
+		"node_modules/minimist": {
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+			"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+			"dev": true
+		},
+		"node_modules/mri": {
+			"version": "1.1.6",
+			"resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
+			"integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/multimatch": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz",
+			"integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==",
+			"dev": true,
+			"dependencies": {
+				"array-differ": "^2.0.3",
+				"array-union": "^1.0.2",
+				"arrify": "^1.0.1",
+				"minimatch": "^3.0.4"
+			},
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/normalize-path": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
+			"integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/npm-run-path": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+			"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+			"dev": true,
+			"dependencies": {
+				"path-key": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/object-inspect": {
+			"version": "1.11.0",
+			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+			"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+			"dev": true,
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/object-is": {
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+			"integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/object-keys": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+			"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/object.assign": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+			"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.0",
+				"define-properties": "^1.1.3",
+				"has-symbols": "^1.0.1",
+				"object-keys": "^1.1.1"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/once": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"dev": true,
+			"dependencies": {
+				"wrappy": "1"
+			}
+		},
+		"node_modules/p-finally": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+			"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/p-limit": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+			"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+			"dev": true,
+			"dependencies": {
+				"p-try": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/p-locate": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+			"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+			"dev": true,
+			"dependencies": {
+				"p-limit": "^1.1.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/p-try": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+			"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/path-exists": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+			"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/path-is-absolute": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/path-key": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+			"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/path-parse": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+			"dev": true
+		},
+		"node_modules/prettier": {
+			"version": "1.19.1",
+			"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+			"integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+			"dev": true,
+			"bin": {
+				"prettier": "bin-prettier.js"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/pretty-quick": {
+			"version": "1.11.1",
+			"resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.11.1.tgz",
+			"integrity": "sha512-kSXCkcETfak7EQXz6WOkCeCqpbC4GIzrN/vaneTGMP/fAtD8NerA9bPhCUqHAks1geo7biZNl5uEMPceeneLuA==",
+			"dev": true,
+			"dependencies": {
+				"chalk": "^2.3.0",
+				"execa": "^0.8.0",
+				"find-up": "^2.1.0",
+				"ignore": "^3.3.7",
+				"mri": "^1.1.0",
+				"multimatch": "^3.0.0"
+			},
+			"bin": {
+				"pretty-quick": "bin/pretty-quick.js"
+			},
+			"peerDependencies": {
+				"prettier": ">=1.8.0"
+			}
+		},
+		"node_modules/pseudomap": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+			"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+			"dev": true
+		},
+		"node_modules/regexp.prototype.flags": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+			"integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/resolve": {
+			"version": "1.20.0",
+			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+			"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+			"dev": true,
+			"dependencies": {
+				"is-core-module": "^2.2.0",
+				"path-parse": "^1.0.6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/resumer": {
+			"version": "0.0.0",
+			"resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
+			"integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
+			"dev": true,
+			"dependencies": {
+				"through": "~2.3.4"
+			}
+		},
+		"node_modules/shebang-command": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+			"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+			"dev": true,
+			"dependencies": {
+				"shebang-regex": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/shebang-regex": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+			"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/side-channel": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+			"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.0",
+				"get-intrinsic": "^1.0.2",
+				"object-inspect": "^1.9.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/signal-exit": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+			"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+			"dev": true
+		},
+		"node_modules/string.prototype.trim": {
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz",
+			"integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.18.0-next.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/string.prototype.trimend": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+			"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/string.prototype.trimstart": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+			"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/strip-eof": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+			"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/strip-indent": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+			"integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+			"dev": true,
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/supports-color": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+			"dev": true,
+			"dependencies": {
+				"has-flag": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/tape": {
+			"version": "4.14.0",
+			"resolved": "https://registry.npmjs.org/tape/-/tape-4.14.0.tgz",
+			"integrity": "sha512-z0+WrUUJuG6wIdWrl4W3rTte2CR26G6qcPOj3w1hfRdcmhF3kHBhOBW9VHsPVAkz08ZmGzp7phVpDupbLzrYKQ==",
+			"dev": true,
+			"dependencies": {
+				"call-bind": "~1.0.2",
+				"deep-equal": "~1.1.1",
+				"defined": "~1.0.0",
+				"dotignore": "~0.1.2",
+				"for-each": "~0.3.3",
+				"glob": "~7.1.7",
+				"has": "~1.0.3",
+				"inherits": "~2.0.4",
+				"is-regex": "~1.1.3",
+				"minimist": "~1.2.5",
+				"object-inspect": "~1.11.0",
+				"resolve": "~1.20.0",
+				"resumer": "~0.0.0",
+				"string.prototype.trim": "~1.2.4",
+				"through": "~2.3.8"
+			},
+			"bin": {
+				"tape": "bin/tape"
+			}
+		},
+		"node_modules/through": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+			"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+			"dev": true
+		},
+		"node_modules/unbox-primitive": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+			"integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+			"dev": true,
+			"dependencies": {
+				"function-bind": "^1.1.1",
+				"has-bigints": "^1.0.1",
+				"has-symbols": "^1.0.2",
+				"which-boxed-primitive": "^1.0.2"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/which": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+			"dev": true,
+			"dependencies": {
+				"isexe": "^2.0.0"
+			},
+			"bin": {
+				"which": "bin/which"
+			}
+		},
+		"node_modules/which-boxed-primitive": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+			"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+			"dev": true,
+			"dependencies": {
+				"is-bigint": "^1.0.1",
+				"is-boolean-object": "^1.1.0",
+				"is-number-object": "^1.0.4",
+				"is-string": "^1.0.5",
+				"is-symbol": "^1.0.3"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/wrappy": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+			"dev": true
+		},
+		"node_modules/yallist": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+			"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+			"dev": true
+		}
+	},
+	"dependencies": {
+		"ansi-styles": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+			"dev": true,
+			"requires": {
+				"color-convert": "^1.9.0"
+			}
+		},
+		"array-differ": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz",
+			"integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==",
+			"dev": true
+		},
+		"array-union": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+			"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+			"dev": true,
+			"requires": {
+				"array-uniq": "^1.0.1"
+			}
+		},
+		"array-uniq": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+			"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+			"dev": true
+		},
+		"arrify": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+			"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+			"dev": true
+		},
+		"balanced-match": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+			"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+			"dev": true
+		},
+		"brace-expansion": {
+			"version": "1.1.11",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"dev": true,
+			"requires": {
+				"balanced-match": "^1.0.0",
+				"concat-map": "0.0.1"
+			}
+		},
+		"call-bind": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+			"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+			"dev": true,
+			"requires": {
+				"function-bind": "^1.1.1",
+				"get-intrinsic": "^1.0.2"
+			}
+		},
+		"chalk": {
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"dev": true,
+			"requires": {
+				"ansi-styles": "^3.2.1",
+				"escape-string-regexp": "^1.0.5",
+				"supports-color": "^5.3.0"
+			}
+		},
+		"ci-info": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+			"integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+			"dev": true
+		},
+		"color-convert": {
+			"version": "1.9.3",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+			"dev": true,
+			"requires": {
+				"color-name": "1.1.3"
+			}
+		},
+		"color-name": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+			"dev": true
+		},
+		"concat-map": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+			"dev": true
+		},
+		"cross-spawn": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+			"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+			"dev": true,
+			"requires": {
+				"lru-cache": "^4.0.1",
+				"shebang-command": "^1.2.0",
+				"which": "^1.2.9"
+			}
+		},
+		"deep-equal": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+			"integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+			"dev": true,
+			"requires": {
+				"is-arguments": "^1.0.4",
+				"is-date-object": "^1.0.1",
+				"is-regex": "^1.0.4",
+				"object-is": "^1.0.1",
+				"object-keys": "^1.1.1",
+				"regexp.prototype.flags": "^1.2.0"
+			}
+		},
+		"define-properties": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+			"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+			"dev": true,
+			"requires": {
+				"object-keys": "^1.0.12"
+			}
+		},
+		"defined": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+			"integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+			"dev": true
+		},
+		"dotignore": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
+			"integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
+			"dev": true,
+			"requires": {
+				"minimatch": "^3.0.4"
+			}
+		},
+		"es-abstract": {
+			"version": "1.18.5",
+			"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
+			"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"es-to-primitive": "^1.2.1",
+				"function-bind": "^1.1.1",
+				"get-intrinsic": "^1.1.1",
+				"has": "^1.0.3",
+				"has-symbols": "^1.0.2",
+				"internal-slot": "^1.0.3",
+				"is-callable": "^1.2.3",
+				"is-negative-zero": "^2.0.1",
+				"is-regex": "^1.1.3",
+				"is-string": "^1.0.6",
+				"object-inspect": "^1.11.0",
+				"object-keys": "^1.1.1",
+				"object.assign": "^4.1.2",
+				"string.prototype.trimend": "^1.0.4",
+				"string.prototype.trimstart": "^1.0.4",
+				"unbox-primitive": "^1.0.1"
+			}
+		},
+		"es-to-primitive": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+			"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+			"dev": true,
+			"requires": {
+				"is-callable": "^1.1.4",
+				"is-date-object": "^1.0.1",
+				"is-symbol": "^1.0.2"
+			}
+		},
+		"esbuild": {
+			"version": "0.12.17",
+			"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.17.tgz",
+			"integrity": "sha512-GshKJyVYUnlSXIZj/NheC2O0Kblh42CS7P1wJyTbbIHevTG4jYMS9NNw8EOd8dDWD0dzydYHS01MpZoUcQXB4g==",
+			"dev": true
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true
+		},
+		"esm": {
+			"version": "3.2.25",
+			"resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+			"integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+			"dev": true
+		},
+		"execa": {
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+			"integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+			"dev": true,
+			"requires": {
+				"cross-spawn": "^5.0.1",
+				"get-stream": "^3.0.0",
+				"is-stream": "^1.1.0",
+				"npm-run-path": "^2.0.0",
+				"p-finally": "^1.0.0",
+				"signal-exit": "^3.0.0",
+				"strip-eof": "^1.0.0"
+			}
+		},
+		"find-up": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+			"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+			"dev": true,
+			"requires": {
+				"locate-path": "^2.0.0"
+			}
+		},
+		"for-each": {
+			"version": "0.3.3",
+			"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+			"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+			"dev": true,
+			"requires": {
+				"is-callable": "^1.1.3"
+			}
+		},
+		"fs.realpath": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+			"dev": true
+		},
+		"function-bind": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+			"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+			"dev": true
+		},
+		"get-intrinsic": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+			"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+			"dev": true,
+			"requires": {
+				"function-bind": "^1.1.1",
+				"has": "^1.0.3",
+				"has-symbols": "^1.0.1"
+			}
+		},
+		"get-stream": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+			"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+			"dev": true
+		},
+		"glob": {
+			"version": "7.1.7",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+			"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+			"dev": true,
+			"requires": {
+				"fs.realpath": "^1.0.0",
+				"inflight": "^1.0.4",
+				"inherits": "2",
+				"minimatch": "^3.0.4",
+				"once": "^1.3.0",
+				"path-is-absolute": "^1.0.0"
+			}
+		},
+		"has": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+			"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+			"dev": true,
+			"requires": {
+				"function-bind": "^1.1.1"
+			}
+		},
+		"has-bigints": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+			"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+			"dev": true
+		},
+		"has-flag": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+			"dev": true
+		},
+		"has-symbols": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+			"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+			"dev": true
+		},
+		"husky": {
+			"version": "0.14.3",
+			"resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz",
+			"integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==",
+			"dev": true,
+			"requires": {
+				"is-ci": "^1.0.10",
+				"normalize-path": "^1.0.0",
+				"strip-indent": "^2.0.0"
+			}
+		},
+		"ignore": {
+			"version": "3.3.10",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+			"integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+			"dev": true
+		},
+		"inflight": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"dev": true,
+			"requires": {
+				"once": "^1.3.0",
+				"wrappy": "1"
+			}
+		},
+		"inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"dev": true
+		},
+		"internal-slot": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+			"integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+			"dev": true,
+			"requires": {
+				"get-intrinsic": "^1.1.0",
+				"has": "^1.0.3",
+				"side-channel": "^1.0.4"
+			}
+		},
+		"is-arguments": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+			"integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.0"
+			}
+		},
+		"is-bigint": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+			"integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
+			"dev": true
+		},
+		"is-boolean-object": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+			"integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2"
+			}
+		},
+		"is-callable": {
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+			"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+			"dev": true
+		},
+		"is-ci": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+			"integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+			"dev": true,
+			"requires": {
+				"ci-info": "^1.5.0"
+			}
+		},
+		"is-core-module": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz",
+			"integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==",
+			"dev": true,
+			"requires": {
+				"has": "^1.0.3"
+			}
+		},
+		"is-date-object": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
+			"integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==",
+			"dev": true
+		},
+		"is-negative-zero": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+			"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+			"dev": true
+		},
+		"is-number-object": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+			"integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
+			"dev": true
+		},
+		"is-regex": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+			"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"has-symbols": "^1.0.2"
+			}
+		},
+		"is-stream": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+			"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+			"dev": true
+		},
+		"is-string": {
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+			"integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+			"dev": true
+		},
+		"is-symbol": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+			"integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+			"dev": true,
+			"requires": {
+				"has-symbols": "^1.0.2"
+			}
+		},
+		"isexe": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+			"dev": true
+		},
+		"locate-path": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+			"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+			"dev": true,
+			"requires": {
+				"p-locate": "^2.0.0",
+				"path-exists": "^3.0.0"
+			}
+		},
+		"lru-cache": {
+			"version": "4.1.5",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+			"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+			"dev": true,
+			"requires": {
+				"pseudomap": "^1.0.2",
+				"yallist": "^2.1.2"
+			}
+		},
+		"minimatch": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"dev": true,
+			"requires": {
+				"brace-expansion": "^1.1.7"
+			}
+		},
+		"minimist": {
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+			"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+			"dev": true
+		},
+		"mri": {
+			"version": "1.1.6",
+			"resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
+			"integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
+			"dev": true
+		},
+		"multimatch": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz",
+			"integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==",
+			"dev": true,
+			"requires": {
+				"array-differ": "^2.0.3",
+				"array-union": "^1.0.2",
+				"arrify": "^1.0.1",
+				"minimatch": "^3.0.4"
+			}
+		},
+		"normalize-path": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
+			"integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
+			"dev": true
+		},
+		"npm-run-path": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+			"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+			"dev": true,
+			"requires": {
+				"path-key": "^2.0.0"
+			}
+		},
+		"object-inspect": {
+			"version": "1.11.0",
+			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+			"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+			"dev": true
+		},
+		"object-is": {
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+			"integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			}
+		},
+		"object-keys": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+			"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+			"dev": true
+		},
+		"object.assign": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+			"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.0",
+				"define-properties": "^1.1.3",
+				"has-symbols": "^1.0.1",
+				"object-keys": "^1.1.1"
+			}
+		},
+		"once": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"dev": true,
+			"requires": {
+				"wrappy": "1"
+			}
+		},
+		"p-finally": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+			"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+			"dev": true
+		},
+		"p-limit": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+			"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+			"dev": true,
+			"requires": {
+				"p-try": "^1.0.0"
+			}
+		},
+		"p-locate": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+			"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+			"dev": true,
+			"requires": {
+				"p-limit": "^1.1.0"
+			}
+		},
+		"p-try": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+			"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+			"dev": true
+		},
+		"path-exists": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+			"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+			"dev": true
+		},
+		"path-is-absolute": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+			"dev": true
+		},
+		"path-key": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+			"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+			"dev": true
+		},
+		"path-parse": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+			"dev": true
+		},
+		"prettier": {
+			"version": "1.19.1",
+			"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+			"integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+			"dev": true
+		},
+		"pretty-quick": {
+			"version": "1.11.1",
+			"resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.11.1.tgz",
+			"integrity": "sha512-kSXCkcETfak7EQXz6WOkCeCqpbC4GIzrN/vaneTGMP/fAtD8NerA9bPhCUqHAks1geo7biZNl5uEMPceeneLuA==",
+			"dev": true,
+			"requires": {
+				"chalk": "^2.3.0",
+				"execa": "^0.8.0",
+				"find-up": "^2.1.0",
+				"ignore": "^3.3.7",
+				"mri": "^1.1.0",
+				"multimatch": "^3.0.0"
+			}
+		},
+		"pseudomap": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+			"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+			"dev": true
+		},
+		"regexp.prototype.flags": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+			"integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			}
+		},
+		"resolve": {
+			"version": "1.20.0",
+			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+			"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+			"dev": true,
+			"requires": {
+				"is-core-module": "^2.2.0",
+				"path-parse": "^1.0.6"
+			}
+		},
+		"resumer": {
+			"version": "0.0.0",
+			"resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
+			"integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
+			"dev": true,
+			"requires": {
+				"through": "~2.3.4"
+			}
+		},
+		"shebang-command": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+			"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+			"dev": true,
+			"requires": {
+				"shebang-regex": "^1.0.0"
+			}
+		},
+		"shebang-regex": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+			"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+			"dev": true
+		},
+		"side-channel": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+			"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.0",
+				"get-intrinsic": "^1.0.2",
+				"object-inspect": "^1.9.0"
+			}
+		},
+		"signal-exit": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+			"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+			"dev": true
+		},
+		"string.prototype.trim": {
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz",
+			"integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.18.0-next.2"
+			}
+		},
+		"string.prototype.trimend": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+			"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			}
+		},
+		"string.prototype.trimstart": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+			"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3"
+			}
+		},
+		"strip-eof": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+			"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+			"dev": true
+		},
+		"strip-indent": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+			"integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+			"dev": true
+		},
+		"supports-color": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+			"dev": true,
+			"requires": {
+				"has-flag": "^3.0.0"
+			}
+		},
+		"tape": {
+			"version": "4.14.0",
+			"resolved": "https://registry.npmjs.org/tape/-/tape-4.14.0.tgz",
+			"integrity": "sha512-z0+WrUUJuG6wIdWrl4W3rTte2CR26G6qcPOj3w1hfRdcmhF3kHBhOBW9VHsPVAkz08ZmGzp7phVpDupbLzrYKQ==",
+			"dev": true,
+			"requires": {
+				"call-bind": "~1.0.2",
+				"deep-equal": "~1.1.1",
+				"defined": "~1.0.0",
+				"dotignore": "~0.1.2",
+				"for-each": "~0.3.3",
+				"glob": "~7.1.7",
+				"has": "~1.0.3",
+				"inherits": "~2.0.4",
+				"is-regex": "~1.1.3",
+				"minimist": "~1.2.5",
+				"object-inspect": "~1.11.0",
+				"resolve": "~1.20.0",
+				"resumer": "~0.0.0",
+				"string.prototype.trim": "~1.2.4",
+				"through": "~2.3.8"
+			}
+		},
+		"through": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+			"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+			"dev": true
+		},
+		"unbox-primitive": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+			"integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+			"dev": true,
+			"requires": {
+				"function-bind": "^1.1.1",
+				"has-bigints": "^1.0.1",
+				"has-symbols": "^1.0.2",
+				"which-boxed-primitive": "^1.0.2"
+			}
+		},
+		"which": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+			"dev": true,
+			"requires": {
+				"isexe": "^2.0.0"
+			}
+		},
+		"which-boxed-primitive": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+			"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+			"dev": true,
+			"requires": {
+				"is-bigint": "^1.0.1",
+				"is-boolean-object": "^1.1.0",
+				"is-number-object": "^1.0.4",
+				"is-string": "^1.0.5",
+				"is-symbol": "^1.0.3"
+			}
+		},
+		"wrappy": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+			"dev": true
+		},
+		"yallist": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+			"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+			"dev": true
+		}
+	}
+}
diff --git a/package.json b/package.json
index b6e6aa6..1d538c0 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,25 @@
 {
 	"name": "@evercoder/pubsub",
 	"version": "0.2.6",
-	"main": "dist/pubsub.umd.js",
+	"main": "dist/pubsub.cjs.js",
 	"module": "dist/pubsub.js",
 	"private": false,
 	"devDependencies": {
+		"esbuild": "^0.12.17",
+		"esm": "^3.2.25",
 		"husky": "^0.14.3",
 		"prettier": "^1.13.7",
 		"pretty-quick": "^1.6.0",
-		"rollup": "^0.63.2",
-		"rollup-plugin-buble": "^0.19.2",
 		"tape": "^4.9.1"
 	},
+	"husky": {
+		"hooks": {
+			"pre-commit": "pretty-quick --staged"
+		}
+	},
 	"scripts": {
-		"precommit": "pretty-quick --staged",
-		"start": "rollup -c -w",
-		"build": "rollup -c",
-		"test": "yarn build && tape test/tests.js"
+		"build": "esbuild src/pubsub.js --format=cjs --outfile=dist/pubsub.cjs.js --minify && esbuild src/pubsub.js --format=esm --outfile=dist/pubsub.js --minify",
+		"test": "tape -r esm 'test/tests.js'"
 	},
 	"prettier": {
 		"bracketSpacing": true,
diff --git a/rollup.config.js b/rollup.config.js
deleted file mode 100644
index 12f4abf..0000000
--- a/rollup.config.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import pkg from './package.json';
-import buble from 'rollup-plugin-buble';
-
-export default [
-	{
-		input: 'src/pubsub.js',
-		output: {
-			format: 'umd',
-			name: 'pubsub',
-			file: pkg.main
-		},
-		plugins: [
-			buble({
-				objectAssign: 'Object.assign'
-			})
-		]
-	},
-	{
-		input: 'src/pubsub.js',
-		output: {
-			format: 'es',
-			file: pkg.module
-		},
-		plugins: [
-			buble({
-				objectAssign: 'Object.assign'
-			})
-		]
-	}
-];
diff --git a/src/pubsub.js b/src/pubsub.js
index 2918beb..4c2937a 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -160,8 +160,20 @@ class pubsub {
 			this.options.log('unsub', eventStr, method);
 		}
 
-		var events = eventStr.split(/\s+/),
-			event,
+		var events;
+
+		if (Array.isArray(eventStr)) {
+			events = eventStr;
+		} else {
+			events = eventStr.split(/\s+/);
+			if (this.options.strict && events.length > 1) {
+				console.warn(
+					`[Deprecated] unsub(): Unsubscribing to space-separated events is deprecated; use Array instead. Re: ${eventStr}`
+				);
+			}
+		}
+
+		var event,
 			eventArray,
 			newEventArray,
 			i,
diff --git a/test/tests.js b/test/tests.js
index 605ce8d..9e58cba 100644
--- a/test/tests.js
+++ b/test/tests.js
@@ -1,7 +1,7 @@
-let test = require('tape');
-let pubsub = require('../dist/pubsub.umd.js');
+import tape from 'tape';
+import pubsub from '../src/pubsub.js';
 
-test('PubSub basic use case', t => {
+tape('PubSub basic use case', t => {
 	t.plan(2);
 	var ps = new pubsub();
 	ps.sub('topic', function() {
@@ -26,7 +26,7 @@ test('PubSub basic use case', t => {
 	t.end();
 });
 
-test('PubSub.once()', t => {
+tape('PubSub.once()', t => {
 	t.plan(7);
 	var ps = new pubsub(),
 		ran = 0;
@@ -47,7 +47,7 @@ test('PubSub.once()', t => {
 	t.end();
 });
 
-test('PubSub.sub() to multiple events, .once() to multiple events', t => {
+tape('PubSub.sub() to multiple events, .once() to multiple events', t => {
 	t.plan(9);
 	var ps = new pubsub();
 	ps.sub('topic1 topic2 topic3', function() {
@@ -65,7 +65,7 @@ test('PubSub.sub() to multiple events, .once() to multiple events', t => {
 	t.end();
 });
 
-test('PubSub.unsub()', t => {
+tape('PubSub.unsub()', t => {
 	t.plan(2);
 	var ps = new pubsub();
 	var f = function() {
@@ -80,7 +80,7 @@ test('PubSub.unsub()', t => {
 	t.end();
 });
 
-test('PubSub.unsub() with non-subscribed method', t => {
+tape('PubSub.unsub() with non-subscribed method', t => {
 	t.plan(1);
 	var ps = new pubsub();
 	var f1 = function() {
@@ -95,7 +95,7 @@ test('PubSub.unsub() with non-subscribed method', t => {
 	t.end();
 });
 
-test('PubSub.unsub() with no method', t => {
+tape('PubSub.unsub() with no method', t => {
 	t.plan(0);
 	var ps = new pubsub();
 	var f1 = function() {
@@ -114,7 +114,7 @@ test('PubSub.unsub() with no method', t => {
 	t.end();
 });
 
-test('PubSub: namespaced events', t => {
+tape('PubSub: namespaced events', t => {
 	t.plan(2);
 	var ps = new pubsub();
 	ps.sub('namespace:topic1', function() {
@@ -133,7 +133,7 @@ test('PubSub: namespaced events', t => {
 	t.end();
 });
 
-test('PubSub: nested namespaces', t => {
+tape('PubSub: nested namespaces', t => {
 	t.plan(3);
 	var ps = new pubsub();
 	ps.sub('parent:child:event', function() {
@@ -152,7 +152,7 @@ test('PubSub: nested namespaces', t => {
 	t.end();
 });
 
-test('PubSub.recoup()', t => {
+tape('PubSub.recoup()', t => {
 	t.plan(4);
 	var ps = new pubsub();
 	ps.pub('event1', 1, 2, 3);
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index fa3e957..0000000
--- a/yarn.lock
+++ /dev/null
@@ -1,694 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/estree@0.0.39":
-  version "0.0.39"
-  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
-
-"@types/node@*":
-  version "10.5.2"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707"
-
-acorn-dynamic-import@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
-  dependencies:
-    acorn "^5.0.0"
-
-acorn-jsx@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e"
-  dependencies:
-    acorn "^5.0.3"
-
-acorn@^5.0.0, acorn@^5.0.3, acorn@^5.4.1:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
-
-ansi-styles@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
-  dependencies:
-    color-convert "^1.9.0"
-
-arr-diff@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
-  dependencies:
-    arr-flatten "^1.0.1"
-
-arr-flatten@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
-
-array-unique@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
-
-balanced-match@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
-
-brace-expansion@^1.1.7:
-  version "1.1.11"
-  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
-  dependencies:
-    balanced-match "^1.0.0"
-    concat-map "0.0.1"
-
-braces@^1.8.2:
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
-  dependencies:
-    expand-range "^1.8.1"
-    preserve "^0.2.0"
-    repeat-element "^1.1.2"
-
-buble@^0.19.2:
-  version "0.19.3"
-  resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.3.tgz#01e9412062cff1da6f20342b6ecd72e7bf699d02"
-  dependencies:
-    acorn "^5.4.1"
-    acorn-dynamic-import "^3.0.0"
-    acorn-jsx "^4.1.1"
-    chalk "^2.3.1"
-    magic-string "^0.22.4"
-    minimist "^1.2.0"
-    os-homedir "^1.0.1"
-    vlq "^1.0.0"
-
-chalk@^2.3.0, chalk@^2.3.1:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
-  dependencies:
-    ansi-styles "^3.2.1"
-    escape-string-regexp "^1.0.5"
-    supports-color "^5.3.0"
-
-ci-info@^1.0.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2"
-
-color-convert@^1.9.0:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
-  dependencies:
-    color-name "1.1.1"
-
-color-name@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
-
-concat-map@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-
-cross-spawn@^5.0.1:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
-  dependencies:
-    lru-cache "^4.0.1"
-    shebang-command "^1.2.0"
-    which "^1.2.9"
-
-deep-equal@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
-
-define-properties@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
-  dependencies:
-    foreach "^2.0.5"
-    object-keys "^1.0.8"
-
-defined@~1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
-
-es-abstract@^1.5.0:
-  version "1.12.0"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
-  dependencies:
-    es-to-primitive "^1.1.1"
-    function-bind "^1.1.1"
-    has "^1.0.1"
-    is-callable "^1.1.3"
-    is-regex "^1.0.4"
-
-es-to-primitive@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
-  dependencies:
-    is-callable "^1.1.1"
-    is-date-object "^1.0.1"
-    is-symbol "^1.0.1"
-
-escape-string-regexp@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
-
-estree-walker@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39"
-
-execa@^0.8.0:
-  version "0.8.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
-  dependencies:
-    cross-spawn "^5.0.1"
-    get-stream "^3.0.0"
-    is-stream "^1.1.0"
-    npm-run-path "^2.0.0"
-    p-finally "^1.0.0"
-    signal-exit "^3.0.0"
-    strip-eof "^1.0.0"
-
-expand-brackets@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
-  dependencies:
-    is-posix-bracket "^0.1.0"
-
-expand-range@^1.8.1:
-  version "1.8.2"
-  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
-  dependencies:
-    fill-range "^2.1.0"
-
-extglob@^0.3.1:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
-  dependencies:
-    is-extglob "^1.0.0"
-
-filename-regex@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
-
-fill-range@^2.1.0:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
-  dependencies:
-    is-number "^2.1.0"
-    isobject "^2.0.0"
-    randomatic "^3.0.0"
-    repeat-element "^1.1.2"
-    repeat-string "^1.5.2"
-
-find-up@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
-  dependencies:
-    locate-path "^2.0.0"
-
-for-each@~0.3.3:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
-  dependencies:
-    is-callable "^1.1.3"
-
-for-in@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
-
-for-own@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
-  dependencies:
-    for-in "^1.0.1"
-
-foreach@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
-
-fs.realpath@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
-
-function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
-
-get-stream@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
-
-glob-base@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
-  dependencies:
-    glob-parent "^2.0.0"
-    is-glob "^2.0.0"
-
-glob-parent@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
-  dependencies:
-    is-glob "^2.0.0"
-
-glob@~7.1.2:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.4"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-has-flag@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
-
-has@^1.0.1, has@~1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
-  dependencies:
-    function-bind "^1.1.1"
-
-husky@^0.14.3:
-  version "0.14.3"
-  resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3"
-  dependencies:
-    is-ci "^1.0.10"
-    normalize-path "^1.0.0"
-    strip-indent "^2.0.0"
-
-ignore@^3.3.7:
-  version "3.3.10"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
-
-inflight@^1.0.4:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
-  dependencies:
-    once "^1.3.0"
-    wrappy "1"
-
-inherits@2, inherits@~2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-
-is-buffer@^1.1.5:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
-
-is-callable@^1.1.1, is-callable@^1.1.3:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
-
-is-ci@^1.0.10:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
-  dependencies:
-    ci-info "^1.0.0"
-
-is-date-object@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
-
-is-dotfile@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
-
-is-equal-shallow@^0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
-  dependencies:
-    is-primitive "^2.0.0"
-
-is-extendable@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-
-is-extglob@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-
-is-glob@^2.0.0, is-glob@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
-  dependencies:
-    is-extglob "^1.0.0"
-
-is-number@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
-  dependencies:
-    kind-of "^3.0.2"
-
-is-number@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
-
-is-posix-bracket@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
-
-is-primitive@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
-
-is-regex@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
-  dependencies:
-    has "^1.0.1"
-
-is-stream@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
-
-is-symbol@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
-
-isarray@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-
-isexe@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
-
-isobject@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
-  dependencies:
-    isarray "1.0.0"
-
-kind-of@^3.0.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^6.0.0:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
-
-locate-path@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
-  dependencies:
-    p-locate "^2.0.0"
-    path-exists "^3.0.0"
-
-lru-cache@^4.0.1:
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
-  dependencies:
-    pseudomap "^1.0.2"
-    yallist "^2.1.2"
-
-magic-string@^0.22.4:
-  version "0.22.5"
-  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
-  dependencies:
-    vlq "^0.2.2"
-
-math-random@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
-
-micromatch@^2.3.11:
-  version "2.3.11"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
-  dependencies:
-    arr-diff "^2.0.0"
-    array-unique "^0.2.1"
-    braces "^1.8.2"
-    expand-brackets "^0.1.4"
-    extglob "^0.3.1"
-    filename-regex "^2.0.0"
-    is-extglob "^1.0.0"
-    is-glob "^2.0.1"
-    kind-of "^3.0.2"
-    normalize-path "^2.0.1"
-    object.omit "^2.0.0"
-    parse-glob "^3.0.4"
-    regex-cache "^0.4.2"
-
-minimatch@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
-  dependencies:
-    brace-expansion "^1.1.7"
-
-minimist@^1.2.0, minimist@~1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-mri@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.1.tgz#85aa26d3daeeeedf80dc5984af95cc5ca5cad9f1"
-
-normalize-path@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
-
-normalize-path@^2.0.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
-  dependencies:
-    remove-trailing-separator "^1.0.1"
-
-npm-run-path@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
-  dependencies:
-    path-key "^2.0.0"
-
-object-inspect@~1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
-
-object-keys@^1.0.8:
-  version "1.0.12"
-  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
-
-object.omit@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
-  dependencies:
-    for-own "^0.1.4"
-    is-extendable "^0.1.1"
-
-once@^1.3.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
-  dependencies:
-    wrappy "1"
-
-os-homedir@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-
-p-finally@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
-
-p-limit@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
-  dependencies:
-    p-try "^1.0.0"
-
-p-locate@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
-  dependencies:
-    p-limit "^1.1.0"
-
-p-try@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
-
-parse-glob@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
-  dependencies:
-    glob-base "^0.3.0"
-    is-dotfile "^1.0.0"
-    is-extglob "^1.0.0"
-    is-glob "^2.0.0"
-
-path-exists@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
-
-path-is-absolute@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
-
-path-key@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
-
-path-parse@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
-
-preserve@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-
-prettier@^1.13.7:
-  version "1.13.7"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
-
-pretty-quick@^1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.6.0.tgz#afc3591eb5c4cf37614a305d489a8a40e57c9258"
-  dependencies:
-    chalk "^2.3.0"
-    execa "^0.8.0"
-    find-up "^2.1.0"
-    ignore "^3.3.7"
-    mri "^1.1.0"
-
-pseudomap@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
-
-randomatic@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
-  dependencies:
-    is-number "^4.0.0"
-    kind-of "^6.0.0"
-    math-random "^1.0.1"
-
-regex-cache@^0.4.2:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
-  dependencies:
-    is-equal-shallow "^0.1.3"
-
-remove-trailing-separator@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
-
-repeat-element@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-
-repeat-string@^1.5.2:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
-
-resolve@~1.7.1:
-  version "1.7.1"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
-  dependencies:
-    path-parse "^1.0.5"
-
-resumer@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
-  dependencies:
-    through "~2.3.4"
-
-rollup-plugin-buble@^0.19.2:
-  version "0.19.2"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz#c0590c7d3d475b5ed59f129764ec93710cc6e8dd"
-  dependencies:
-    buble "^0.19.2"
-    rollup-pluginutils "^2.0.1"
-
-rollup-pluginutils@^2.0.1:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz#478ace04bd7f6da2e724356ca798214884738fc4"
-  dependencies:
-    estree-walker "^0.5.2"
-    micromatch "^2.3.11"
-
-rollup@^0.63.2:
-  version "0.63.2"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.63.2.tgz#d27619204cd025c948d740972fb1d0da6aa64481"
-  dependencies:
-    "@types/estree" "0.0.39"
-    "@types/node" "*"
-
-shebang-command@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
-  dependencies:
-    shebang-regex "^1.0.0"
-
-shebang-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
-
-signal-exit@^3.0.0:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
-
-string.prototype.trim@~1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
-  dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.5.0"
-    function-bind "^1.0.2"
-
-strip-eof@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
-
-strip-indent@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
-
-supports-color@^5.3.0:
-  version "5.4.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
-  dependencies:
-    has-flag "^3.0.0"
-
-tape@^4.9.1:
-  version "4.9.1"
-  resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9"
-  dependencies:
-    deep-equal "~1.0.1"
-    defined "~1.0.0"
-    for-each "~0.3.3"
-    function-bind "~1.1.1"
-    glob "~7.1.2"
-    has "~1.0.3"
-    inherits "~2.0.3"
-    minimist "~1.2.0"
-    object-inspect "~1.6.0"
-    resolve "~1.7.1"
-    resumer "~0.0.0"
-    string.prototype.trim "~1.1.2"
-    through "~2.3.8"
-
-through@~2.3.4, through@~2.3.8:
-  version "2.3.8"
-  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
-
-vlq@^0.2.2:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
-
-vlq@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806"
-
-which@^1.2.9:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
-  dependencies:
-    isexe "^2.0.0"
-
-wrappy@1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-
-yallist@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"

From 7bfc38378044c620d32a26aec8eaffa518697391 Mon Sep 17 00:00:00 2001
From: Dan Burzo <dan@danburzo.ro>
Date: Tue, 3 Aug 2021 23:38:58 +0300
Subject: [PATCH 21/22] 1.0.0

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

diff --git a/package-lock.json b/package-lock.json
index e90c07c..814e5f2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.6",
+	"version": "1.0.0",
 	"lockfileVersion": 2,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "@evercoder/pubsub",
-			"version": "0.2.6",
+			"version": "1.0.0",
 			"devDependencies": {
 				"esbuild": "^0.12.17",
 				"esm": "^3.2.25",
diff --git a/package.json b/package.json
index 1d538c0..2ebb8df 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "@evercoder/pubsub",
-	"version": "0.2.6",
+	"version": "1.0.0",
 	"main": "dist/pubsub.cjs.js",
 	"module": "dist/pubsub.js",
 	"private": false,

From b255d86cc8546be0d63b67955599f8f5c69b246b Mon Sep 17 00:00:00 2001
From: Oscar <56079903+OscarNOW@users.noreply.github.com>
Date: Sat, 25 Jan 2025 10:51:20 +0100
Subject: [PATCH 22/22] Fix readme typo once alias for sub

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 866f450..7b545a7 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ Available options:
 
 **Note:** This option [will be deprecated](#strict-mode).
 
-§ bus.**once**(_event_, _listener_, _thisArg_) is a shortcut for calling `once()` with the `once: true` option.
+§ bus.**once**(_event_, _listener_, _thisArg_) is a shortcut for calling `sub()` with the `once: true` option.
 
 § bus.**unsub**(_event_, _listener_) — unsubscribe a listener from an event.
 
