UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

212 lines (210 loc) 31.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const constants = tslib_1.__importStar(require("../../constants")); class IdentifierName { constructor(value) { this.value = value; this.nameBrand = 0; } } class ResolvedScope { constructor(variableCount, parent) { this.variableCount = variableCount; this.parent = parent; this.mutablePosition = 0; this.mutableVariables = {}; this.uniqueVariables = new Map(); if (this.parent === undefined) { this.addScope = true; this.scopeCount = 1; this.scopeLength = 1; } else { this.addScope = variableCount > 0; this.scopeCount = this.addScope ? 1 : 0; this.scopeLength = this.parent.scopeLength + this.scopeCount; } } add(name) { const identifier = new IdentifierName(name); const existing = this.mutableVariables[name]; if (existing !== undefined) { return identifier; } this.mutableVariables[identifier.value] = this.mutablePosition; this.mutablePosition += 1; if (this.mutablePosition > this.variableCount) { throw new Error(`Something went wrong. Name: ${name} Position: ${this.mutablePosition} Count: ${this.variableCount}`); } return identifier; } addUnique() { const name = { nameBrand: 0 }; this.uniqueVariables.set(name, this.mutablePosition); this.mutablePosition += 1; if (this.mutablePosition > this.variableCount) { throw new Error(`Something went wrong. Position: ${this.mutablePosition} Count: ${this.variableCount}`); } return name; } set(sb, node, optionsIn, name, scopeLength = this.scopeLength, scopePosition = 0) { const options = sb.pushValueOptions(optionsIn); const position = this.getPosition(name); if (position === undefined) { if (this.parent !== undefined) { this.parent.set(sb, node, options, name, scopeLength, scopePosition + this.scopeCount); } } else { this.loadScope(sb, node, scopeLength, scopePosition); sb.emitPushInt(node, position); sb.emitOp(node, 'ROT'); sb.emitOp(node, 'SETITEM'); } } get(sb, node, options, name, scopeLength = this.scopeLength, scopePosition = 0) { const position = this.getPosition(name); if (position === undefined) { if (this.parent !== undefined) { this.parent.get(sb, node, options, name, scopeLength, scopePosition + this.scopeCount); } } else { this.loadScope(sb, node, scopeLength, scopePosition); sb.emitPushInt(node, position); sb.emitOp(node, 'PICKITEM'); } } getThis(sb, node, _options) { this.loadAll(sb, node); sb.emitPushInt(node, 1); sb.emitOp(node, 'PICKITEM'); } getGlobal(sb, node, options) { if (this.parent === undefined) { this.loadAll(sb, node); sb.emitPushInt(node, 2); sb.emitOp(node, 'PICKITEM'); } else { this.parent.getGlobal(sb, node, options); } } setGlobal(sb, node, options) { if (this.parent === undefined) { this.loadAll(sb, node); sb.emitOp(node, 'TUCK'); sb.emitOp(node, 'OVER'); sb.emitPushInt(node, 2); sb.emitOp(node, 'SWAP'); sb.emitOp(node, 'SETITEM'); sb.emitPushInt(node, 1); sb.emitOp(node, 'SWAP'); sb.emitOp(node, 'SETITEM'); } else { this.parent.setGlobal(sb, node, options); } } pushAll(sb, node, _options) { sb.emitOp(node, 'DUPFROMALTSTACK'); } emit(sb, node, options, func) { if (this.addScope) { this.surround(sb, node, options, func); } else { func(options); } } surround(sb, node, options, func) { if (this.parent === undefined) { sb.emitHelper(node, sb.pushValueOptions(options), sb.helpers.wrapUndefined); sb.emitHelper(node, sb.pushValueOptions(options), sb.helpers.wrapUndefined); sb.emitPushInt(node, 0); sb.emitOp(node, 'NEWARRAY'); sb.emitPushInt(node, 3); sb.emitOp(node, 'PACK'); sb.emitOp(node, 'DUP'); sb.emitOp(node, 'TOALTSTACK'); } else { sb.emitOp(node, 'DUPFROMALTSTACK'); } sb.emitPushInt(node, 0); sb.emitOp(node, 'PICKITEM'); sb.emitOp(node, 'NEWMAP'); sb.emitOp(node, 'APPEND'); const { breakPC, continuePC, catchPC, finallyPC } = options; const nonLocal = breakPC !== undefined || continuePC !== undefined || catchPC !== undefined || finallyPC !== undefined; sb.withProgramCounter((pc) => { let innerOptions = options; if (breakPC !== undefined) { innerOptions = sb.breakPCOptions(innerOptions, pc.getLast()); } if (continuePC !== undefined) { innerOptions = sb.continuePCOptions(innerOptions, pc.getLast()); } if (catchPC !== undefined) { innerOptions = sb.catchPCOptions(innerOptions, pc.getLast()); } if (finallyPC !== undefined) { innerOptions = sb.finallyPCOptions(innerOptions, pc.getLast()); } func(innerOptions); if (nonLocal) { sb.emitPushInt(node, constants.NORMAL_COMPLETION); } }); if (this.parent === undefined) { sb.emitOp(node, 'FROMALTSTACK'); sb.emitOp(node, 'DROP'); } else { sb.emitOp(node, 'DUPFROMALTSTACK'); sb.emitPushInt(node, 0); sb.emitOp(node, 'PICKITEM'); sb.emitOp(node, 'DUP'); sb.emitOp(node, 'ARRAYSIZE'); sb.emitOp(node, 'DEC'); sb.emitOp(node, 'REMOVE'); } if (nonLocal) { this.emitNonLocal(sb, node, constants.BREAK_COMPLETION, breakPC); this.emitNonLocal(sb, node, constants.CONTINUE_COMPLETION, continuePC); this.emitNonLocal(sb, node, constants.THROW_COMPLETION, catchPC); this.emitNonLocal(sb, node, constants.FINALLY_COMPLETION, finallyPC); sb.emitOp(node, 'DROP'); } } emitNonLocal(sb, node, completion, pc) { if (pc !== undefined) { sb.emitOp(node, 'DUP'); sb.emitPushInt(node, completion); sb.emitOp(node, 'NUMEQUAL'); sb.emitJmp(node, 'JMPIF', pc); } } getPosition(name) { if (typeof name === 'string') { return this.mutableVariables[name]; } if (name instanceof IdentifierName) { return this.mutableVariables[name.value]; } return this.uniqueVariables.get(name); } loadScope(sb, node, scopeLength, scopePosition) { this.loadAll(sb, node); sb.emitPushInt(node, 0); sb.emitOp(node, 'PICKITEM'); sb.emitPushInt(node, scopeLength - scopePosition - 1); sb.emitOp(node, 'PICKITEM'); } loadAll(sb, node) { sb.emitOp(node, 'DUPFROMALTSTACK'); } } exports.ResolvedScope = ResolvedScope; //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUM1QixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLElBQW1CO1FBQ3JDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxJQUFJLFlBQVksY0FBYyxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQztRQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxFQUFpQixFQUFFLElBQWEsRUFBRSxXQUFtQixFQUFFLGFBQXFCO1FBQzVGLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXZCLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXhCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLE9BQU8sQ0FBQyxFQUFpQixFQUFFLElBQWE7UUFFOUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUFwU0Qsc0NBb1NDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvc2NvcGUvUmVzb2x2ZWRTY29wZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUHJvZ3JhbUNvdW50ZXIgfSBmcm9tICcuLi9wYyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgTmFtZSwgU2NvcGUgfSBmcm9tICcuL1Njb3BlJztcblxuY2xhc3MgSWRlbnRpZmllck5hbWUgaW1wbGVtZW50cyBOYW1lIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVCcmFuZCA9IDA7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cbn1cblxuZXhwb3J0IGNsYXNzIFJlc29sdmVkU2NvcGUgaW1wbGVtZW50cyBTY29wZSB7XG4gIHByaXZhdGUgbXV0YWJsZVBvc2l0aW9uID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBtdXRhYmxlVmFyaWFibGVzOiB7IFtLIGluIHN0cmluZ10/OiBudW1iZXIgfSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHVuaXF1ZVZhcmlhYmxlczogTWFwPE5hbWUsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcGVMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRTY29wZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzY29wZUNvdW50OiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdmFyaWFibGVDb3VudDogbnVtYmVyLCBwcml2YXRlIHJlYWRvbmx5IHBhcmVudD86IFJlc29sdmVkU2NvcGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRTY29wZSA9IHRydWU7XG4gICAgICB0aGlzLnNjb3BlQ291bnQgPSAxO1xuICAgICAgdGhpcy5zY29wZUxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkU2NvcGUgPSB2YXJpYWJsZUNvdW50ID4gMDtcbiAgICAgIHRoaXMuc2NvcGVDb3VudCA9IHRoaXMuYWRkU2NvcGUgPyAxIDogMDtcbiAgICAgIHRoaXMuc2NvcGVMZW5ndGggPSB0aGlzLnBhcmVudC5zY29wZUxlbmd0aCArIHRoaXMuc2NvcGVDb3VudDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkKG5hbWU6IHN0cmluZyk6IE5hbWUge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBuZXcgSWRlbnRpZmllck5hbWUobmFtZSk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm11dGFibGVWYXJpYWJsZXNbbmFtZV07XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHRoaXMubXV0YWJsZVZhcmlhYmxlc1tpZGVudGlmaWVyLnZhbHVlXSA9IHRoaXMubXV0YWJsZVBvc2l0aW9uO1xuICAgIHRoaXMubXV0YWJsZVBvc2l0aW9uICs9IDE7XG4gICAgaWYgKHRoaXMubXV0YWJsZVBvc2l0aW9uID4gdGhpcy52YXJpYWJsZUNvdW50KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU29tZXRoaW5nIHdlbnQgd3JvbmcuIE5hbWU6ICR7bmFtZX0gUG9zaXRpb246ICR7dGhpcy5tdXRhYmxlUG9zaXRpb259IENvdW50OiAke3RoaXMudmFyaWFibGVDb3VudH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfVxuXG4gIHB1YmxpYyBhZGRVbmlxdWUoKTogTmFtZSB7XG4gICAgY29uc3QgbmFtZSA9IHsgbmFtZUJyYW5kOiAwIH07XG4gICAgdGhpcy51bmlxdWVWYXJpYWJsZXMuc2V0KG5hbWUsIHRoaXMubXV0YWJsZVBvc2l0aW9uKTtcbiAgICB0aGlzLm11dGFibGVQb3NpdGlvbiArPSAxO1xuICAgIGlmICh0aGlzLm11dGFibGVQb3NpdGlvbiA+IHRoaXMudmFyaWFibGVDb3VudCkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRocm93IG5ldyBFcnJvcihgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBvc2l0aW9uOiAke3RoaXMubXV0YWJsZVBvc2l0aW9ufSBDb3VudDogJHt0aGlzLnZhcmlhYmxlQ291bnR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvLyBbdmFsdWVdXG4gIHB1YmxpYyBzZXQoXG4gICAgc2I6IFNjcmlwdEJ1aWxkZXIsXG4gICAgbm9kZTogdHMuTm9kZSxcbiAgICBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyxcbiAgICBuYW1lOiBOYW1lIHwgc3RyaW5nLFxuICAgIHNjb3BlTGVuZ3RoOiBudW1iZXIgPSB0aGlzLnNjb3BlTGVuZ3RoLFxuICAgIHNjb3BlUG9zaXRpb24gPSAwLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihuYW1lKTtcbiAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQuc2V0KHNiLCBub2RlLCBvcHRpb25zLCBuYW1lLCBzY29wZUxlbmd0aCwgc2NvcGVQb3NpdGlvbiArIHRoaXMuc2NvcGVDb3VudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFtzY29wZSwgdmFsXVxuICAgICAgdGhpcy5sb2FkU2NvcGUoc2IsIG5vZGUsIHNjb3BlTGVuZ3RoLCBzY29wZVBvc2l0aW9uKTtcbiAgICAgIC8vIFtwb3NpdGlvbiwgc2NvcGUsIHZhbF1cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIHBvc2l0aW9uKTtcbiAgICAgIC8vIFt2YWwsIHBvc2l0aW9uLCBzY29wZV1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnUk9UJyk7XG4gICAgICAvLyBbXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdTRVRJVEVNJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICBub2RlOiB0cy5Ob2RlLFxuICAgIG9wdGlvbnM6IFZpc2l0T3B0aW9ucyxcbiAgICBuYW1lOiBOYW1lIHwgc3RyaW5nLFxuICAgIHNjb3BlTGVuZ3RoOiBudW1iZXIgPSB0aGlzLnNjb3BlTGVuZ3RoLFxuICAgIHNjb3BlUG9zaXRpb24gPSAwLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb24obmFtZSk7XG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGFyZW50LmdldChzYiwgbm9kZSwgb3B0aW9ucywgbmFtZSwgc2NvcGVMZW5ndGgsIHNjb3BlUG9zaXRpb24gKyB0aGlzLnNjb3BlQ291bnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBbc2NvcGVdXG4gICAgICB0aGlzLmxvYWRTY29wZShzYiwgbm9kZSwgc2NvcGVMZW5ndGgsIHNjb3BlUG9zaXRpb24pO1xuICAgICAgLy8gW3Bvc2l0aW9uLCBzY29wZV1cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIHBvc2l0aW9uKTtcbiAgICAgIC8vIFt2YWxdXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ1BJQ0tJVEVNJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFRoaXMoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLk5vZGUsIF9vcHRpb25zOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAvLyBbW3Njb3BlcywgdGhpc11dXG4gICAgdGhpcy5sb2FkQWxsKHNiLCBub2RlKTtcbiAgICAvLyBbMSwgW3Njb3BlcywgdGhpc11dXG4gICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMSk7XG4gICAgLy8gW3RoaXNdXG4gICAgc2IuZW1pdE9wKG5vZGUsICdQSUNLSVRFTScpO1xuICB9XG5cbiAgcHVibGljIGdldEdsb2JhbChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uczogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFtbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgdGhpcy5sb2FkQWxsKHNiLCBub2RlKTtcbiAgICAgIC8vIFsyLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMik7XG4gICAgICAvLyBbdGhpc11cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnUElDS0lURU0nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJlbnQuZ2V0R2xvYmFsKHNiLCBub2RlLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0R2xvYmFsKHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gW1tzY29wZXMsIHRoaXMsIGdsb2JhbF0sIHZhbF1cbiAgICAgIHRoaXMubG9hZEFsbChzYiwgbm9kZSk7XG4gICAgICAvLyBbW3Njb3BlcywgdGhpcywgZ2xvYmFsXSwgdmFsLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdUVUNLJyk7XG4gICAgICAvLyBbdmFsLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdLCB2YWwsIFtzY29wZXMsIHRoaXMsIGdsb2JhbF1dXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ09WRVInKTtcbiAgICAgIC8vIFsyLCB2YWwsIFtzY29wZXMsIHRoaXMsIGdsb2JhbF0sIHZhbCwgW3Njb3BlcywgdGhpcywgZ2xvYmFsXV1cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDIpO1xuICAgICAgLy8gW3ZhbCwgMiwgW3Njb3BlcywgdGhpcywgZ2xvYmFsXSwgdmFsLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAvLyBbdmFsLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdTRVRJVEVNJyk7XG4gICAgICAvLyBbMSwgdmFsLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMSk7XG4gICAgICAvLyBbdmFsLCAxLCBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdTV0FQJyk7XG4gICAgICAvLyBbXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdTRVRJVEVNJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB0aGlzLnBhcmVudC5zZXRHbG9iYWwoc2IsIG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwdXNoQWxsKHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBfb3B0aW9uczogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgc2IuZW1pdE9wKG5vZGUsICdEVVBGUk9NQUxUU1RBQ0snKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMsIGZ1bmM6IChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZGRTY29wZSkge1xuICAgICAgdGhpcy5zdXJyb3VuZChzYiwgbm9kZSwgb3B0aW9ucywgZnVuYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bmMob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdXJyb3VuZChcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICBub2RlOiB0cy5Ob2RlLFxuICAgIG9wdGlvbnM6IFZpc2l0T3B0aW9ucyxcbiAgICBmdW5jOiAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gW2dsb2JhbF1cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSwgc2IuaGVscGVycy53cmFwVW5kZWZpbmVkKTtcbiAgICAgIC8vIFt0aGlzLCBnbG9iYWxdXG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIHNiLnB1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucyksIHNiLmhlbHBlcnMud3JhcFVuZGVmaW5lZCk7XG4gICAgICAvLyBbMCwgdGhpcywgZ2xvYmFsXVxuICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMCk7XG4gICAgICAvLyBbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ05FV0FSUkFZJyk7XG4gICAgICAvLyBbMywgc2NvcGVzLCB0aGlzLCBnbG9iYWxdXG4gICAgICBzYi5lbWl0UHVzaEludChub2RlLCAzKTtcbiAgICAgIC8vIFtbc2NvcGVzLCB0aGlzLCBnbG9iYWxdXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdQQUNLJyk7XG4gICAgICAvLyBbW3Njb3BlcywgdGhpcywgZ2xvYmFsXSwgW3Njb3BlcywgdGhpcywgZ2xvYmFsXV1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAvLyBbW3Njb3BlcywgdGhpcywgZ2xvYmFsXV1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnVE9BTFRTVEFDSycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBbW3Njb3BlcywgdGhpc11dXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUEZST01BTFRTVEFDSycpO1xuICAgIH1cbiAgICAvLyBbMCwgW3Njb3BlcywgdGhpc11dXG4gICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMCk7XG4gICAgLy8gW3Njb3Blc11cbiAgICBzYi5lbWl0T3Aobm9kZSwgJ1BJQ0tJVEVNJyk7XG4gICAgLy8gW3Njb3BlLCBzY29wZXNdXG4gICAgc2IuZW1pdE9wKG5vZGUsICdORVdNQVAnKTtcbiAgICAvLyBbXVxuICAgIHNiLmVtaXRPcChub2RlLCAnQVBQRU5EJyk7XG5cbiAgICBjb25zdCB7IGJyZWFrUEMsIGNvbnRpbnVlUEMsIGNhdGNoUEMsIGZpbmFsbHlQQyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBub25Mb2NhbCA9XG4gICAgICBicmVha1BDICE9PSB1bmRlZmluZWQgfHwgY29udGludWVQQyAhPT0gdW5kZWZpbmVkIHx8IGNhdGNoUEMgIT09IHVuZGVmaW5lZCB8fCBmaW5hbGx5UEMgIT09IHVuZGVmaW5lZDtcbiAgICBzYi53aXRoUHJvZ3JhbUNvdW50ZXIoKHBjKSA9PiB7XG4gICAgICBsZXQgaW5uZXJPcHRpb25zID0gb3B0aW9ucztcbiAgICAgIGlmIChicmVha1BDICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5uZXJPcHRpb25zID0gc2IuYnJlYWtQQ09wdGlvbnMoaW5uZXJPcHRpb25zLCBwYy5nZXRMYXN0KCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGludWVQQyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlubmVyT3B0aW9ucyA9IHNiLmNvbnRpbnVlUENPcHRpb25zKGlubmVyT3B0aW9ucywgcGMuZ2V0TGFzdCgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhdGNoUEMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbm5lck9wdGlvbnMgPSBzYi5jYXRjaFBDT3B0aW9ucyhpbm5lck9wdGlvbnMsIHBjLmdldExhc3QoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5UEMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbm5lck9wdGlvbnMgPSBzYi5maW5hbGx5UENPcHRpb25zKGlubmVyT3B0aW9ucywgcGMuZ2V0TGFzdCgpKTtcbiAgICAgIH1cblxuICAgICAgZnVuYyhpbm5lck9wdGlvbnMpO1xuICAgICAgaWYgKG5vbkxvY2FsKSB7XG4gICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGNvbnN0YW50cy5OT1JNQUxfQ09NUExFVElPTik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gW1tzY29wZXMsIHVuZGVmaW5lZF1dXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ0ZST01BTFRTVEFDSycpO1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBbW3Njb3BlcywgdW5kZWZpbmVkXV1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQRlJPTUFMVFNUQUNLJyk7XG4gICAgICAvLyBbMCwgW3Njb3BlcywgdW5kZWZpbmVkXV1cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDApO1xuICAgICAgLy8gW3Njb3Blc11cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnUElDS0lURU0nKTtcbiAgICAgIC8vIFtzY29wZXMsIHNjb3Blc11cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAvLyBbc2l6ZSwgc2NvcGVzXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdBUlJBWVNJWkUnKTtcbiAgICAgIC8vIFtzaXplIC0gMSwgc2NvcGVzXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdERUMnKTtcbiAgICAgIC8vIFtdXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ1JFTU9WRScpO1xuICAgIH1cblxuICAgIGlmIChub25Mb2NhbCkge1xuICAgICAgdGhpcy5lbWl0Tm9uTG9jYWwoc2IsIG5vZGUsIGNvbnN0YW50cy5CUkVBS19DT01QTEVUSU9OLCBicmVha1BDKTtcbiAgICAgIHRoaXMuZW1pdE5vbkxvY2FsKHNiLCBub2RlLCBjb25zdGFudHMuQ09OVElOVUVfQ09NUExFVElPTiwgY29udGludWVQQyk7XG4gICAgICB0aGlzLmVtaXROb25Mb2NhbChzYiwgbm9kZSwgY29uc3RhbnRzLlRIUk9XX0NPTVBMRVRJT04sIGNhdGNoUEMpO1xuICAgICAgdGhpcy5lbWl0Tm9uTG9jYWwoc2IsIG5vZGUsIGNvbnN0YW50cy5GSU5BTExZX0NPTVBMRVRJT04sIGZpbmFsbHlQQyk7XG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXROb25Mb2NhbChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgY29tcGxldGlvbjogbnVtYmVyLCBwYzogUHJvZ3JhbUNvdW50ZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAocGMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGNvbXBsZXRpb24pO1xuICAgICAgc2IuZW1pdE9wKG5vZGUsICdOVU1FUVVBTCcpO1xuICAgICAgc2IuZW1pdEptcChub2RlLCAnSk1QSUYnLCBwYyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbihuYW1lOiBOYW1lIHwgc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdXRhYmxlVmFyaWFibGVzW25hbWVdO1xuICAgIH1cblxuICAgIGlmIChuYW1lIGluc3RhbmNlb2YgSWRlbnRpZmllck5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLm11dGFibGVWYXJpYWJsZXNbbmFtZS52YWx1ZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudW5pcXVlVmFyaWFibGVzLmdldChuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFNjb3BlKHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBzY29wZUxlbmd0aDogbnVtYmVyLCBzY29wZVBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRBbGwoc2IsIG5vZGUpO1xuICAgIC8vIFswLFtzY29wZXMsIHRoaXNdXVxuICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDApO1xuICAgIC8vIFtzY29wZXNdXG4gICAgc2IuZW1pdE9wKG5vZGUsICdQSUNLSVRFTScpO1xuICAgIC8vIFtzY29wZUluZGV4LCBzY29wZXNdXG4gICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgc2NvcGVMZW5ndGggLSBzY29wZVBvc2l0aW9uIC0gMSk7XG4gICAgLy8gW3Njb3BlXVxuICAgIHNiLmVtaXRPcChub2RlLCAnUElDS0lURU0nKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEFsbChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSk6IHZvaWQge1xuICAgIC8vIFtbc2NvcGVzLCB0aGlzXV1cbiAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUEZST01BTFRTVEFDSycpO1xuICB9XG59XG4iXX0=