UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

417 lines (416 loc) 77.9 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 typescript_1 = tslib_1.__importDefault(require("typescript")); const DiagnosticCode_1 = require("../../../DiagnosticCode"); const DiagnosticMessage_1 = require("../../../DiagnosticMessage"); const builtins_1 = require("../../builtins"); const constants_1 = require("../../constants"); const Helper_1 = require("../Helper"); class CallLikeHelper extends Helper_1.Helper { constructor() { super(...arguments); this.kind = typescript_1.default.SyntaxKind.CallExpression; } emit(sb, expression, optionsIn) { const expr = typescript_1.default.isCallExpression(expression) ? ts_utils_1.tsUtils.expression.getExpression(expression) : ts_utils_1.tsUtils.template.getTag(expression); const valueBuiltin = sb.context.builtins.getValue(expr); if (valueBuiltin !== undefined && !ts_utils_1.tsUtils.guards.isSuperExpression(expr)) { if (typescript_1.default.isCallExpression(expression) && builtins_1.isBuiltinCall(valueBuiltin)) { valueBuiltin.emitCall(sb, expression, optionsIn); return; } if (typescript_1.default.isTaggedTemplateExpression(expression) && builtins_1.isBuiltinTemplate(valueBuiltin)) { valueBuiltin.emitCall(sb, expression, optionsIn); return; } sb.context.reportError(expr, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinCall, DiagnosticMessage_1.DiagnosticMessage.InvalidBuiltinCall); } const throwTypeError = (innerOptions) => { sb.emitOp(expr, 'DROP'); sb.emitHelper(expr, innerOptions, sb.helpers.throwTypeError); }; const handleArguments = (innerOptions) => { if (typescript_1.default.isCallExpression(expression)) { sb.emitHelper(expression, innerOptions, sb.helpers.args); } else { const template = ts_utils_1.tsUtils.template.getTemplate(expression); if (typescript_1.default.isNoSubstitutionTemplateLiteral(template)) { sb.emitPushInt(template, 0); sb.emitOp(template, 'NEWARRAY'); sb.emitOp(template, 'DUP'); sb.visit(template, innerOptions); sb.emitOp(template, 'APPEND'); sb.emitHelper(template, innerOptions, sb.helpers.wrapArray); sb.emitPushInt(template, 1); sb.emitOp(template, 'PACK'); } else { const head = ts_utils_1.tsUtils.template.getTemplateHead(template); lodash_1.default.reverse([...ts_utils_1.tsUtils.template.getTemplateSpans(template)]).forEach((span) => { sb.visit(ts_utils_1.tsUtils.expression.getExpression(span), innerOptions); }); sb.emitPushInt(template, 0); sb.emitOp(template, 'NEWARRAY'); sb.emitOp(template, 'DUP'); sb.emitPushString(head, ts_utils_1.tsUtils.literal.getLiteralValue(head)); sb.emitHelper(head, innerOptions, sb.helpers.wrapString); sb.emitOp(head, 'APPEND'); ts_utils_1.tsUtils.template.getTemplateSpans(template).forEach((span) => { const spanLiteral = ts_utils_1.tsUtils.template.getLiteral(span); sb.emitOp(spanLiteral, 'DUP'); sb.emitPushString(spanLiteral, ts_utils_1.tsUtils.literal.getLiteralValue(spanLiteral)); sb.emitHelper(head, innerOptions, sb.helpers.wrapString); sb.emitOp(expr, 'APPEND'); }); sb.emitHelper(template, innerOptions, sb.helpers.wrapArray); sb.emitPushInt(template, ts_utils_1.tsUtils.template.getTemplateSpans(template).length + 1); sb.emitOp(template, 'PACK'); } } }; const handlePropertyVisit = (lhs, innerOptions) => { if (ts_utils_1.tsUtils.guards.isSuperExpression(lhs)) { sb.scope.getThis(sb, lhs, innerOptions); sb.visit(lhs, innerOptions); } else { sb.visit(lhs, innerOptions); sb.emitOp(lhs, 'DUP'); } }; const isValidBuiltinCall = (builtinProp) => { if (typescript_1.default.isCallExpression(expression)) { return builtins_1.isBuiltinMemberCall(builtinProp) || builtins_1.isBuiltinInstanceMemberCall(builtinProp); } if (typescript_1.default.isTaggedTemplateExpression(expression)) { return builtins_1.isBuiltinMemberTemplate(builtinProp) || builtins_1.isBuiltinInstanceMemberTemplate(builtinProp); } return false; }; const handleBuiltinMemberCall = (builtinProp, memberLike, visited) => { if (typescript_1.default.isCallExpression(expression)) { if (builtins_1.isBuiltinMemberCall(builtinProp)) { builtinProp.emitCall(sb, memberLike, expression, optionsIn); return; } if (builtins_1.isBuiltinInstanceMemberCall(builtinProp)) { builtinProp.emitCall(sb, memberLike, expression, optionsIn, visited); return; } } else if (typescript_1.default.isTaggedTemplateExpression(expression)) { if (builtins_1.isBuiltinMemberTemplate(builtinProp)) { builtinProp.emitCall(sb, memberLike, expression, optionsIn); return; } if (builtins_1.isBuiltinInstanceMemberTemplate(builtinProp)) { builtinProp.emitCall(sb, memberLike, expression, optionsIn, visited); return; } } }; const superExpression = typescript_1.default.isCallExpression(expression) ? ts_utils_1.tsUtils.expression.getExpression(expression) : undefined; if (typescript_1.default.isCallExpression(expression) && superExpression !== undefined && ts_utils_1.tsUtils.guards.isSuperExpression(superExpression)) { if (optionsIn.handleSuperConstruct !== undefined) { optionsIn.handleSuperConstruct(expression, superExpression, optionsIn); return; } const superClass = optionsIn.superClass; if (superClass === undefined) { throw new Error('Something went wrong, expected super class to be defined.'); } const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn)); handleArguments(options); sb.scope.getThis(sb, expression, options); sb.scope.get(sb, expression, options, superClass); sb.emitHelper(expression, sb.noPushValueOptions(options), sb.helpers.invokeConstruct()); } else if (typescript_1.default.isPropertyAccessExpression(expr)) { const value = ts_utils_1.tsUtils.expression.getExpression(expr); const valueType = sb.context.analysis.getType(value); const name = ts_utils_1.tsUtils.node.getNameNode(expr); const nameValue = ts_utils_1.tsUtils.node.getName(expr); const builtinProp = sb.context.builtins.getMember(value, name); if (builtinProp !== undefined && isValidBuiltinCall(builtinProp)) { handleBuiltinMemberCall(builtinProp, expr, false); return; } const createProcessBuiltin = (valueName) => { const member = sb.context.builtins.getOnlyMember(valueName, nameValue); if (member === undefined) { return throwTypeError; } return () => { sb.emitOp(expression, 'DROP'); handleBuiltinMemberCall(member, expr, true); }; }; const processObject = (innerOptions) => { handleArguments(innerOptions); sb.emitOp(expr, 'ROT'); sb.emitOp(expr, 'ROT'); sb.emitPushString(name, nameValue); sb.emitHelper(expr, innerOptions, sb.helpers.getPropertyObjectProperty); sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true })); }; const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn)); handlePropertyVisit(value, options); sb.emitHelper(value, options, sb.helpers.forBuiltinType({ type: valueType, array: createProcessBuiltin('Array'), arrayStorage: createProcessBuiltin('ArrayStorage'), boolean: createProcessBuiltin('Boolean'), buffer: createProcessBuiltin('Buffer'), null: throwTypeError, number: createProcessBuiltin('Number'), object: processObject, string: createProcessBuiltin('String'), symbol: createProcessBuiltin('Symbol'), undefined: throwTypeError, map: createProcessBuiltin('Map'), mapStorage: createProcessBuiltin('MapStorage'), set: createProcessBuiltin('Set'), setStorage: createProcessBuiltin('SetStorage'), error: createProcessBuiltin('Error'), forwardValue: createProcessBuiltin('ForwardValue'), iteratorResult: createProcessBuiltin('IteratorResult'), iterable: createProcessBuiltin('Iterable'), iterableIterator: createProcessBuiltin('IterableIterator'), transaction: createProcessBuiltin('TransactionBase'), output: createProcessBuiltin('Output'), attribute: createProcessBuiltin('AttributeBase'), input: createProcessBuiltin('Input'), account: createProcessBuiltin('Account'), asset: createProcessBuiltin('Asset'), contract: createProcessBuiltin('Contract'), header: createProcessBuiltin('Header'), block: createProcessBuiltin('Block'), })); } else if (typescript_1.default.isElementAccessExpression(expr)) { const value = ts_utils_1.tsUtils.expression.getExpression(expr); const valueType = sb.context.analysis.getType(value); const prop = ts_utils_1.tsUtils.expression.getArgumentExpressionOrThrow(expr); const propType = sb.context.analysis.getType(prop); const builtinProp = sb.context.builtins.getMember(value, prop); if (builtinProp !== undefined && isValidBuiltinCall(builtinProp)) { handleBuiltinMemberCall(builtinProp, expr, false); return; } const getCallCases = (instanceName, useSymbol = false) => sb.context.builtins .getMembers(instanceName, (call) => builtins_1.isBuiltinInstanceMemberCall(call) || builtins_1.isBuiltinInstanceMemberTemplate(call), (call) => (typescript_1.default.isCallExpression(expression) && builtins_1.isBuiltinInstanceMemberCall(call) && call.canCall(sb, expr, expression, optionsIn)) || (typescript_1.default.isTaggedTemplateExpression(expression) && builtins_1.isBuiltinInstanceMemberTemplate(call) && call.canCall(sb, expr, expression, optionsIn)), useSymbol) .map(([propName, builtin]) => ({ condition: () => { sb.emitOp(prop, 'DUP'); sb.emitPushString(prop, propName); sb.emitOp(prop, 'EQUAL'); }, whenTrue: () => { sb.emitOp(expr, 'DROP'); sb.emitOp(expr, 'DROP'); handleBuiltinMemberCall(builtin, expr, true); }, })); const throwInnerTypeError = (innerOptions) => { sb.emitOp(expr, 'DROP'); sb.emitOp(expr, 'DROP'); throwTypeError(innerOptions); }; const createHandleProp = (handleString, handleNumber, handleSymbol) => (innerOptions) => { sb.visit(prop, innerOptions); sb.emitHelper(prop, innerOptions, sb.helpers.forBuiltinType({ type: propType, array: throwInnerTypeError, arrayStorage: throwInnerTypeError, boolean: throwInnerTypeError, buffer: throwInnerTypeError, null: throwInnerTypeError, number: handleNumber, object: throwInnerTypeError, string: handleString, symbol: handleSymbol, undefined: throwInnerTypeError, map: throwInnerTypeError, mapStorage: throwInnerTypeError, set: throwInnerTypeError, setStorage: throwInnerTypeError, error: throwInnerTypeError, forwardValue: throwInnerTypeError, iteratorResult: throwInnerTypeError, iterable: throwInnerTypeError, iterableIterator: throwInnerTypeError, transaction: throwInnerTypeError, output: throwInnerTypeError, attribute: throwInnerTypeError, input: throwInnerTypeError, account: throwInnerTypeError, asset: throwInnerTypeError, contract: throwInnerTypeError, header: throwInnerTypeError, block: throwInnerTypeError, })); }; const createProcessBuiltin = (instanceName) => { const handleStringBase = (innerInnerOptions) => { sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases(instanceName, false), () => { throwInnerTypeError(innerInnerOptions); })); }; const handleString = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapString); handleStringBase(innerInnerOptions); }; const handleNumber = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.toString({ type: propType, knownType: constants_1.Types.Number })); handleStringBase(innerInnerOptions); }; const handleSymbol = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapSymbol); sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases(instanceName, true), () => { throwInnerTypeError(innerInnerOptions); })); }; return createHandleProp(handleString, handleNumber, handleSymbol); }; const createProcessArray = () => { const handleNumberBase = (innerInnerOptions) => { sb.emitOp(expr, 'NIP'); handleArguments(innerInnerOptions); sb.emitOp(expr, 'ROT'); sb.emitOp(expr, 'ROT'); sb.emitOp(expr, 'OVER'); sb.emitOp(expr, 'SWAP'); sb.emitHelper(expr, innerInnerOptions, sb.helpers.getArrayIndex); sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true })); }; const handleString = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapString); sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases('Array', false), () => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.wrapString); sb.emitHelper(prop, innerInnerOptions, sb.helpers.toNumber({ type: propType, knownType: constants_1.Types.String })); handleNumberBase(innerInnerOptions); })); }; const handleNumber = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapNumber); handleNumberBase(innerInnerOptions); }; const handleSymbol = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapSymbol); sb.emitHelper(expr, innerInnerOptions, sb.helpers.case(getCallCases('Array', true), () => { throwInnerTypeError(innerInnerOptions); })); }; return createHandleProp(handleString, handleNumber, handleSymbol); }; const processObject = (innerOptions) => { const handleStringBase = (innerInnerOptions) => { sb.emitHelper(expr, innerInnerOptions, sb.helpers.getPropertyObjectProperty); sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true })); }; const handleNumber = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.toString({ type: propType, knownType: constants_1.Types.Number })); handleStringBase(innerInnerOptions); }; const handleString = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapString); handleStringBase(innerInnerOptions); }; const handleSymbol = (innerInnerOptions) => { sb.emitHelper(prop, innerInnerOptions, sb.helpers.unwrapSymbol); sb.emitHelper(expr, innerInnerOptions, sb.helpers.getSymbolObjectProperty); sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: true })); }; handleArguments(innerOptions); sb.emitOp(expression, 'ROT'); sb.emitOp(expression, 'ROT'); sb.visit(prop, innerOptions); sb.emitHelper(prop, innerOptions, sb.helpers.forBuiltinType({ type: propType, array: throwInnerTypeError, arrayStorage: throwInnerTypeError, boolean: throwInnerTypeError, buffer: throwInnerTypeError, null: throwInnerTypeError, number: handleNumber, object: throwInnerTypeError, string: handleString, symbol: handleSymbol, undefined: throwInnerTypeError, map: throwInnerTypeError, mapStorage: throwInnerTypeError, set: throwInnerTypeError, setStorage: throwInnerTypeError, error: throwInnerTypeError, forwardValue: throwInnerTypeError, iteratorResult: throwInnerTypeError, iterable: throwInnerTypeError, iterableIterator: throwInnerTypeError, transaction: throwInnerTypeError, output: throwInnerTypeError, attribute: throwInnerTypeError, input: throwInnerTypeError, account: throwInnerTypeError, asset: throwInnerTypeError, contract: throwInnerTypeError, header: throwInnerTypeError, block: throwInnerTypeError, })); }; const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn)); handlePropertyVisit(value, options); sb.emitHelper(value, options, sb.helpers.forBuiltinType({ type: valueType, array: createProcessArray(), arrayStorage: createProcessBuiltin('ArrayStorage'), boolean: createProcessBuiltin('Boolean'), buffer: createProcessBuiltin('Buffer'), null: throwTypeError, number: createProcessBuiltin('Number'), object: processObject, string: createProcessBuiltin('String'), symbol: createProcessBuiltin('Symbol'), undefined: throwTypeError, map: createProcessBuiltin('Map'), mapStorage: createProcessBuiltin('MapStorage'), set: createProcessBuiltin('Set'), setStorage: createProcessBuiltin('SetStorage'), error: createProcessBuiltin('Error'), forwardValue: createProcessBuiltin('ForwardValue'), iteratorResult: createProcessBuiltin('IteratorResult'), iterable: createProcessBuiltin('Iterable'), iterableIterator: createProcessBuiltin('IterableIterator'), transaction: createProcessBuiltin('TransactionBase'), output: createProcessBuiltin('Output'), attribute: createProcessBuiltin('AttributeBase'), input: createProcessBuiltin('Input'), account: createProcessBuiltin('Account'), asset: createProcessBuiltin('Asset'), contract: createProcessBuiltin('Contract'), header: createProcessBuiltin('Header'), block: createProcessBuiltin('Block'), })); } else { const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn)); handleArguments(options); sb.visit(expr, options); sb.emitHelper(expr, optionsIn, sb.helpers.invokeCall({ bindThis: false })); } } } exports.CallLikeHelper = CallLikeHelper; //# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMsT0FBTyxDQUFDO2dCQUNwQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO2dCQUN0QyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDO2FBQ3JDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUVyRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM1RTtJQUNILENBQUM7Q0FDRjtBQXpqQkQsd0NBeWpCQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci9mdW5jdGlvbi9DYWxsTGlrZUhlbHBlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvZGUgfSBmcm9tICcuLi8uLi8uLi9EaWFnbm9zdGljQ29kZSc7XG5pbXBvcnQgeyBEaWFnbm9zdGljTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL0RpYWdub3N0aWNNZXNzYWdlJztcbmltcG9ydCB7XG4gIEJ1aWx0aW4sXG4gIEJ1aWx0aW5JbnN0YW5jZU1lbWJlclRlbXBsYXRlLFxuICBDYWxsTWVtYmVyTGlrZUV4cHJlc3Npb24sXG4gIGlzQnVpbHRpbkNhbGwsXG4gIGlzQnVpbHRpbkluc3RhbmNlTWVtYmVyQ2FsbCxcbiAgaXNCdWlsdGluSW5zdGFuY2VNZW1iZXJUZW1wbGF0ZSxcbiAgaXNCdWlsdGluTWVtYmVyQ2FsbCxcbiAgaXNCdWlsdGluTWVtYmVyVGVtcGxhdGUsXG4gIGlzQnVpbHRpblRlbXBsYXRlLFxufSBmcm9tICcuLi8uLi9idWlsdGlucyc7XG5pbXBvcnQgeyBCdWlsdGluSW5zdGFuY2VNZW1iZXJDYWxsIH0gZnJvbSAnLi4vLi4vYnVpbHRpbnMvQnVpbHRpbkluc3RhbmNlTWVtYmVyQ2FsbCc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vSGVscGVyJztcblxuZXhwb3J0IGNsYXNzIENhbGxMaWtlSGVscGVyIGV4dGVuZHMgSGVscGVyPHRzLkNhbGxFeHByZXNzaW9uIHwgdHMuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uPiB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gdHMuU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbjtcblxuICBwdWJsaWMgZW1pdChcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICBleHByZXNzaW9uOiB0cy5DYWxsRXhwcmVzc2lvbiB8IHRzLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbixcbiAgICBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwciA9IHRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgICAgID8gdHNVdGlscy5leHByZXNzaW9uLmdldEV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgICAgIDogdHNVdGlscy50ZW1wbGF0ZS5nZXRUYWcoZXhwcmVzc2lvbik7XG5cbiAgICBjb25zdCB2YWx1ZUJ1aWx0aW4gPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldFZhbHVlKGV4cHIpO1xuICAgIGlmICh2YWx1ZUJ1aWx0aW4gIT09IHVuZGVmaW5lZCAmJiAhdHNVdGlscy5ndWFyZHMuaXNTdXBlckV4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgYWxyZWFkeSByZXBvcnRlZCBhcyBhbiBlcnJvciBieSB0eXBlc2NyaXB0IGNoZWNrZXJcbiAgICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24pICYmIGlzQnVpbHRpbkNhbGwodmFsdWVCdWlsdGluKSkge1xuICAgICAgICB2YWx1ZUJ1aWx0aW4uZW1pdENhbGwoc2IsIGV4cHJlc3Npb24sIG9wdGlvbnNJbik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHMuaXNUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbikgJiYgaXNCdWlsdGluVGVtcGxhdGUodmFsdWVCdWlsdGluKSkge1xuICAgICAgICB2YWx1ZUJ1aWx0aW4uZW1pdENhbGwoc2IsIGV4cHJlc3Npb24sIG9wdGlvbnNJbik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzYi5jb250ZXh0LnJlcG9ydEVycm9yKGV4cHIsIERpYWdub3N0aWNDb2RlLkludmFsaWRCdWlsdGluQ2FsbCwgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZEJ1aWx0aW5DYWxsKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvd1R5cGVFcnJvciA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRPcChleHByLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVBcmd1bWVudHMgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIC8vIFthcmdzYXJyXVxuICAgICAgICBzYi5lbWl0SGVscGVyKGV4cHJlc3Npb24sIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdHNVdGlscy50ZW1wbGF0ZS5nZXRUZW1wbGF0ZShleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHRzLmlzTm9TdWJzdGl0dXRpb25UZW1wbGF0ZUxpdGVyYWwodGVtcGxhdGUpKSB7XG4gICAgICAgICAgLy8gWzBdXG4gICAgICAgICAgc2IuZW1pdFB1c2hJbnQodGVtcGxhdGUsIDApO1xuICAgICAgICAgIC8vIFtsaXRlcmFsc0Fycl1cbiAgICAgICAgICBzYi5lbWl0T3AodGVtcGxhdGUsICdORVdBUlJBWScpO1xuICAgICAgICAgIC8vIFtsaXRlcmFsc0FyciwgbGl0ZXJhbHNBcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKHRlbXBsYXRlLCAnRFVQJyk7XG4gICAgICAgICAgLy8gW3N0cmluZ1ZhbF1cbiAgICAgICAgICBzYi52aXNpdCh0ZW1wbGF0ZSwgaW5uZXJPcHRpb25zKTtcbiAgICAgICAgICAvLyBbbGl0ZXJhbHNBcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKHRlbXBsYXRlLCAnQVBQRU5EJyk7XG4gICAgICAgI