@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
287 lines (286 loc) • 52.3 kB
JavaScript
"use strict";
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 DiagnosticCode_1 = require("../../DiagnosticCode");
const DiagnosticMessage_1 = require("../../DiagnosticMessage");
const constants_1 = require("../constants");
const NodeCompiler_1 = require("../NodeCompiler");
class ClassDeclarationCompiler extends NodeCompiler_1.NodeCompiler {
constructor() {
super(...arguments);
this.kind = typescript_1.default.SyntaxKind.ClassDeclaration;
}
visitNode(sb, decl, optionsIn) {
if (sb.context.analysis.isSmartContract(decl)) {
return;
}
let options = sb.pushValueOptions(sb.noSuperClassOptions(optionsIn));
const name = sb.scope.add(ts_utils_1.tsUtils.node.getNameOrThrow(decl));
const extendsExpr = ts_utils_1.tsUtils.class_.getExtends(decl);
let superClassIn;
if (extendsExpr !== undefined) {
superClassIn = sb.scope.addUnique();
options = sb.superClassOptions(options, superClassIn);
sb.visit(ts_utils_1.tsUtils.expression.getExpression(extendsExpr), options);
sb.scope.set(sb, extendsExpr, options, superClassIn);
}
const superClass = superClassIn;
const switchProperty = (node, innerOptions, handleString, handleSymbol) => {
const nameNode = ts_utils_1.tsUtils.node.getNameNode(node);
if (typescript_1.default.isComputedPropertyName(nameNode)) {
const expr = ts_utils_1.tsUtils.expression.getExpression(nameNode);
const throwTypeError = (innerInnerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerInnerOptions, sb.helpers.throwTypeError);
};
const processString = (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.unwrapString);
handleString(innerInnerOptions);
};
const processSymbol = (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.unwrapSymbol);
handleSymbol(innerInnerOptions);
};
sb.visit(expr, sb.pushValueOptions(innerOptions));
sb.emitHelper(expr, innerOptions, sb.helpers.forBuiltinType({
type: sb.context.analysis.getType(expr),
array: throwTypeError,
arrayStorage: throwTypeError,
boolean: throwTypeError,
buffer: throwTypeError,
null: throwTypeError,
number: throwTypeError,
object: throwTypeError,
string: processString,
symbol: processSymbol,
undefined: throwTypeError,
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,
}));
}
else {
sb.emitPushString(node, ts_utils_1.tsUtils.node.getName(node));
handleString(innerOptions);
}
};
const addProperty = (property, innerOptions) => {
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(property);
const propNode = initializer === undefined ? property : initializer;
sb.emitOp(propNode, 'DUP');
switchProperty(property, innerOptions, (innerInnerOptions) => {
if (initializer === undefined) {
sb.emitHelper(propNode, sb.pushValueOptions(innerInnerOptions), sb.helpers.wrapUndefined);
}
else {
sb.visit(initializer, sb.pushValueOptions(innerInnerOptions));
}
sb.emitHelper(propNode, innerOptions, sb.helpers.setDataPropertyObjectProperty);
}, (innerInnerOptions) => {
if (initializer === undefined) {
sb.emitHelper(propNode, sb.pushValueOptions(innerInnerOptions), sb.helpers.wrapUndefined);
}
else {
sb.visit(initializer, sb.pushValueOptions(innerInnerOptions));
}
sb.emitHelper(propNode, innerOptions, sb.helpers.setDataSymbolObjectProperty);
});
};
sb.emitHelper(decl, options, sb.helpers.createConstructArray({
withScope: true,
body: (innerOptionsIn) => {
const innerOptions = sb.pushValueOptions(innerOptionsIn);
const ctorImpl = ts_utils_1.tsUtils.class_.getConcreteConstructor(decl);
const ctorNode = ctorImpl === undefined ? decl : ctorImpl;
if (ctorImpl !== undefined) {
sb.emitHelper(ctorImpl, innerOptions, sb.helpers.parameters({ params: ts_utils_1.tsUtils.parametered.getParameters(ctorImpl) }));
}
else if (superClass !== undefined && extendsExpr !== undefined) {
sb.scope.getThis(sb, extendsExpr, innerOptions);
sb.scope.get(sb, extendsExpr, innerOptions, superClass);
sb.emitHelper(extendsExpr, sb.noPushValueOptions(innerOptions), sb.helpers.invokeConstruct());
}
else {
sb.emitOp(decl, 'DROP');
}
sb.scope.getThis(sb, ctorNode, innerOptions);
ts_utils_1.tsUtils.class_
.getConcreteInstanceProperties(decl)
.filter(typescript_1.default.isPropertyDeclaration)
.forEach((property) => {
addProperty(property, innerOptions);
});
sb.emitOp(ctorNode, 'DROP');
if (ctorImpl !== undefined) {
sb.visit(ts_utils_1.tsUtils.body.getBodyOrThrow(ctorImpl), sb.noPushValueOptions(innerOptions));
}
},
}));
sb.emitHelper(decl, options, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Construct,
}));
sb.emitOp(decl, 'DUP');
sb.emitPushString(decl, 'prototype');
sb.emitOp(decl, 'OVER');
sb.emitHelper(decl, options, sb.helpers.createObject);
sb.emitOp(decl, 'TUCK');
sb.emitPushString(decl, 'constructor');
sb.emitOp(decl, 'ROT');
sb.emitHelper(decl, options, sb.helpers.setDataPropertyObjectProperty);
const addMethod = (method) => {
const visit = (innerOptions) => {
sb.emitHelper(method, innerOptions, sb.helpers.createCallArray);
sb.emitHelper(method, innerOptions, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Call,
}));
};
sb.emitOp(method, 'DUP');
switchProperty(method, options, (innerOptions) => {
visit(innerOptions);
sb.emitHelper(method, innerOptions, sb.helpers.setDataPropertyObjectProperty);
}, (innerOptions) => {
visit(innerOptions);
sb.emitHelper(method, innerOptions, sb.helpers.setDataSymbolObjectProperty);
});
};
ts_utils_1.tsUtils.class_.getConcreteInstanceMethods(decl).forEach((method) => {
addMethod(method);
});
ts_utils_1.tsUtils.class_.getConcreteMembers(decl).forEach((member) => {
const decorators = ts_utils_1.tsUtils.decoratable.getDecoratorsArray(member);
if (decorators.length > 0) {
sb.context.reportError(decorators[0], DiagnosticCode_1.DiagnosticCode.UnsupportedSyntax, DiagnosticMessage_1.DiagnosticMessage.UnsupportedDecorator);
}
});
const addSetAccessor = (accessor) => {
const visit = (innerOptions) => {
sb.emitHelper(accessor, innerOptions, sb.helpers.createCallArray);
sb.emitHelper(accessor, innerOptions, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Call,
}));
const getAccessor = ts_utils_1.tsUtils.accessor.getGetAccessor(accessor);
const hasGet = getAccessor !== undefined;
if (getAccessor !== undefined) {
sb.emitHelper(getAccessor, innerOptions, sb.helpers.createCallArray);
sb.emitHelper(getAccessor, innerOptions, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Call,
}));
}
return hasGet;
};
sb.emitOp(accessor, 'DUP');
switchProperty(accessor, options, (innerOptions) => {
const hasGet = visit(innerOptions);
sb.emitHelper(accessor, options, sb.helpers.setAccessorPropertyObjectProperty({
hasSet: true,
hasGet,
}));
}, (innerOptions) => {
const hasGet = visit(innerOptions);
sb.emitHelper(accessor, options, sb.helpers.setAccessorSymbolObjectProperty({
hasSet: true,
hasGet,
}));
});
};
ts_utils_1.tsUtils.class_
.getConcreteInstanceMembers(decl)
.filter(typescript_1.default.isSetAccessor)
.forEach((accessor) => {
addSetAccessor(accessor);
});
const addGetAccessor = (accessor) => {
const visit = (innerOptions) => {
sb.emitHelper(accessor, innerOptions, sb.helpers.createCallArray);
sb.emitHelper(accessor, innerOptions, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Call,
}));
};
sb.emitOp(accessor, 'DUP');
switchProperty(accessor, options, (innerOptions) => {
visit(innerOptions);
sb.emitHelper(accessor, options, sb.helpers.setAccessorPropertyObjectProperty({
hasSet: false,
hasGet: true,
}));
}, (innerOptions) => {
visit(innerOptions);
sb.emitHelper(accessor, options, sb.helpers.setAccessorSymbolObjectProperty({
hasSet: false,
hasGet: true,
}));
});
};
ts_utils_1.tsUtils.class_
.getConcreteInstanceMembers(decl)
.filter(typescript_1.default.isGetAccessor)
.filter((accessor) => ts_utils_1.tsUtils.accessor.getSetAccessor(accessor) === undefined)
.forEach((accessor) => {
addGetAccessor(accessor);
});
if (superClass !== undefined && extendsExpr !== undefined) {
sb.emitOp(extendsExpr, 'DUP');
sb.emitPushString(extendsExpr, '__proto__');
sb.scope.get(sb, extendsExpr, options, superClass);
sb.emitPushString(extendsExpr, 'prototype');
sb.emitHelper(extendsExpr, options, sb.helpers.getPropertyObjectProperty);
sb.emitHelper(extendsExpr, options, sb.helpers.setDataPropertyObjectProperty);
}
sb.emitHelper(decl, options, sb.helpers.setDataPropertyObjectProperty);
ts_utils_1.tsUtils.class_
.getConcreteStaticProperties(decl)
.filter(typescript_1.default.isPropertyDeclaration)
.forEach((property) => {
addProperty(property, options);
});
ts_utils_1.tsUtils.class_.getConcreteStaticMethods(decl).forEach((method) => {
addMethod(method);
});
ts_utils_1.tsUtils.class_
.getConcreteStaticMembers(decl)
.filter(typescript_1.default.isSetAccessor)
.forEach((accessor) => {
addSetAccessor(accessor);
});
ts_utils_1.tsUtils.class_
.getConcreteStaticMembers(decl)
.filter(typescript_1.default.isGetAccessor)
.filter((accessor) => ts_utils_1.tsUtils.accessor.getSetAccessor(accessor) === undefined)
.forEach((accessor) => {
addGetAccessor(accessor);
});
if (superClass !== undefined && extendsExpr !== undefined) {
sb.emitOp(extendsExpr, 'DUP');
sb.emitPushString(extendsExpr, '__proto__');
sb.scope.get(sb, extendsExpr, options, superClass);
sb.emitHelper(extendsExpr, options, sb.helpers.setDataPropertyObjectProperty);
}
if (ts_utils_1.tsUtils.modifier.isNamedExport(decl) || ts_utils_1.tsUtils.modifier.isDefaultExport(decl)) {
sb.emitOp(decl, 'DUP');
sb.emitHelper(decl, options, sb.helpers.exportSingle({
name: ts_utils_1.tsUtils.modifier.isNamedExport(decl) ? ts_utils_1.tsUtils.node.getNameOrThrow(decl) : undefined,
defaultExport: ts_utils_1.tsUtils.modifier.isDefaultExport(decl),
}));
}
sb.scope.set(sb, decl, options, name);
}
}
exports.ClassDeclarationCompiler = ClassDeclarationCompiler;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNsYXNzRGVjbGFyYXRpb25Db21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBK0Q7QUFDL0Qsb0VBQTRCO0FBQzVCLHlEQUFzRDtBQUN0RCwrREFBNEQ7QUFDNUQsNENBQXNEO0FBQ3RELGtEQUErQztBQUkvQyxNQUFhLHdCQUF5QixTQUFRLDJCQUFpQztJQUEvRTs7UUFDa0IsU0FBSSxHQUFHLG9CQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDO0lBdWJ4RCxDQUFDO0lBcmJRLFNBQVMsQ0FBQyxFQUFpQixFQUFFLElBQXlCLEVBQUUsU0FBdUI7UUFDcEYsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDN0MsT0FBTztTQUNSO1FBRUQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sV0FBVyxHQUFHLGtCQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLFlBQVksQ0FBQztRQUNqQixJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDN0IsWUFBWSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFHdEQsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFakUsRUFBRSxD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QUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUF4YkQsNERBd2JDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvZGVjbGFyYXRpb24vQ2xhc3NEZWNsYXJhdGlvbkNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvcGVydHlOYW1lZE5vZGUsIHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uLy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgSW50ZXJuYWxPYmplY3RQcm9wZXJ0eSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOb2RlQ29tcGlsZXIgfSBmcm9tICcuLi9Ob2RlQ29tcGlsZXInO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENsYXNzRGVjbGFyYXRpb25Db21waWxlciBleHRlbmRzIE5vZGVDb21waWxlcjx0cy5DbGFzc0RlY2xhcmF0aW9uPiB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uO1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIGRlY2w6IHRzLkNsYXNzRGVjbGFyYXRpb24sIG9wdGlvbnNJbjogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHNiLmNvbnRleHQuYW5hbHlzaXMuaXNTbWFydENvbnRyYWN0KGRlY2wpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKHNiLm5vU3VwZXJDbGFzc09wdGlvbnMob3B0aW9uc0luKSk7XG4gICAgY29uc3QgbmFtZSA9IHNiLnNjb3BlLmFkZCh0c1V0aWxzLm5vZGUuZ2V0TmFtZU9yVGhyb3coZGVjbCkpO1xuICAgIGNvbnN0IGV4dGVuZHNFeHByID0gdHNVdGlscy5jbGFzc18uZ2V0RXh0ZW5kcyhkZWNsKTtcbiAgICBsZXQgc3VwZXJDbGFzc0luO1xuICAgIGlmIChleHRlbmRzRXhwciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdXBlckNsYXNzSW4gPSBzYi5zY29wZS5hZGRVbmlxdWUoKTtcbiAgICAgIG9wdGlvbnMgPSBzYi5zdXBlckNsYXNzT3B0aW9ucyhvcHRpb25zLCBzdXBlckNsYXNzSW4pO1xuXG4gICAgICAvLyBbc3VwZXJDbGFzc11cbiAgICAgIHNiLnZpc2l0KHRzVXRpbHMuZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKGV4dGVuZHNFeHByKSwgb3B0aW9ucyk7XG4gICAgICAvLyBbXVxuICAgICAgc2Iuc2NvcGUuc2V0KHNiLCBleHRlbmRzRXhwciwgb3B0aW9ucywgc3VwZXJDbGFzc0luKTtcbiAgICB9XG4gICAgY29uc3Qgc3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3NJbjtcblxuICAgIGNvbnN0IHN3aXRjaFByb3BlcnR5ID0gKFxuICAgICAgbm9kZTogUHJvcGVydHlOYW1lZE5vZGUsXG4gICAgICBpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucyxcbiAgICAgIGhhbmRsZVN0cmluZzogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZCxcbiAgICAgIGhhbmRsZVN5bWJvbDogKG9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4gdm9pZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5hbWVOb2RlID0gdHNVdGlscy5ub2RlLmdldE5hbWVOb2RlKG5vZGUpO1xuICAgICAgaWYgKHRzLmlzQ29tcHV0ZWRQcm9wZXJ0eU5hbWUobmFtZU5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihuYW1lTm9kZSk7XG4gICAgICAgIGNvbnN0IHRocm93VHlwZUVycm9yID0gKGlubmVySW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAvLyBbXVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgLy8gW11cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJJbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NTdHJpbmcgPSAoaW5uZXJJbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgICAgIC8vIFtzdHJpbmddXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lcklubmVyT3B0aW9ucywgc2IuaGVscGVycy51bndyYXBTdHJpbmcpO1xuICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgaGFuZGxlU3RyaW5nKGlubmVySW5uZXJPcHRpb25zKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwcm9jZXNzU3ltYm9sID0gKGlubmVySW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAvLyBbc3RyaW5nLCB2YWxdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lcklubmVyT3B0aW9ucywgc2IuaGVscGVycy51bndyYXBTeW1ib2wpO1xuICAgICAgICAgIC8vIFt2YWwsIHN0cmluZywgdmFsXVxuICAgICAgICAgIGhhbmRsZVN5bWJvbChpbm5lcklubmVyT3B0aW9ucyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2IudmlzaXQoZXhwciwgc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpKTtcblxuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIGV4cHIsXG4gICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuZm9yQnVpbHRpblR5cGUoe1xuICAgICAgICAgICAgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGV4cHIpLFxuICAgICAgICAgICAgYXJyYXk6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgYXJyYXlTdG9yYWdlOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGJvb2xlYW46IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgYnVmZmVyOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIG51bGw6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgbnVtYmVyOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIG9iamVjdDogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICBzdHJpbmc6IHByb2Nlc3NTdHJpbmcsXG4gICAgICAgICAgICBzeW1ib2w6IHByb2Nlc3NTeW1ib2wsXG4gICAgICAgICAgICB1bmRlZmluZWQ6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgbWFwOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIG1hcFN0b3JhZ2U6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgc2V0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIHNldFN0b3JhZ2U6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgZXJyb3I6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgZm9yd2FyZFZhbHVlOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGl0ZXJhdG9yUmVzdWx0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGl0ZXJhYmxlOiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGl0ZXJhYmxlSXRlcmF0b3I6IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb246IHRocm93VHlwZUVycm9yLFxuICAgICAgICAgICAgb3V0cHV0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGF0dHJpYnV0ZTogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICBpbnB1dDogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICBhY2NvdW50OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGFzc2V0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGNvbnRyYWN0OiB0aHJvd1R5cGVFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcjogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgICBibG9jazogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBbc3RyaW5nLCB2YWxdXG4gICAgICAgIHNiLmVtaXRQdXNoU3RyaW5nKG5vZGUsIHRzVXRpbHMubm9kZS5nZXROYW1lKG5vZGUpKTtcbiAgICAgICAgLy8gW3ZhbCwgc3RyaW5nLCB2YWxdXG4gICAgICAgIGhhbmRsZVN0cmluZyhpbm5lck9wdGlvbnMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhZGRQcm9wZXJ0eSA9IChwcm9wZXJ0eTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiwgaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyID0gdHNVdGlscy5pbml0aWFsaXplci5nZXRJbml0aWFsaXplcihwcm9wZXJ0eSk7XG4gICAgICBjb25zdCBwcm9wTm9kZSA9IGluaXRpYWxpemVyID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0eSA6IGluaXRpYWxpemVyO1xuICAgICAgLy8gW3RoaXNPYmplY3RWYWwsIHRoaXNPYmplY3RWYWxdXG4gICAgICBzYi5lbWl0T3AocHJvcE5vZGUsICdEVVAnKTtcbiAgICAgIC8vIFt0aGlzT2JqZWN0VmFsXVxuICAgICAgc3dpdGNoUHJvcGVydHkoXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgIChpbm5lcklubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIGlmIChpbml0aWFsaXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3BOb2RlLCBzYi5wdXNoVmFsdWVPcHRpb25zKGlubmVySW5uZXJPcHRpb25zKSwgc2IuaGVscGVycy53cmFwVW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2IudmlzaXQoaW5pdGlhbGl6ZXIsIHNiLnB1c2hWYWx1ZU9wdGlvbnMoaW5uZXJJbm5lck9wdGlvbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihwcm9wTm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnNldERhdGFQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgfSxcbiAgICAgICAgKGlubmVySW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgaWYgKGluaXRpYWxpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIocHJvcE5vZGUsIHNiLnB1c2hWYWx1ZU9wdGlvbnMoaW5uZXJJbm5lck9wdGlvbnMpLCBzYi5oZWxwZXJzLndyYXBVbmRlZmluZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzYi52aXNpdChpbml0aWFsaXplciwgc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lcklubmVyT3B0aW9ucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3BOb2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuc2V0RGF0YVN5bWJvbE9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICAgIC8vIFtmYXJyXVxuICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICBkZWNsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHNiLmhlbHBlcnMuY3JlYXRlQ29uc3RydWN0QXJyYXkoe1xuICAgICAgICB3aXRoU2NvcGU6IHRydWUsXG4gICAgICAgIGJvZHk6IChpbm5lck9wdGlvbnNJbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlubmVyT3B0aW9ucyA9IHNiLnB1c2hWYWx1ZU9wdGlvbnMoaW5uZXJPcHRpb25zSW4pO1xuICAgICAgICAgIC8vIFthcmdzYXJyXVxuICAgICAgICAgIGNvbnN0IGN0b3JJbXBsID0gdHNVdGlscy5jbGFzc18uZ2V0Q29uY3JldGVDb25zdHJ1Y3RvcihkZWNsKTtcbiAgICAgICAgICBjb25zdCBjdG9yTm9kZSA9IGN0b3JJbXBsID09PSB1bmRlZmluZWQgPyBkZWNsIDogY3RvckltcGw7XG4gICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBhc3NpZ25tZW50c1xuICAgICAgICAgIGlmIChjdG9ySW1wbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgY3RvckltcGwsXG4gICAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgc2IuaGVscGVycy5wYXJhbWV0ZXJzKHsgcGFyYW1zOiB0c1V0aWxzLnBhcmFtZXRlcmVkLmdldFBhcmFtZXRlcnMoY3RvckltcGwpIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFN1cGVyIGNhbGwgc3RhdGVtZW50XG4gICAgICAgICAgfSBlbHNlIGlmIChzdXBlckNsYXNzICE9PSB1bmRlZmluZWQgJiYgZXh0ZW5kc0V4cHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gW3RoaXNPYmplY3RWYWwsIGFyZ3NhcnJdXG4gICAgICAgICAgICBzYi5zY29wZS5nZXRUaGlzKHNiLCBleHRlbmRzRXhwciwgaW5uZXJPcHRpb25zKTtcbiAgICAgICAgICAgIC8vIFtjdG9yLCB0aGlzT2JqZWN0VmFsLCBhcmdzYXJyXVxuICAgICAgICAgICAgc2Iuc2NvcGUuZ2V0KHNiLCBleHRlbmRzRXhwciwgaW5uZXJPcHRpb25zLCBzdXBlckNsYXNzKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKGV4dGVuZHNFeHByLCBzYi5ub1B1c2hWYWx1ZU9wdGlvbnMoaW5uZXJPcHRpb25zKSwgc2IuaGVscGVycy5pbnZva2VDb25zdHJ1Y3QoKSk7XG4gICAgICAgICAgICAvLyBEcm9wIHRoZSBhcmdzYXJyYXksIHdlIG11c3Qgbm90IHVzZSBpdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgc2IuZW1pdE9wKGRlY2wsICdEUk9QJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFBhcmFtZXRlciBwcm9wZXJ0eSBhc3NpZ25tZW50c1xuICAgICAgICAgIC8vIE1lbWJlciB2YXJpYWJsZSBhc3NpZ25tZW50c1xuICAgICAgICAgIC8vIFt0aGlzT2JqZWN0VmFsXVxuICAgICAgICAgIHNiLnNjb3BlLmdldFRoaXMoc2IsIGN0b3JOb2RlLCBpbm5lck9wdGlvbnMpO1xuICAgICAgICAgIHRzVXRpbHMuY2xhc3NfXG4gICAgICAgICAgICAuZ2V0Q29uY3JldGVJbnN0YW5jZVByb3BlcnRpZXMoZGVjbClcbiAgICAgICAgICAgIC5maWx0ZXIodHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKVxuICAgICAgICAgICAgLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgICAgICAgIGFkZFByb3BlcnR5KHByb3BlcnR5LCBpbm5lck9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gW11cbiAgICAgICAgICBzYi5lbWl0T3AoY3Rvck5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgLy8gQ29uc3RydWN0b3Igc3RhdGVtZW50c1xuICAgICAgICAgIGlmIChjdG9ySW1wbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzYi52aXNpdCh0c1V0aWxzLmJvZHkuZ2V0Qm9keU9yVGhyb3coY3RvckltcGwpLCBzYi5ub1B1c2hWYWx1ZU9wdGlvbnMoaW5uZXJPcHRpb25zKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFtmb2JqZWN0VmFsXVxuICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICBkZWNsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHNiLmhlbHBlcnMuY3JlYXRlRnVuY3Rpb25PYmplY3Qoe1xuICAgICAgICBwcm9wZXJ0eTogSW50ZXJuYWxPYmplY3RQcm9wZXJ0eS5Db25zdHJ1Y3QsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHByb3RvdHlwZVxuICAgIC8vIFtmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgIHNiLmVtaXRPcChkZWNsLCAnRFVQJyk7XG4gICAgLy8gWydwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgIHNiLmVtaXRQdXNoU3RyaW5nKGRlY2wsICdwcm90b3R5cGUnKTtcbiAgICAvLyBbZm9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgc2IuZW1pdE9wKGRlY2wsICdPVkVSJyk7XG4gICAgLy8gW29iamVjdFZhbCwgZm9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgc2IuZW1pdEhlbHBlcihkZWNsLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNyZWF0ZU9iamVjdCk7XG4gICAgLy8gW29iamVjdFZhbCwgZm9iamVjdFZhbCwgb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICBzYi5lbWl0T3AoZGVjbCwgJ1RVQ0snKTtcbiAgICAvLyBbJ2NvbnN0cnVjdG9yJywgb2JqZWN0VmFsLCBmb2JqZWN0VmFsLCBvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgIHNiLmVtaXRQdXNoU3RyaW5nKGRlY2wsICdjb25zdHJ1Y3RvcicpO1xuICAgIC8vIFtmb2JqZWN0VmFsLCAnY29uc3RydWN0b3InLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgc2IuZW1pdE9wKGRlY2wsICdST1QnKTtcbiAgICAvLyBbb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICBzYi5lbWl0SGVscGVyKGRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMuc2V0RGF0YVByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuXG4gICAgY29uc3QgYWRkTWV0aG9kID0gKG1ldGhvZDogdHMuTWV0aG9kRGVjbGFyYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHZpc2l0ID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgIC8vIFtmYXJyXVxuICAgICAgICBzYi5lbWl0SGVscGVyKG1ldGhvZCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmNyZWF0ZUNhbGxBcnJheSk7XG4gICAgICAgIC8vIFttZXRob2RPYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICBzYi5oZWxwZXJzLmNyZWF0ZUZ1bmN0aW9uT2JqZWN0KHtcbiAgICAgICAgICAgIHByb3BlcnR5OiBJbnRlcm5hbE9iamVjdFByb3BlcnR5LkNhbGwsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgLy8gW29iamVjdFZhbCwgb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICAgIHNiLmVtaXRPcChtZXRob2QsICdEVVAnKTtcbiAgICAgIC8vIFtuYW1lLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG5cbiAgICAgIC8vIFtvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgICAgc3dpdGNoUHJvcGVydHkoXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIHZpc2l0KGlubmVyT3B0aW9ucyk7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihtZXRob2QsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5zZXREYXRhUHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICB2aXNpdChpbm5lck9wdGlvbnMpO1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobWV0aG9kLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuc2V0RGF0YVN5bWJvbE9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHRzVXRpbHMuY2xhc3NfLmdldENvbmNyZXRlSW5zdGFuY2VNZXRob2RzKGRlY2wpLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgYWRkTWV0aG9kKG1ldGhvZCk7XG4gICAgfSk7XG5cbiAgICB0c1V0aWxzLmNsYXNzXy5nZXRDb25jcmV0ZU1lbWJlcnMoZGVjbCkuZm9yRWFjaCgobWVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gdHNVdGlscy5kZWNvcmF0YWJsZS5nZXREZWNvcmF0b3JzQXJyYXkobWVtYmVyKTtcbiAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2IuY29udGV4dC5yZXBvcnRFcnJvcihkZWNvcmF0b3JzWzBdLCBEaWFnbm9zdGljQ29kZS5VbnN1cHBvcnRlZFN5bnRheCwgRGlhZ25vc3RpY01lc3NhZ2UuVW5zdXBwb3J0ZWREZWNvcmF0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWRkU2V0QWNjZXNzb3IgPSAoYWNjZXNzb3I6IHRzLlNldEFjY2Vzc29yRGVjbGFyYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHZpc2l0ID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgIC8vIFtmYXJyLCBuYW1lLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoYWNjZXNzb3IsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5jcmVhdGVDYWxsQXJyYXkpO1xuICAgICAgICAvLyBbbWV0aG9kT2JqZWN0VmFsLCBuYW1lLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuY3JlYXRlRnVuY3Rpb25PYmplY3Qoe1xuICAgICAgICAgICAgcHJvcGVydHk6IEludGVybmFsT2JqZWN0UHJvcGVydHkuQ2FsbCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZ2V0QWNjZXNzb3IgPSB0c1V0aWxzLmFjY2Vzc29yLmdldEdldEFjY2Vzc29yKGFjY2Vzc29yKTtcbiAgICAgICAgY29uc3QgaGFzR2V0ID0gZ2V0QWNjZXNzb3IgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGdldEFjY2Vzc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKGdldEFjY2Vzc29yLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuY3JlYXRlQ2FsbEFycmF5KTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgZ2V0QWNjZXNzb3IsXG4gICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmNyZWF0ZUZ1bmN0aW9uT2JqZWN0KHtcbiAgICAgICAgICAgICAgcHJvcGVydHk6IEludGVybmFsT2JqZWN0UHJvcGVydHkuQ2FsbCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzR2V0O1xuICAgICAgfTtcbiAgICAgIC8vIFtvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgICBzYi5lbWl0T3AoYWNjZXNzb3IsICdEVVAnKTtcbiAgICAgIC8vIFtvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgICAgc3dpdGNoUHJvcGVydHkoXG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzR2V0ID0gdmlzaXQoaW5uZXJPcHRpb25zKTtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5zZXRBY2Nlc3NvclByb3BlcnR5T2JqZWN0UHJvcGVydHkoe1xuICAgICAgICAgICAgICBoYXNTZXQ6IHRydWUsXG4gICAgICAgICAgICAgIGhhc0dldCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNHZXQgPSB2aXNpdChpbm5lck9wdGlvbnMpO1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICBhY2Nlc3NvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLnNldEFjY2Vzc29yU3ltYm9sT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICAgICAgICBoYXNTZXQ6IHRydWUsXG4gICAgICAgICAgICAgIGhhc0dldCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG5cbiAgICB0c1V0aWxzLmNsYXNzX1xuICAgICAgLmdldENvbmNyZXRlSW5zdGFuY2VNZW1iZXJzKGRlY2wpXG4gICAgICAuZmlsdGVyKHRzLmlzU2V0QWNjZXNzb3IpXG4gICAgICAuZm9yRWFjaCgoYWNjZXNzb3IpID0+IHtcbiAgICAgICAgYWRkU2V0QWNjZXNzb3IoYWNjZXNzb3IpO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBhZGRHZXRBY2Nlc3NvciA9IChhY2Nlc3NvcjogdHMuR2V0QWNjZXNzb3JEZWNsYXJhdGlvbikgPT4ge1xuICAgICAgY29uc3QgdmlzaXQgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgICAgLy8gW2ZhcnIsIG5hbWUsIG9iamVjdFZhbCwgb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihhY2Nlc3NvciwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmNyZWF0ZUNhbGxBcnJheSk7XG4gICAgICAgIC8vIFttZXRob2RPYmplY3RWYWwsIG5hbWUsIG9iamVjdFZhbCwgb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBhY2Nlc3NvcixcbiAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgc2IuaGVscGVycy5jcmVhdGVGdW5jdGlvbk9iamVjdCh7XG4gICAgICAgICAgICBwcm9wZXJ0eTogSW50ZXJuYWxPYmplY3RQcm9wZXJ0eS5DYWxsLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIC8vIFtvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgICBzYi5lbWl0T3AoYWNjZXNzb3IsICdEVVAnKTtcbiAgICAgIC8vIFtvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgICAgc3dpdGNoUHJvcGVydHkoXG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgdmlzaXQoaW5uZXJPcHRpb25zKTtcbiAgICAgICAgICAvLyBbb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5zZXRBY2Nlc3NvclByb3BlcnR5T2JqZWN0UHJvcGVydHkoe1xuICAgICAgICAgICAgICBoYXNTZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICBoYXNHZXQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgdmlzaXQoaW5uZXJPcHRpb25zKTtcbiAgICAgICAgICAvLyBbb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5zZXRBY2Nlc3NvclN5bWJvbE9iamVjdFByb3BlcnR5KHtcbiAgICAgICAgICAgICAgaGFzU2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgaGFzR2V0OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHRzVXRpbHMuY2xhc3NfXG4gICAgICAuZ2V0Q29uY3JldGVJbnN0YW5jZU1lbWJlcnMoZGVjbClcbiAgICAgIC5maWx0ZXIodHMuaXNHZXRBY2Nlc3NvcilcbiAgICAgIC5maWx0ZXIoKGFjY2Vzc29yKSA9PiB0c1V0aWxzLmFjY2Vzc29yLmdldFNldEFjY2Vzc29yKGFjY2Vzc29yKSA9PT0gdW5kZWZpbmVkKVxuICAgICAgLmZvckVhY2goKGFjY2Vzc29yKSA9PiB7XG4gICAgICAgIGFkZEdldEFjY2Vzc29yKGFjY2Vzc29yKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2V0IHN1cGVyY2xhc3MgcHJvdG90eXBlXG4gICAgaWYgKHN1cGVyQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiBleHRlbmRzRXhwciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBbb2JqZWN0VmFsLCBvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgICAgc2IuZW1pdE9wKGV4dGVuZHNFeHByLCAnRFVQJyk7XG4gICAgICAvLyBbJ19fcHJvdG9fXycsIG9iamVjdFZhbCwgb2JqZWN0VmFsLCAncHJvdG90eXBlJywgZm9iamVjdFZhbCwgZm9iamVjdFZhbF1cbiAgICAgIHNiLmVtaXRQdXNoU3RyaW5nKGV4dGVuZHNFeHByLCAnX19wcm90b19fJyk7XG4gICAgICAvLyBbc3VwZXJvYmplY3RWYWwsICdfX3Byb3RvX18nLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgICBzYi5zY29wZS5nZXQoc2IsIGV4dGVuZHNFeHByLCBvcHRpb25zLCBzdXBlckNsYXNzKTtcbiAgICAgIC8vIFsncHJvdG90eXBlJywgc3VwZXJvYmplY3RWYWwsICdfX3Byb3RvX18nLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgJ3Byb3RvdHlwZScsIGZvYmplY3RWYWwsIGZvYmplY3RWYWxdXG4gICAgICBzYi5lbWl0UHVzaFN0cmluZyhleHRlbmRzRXhwciwgJ3Byb3RvdHlwZScpO1xuICAgICAgLy8gW3N1cGVycHJvdG90eXBlLCAncHJvdG90eXBlJywgb2JqZWN0VmFsLCBvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgICAgc2IuZW1pdEhlbHBlcihleHRlbmRzRXhwciwgb3B0aW9ucywgc2IuaGVscGVycy5nZXRQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcbiAgICAgIC8vIFtvYmplY3RWYWwsICdwcm90b3R5cGUnLCBmb2JqZWN0VmFsLCBmb2JqZWN0VmFsXVxuICAgICAgc2IuZW1pdEhlbHBlcihleHRlbmRzRXhwciwgb3B0aW9ucywgc2IuaGVscGVycy5zZXREYXRhUHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgLy8gW2ZvYmplY3RWYWxdXG4gICAgc2IuZW1pdEhlbHBlcihkZWNsLCBvcHRpb25zLCBzYi5oZWxwZXJzLnNldERhdGFQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcblxuICAgIHRzVXRpbHMuY2xhc3NfXG4gICAgICAuZ2V0Q29uY3JldGVTdGF0aWNQcm9wZXJ0aW