@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
400 lines (326 loc) • 29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EndTrackFrameOpcode = exports.BeginTrackFrameOpcode = exports.JumpIfNotModifiedOpcode = exports.AssertFilter = exports.Assert = void 0;
var _globalContext = require("@glimmer/global-context");
var _reference = require("@glimmer/reference");
var _validator = require("@glimmer/validator");
var _util = require("@glimmer/util");
var _assert = require("./assert");
var _opcodes = require("../../opcodes");
var _symbols = require("../../symbols");
_opcodes.APPEND_OPCODES.add(39
/* ChildScope */
, vm => vm.pushChildScope());
_opcodes.APPEND_OPCODES.add(40
/* PopScope */
, vm => vm.popScope());
_opcodes.APPEND_OPCODES.add(59
/* PushDynamicScope */
, vm => vm.pushDynamicScope());
_opcodes.APPEND_OPCODES.add(60
/* PopDynamicScope */
, vm => vm.popDynamicScope());
_opcodes.APPEND_OPCODES.add(28
/* Constant */
, (vm, {
op1: other
}) => {
vm.stack.push(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other)));
});
_opcodes.APPEND_OPCODES.add(29
/* ConstantReference */
, (vm, {
op1: other
}) => {
vm.stack.push((0, _reference.createConstRef)(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other)), false));
});
_opcodes.APPEND_OPCODES.add(30
/* Primitive */
, (vm, {
op1: primitive
}) => {
let stack = vm.stack;
if ((0, _util.isHandle)(primitive)) {
// it is a handle which does not already exist on the stack
let value = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(primitive));
stack.push(value);
} else {
// is already an encoded immediate or primitive handle
stack.push((0, _util.decodeImmediate)(primitive));
}
});
_opcodes.APPEND_OPCODES.add(31
/* PrimitiveReference */
, vm => {
let stack = vm.stack;
let value = stack.pop();
let ref;
if (value === undefined) {
ref = _reference.UNDEFINED_REFERENCE;
} else if (value === null) {
ref = _reference.NULL_REFERENCE;
} else if (value === true) {
ref = _reference.TRUE_REFERENCE;
} else if (value === false) {
ref = _reference.FALSE_REFERENCE;
} else {
ref = (0, _reference.createPrimitiveRef)(value);
}
stack.push(ref);
});
_opcodes.APPEND_OPCODES.add(33
/* Dup */
, (vm, {
op1: register,
op2: offset
}) => {
let position = vm.fetchValue(register) - offset;
vm.stack.dup(position);
});
_opcodes.APPEND_OPCODES.add(34
/* Pop */
, (vm, {
op1: count
}) => {
vm.stack.pop(count);
});
_opcodes.APPEND_OPCODES.add(35
/* Load */
, (vm, {
op1: register
}) => {
vm.load(register);
});
_opcodes.APPEND_OPCODES.add(36
/* Fetch */
, (vm, {
op1: register
}) => {
vm.fetch(register);
});
_opcodes.APPEND_OPCODES.add(58
/* BindDynamicScope */
, (vm, {
op1: _names
}) => {
let names = vm[_symbols.CONSTANTS].getArray(_names);
vm.bindDynamicScope(names);
});
_opcodes.APPEND_OPCODES.add(69
/* Enter */
, (vm, {
op1: args
}) => {
vm.enter(args);
});
_opcodes.APPEND_OPCODES.add(70
/* Exit */
, vm => {
vm.exit();
});
_opcodes.APPEND_OPCODES.add(63
/* PushSymbolTable */
, (vm, {
op1: _table
}) => {
let stack = vm.stack;
stack.push(vm[_symbols.CONSTANTS].getValue(_table));
});
_opcodes.APPEND_OPCODES.add(62
/* PushBlockScope */
, vm => {
let stack = vm.stack;
stack.push(vm.scope());
});
_opcodes.APPEND_OPCODES.add(61
/* CompileBlock */
, vm => {
let stack = vm.stack;
let block = stack.pop();
if (block) {
stack.push(vm.compile(block));
} else {
stack.push(null);
}
});
_opcodes.APPEND_OPCODES.add(64
/* InvokeYield */
, vm => {
let {
stack
} = vm;
let handle = stack.pop();
let scope = stack.pop();
let table = stack.pop();
false && (0, _util.assert)(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), (0, _assert.stackAssert)('Option<BlockSymbolTable>', table));
let args = stack.pop();
if (table === null) {
// To balance the pop{Frame,Scope}
vm.pushFrame();
vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope());
return;
}
let invokingScope = scope; // If necessary, create a child scope
{
let locals = table.parameters;
let localsCount = locals.length;
if (localsCount > 0) {
invokingScope = invokingScope.child();
for (let i = 0; i < localsCount; i++) {
invokingScope.bindSymbol(locals[i], args.at(i));
}
}
}
vm.pushFrame();
vm.pushScope(invokingScope);
vm.call(handle);
});
_opcodes.APPEND_OPCODES.add(65
/* JumpIf */
, (vm, {
op1: target
}) => {
let reference = vm.stack.pop();
let value = Boolean((0, _reference.valueForRef)(reference));
if ((0, _reference.isConstRef)(reference)) {
if (value === true) {
vm.goto(target);
}
} else {
if (value === true) {
vm.goto(target);
}
vm.updateWith(new Assert(reference));
}
});
_opcodes.APPEND_OPCODES.add(66
/* JumpUnless */
, (vm, {
op1: target
}) => {
let reference = vm.stack.pop();
let value = Boolean((0, _reference.valueForRef)(reference));
if ((0, _reference.isConstRef)(reference)) {
if (value === false) {
vm.goto(target);
}
} else {
if (value === false) {
vm.goto(target);
}
vm.updateWith(new Assert(reference));
}
});
_opcodes.APPEND_OPCODES.add(67
/* JumpEq */
, (vm, {
op1: target,
op2: comparison
}) => {
let other = vm.stack.peek();
if (other === comparison) {
vm.goto(target);
}
});
_opcodes.APPEND_OPCODES.add(68
/* AssertSame */
, vm => {
let reference = vm.stack.peek();
if ((0, _reference.isConstRef)(reference) === false) {
vm.updateWith(new Assert(reference));
}
});
_opcodes.APPEND_OPCODES.add(71
/* ToBoolean */
, vm => {
let {
stack
} = vm;
let valueRef = stack.pop();
stack.push((0, _reference.createComputeRef)(() => (0, _globalContext.toBool)((0, _reference.valueForRef)(valueRef))));
});
class Assert {
constructor(ref) {
this.ref = ref;
this.last = (0, _reference.valueForRef)(ref);
}
evaluate(vm) {
let {
last,
ref
} = this;
let current = (0, _reference.valueForRef)(ref);
if (last !== current) {
vm.throw();
}
}
}
exports.Assert = Assert;
class AssertFilter {
constructor(ref, filter) {
this.ref = ref;
this.filter = filter;
this.last = filter((0, _reference.valueForRef)(ref));
}
evaluate(vm) {
let {
last,
ref,
filter
} = this;
let current = filter((0, _reference.valueForRef)(ref));
if (last !== current) {
vm.throw();
}
}
}
exports.AssertFilter = AssertFilter;
class JumpIfNotModifiedOpcode {
constructor() {
this.tag = _validator.CONSTANT_TAG;
this.lastRevision = _validator.INITIAL;
}
finalize(tag, target) {
this.target = target;
this.didModify(tag);
}
evaluate(vm) {
let {
tag,
target,
lastRevision
} = this;
if (!vm.alwaysRevalidate && (0, _validator.validateTag)(tag, lastRevision)) {
(0, _validator.consumeTag)(tag);
vm.goto(target);
}
}
didModify(tag) {
this.tag = tag;
this.lastRevision = (0, _validator.valueForTag)(this.tag);
(0, _validator.consumeTag)(tag);
}
}
exports.JumpIfNotModifiedOpcode = JumpIfNotModifiedOpcode;
class BeginTrackFrameOpcode {
constructor(debugLabel) {
this.debugLabel = debugLabel;
}
evaluate() {
(0, _validator.beginTrackFrame)(this.debugLabel);
}
}
exports.BeginTrackFrameOpcode = BeginTrackFrameOpcode;
class EndTrackFrameOpcode {
constructor(target) {
this.target = target;
}
evaluate() {
let tag = (0, _validator.endTrackFrame)();
this.target.didModify(tag);
}
}
exports.EndTrackFrameOpcode = EndTrackFrameOpcode;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBOztBQVlBOztBQVdBOztBQVVBOztBQUNBOztBQUlBOztBQUdBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFtQyxFQUFELElBQVEsRUFBRSxDQUE1QyxjQUEwQyxFQUExQzs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBaUMsRUFBRCxJQUFRLEVBQUUsQ0FBMUMsUUFBd0MsRUFBeEM7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXlDLEVBQUQsSUFBUSxFQUFFLENBQWxELGdCQUFnRCxFQUFoRDs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBd0MsRUFBRCxJQUFRLEVBQUUsQ0FBakQsZUFBK0MsRUFBL0M7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQWdDLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXVCO0FBQ3JELEVBQUEsRUFBRSxDQUFGLEtBQUEsQ0FBQSxJQUFBLENBQWMsRUFBRSxDQUFGLGtCQUFFLENBQUYsQ0FBQSxRQUFBLENBQXVCLHdCQUFyQyxLQUFxQyxDQUF2QixDQUFkO0FBREYsQ0FBQTs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBeUMsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBdUI7QUFDOUQsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBYywrQkFBZSxFQUFFLENBQUYsa0JBQUUsQ0FBRixDQUFBLFFBQUEsQ0FBdUIsd0JBQXhCLEtBQXdCLENBQXZCLENBQWYsRUFBZCxLQUFjLENBQWQ7QUFERixDQUFBOztBQUlBLHdCQUFB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LFFBQUksQ0FBQyxFQUFFLENBQUgsZ0JBQUEsSUFBd0IsNEJBQVcsR0FBWCxFQUE1QixZQUE0QixDQUE1QixFQUE0RDtBQUMxRCxpQ0FBQSxHQUFBO0FBQ0EsTUFBQSxFQUFFLENBQUYsSUFBQSxDQUFBLE1BQUE7QUFDRDtBQUNGOztBQUVELEVBQUEsU0FBUyxDQUFBLEdBQUEsRUFBUztBQUNoQixTQUFBLEdBQUEsR0FBQSxHQUFBO0FBQ0EsU0FBQSxZQUFBLEdBQW9CLDRCQUFZLEtBQWhDLEdBQW9CLENBQXBCO0FBQ0EsK0JBQUEsR0FBQTtBQUNEOztBQXZCaUM7Ozs7QUEwQjlCLE1BQUEscUJBQUEsQ0FBNEI7QUFDaEMsRUFBQSxXQUFBLENBQUEsVUFBQSxFQUF1QztBQUFuQixTQUFBLFVBQUEsR0FBQSxVQUFBO0FBQXVCOztBQUUzQyxFQUFBLFFBQVEsR0FBQTtBQUNOLG9DQUFnQixLQUFoQixVQUFBO0FBQ0Q7O0FBTCtCOzs7O0FBUTVCLE1BQUEsbUJBQUEsQ0FBMEI7QUFDOUIsRUFBQSxXQUFBLENBQUEsTUFBQSxFQUFtRDtBQUEvQixTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQW1DOztBQUV2RCxFQUFBLFFBQVEsR0FBQTtBQUNOLFFBQUksR0FBRyxHQUFQLCtCQUFBO0FBQ0EsU0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLEdBQUE7QUFDRDs7QUFONkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBDb21waWxhYmxlVGVtcGxhdGUsIE9wdGlvbiwgT3AsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBSZWZlcmVuY2UsXG4gIHZhbHVlRm9yUmVmLFxuICBpc0NvbnN0UmVmLFxuICBjcmVhdGVQcmltaXRpdmVSZWYsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIE5VTExfUkVGRVJFTkNFLFxuICBUUlVFX1JFRkVSRU5DRSxcbiAgRkFMU0VfUkVGRVJFTkNFLFxuICBjcmVhdGVDb21wdXRlUmVmLFxuICBjcmVhdGVDb25zdFJlZixcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIENPTlNUQU5UX1RBRyxcbiAgUmV2aXNpb24sXG4gIFRhZyxcbiAgdmFsdWVGb3JUYWcsXG4gIHZhbGlkYXRlVGFnLFxuICBJTklUSUFMLFxuICBiZWdpblRyYWNrRnJhbWUsXG4gIGVuZFRyYWNrRnJhbWUsXG4gIGNvbnN1bWVUYWcsXG59IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGRlY29kZUhhbmRsZSwgZGVjb2RlSW1tZWRpYXRlLCBleHBlY3QsIGlzSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQge1xuICBDaGVja051bWJlcixcbiAgY2hlY2ssXG4gIENoZWNrSW5zdGFuY2VvZixcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrUHJpbWl0aXZlLFxufSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQgeyBzdGFja0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBVcGRhdGluZ1ZNIH0gZnJvbSAnLi4vLi4vdm0nO1xuaW1wb3J0IHsgVk1Bcmd1bWVudHNJbXBsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlLCBDaGVja1Njb3BlIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBJbnRlcm5hbFZNIH0gZnJvbSAnLi4vLi4vdm0vYXBwZW5kJztcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNoaWxkU2NvcGUsICh2bSkgPT4gdm0ucHVzaENoaWxkU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BTY29wZSwgKHZtKSA9PiB2bS5wb3BTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucHVzaER5bmFtaWNTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcER5bmFtaWNTY29wZSwgKHZtKSA9PiB2bS5wb3BEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudCwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudFJlZmVyZW5jZSwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbnN0UmVmKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSksIGZhbHNlKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlByaW1pdGl2ZSwgKHZtLCB7IG9wMTogcHJpbWl0aXZlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgaWYgKGlzSGFuZGxlKHByaW1pdGl2ZSkpIHtcbiAgICAvLyBpdCBpcyBhIGhhbmRsZSB3aGljaCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBzdGFja1xuICAgIGxldCB2YWx1ZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKHByaW1pdGl2ZSkpO1xuICAgIHN0YWNrLnB1c2godmFsdWUgYXMgb2JqZWN0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpcyBhbHJlYWR5IGFuIGVuY29kZWQgaW1tZWRpYXRlIG9yIHByaW1pdGl2ZSBoYW5kbGVcbiAgICBzdGFjay5wdXNoKGRlY29kZUltbWVkaWF0ZShwcmltaXRpdmUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmVSZWZlcmVuY2UsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHZhbHVlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUHJpbWl0aXZlKTtcbiAgbGV0IHJlZjtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZWYgPSBOVUxMX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZiA9IFRSVUVfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJlZiA9IEZBTFNFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIHtcbiAgICByZWYgPSBjcmVhdGVQcmltaXRpdmVSZWYodmFsdWUpO1xuICB9XG5cbiAgc3RhY2sucHVzaChyZWYpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EdXAsICh2bSwgeyBvcDE6IHJlZ2lzdGVyLCBvcDI6IG9mZnNldCB9KSA9PiB7XG4gIGxldCBwb3NpdGlvbiA9IGNoZWNrKHZtLmZldGNoVmFsdWUocmVnaXN0ZXIpLCBDaGVja051bWJlcikgLSBvZmZzZXQ7XG4gIHZtLnN0YWNrLmR1cChwb3NpdGlvbik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICB2bS5zdGFjay5wb3AoY291bnQpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2FkLCAodm0sIHsgb3AxOiByZWdpc3RlciB9KSA9PiB7XG4gIHZtLmxvYWQocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GZXRjaCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5mZXRjaChyZWdpc3Rlcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkJpbmREeW5hbWljU2NvcGUsICh2bSwgeyBvcDE6IF9uYW1lcyB9KSA9PiB7XG4gIGxldCBuYW1lcyA9IHZtW0NPTlNUQU5UU10uZ2V0QXJyYXk8c3RyaW5nPihfbmFtZXMpO1xuICB2bS5iaW5kRHluYW1pY1Njb3BlKG5hbWVzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRW50ZXIsICh2bSwgeyBvcDE6IGFyZ3MgfSkgPT4ge1xuICB2bS5lbnRlcihhcmdzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRXhpdCwgKHZtKSA9PiB7XG4gIHZtLmV4aXQoKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaFN5bWJvbFRhYmxlLCAodm0sIHsgb3AxOiBfdGFibGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKF90YWJsZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoQmxvY2tTY29wZSwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBzdGFjay5wdXNoKHZtLnNjb3BlKCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21waWxlQmxvY2ssICh2bTogSW50ZXJuYWxWTSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGJsb2NrID0gc3RhY2sucG9wPE9wdGlvbjxDb21waWxhYmxlVGVtcGxhdGU+IHwgMD4oKTtcblxuICBpZiAoYmxvY2spIHtcbiAgICBzdGFjay5wdXNoKHZtLmNvbXBpbGUoYmxvY2spKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkludm9rZVlpZWxkLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuXG4gIGxldCBoYW5kbGUgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tIYW5kbGUpKTtcbiAgbGV0IHNjb3BlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuXG4gIGFzc2VydChcbiAgICB0YWJsZSA9PT0gbnVsbCB8fCAodGFibGUgJiYgdHlwZW9mIHRhYmxlID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhYmxlLnBhcmFtZXRlcnMpKSxcbiAgICBzdGFja0Fzc2VydCgnT3B0aW9uPEJsb2NrU3ltYm9sVGFibGU+JywgdGFibGUpXG4gICk7XG5cbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tJbnN0YW5jZW9mKFZNQXJndW1lbnRzSW1wbCkpO1xuXG4gIGlmICh0YWJsZSA9PT0gbnVsbCkge1xuICAgIC8vIFRvIGJhbGFuY2UgdGhlIHBvcHtGcmFtZSxTY29wZX1cbiAgICB2bS5wdXNoRnJhbWUoKTtcbiAgICB2bS5wdXNoU2NvcGUoc2NvcGUgPz8gdm0uc2NvcGUoKSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaW52b2tpbmdTY29wZSA9IGV4cGVjdChzY29wZSwgJ0JVRzogZXhwZWN0ZWQgc2NvcGUnKTtcblxuICAvLyBJZiBuZWNlc3NhcnksIGNyZWF0ZSBhIGNoaWxkIHNjb3BlXG4gIHtcbiAgICBsZXQgbG9jYWxzID0gdGFibGUucGFyYW1ldGVycztcbiAgICBsZXQgbG9jYWxzQ291bnQgPSBsb2NhbHMubGVuZ3RoO1xuXG4gICAgaWYgKGxvY2Fsc0NvdW50ID4gMCkge1xuICAgICAgaW52b2tpbmdTY29wZSA9IGludm9raW5nU2NvcGUuY2hpbGQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHNDb3VudDsgaSsrKSB7XG4gICAgICAgIGludm9raW5nU2NvcGUuYmluZFN5bWJvbChsb2NhbHMhW2ldLCBhcmdzLmF0KGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2bS5wdXNoRnJhbWUoKTtcbiAgdm0ucHVzaFNjb3BlKGludm9raW5nU2NvcGUpO1xuICB2bS5jYWxsKGhhbmRsZSEpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wSWYsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBVbmxlc3MsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG5cbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQocmVmZXJlbmNlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcEVxLCAodm0sIHsgb3AxOiB0YXJnZXQsIG9wMjogY29tcGFyaXNvbiB9KSA9PiB7XG4gIGxldCBvdGhlciA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tOdW1iZXIpO1xuXG4gIGlmIChvdGhlciA9PT0gY29tcGFyaXNvbikge1xuICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Bc3NlcnRTYW1lLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlRvQm9vbGVhbiwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IHZhbHVlUmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBzdGFjay5wdXNoKGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4gdG9Cb29sKHZhbHVlRm9yUmVmKHZhbHVlUmVmKSkpKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXJ0IGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3Q6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IFJlZmVyZW5jZSkge1xuICAgIHRoaXMubGFzdCA9IHZhbHVlRm9yUmVmKHJlZik7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiB9ID0gdGhpcztcbiAgICBsZXQgY3VycmVudCA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydEZpbHRlcjxULCBVPiBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiBVO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2U8VD4sIHByaXZhdGUgZmlsdGVyOiAoZnJvbTogVCkgPT4gVSkge1xuICAgIHRoaXMubGFzdCA9IGZpbHRlcih2YWx1ZUZvclJlZihyZWYpKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgbGFzdCwgcmVmLCBmaWx0ZXIgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIHRhZzogVGFnID0gQ09OU1RBTlRfVEFHO1xuICBwcml2YXRlIGxhc3RSZXZpc2lvbjogUmV2aXNpb24gPSBJTklUSUFMO1xuICBwcml2YXRlIHRhcmdldD86IG51bWJlcjtcblxuICBmaW5hbGl6ZSh0YWc6IFRhZywgdGFyZ2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmRpZE1vZGlmeSh0YWcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIHRhcmdldCwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF2bS5hbHdheXNSZXZhbGlkYXRlICYmIHZhbGlkYXRlVGFnKHRhZywgbGFzdFJldmlzaW9uKSkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgICAgdm0uZ290byhleHBlY3QodGFyZ2V0LCAnVk0gQlVHOiBUYXJnZXQgbXVzdCBiZSBzZXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8ganVtcCcpKTtcbiAgICB9XG4gIH1cblxuICBkaWRNb2RpZnkodGFnOiBUYWcpIHtcbiAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHZhbHVlRm9yVGFnKHRoaXMudGFnKTtcbiAgICBjb25zdW1lVGFnKHRhZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJlZ2luVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0xhYmVsPzogc3RyaW5nKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGJlZ2luVHJhY2tGcmFtZSh0aGlzLmRlYnVnTGFiZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRUcmFja0ZyYW1lT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogSnVtcElmTm90TW9kaWZpZWRPcGNvZGUpIHt9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgbGV0IHRhZyA9IGVuZFRyYWNrRnJhbWUoKTtcbiAgICB0aGlzLnRhcmdldC5kaWRNb2RpZnkodGFnKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==