var Eventful = (function () { 
 | 
    function Eventful(eventProcessors) { 
 | 
        if (eventProcessors) { 
 | 
            this._$eventProcessor = eventProcessors; 
 | 
        } 
 | 
    } 
 | 
    Eventful.prototype.on = function (event, query, handler, context) { 
 | 
        if (!this._$handlers) { 
 | 
            this._$handlers = {}; 
 | 
        } 
 | 
        var _h = this._$handlers; 
 | 
        if (typeof query === 'function') { 
 | 
            context = handler; 
 | 
            handler = query; 
 | 
            query = null; 
 | 
        } 
 | 
        if (!handler || !event) { 
 | 
            return this; 
 | 
        } 
 | 
        var eventProcessor = this._$eventProcessor; 
 | 
        if (query != null && eventProcessor && eventProcessor.normalizeQuery) { 
 | 
            query = eventProcessor.normalizeQuery(query); 
 | 
        } 
 | 
        if (!_h[event]) { 
 | 
            _h[event] = []; 
 | 
        } 
 | 
        for (var i = 0; i < _h[event].length; i++) { 
 | 
            if (_h[event][i].h === handler) { 
 | 
                return this; 
 | 
            } 
 | 
        } 
 | 
        var wrap = { 
 | 
            h: handler, 
 | 
            query: query, 
 | 
            ctx: (context || this), 
 | 
            callAtLast: handler.zrEventfulCallAtLast 
 | 
        }; 
 | 
        var lastIndex = _h[event].length - 1; 
 | 
        var lastWrap = _h[event][lastIndex]; 
 | 
        (lastWrap && lastWrap.callAtLast) 
 | 
            ? _h[event].splice(lastIndex, 0, wrap) 
 | 
            : _h[event].push(wrap); 
 | 
        return this; 
 | 
    }; 
 | 
    Eventful.prototype.isSilent = function (eventName) { 
 | 
        var _h = this._$handlers; 
 | 
        return !_h || !_h[eventName] || !_h[eventName].length; 
 | 
    }; 
 | 
    Eventful.prototype.off = function (eventType, handler) { 
 | 
        var _h = this._$handlers; 
 | 
        if (!_h) { 
 | 
            return this; 
 | 
        } 
 | 
        if (!eventType) { 
 | 
            this._$handlers = {}; 
 | 
            return this; 
 | 
        } 
 | 
        if (handler) { 
 | 
            if (_h[eventType]) { 
 | 
                var newList = []; 
 | 
                for (var i = 0, l = _h[eventType].length; i < l; i++) { 
 | 
                    if (_h[eventType][i].h !== handler) { 
 | 
                        newList.push(_h[eventType][i]); 
 | 
                    } 
 | 
                } 
 | 
                _h[eventType] = newList; 
 | 
            } 
 | 
            if (_h[eventType] && _h[eventType].length === 0) { 
 | 
                delete _h[eventType]; 
 | 
            } 
 | 
        } 
 | 
        else { 
 | 
            delete _h[eventType]; 
 | 
        } 
 | 
        return this; 
 | 
    }; 
 | 
    Eventful.prototype.trigger = function (eventType) { 
 | 
        var args = []; 
 | 
        for (var _i = 1; _i < arguments.length; _i++) { 
 | 
            args[_i - 1] = arguments[_i]; 
 | 
        } 
 | 
        if (!this._$handlers) { 
 | 
            return this; 
 | 
        } 
 | 
        var _h = this._$handlers[eventType]; 
 | 
        var eventProcessor = this._$eventProcessor; 
 | 
        if (_h) { 
 | 
            var argLen = args.length; 
 | 
            var len = _h.length; 
 | 
            for (var i = 0; i < len; i++) { 
 | 
                var hItem = _h[i]; 
 | 
                if (eventProcessor 
 | 
                    && eventProcessor.filter 
 | 
                    && hItem.query != null 
 | 
                    && !eventProcessor.filter(eventType, hItem.query)) { 
 | 
                    continue; 
 | 
                } 
 | 
                switch (argLen) { 
 | 
                    case 0: 
 | 
                        hItem.h.call(hItem.ctx); 
 | 
                        break; 
 | 
                    case 1: 
 | 
                        hItem.h.call(hItem.ctx, args[0]); 
 | 
                        break; 
 | 
                    case 2: 
 | 
                        hItem.h.call(hItem.ctx, args[0], args[1]); 
 | 
                        break; 
 | 
                    default: 
 | 
                        hItem.h.apply(hItem.ctx, args); 
 | 
                        break; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        eventProcessor && eventProcessor.afterTrigger 
 | 
            && eventProcessor.afterTrigger(eventType); 
 | 
        return this; 
 | 
    }; 
 | 
    Eventful.prototype.triggerWithContext = function (type) { 
 | 
        var args = []; 
 | 
        for (var _i = 1; _i < arguments.length; _i++) { 
 | 
            args[_i - 1] = arguments[_i]; 
 | 
        } 
 | 
        if (!this._$handlers) { 
 | 
            return this; 
 | 
        } 
 | 
        var _h = this._$handlers[type]; 
 | 
        var eventProcessor = this._$eventProcessor; 
 | 
        if (_h) { 
 | 
            var argLen = args.length; 
 | 
            var ctx = args[argLen - 1]; 
 | 
            var len = _h.length; 
 | 
            for (var i = 0; i < len; i++) { 
 | 
                var hItem = _h[i]; 
 | 
                if (eventProcessor 
 | 
                    && eventProcessor.filter 
 | 
                    && hItem.query != null 
 | 
                    && !eventProcessor.filter(type, hItem.query)) { 
 | 
                    continue; 
 | 
                } 
 | 
                switch (argLen) { 
 | 
                    case 0: 
 | 
                        hItem.h.call(ctx); 
 | 
                        break; 
 | 
                    case 1: 
 | 
                        hItem.h.call(ctx, args[0]); 
 | 
                        break; 
 | 
                    case 2: 
 | 
                        hItem.h.call(ctx, args[0], args[1]); 
 | 
                        break; 
 | 
                    default: 
 | 
                        hItem.h.apply(ctx, args.slice(1, argLen - 1)); 
 | 
                        break; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        eventProcessor && eventProcessor.afterTrigger 
 | 
            && eventProcessor.afterTrigger(type); 
 | 
        return this; 
 | 
    }; 
 | 
    return Eventful; 
 | 
}()); 
 | 
export default Eventful; 
 |