@glimmer/compiler
Version:
175 lines (142 loc) • 17.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.convertPathToCallIfKeyword = convertPathToCallIfKeyword;
exports.VISIT_EXPRS = exports.NormalizeExpressions = void 0;
var _syntax = require("@glimmer/syntax");
var _util = require("@glimmer/util");
var _result = require("../../../shared/result");
var mir = _interopRequireWildcard(require("../../2-encoding/mir"));
var _keywords = require("../keywords");
var _isNode = require("../utils/is-node");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
class NormalizeExpressions {
visit(node, state) {
switch (node.type) {
case 'Literal':
return (0, _result.Ok)(this.Literal(node));
case 'Interpolate':
return this.Interpolate(node, state);
case 'Path':
return this.PathExpression(node);
case 'Call':
let translated = _keywords.CALL_KEYWORDS.translate(node, state);
if (translated !== null) {
return translated;
}
return this.CallExpression(node, state);
case 'DeprecatedCall':
return this.DeprecaedCallExpression(node, state);
}
}
visitList(nodes, state) {
return new _result.ResultArray(nodes.map(e => VISIT_EXPRS.visit(e, state))).toOptionalList();
}
/**
* Normalize paths into `hir.Path` or a `hir.Expr` that corresponds to the ref.
*
* TODO since keywords don't support tails anyway, distinguish PathExpression from
* VariableReference in ASTv2.
*/
PathExpression(path) {
let ref = this.VariableReference(path.ref);
let {
tail
} = path;
if ((0, _util.isPresent)(tail)) {
let tailLoc = tail[0].loc.extend(tail[tail.length - 1].loc);
return (0, _result.Ok)(new mir.PathExpression({
loc: path.loc,
head: ref,
tail: new mir.Tail({
loc: tailLoc,
members: tail
})
}));
} else {
return (0, _result.Ok)(ref);
}
}
VariableReference(ref) {
return ref;
}
Literal(literal) {
return literal;
}
Interpolate(expr, state) {
let parts = expr.parts.map(convertPathToCallIfKeyword);
return VISIT_EXPRS.visitList(parts, state).mapOk(parts => new mir.InterpolateExpression({
loc: expr.loc,
parts: parts
}));
}
CallExpression(expr, state) {
if (!(0, _isNode.hasPath)(expr)) {
throw new Error(`unimplemented subexpression at the head of a subexpression`);
} else {
return _result.Result.all(VISIT_EXPRS.visit(expr.callee, state), VISIT_EXPRS.Args(expr.args, state)).mapOk(([callee, args]) => new mir.CallExpression({
loc: expr.loc,
callee,
args
}));
}
}
DeprecaedCallExpression({
arg,
callee,
loc
}, _state) {
return (0, _result.Ok)(new mir.DeprecatedCallExpression({
loc,
arg,
callee
}));
}
Args({
positional,
named,
loc
}, state) {
return _result.Result.all(this.Positional(positional, state), this.NamedArguments(named, state)).mapOk(([positional, named]) => new mir.Args({
loc,
positional,
named
}));
}
Positional(positional, state) {
return VISIT_EXPRS.visitList(positional.exprs, state).mapOk(list => new mir.Positional({
loc: positional.loc,
list
}));
}
NamedArguments(named, state) {
let pairs = named.entries.map(arg => {
let value = convertPathToCallIfKeyword(arg.value);
return VISIT_EXPRS.visit(value, state).mapOk(value => new mir.NamedArgument({
loc: arg.loc,
key: arg.name,
value
}));
});
return new _result.ResultArray(pairs).toOptionalList().mapOk(pairs => new mir.NamedArguments({
loc: named.loc,
entries: pairs
}));
}
}
exports.NormalizeExpressions = NormalizeExpressions;
function convertPathToCallIfKeyword(path) {
if (path.type === 'Path' && path.ref.type === 'Free' && path.ref.name in _syntax.KEYWORDS_TYPES) {
return new _syntax.ASTv2.CallExpression({
callee: path,
args: _syntax.ASTv2.Args.empty(path.loc),
loc: path.loc
});
}
return path;
}
const VISIT_EXPRS = new NormalizeExpressions();
exports.VISIT_EXPRS = VISIT_EXPRS;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3Zpc2l0b3JzL2V4cHJlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7OztBQUVNLE1BQUEsb0JBQUEsQ0FBMkI7QUFDL0IsRUFBQSxLQUFLLENBQUEsSUFBQSxFQUFBLEtBQUEsRUFBc0Q7QUFDekQsWUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFdBQUEsU0FBQTtBQUNFLGVBQU8sZ0JBQUcsS0FBQSxPQUFBLENBQVYsSUFBVSxDQUFILENBQVA7O0FBQ0YsV0FBQSxhQUFBO0FBQ0UsZUFBTyxLQUFBLFdBQUEsQ0FBQSxJQUFBLEVBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsTUFBQTtBQUNFLGVBQU8sS0FBQSxjQUFBLENBQVAsSUFBTyxDQUFQOztBQUNGLFdBQUEsTUFBQTtBQUNFLFlBQUksVUFBVSxHQUFHLHdCQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQWpCLEtBQWlCLENBQWpCOztBQUVBLFlBQUksVUFBVSxLQUFkLElBQUEsRUFBeUI7QUFDdkIsaUJBQUEsVUFBQTtBQUNEOztBQUVELGVBQU8sS0FBQSxjQUFBLENBQUEsSUFBQSxFQUFQLEtBQU8sQ0FBUDs7QUFDRixXQUFBLGdCQUFBO0FBQ0UsZUFBTyxLQUFBLHVCQUFBLENBQUEsSUFBQSxFQUFQLEtBQU8sQ0FBUDtBQWhCSjtBQWtCRDs7QUFVRCxFQUFBLFNBQVMsQ0FBQSxLQUFBLEVBQUEsS0FBQSxFQUVrQjtBQUV6QixXQUFPLElBQUEsbUJBQUEsQ0FBZ0IsS0FBSyxDQUFMLEdBQUEsQ0FBVyxDQUFELElBQU8sV0FBVyxDQUFYLEtBQUEsQ0FBQSxDQUFBLEVBQWpDLEtBQWlDLENBQWpCLENBQWhCLEVBQVAsY0FBTyxFQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQSxFQUFB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QTJKM0IsU0FBQSwwQkFBQSxDQUFBLElBQUEsRUFBK0Q7QUFDbkUsTUFBSSxJQUFJLENBQUosSUFBQSxLQUFBLE1BQUEsSUFBd0IsSUFBSSxDQUFKLEdBQUEsQ0FBQSxJQUFBLEtBQXhCLE1BQUEsSUFBb0QsSUFBSSxDQUFKLEdBQUEsQ0FBQSxJQUFBLElBQXhELHNCQUFBLEVBQXlGO0FBQ3ZGLFdBQU8sSUFBSSxjQUFKLGNBQUEsQ0FBeUI7QUFDOUIsTUFBQSxNQUFNLEVBRHdCLElBQUE7QUFFOUIsTUFBQSxJQUFJLEVBQUUsY0FBQSxJQUFBLENBQUEsS0FBQSxDQUFpQixJQUFJLENBRkcsR0FFeEIsQ0FGd0I7QUFHOUIsTUFBQSxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBSG9CLEtBQXpCLENBQVA7QUFLRDs7QUFFRCxTQUFBLElBQUE7QUFDRDs7QUFFTSxNQUFNLFdBQVcsR0FBRyxJQUFwQixvQkFBb0IsRUFBcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFTVHYyLCBLRVlXT1JEU19UWVBFUyB9IGZyb20gJ0BnbGltbWVyL3N5bnRheCc7XG5pbXBvcnQgeyBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgQW55T3B0aW9uYWxMaXN0LCBQcmVzZW50TGlzdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9saXN0JztcbmltcG9ydCB7IE9rLCBSZXN1bHQsIFJlc3VsdEFycmF5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3Jlc3VsdCc7XG5pbXBvcnQgKiBhcyBtaXIgZnJvbSAnLi4vLi4vMi1lbmNvZGluZy9taXInO1xuaW1wb3J0IHsgTm9ybWFsaXphdGlvblN0YXRlIH0gZnJvbSAnLi4vY29udGV4dCc7XG5pbXBvcnQgeyBDQUxMX0tFWVdPUkRTIH0gZnJvbSAnLi4va2V5d29yZHMnO1xuaW1wb3J0IHsgaGFzUGF0aCB9IGZyb20gJy4uL3V0aWxzL2lzLW5vZGUnO1xuXG5leHBvcnQgY2xhc3MgTm9ybWFsaXplRXhwcmVzc2lvbnMge1xuICB2aXNpdChub2RlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSwgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuRXhwcmVzc2lvbk5vZGU+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnTGl0ZXJhbCc6XG4gICAgICAgIHJldHVybiBPayh0aGlzLkxpdGVyYWwobm9kZSkpO1xuICAgICAgY2FzZSAnSW50ZXJwb2xhdGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5JbnRlcnBvbGF0ZShub2RlLCBzdGF0ZSk7XG4gICAgICBjYXNlICdQYXRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuUGF0aEV4cHJlc3Npb24obm9kZSk7XG4gICAgICBjYXNlICdDYWxsJzpcbiAgICAgICAgbGV0IHRyYW5zbGF0ZWQgPSBDQUxMX0tFWVdPUkRTLnRyYW5zbGF0ZShub2RlLCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRyYW5zbGF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLkNhbGxFeHByZXNzaW9uKG5vZGUsIHN0YXRlKTtcbiAgICAgIGNhc2UgJ0RlcHJlY2F0ZWRDYWxsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRGVwcmVjYWVkQ2FsbEV4cHJlc3Npb24obm9kZSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0TGlzdChcbiAgICBub2RlczogUHJlc2VudEFycmF5PEFTVHYyLkV4cHJlc3Npb25Ob2RlPixcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxQcmVzZW50TGlzdDxtaXIuRXhwcmVzc2lvbk5vZGU+PjtcbiAgdmlzaXRMaXN0KFxuICAgIG5vZGVzOiByZWFkb25seSBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PEFueU9wdGlvbmFsTGlzdDxtaXIuRXhwcmVzc2lvbk5vZGU+PjtcbiAgdmlzaXRMaXN0KFxuICAgIG5vZGVzOiByZWFkb25seSBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PEFueU9wdGlvbmFsTGlzdDxtaXIuRXhwcmVzc2lvbk5vZGU+PiB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHRBcnJheShub2Rlcy5tYXAoKGUpID0+IFZJU0lUX0VYUFJTLnZpc2l0KGUsIHN0YXRlKSkpLnRvT3B0aW9uYWxMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIHBhdGhzIGludG8gYGhpci5QYXRoYCBvciBhIGBoaXIuRXhwcmAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmVmLlxuICAgKlxuICAgKiBUT0RPIHNpbmNlIGtleXdvcmRzIGRvbid0IHN1cHBvcnQgdGFpbHMgYW55d2F5LCBkaXN0aW5ndWlzaCBQYXRoRXhwcmVzc2lvbiBmcm9tXG4gICAqIFZhcmlhYmxlUmVmZXJlbmNlIGluIEFTVHYyLlxuICAgKi9cbiAgUGF0aEV4cHJlc3Npb24ocGF0aDogQVNUdjIuUGF0aEV4cHJlc3Npb24pOiBSZXN1bHQ8bWlyLkV4cHJlc3Npb25Ob2RlPiB7XG4gICAgbGV0IHJlZiA9IHRoaXMuVmFyaWFibGVSZWZlcmVuY2UocGF0aC5yZWYpO1xuICAgIGxldCB7IHRhaWwgfSA9IHBhdGg7XG5cbiAgICBpZiAoaXNQcmVzZW50KHRhaWwpKSB7XG4gICAgICBsZXQgdGFpbExvYyA9IHRhaWxbMF0ubG9jLmV4dGVuZCh0YWlsW3RhaWwubGVuZ3RoIC0gMV0ubG9jKTtcbiAgICAgIHJldHVybiBPayhcbiAgICAgICAgbmV3IG1pci5QYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgbG9jOiBwYXRoLmxvYyxcbiAgICAgICAgICBoZWFkOiByZWYsXG4gICAgICAgICAgdGFpbDogbmV3IG1pci5UYWlsKHsgbG9jOiB0YWlsTG9jLCBtZW1iZXJzOiB0YWlsIH0pLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9rKHJlZik7XG4gICAgfVxuICB9XG5cbiAgVmFyaWFibGVSZWZlcmVuY2UocmVmOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSk6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgTGl0ZXJhbChsaXRlcmFsOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbik6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbGl0ZXJhbDtcbiAgfVxuXG4gIEludGVycG9sYXRlKFxuICAgIGV4cHI6IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvbixcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuSW50ZXJwb2xhdGVFeHByZXNzaW9uPiB7XG4gICAgbGV0IHBhcnRzID0gZXhwci5wYXJ0cy5tYXAoY29udmVydFBhdGhUb0NhbGxJZktleXdvcmQpIGFzIFByZXNlbnRBcnJheTxBU1R2Mi5FeHByZXNzaW9uTm9kZT47XG5cbiAgICByZXR1cm4gVklTSVRfRVhQUlMudmlzaXRMaXN0KHBhcnRzLCBzdGF0ZSkubWFwT2soXG4gICAgICAocGFydHMpID0+IG5ldyBtaXIuSW50ZXJwb2xhdGVFeHByZXNzaW9uKHsgbG9jOiBleHByLmxvYywgcGFydHM6IHBhcnRzIH0pXG4gICAgKTtcbiAgfVxuXG4gIENhbGxFeHByZXNzaW9uKFxuICAgIGV4cHI6IEFTVHYyLkNhbGxFeHByZXNzaW9uLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PG1pci5FeHByZXNzaW9uTm9kZT4ge1xuICAgIGlmICghaGFzUGF0aChleHByKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmltcGxlbWVudGVkIHN1YmV4cHJlc3Npb24gYXQgdGhlIGhlYWQgb2YgYSBzdWJleHByZXNzaW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKFxuICAgICAgICBWSVNJVF9FWFBSUy52aXNpdChleHByLmNhbGxlZSwgc3RhdGUpLFxuICAgICAgICBWSVNJVF9FWFBSUy5BcmdzKGV4cHIuYXJncywgc3RhdGUpXG4gICAgICApLm1hcE9rKFxuICAgICAgICAoW2NhbGxlZSwgYXJnc10pID0+XG4gICAgICAgICAgbmV3IG1pci5DYWxsRXhwcmVzc2lvbih7XG4gICAgICAgICAgICBsb2M6IGV4cHIubG9jLFxuICAgICAgICAgICAgY2FsbGVlLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBEZXByZWNhZWRDYWxsRXhwcmVzc2lvbihcbiAgICB7IGFyZywgY2FsbGVlLCBsb2MgfTogQVNUdjIuRGVwcmVjYXRlZENhbGxFeHByZXNzaW9uLFxuICAgIF9zdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuRXhwcmVzc2lvbk5vZGU+IHtcbiAgICByZXR1cm4gT2sobmV3IG1pci5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24oeyBsb2MsIGFyZywgY2FsbGVlIH0pKTtcbiAgfVxuXG4gIEFyZ3MoeyBwb3NpdGlvbmFsLCBuYW1lZCwgbG9jIH06IEFTVHYyLkFyZ3MsIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUpOiBSZXN1bHQ8bWlyLkFyZ3M+IHtcbiAgICByZXR1cm4gUmVzdWx0LmFsbCh0aGlzLlBvc2l0aW9uYWwocG9zaXRpb25hbCwgc3RhdGUpLCB0aGlzLk5hbWVkQXJndW1lbnRzKG5hbWVkLCBzdGF0ZSkpLm1hcE9rKFxuICAgICAgKFtwb3NpdGlvbmFsLCBuYW1lZF0pID0+XG4gICAgICAgIG5ldyBtaXIuQXJncyh7XG4gICAgICAgICAgbG9jLFxuICAgICAgICAgIHBvc2l0aW9uYWwsXG4gICAgICAgICAgbmFtZWQsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIFBvc2l0aW9uYWwoXG4gICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuUG9zaXRpb25hbD4ge1xuICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdExpc3QocG9zaXRpb25hbC5leHBycywgc3RhdGUpLm1hcE9rKFxuICAgICAgKGxpc3QpID0+XG4gICAgICAgIG5ldyBtaXIuUG9zaXRpb25hbCh7XG4gICAgICAgICAgbG9jOiBwb3NpdGlvbmFsLmxvYyxcbiAgICAgICAgICBsaXN0LFxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBOYW1lZEFyZ3VtZW50cyhcbiAgICBuYW1lZDogQVNUdjIuTmFtZWRBcmd1bWVudHMsXG4gICAgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZVxuICApOiBSZXN1bHQ8bWlyLk5hbWVkQXJndW1lbnRzPiB7XG4gICAgbGV0IHBhaXJzID0gbmFtZWQuZW50cmllcy5tYXAoKGFyZykgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gY29udmVydFBhdGhUb0NhbGxJZktleXdvcmQoYXJnLnZhbHVlKTtcblxuICAgICAgcmV0dXJuIFZJU0lUX0VYUFJTLnZpc2l0KHZhbHVlLCBzdGF0ZSkubWFwT2soXG4gICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICBuZXcgbWlyLk5hbWVkQXJndW1lbnQoe1xuICAgICAgICAgICAgbG9jOiBhcmcubG9jLFxuICAgICAgICAgICAga2V5OiBhcmcubmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBSZXN1bHRBcnJheShwYWlycylcbiAgICAgIC50b09wdGlvbmFsTGlzdCgpXG4gICAgICAubWFwT2soKHBhaXJzKSA9PiBuZXcgbWlyLk5hbWVkQXJndW1lbnRzKHsgbG9jOiBuYW1lZC5sb2MsIGVudHJpZXM6IHBhaXJzIH0pKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFBhdGhUb0NhbGxJZktleXdvcmQocGF0aDogQVNUdjIuRXhwcmVzc2lvbk5vZGUpOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB7XG4gIGlmIChwYXRoLnR5cGUgPT09ICdQYXRoJyAmJiBwYXRoLnJlZi50eXBlID09PSAnRnJlZScgJiYgcGF0aC5yZWYubmFtZSBpbiBLRVlXT1JEU19UWVBFUykge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQ2FsbEV4cHJlc3Npb24oe1xuICAgICAgY2FsbGVlOiBwYXRoLFxuICAgICAgYXJnczogQVNUdjIuQXJncy5lbXB0eShwYXRoLmxvYyksXG4gICAgICBsb2M6IHBhdGgubG9jLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNJVF9FWFBSUyA9IG5ldyBOb3JtYWxpemVFeHByZXNzaW9ucygpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==