@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
148 lines (146 loc) • 26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const Helper_1 = require("../Helper");
class ParametersHelper extends Helper_1.Helper {
constructor(options) {
super();
this.params = options.params;
this.asArgsArr = options.asArgsArr === undefined ? false : options.asArgsArr;
this.map = options.map;
this.mapParam = options.mapParam;
}
emit(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const params = this.params;
const restElement = params.find((param) => ts_utils_1.tsUtils.parameter.isRestParameter(param));
let parameters = restElement === undefined ? [...params] : params.slice(0, -1);
parameters =
parameters.length > 0 && ts_utils_1.tsUtils.node.getName(parameters[0]) === 'this' ? parameters.slice(1) : parameters;
if (this.asArgsArr) {
sb.emitPushInt(node, 0);
sb.emitOp(node, 'NEWARRAY');
sb.emitOp(node, 'SWAP');
}
parameters.forEach((param, idx) => {
const nameNode = ts_utils_1.tsUtils.node.getNameNode(param);
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(param);
if (initializer !== undefined) {
sb.emitHelper(param, sb.noPushValueOptions(options), sb.helpers.if({
condition: () => {
sb.emitOp(param, 'DUP');
sb.emitOp(param, 'ARRAYSIZE');
sb.emitPushInt(param, idx);
sb.emitOp(param, 'LTE');
},
whenTrue: () => {
sb.visit(initializer, sb.pushValueOptions(options));
},
whenFalse: () => {
sb.emitOp(param, 'DUP');
sb.emitPushInt(param, idx);
sb.emitOp(param, 'PICKITEM');
if (this.mapParam !== undefined) {
this.mapParam(param, options);
}
sb.emitOp(param, 'DUP');
sb.emitHelper(param, sb.noPushValueOptions(options), sb.helpers.if({
condition: () => {
sb.emitHelper(param, sb.pushValueOptions(options), sb.helpers.isUndefined);
},
whenTrue: () => {
sb.emitOp(param, 'DROP');
sb.visit(initializer, sb.pushValueOptions(options));
},
}));
},
}));
}
else if (ts_utils_1.tsUtils.parameter.isOptional(param)) {
sb.emitHelper(param, sb.noPushValueOptions(options), sb.helpers.if({
condition: () => {
sb.emitOp(param, 'DUP');
sb.emitOp(param, 'ARRAYSIZE');
sb.emitPushInt(param, idx);
sb.emitOp(param, 'LTE');
},
whenTrue: () => {
sb.emitHelper(param, sb.pushValueOptions(options), sb.helpers.wrapUndefined);
},
whenFalse: () => {
sb.emitOp(param, 'DUP');
sb.emitPushInt(param, idx);
sb.emitOp(param, 'PICKITEM');
if (this.mapParam !== undefined) {
this.mapParam(param, options);
}
},
}));
}
else {
sb.emitOp(param, 'DUP');
sb.emitPushInt(param, idx);
sb.emitOp(param, 'PICKITEM');
if (this.mapParam !== undefined) {
this.mapParam(param, options);
}
}
if (this.map !== undefined) {
this.map(param, options);
}
if (this.asArgsArr) {
sb.emitOp(node, 'ROT');
sb.emitOp(node, 'TUCK');
sb.emitOp(node, 'SWAP');
sb.emitOp(node, 'APPEND');
sb.emitOp(node, 'SWAP');
}
else if (typescript_1.default.isIdentifier(nameNode)) {
sb.scope.add(ts_utils_1.tsUtils.node.getText(nameNode));
sb.scope.set(sb, node, options, ts_utils_1.tsUtils.node.getText(nameNode));
}
else if (typescript_1.default.isArrayBindingPattern(nameNode)) {
const paramType = sb.context.analysis.getType(param);
sb.emitHelper(nameNode, options, sb.helpers.arrayBinding({ type: paramType }));
}
else {
const paramType = sb.context.analysis.getType(param);
sb.emitHelper(nameNode, options, sb.helpers.objectBinding({ type: paramType }));
}
});
if (restElement === undefined) {
sb.emitOp(node, 'DROP');
}
else {
sb.emitPushInt(restElement, parameters.length);
sb.emitHelper(restElement, options, sb.helpers.arrSlice({ hasEnd: false }));
const mapParam = this.mapParam;
if (mapParam !== undefined) {
sb.emitHelper(restElement, options, sb.helpers.arrMap({
map: (innerOptions) => mapParam(restElement, innerOptions),
}));
}
if (this.asArgsArr) {
const map = this.map;
if (map !== undefined) {
sb.emitHelper(restElement, options, sb.helpers.arrMap({
map: (innerOptions) => map(restElement, innerOptions, true),
}));
}
sb.emitHelper(node, options, sb.helpers.arrConcat);
}
else {
sb.emitHelper(restElement, options, sb.helpers.wrapArray);
if (this.map !== undefined) {
this.map(restElement, options);
}
sb.scope.add(ts_utils_1.tsUtils.node.getNameOrThrow(restElement));
sb.scope.set(sb, restElement, options, ts_utils_1.tsUtils.node.getNameOrThrow(restElement));
}
}
}
}
exports.ParametersHelper = ParametersHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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bmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvaGVscGVyL2Z1bmN0aW9uL1BhcmFtZXRlcnNIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL0hlbHBlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyc0hlbHBlck9wdGlvbnMge1xuICByZWFkb25seSBwYXJhbXM6IFJlYWRvbmx5QXJyYXk8dHMuUGFyYW1ldGVyRGVjbGFyYXRpb24+O1xuICByZWFkb25seSBhc0FyZ3NBcnI/OiBib29sZWFuO1xuICByZWFkb25seSBtYXA/OiAocGFyYW06IHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMsIGlzUmVzdEVsZW1lbnQ/OiBib29sZWFuKSA9PiB2b2lkO1xuICByZWFkb25seSBtYXBQYXJhbT86IChwYXJhbTogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb24sIG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gSW5wdXQ6IFthcmdzYXJyXVxuLy8gT3V0cHV0OiBbXVxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlcnNIZWxwZXIgZXh0ZW5kcyBIZWxwZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUmVhZG9ubHlBcnJheTx0cy5QYXJhbWV0ZXJEZWNsYXJhdGlvbj47XG4gIHByaXZhdGUgcmVhZG9ubHkgYXNBcmdzQXJyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcD86IChwYXJhbTogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb24sIG9wdGlvbnM6IFZpc2l0T3B0aW9ucywgaXNSZXN0RWxlbWVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwUGFyYW0/OiAocGFyYW06IHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uLCBvcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcmFtZXRlcnNIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhcmFtcyA9IG9wdGlvbnMucGFyYW1zO1xuICAgIHRoaXMuYXNBcmdzQXJyID0gb3B0aW9ucy5hc0FyZ3NBcnIgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9ucy5hc0FyZ3NBcnI7XG4gICAgdGhpcy5tYXAgPSBvcHRpb25zLm1hcDtcbiAgICB0aGlzLm1hcFBhcmFtID0gb3B0aW9ucy5tYXBQYXJhbTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KHNiOiBTY3JpcHRCdWlsZGVyLCBub2RlOiB0cy5Ob2RlLCBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKG9wdGlvbnNJbik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcztcbiAgICBjb25zdCByZXN0RWxlbWVudCA9IHBhcmFtcy5maW5kKChwYXJhbSkgPT4gdHNVdGlscy5wYXJhbWV0ZXIuaXNSZXN0UGFyYW1ldGVyKHBhcmFtKSk7XG4gICAgbGV0IHBhcmFtZXRlcnMgPSByZXN0RWxlbWVudCA9PT0gdW5kZWZpbmVkID8gWy4uLnBhcmFtc10gOiBwYXJhbXMuc2xpY2UoMCwgLTEpO1xuICAgIHBhcmFtZXRlcnMgPVxuICAgICAgcGFyYW1ldGVycy5sZW5ndGggPiAwICYmIHRzVXRpbHMubm9kZS5nZXROYW1lKHBhcmFtZXRlcnNbMF0pID09PSAndGhpcycgPyBwYXJhbWV0ZXJzLnNsaWNlKDEpIDogcGFyYW1ldGVycztcbiAgICBpZiAodGhpcy5hc0FyZ3NBcnIpIHtcbiAgICAgIC8vIFswLCBhcmdzYXJyXVxuICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMCk7XG4gICAgICAvLyBbb3V0cHV0YXJyLCBhcmdzYXJyXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdORVdBUlJBWScpO1xuICAgICAgLy8gW2FyZ3NhcnIsIG91dHB1dGFycl1cbiAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgIH1cbiAgICAvLyBbYXJnc2Fyciwgb3V0cHV0YXJyXVxuICAgIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW0sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgbmFtZU5vZGUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZU5vZGUocGFyYW0pO1xuXG4gICAgICBjb25zdCBpbml0aWFsaXplciA9IHRzVXRpbHMuaW5pdGlhbGl6ZXIuZ2V0SW5pdGlhbGl6ZXIocGFyYW0pO1xuICAgICAgaWYgKGluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBwYXJhbSxcbiAgICAgICAgICBzYi5ub1B1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucyksXG4gICAgICAgICAgc2IuaGVscGVycy5pZih7XG4gICAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gW2FyZ3NhcnIsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbc2l6ZSwgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKHBhcmFtLCAnQVJSQVlTSVpFJyk7XG4gICAgICAgICAgICAgIC8vIFtpZHgsIHNpemUsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KHBhcmFtLCBpZHgpO1xuICAgICAgICAgICAgICAvLyBbbHQsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ0xURScpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFtkZWZhdWx0LCBhcmdzYXJyXVxuICAgICAgICAgICAgICBzYi52aXNpdChpbml0aWFsaXplciwgc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2hlbkZhbHNlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFthcmdzYXJyLCBhcmdzYXJyXVxuICAgICAgICAgICAgICBzYi5lbWl0T3AocGFyYW0sICdEVVAnKTtcbiAgICAgICAgICAgICAgLy8gW2lkeCwgYXJnc2FyciwgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQocGFyYW0sIGlkeCk7XG4gICAgICAgICAgICAgIC8vIFthcmcsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ1BJQ0tJVEVNJyk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm1hcFBhcmFtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFBhcmFtKHBhcmFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBbYXJnLCBhcmcsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ0RVUCcpO1xuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgICAgIHNiLm5vUHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBbaXNVbmRlZmluZWQsIGFyZywgYXJnc2Fycl1cbiAgICAgICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihwYXJhbSwgc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSwgc2IuaGVscGVycy5pc1VuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gW2FyZ3NhcnJdXG4gICAgICAgICAgICAgICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ0RST1AnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gW2RlZmF1bHQsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgICAgICAgIHNiLnZpc2l0KGluaXRpYWxpemVyLCBzYi5wdXNoVmFsdWVPcHRpb25zKG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0c1V0aWxzLnBhcmFtZXRlci5pc09wdGlvbmFsKHBhcmFtKSkge1xuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgIHNiLm5vUHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBbYXJnc2FyciwgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKHBhcmFtLCAnRFVQJyk7XG4gICAgICAgICAgICAgIC8vIFtzaXplLCBhcmdzYXJyXVxuICAgICAgICAgICAgICBzYi5lbWl0T3AocGFyYW0sICdBUlJBWVNJWkUnKTtcbiAgICAgICAgICAgICAgLy8gW2lkeCwgc2l6ZSwgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hJbnQocGFyYW0sIGlkeCk7XG4gICAgICAgICAgICAgIC8vIFtzaXplIDw9IGlkeCwgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKHBhcmFtLCAnTFRFJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2hlblRydWU6ICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gW3VuZGVmaW5lZFZhbCwgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihwYXJhbSwgc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSwgc2IuaGVscGVycy53cmFwVW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aGVuRmFsc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gW2FyZ3NhcnIsIGFyZ3NhcnJdXG4gICAgICAgICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAvLyBbaWR4LCBhcmdzYXJyLCBhcmdzYXJyXVxuICAgICAgICAgICAgICBzYi5lbWl0UHVzaEludChwYXJhbSwgaWR4KTtcbiAgICAgICAgICAgICAgLy8gW2FyZywgYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdE9wKHBhcmFtLCAnUElDS0lURU0nKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubWFwUGFyYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFwUGFyYW0ocGFyYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gW2FyZ3NhcnIsIGFyZ3NhcnJdXG4gICAgICAgIHNiLmVtaXRPcChwYXJhbSwgJ0RVUCcpO1xuICAgICAgICAvLyBbaWR4LCBhcmdzYXJyLCBhcmdzYXJyXVxuICAgICAgICBzYi5lbWl0UHVzaEludChwYXJhbSwgaWR4KTtcbiAgICAgICAgLy8gW2FyZywgYXJnc2Fycl1cbiAgICAgICAgc2IuZW1pdE9wKHBhcmFtLCAnUElDS0lURU0nKTtcbiAgICAgICAgaWYgKHRoaXMubWFwUGFyYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubWFwUGFyYW0ocGFyYW0sIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1tYXAtd2l0aG91dC11c2FnZVxuICAgICAgICB0aGlzLm1hcChwYXJhbSwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFzQXJnc0Fycikge1xuICAgICAgICAvLyBbb3V0cHV0YXJyLCB2YWwsIGFyZ3NhcnJdXG4gICAgICAgIHNiLmVtaXRPcChub2RlLCAnUk9UJyk7XG4gICAgICAgIC8vIFtvdXRwdXRhcnIsIHZhbCwgb3V0cHV0YXJyLCBhcmdzYXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1RVQ0snKTtcbiAgICAgICAgLy8gW3ZhbCwgb3V0cHV0YXJyLCBvdXRwdXRhcnIsIGFyZ3NhcnJdXG4gICAgICAgIHNiLmVtaXRPcChub2RlLCAnU1dBUCcpO1xuICAgICAgICAvLyBbb3V0cHV0YXJyLCBhcmdzYXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0FQUEVORCcpO1xuICAgICAgICAvLyBbYXJnc2Fyciwgb3V0cHV0YXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWVOb2RlKSkge1xuICAgICAgICBzYi5zY29wZS5hZGQodHNVdGlscy5ub2RlLmdldFRleHQobmFtZU5vZGUpKTtcbiAgICAgICAgLy8gW2FyZ3NhcnJdXG4gICAgICAgIHNiLnNjb3BlLnNldChzYiwgbm9kZSwgb3B0aW9ucywgdHNVdGlscy5ub2RlLmdldFRleHQobmFtZU5vZGUpKTtcbiAgICAgIH0gZWxzZSBpZiAodHMuaXNBcnJheUJpbmRpbmdQYXR0ZXJuKG5hbWVOb2RlKSkge1xuICAgICAgICBjb25zdCBwYXJhbVR5cGUgPSBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUocGFyYW0pO1xuICAgICAgICBzYi5lbWl0SGVscGVyKG5hbWVOb2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmFycmF5QmluZGluZyh7IHR5cGU6IHBhcmFtVHlwZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJhbVR5cGUgPSBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUocGFyYW0pO1xuICAgICAgICBzYi5lbWl0SGVscGVyKG5hbWVOb2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLm9iamVjdEJpbmRpbmcoeyB0eXBlOiBwYXJhbVR5cGUgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFtvdXRwdXRhcnI/XVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFtudW1iZXIsIGFyZ3NhcnIsIG91dHB1dGFycj9dXG4gICAgICBzYi5lbWl0UHVzaEludChyZXN0RWxlbWVudCwgcGFyYW1ldGVycy5sZW5ndGgpO1xuICAgICAgLy8gW2Fyciwgb3V0cHV0YXJyP11cbiAgICAgIHNiLmVtaXRIZWxwZXIocmVzdEVsZW1lbnQsIG9wdGlvbnMsIHNiLmhlbHBlcnMuYXJyU2xpY2UoeyBoYXNFbmQ6IGZhbHNlIH0pKTtcbiAgICAgIGNvbnN0IG1hcFBhcmFtID0gdGhpcy5tYXBQYXJhbTtcbiAgICAgIGlmIChtYXBQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgcmVzdEVsZW1lbnQsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBzYi5oZWxwZXJzLmFyck1hcCh7XG4gICAgICAgICAgICBtYXA6IChpbm5lck9wdGlvbnMpID0+IG1hcFBhcmFtKHJlc3RFbGVtZW50LCBpbm5lck9wdGlvbnMpLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hc0FyZ3NBcnIpIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5tYXA7XG4gICAgICAgIGlmIChtYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1tYXAtd2l0aG91dC11c2FnZVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICByZXN0RWxlbWVudCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmFyck1hcCh7XG4gICAgICAgICAgICAgIG1hcDogKGlubmVyT3B0aW9ucykgPT4gbWFwKHJlc3RFbGVtZW50LCBpbm5lck9wdGlvbnMsIHRydWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBbb3V0cHV0YXJyXVxuICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMuYXJyQ29uY2F0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFthcnJheVZhbCwgb3V0cHV0YXJyP11cbiAgICAgICAgc2IuZW1pdEhlbHBlcihyZXN0RWxlbWVudCwgb3B0aW9ucywgc2IuaGVscGVycy53cmFwQXJyYXkpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW1hcC13aXRob3V0LXVzYWdlXG4gICAgICAgICAgdGhpcy5tYXAocmVzdEVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2Iuc2NvcGUuYWRkKHRzVXRpbHMubm9kZS5nZXROYW1lT3JUaHJvdyhyZXN0RWxlbWVudCkpO1xuICAgICAgICAvLyBbXVxuICAgICAgICBzYi5zY29wZS5zZXQoc2IsIHJlc3RFbGVtZW50LCBvcHRpb25zLCB0c1V0aWxzLm5vZGUuZ2V0TmFtZU9yVGhyb3cocmVzdEVsZW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==