--- /dev/null
+"use strict";\r
+module.exports = EventEmitter;\r
+\r
+/**\r
+ * Constructs a new event emitter instance.\r
+ * @classdesc A minimal event emitter.\r
+ * @memberof util\r
+ * @constructor\r
+ */\r
+function EventEmitter() {\r
+\r
+ /**\r
+ * Registered listeners.\r
+ * @type {Object.<string,*>}\r
+ * @private\r
+ */\r
+ this._listeners = {};\r
+}\r
+\r
+/**\r
+ * Registers an event listener.\r
+ * @param {string} evt Event name\r
+ * @param {function} fn Listener\r
+ * @param {*} [ctx] Listener context\r
+ * @returns {util.EventEmitter} `this`\r
+ */\r
+EventEmitter.prototype.on = function on(evt, fn, ctx) {\r
+ (this._listeners[evt] || (this._listeners[evt] = [])).push({\r
+ fn : fn,\r
+ ctx : ctx || this\r
+ });\r
+ return this;\r
+};\r
+\r
+/**\r
+ * Removes an event listener or any matching listeners if arguments are omitted.\r
+ * @param {string} [evt] Event name. Removes all listeners if omitted.\r
+ * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r
+ * @returns {util.EventEmitter} `this`\r
+ */\r
+EventEmitter.prototype.off = function off(evt, fn) {\r
+ if (evt === undefined)\r
+ this._listeners = {};\r
+ else {\r
+ if (fn === undefined)\r
+ this._listeners[evt] = [];\r
+ else {\r
+ var listeners = this._listeners[evt];\r
+ for (var i = 0; i < listeners.length;)\r
+ if (listeners[i].fn === fn)\r
+ listeners.splice(i, 1);\r
+ else\r
+ ++i;\r
+ }\r
+ }\r
+ return this;\r
+};\r
+\r
+/**\r
+ * Emits an event by calling its listeners with the specified arguments.\r
+ * @param {string} evt Event name\r
+ * @param {...*} args Arguments\r
+ * @returns {util.EventEmitter} `this`\r
+ */\r
+EventEmitter.prototype.emit = function emit(evt) {\r
+ var listeners = this._listeners[evt];\r
+ if (listeners) {\r
+ var args = [],\r
+ i = 1;\r
+ for (; i < arguments.length;)\r
+ args.push(arguments[i++]);\r
+ for (i = 0; i < listeners.length;)\r
+ listeners[i].fn.apply(listeners[i++].ctx, args);\r
+ }\r
+ return this;\r
+};\r