Index: imaps-frontend/node_modules/utila/lib/Emitter.js
===================================================================
--- imaps-frontend/node_modules/utila/lib/Emitter.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
+++ imaps-frontend/node_modules/utila/lib/Emitter.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -0,0 +1,137 @@
+// Generated by CoffeeScript 1.6.3
+var Emitter, array;
+
+array = require('./array');
+
+module.exports = Emitter = (function() {
+  function Emitter() {
+    this._listeners = {};
+    this._listenersForAnyEvent = [];
+    this._disabledEmitters = {};
+  }
+
+  Emitter.prototype.on = function(eventName, listener) {
+    if (this._listeners[eventName] == null) {
+      this._listeners[eventName] = [];
+    }
+    this._listeners[eventName].push(listener);
+    return this;
+  };
+
+  Emitter.prototype.once = function(eventName, listener) {
+    var cb, ran,
+      _this = this;
+    ran = false;
+    cb = function() {
+      if (ran) {
+        return;
+      }
+      ran = true;
+      listener();
+      return setTimeout(function() {
+        return _this.removeEvent(eventName, cb);
+      }, 0);
+    };
+    this.on(eventName, cb);
+    return this;
+  };
+
+  Emitter.prototype.onAnyEvent = function(listener) {
+    this._listenersForAnyEvent.push(listener);
+    return this;
+  };
+
+  Emitter.prototype.removeEvent = function(eventName, listener) {
+    if (this._listeners[eventName] == null) {
+      return this;
+    }
+    array.pluckOneItem(this._listeners[eventName], listener);
+    return this;
+  };
+
+  Emitter.prototype.removeListeners = function(eventName) {
+    if (this._listeners[eventName] == null) {
+      return this;
+    }
+    this._listeners[eventName].length = 0;
+    return this;
+  };
+
+  Emitter.prototype.removeAllListeners = function() {
+    var listeners, name, _ref;
+    _ref = this._listeners;
+    for (name in _ref) {
+      listeners = _ref[name];
+      listeners.length = 0;
+    }
+    return this;
+  };
+
+  Emitter.prototype._emit = function(eventName, data) {
+    var listener, _i, _j, _len, _len1, _ref, _ref1;
+    _ref = this._listenersForAnyEvent;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      listener = _ref[_i];
+      listener.call(this, data, eventName);
+    }
+    if (this._listeners[eventName] == null) {
+      return;
+    }
+    _ref1 = this._listeners[eventName];
+    for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+      listener = _ref1[_j];
+      listener.call(this, data);
+    }
+  };
+
+  Emitter.prototype._throttleEmitterMethod = function(fnName, time) {
+    var lastCallArgs, originalFn, pend, pending, runIt, timer,
+      _this = this;
+    if (time == null) {
+      time = 1000;
+    }
+    originalFn = this[fnName];
+    if (typeof originalFn !== 'function') {
+      throw Error("this class does not have a method called '" + fnName + "'");
+    }
+    lastCallArgs = null;
+    pending = false;
+    timer = null;
+    this[fnName] = function() {
+      lastCallArgs = arguments;
+      return pend();
+    };
+    pend = function() {
+      if (pending) {
+        clearTimeout(timer);
+      }
+      timer = setTimeout(runIt, time);
+      return pending = true;
+    };
+    return runIt = function() {
+      pending = false;
+      return originalFn.apply(_this, lastCallArgs);
+    };
+  };
+
+  Emitter.prototype._disableEmitter = function(fnName) {
+    if (this._disabledEmitters[fnName] != null) {
+      throw Error("" + fnName + " is already a disabled emitter");
+    }
+    this._disabledEmitters[fnName] = this[fnName];
+    return this[fnName] = function() {};
+  };
+
+  Emitter.prototype._enableEmitter = function(fnName) {
+    var fn;
+    fn = this._disabledEmitters[fnName];
+    if (fn == null) {
+      throw Error("" + fnName + " is not a disabled emitter");
+    }
+    this[fnName] = fn;
+    return delete this._disabledEmitters[fnName];
+  };
+
+  return Emitter;
+
+})();
