UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

143 lines (141 loc) 22.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const constants_1 = require("../../../constants"); const TypedHelper_1 = require("../TypedHelper"); class ToStringHelper extends TypedHelper_1.TypedHelper { constructor({ initial = true, type, knownType }) { super({ type, knownType }); this.initial = initial; } emit(sb, node, optionsIn) { if (!optionsIn.pushValue) { sb.emitOp(node, 'DROP'); return; } const convertUndefined = () => { sb.emitOp(node, 'DROP'); sb.emitPushString(node, 'undefined'); }; const convertNull = () => { sb.emitOp(node, 'DROP'); sb.emitPushString(node, 'null'); }; const convertBoolean = (options) => { sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitHelper(node, options, sb.helpers.unwrapBoolean); }, whenTrue: () => { sb.emitPushString(node, 'true'); }, whenFalse: () => { sb.emitPushString(node, 'false'); }, })); }; const convertNumber = (options) => { const n = sb.scope.addUnique(); const accum = sb.scope.addUnique(); sb.emitHelper(node, options, sb.helpers.unwrapNumber); sb.emitHelper(node, options, sb.helpers.if({ condition: () => { sb.emitOp(node, 'DUP'); sb.emitPushInt(node, 0); sb.emitOp(node, 'NUMEQUAL'); }, whenTrue: () => { sb.emitOp(node, 'DROP'); sb.emitPushString(node, '0'); }, whenFalse: () => { sb.scope.set(sb, node, options, n); sb.emitPushBuffer(node, Buffer.from([])); sb.scope.set(sb, node, options, accum); sb.emitHelper(node, options, sb.helpers.forLoop({ condition: () => { sb.scope.get(sb, node, options, n); sb.emitPushInt(node, 0); sb.emitOp(node, 'GT'); }, each: () => { sb.scope.get(sb, node, options, n); sb.emitOp(node, 'DUP'); sb.emitPushInt(node, 10); sb.emitOp(node, 'DIV'); sb.scope.set(sb, node, options, n); sb.emitPushInt(node, 10); sb.emitOp(node, 'MOD'); sb.emitPushInt(node, 0x30); sb.emitOp(node, 'ADD'); sb.scope.get(sb, node, options, accum); sb.emitOp(node, 'CAT'); sb.scope.set(sb, node, options, accum); }, cleanup: () => { }, })); sb.scope.get(sb, node, options, accum); }, })); }; const convertString = (options) => { sb.emitHelper(node, options, sb.helpers.unwrapString); }; const throwTypeError = (options) => { sb.emitOp(node, 'DROP'); sb.emitHelper(node, options, sb.helpers.throwTypeError); }; const convertObject = (options) => { sb.emitHelper(node, options, sb.helpers.toPrimitive({ type: this.type, preferredType: 'string' })); doConvert(options, false); }; const convertArray = (options) => { sb.emitHelper(node, options, sb.helpers.unwrapArray); sb.emitHelper(node, options, sb.helpers.arrToString({ type: this.type, knownType: constants_1.Types.Array })); }; const convertEmptyString = () => { sb.emitOp(node, 'DROP'); sb.emitPushString(node, ''); }; const convertBuffer = (innerOptions) => { sb.emitHelper(node, innerOptions, sb.helpers.unwrapBuffer); }; const doConvert = (options, initial) => { sb.emitHelper(node, options, sb.helpers.forBuiltinType({ type: initial ? this.type : undefined, knownType: initial ? this.knownType : undefined, array: initial ? convertArray : throwTypeError, arrayStorage: convertEmptyString, boolean: convertBoolean, buffer: convertBuffer, null: convertNull, number: convertNumber, object: initial ? convertObject : throwTypeError, string: convertString, symbol: throwTypeError, undefined: convertUndefined, map: convertEmptyString, mapStorage: convertEmptyString, set: convertEmptyString, setStorage: convertEmptyString, error: convertEmptyString, forwardValue: convertEmptyString, iteratorResult: convertEmptyString, iterable: convertEmptyString, iterableIterator: convertEmptyString, transaction: convertEmptyString, output: convertEmptyString, attribute: convertEmptyString, input: convertEmptyString, account: convertEmptyString, asset: convertEmptyString, contract: convertEmptyString, header: convertEmptyString, block: convertEmptyString, })); }; doConvert(optionsIn, this.initial); } } exports.ToStringHelper = ToStringHelper; //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFPLEVBQUUsa0JBQWtCO2dCQUMzQixLQUFLLEVBQUUsa0JBQWtCO2dCQUN6QixRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixLQUFLLEVBQUUsa0JBQWtCO2FBQzFCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRUYsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBek1ELHdDQXlNQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci90eXBlcy9zdHJpbmcvVG9TdHJpbmdIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHlwZWRIZWxwZXIsIFR5cGVkSGVscGVyT3B0aW9ucyB9IGZyb20gJy4uL1R5cGVkSGVscGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBUb1N0cmluZ0hlbHBlck9wdGlvbnMgZXh0ZW5kcyBUeXBlZEhlbHBlck9wdGlvbnMge1xuICByZWFkb25seSBpbml0aWFsPzogYm9vbGVhbjtcbn1cblxuLy8gSW5wdXQ6IFt2YWxdXG4vLyBPdXRwdXQ6IFtzdHJpbmddXG5leHBvcnQgY2xhc3MgVG9TdHJpbmdIZWxwZXIgZXh0ZW5kcyBUeXBlZEhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdGlhbDogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoeyBpbml0aWFsID0gdHJ1ZSwgdHlwZSwga25vd25UeXBlIH06IFRvU3RyaW5nSGVscGVyT3B0aW9ucykge1xuICAgIHN1cGVyKHsgdHlwZSwga25vd25UeXBlIH0pO1xuXG4gICAgdGhpcy5pbml0aWFsID0gaW5pdGlhbDtcbiAgfVxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIW9wdGlvbnNJbi5wdXNoVmFsdWUpIHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udmVydFVuZGVmaW5lZCA9ICgpID0+IHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdFB1c2hTdHJpbmcobm9kZSwgJ3VuZGVmaW5lZCcpO1xuICAgIH07XG5cbiAgICBjb25zdCBjb252ZXJ0TnVsbCA9ICgpID0+IHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdFB1c2hTdHJpbmcobm9kZSwgJ251bGwnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29udmVydEJvb2xlYW4gPSAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy51bndyYXBCb29sZWFuKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0UHVzaFN0cmluZyhub2RlLCAndHJ1ZScpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd2hlbkZhbHNlOiAoKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0UHVzaFN0cmluZyhub2RlLCAnZmFsc2UnKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnZlcnROdW1iZXIgPSAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBuID0gc2Iuc2NvcGUuYWRkVW5pcXVlKCk7XG4gICAgICBjb25zdCBhY2N1bSA9IHNiLnNjb3BlLmFkZFVuaXF1ZSgpO1xuXG4gICAgICAvLyBbbnVtYmVyXVxuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcE51bWJlcik7XG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFtudW1iZXIsIG51bWJlcl1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgICAgICAvLyBbMCwgbnVtYmVyLCBudW1iZXJdXG4gICAgICAgICAgICBzYi5lbWl0UHVzaEludChub2RlLCAwKTtcbiAgICAgICAgICAgIC8vIFtudW1iZXIgPT09IDAsIG51bWJlcl1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnTlVNRVFVQUwnKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgICAvLyBbc3RyaW5nXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcobm9kZSwgJzAnKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdoZW5GYWxzZTogKCkgPT4ge1xuICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgIHNiLnNjb3BlLnNldChzYiwgbm9kZSwgb3B0aW9ucywgbik7XG4gICAgICAgICAgICAvLyBbYnVmZmVyXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hCdWZmZXIobm9kZSwgQnVmZmVyLmZyb20oW10pKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi5zY29wZS5zZXQoc2IsIG5vZGUsIG9wdGlvbnMsIGFjY3VtKTtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHNiLmhlbHBlcnMuZm9yTG9vcCh7XG4gICAgICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBbbl1cbiAgICAgICAgICAgICAgICAgIHNiLnNjb3BlLmdldChzYiwgbm9kZSwgb3B0aW9ucywgbik7XG4gICAgICAgICAgICAgICAgICAvLyBbMCwgbl1cbiAgICAgICAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDApO1xuICAgICAgICAgICAgICAgICAgLy8gW24gPiAwXVxuICAgICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdHVCcpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZWFjaDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gW25dXG4gICAgICAgICAgICAgICAgICBzYi5zY29wZS5nZXQoc2IsIG5vZGUsIG9wdGlvbnMsIG4pO1xuICAgICAgICAgICAgICAgICAgLy8gW24sIG5dXG4gICAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAgICAgLy8gWzEwLCBuLCBuXVxuICAgICAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMTApO1xuICAgICAgICAgICAgICAgICAgLy8gW24gLyAxMCwgbl1cbiAgICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRElWJyk7XG4gICAgICAgICAgICAgICAgICAvLyBbbl1cbiAgICAgICAgICAgICAgICAgIHNiLnNjb3BlLnNldChzYiwgbm9kZSwgb3B0aW9ucywgbik7XG4gICAgICAgICAgICAgICAgICAvLyBbMTAsIG5dXG4gICAgICAgICAgICAgICAgICBzYi5lbWl0UHVzaEludChub2RlLCAxMCk7XG4gICAgICAgICAgICAgICAgICAvLyBbbiAlIDEwXVxuICAgICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdNT0QnKTtcbiAgICAgICAgICAgICAgICAgIC8vIFsweDMwLCBuICUgMTBdXG4gICAgICAgICAgICAgICAgICBzYi5lbWl0UHVzaEludChub2RlLCAweDMwKTtcbiAgICAgICAgICAgICAgICAgIC8vIFtudW1iZXJdXG4gICAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0FERCcpO1xuICAgICAgICAgICAgICAgICAgLy8gW2FjY3VtLCBudW1iZXJdXG4gICAgICAgICAgICAgICAgICBzYi5zY29wZS5nZXQoc2IsIG5vZGUsIG9wdGlvbnMsIGFjY3VtKTtcbiAgICAgICAgICAgICAgICAgIC8vIFtudW1iZXIgKyBhY2N1bV1cbiAgICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnQ0FUJyk7XG4gICAgICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICAgICAgc2Iuc2NvcGUuc2V0KHNiLCBub2RlLCBvcHRpb25zLCBhY2N1bSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjbGVhbnVwOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gW3N0cmluZ11cbiAgICAgICAgICAgIHNiLnNjb3BlLmdldChzYiwgbm9kZSwgb3B0aW9ucywgYWNjdW0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29udmVydFN0cmluZyA9IChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIC8vIFtzdHJpbmddXG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwU3RyaW5nKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdGhyb3dUeXBlRXJyb3IgPSAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnZlcnRPYmplY3QgPSAob3B0aW9uczogVmlzaXRPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgICAvLyBbcHJpbWl0aXZlXVxuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnRvUHJpbWl0aXZlKHsgdHlwZTogdGhpcy50eXBlLCBwcmVmZXJyZWRUeXBlOiAnc3RyaW5nJyB9KSk7XG4gICAgICAvLyBbc3RyaW5nXVxuICAgICAgZG9Db252ZXJ0KG9wdGlvbnMsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29udmVydEFycmF5ID0gKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW2Fycl1cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy51bndyYXBBcnJheSk7XG4gICAgICAvLyBbc3RyaW5nXVxuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmFyclRvU3RyaW5nKHsgdHlwZTogdGhpcy50eXBlLCBrbm93blR5cGU6IFR5cGVzLkFycmF5IH0pKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29udmVydEVtcHR5U3RyaW5nID0gKCkgPT4ge1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgLy8gW3N0cmluZ11cbiAgICAgIHNiLmVtaXRQdXNoU3RyaW5nKG5vZGUsICcnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29udmVydEJ1ZmZlciA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW2J1ZmZlcl1cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcEJ1ZmZlcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGRvQ29udmVydCA9IChvcHRpb25zOiBWaXNpdE9wdGlvbnMsIGluaXRpYWw6IGJvb2xlYW4pID0+IHtcbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHNiLmhlbHBlcnMuZm9yQnVpbHRpblR5cGUoe1xuICAgICAgICAgIHR5cGU6IGluaXRpYWwgPyB0aGlzLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAga25vd25UeXBlOiBpbml0aWFsID8gdGhpcy5rbm93blR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYXJyYXk6IGluaXRpYWwgPyBjb252ZXJ0QXJyYXkgOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICBhcnJheVN0b3JhZ2U6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBib29sZWFuOiBjb252ZXJ0Qm9vbGVhbixcbiAgICAgICAgICBidWZmZXI6IGNvbnZlcnRCdWZmZXIsXG4gICAgICAgICAgbnVsbDogY29udmVydE51bGwsXG4gICAgICAgICAgbnVtYmVyOiBjb252ZXJ0TnVtYmVyLFxuICAgICAgICAgIG9iamVjdDogaW5pdGlhbCA/IGNvbnZlcnRPYmplY3QgOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICBzdHJpbmc6IGNvbnZlcnRTdHJpbmcsXG4gICAgICAgICAgc3ltYm9sOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICB1bmRlZmluZWQ6IGNvbnZlcnRVbmRlZmluZWQsXG4gICAgICAgICAgbWFwOiBjb252ZXJ0RW1wdHlTdHJpbmcsXG4gICAgICAgICAgbWFwU3RvcmFnZTogY29udmVydEVtcHR5U3RyaW5nLFxuICAgICAgICAgIHNldDogY29udmVydEVtcHR5U3RyaW5nLFxuICAgICAgICAgIHNldFN0b3JhZ2U6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBlcnJvcjogY29udmVydEVtcHR5U3RyaW5nLFxuICAgICAgICAgIGZvcndhcmRWYWx1ZTogY29udmVydEVtcHR5U3RyaW5nLFxuICAgICAgICAgIGl0ZXJhdG9yUmVzdWx0OiBjb252ZXJ0RW1wdHlTdHJpbmcsXG4gICAgICAgICAgaXRlcmFibGU6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBpdGVyYWJsZUl0ZXJhdG9yOiBjb252ZXJ0RW1wdHlTdHJpbmcsXG4gICAgICAgICAgdHJhbnNhY3Rpb246IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBvdXRwdXQ6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBhdHRyaWJ1dGU6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBpbnB1dDogY29udmVydEVtcHR5U3RyaW5nLFxuICAgICAgICAgIGFjY291bnQ6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgICBhc3NldDogY29udmVydEVtcHR5U3RyaW5nLFxuICAgICAgICAgIGNvbnRyYWN0OiBjb252ZXJ0RW1wdHlTdHJpbmcsXG4gICAgICAgICAgaGVhZGVyOiBjb252ZXJ0RW1wdHlTdHJpbmcsXG4gICAgICAgICAgYmxvY2s6IGNvbnZlcnRFbXB0eVN0cmluZyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBkb0NvbnZlcnQob3B0aW9uc0luLCB0aGlzLmluaXRpYWwpO1xuICB9XG59XG4iXX0=