UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

152 lines (116 loc) 14.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderSync = renderSync; exports.renderMain = renderMain; exports.renderComponent = renderComponent; var _reference = require("@glimmer/reference"); var _util = require("@glimmer/util"); var _symbols = require("./symbols"); var _append = _interopRequireDefault(require("./vm/append")); var _scope = require("./scope"); var _environment = require("./environment"); var _env = require("@glimmer/env"); var _validator = require("@glimmer/validator"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var TemplateIteratorImpl = /*#__PURE__*/function () { function TemplateIteratorImpl(vm) { this.vm = vm; } var _proto = TemplateIteratorImpl.prototype; _proto.next = function next() { return this.vm.next(); }; _proto.sync = function sync() { var _this = this; if (_env.DEBUG) { return (0, _validator.runInTrackingTransaction)(function () { return _this.vm.execute(); }, '- While rendering:'); } else { return this.vm.execute(); } }; return TemplateIteratorImpl; }(); function renderSync(env, iterator) { var result; (0, _environment.inTransaction)(env, function () { return result = iterator.sync(); }); return result; } function renderMain(runtime, context, owner, self, treeBuilder, layout, dynamicScope) { if (dynamicScope === void 0) { dynamicScope = new _scope.DynamicScopeImpl(); } var handle = (0, _util.unwrapHandle)(layout.compile(context)); var numSymbols = layout.symbolTable.symbols.length; var vm = _append.default.initial(runtime, context, { self: self, dynamicScope: dynamicScope, treeBuilder: treeBuilder, handle: handle, numSymbols: numSymbols, owner: owner }); return new TemplateIteratorImpl(vm); } function renderInvocation(vm, context, owner, definition, args) { // Get a list of tuples of argument names and references, like // [['title', reference], ['name', reference]] var argList = Object.keys(args).map(function (key) { return [key, args[key]]; }); var blockNames = ['main', 'else', 'attrs']; // Prefix argument names with `@` symbol var argNames = argList.map(function (_ref) { var name = _ref[0]; return "@" + name; }); var reified = vm[_symbols.CONSTANTS].component(definition, owner); vm.pushFrame(); // Push blocks on to the stack, three stack values per block for (var i = 0; i < 3 * blockNames.length; i++) { vm.stack.push(null); } vm.stack.push(null); // For each argument, push its backing reference on to the stack argList.forEach(function (_ref2) { var reference = _ref2[1]; vm.stack.push(reference); }); // Configure VM based on blocks and args just pushed on to the stack. vm[_symbols.ARGS].setup(vm.stack, argNames, blockNames, 0, true); var compilable = reified.compilable; var layoutHandle = (0, _util.unwrapHandle)(compilable.compile(context)); var invocation = { handle: layoutHandle, symbolTable: compilable.symbolTable }; // Needed for the Op.Main opcode: arguments, component invocation object, and // component definition. vm.stack.push(vm[_symbols.ARGS]); vm.stack.push(invocation); vm.stack.push(reified); return new TemplateIteratorImpl(vm); } function renderComponent(runtime, treeBuilder, context, owner, definition, args, dynamicScope) { if (args === void 0) { args = {}; } if (dynamicScope === void 0) { dynamicScope = new _scope.DynamicScopeImpl(); } var vm = _append.default.empty(runtime, { treeBuilder: treeBuilder, handle: context.stdlib.main, dynamicScope: dynamicScope, owner: owner }, context); return renderInvocation(vm, context, owner, definition, recordToReference(args)); } function recordToReference(record) { var root = (0, _reference.createConstRef)(record, 'args'); return Object.keys(record).reduce(function (acc, key) { acc[key] = (0, _reference.childRefFor)(root, key); return acc; }, {}); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3JlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFhQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztJQUVBLG9CO0FBQ0UsV0FBQSxvQkFBQSxDQUFBLEVBQUEsRUFBa0M7QUFBZCxTQUFBLEVBQUEsR0FBQSxFQUFBO0FBQWtCOzs7O1NBQ3RDLEksR0FBQSxTQUFBLElBQUEsR0FBSTtBQUNGLFdBQU8sS0FBQSxFQUFBLENBQVAsSUFBTyxFQUFQOzs7U0FHRixJLEdBQUEsU0FBQSxJQUFBLEdBQUk7QUFBQSxRQUFBLEtBQUEsR0FBQSxJQUFBOztBQUNGLFFBQUEsVUFBQSxFQUFXO0FBQ1QsYUFBTyx5Q0FBMEIsWUFBQTtBQUFBLGVBQU0sS0FBQSxDQUFBLEVBQUEsQ0FBUCxPQUFPLEVBQU47QUFBRCxPQUF6QixFQUFQLG9CQUFPLENBQVA7QUFERixLQUFBLE1BRU87QUFDTCxhQUFPLEtBQUEsRUFBQSxDQUFQLE9BQU8sRUFBUDtBQUNEOzs7Ozs7QUFJQyxTQUFBLFVBQUEsQ0FBQSxHQUFBLEVBQUEsUUFBQSxFQUFpRTtBQUNyRSxNQUFBLE1BQUE7QUFFQSxrQ0FBYSxHQUFiLEVBQW1CLFlBQUE7QUFBQSxXQUFPLE1BQU0sR0FBRyxRQUFRLENBQTNDLElBQW1DLEVBQWhCO0FBQW5CLEdBQUE7QUFFQSxTQUFBLE1BQUE7QUFDRDs7QUFFSyxTQUFBLFVBQUEsQ0FBQSxPQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxJQUFBLEVBQUEsV0FBQSxFQUFBLE1BQUEsRUFBQSxZQUFBLEVBTytDO0FBQUEsTUFBbkQsWUFBbUQsS0FBQSxLQUFBLENBQUEsRUFBQTtBQUFuRCxJQUFBLFlBQW1ELEdBQXRCLElBUHpCLHVCQU95QixFQUE3QjtBQUFtRDs7QUFFbkQsTUFBSSxNQUFNLEdBQUcsd0JBQWEsTUFBTSxDQUFOLE9BQUEsQ0FBMUIsT0FBMEIsQ0FBYixDQUFiO0FBQ0EsTUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFOLFdBQUEsQ0FBQSxPQUFBLENBQWpCLE1BQUE7O0FBQ0EsTUFBSSxFQUFFLEdBQUcsZ0JBQUEsT0FBQSxDQUFBLE9BQUEsRUFBQSxPQUFBLEVBQTZCO0FBQ3BDLElBQUEsSUFEb0MsRUFBQSxJQUFBO0FBRXBDLElBQUEsWUFGb0MsRUFBQSxZQUFBO0FBR3BDLElBQUEsV0FIb0MsRUFBQSxXQUFBO0FBSXBDLElBQUEsTUFKb0MsRUFBQSxNQUFBO0FBS3BDLElBQUEsVUFMb0MsRUFBQSxVQUFBO0FBTXBDLElBQUEsS0FBQSxFQUFBO0FBTm9DLEdBQTdCLENBQVQ7O0FBUUEsU0FBTyxJQUFBLG9CQUFBLENBQVAsRUFBTyxDQUFQO0FBQ0Q7O0FBRUQsU0FBQSxnQkFBQSxDQUFBLEVBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLEVBS2lDO0FBRS9CO0FBQ0E7QUFDQSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQU4sSUFBQSxDQUFBLElBQUEsRUFBQSxHQUFBLENBQXVCLFVBQUQsR0FBQyxFQUFEO0FBQUEsV0FBUyxDQUFBLEdBQUEsRUFBTSxJQUFJLENBQXpELEdBQXlELENBQVYsQ0FBVDtBQUF0QyxHQUFnQixDQUFoQjtBQUVBLE1BQU0sVUFBVSxHQUFHLENBQUEsTUFBQSxFQUFBLE1BQUEsRUFOWSxPQU1aLENBQW5CLENBTitCLENBTy9COztBQUNBLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBUCxHQUFBLENBQVksVUFBQSxJQUFBLEVBQUE7QUFBQSxRQUFBLElBQUEsR0FBQSxJQUFBLENBQUEsQ0FBQSxDQUFBO0FBQUEsV0FBQSxNQUE3QixJQUE2QjtBQUE3QixHQUFpQixDQUFqQjs7QUFFQSxNQUFJLE9BQU8sR0FBRyxFQUFFLENBQUYsa0JBQUUsQ0FBRixDQUFBLFNBQUEsQ0FBQSxVQUFBLEVBQWQsS0FBYyxDQUFkOztBQUVBLEVBQUEsRUFBRSxDQVo2QixTQVkvQixHQVorQixDQWMvQjs7QUFDQSxPQUFLLElBQUksQ0FBQyxHQUFWLENBQUEsRUFBZ0IsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFsQyxNQUFBLEVBQTJDLENBQTNDLEVBQUEsRUFBZ0Q7QUFDOUMsSUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0Q7O0FBRUQsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FuQitCLElBbUIvQixFQW5CK0IsQ0FxQi9COztBQUNBLEVBQUEsT0FBTyxDQUFQLE9BQUEsQ0FBZ0IsVUFBQSxLQUFBLEVBQWtCO0FBQUEsUUFBbEIsU0FBa0IsR0FBQSxLQUFBLENBQUEsQ0FBQSxDQUFBO0FBQ2hDLElBQUEsRUFBRSxDQUFGLEtBQUEsQ0FBQSxJQUFBLENBQUEsU0FBQTtBQXZCNkIsR0FzQi9CLEVBdEIrQixDQTBCL0I7O0FBQ0EsRUFBQSxFQUFFLENBQUYsYUFBRSxDQUFGLENBQUEsS0FBQSxDQUFlLEVBQUUsQ0FBakIsS0FBQSxFQUFBLFFBQUEsRUFBQSxVQUFBLEVBQUEsQ0FBQSxFQUFBLElBQUE7O0FBRUEsTUFBTSxVQUFVLEdBQ2QsT0FBTyxDQURULFVBQUE7QUFJQSxNQUFNLFlBQVksR0FBRyx3QkFBYSxVQUFVLENBQVYsT0FBQSxDQUFsQyxPQUFrQyxDQUFiLENBQXJCO0FBQ0EsTUFBTSxVQUFVLEdBQUc7QUFBRSxJQUFBLE1BQU0sRUFBUixZQUFBO0FBQXdCLElBQUEsV0FBVyxFQUFFLFVBQVUsQ0FBQztBQUFoRCxHQUFuQixDQWxDK0IsQ0FvQy9CO0FBQ0E7O0FBQ0EsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBYyxFQUFFLENBQWhCLGFBQWdCLENBQWhCO0FBQ0EsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBQSxVQUFBO0FBQ0EsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBQSxPQUFBO0FBRUEsU0FBTyxJQUFBLG9CQUFBLENBQVAsRUFBTyxDQUFQO0FBQ0Q7O0FBRUssU0FBQSxlQUFBLENBQUEsT0FBQSxFQUFBLFdBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLEVBQUEsWUFBQSxFQU8rQztBQUFBLE1BRG5ELElBQ21ELEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFEbkQsSUFBQSxJQUNtRCxHQVAvQyxFQU1KO0FBQ21EOztBQUFBLE1BQW5ELFlBQW1ELEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFBbkQsSUFBQSxZQUFtRCxHQUF0QixJQVB6Qix1QkFPeUIsRUFBN0I7QUFBbUQ7O0FBRW5ELE1BQUksRUFBRSxHQUFHLGdCQUFBLEtBQUEsQ0FBQSxPQUFBLEVBRVA7QUFBRSxJQUFBLFdBQUYsRUFBQSxXQUFBO0FBQWUsSUFBQSxNQUFNLEVBQUUsT0FBTyxDQUFQLE1BQUEsQ0FBdkIsSUFBQTtBQUE0QyxJQUFBLFlBQTVDLEVBQUEsWUFBQTtBQUEwRCxJQUFBLEtBQUEsRUFBQTtBQUExRCxHQUZPLEVBQVQsT0FBUyxDQUFUOztBQUtBLFNBQU8sZ0JBQWdCLENBQUEsRUFBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLEVBQUEsVUFBQSxFQUFpQyxpQkFBaUIsQ0FBekUsSUFBeUUsQ0FBbEQsQ0FBdkI7QUFDRDs7QUFFRCxTQUFBLGlCQUFBLENBQUEsTUFBQSxFQUEwRDtBQUN4RCxNQUFNLElBQUksR0FBRywrQkFBYyxNQUFkLEVBQWIsTUFBYSxDQUFiO0FBRUEsU0FBTyxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxNQUFBLENBQTJCLFVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBYTtBQUM3QyxJQUFBLEdBQUcsQ0FBSCxHQUFHLENBQUgsR0FBVyw0QkFBVyxJQUFYLEVBQVgsR0FBVyxDQUFYO0FBQ0EsV0FBQSxHQUFBO0FBRkssR0FBQSxFQUFQLEVBQU8sQ0FBUDtBQUlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRHluYW1pY1Njb3BlLFxuICBFbnZpcm9ubWVudCxcbiAgUmVuZGVyUmVzdWx0LFxuICBSaWNoSXRlcmF0b3JSZXN1bHQsXG4gIFRlbXBsYXRlSXRlcmF0b3IsXG4gIFJ1bnRpbWVDb250ZXh0LFxuICBFbGVtZW50QnVpbGRlcixcbiAgQ29tcGlsYWJsZVByb2dyYW0sXG4gIENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICBDb21wb25lbnREZWZpbml0aW9uU3RhdGUsXG4gIE93bmVyLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoaWxkUmVmRm9yLCBjcmVhdGVDb25zdFJlZiwgUmVmZXJlbmNlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUkdTLCBDT05TVEFOVFMgfSBmcm9tICcuL3N5bWJvbHMnO1xuaW1wb3J0IFZNLCB7IEludGVybmFsVk0gfSBmcm9tICcuL3ZtL2FwcGVuZCc7XG5pbXBvcnQgeyBEeW5hbWljU2NvcGVJbXBsIH0gZnJvbSAnLi9zY29wZSc7XG5pbXBvcnQgeyBpblRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBydW5JblRyYWNraW5nVHJhbnNhY3Rpb24gfSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuXG5jbGFzcyBUZW1wbGF0ZUl0ZXJhdG9ySW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlSXRlcmF0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZtOiBJbnRlcm5hbFZNKSB7fVxuICBuZXh0KCk6IFJpY2hJdGVyYXRvclJlc3VsdDxudWxsLCBSZW5kZXJSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy52bS5uZXh0KCk7XG4gIH1cblxuICBzeW5jKCk6IFJlbmRlclJlc3VsdCB7XG4gICAgaWYgKERFQlVHKSB7XG4gICAgICByZXR1cm4gcnVuSW5UcmFja2luZ1RyYW5zYWN0aW9uISgoKSA9PiB0aGlzLnZtLmV4ZWN1dGUoKSwgJy0gV2hpbGUgcmVuZGVyaW5nOicpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy52bS5leGVjdXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTeW5jKGVudjogRW52aXJvbm1lbnQsIGl0ZXJhdG9yOiBUZW1wbGF0ZUl0ZXJhdG9yKTogUmVuZGVyUmVzdWx0IHtcbiAgbGV0IHJlc3VsdDogUmVuZGVyUmVzdWx0O1xuXG4gIGluVHJhbnNhY3Rpb24oZW52LCAoKSA9PiAocmVzdWx0ID0gaXRlcmF0b3Iuc3luYygpKSk7XG5cbiAgcmV0dXJuIHJlc3VsdCE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNYWluKFxuICBydW50aW1lOiBSdW50aW1lQ29udGV4dCxcbiAgY29udGV4dDogQ29tcGlsZVRpbWVDb21waWxhdGlvbkNvbnRleHQsXG4gIG93bmVyOiBPd25lcixcbiAgc2VsZjogUmVmZXJlbmNlLFxuICB0cmVlQnVpbGRlcjogRWxlbWVudEJ1aWxkZXIsXG4gIGxheW91dDogQ29tcGlsYWJsZVByb2dyYW0sXG4gIGR5bmFtaWNTY29wZTogRHluYW1pY1Njb3BlID0gbmV3IER5bmFtaWNTY29wZUltcGwoKVxuKTogVGVtcGxhdGVJdGVyYXRvciB7XG4gIGxldCBoYW5kbGUgPSB1bndyYXBIYW5kbGUobGF5b3V0LmNvbXBpbGUoY29udGV4dCkpO1xuICBsZXQgbnVtU3ltYm9scyA9IGxheW91dC5zeW1ib2xUYWJsZS5zeW1ib2xzLmxlbmd0aDtcbiAgbGV0IHZtID0gVk0uaW5pdGlhbChydW50aW1lLCBjb250ZXh0LCB7XG4gICAgc2VsZixcbiAgICBkeW5hbWljU2NvcGUsXG4gICAgdHJlZUJ1aWxkZXIsXG4gICAgaGFuZGxlLFxuICAgIG51bVN5bWJvbHMsXG4gICAgb3duZXIsXG4gIH0pO1xuICByZXR1cm4gbmV3IFRlbXBsYXRlSXRlcmF0b3JJbXBsKHZtKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW52b2NhdGlvbihcbiAgdm06IEludGVybmFsVk0sXG4gIGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICBvd25lcjogT3duZXIsXG4gIGRlZmluaXRpb246IENvbXBvbmVudERlZmluaXRpb25TdGF0ZSxcbiAgYXJnczogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPlxuKTogVGVtcGxhdGVJdGVyYXRvciB7XG4gIC8vIEdldCBhIGxpc3Qgb2YgdHVwbGVzIG9mIGFyZ3VtZW50IG5hbWVzIGFuZCByZWZlcmVuY2VzLCBsaWtlXG4gIC8vIFtbJ3RpdGxlJywgcmVmZXJlbmNlXSwgWyduYW1lJywgcmVmZXJlbmNlXV1cbiAgY29uc3QgYXJnTGlzdCA9IE9iamVjdC5rZXlzKGFyZ3MpLm1hcCgoa2V5KSA9PiBba2V5LCBhcmdzW2tleV1dKTtcblxuICBjb25zdCBibG9ja05hbWVzID0gWydtYWluJywgJ2Vsc2UnLCAnYXR0cnMnXTtcbiAgLy8gUHJlZml4IGFyZ3VtZW50IG5hbWVzIHdpdGggYEBgIHN5bWJvbFxuICBjb25zdCBhcmdOYW1lcyA9IGFyZ0xpc3QubWFwKChbbmFtZV0pID0+IGBAJHtuYW1lfWApO1xuXG4gIGxldCByZWlmaWVkID0gdm1bQ09OU1RBTlRTXS5jb21wb25lbnQoZGVmaW5pdGlvbiwgb3duZXIpO1xuXG4gIHZtLnB1c2hGcmFtZSgpO1xuXG4gIC8vIFB1c2ggYmxvY2tzIG9uIHRvIHRoZSBzdGFjaywgdGhyZWUgc3RhY2sgdmFsdWVzIHBlciBibG9ja1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDMgKiBibG9ja05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdm0uc3RhY2sucHVzaChudWxsKTtcbiAgfVxuXG4gIHZtLnN0YWNrLnB1c2gobnVsbCk7XG5cbiAgLy8gRm9yIGVhY2ggYXJndW1lbnQsIHB1c2ggaXRzIGJhY2tpbmcgcmVmZXJlbmNlIG9uIHRvIHRoZSBzdGFja1xuICBhcmdMaXN0LmZvckVhY2goKFssIHJlZmVyZW5jZV0pID0+IHtcbiAgICB2bS5zdGFjay5wdXNoKHJlZmVyZW5jZSk7XG4gIH0pO1xuXG4gIC8vIENvbmZpZ3VyZSBWTSBiYXNlZCBvbiBibG9ja3MgYW5kIGFyZ3MganVzdCBwdXNoZWQgb24gdG8gdGhlIHN0YWNrLlxuICB2bVtBUkdTXS5zZXR1cCh2bS5zdGFjaywgYXJnTmFtZXMsIGJsb2NrTmFtZXMsIDAsIHRydWUpO1xuXG4gIGNvbnN0IGNvbXBpbGFibGUgPSBleHBlY3QoXG4gICAgcmVpZmllZC5jb21waWxhYmxlLFxuICAgICdCVUc6IEV4cGVjdGVkIHRoZSByb290IGNvbXBvbmVudCByZW5kZXJlZCB3aXRoIHJlbmRlckNvbXBvbmVudCB0byBoYXZlIGFuIGFzc29jaWF0ZWQgdGVtcGxhdGUsIHNldCB3aXRoIHNldENvbXBvbmVudFRlbXBsYXRlJ1xuICApO1xuICBjb25zdCBsYXlvdXRIYW5kbGUgPSB1bndyYXBIYW5kbGUoY29tcGlsYWJsZS5jb21waWxlKGNvbnRleHQpKTtcbiAgY29uc3QgaW52b2NhdGlvbiA9IHsgaGFuZGxlOiBsYXlvdXRIYW5kbGUsIHN5bWJvbFRhYmxlOiBjb21waWxhYmxlLnN5bWJvbFRhYmxlIH07XG5cbiAgLy8gTmVlZGVkIGZvciB0aGUgT3AuTWFpbiBvcGNvZGU6IGFyZ3VtZW50cywgY29tcG9uZW50IGludm9jYXRpb24gb2JqZWN0LCBhbmRcbiAgLy8gY29tcG9uZW50IGRlZmluaXRpb24uXG4gIHZtLnN0YWNrLnB1c2godm1bQVJHU10pO1xuICB2bS5zdGFjay5wdXNoKGludm9jYXRpb24pO1xuICB2bS5zdGFjay5wdXNoKHJlaWZpZWQpO1xuXG4gIHJldHVybiBuZXcgVGVtcGxhdGVJdGVyYXRvckltcGwodm0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50KFxuICBydW50aW1lOiBSdW50aW1lQ29udGV4dCxcbiAgdHJlZUJ1aWxkZXI6IEVsZW1lbnRCdWlsZGVyLFxuICBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dCxcbiAgb3duZXI6IE93bmVyLFxuICBkZWZpbml0aW9uOiBDb21wb25lbnREZWZpbml0aW9uU3RhdGUsXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGR5bmFtaWNTY29wZTogRHluYW1pY1Njb3BlID0gbmV3IER5bmFtaWNTY29wZUltcGwoKVxuKTogVGVtcGxhdGVJdGVyYXRvciB7XG4gIGxldCB2bSA9IFZNLmVtcHR5KFxuICAgIHJ1bnRpbWUsXG4gICAgeyB0cmVlQnVpbGRlciwgaGFuZGxlOiBjb250ZXh0LnN0ZGxpYi5tYWluLCBkeW5hbWljU2NvcGUsIG93bmVyIH0sXG4gICAgY29udGV4dFxuICApO1xuICByZXR1cm4gcmVuZGVySW52b2NhdGlvbih2bSwgY29udGV4dCwgb3duZXIsIGRlZmluaXRpb24sIHJlY29yZFRvUmVmZXJlbmNlKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkVG9SZWZlcmVuY2UocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT4ge1xuICBjb25zdCByb290ID0gY3JlYXRlQ29uc3RSZWYocmVjb3JkLCAnYXJncycpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhyZWNvcmQpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICBhY2Nba2V5XSA9IGNoaWxkUmVmRm9yKHJvb3QsIGtleSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPik7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9