ActionManager.js 32.5 KB

                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/script/avg/ActionManager.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, '86449vqe09Fybjsr9QzRedG', 'ActionManager');
// script/avg/ActionManager.ts

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActionManager = void 0;
const ActionModel_1 = require("./model/ActionModel");
const EditorEvents_1 = require("./EditorEvents");
const GameRecord_1 = require("./game-data/GameRecord");
const simba_random_1 = require("simba-random");
const AudioManager_1 = require("../common/gameplay/managers/AudioManager");
const runningExecutors = new Set();
let _affectRecord = true;
class ActionExecutor {
    constructor(action) {
        this.sleep = (t) => {
            return new Promise((resolve) => {
                this._timerHandle = setTimeout(() => {
                    this._timerHandle = undefined;
                    resolve();
                }, t * 1000);
            });
        };
        this.execute = async () => {
            runningExecutors.add(this);
            if (this._action.trigger === ActionModel_1.TriggerType.Click) { // wait for click events
                // await new Promise((resolve) => {
                //     this._disposable = ClickEvent.once(() => {
                //         resolve();
                //     })
                // });
            }
            if (this._action.trigger === ActionModel_1.TriggerType.Event) {
                if (!this._action.triggerEvent)
                    return;
                return new Promise((resolve) => {
                    this._disposable = EditorEvents_1.EditorEvents.emitter.once(this._action.triggerEvent, async () => {
                        let result = await this.executeInternal();
                        resolve();
                        return result;
                    });
                });
            }
            else {
                return this.executeInternal();
            }
        };
        this.executeInternal = async () => {
            if (this._action.delay) {
                await this.sleep(this._action.delay);
            }
            let finished = true;
            if (this.nextExecutor && this.nextExecutor._action.trigger === ActionModel_1.TriggerType.PreviousStart) {
                [finished] = await Promise.all([this.onExec(), this.nextExecutor.execute()]);
            }
            else {
                finished = await this.onExec();
                if (this.nextExecutor) {
                    await this.nextExecutor.execute();
                }
            }
            if (finished) {
                runningExecutors.delete(this);
            }
        };
        this.stop = () => {
            this.onStop();
            if (this._disposable)
                this._disposable.dispose();
            if (this._timerHandle)
                clearTimeout(this._timerHandle);
        };
        this._action = action;
    }
}
class ModifyVariableExecutor extends ActionExecutor {
    onExec() {
        if (!_affectRecord)
            return Promise.resolve(true);
        try {
            let action = this._action;
            let varValue = GameRecord_1.GameRecord.getVariableValue(action.target);
            let value = action.oprand.value;
            if (action.oprand.type === ActionModel_1.OperandType.Const) {
                if (typeof varValue === "number") {
                    value = Number.parseFloat(value);
                }
            }
            else if (action.oprand.type === ActionModel_1.OperandType.Random) {
                let arr = value.split("-");
                let min = Number.parseFloat(arr[0]);
                let max = Number.parseFloat(arr[1]);
                value = simba_random_1.Random.range(min, max);
            }
            else if (action.oprand.type === ActionModel_1.OperandType.Variable) {
                value = GameRecord_1.GameRecord.getVariableValue(value);
            }
            switch (action.operator) {
                case ActionModel_1.VariableOperator.Assign:
                    break;
                case ActionModel_1.VariableOperator.Plus:
                    varValue += value;
                    break;
                case ActionModel_1.VariableOperator.Minus:
                    varValue -= value;
                    break;
                case ActionModel_1.VariableOperator.Multiply:
                    varValue *= value;
                    break;
                case ActionModel_1.VariableOperator.Divide:
                    varValue /= value;
                    break;
                case ActionModel_1.VariableOperator.Modulo:
                    varValue %= value;
                    break;
            }
            GameRecord_1.GameRecord.setVariableValue(action.target, varValue);
        }
        catch (e) {
            console.error(e);
        }
        return Promise.resolve(true);
    }
    onStop() {
    }
}
class PlayAudioExecutor extends ActionExecutor {
    async onExec() {
        let action = this._action;
        if (action.audioType === "effect") {
            if (action.stopPreviousSound) {
                AudioManager_1.AudioManager.stopAllEffect();
            }
            if (action.loopCount <= 0) {
                this.audioId = await AudioManager_1.AudioManager.playEffect(action.filePath, 0);
                return false;
            }
            else {
                AudioManager_1.AudioManager.playEffect(action.filePath, action.loopCount);
            }
        }
        else {
            if (!action.filePath) {
                AudioManager_1.AudioManager.stopMusic();
            }
            else {
                AudioManager_1.AudioManager.playMusic(action.filePath);
            }
            if (_affectRecord) {
                GameRecord_1.GameRecord.recordVariables.bgm = action.filePath;
            }
        }
        return true;
    }
    onStop() {
        if (this.audioId !== undefined) {
            AudioManager_1.AudioManager.stopEffect(this.audioId);
        }
    }
}
class EmitEventExecutor extends ActionExecutor {
    async onExec() {
        if (this._action.emitEvent) {
            await Promise.all(EditorEvents_1.EditorEvents.emitter.emit(this._action.emitEvent, this._action.param));
        }
        return Promise.resolve(true);
    }
    onStop() {
    }
}
var ActionManager;
(function (ActionManager) {
    function getExecutor(action) {
        if (action.type === ActionModel_1.ActionType.ModifyVariable) {
            return new ModifyVariableExecutor(action);
        }
        else if (action.type === ActionModel_1.ActionType.PlayAudio) {
            return new PlayAudioExecutor(action);
        }
        else if (action.type === ActionModel_1.ActionType.EmitEvent) {
            return new EmitEventExecutor(action);
        }
        return undefined;
    }
    let stopped = false;
    let prevActions;
    async function executeActions(actionData, filter, affectRecord = true) {
        // if (prevActions === actionData) {
        //     throw new Error("Action already executed.");
        // }
        // prevActions = actionData;
        _affectRecord = affectRecord;
        if (!stopped) {
            stop();
        }
        stopped = false;
        let firstActionExecutor;
        let triggerType = ActionModel_1.TriggerType.PreviousStart;
        let executors = [];
        let noWaitExecutors = [];
        if (actionData.actions) {
            let currExecutor;
            for (let i = 0; i < actionData.actions.length; i++) {
                if (i > 0 && actionData.actions[i].trigger === ActionModel_1.TriggerType.Event) {
                    if (firstActionExecutor) {
                        executors.push(firstActionExecutor);
                        firstActionExecutor = undefined;
                    }
                }
                let action = actionData.actions[i];
                if (filter && !filter(action)) {
                    continue;
                }
                let executor = getExecutor(action);
                if (executor) {
                    if (!firstActionExecutor) {
                        firstActionExecutor = executor;
                        triggerType = action.trigger;
                        currExecutor = executor;
                    }
                    else if (currExecutor) {
                        currExecutor.nextExecutor = executor;
                        currExecutor = executor;
                    }
                }
            }
            if (firstActionExecutor) {
                if (triggerType === ActionModel_1.TriggerType.PreviousStart || triggerType === ActionModel_1.TriggerType.PreviousEnd) {
                    executors.push(firstActionExecutor);
                }
                else {
                    noWaitExecutors.push(firstActionExecutor);
                }
            }
        }
        if (noWaitExecutors.length) {
            noWaitExecutors.forEach((v) => v.execute());
        }
        let promises = executors.map(v => v.execute());
        if (executors.length) {
            await Promise.all(promises);
        }
        if (stopped)
            return;
    }
    ActionManager.executeActions = executeActions;
    function stop() {
        if (stopped)
            return;
        stopped = true;
        for (let executor of runningExecutors) {
            executor.stop();
        }
        runningExecutors.clear();
        //add line
        // prevActions = undefined;
    }
    ActionManager.stop = stop;
})(ActionManager = exports.ActionManager || (exports.ActionManager = {}));

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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvYXZnL0FjdGlvbk1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEscURBQXNLO0FBQ3RLLGlEQUE4QztBQUM5Qyx1REFBb0Q7QUFDcEQsK0NBQXNDO0FBQ3RDLDJFQUF3RTtBQUV4RSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFZLENBQUM7QUFFN0MsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBT3pCLE1BQWUsY0FBYztJQU16QixZQUFZLE1BQXVCO1FBSXpCLFVBQUssR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztvQkFDOUIsT0FBTyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQTtRQUlELFlBQU8sR0FBRyxLQUFLLElBQW1CLEVBQUU7WUFDaEMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUsseUJBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSx3QkFBd0I7Z0JBQ3RFLG1DQUFtQztnQkFDbkMsaURBQWlEO2dCQUNqRCxxQkFBcUI7Z0JBQ3JCLFNBQVM7Z0JBQ1QsTUFBTTthQUNUO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyx5QkFBVyxDQUFDLEtBQUssRUFBRTtnQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtvQkFBRSxPQUFPO2dCQUN2QyxPQUFPLElBQUksT0FBTyxDQUFDLENB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ZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcFJlYWRvbmx5IH0gZnJvbSBcInNpbWJhLXV0aWxzXCI7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSBcInNpbWJhLWV2ZW50a2l0XCI7XG5pbXBvcnQgeyBBY3Rpb24sIFRyaWdnZXJUeXBlLCBNb2RpZnlWYXJpYWJsZUFjdGlvbiwgT3BlcmFuZFR5cGUsIFZhcmlhYmxlT3BlcmF0b3IsIEVtaXRFdmVudEFjdGlvbiwgQWN0aW9uVHlwZSwgUGxheUF1ZGlvQWN0aW9uLCBBY3Rpb25zIH0gZnJvbSBcIi4vbW9kZWwvQWN0aW9uTW9kZWxcIjtcbmltcG9ydCB7IEVkaXRvckV2ZW50cyB9IGZyb20gXCIuL0VkaXRvckV2ZW50c1wiO1xuaW1wb3J0IHsgR2FtZVJlY29yZCB9IGZyb20gXCIuL2dhbWUtZGF0YS9HYW1lUmVjb3JkXCI7XG5pbXBvcnQgeyBSYW5kb20gfSBmcm9tIFwic2ltYmEtcmFuZG9tXCI7XG5pbXBvcnQgeyBBdWRpb01hbmFnZXIgfSBmcm9tIFwiLi4vY29tbW9uL2dhbWVwbGF5L21hbmFnZXJzL0F1ZGlvTWFuYWdlclwiO1xuXG5jb25zdCBydW5uaW5nRXhlY3V0b3JzID0gbmV3IFNldDxFeGVjdXRvcj4oKTtcblxubGV0IF9hZmZlY3RSZWNvcmQgPSB0cnVlO1xuXG5pbnRlcmZhY2UgRXhlY3V0b3Ige1xuICAgIGV4ZWN1dGUoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBzdG9wKCk6IHZvaWQ7XG59XG5cbmFic3RyYWN0IGNsYXNzIEFjdGlvbkV4ZWN1dG9yPFQgZXh0ZW5kcyBBY3Rpb24+IGltcGxlbWVudHMgRXhlY3V0b3Ige1xuICAgIHByaXZhdGUgX3RpbWVySGFuZGxlOiBhbnk7XG4gICAgcHJvdGVjdGVkIF9hY3Rpb246IERlZXBSZWFkb25seTxUPjtcbiAgICBuZXh0RXhlY3V0b3I/OiBBY3Rpb25FeGVjdXRvcjxhbnk+O1xuICAgIHByaXZhdGUgX2Rpc3Bvc2FibGU/OiBEaXNwb3NhYmxlO1xuXG4gICAgY29uc3RydWN0b3IoYWN0aW9uOiBEZWVwUmVhZG9ubHk8VD4pIHtcbiAgICAgICAgdGhpcy5fYWN0aW9uID0gYWN0aW9uO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzbGVlcCA9ICh0OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHQgKiAxMDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3Qgb25FeGVjKCk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgICBleGVjdXRlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBydW5uaW5nRXhlY3V0b3JzLmFkZCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGlvbi50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5DbGljaykgeyAvLyB3YWl0IGZvciBjbGljayBldmVudHNcbiAgICAgICAgICAgIC8vIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fZGlzcG9zYWJsZSA9IENsaWNrRXZlbnQub25jZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIC8vICAgICB9KVxuICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2FjdGlvbi50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5FdmVudCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9hY3Rpb24udHJpZ2dlckV2ZW50KSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NhYmxlID0gRWRpdG9yRXZlbnRzLmVtaXR0ZXIub25jZSh0aGlzLl9hY3Rpb24udHJpZ2dlckV2ZW50ISwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlSW50ZXJuYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXhlY3V0ZUludGVybmFsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fYWN0aW9uLmRlbGF5KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKHRoaXMuX2FjdGlvbi5kZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubmV4dEV4ZWN1dG9yICYmIHRoaXMubmV4dEV4ZWN1dG9yLl9hY3Rpb24udHJpZ2dlciA9PT0gVHJpZ2dlclR5cGUuUHJldmlvdXNTdGFydCkge1xuICAgICAgICAgICAgW2ZpbmlzaGVkXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLm9uRXhlYygpLCB0aGlzLm5leHRFeGVjdXRvci5leGVjdXRlKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gYXdhaXQgdGhpcy5vbkV4ZWMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHRFeGVjdXRvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmV4dEV4ZWN1dG9yLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJ1bm5pbmdFeGVjdXRvcnMuZGVsZXRlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3Qgb25TdG9wKCk6IHZvaWQ7XG5cbiAgICBzdG9wID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm9uU3RvcCgpO1xuICAgICAgICBpZiAodGhpcy5fZGlzcG9zYWJsZSkgdGhpcy5fZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0aGlzLl90aW1lckhhbmRsZSkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySGFuZGxlKTtcbiAgICB9XG59XG5cbmNsYXNzIE1vZGlmeVZhcmlhYmxlRXhlY3V0b3IgZXh0ZW5kcyBBY3Rpb25FeGVjdXRvcjxNb2RpZnlWYXJpYWJsZUFjdGlvbj4ge1xuICAgIG9uRXhlYygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKCFfYWZmZWN0UmVjb3JkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHRoaXMuX2FjdGlvbjtcbiAgICAgICAgICAgIGxldCB2YXJWYWx1ZSA9IEdhbWVSZWNvcmQuZ2V0VmFyaWFibGVWYWx1ZShhY3Rpb24udGFyZ2V0KTtcbiAgICAgICAgICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyID0gYWN0aW9uLm9wcmFuZC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24ub3ByYW5kLnR5cGUgPT09IE9wZXJhbmRUeXBlLkNvbnN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YXJWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5vcHJhbmQudHlwZSA9PT0gT3BlcmFuZFR5cGUuUmFuZG9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyciA9IHZhbHVlLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbWluID0gTnVtYmVyLnBhcnNlRmxvYXQoYXJyWzBdKTtcbiAgICAgICAgICAgICAgICBsZXQgbWF4ID0gTnVtYmVyLnBhcnNlRmxvYXQoYXJyWzFdKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFJhbmRvbS5yYW5nZShtaW4sIG1heCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5vcHJhbmQudHlwZSA9PT0gT3BlcmFuZFR5cGUuVmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEdhbWVSZWNvcmQuZ2V0VmFyaWFibGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5vcGVyYXRvcikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmFyaWFibGVPcGVyYXRvci5Bc3NpZ246XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWYXJpYWJsZU9wZXJhdG9yLlBsdXM6XG4gICAgICAgICAgICAgICAgICAgIHZhclZhbHVlICs9ICh2YWx1ZSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZhcmlhYmxlT3BlcmF0b3IuTWludXM6XG4gICAgICAgICAgICAgICAgICAgICh2YXJWYWx1ZSBhcyBudW1iZXIpIC09ICh2YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZhcmlhYmxlT3BlcmF0b3IuTXVsdGlwbHk6XG4gICAgICAgICAgICAgICAgICAgICh2YXJWYWx1ZSBhcyBudW1iZXIpICo9ICh2YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZhcmlhYmxlT3BlcmF0b3IuRGl2aWRlOlxuICAgICAgICAgICAgICAgICAgICAodmFyVmFsdWUgYXMgbnVtYmVyKSAvPSAodmFsdWUgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWYXJpYWJsZU9wZXJhdG9yLk1vZHVsbzpcbiAgICAgICAgICAgICAgICAgICAgKHZhclZhbHVlIGFzIG51bWJlcikgJT0gKHZhbHVlIGFzIG51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgR2FtZVJlY29yZC5zZXRWYXJpYWJsZVZhbHVlKGFjdGlvbi50YXJnZXQsIHZhclZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cblxuICAgIG9uU3RvcCgpOiB2b2lkIHtcbiAgICB9XG59XG5cbmNsYXNzIFBsYXlBdWRpb0V4ZWN1dG9yIGV4dGVuZHMgQWN0aW9uRXhlY3V0b3I8UGxheUF1ZGlvQWN0aW9uPiB7XG4gICAgcHJpdmF0ZSBhdWRpb0lkPzogbnVtYmVyO1xuXG4gICAgYXN5bmMgb25FeGVjKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgYWN0aW9uID0gdGhpcy5fYWN0aW9uO1xuICAgICAgICBpZiAoYWN0aW9uLmF1ZGlvVHlwZSA9PT0gXCJlZmZlY3RcIikge1xuICAgICAgICAgICAgaWYgKGFjdGlvbi5zdG9wUHJldmlvdXNTb3VuZCkge1xuICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5zdG9wQWxsRWZmZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmxvb3BDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpb0lkID0gYXdhaXQgQXVkaW9NYW5hZ2VyLnBsYXlFZmZlY3QoYWN0aW9uLmZpbGVQYXRoLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5wbGF5RWZmZWN0KGFjdGlvbi5maWxlUGF0aCwgYWN0aW9uLmxvb3BDb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWFjdGlvbi5maWxlUGF0aCkge1xuICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5zdG9wTXVzaWMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLnBsYXlNdXNpYyhhY3Rpb24uZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9hZmZlY3RSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICBHYW1lUmVjb3JkLnJlY29yZFZhcmlhYmxlcy5iZ20gPSBhY3Rpb24uZmlsZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBvblN0b3AoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmF1ZGlvSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BFZmZlY3QodGhpcy5hdWRpb0lkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRW1pdEV2ZW50RXhlY3V0b3IgZXh0ZW5kcyBBY3Rpb25FeGVjdXRvcjxFbWl0RXZlbnRBY3Rpb24+IHtcbiAgICBhc3luYyBvbkV4ZWMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLl9hY3Rpb24uZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChFZGl0b3JFdmVudHMuZW1pdHRlci5lbWl0KHRoaXMuX2FjdGlvbi5lbWl0RXZlbnQsIHRoaXMuX2FjdGlvbi5wYXJhbSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgb25TdG9wKCk6IHZvaWQge1xuICAgIH1cblxufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFjdGlvbk1hbmFnZXIge1xuICAgIGZ1bmN0aW9uIGdldEV4ZWN1dG9yKGFjdGlvbjogQWN0aW9uKSB7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZS5Nb2RpZnlWYXJpYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RpZnlWYXJpYWJsZUV4ZWN1dG9yKGFjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuUGxheUF1ZGlvKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXlBdWRpb0V4ZWN1dG9yKGFjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGUuRW1pdEV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVtaXRFdmVudEV4ZWN1dG9yKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgIGxldCBwcmV2QWN0aW9uczogRGVlcFJlYWRvbmx5PEFjdGlvbnM+O1xuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQWN0aW9ucyhhY3Rpb25EYXRhOiBEZWVwUmVhZG9ubHk8QWN0aW9ucz4sIGZpbHRlcj86IChhY3Rpb246IERlZXBSZWFkb25seTxBY3Rpb24+KSA9PiBib29sZWFuLCBhZmZlY3RSZWNvcmQgPSB0cnVlKSB7XG4gICAgICAgIC8vIGlmIChwcmV2QWN0aW9ucyA9PT0gYWN0aW9uRGF0YSkge1xuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWN0aW9uIGFscmVhZHkgZXhlY3V0ZWQuXCIpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHByZXZBY3Rpb25zID0gYWN0aW9uRGF0YTtcbiAgICAgICAgX2FmZmVjdFJlY29yZCA9IGFmZmVjdFJlY29yZDtcbiAgICAgICAgaWYgKCFzdG9wcGVkKSB7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcHBlZCA9IGZhbHNlO1xuXG4gICAgICAgIGxldCBmaXJzdEFjdGlvbkV4ZWN1dG9yOiBFeGVjdXRvciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSA9IFRyaWdnZXJUeXBlLlByZXZpb3VzU3RhcnQ7XG4gICAgICAgIGxldCBleGVjdXRvcnM6IEV4ZWN1dG9yW10gPSBbXTtcbiAgICAgICAgbGV0IG5vV2FpdEV4ZWN1dG9yczogRXhlY3V0b3JbXSA9IFtdO1xuICAgICAgICBpZiAoYWN0aW9uRGF0YS5hY3Rpb25zKSB7XG4gICAgICAgICAgICBsZXQgY3VyckV4ZWN1dG9yOiBBY3Rpb25FeGVjdXRvcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3Rpb25EYXRhLmFjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgYWN0aW9uRGF0YS5hY3Rpb25zW2ldLnRyaWdnZXIgPT09IFRyaWdnZXJUeXBlLkV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEFjdGlvbkV4ZWN1dG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvcnMucHVzaChmaXJzdEFjdGlvbkV4ZWN1dG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QWN0aW9uRXhlY3V0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGFjdGlvbkRhdGEuYWN0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICYmICFmaWx0ZXIoYWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGV4ZWN1dG9yID0gZ2V0RXhlY3V0b3IoYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdEFjdGlvbkV4ZWN1dG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFjdGlvbkV4ZWN1dG9yID0gZXhlY3V0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVHlwZSA9IGFjdGlvbi50cmlnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyckV4ZWN1dG9yID0gZXhlY3V0b3I7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckV4ZWN1dG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyRXhlY3V0b3IubmV4dEV4ZWN1dG9yID0gZXhlY3V0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyRXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpcnN0QWN0aW9uRXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlclR5cGUgPT09IFRyaWdnZXJUeXBlLlByZXZpb3VzU3RhcnQgfHwgdHJpZ2dlclR5cGUgPT09IFRyaWdnZXJUeXBlLlByZXZpb3VzRW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9ycy5wdXNoKGZpcnN0QWN0aW9uRXhlY3V0b3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vV2FpdEV4ZWN1dG9ycy5wdXNoKGZpcnN0QWN0aW9uRXhlY3V0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub1dhaXRFeGVjdXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBub1dhaXRFeGVjdXRvcnMuZm9yRWFjaCgodikgPT4gdi5leGVjdXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm9taXNlcyA9IGV4ZWN1dG9ycy5tYXAodiA9PiB2LmV4ZWN1dGUoKSk7XG4gICAgICAgIGlmIChleGVjdXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RvcHBlZCkgcmV0dXJuO1xuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoc3RvcHBlZCkgcmV0dXJuO1xuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgZXhlY3V0b3Igb2YgcnVubmluZ0V4ZWN1dG9ycykge1xuICAgICAgICAgICAgZXhlY3V0b3Iuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bm5pbmdFeGVjdXRvcnMuY2xlYXIoKTtcbiAgICAgICAgLy9hZGQgbGluZVxuICAgICAgICAvLyBwcmV2QWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG59Il19