EventKit.js 22.7 KB

                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/script/event/EventKit.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '9cfc1m4netFHInZPxXRhk45', 'EventKit');
// script/event/EventKit.ts

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Emitter = exports.Event = exports.CompositeDisposable = exports.Disposable = void 0;
class Disposable {
    constructor(disposalAction) {
        this._disposed = false;
        this._disposalAction = disposalAction;
    }
    get disposed() {
        return this._disposed;
    }
    dispose() {
        if (!this.disposed) {
            this._disposed = true;
            if (this._disposalAction) {
                this._disposalAction();
                this._disposalAction = null;
            }
        }
    }
}
exports.Disposable = Disposable;
class CompositeDisposable {
    constructor(...disposables) {
        this._disposed = false;
        this._disposables = new Set();
        for (let disposable of disposables) {
            this.add(disposable);
        }
    }
    add(disposable) {
        if (!this._disposed) {
            if (disposable) {
                this._disposables.add(disposable);
            }
        }
    }
    remove(disposable) {
        if (!this._disposed) {
            this._disposables.delete(disposable);
        }
    }
    clear() {
        if (!this._disposed) {
            this._disposables.clear();
        }
    }
    dispose() {
        if (!this._disposed) {
            this._disposed = true;
            this._disposables.forEach((disposable) => {
                disposable.dispose();
            });
            this._disposables = null;
        }
    }
}
exports.CompositeDisposable = CompositeDisposable;
class Event {
    constructor(emitter, name) {
        this.emit = ((...argsparam) => {
            argsparam.unshift(this.name);
            return this.emitter.emit.apply(this.emitter, argsparam);
        });
        this.emitter = emitter;
        this.name = name;
    }
    getName() {
        return this.name;
    }
    toString() {
        return `[Event ${this.name.toString()}]`;
    }
    on(handler, unshift = false) {
        return this.emitter.on(this.name, handler, unshift);
    }
    once(handler, unshift = false) {
        return this.emitter.once(this.name, handler, unshift);
    }
}
exports.Event = Event;
class Emitter {
    constructor() {
        this._disposed = false;
        this._handlersByEventName = new Map();
        this.off = (eventName, handlerToRemove) => {
            if (this._disposed)
                return;
            let oldHandlers = this._handlersByEventName.get(eventName);
            if (oldHandlers) {
                let newHandlers = [];
                for (let handler of oldHandlers) {
                    if (handler != handlerToRemove) {
                        newHandlers.push(handler);
                    }
                }
                if (newHandlers.length) {
                    this._handlersByEventName.set(eventName, newHandlers);
                }
                else {
                    this._handlersByEventName.delete(eventName);
                }
            }
        };
    }
    get disposed() {
        return this._disposed;
    }
    clear() {
        this._handlersByEventName.clear();
    }
    dispose() {
        this._handlersByEventName = null;
        this._disposed = true;
    }
    createEvent(eventName) {
        if (!eventName) {
            return new Event(this, Symbol("Event"));
        }
        return new Event(this, eventName);
    }
    on(eventName, handler, unshift = false) {
        if (this._disposed) {
            throw new Error("Emitter has been diposed");
        }
        let currentHandler = this._handlersByEventName.get(eventName);
        if (currentHandler) {
            if (unshift) {
                currentHandler.unshift(handler);
            }
            else {
                currentHandler.push(handler);
            }
        }
        else {
            this._handlersByEventName.set(eventName, [handler]);
        }
        return new Disposable(this.off.bind(this, eventName, handler));
    }
    once(eventName, handler, unshift = false) {
        let wrapped = (...args) => {
            disposable.dispose();
            return handler(...args);
        };
        let disposable = this.on(eventName, wrapped, unshift);
        return disposable;
    }
    emit(eventName, ...args) {
        let handlers = this._handlersByEventName.get(eventName);
        let result = [];
        if (handlers) {
            for (let handler of handlers) {
                try {
                    let ret = handler(...args);
                    if (ret === undefined) {
                        result.push(Promise.resolve());
                    }
                    else if (ret instanceof Promise) {
                        result.push(ret);
                    }
                    else {
                        result.push(Promise.resolve(ret));
                    }
                }
                catch (e) {
                    console.error(e);
                }
            }
        }
        return result;
    }
    getEventNames() {
        let ret = [];
        let keys = Object.keys(this._handlersByEventName);
        for (let k of keys) {
            if (typeof (k) === 'string') {
                ret.push(k);
            }
        }
        return ret;
    }
    getEventSymbols() {
        let ret = [];
        let keys = Object.keys(this._handlersByEventName);
        for (let k of keys) {
            if (typeof (k) === 'symbol') {
                ret.push(k);
            }
        }
        return ret;
    }
    listenerCountForEventName(eventName) {
        let handlers = this._handlersByEventName.get(eventName);
        return handlers ? handlers.length : 0;
    }
    getTotalListenerCount() {
        let result = 0;
        let keys = Object.keys(this._handlersByEventName);
        for (let eventName of keys) {
            result += this._handlersByEventName.get(eventName).length;
        }
        return result;
    }
}
exports.Emitter = Emitter;

cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZXZlbnQvRXZlbnRLaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBYSxVQUFVO0lBSW5CLFlBQVksY0FBMEI7UUFIOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUl0QixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQy9CO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7QUFyQkQsZ0NBcUJDO0FBRUQsTUFBYSxtQkFBbUI7SUFJNUIsWUFBWSxHQUFHLFdBQXlCO1FBSGhDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsaUJBQVksR0FBb0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUc5QyxLQUFLLElBQUksVUFBVSxJQUFJLFdBQVcsRUFBRTtZQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FBQyxVQUFzQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixJQUFJLFVBQVUsRUFBRTtnQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNyQztTQUNKO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFzQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDckMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDNUI7SUFDTCxDQUFDO0NBQ0o7QUF2Q0Qsa0RBdUNDO0FBRUQsTUFBYSxLQUFLO0lBSWQsWUFBWSxPQUFnQixFQUFFLElBQXFCO1FBcUIxQyxTQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBZ0IsRUFBNEIsRUFBRTtZQUMvRCxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBTSxDQUFDO1FBdkJKLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztJQUM3QyxDQUFDO0lBRUQsRUFBRSxDQUFDLE9BQVUsRUFBRSxVQUFtQixLQUFLO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFVLEVBQUUsVUFBbUIsS0FBSztRQUNyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FNSjtBQTdCRCxzQkE2QkM7QUFFRCxNQUFhLE9BQU87SUFBcEI7UUFDWSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLHlCQUFvQixHQUF5RCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBaUR2RixRQUFHLEdBQUcsQ0FBQyxTQUEwQixFQUFFLGVBQXdDLEVBQUUsRUFBRTtZQUNuRixJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU87WUFDM0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxJQUFJLFdBQVcsRUFBRTtnQkFDYixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLEtBQUssSUFBSSxPQUFPLElBQUksV0FBVyxFQUFFO29CQUM3QixJQUFJLE9BQU8sSUFBSSxlQUFlLEVBQUU7d0JBQzVCLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQzdCO2lCQUNKO2dCQUNELElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtvQkFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7aUJBQ3pEO3FCQUFNO29CQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQy9DO2FBQ0o7UUFDTCxDQUFDLENBQUM7SUEyRE4sQ0FBQztJQTFIRyxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXLENBQXFDLFNBQTJCO1FBQ3ZFLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixPQUFPLElBQUksS0FBSyxDQUFJLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sSUFBSSxLQUFLLENBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxFQUFFLENBQUMsU0FBMEIsRUFBRSxPQUFnQyxFQUFFLFVBQW1CLEtBQUs7UUFDckYsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUMvQztRQUVELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNuQztpQkFBTTtnQkFDSCxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2hDO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN2RDtRQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBMEIsRUFBRSxPQUFnQyxFQUFFLFVBQW1CLEtBQUs7UUFDdkYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFO1lBQzdCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixPQUFPLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQUNGLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBb0JELElBQUksQ0FBQyxTQUEwQixFQUFFLEdBQUcsSUFBVztRQUMzQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksTUFBTSxHQUFtQixFQUFFLENBQUM7UUFDaEMsSUFBSSxRQUFRLEVBQUU7WUFDVixLQUFLLElBQUksT0FBTyxJQUFJLFFBQVEsRUFBRTtnQkFDMUIsSUFBSTtvQkFDQSxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO3dCQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO3FCQUNsQzt5QkFBTSxJQUFJLEdBQUcsWUFBWSxPQUFPLEVBQUU7d0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3BCO3lCQUFNO3dCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNyQztpQkFDSjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwQjthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksR0FBRyxHQUFhLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xELEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2hCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDaEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlCQUF5QixDQUFDLFNBQTBCO1FBQ2hELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDeEIsTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQzdEO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKO0FBOUhELDBCQThIQyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlIHtcbiAgICBwcml2YXRlIF9kaXNwb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc3Bvc2FsQWN0aW9uOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoZGlzcG9zYWxBY3Rpb246ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zYWxBY3Rpb24gPSBkaXNwb3NhbEFjdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgZGlzcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwb3NlZDtcbiAgICB9XG5cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwb3NhbEFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2FsQWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcG9zYWxBY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlRGlzcG9zYWJsZSB7XG4gICAgcHJpdmF0ZSBfZGlzcG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9kaXNwb3NhYmxlczogU2V0PERpc3Bvc2FibGU+ID0gbmV3IFNldCgpO1xuXG4gICAgY29uc3RydWN0b3IoLi4uZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSkge1xuICAgICAgICBmb3IgKGxldCBkaXNwb3NhYmxlIG9mIGRpc3Bvc2FibGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZChkaXNwb3NhYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGlmIChkaXNwb3NhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuYWRkKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuZGVsZXRlKGRpc3Bvc2FibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9kaXNwb3NhYmxlcy5mb3JFYWNoKChkaXNwb3NhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4ge1xuICAgIHByaXZhdGUgZW1pdHRlcjogRW1pdHRlcjtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZyB8IHN5bWJvbDtcblxuICAgIGNvbnN0cnVjdG9yKGVtaXR0ZXI6IEVtaXR0ZXIsIG5hbWU6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlbWl0dGVyO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgW0V2ZW50ICR7dGhpcy5uYW1lLnRvU3RyaW5nKCl9XWA7XG4gICAgfVxuXG4gICAgb24oaGFuZGxlcjogVCwgdW5zaGlmdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub24odGhpcy5uYW1lLCBoYW5kbGVyLCB1bnNoaWZ0KTtcbiAgICB9XG5cbiAgICBvbmNlKGhhbmRsZXI6IFQsIHVuc2hpZnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0dGVyLm9uY2UodGhpcy5uYW1lLCBoYW5kbGVyLCB1bnNoaWZ0KTtcbiAgICB9XG5cbiAgICByZWFkb25seSBlbWl0ID0gKCguLi5hcmdzcGFyYW06IGFueVtdKTogUHJvbWlzZTxSZXR1cm5UeXBlPFQ+PltdID0+IHtcbiAgICAgICAgYXJnc3BhcmFtLnVuc2hpZnQodGhpcy5uYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5lbWl0LmFwcGx5KHRoaXMuZW1pdHRlciwgYXJnc3BhcmFtKTtcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY2xhc3MgRW1pdHRlciB7XG4gICAgcHJpdmF0ZSBfZGlzcG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9oYW5kbGVyc0J5RXZlbnROYW1lOiBNYXA8c3RyaW5nIHwgc3ltYm9sLCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gICAgZ2V0IGRpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzQnlFdmVudE5hbWUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVyc0J5RXZlbnROYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUV2ZW50PFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IHZvaWQ+KGV2ZW50TmFtZT86IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICBpZiAoIWV2ZW50TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudDxUPih0aGlzLCBTeW1ib2woXCJFdmVudFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFdmVudDxUPih0aGlzLCBldmVudE5hbWUpO1xuICAgIH1cblxuICAgIG9uKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgdW5zaGlmdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1pdHRlciBoYXMgYmVlbiBkaXBvc2VkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbnRIYW5kbGVyID0gdGhpcy5faGFuZGxlcnNCeUV2ZW50TmFtZS5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGN1cnJlbnRIYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodW5zaGlmdCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyLnVuc2hpZnQoaGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyLnB1c2goaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyc0J5RXZlbnROYW1lLnNldChldmVudE5hbWUsIFtoYW5kbGVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEaXNwb3NhYmxlKHRoaXMub2ZmLmJpbmQodGhpcywgZXZlbnROYW1lLCBoYW5kbGVyKSk7XG4gICAgfVxuXG4gICAgb25jZShldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHVuc2hpZnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgd3JhcHBlZCA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGRpc3Bvc2FibGUgPSB0aGlzLm9uKGV2ZW50TmFtZSwgd3JhcHBlZCwgdW5zaGlmdCk7XG4gICAgICAgIHJldHVybiBkaXNwb3NhYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgb2ZmID0gKGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCBoYW5kbGVyVG9SZW1vdmU6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgb2xkSGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc0J5RXZlbnROYW1lLmdldChldmVudE5hbWUpO1xuICAgICAgICBpZiAob2xkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGxldCBuZXdIYW5kbGVycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBvbGRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IGhhbmRsZXJUb1JlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdIYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXdIYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVyc0J5RXZlbnROYW1lLnNldChldmVudE5hbWUsIG5ld0hhbmRsZXJzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlcnNCeUV2ZW50TmFtZS5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBlbWl0KGV2ZW50TmFtZTogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc0J5RXZlbnROYW1lLmdldChldmVudE5hbWUpO1xuICAgICAgICBsZXQgcmVzdWx0OiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0ID0gaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChQcm9taXNlLnJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocmV0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFByb21pc2UucmVzb2x2ZShyZXQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRFdmVudE5hbWVzKCkge1xuICAgICAgICBsZXQgcmV0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2hhbmRsZXJzQnlFdmVudE5hbWUpO1xuICAgICAgICBmb3IgKGxldCBrIG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGspID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKGspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgZ2V0RXZlbnRTeW1ib2xzKCkge1xuICAgICAgICBsZXQgcmV0OiBzeW1ib2xbXSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2hhbmRsZXJzQnlFdmVudE5hbWUpO1xuICAgICAgICBmb3IgKGxldCBrIG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGspID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKGspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgbGlzdGVuZXJDb3VudEZvckV2ZW50TmFtZShldmVudE5hbWU6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc0J5RXZlbnROYW1lLmdldChldmVudE5hbWUpO1xuICAgICAgICByZXR1cm4gaGFuZGxlcnMgPyBoYW5kbGVycy5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIGdldFRvdGFsTGlzdGVuZXJDb3VudCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5faGFuZGxlcnNCeUV2ZW50TmFtZSk7XG4gICAgICAgIGZvciAobGV0IGV2ZW50TmFtZSBvZiBrZXlzKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5faGFuZGxlcnNCeUV2ZW50TmFtZS5nZXQoZXZlbnROYW1lKS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iXX0=