@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
190 lines (188 loc) • 30.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("../../constants");
const Helper_1 = require("../Helper");
class ToPrimitiveHelper extends Helper_1.Helper {
constructor({ type, knownType, preferredType = 'default' }) {
super();
this.type = type;
this.knownType = knownType;
this.preferredType = preferredType;
}
emit(sb, node, optionsIn) {
if (!optionsIn.pushValue) {
sb.emitOp(node, 'DROP');
return;
}
const throwTypeError = (options) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, options, sb.helpers.throwTypeError);
};
const throwInnerTypeError = (options) => {
sb.emitOp(node, 'DROP');
throwTypeError(options);
};
const convertPrimitive = () => {
};
const convertBuffer = (options) => {
sb.emitHelper(node, options, sb.helpers.unwrapBuffer);
sb.emitHelper(node, options, sb.helpers.wrapString);
};
const convertObject = (options) => {
const convertObjectDone = () => {
sb.emitOp(node, 'NIP');
};
const tryConvert = () => {
const methods = this.preferredType === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
const convert = (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.getPropertyObjectProperty);
sb.emitHelper(node, innerOptions, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitHelper(node, innerOptions, sb.helpers.isUndefined);
},
whenTrue: () => {
sb.emitOp(node, 'DROP');
},
whenFalse: () => {
sb.emitHelper(node, innerOptions, sb.helpers.invokeCall({ bindThis: true, noArgs: true }));
},
}));
};
const nextConvertObject = (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitOp(node, 'DUP');
sb.emitPushString(node, methods[1]);
convert(innerOptions);
sb.emitHelper(node, optionsIn, sb.helpers.forBuiltinType({
type: undefined,
knownType: undefined,
array: throwTypeError,
arrayStorage: throwTypeError,
boolean: convertPrimitive,
buffer: throwTypeError,
null: convertPrimitive,
number: convertPrimitive,
object: throwTypeError,
string: convertPrimitive,
symbol: convertPrimitive,
undefined: convertPrimitive,
map: throwTypeError,
mapStorage: throwTypeError,
set: throwTypeError,
setStorage: throwTypeError,
error: throwTypeError,
forwardValue: throwTypeError,
iteratorResult: throwTypeError,
iterable: throwTypeError,
iterableIterator: throwTypeError,
transaction: throwTypeError,
output: throwTypeError,
attribute: throwTypeError,
input: throwTypeError,
account: throwTypeError,
asset: throwTypeError,
contract: throwTypeError,
header: throwTypeError,
block: throwTypeError,
}));
};
sb.emitOp(node, 'DUP');
sb.emitOp(node, 'DUP');
sb.emitPushString(node, methods[0]);
convert(optionsIn);
sb.emitHelper(node, optionsIn, sb.helpers.forBuiltinType({
type: undefined,
knownType: undefined,
array: nextConvertObject,
arrayStorage: throwInnerTypeError,
boolean: convertObjectDone,
buffer: nextConvertObject,
null: convertObjectDone,
number: convertObjectDone,
object: nextConvertObject,
string: convertObjectDone,
symbol: convertObjectDone,
undefined: convertObjectDone,
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,
}));
};
sb.emitOp(node, 'DUP');
sb.emitPushString(node, constants_1.WellKnownSymbol.toPrimitive);
sb.emitHelper(node, options, sb.helpers.getSymbolObjectProperty);
sb.emitHelper(node, options, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitHelper(node, options, sb.helpers.isUndefined);
},
whenTrue: () => {
sb.emitOp(node, 'DROP');
tryConvert();
},
whenFalse: () => {
sb.emitPushString(node, this.preferredType);
sb.emitPushInt(node, 1);
sb.emitOp(node, 'PACK');
sb.emitOp(node, 'ROT');
sb.emitOp(node, 'ROT');
sb.emitHelper(node, options, sb.helpers.invokeCall({ bindThis: true }));
},
}));
};
const toString = (knownType) => (options) => {
sb.emitHelper(node, options, sb.helpers.toString({ type: this.type, knownType }));
sb.emitHelper(node, options, sb.helpers.wrapString);
};
sb.emitHelper(node, optionsIn, sb.helpers.forBuiltinType({
type: this.type,
knownType: this.knownType,
array: toString(constants_1.Types.Array),
arrayStorage: toString(constants_1.Types.Array),
boolean: convertPrimitive,
buffer: convertBuffer,
null: convertPrimitive,
number: convertPrimitive,
object: convertObject,
string: convertPrimitive,
symbol: convertPrimitive,
undefined: convertPrimitive,
map: toString(constants_1.Types.Array),
mapStorage: toString(constants_1.Types.Array),
set: toString(constants_1.Types.Array),
setStorage: toString(constants_1.Types.Array),
error: toString(constants_1.Types.Error),
forwardValue: toString(constants_1.Types.ForwardValue),
iteratorResult: toString(constants_1.Types.IteratorResult),
iterable: toString(constants_1.Types.Iterable),
iterableIterator: toString(constants_1.Types.IterableIterator),
transaction: toString(constants_1.Types.Transaction),
output: toString(constants_1.Types.Output),
attribute: toString(constants_1.Types.Attribute),
input: toString(constants_1.Types.Input),
account: toString(constants_1.Types.Account),
asset: toString(constants_1.Types.Asset),
contract: toString(constants_1.Types.Contract),
header: toString(constants_1.Types.Header),
block: toString(constants_1.Types.Block),
}));
}
}
exports.ToPrimitiveHelper = ToPrimitiveHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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VyxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxRQUFRLENBQUMsaUJBQUssQ0FBQyxNQUFNLENBQUM7WUFDOUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxpQkFBSyxDQUFDLFNBQVMsQ0FBQztZQUNwQyxLQUFLLEVBQUUsUUFBUSxDQUFDLGlCQUFLLENBQUMsS0FBSyxDQUFDO1lBQzVCLE9BQU8sRUFBRSxRQUFRLENBQUMsaUJBQUssQ0FBQyxPQUFPLENBQUM7WUFDaEMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxpQkFBSyxDQUFDLEtBQUssQ0FBQztZQUM1QixRQUFRLEVBQUUsUUFBUSxDQUFDLGlCQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxRQUFRLENBQUMsaUJBQUssQ0FBQyxNQUFNLENBQUM7WUFDOUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxpQkFBSyxDQUFDLEtBQUssQ0FBQztTQUM3QixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTVQRCw4Q0E0UEMiLCJmaWxlIjoibmVvLW9uZS1zbWFydC1jb250cmFjdC1jb21waWxlci9zcmMvY29tcGlsZS9oZWxwZXIvdHlwZXMvVG9QcmltaXRpdmVIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBUeXBlcywgV2VsbEtub3duU3ltYm9sIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zYic7XG5pbXBvcnQgeyBWaXNpdE9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXInO1xuXG5leHBvcnQgdHlwZSBQcmVmZXJyZWRUeXBlID0gJ2RlZmF1bHQnIHwgJ3N0cmluZycgfCAnbnVtYmVyJztcbmV4cG9ydCBpbnRlcmZhY2UgVG9QcmltaXRpdmVIZWxwZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkga25vd25UeXBlPzogVHlwZXM7XG4gIHJlYWRvbmx5IHByZWZlcnJlZFR5cGU/OiBQcmVmZXJyZWRUeXBlO1xufVxuXG4vLyBOT1RFOiBVbmxpa2UgdGhlIG90aGVyIFRvKiBtZXRob2RzLCB0aGlzIHJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuLy8gSW5wdXQ6IFt2YWxdXG4vLyBPdXRwdXQ6IFt2YWxdXG5leHBvcnQgY2xhc3MgVG9QcmltaXRpdmVIZWxwZXIgZXh0ZW5kcyBIZWxwZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkga25vd25UeXBlOiBUeXBlcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJyZWRUeXBlOiBQcmVmZXJyZWRUeXBlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7IHR5cGUsIGtub3duVHlwZSwgcHJlZmVycmVkVHlwZSA9ICdkZWZhdWx0JyB9OiBUb1ByaW1pdGl2ZUhlbHBlck9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5rbm93blR5cGUgPSBrbm93blR5cGU7XG4gICAgdGhpcy5wcmVmZXJyZWRUeXBlID0gcHJlZmVycmVkVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9uc0luLnB1c2hWYWx1ZSkge1xuICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvd1R5cGVFcnJvciA9IChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnRocm93VHlwZUVycm9yKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdGhyb3dJbm5lclR5cGVFcnJvciA9IChvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgdGhyb3dUeXBlRXJyb3Iob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnZlcnRQcmltaXRpdmUgPSAoKSA9PiB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnZlcnRCdWZmZXIgPSAob3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAvLyBbYnVmZmVyXVxuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcEJ1ZmZlcik7XG4gICAgICAvLyBbdmFsXVxuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLndyYXBTdHJpbmcpO1xuICAgIH07XG5cbiAgICBjb25zdCBjb252ZXJ0T2JqZWN0ID0gKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgY29udmVydE9iamVjdERvbmUgPSAoKSA9PiB7XG4gICAgICAgIC8vIFt2YWxdXG4gICAgICAgIHNiLmVtaXRPcChub2RlLCAnTklQJyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0cnlDb252ZXJ0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gdGhpcy5wcmVmZXJyZWRUeXBlID09PSAnc3RyaW5nJyA/IFsndG9TdHJpbmcnLCAndmFsdWVPZiddIDogWyd2YWx1ZU9mJywgJ3RvU3RyaW5nJ107XG4gICAgICAgIGNvbnN0IGNvbnZlcnQgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAvLyBbZnVuYywgdmFsdWVdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0UHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gW2Z1bmMsIGZ1bmMsIHZhbHVlXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgICAgICAgICAgLy8gW2lzVW5kZWZpbmVkLCBmdW5jLCB2YWx1ZV1cbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5pc1VuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbHVlXVxuICAgICAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5pbnZva2VDYWxsKHsgYmluZFRoaXM6IHRydWUsIG5vQXJnczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG5leHRDb252ZXJ0T2JqZWN0ID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAvLyBbdmFsLCB2YWxdXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgICAvLyBbbWV0aG9kLCB2YWwsIHZhbF1cbiAgICAgICAgICBzYi5lbWl0UHVzaFN0cmluZyhub2RlLCBtZXRob2RzWzFdKTtcbiAgICAgICAgICAvLyBbY29udmVydGVkVmFsXVxuICAgICAgICAgIGNvbnZlcnQoaW5uZXJPcHRpb25zKTtcblxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgb3B0aW9uc0luLFxuICAgICAgICAgICAgc2IuaGVscGVycy5mb3JCdWlsdGluVHlwZSh7XG4gICAgICAgICAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAga25vd25UeXBlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGFycmF5OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgYXJyYXlTdG9yYWdlOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgYm9vbGVhbjogY29udmVydFByaW1pdGl2ZSxcbiAgICAgICAgICAgICAgYnVmZmVyOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgbnVsbDogY29udmVydFByaW1pdGl2ZSxcbiAgICAgICAgICAgICAgbnVtYmVyOiBjb252ZXJ0UHJpbWl0aXZlLFxuICAgICAgICAgICAgICBvYmplY3Q6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgICBzdHJpbmc6IGNvbnZlcnRQcmltaXRpdmUsXG4gICAgICAgICAgICAgIHN5bWJvbDogY29udmVydFByaW1pdGl2ZSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkOiBjb252ZXJ0UHJpbWl0aXZlLFxuICAgICAgICAgICAgICBtYXA6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgICBtYXBTdG9yYWdlOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgc2V0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgc2V0U3RvcmFnZTogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGVycm9yOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgZm9yd2FyZFZhbHVlOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgaXRlcmF0b3JSZXN1bHQ6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgICBpdGVyYWJsZTogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGl0ZXJhYmxlSXRlcmF0b3I6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIG91dHB1dDogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZTogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGlucHV0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgYWNjb3VudDogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGFzc2V0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgICAgY29udHJhY3Q6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgICBoZWFkZXI6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgICBibG9jazogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFt2YWwsIHZhbF1cbiAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgLy8gW3ZhbCwgdmFsLCB2YWxdXG4gICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgIC8vIFttZXRob2QsIHZhbCwgdmFsXVxuICAgICAgICBzYi5lbWl0UHVzaFN0cmluZyhub2RlLCBtZXRob2RzWzBdKTtcbiAgICAgICAgLy8gW2NvbnZlcnRlZFZhbCwgdmFsXVxuICAgICAgICBjb252ZXJ0KG9wdGlvbnNJbik7XG5cbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG9wdGlvbnNJbixcbiAgICAgICAgICBzYi5oZWxwZXJzLmZvckJ1aWx0aW5UeXBlKHtcbiAgICAgICAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtub3duVHlwZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJyYXk6IG5leHRDb252ZXJ0T2JqZWN0LFxuICAgICAgICAgICAgYXJyYXlTdG9yYWdlOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgYm9vbGVhbjogY29udmVydE9iamVjdERvbmUsXG4gICAgICAgICAgICBidWZmZXI6IG5leHRDb252ZXJ0T2JqZWN0LFxuICAgICAgICAgICAgbnVsbDogY29udmVydE9iamVjdERvbmUsXG4gICAgICAgICAgICBudW1iZXI6IGNvbnZlcnRPYmplY3REb25lLFxuICAgICAgICAgICAgb2JqZWN0OiBuZXh0Q29udmVydE9iamVjdCxcbiAgICAgICAgICAgIHN0cmluZzogY29udmVydE9iamVjdERvbmUsXG4gICAgICAgICAgICBzeW1ib2w6IGNvbnZlcnRPYmplY3REb25lLFxuICAgICAgICAgICAgdW5kZWZpbmVkOiBjb252ZXJ0T2JqZWN0RG9uZSxcbiAgICAgICAgICAgIG1hcDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgIG1hcFN0b3JhZ2U6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICBzZXQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICBzZXRTdG9yYWdlOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgZXJyb3I6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICBmb3J3YXJkVmFsdWU6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICBpdGVyYXRvclJlc3VsdDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgIGl0ZXJhYmxlOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgaXRlcmFibGVJdGVyYXRvcjogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgb3V0cHV0OiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgYXR0cmlidXRlOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgaW5wdXQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICBhY2NvdW50OiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgYXNzZXQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICBjb250cmFjdDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcjogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgIGJsb2NrOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfTtcblxuICAgICAgLy8gW3ZhbHVlLCB2YWx1ZV1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAvLyBbc3ltYm9sLCB2YWx1ZSwgdmFsdWVdXG4gICAgICBzYi5lbWl0UHVzaFN0cmluZyhub2RlLCBXZWxsS25vd25TeW1ib2wudG9QcmltaXRpdmUpO1xuICAgICAgLy8gW3RvUHJpbWl0aXZlLCB2YWx1ZV1cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5nZXRTeW1ib2xPYmplY3RQcm9wZXJ0eSk7XG4gICAgICAvLyBbdmFsXVxuICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgc2IuaGVscGVycy5pZih7XG4gICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBbdG9QcmltaXRpdmUsIHRvUHJpbWl0aXZlLCB2YWx1ZV1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFVQJyk7XG4gICAgICAgICAgICAvLyBbaXNVbmRlZmluZWQsIHRvUHJpbWl0aXZlLCB2YWx1ZV1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5pc1VuZGVmaW5lZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgLy8gW3ZhbHVlXVxuICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgICAvLyBbdmFsdWVdXG4gICAgICAgICAgICB0cnlDb252ZXJ0KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFtwcmVmZXJyZWRUeXBlLCB0b1ByaW1pdGl2ZVZhbCwgdmFsXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcobm9kZSwgdGhpcy5wcmVmZXJyZWRUeXBlKTtcbiAgICAgICAgICAgIC8vIFsxLCBwcmVmZXJyZWRUeXBlLCB0b1ByaW1pdGl2ZVZhbCwgdmFsXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMSk7XG4gICAgICAgICAgICAvLyBbYXJncywgdG9QcmltaXRpdmVWYWwsIHZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnUEFDSycpO1xuICAgICAgICAgICAgLy8gW3ZhbCwgYXJncywgdG9QcmltaXRpdmVWYWxdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1JPVCcpO1xuICAgICAgICAgICAgLy8gW3RvUHJpbWl0aXZlVmFsLCB2YWwsIGFyZ3NdXG4gICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1JPVCcpO1xuICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5pbnZva2VDYWxsKHsgYmluZFRoaXM6IHRydWUgfSkpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdG9TdHJpbmcgPSAoa25vd25UeXBlOiBUeXBlcykgPT4gKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW3N0cmluZ11cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy50b1N0cmluZyh7IHR5cGU6IHRoaXMudHlwZSwga25vd25UeXBlIH0pKTtcbiAgICAgIC8vIFt2YWxdXG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcFN0cmluZyk7XG4gICAgfTtcblxuICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICBub2RlLFxuICAgICAgb3B0aW9uc0luLFxuICAgICAgc2IuaGVscGVycy5mb3JCdWlsdGluVHlwZSh7XG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAga25vd25UeXBlOiB0aGlzLmtub3duVHlwZSxcbiAgICAgICAgYXJyYXk6IHRvU3RyaW5nKFR5cGVzLkFycmF5KSxcbiAgICAgICAgYXJyYXlTdG9yYWdlOiB0b1N0cmluZyhUeXBlcy5BcnJheSksXG4gICAgICAgIGJvb2xlYW46IGNvbnZlcnRQcmltaXRpdmUsXG4gICAgICAgIGJ1ZmZlcjogY29udmVydEJ1ZmZlcixcbiAgICAgICAgbnVsbDogY29udmVydFByaW1pdGl2ZSxcbiAgICAgICAgbnVtYmVyOiBjb252ZXJ0UHJpbWl0aXZlLFxuICAgICAgICBvYmplY3Q6IGNvbnZlcnRPYmplY3QsXG4gICAgICAgIHN0cmluZzogY29udmVydFByaW1pdGl2ZSxcbiAgICAgICAgc3ltYm9sOiBjb252ZXJ0UHJpbWl0aXZlLFxuICAgICAgICB1bmRlZmluZWQ6IGNvbnZlcnRQcmltaXRpdmUsXG4gICAgICAgIG1hcDogdG9TdHJpbmcoVHlwZXMuQXJyYXkpLFxuICAgICAgICBtYXBTdG9yYWdlOiB0b1N0cmluZyhUeXBlcy5BcnJheSksXG4gICAgICAgIHNldDogdG9TdHJpbmcoVHlwZXMuQXJyYXkpLFxuICAgICAgICBzZXRTdG9yYWdlOiB0b1N0cmluZyhUeXBlcy5BcnJheSksXG4gICAgICAgIGVycm9yOiB0b1N0cmluZyhUeXBlcy5FcnJvciksXG4gICAgICAgIGZvcndhcmRWYWx1ZTogdG9TdHJpbmcoVHlwZXMuRm9yd2FyZFZhbHVlKSxcbiAgICAgICAgaXRlcmF0b3JSZXN1bHQ6IHRvU3RyaW5nKFR5cGVzLkl0ZXJhdG9yUmVzdWx0KSxcbiAgICAgICAgaXRlcmFibGU6IHRvU3RyaW5nKFR5cGVzLkl0ZXJhYmxlKSxcbiAgICAgICAgaXRlcmFibGVJdGVyYXRvcjogdG9TdHJpbmcoVHlwZXMuSXRlcmFibGVJdGVyYXRvciksXG4gICAgICAgIHRyYW5zYWN0aW9uOiB0b1N0cmluZyhUeXBlcy5UcmFuc2FjdGlvbiksXG4gICAgICAgIG91dHB1dDogdG9TdHJpbmcoVHlwZXMuT3V0cHV0KSxcbiAgICAgICAgYXR0cmlidXRlOiB0b1N0cmluZyhUeXBlcy5BdHRyaWJ1dGUpLFxuICAgICAgICBpbnB1dDogdG9TdHJpbmcoVHlwZXMuSW5wdXQpLFxuICAgICAgICBhY2NvdW50OiB0b1N0cmluZyhUeXBlcy5BY2NvdW50KSxcbiAgICAgICAgYXNzZXQ6IHRvU3RyaW5nKFR5cGVzLkFzc2V0KSxcbiAgICAgICAgY29udHJhY3Q6IHRvU3RyaW5nKFR5cGVzLkNvbnRyYWN0KSxcbiAgICAgICAgaGVhZGVyOiB0b1N0cmluZyhUeXBlcy5IZWFkZXIpLFxuICAgICAgICBibG9jazogdG9TdHJpbmcoVHlwZXMuQmxvY2spLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19