UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

138 lines (136 loc) 22.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const lodash_1 = tslib_1.__importDefault(require("lodash")); const DiagnosticCode_1 = require("../../../DiagnosticCode"); const DiagnosticMessage_1 = require("../../../DiagnosticMessage"); const Helper_1 = require("../Helper"); const boolean_1 = require("./boolean"); const undefined_1 = require("./undefined"); class ForTypeHelper extends Helper_1.Helper { constructor({ type, types, single, singleUndefined, singleFalse, defaultCase, optional = false, }) { super(); this.type = type; this.types = types; this.single = single === undefined ? false : single; this.singleUndefined = singleUndefined; this.singleFalse = singleFalse; this.optional = optional; this.defaultCase = defaultCase; } emit(sb, node, optionsIn) { const noCastOptions = sb.noCastOptions(optionsIn); const options = sb.pushValueOptions(sb.noCastOptions(optionsIn)); let typeIn = this.type === undefined ? optionsIn.cast : this.type; let checkUndefinedSingle = false; let checkFalseSingle = false; if (typeIn !== undefined && this.single && (this.optional || undefined_1.hasUndefined(sb.context, node, typeIn)) && this.singleUndefined !== undefined) { typeIn = ts_utils_1.tsUtils.type_.getNonNullableType(typeIn); checkUndefinedSingle = true; } if (typeIn !== undefined && this.single && boolean_1.hasBooleanFalse(sb.context, node, typeIn) && this.singleFalse !== undefined) { typeIn = ts_utils_1.tsUtils.type_.filterUnion(sb.context.typeChecker, typeIn, (tpe) => !boolean_1.isBooleanFalse(sb.context, node, tpe)); checkFalseSingle = true; } const type = typeIn; const types = type === undefined ? this.types : this.types.filter((testType) => testType.hasType(type)); const groupedTypes = new Map(); for (const forType of types) { const mutableTypes = groupedTypes.get(forType.process); if (mutableTypes === undefined) { groupedTypes.set(forType.process, [forType]); } else { mutableTypes.push(forType); } } let defaultCase = this.defaultCase === undefined ? (innerOptions) => { sb.emitOp(node, 'DROP'); sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError); } : this.defaultCase; if (this.single && (types.length !== 1 || (checkUndefinedSingle && checkFalseSingle))) { sb.context.reportError(node, DiagnosticCode_1.DiagnosticCode.UnknownType, DiagnosticMessage_1.DiagnosticMessage.ResolveOneType); return; } if (types.length === 0) { defaultCase(noCastOptions); } else if (groupedTypes.size === 1) { const singleUndefined = this.singleUndefined; const singleFalse = this.singleFalse; if (checkUndefinedSingle && singleUndefined !== undefined) { sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitOp(node, 'DUP'); sb.emitOp(node, 'SIZE'); sb.emitPushInt(node, 0); sb.emitOp(node, 'NUMEQUAL'); }, whenTrue: () => { singleUndefined(options); }, whenFalse: () => { types[0].process(noCastOptions); }, })); } else if (checkFalseSingle && singleFalse !== undefined) { sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitOp(node, 'DUP'); sb.emitOp(node, 'SIZE'); sb.emitPushInt(node, 0); sb.emitOp(node, 'NUMEQUAL'); }, whenTrue: () => { singleFalse(options); }, whenFalse: () => { types[0].process(noCastOptions); }, })); } else { types[0].process(noCastOptions); } } else { const groupedTypesOrdered = lodash_1.default.sortBy([...groupedTypes.entries()], [(value) => value[1].length]); let caseTypes = groupedTypesOrdered; if (this.defaultCase === undefined) { caseTypes = groupedTypesOrdered.slice(0, -1); defaultCase = (innerOptions) => { const [processType] = groupedTypesOrdered[groupedTypesOrdered.length - 1]; processType(innerOptions); }; } sb.emitHelper(node, options, sb.helpers.case(caseTypes.map(([processType, forTypes]) => ({ condition: () => { sb.emitOp(node, 'DUP'); forTypes[0].isRuntimeType(options); forTypes.slice(1).forEach((forType) => { sb.emitOp(node, 'OVER'); forType.isRuntimeType(options); sb.emitOp(node, 'BOOLOR'); }); }, whenTrue: () => { processType(noCastOptions); }, })), () => { defaultCase(noCastOptions); })); } } } exports.ForTypeHelper = ForTypeHelper; //# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMsT0FBTyxDQUFDLElBQUksQ0FDYixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7b0JBRWQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRXZCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBR25DLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBRXBDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUV4QixPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUUvQixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDNUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNiLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDN0IsQ0FBQzthQUNGLENBQUMsQ0FBQyxFQUNILEdBQUcsRUFBRTtnQkFDSCxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUNGLENBQ0YsQ0FBQztTQUNIO0lBQ0gsQ0FBQztDQUNGO0FBM0xELHNDQTJMQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci90eXBlcy9Gb3JUeXBlSGVscGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uLy4uLy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL0hlbHBlcic7XG5pbXBvcnQgeyBoYXNCb29sZWFuRmFsc2UsIGlzQm9vbGVhbkZhbHNlIH0gZnJvbSAnLi9ib29sZWFuJztcbmltcG9ydCB7IGhhc1VuZGVmaW5lZCB9IGZyb20gJy4vdW5kZWZpbmVkJztcblxudHlwZSBQcm9jZXNzID0gKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JUeXBlIHtcbiAgcmVhZG9ubHkgaGFzVHlwZTogKHR5cGU6IHRzLlR5cGUpID0+IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzUnVudGltZVR5cGU6IChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHByb2Nlc3M6IFByb2Nlc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9yVHlwZUhlbHBlck9wdGlvbnMge1xuICByZWFkb25seSB0eXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0eXBlczogUmVhZG9ubHlBcnJheTxGb3JUeXBlPjtcbiAgcmVhZG9ubHkgc2luZ2xlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2luZ2xlVW5kZWZpbmVkPzogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcbiAgcmVhZG9ubHkgc2luZ2xlRmFsc2U/OiAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB2b2lkO1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRlZmF1bHRDYXNlPzogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gSW5wdXQ6IFt2YWxdXG4vLyBPdXRwdXQ6IFtdXG5leHBvcnQgY2xhc3MgRm9yVHlwZUhlbHBlciBleHRlbmRzIEhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogUmVhZG9ubHlBcnJheTxGb3JUeXBlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaW5nbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2luZ2xlVW5kZWZpbmVkOiAoKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2luZ2xlRmFsc2U6ICgob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25hbDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0Q2FzZTogKChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgdHlwZSxcbiAgICB0eXBlcyxcbiAgICBzaW5nbGUsXG4gICAgc2luZ2xlVW5kZWZpbmVkLFxuICAgIHNpbmdsZUZhbHNlLFxuICAgIGRlZmF1bHRDYXNlLFxuICAgIG9wdGlvbmFsID0gZmFsc2UsXG4gIH06IEZvclR5cGVIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICB0aGlzLnNpbmdsZSA9IHNpbmdsZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBzaW5nbGU7XG4gICAgdGhpcy5zaW5nbGVVbmRlZmluZWQgPSBzaW5nbGVVbmRlZmluZWQ7XG4gICAgdGhpcy5zaW5nbGVGYWxzZSA9IHNpbmdsZUZhbHNlO1xuICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICB0aGlzLmRlZmF1bHRDYXNlID0gZGVmYXVsdENhc2U7XG4gIH1cblxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBub0Nhc3RPcHRpb25zID0gc2Iubm9DYXN0T3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKHNiLm5vQ2FzdE9wdGlvbnMob3B0aW9uc0luKSk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLXVubmVjZXNzYXJ5LXR5cGUtYW5ub3RhdGlvblxuICAgIGxldCB0eXBlSW46IHRzLlR5cGUgfCB1bmRlZmluZWQgPSB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCA/IG9wdGlvbnNJbi5jYXN0IDogdGhpcy50eXBlO1xuICAgIGxldCBjaGVja1VuZGVmaW5lZFNpbmdsZSA9IGZhbHNlO1xuICAgIGxldCBjaGVja0ZhbHNlU2luZ2xlID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdHlwZUluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuc2luZ2xlICYmXG4gICAgICAodGhpcy5vcHRpb25hbCB8fCBoYXNVbmRlZmluZWQoc2IuY29udGV4dCwgbm9kZSwgdHlwZUluKSkgJiZcbiAgICAgIHRoaXMuc2luZ2xlVW5kZWZpbmVkICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHR5cGVJbiA9IHRzVXRpbHMudHlwZV8uZ2V0Tm9uTnVsbGFibGVUeXBlKHR5cGVJbik7XG4gICAgICBjaGVja1VuZGVmaW5lZFNpbmdsZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVJbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLnNpbmdsZSAmJlxuICAgICAgaGFzQm9vbGVhbkZhbHNlKHNiLmNvbnRleHQsIG5vZGUsIHR5cGVJbikgJiZcbiAgICAgIHRoaXMuc2luZ2xlRmFsc2UgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdHlwZUluID0gdHNVdGlscy50eXBlXy5maWx0ZXJVbmlvbihcbiAgICAgICAgc2IuY29udGV4dC50eXBlQ2hlY2tlcixcbiAgICAgICAgdHlwZUluLFxuICAgICAgICAodHBlKSA9PiAhaXNCb29sZWFuRmFsc2Uoc2IuY29udGV4dCwgbm9kZSwgdHBlKSxcbiAgICAgICk7XG4gICAgICBjaGVja0ZhbHNlU2luZ2xlID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVJbjtcbiAgICBjb25zdCB0eXBlcyA9IHR5cGUgPT09IHVuZGVmaW5lZCA/IHRoaXMudHlwZXMgOiB0aGlzLnR5cGVzLmZpbHRlcigodGVzdFR5cGUpID0+IHRlc3RUeXBlLmhhc1R5cGUodHlwZSkpO1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJlYWRvbmx5LWFycmF5XG4gICAgY29uc3QgZ3JvdXBlZFR5cGVzID0gbmV3IE1hcDxQcm9jZXNzLCBGb3JUeXBlW10+KCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgZm9yIChjb25zdCBmb3JUeXBlIG9mIHR5cGVzKSB7XG4gICAgICBjb25zdCBtdXRhYmxlVHlwZXMgPSBncm91cGVkVHlwZXMuZ2V0KGZvclR5cGUucHJvY2Vzcyk7XG4gICAgICBpZiAobXV0YWJsZVR5cGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZ3JvdXBlZFR5cGVzLnNldChmb3JUeXBlLnByb2Nlc3MsIFtmb3JUeXBlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhYmxlVHlwZXMucHVzaChmb3JUeXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZGVmYXVsdENhc2UgPVxuICAgICAgdGhpcy5kZWZhdWx0Q2FzZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnRocm93VHlwZUVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5kZWZhdWx0Q2FzZTtcblxuICAgIGlmICh0aGlzLnNpbmdsZSAmJiAodHlwZXMubGVuZ3RoICE9PSAxIHx8IChjaGVja1VuZGVmaW5lZFNpbmdsZSAmJiBjaGVja0ZhbHNlU2luZ2xlKSkpIHtcbiAgICAgIHNiLmNvbnRleHQucmVwb3J0RXJyb3Iobm9kZSwgRGlhZ25vc3RpY0NvZGUuVW5rbm93blR5cGUsIERpYWdub3N0aWNNZXNzYWdlLlJlc29sdmVPbmVUeXBlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlZmF1bHRDYXNlKG5vQ2FzdE9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoZ3JvdXBlZFR5cGVzLnNpemUgPT09IDEpIHtcbiAgICAgIGNvbnN0IHNpbmdsZVVuZGVmaW5lZCA9IHRoaXMuc2luZ2xlVW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc2luZ2xlRmFsc2UgPSB0aGlzLnNpbmdsZUZhbHNlO1xuICAgICAgaWYgKGNoZWNrVW5kZWZpbmVkU2luZ2xlICYmIHNpbmdsZVVuZGVmaW5lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFt2YWx1ZSwgdmFsdWVdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgICAgICAgIC8vIFtudW1iZXIsIHZhbHVlXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NJWkUnKTtcbiAgICAgICAgICAgICAgLy8gW251bWJlciwgbnVtYmVyLCB2YWx1ZV1cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMCk7XG4gICAgICAgICAgICAgIC8vIFtib29sZWFuLCB2YWx1ZV1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdOVU1FUVVBTCcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHNpbmdsZVVuZGVmaW5lZChvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgdHlwZXNbMF0ucHJvY2Vzcyhub0Nhc3RPcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGNoZWNrRmFsc2VTaW5nbGUgJiYgc2luZ2xlRmFsc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBbdmFsdWUsIHZhbHVlXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbbnVtYmVyLCB2YWx1ZV1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdTSVpFJyk7XG4gICAgICAgICAgICAgIC8vIFtudW1iZXIsIG51bWJlciwgdmFsdWVdXG4gICAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDApO1xuICAgICAgICAgICAgICAvLyBbYm9vbGVhbiwgdmFsdWVdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnTlVNRVFVQUwnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBzaW5nbGVGYWxzZShvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgdHlwZXNbMF0ucHJvY2Vzcyhub0Nhc3RPcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlc1swXS5wcm9jZXNzKG5vQ2FzdE9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBncm91cGVkVHlwZXNPcmRlcmVkID0gXy5zb3J0QnkoXG4gICAgICAgIFsuLi5ncm91cGVkVHlwZXMuZW50cmllcygpXSxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJlYWRvbmx5LWFycmF5XG4gICAgICAgIFsodmFsdWU6IFtQcm9jZXNzLCBGb3JUeXBlW11dKSA9PiB2YWx1ZVsxXS5sZW5ndGhdLFxuICAgICAgKTtcbiAgICAgIGxldCBjYXNlVHlwZXMgPSBncm91cGVkVHlwZXNPcmRlcmVkO1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdENhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYXNlVHlwZXMgPSBncm91cGVkVHlwZXNPcmRlcmVkLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgZGVmYXVsdENhc2UgPSAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgY29uc3QgW3Byb2Nlc3NUeXBlXSA9IGdyb3VwZWRUeXBlc09yZGVyZWRbZ3JvdXBlZFR5cGVzT3JkZXJlZC5sZW5ndGggLSAxXTtcbiAgICAgICAgICBwcm9jZXNzVHlwZShpbm5lck9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmNhc2UoXG4gICAgICAgICAgY2FzZVR5cGVzLm1hcCgoW3Byb2Nlc3NUeXBlLCBmb3JUeXBlc10pID0+ICh7XG4gICAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gW3ZhbCwgdmFsXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbYm9vbGVhbiwgdmFsXVxuICAgICAgICAgICAgICBmb3JUeXBlc1swXS5pc1J1bnRpbWVUeXBlKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgIC8vIFtib29sZWFuLCB2YWxdXG4gICAgICAgICAgICAgIGZvclR5cGVzLnNsaWNlKDEpLmZvckVhY2goKGZvclR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBbdmFsLCBib29sZWFuLCB2YWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdPVkVSJyk7XG4gICAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIGJvb2xlYW4sIHZhbF1cbiAgICAgICAgICAgICAgICBmb3JUeXBlLmlzUnVudGltZVR5cGUob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIHZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0JPT0xPUicpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzVHlwZShub0Nhc3RPcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGRlZmF1bHRDYXNlKG5vQ2FzdE9wdGlvbnMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19