UNPKG

mini-event-emitter

Version:

An easy javascript EventEmitter which has no dependencies and the possibility to group events, log errors and trace events

307 lines (277 loc) 22.8 kB
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ var Handler, MiniEventEmitter; Handler = require("./handler"); MiniEventEmitter = (function() { function MiniEventEmitter(obj) { var handler; handler = new Handler(this, obj); this.on = handler.on; this.off = handler.off; this.emit = handler.emit; this.emitIf = handler.emitIf; this.trigger = handler.emit; this.triggerIf = handler.emitIf; } MiniEventEmitter.prototype.listen = function(type, event, args) {}; return MiniEventEmitter; })(); window.MiniEventEmitter = MiniEventEmitter; },{"./handler":2}],2:[function(require,module,exports){ var MiniEventEmitter, bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; MiniEventEmitter = (function() { function MiniEventEmitter(mini, obj) { this.mini = mini; this.removeFn = bind(this.removeFn, this); this.removeFns = bind(this.removeFns, this); this.emit = bind(this.emit, this); this.emitIf = bind(this.emitIf, this); this.off = bind(this.off, this); this.on = bind(this.on, this); this.mini.settings = { name: (obj != null ? obj.name : void 0) || "MiniEventEmitter", error: (obj != null ? obj.error : void 0) || false, trace: (obj != null ? obj.trace : void 0) || false }; this.mini.events = {}; this.mini.groups = {}; } MiniEventEmitter.prototype.on = function(event, group, fn) { var events, groups, ref; ref = this.optional(group, fn), group = ref[0], fn = ref[1]; if (!this.valid("on", event, group, fn)) { return this.mini; } if ((groups = this.mini.groups)[group]) { if (groups[group][event]) { groups[group][event].push(fn); } else { groups[group][event] = [fn]; } } else { groups[group] = {}; groups[group][event] = [fn]; } if ((events = this.mini.events)[event]) { events[event].push(fn); } else { events[event] = [fn]; } return this.mini; }; MiniEventEmitter.prototype.off = function(event, group, fn) { var fns, index, ref; if (arguments.length === 0) { return this.removeAll(); } ref = this.optional(group, fn), group = ref[0], fn = ref[1]; if (!this.valid("off", event, group, fn)) { return this.mini; } if (!this.mini.groups[group]) { this.error("off", 7, event, group); return this.mini; } if (!event) { return this.removeGroup(group); } if (!(fns = this.mini.groups[group][event])) { this.error("off", 8, event, group); return this.mini; } if (!fn) { return this.removeFns(event, group, fns); } if (-1 === (index = fns.indexOf(fn))) { this.error("off", 2, event, group); return this.mini; } this.removeFn(event, group, fns, fn, index); return this.mini; }; MiniEventEmitter.prototype.emitIf = function() { return this._emit(arguments, true); }; MiniEventEmitter.prototype.emit = function() { return this._emit(arguments); }; MiniEventEmitter.prototype._emit = function(args, skip) { var event, fn, fns, i; args = Array.from(args); event = args.shift(); if (!(fns = this.validEvent(event, skip))) { return this.mini; } this.trace(event, args); for (i = fns.length - 1; i >= 0; i += -1) { fn = fns[i]; fn.apply(fn, args); } return this.mini; }; MiniEventEmitter.prototype.valid = function(name, event, group, fn) { if (name === "on") { if (!this.isString(event)) { return this.error(name, 1); } if (!this.isString(group)) { return this.error(name, 5); } if (!this.isFunction(fn)) { return this.error(name, 6, event, group); } } if (name === "off") { if (event !== null && !this.isString(event)) { return this.error(name, 1); } if (!this.isString(group)) { return this.error(name, 5); } if (fn && !this.isFunction(fn)) { return this.error(name, 6, event, group); } } return true; }; MiniEventEmitter.prototype.validEvent = function(event, skip) { var fns; if (!event) { return this.error("emit", 3); } if (!this.isString(event)) { return this.error("emit", 1); } if (!(fns = this.mini.events[event])) { if (!skip) { this.error("emit", 4, event); } return null; } return fns; }; MiniEventEmitter.prototype.error = function(name, id, event, group) { var msg; msg = name + " ~ "; if (id === 1) { msg += "Event name must be a string"; } if (id === 2) { msg += "Provided function to remove with event \"" + event + "\" in group \"" + group + "\" is not found"; } if (id === 3) { msg += "Event was not provided"; } if (id === 4) { msg += "EventListener for event \"" + event + "\" does not exist"; } if (id === 5) { msg += "Provided group must be a string"; } if (id === 6) { msg += "The last param provided with event \"" + event + "\" and group \"" + group + "\" is expected to be a function"; } if (id === 7) { msg += "Provided group \"" + group + "\" is not found"; } if (id === 8) { msg += "Event \"" + event + "\" does not exist for the provided group \"" + group + "\""; } this.mini.listen("error", event, [msg, name, id, group]); if (!this.mini.settings.error) { return null; } msg = this.mini.settings.name + " ~ " + msg; if (console) { if (console.warn) { console.warn(msg); } else { console.log(msg); } } return null; }; MiniEventEmitter.prototype.optional = function(group, fn) { if ((fn == null) && this.isFunction(group)) { fn = group; group = ""; } else { if (!group) { group = ""; } } return [group, fn]; }; MiniEventEmitter.prototype.removeAll = function() { this.mini.events = {}; this.mini.groups = {}; return this.mini; }; MiniEventEmitter.prototype.removeGroup = function(group) { var event, fns, ref; ref = this.mini.groups[group]; for (event in ref) { fns = ref[event]; this.removeFns(event, group, fns); } return this.mini; }; MiniEventEmitter.prototype.removeFns = function(event, group, fns) { var fn, i; for (i = fns.length - 1; i >= 0; i += -1) { fn = fns[i]; this.removeFn(event, group, fns, fn); } return this.mini; }; MiniEventEmitter.prototype.removeFn = function(event, group, fns, fn, index) { if (!index) { index = fns.indexOf(fn); } fns.splice(index, 1); if (fns.length === 0) { delete this.mini.groups[group][event]; } if (0 === this.objLength(this.mini.groups[group])) { delete this.mini.groups[group]; } index = this.mini.events[event].indexOf(fn); this.mini.events[event].splice(index, 1); if (this.mini.events[event].length === 0) { return delete this.mini.events[event]; } }; MiniEventEmitter.prototype.trace = function(event, args) { var msg; this.mini.listen("trace", event, args); if (this.mini.settings.trace) { msg = this.mini.settings.name + " ~ trace ~ " + event; if (args.length === 0) { if (console.debug) { return console.log("%c " + msg, "color: #13d"); } else { return console.log(msg); } } else { if (console.debug) { return console.log("%c " + msg, "color: #13d", args); } else { return console.log(msg, args); } } } }; MiniEventEmitter.prototype.isString = function(event) { return typeof event === "string" || event instanceof String; }; MiniEventEmitter.prototype.objLength = function(obj) { return Object.keys(obj).length; }; MiniEventEmitter.prototype.isFunction = function(fn) { return typeof fn === "function"; }; return MiniEventEmitter; })(); module.exports = MiniEventEmitter; },{}]},{},[1]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJidWlsZC9qcy9hcHAuanMiLCJidWlsZC9qcy9oYW5kbGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwidmFyIEhhbmRsZXIsIE1pbmlFdmVudEVtaXR0ZXI7XG5cbkhhbmRsZXIgPSByZXF1aXJlKFwiLi9oYW5kbGVyXCIpO1xuXG5NaW5pRXZlbnRFbWl0dGVyID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBNaW5pRXZlbnRFbWl0dGVyKG9iaikge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBuZXcgSGFuZGxlcih0aGlzLCBvYmopO1xuICAgIHRoaXMub24gPSBoYW5kbGVyLm9uO1xuICAgIHRoaXMub2ZmID0gaGFuZGxlci5vZmY7XG4gICAgdGhpcy5lbWl0ID0gaGFuZGxlci5lbWl0O1xuICAgIHRoaXMuZW1pdElmID0gaGFuZGxlci5lbWl0SWY7XG4gICAgdGhpcy50cmlnZ2VyID0gaGFuZGxlci5lbWl0O1xuICAgIHRoaXMudHJpZ2dlcklmID0gaGFuZGxlci5lbWl0SWY7XG4gIH1cblxuICBNaW5pRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbih0eXBlLCBldmVudCwgYXJncykge307XG5cbiAgcmV0dXJuIE1pbmlFdmVudEVtaXR0ZXI7XG5cbn0pKCk7XG5cbndpbmRvdy5NaW5pRXZlbnRFbWl0dGVyID0gTWluaUV2ZW50RW1pdHRlcjtcbiIsInZhciBNaW5pRXZlbnRFbWl0dGVyLFxuICBiaW5kID0gZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfTtcblxuTWluaUV2ZW50RW1pdHRlciA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gTWluaUV2ZW50RW1pdHRlcihtaW5pLCBvYmopIHtcbiAgICB0aGlzLm1pbmkgPSBtaW5pO1xuICAgIHRoaXMucmVtb3ZlRm4gPSBiaW5kKHRoaXMucmVtb3ZlRm4sIHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlRm5zID0gYmluZCh0aGlzLnJlbW92ZUZucywgdGhpcyk7XG4gICAgdGhpcy5lbWl0ID0gYmluZCh0aGlzLmVtaXQsIHRoaXMpO1xuICAgIHRoaXMuZW1pdElmID0gYmluZCh0aGlzLmVtaXRJZiwgdGhpcyk7XG4gICAgdGhpcy5vZmYgPSBiaW5kKHRoaXMub2ZmLCB0aGlzKTtcbiAgICB0aGlzLm9uID0gYmluZCh0aGlzLm9uLCB0aGlzKTtcbiAgICB0aGlzLm1pbmkuc2V0dGluZ3MgPSB7XG4gICAgICBuYW1lOiAob2JqICE9IG51bGwgPyBvYmoubmFtZSA6IHZvaWQgMCkgfHwgXCJNaW5pRXZlbnRFbWl0dGVyXCIsXG4gICAgICBlcnJvcjogKG9iaiAhPSBudWxsID8gb2JqLmVycm9yIDogdm9pZCAwKSB8fCBmYWxzZSxcbiAgICAgIHRyYWNlOiAob2JqICE9IG51bGwgPyBvYmoudHJhY2UgOiB2b2lkIDApIHx8IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLm1pbmkuZXZlbnRzID0ge307XG4gICAgdGhpcy5taW5pLmdyb3VwcyA9IHt9O1xuICB9XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbihldmVudCwgZ3JvdXAsIGZuKSB7XG4gICAgdmFyIGV2ZW50cywgZ3JvdXBzLCByZWY7XG4gICAgcmVmID0gdGhpcy5vcHRpb25hbChncm91cCwgZm4pLCBncm91cCA9IHJlZlswXSwgZm4gPSByZWZbMV07XG4gICAgaWYgKCF0aGlzLnZhbGlkKFwib25cIiwgZXZlbnQsIGdyb3VwLCBmbikpIHtcbiAgICAgIHJldHVybiB0aGlzLm1pbmk7XG4gICAgfVxuICAgIGlmICgoZ3JvdXBzID0gdGhpcy5taW5pLmdyb3VwcylbZ3JvdXBdKSB7XG4gICAgICBpZiAoZ3JvdXBzW2dyb3VwXVtldmVudF0pIHtcbiAgICAgICAgZ3JvdXBzW2dyb3VwXVtldmVudF0ucHVzaChmbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncm91cHNbZ3JvdXBdW2V2ZW50XSA9IFtmbl07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3Vwc1tncm91cF0gPSB7fTtcbiAgICAgIGdyb3Vwc1tncm91cF1bZXZlbnRdID0gW2ZuXTtcbiAgICB9XG4gICAgaWYgKChldmVudHMgPSB0aGlzLm1pbmkuZXZlbnRzKVtldmVudF0pIHtcbiAgICAgIGV2ZW50c1tldmVudF0ucHVzaChmbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50c1tldmVudF0gPSBbZm5dO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taW5pO1xuICB9O1xuXG4gIE1pbmlFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50LCBncm91cCwgZm4pIHtcbiAgICB2YXIgZm5zLCBpbmRleCwgcmVmO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVBbGwoKTtcbiAgICB9XG4gICAgcmVmID0gdGhpcy5vcHRpb25hbChncm91cCwgZm4pLCBncm91cCA9IHJlZlswXSwgZm4gPSByZWZbMV07XG4gICAgaWYgKCF0aGlzLnZhbGlkKFwib2ZmXCIsIGV2ZW50LCBncm91cCwgZm4pKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW5pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWluaS5ncm91cHNbZ3JvdXBdKSB7XG4gICAgICB0aGlzLmVycm9yKFwib2ZmXCIsIDcsIGV2ZW50LCBncm91cCk7XG4gICAgICByZXR1cm4gdGhpcy5taW5pO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVHcm91cChncm91cCk7XG4gICAgfVxuICAgIGlmICghKGZucyA9IHRoaXMubWluaS5ncm91cHNbZ3JvdXBdW2V2ZW50XSkpIHtcbiAgICAgIHRoaXMuZXJyb3IoXCJvZmZcIiwgOCwgZXZlbnQsIGdyb3VwKTtcbiAgICAgIHJldHVybiB0aGlzLm1pbmk7XG4gICAgfVxuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZUZucyhldmVudCwgZ3JvdXAsIGZucyk7XG4gICAgfVxuICAgIGlmICgtMSA9PT0gKGluZGV4ID0gZm5zLmluZGV4T2YoZm4pKSkge1xuICAgICAgdGhpcy5lcnJvcihcIm9mZlwiLCAyLCBldmVudCwgZ3JvdXApO1xuICAgICAgcmV0dXJuIHRoaXMubWluaTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVGbihldmVudCwgZ3JvdXAsIGZucywgZm4sIGluZGV4KTtcbiAgICByZXR1cm4gdGhpcy5taW5pO1xuICB9O1xuXG4gIE1pbmlFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXRJZiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbWl0KGFyZ3VtZW50cywgdHJ1ZSk7XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9lbWl0KGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2VtaXQgPSBmdW5jdGlvbihhcmdzLCBza2lwKSB7XG4gICAgdmFyIGV2ZW50LCBmbiwgZm5zLCBpO1xuICAgIGFyZ3MgPSBBcnJheS5mcm9tKGFyZ3MpO1xuICAgIGV2ZW50ID0gYXJncy5zaGlmdCgpO1xuICAgIGlmICghKGZucyA9IHRoaXMudmFsaWRFdmVudChldmVudCwgc2tpcCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW5pO1xuICAgIH1cbiAgICB0aGlzLnRyYWNlKGV2ZW50LCBhcmdzKTtcbiAgICBmb3IgKGkgPSBmbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpICs9IC0xKSB7XG4gICAgICBmbiA9IGZuc1tpXTtcbiAgICAgIGZuLmFwcGx5KGZuLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWluaTtcbiAgfTtcblxuICBNaW5pRXZlbnRFbWl0dGVyLnByb3RvdHlwZS52YWxpZCA9IGZ1bmN0aW9uKG5hbWUsIGV2ZW50LCBncm91cCwgZm4pIHtcbiAgICBpZiAobmFtZSA9PT0gXCJvblwiKSB7XG4gICAgICBpZiAoIXRoaXMuaXNTdHJpbmcoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKG5hbWUsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzU3RyaW5nKGdyb3VwKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihuYW1lLCA1KTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihuYW1lLCA2LCBldmVudCwgZ3JvdXApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJvZmZcIikge1xuICAgICAgaWYgKGV2ZW50ICE9PSBudWxsICYmICF0aGlzLmlzU3RyaW5nKGV2ZW50KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihuYW1lLCAxKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc1N0cmluZyhncm91cCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IobmFtZSwgNSk7XG4gICAgICB9XG4gICAgICBpZiAoZm4gJiYgIXRoaXMuaXNGdW5jdGlvbihmbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IobmFtZSwgNiwgZXZlbnQsIGdyb3VwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUudmFsaWRFdmVudCA9IGZ1bmN0aW9uKGV2ZW50LCBza2lwKSB7XG4gICAgdmFyIGZucztcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvcihcImVtaXRcIiwgMyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1N0cmluZyhldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiZW1pdFwiLCAxKTtcbiAgICB9XG4gICAgaWYgKCEoZm5zID0gdGhpcy5taW5pLmV2ZW50c1tldmVudF0pKSB7XG4gICAgICBpZiAoIXNraXApIHtcbiAgICAgICAgdGhpcy5lcnJvcihcImVtaXRcIiwgNCwgZXZlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmbnM7XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihuYW1lLCBpZCwgZXZlbnQsIGdyb3VwKSB7XG4gICAgdmFyIG1zZztcbiAgICBtc2cgPSBuYW1lICsgXCIgfiBcIjtcbiAgICBpZiAoaWQgPT09IDEpIHtcbiAgICAgIG1zZyArPSBcIkV2ZW50IG5hbWUgbXVzdCBiZSBhIHN0cmluZ1wiO1xuICAgIH1cbiAgICBpZiAoaWQgPT09IDIpIHtcbiAgICAgIG1zZyArPSBcIlByb3ZpZGVkIGZ1bmN0aW9uIHRvIHJlbW92ZSB3aXRoIGV2ZW50IFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiIGluIGdyb3VwIFxcXCJcIiArIGdyb3VwICsgXCJcXFwiIGlzIG5vdCBmb3VuZFwiO1xuICAgIH1cbiAgICBpZiAoaWQgPT09IDMpIHtcbiAgICAgIG1zZyArPSBcIkV2ZW50IHdhcyBub3QgcHJvdmlkZWRcIjtcbiAgICB9XG4gICAgaWYgKGlkID09PSA0KSB7XG4gICAgICBtc2cgKz0gXCJFdmVudExpc3RlbmVyIGZvciBldmVudCBcXFwiXCIgKyBldmVudCArIFwiXFxcIiBkb2VzIG5vdCBleGlzdFwiO1xuICAgIH1cbiAgICBpZiAoaWQgPT09IDUpIHtcbiAgICAgIG1zZyArPSBcIlByb3ZpZGVkIGdyb3VwIG11c3QgYmUgYSBzdHJpbmdcIjtcbiAgICB9XG4gICAgaWYgKGlkID09PSA2KSB7XG4gICAgICBtc2cgKz0gXCJUaGUgbGFzdCBwYXJhbSBwcm92aWRlZCB3aXRoIGV2ZW50IFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiIGFuZCBncm91cCBcXFwiXCIgKyBncm91cCArIFwiXFxcIiBpcyBleHBlY3RlZCB0byBiZSBhIGZ1bmN0aW9uXCI7XG4gICAgfVxuICAgIGlmIChpZCA9PT0gNykge1xuICAgICAgbXNnICs9IFwiUHJvdmlkZWQgZ3JvdXAgXFxcIlwiICsgZ3JvdXAgKyBcIlxcXCIgaXMgbm90IGZvdW5kXCI7XG4gICAgfVxuICAgIGlmIChpZCA9PT0gOCkge1xuICAgICAgbXNnICs9IFwiRXZlbnQgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBwcm92aWRlZCBncm91cCBcXFwiXCIgKyBncm91cCArIFwiXFxcIlwiO1xuICAgIH1cbiAgICB0aGlzLm1pbmkubGlzdGVuKFwiZXJyb3JcIiwgZXZlbnQsIFttc2csIG5hbWUsIGlkLCBncm91cF0pO1xuICAgIGlmICghdGhpcy5taW5pLnNldHRpbmdzLmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbXNnID0gdGhpcy5taW5pLnNldHRpbmdzLm5hbWUgKyBcIiB+IFwiICsgbXNnO1xuICAgIGlmIChjb25zb2xlKSB7XG4gICAgICBpZiAoY29uc29sZS53YXJuKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUub3B0aW9uYWwgPSBmdW5jdGlvbihncm91cCwgZm4pIHtcbiAgICBpZiAoKGZuID09IG51bGwpICYmIHRoaXMuaXNGdW5jdGlvbihncm91cCkpIHtcbiAgICAgIGZuID0gZ3JvdXA7XG4gICAgICBncm91cCA9IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAgPSBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2dyb3VwLCBmbl07XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5taW5pLmV2ZW50cyA9IHt9O1xuICAgIHRoaXMubWluaS5ncm91cHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcy5taW5pO1xuICB9O1xuXG4gIE1pbmlFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUdyb3VwID0gZnVuY3Rpb24oZ3JvdXApIHtcbiAgICB2YXIgZXZlbnQsIGZucywgcmVmO1xuICAgIHJlZiA9IHRoaXMubWluaS5ncm91cHNbZ3JvdXBdO1xuICAgIGZvciAoZXZlbnQgaW4gcmVmKSB7XG4gICAgICBmbnMgPSByZWZbZXZlbnRdO1xuICAgICAgdGhpcy5yZW1vdmVGbnMoZXZlbnQsIGdyb3VwLCBmbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taW5pO1xuICB9O1xuXG4gIE1pbmlFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUZucyA9IGZ1bmN0aW9uKGV2ZW50LCBncm91cCwgZm5zKSB7XG4gICAgdmFyIGZuLCBpO1xuICAgIGZvciAoaSA9IGZucy5sZW5ndGggLSAxOyBpID49IDA7IGkgKz0gLTEpIHtcbiAgICAgIGZuID0gZm5zW2ldO1xuICAgICAgdGhpcy5yZW1vdmVGbihldmVudCwgZ3JvdXAsIGZucywgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taW5pO1xuICB9O1xuXG4gIE1pbmlFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUZuID0gZnVuY3Rpb24oZXZlbnQsIGdyb3VwLCBmbnMsIGZuLCBpbmRleCkge1xuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gZm5zLmluZGV4T2YoZm4pO1xuICAgIH1cbiAgICBmbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMubWluaS5ncm91cHNbZ3JvdXBdW2V2ZW50XTtcbiAgICB9XG4gICAgaWYgKDAgPT09IHRoaXMub2JqTGVuZ3RoKHRoaXMubWluaS5ncm91cHNbZ3JvdXBdKSkge1xuICAgICAgZGVsZXRlIHRoaXMubWluaS5ncm91cHNbZ3JvdXBdO1xuICAgIH1cbiAgICBpbmRleCA9IHRoaXMubWluaS5ldmVudHNbZXZlbnRdLmluZGV4T2YoZm4pO1xuICAgIHRoaXMubWluaS5ldmVudHNbZXZlbnRdLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKHRoaXMubWluaS5ldmVudHNbZXZlbnRdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLm1pbmkuZXZlbnRzW2V2ZW50XTtcbiAgICB9XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUudHJhY2UgPSBmdW5jdGlvbihldmVudCwgYXJncykge1xuICAgIHZhciBtc2c7XG4gICAgdGhpcy5taW5pLmxpc3RlbihcInRyYWNlXCIsIGV2ZW50LCBhcmdzKTtcbiAgICBpZiAodGhpcy5taW5pLnNldHRpbmdzLnRyYWNlKSB7XG4gICAgICBtc2cgPSB0aGlzLm1pbmkuc2V0dGluZ3MubmFtZSArIFwiIH4gdHJhY2UgfiBcIiArIGV2ZW50O1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiJWMgXCIgKyBtc2csIFwiY29sb3I6ICMxM2RcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiJWMgXCIgKyBtc2csIFwiY29sb3I6ICMxM2RcIiwgYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKG1zZywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUuaXNTdHJpbmcgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHJldHVybiB0eXBlb2YgZXZlbnQgPT09IFwic3RyaW5nXCIgfHwgZXZlbnQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH07XG5cbiAgTWluaUV2ZW50RW1pdHRlci5wcm90b3R5cGUub2JqTGVuZ3RoID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoO1xuICB9O1xuXG4gIE1pbmlFdmVudEVtaXR0ZXIucHJvdG90eXBlLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihmbikge1xuICAgIHJldHVybiB0eXBlb2YgZm4gPT09IFwiZnVuY3Rpb25cIjtcbiAgfTtcblxuICByZXR1cm4gTWluaUV2ZW50RW1pdHRlcjtcblxufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNaW5pRXZlbnRFbWl0dGVyO1xuIl19