ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
799 lines (746 loc) • 94.3 kB
JavaScript
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { map } from '@glimmer/reference';
import { assert, dict, EMPTY_ARRAY } from '@glimmer/util';
import * as WireFormat from '@glimmer/wire-format';
import OpcodeBuilder from '../compiled/opcodes/builder';
import { Register } from '../opcodes';
import * as ClientSide from '../syntax/client-side';
import RawInlineBlock from './raw-block';
var Ops = WireFormat.Ops;
export var ATTRS_BLOCK = '&attrs';
var Compilers = function () {
function Compilers() {
var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
_classCallCheck(this, Compilers);
this.offset = offset;
this.names = dict();
this.funcs = [];
}
Compilers.prototype.add = function add(name, func) {
this.funcs.push(func);
this.names[name] = this.funcs.length - 1;
};
Compilers.prototype.compile = function compile(sexp, builder) {
var name = sexp[this.offset];
var index = this.names[name];
var func = this.funcs[index];
assert(!!func, 'expected an implementation for ' + (this.offset === 0 ? Ops[sexp[0]] : ClientSide.Ops[sexp[1]]));
func(sexp, builder);
};
return Compilers;
}();
var STATEMENTS = new Compilers();
var CLIENT_SIDE = new Compilers(1);
STATEMENTS.add(Ops.Text, function (sexp, builder) {
builder.text(sexp[1]);
});
STATEMENTS.add(Ops.Comment, function (sexp, builder) {
builder.comment(sexp[1]);
});
STATEMENTS.add(Ops.CloseElement, function (_sexp, builder) {
builder.closeElement();
});
STATEMENTS.add(Ops.FlushElement, function (_sexp, builder) {
builder.flushElement();
});
STATEMENTS.add(Ops.Modifier, function (sexp, builder) {
var env = builder.env,
meta = builder.meta;
var name = sexp[1],
params = sexp[2],
hash = sexp[3];
if (env.hasModifier(name, meta.templateMeta)) {
builder.compileArgs(params, hash, true);
builder.modifier(env.lookupModifier(name, meta.templateMeta));
} else {
throw new Error('Compile Error ' + name + ' is not a modifier: Helpers may not be used in the element form.');
}
});
STATEMENTS.add(Ops.StaticAttr, function (sexp, builder) {
var name = sexp[1],
value = sexp[2],
namespace = sexp[3];
builder.staticAttr(name, namespace, value);
});
STATEMENTS.add(Ops.DynamicAttr, function (sexp, builder) {
dynamicAttr(sexp, false, builder);
});
STATEMENTS.add(Ops.TrustingAttr, function (sexp, builder) {
dynamicAttr(sexp, true, builder);
});
function dynamicAttr(sexp, trusting, builder) {
var name = sexp[1],
value = sexp[2],
namespace = sexp[3];
expr(value, builder);
if (namespace) {
builder.dynamicAttrNS(name, namespace, trusting);
} else {
builder.dynamicAttr(name, trusting);
}
}
STATEMENTS.add(Ops.OpenElement, function (sexp, builder) {
builder.openPrimitiveElement(sexp[1]);
});
CLIENT_SIDE.add(ClientSide.Ops.OpenComponentElement, function (sexp, builder) {
builder.pushComponentOperations();
builder.openElementWithOperations(sexp[2]);
});
CLIENT_SIDE.add(ClientSide.Ops.DidCreateElement, function (_sexp, builder) {
builder.didCreateElement(Register.s0);
});
CLIENT_SIDE.add(ClientSide.Ops.DidRenderLayout, function (_sexp, builder) {
builder.didRenderLayout(Register.s0);
});
STATEMENTS.add(Ops.Append, function (sexp, builder) {
var value = sexp[1],
trusting = sexp[2];
var _builder$env$macros = builder.env.macros(),
inlines = _builder$env$macros.inlines;
var returned = inlines.compile(sexp, builder) || value;
if (returned === true) return;
var isGet = E.isGet(value);
var isMaybeLocal = E.isMaybeLocal(value);
if (trusting) {
builder.guardedAppend(value, true);
} else {
if (isGet || isMaybeLocal) {
builder.guardedAppend(value, false);
} else {
expr(value, builder);
builder.cautiousAppend();
}
}
});
STATEMENTS.add(Ops.Block, function (sexp, builder) {
var name = sexp[1],
params = sexp[2],
hash = sexp[3],
_template = sexp[4],
_inverse = sexp[5];
var template = builder.template(_template);
var inverse = builder.template(_inverse);
var templateBlock = template && template.scan();
var inverseBlock = inverse && inverse.scan();
var _builder$env$macros2 = builder.env.macros(),
blocks = _builder$env$macros2.blocks;
blocks.compile(name, params, hash, templateBlock, inverseBlock, builder);
});
export var InvokeDynamicLayout = function () {
function InvokeDynamicLayout(attrs) {
_classCallCheck(this, InvokeDynamicLayout);
this.attrs = attrs;
}
InvokeDynamicLayout.prototype.invoke = function invoke(vm, layout) {
var _layout$symbolTable = layout.symbolTable,
symbols = _layout$symbolTable.symbols,
hasEval = _layout$symbolTable.hasEval;
var stack = vm.stack;
var scope = vm.pushRootScope(symbols.length + 1, true);
scope.bindSelf(stack.pop());
scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs);
var lookup = null;
var $eval = -1;
if (hasEval) {
$eval = symbols.indexOf('$eval') + 1;
lookup = dict();
}
var callerNames = stack.pop();
for (var i = callerNames.length - 1; i >= 0; i--) {
var symbol = symbols.indexOf(callerNames[i]);
var value = stack.pop();
if (symbol !== -1) scope.bindSymbol(symbol + 1, value);
if (hasEval) lookup[callerNames[i]] = value;
}
var numPositionalArgs = stack.pop();
assert(typeof numPositionalArgs === 'number', '[BUG] Incorrect value of positional argument count found during invoke-dynamic-layout.');
// Currently we don't support accessing positional args in templates, so just throw them away
stack.pop(numPositionalArgs);
var inverseSymbol = symbols.indexOf('&inverse');
var inverse = stack.pop();
if (inverseSymbol !== -1) {
scope.bindBlock(inverseSymbol + 1, inverse);
}
if (lookup) lookup['&inverse'] = inverse;
var defaultSymbol = symbols.indexOf('&default');
var defaultBlock = stack.pop();
if (defaultSymbol !== -1) {
scope.bindBlock(defaultSymbol + 1, defaultBlock);
}
if (lookup) lookup['&default'] = defaultBlock;
if (lookup) scope.bindEvalScope(lookup);
vm.pushFrame();
vm.call(layout.handle);
};
InvokeDynamicLayout.prototype.toJSON = function toJSON() {
return { GlimmerDebug: '<invoke-dynamic-layout>' };
};
return InvokeDynamicLayout;
}();
STATEMENTS.add(Ops.Component, function (sexp, builder) {
var tag = sexp[1],
attrs = sexp[2],
args = sexp[3],
block = sexp[4];
if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) {
var child = builder.template(block);
var attrsBlock = new RawInlineBlock(builder.meta, attrs, EMPTY_ARRAY);
var definition = builder.env.getComponentDefinition(tag, builder.meta.templateMeta);
builder.pushComponentManager(definition);
builder.invokeComponent(attrsBlock, null, args, child && child.scan());
} else if (block && block.parameters.length) {
throw new Error('Compile Error: Cannot find component ' + tag);
} else {
builder.openPrimitiveElement(tag);
for (var i = 0; i < attrs.length; i++) {
STATEMENTS.compile(attrs[i], builder);
}
builder.flushElement();
if (block) {
var stmts = block.statements;
for (var _i = 0; _i < stmts.length; _i++) {
STATEMENTS.compile(stmts[_i], builder);
}
}
builder.closeElement();
}
});
export var PartialInvoker = function () {
function PartialInvoker(outerSymbols, evalInfo) {
_classCallCheck(this, PartialInvoker);
this.outerSymbols = outerSymbols;
this.evalInfo = evalInfo;
}
PartialInvoker.prototype.invoke = function invoke(vm, _partial) {
var partial = _partial;
var partialSymbols = partial.symbolTable.symbols;
var outerScope = vm.scope();
var partialScope = vm.pushRootScope(partialSymbols.length, false);
partialScope.bindCallerScope(outerScope.getCallerScope());
partialScope.bindEvalScope(outerScope.getEvalScope());
partialScope.bindSelf(outerScope.getSelf());
var evalInfo = this.evalInfo,
outerSymbols = this.outerSymbols;
var locals = dict();
for (var i = 0; i < evalInfo.length; i++) {
var slot = evalInfo[i];
var name = outerSymbols[slot - 1];
var ref = outerScope.getSymbol(slot);
locals[name] = ref;
}
var evalScope = outerScope.getEvalScope();
for (var _i2 = 0; _i2 < partialSymbols.length; _i2++) {
var _name = partialSymbols[_i2];
var symbol = _i2 + 1;
var value = evalScope[_name];
if (value !== undefined) partialScope.bind(symbol, value);
}
partialScope.bindPartialMap(locals);
vm.pushFrame();
vm.call(partial.handle);
};
return PartialInvoker;
}();
STATEMENTS.add(Ops.Partial, function (sexp, builder) {
var name = sexp[1],
evalInfo = sexp[2];
var _builder$meta = builder.meta,
templateMeta = _builder$meta.templateMeta,
symbols = _builder$meta.symbols;
function helper(vm, args) {
var env = vm.env;
var nameRef = args.positional.at(0);
return map(nameRef, function (n) {
if (typeof n === 'string' && n) {
if (!env.hasPartial(n, templateMeta)) {
throw new Error('Could not find a partial named "' + n + '"');
}
return env.lookupPartial(n, templateMeta);
} else if (n) {
throw new Error('Could not find a partial named "' + String(n) + '"');
} else {
return null;
}
});
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(name, builder);
builder.pushImmediate(1);
builder.pushImmediate(EMPTY_ARRAY);
builder.pushArgs(true);
builder.helper(helper);
builder.dup();
builder.test('simple');
builder.enter(2);
builder.jumpUnless('ELSE');
builder.getPartialTemplate();
builder.compileDynamicBlock();
builder.invokeDynamic(new PartialInvoker(symbols, evalInfo));
builder.popScope();
builder.popFrame();
builder.label('ELSE');
builder.exit();
builder.return();
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
var InvokeDynamicYield = function () {
function InvokeDynamicYield(callerCount) {
_classCallCheck(this, InvokeDynamicYield);
this.callerCount = callerCount;
}
InvokeDynamicYield.prototype.invoke = function invoke(vm, block) {
var callerCount = this.callerCount;
var stack = vm.stack;
if (!block) {
// To balance the pop{Frame,Scope}
vm.pushFrame();
vm.pushCallerScope();
return;
}
var table = block.symbolTable;
var locals = table.parameters; // always present in inline blocks
var calleeCount = locals ? locals.length : 0;
var count = Math.min(callerCount, calleeCount);
vm.pushFrame();
vm.pushCallerScope(calleeCount > 0);
var scope = vm.scope();
for (var i = 0; i < count; i++) {
scope.bindSymbol(locals[i], stack.fromBase(callerCount - i));
}
vm.call(block.handle);
};
InvokeDynamicYield.prototype.toJSON = function toJSON() {
return { GlimmerDebug: '<invoke-dynamic-yield caller-count=' + this.callerCount + '>' };
};
return InvokeDynamicYield;
}();
STATEMENTS.add(Ops.Yield, function (sexp, builder) {
var to = sexp[1],
params = sexp[2];
var count = compileList(params, builder);
builder.getBlock(to);
builder.compileDynamicBlock();
builder.invokeDynamic(new InvokeDynamicYield(count));
builder.popScope();
builder.popFrame();
if (count) {
builder.pop(count);
}
});
STATEMENTS.add(Ops.Debugger, function (sexp, builder) {
var evalInfo = sexp[1];
builder.debugger(builder.meta.symbols, evalInfo);
});
STATEMENTS.add(Ops.ClientSideStatement, function (sexp, builder) {
CLIENT_SIDE.compile(sexp, builder);
});
var EXPRESSIONS = new Compilers();
var CLIENT_SIDE_EXPRS = new Compilers(1);
var E = WireFormat.Expressions;
export function expr(expression, builder) {
if (Array.isArray(expression)) {
EXPRESSIONS.compile(expression, builder);
} else {
builder.primitive(expression);
}
}
EXPRESSIONS.add(Ops.Unknown, function (sexp, builder) {
var name = sexp[1];
if (builder.env.hasHelper(name, builder.meta.templateMeta)) {
EXPRESSIONS.compile([Ops.Helper, name, EMPTY_ARRAY, null], builder);
} else if (builder.meta.asPartial) {
builder.resolveMaybeLocal(name);
} else {
builder.getVariable(0);
builder.getProperty(name);
}
});
EXPRESSIONS.add(Ops.Concat, function (sexp, builder) {
var parts = sexp[1];
for (var i = 0; i < parts.length; i++) {
expr(parts[i], builder);
}
builder.concat(parts.length);
});
CLIENT_SIDE_EXPRS.add(ClientSide.Ops.FunctionExpression, function (sexp, builder) {
builder.function(sexp[2]);
});
EXPRESSIONS.add(Ops.Helper, function (sexp, builder) {
var env = builder.env,
meta = builder.meta;
var name = sexp[1],
params = sexp[2],
hash = sexp[3];
if (env.hasHelper(name, meta.templateMeta)) {
builder.compileArgs(params, hash, true);
builder.helper(env.lookupHelper(name, meta.templateMeta));
} else {
throw new Error('Compile Error: ' + name + ' is not a helper');
}
});
EXPRESSIONS.add(Ops.Get, function (sexp, builder) {
var head = sexp[1],
path = sexp[2];
builder.getVariable(head);
for (var i = 0; i < path.length; i++) {
builder.getProperty(path[i]);
}
});
EXPRESSIONS.add(Ops.MaybeLocal, function (sexp, builder) {
var path = sexp[1];
if (builder.meta.asPartial) {
var head = path[0];
path = path.slice(1);
builder.resolveMaybeLocal(head);
} else {
builder.getVariable(0);
}
for (var i = 0; i < path.length; i++) {
builder.getProperty(path[i]);
}
});
EXPRESSIONS.add(Ops.Undefined, function (_sexp, builder) {
return builder.primitive(undefined);
});
EXPRESSIONS.add(Ops.HasBlock, function (sexp, builder) {
builder.hasBlock(sexp[1]);
});
EXPRESSIONS.add(Ops.HasBlockParams, function (sexp, builder) {
builder.hasBlockParams(sexp[1]);
});
EXPRESSIONS.add(Ops.ClientSideExpression, function (sexp, builder) {
CLIENT_SIDE_EXPRS.compile(sexp, builder);
});
export function compileList(params, builder) {
if (!params) return 0;
for (var i = 0; i < params.length; i++) {
expr(params[i], builder);
}
return params.length;
}
export var Blocks = function () {
function Blocks() {
_classCallCheck(this, Blocks);
this.names = dict();
this.funcs = [];
}
Blocks.prototype.add = function add(name, func) {
this.funcs.push(func);
this.names[name] = this.funcs.length - 1;
};
Blocks.prototype.addMissing = function addMissing(func) {
this.missing = func;
};
Blocks.prototype.compile = function compile(name, params, hash, template, inverse, builder) {
var index = this.names[name];
if (index === undefined) {
assert(!!this.missing, name + ' not found, and no catch-all block handler was registered');
var func = this.missing;
var handled = func(name, params, hash, template, inverse, builder);
assert(!!handled, name + ' not found, and the catch-all block handler didn\'t handle it');
} else {
var _func = this.funcs[index];
_func(params, hash, template, inverse, builder);
}
};
return Blocks;
}();
export var BLOCKS = new Blocks();
export var Inlines = function () {
function Inlines() {
_classCallCheck(this, Inlines);
this.names = dict();
this.funcs = [];
}
Inlines.prototype.add = function add(name, func) {
this.funcs.push(func);
this.names[name] = this.funcs.length - 1;
};
Inlines.prototype.addMissing = function addMissing(func) {
this.missing = func;
};
Inlines.prototype.compile = function compile(sexp, builder) {
var value = sexp[1];
// TODO: Fix this so that expression macros can return
// things like components, so that {{component foo}}
// is the same as {{(component foo)}}
if (!Array.isArray(value)) return ['expr', value];
var name = void 0;
var params = void 0;
var hash = void 0;
if (value[0] === Ops.Helper) {
name = value[1];
params = value[2];
hash = value[3];
} else if (value[0] === Ops.Unknown) {
name = value[1];
params = hash = null;
} else {
return ['expr', value];
}
var index = this.names[name];
if (index === undefined && this.missing) {
var func = this.missing;
var returned = func(name, params, hash, builder);
return returned === false ? ['expr', value] : returned;
} else if (index !== undefined) {
var _func2 = this.funcs[index];
var _returned = _func2(name, params, hash, builder);
return _returned === false ? ['expr', value] : _returned;
} else {
return ['expr', value];
}
};
return Inlines;
}();
export var INLINES = new Inlines();
populateBuiltins(BLOCKS, INLINES);
export function populateBuiltins() {
var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Blocks();
var inlines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Inlines();
blocks.add('if', function (params, _hash, template, inverse, builder) {
// PutArgs
// Test(Environment)
// Enter(BEGIN, END)
// BEGIN: Noop
// JumpUnless(ELSE)
// Evaluate(default)
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
if (!params || params.length !== 1) {
throw new Error('SYNTAX ERROR: #if requires a single argument');
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(params[0], builder);
builder.test('environment');
builder.enter(1);
builder.jumpUnless('ELSE');
builder.invokeStatic(template);
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('unless', function (params, _hash, template, inverse, builder) {
// PutArgs
// Test(Environment)
// Enter(BEGIN, END)
// BEGIN: Noop
// JumpUnless(ELSE)
// Evaluate(default)
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
if (!params || params.length !== 1) {
throw new Error('SYNTAX ERROR: #unless requires a single argument');
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(params[0], builder);
builder.test('environment');
builder.enter(1);
builder.jumpIf('ELSE');
builder.invokeStatic(template);
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('with', function (params, _hash, template, inverse, builder) {
// PutArgs
// Test(Environment)
// Enter(BEGIN, END)
// BEGIN: Noop
// JumpUnless(ELSE)
// Evaluate(default)
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
if (!params || params.length !== 1) {
throw new Error('SYNTAX ERROR: #with requires a single argument');
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(params[0], builder);
builder.dup();
builder.test('environment');
builder.enter(2);
builder.jumpUnless('ELSE');
builder.invokeStatic(template, 1);
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('each', function (params, hash, template, inverse, builder) {
// Enter(BEGIN, END)
// BEGIN: Noop
// PutArgs
// PutIterable
// JumpUnless(ELSE)
// EnterList(BEGIN2, END2)
// ITER: Noop
// NextIter(BREAK)
// BEGIN2: Noop
// PushChildScope
// Evaluate(default)
// PopScope
// END2: Noop
// Exit
// Jump(ITER)
// BREAK: Noop
// ExitList
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
if (hash && hash[0][0] === 'key') {
expr(hash[1][0], builder);
} else {
builder.primitive(null);
}
expr(params[0], builder);
builder.enter(2);
builder.putIterator();
builder.jumpUnless('ELSE');
builder.pushFrame();
builder.returnTo('ITER');
builder.dup(Register.fp, 1);
builder.enterList('BODY');
builder.label('ITER');
builder.iterate('BREAK');
builder.label('BODY');
builder.invokeStatic(template, 2);
builder.pop(2);
builder.exit();
builder.return();
builder.label('BREAK');
builder.exitList();
builder.popFrame();
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('-in-element', function (params, hash, template, _inverse, builder) {
if (!params || params.length !== 1) {
throw new Error('SYNTAX ERROR: #-in-element requires a single argument');
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
if (hash && hash[0].length) {
var keys = hash[0],
values = hash[1];
if (keys.length === 1 && keys[0] === 'nextSibling') {
expr(values[0], builder);
} else {
throw new Error('SYNTAX ERROR: #-in-element does not take a `' + keys[0] + '` option');
}
} else {
expr(null, builder);
}
expr(params[0], builder);
builder.dup();
builder.test('simple');
builder.enter(3);
builder.jumpUnless('ELSE');
builder.pushRemoteElement();
builder.invokeStatic(template);
builder.popRemoteElement();
builder.label('ELSE');
builder.exit();
builder.return();
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('-with-dynamic-vars', function (_params, hash, template, _inverse, builder) {
if (hash) {
var names = hash[0],
expressions = hash[1];
compileList(expressions, builder);
builder.pushDynamicScope();
builder.bindDynamicScope(names);
builder.invokeStatic(template);
builder.popDynamicScope();
} else {
builder.invokeStatic(template);
}
});
return { blocks: blocks, inlines: inlines };
}
export function compileStatement(statement, builder) {
STATEMENTS.compile(statement, builder);
}
export function compileStatements(statements, meta, env) {
var b = new OpcodeBuilder(env, meta);
for (var i = 0; i < statements.length; i++) {
compileStatement(statements[i], b);
}
return b;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zeW50YXgvZnVuY3Rpb25zLmpzIl0sIm5hbWVzIjpbIm1hcCIsImFzc2VydCIsImRpY3QiLCJFTVBUWV9BUlJBWSIsIldpcmVGb3JtYXQiLCJPcGNvZGVCdWlsZGVyIiwiUmVnaXN0ZXIiLCJDbGllbnRTaWRlIiwiUmF3SW5saW5lQmxvY2siLCJPcHMiLCJBVFRSU19CTE9DSyIsIkNvbXBpbGVycyIsIm9mZnNldCIsIm5hbWVzIiwiZnVuY3MiLCJhZGQiLCJuYW1lIiwiZnVuYyIsInB1c2giLCJsZW5ndGgiLCJjb21waWxlIiwic2V4cCIsImJ1aWxkZXIiLCJpbmRleCIsIlNUQVRFTUVOVFMiLCJDTElFTlRfU0lERSIsIlRleHQiLCJ0ZXh0IiwiQ29tbWVudCIsImNvbW1lbnQiLCJDbG9zZUVsZW1lbnQiLCJfc2V4cCIsImNsb3NlRWxlbWVudCIsIkZsdXNoRWxlbWVudCIsImZsdXNoRWxlbWVudCIsIk1vZGlmaWVyIiwiZW52IiwibWV0YSIsInBhcmFtcyIsImhhc2giLCJoYXNNb2RpZmllciIsInRlbXBsYXRlTWV0YSIsImNvbXBpbGVBcmdzIiwibW9kaWZpZXIiLCJsb29rdXBNb2RpZmllciIsIkVycm9yIiwiU3RhdGljQXR0ciIsInZhbHVlIiwibmFtZXNwYWNlIiwic3RhdGljQXR0ciIsIkR5bmFtaWNBdHRyIiwiZHluYW1pY0F0dHIiLCJUcnVzdGluZ0F0dHIiLCJ0cnVzdGluZyIsImV4cHIiLCJkeW5hbWljQXR0ck5TIiwiT3BlbkVsZW1lbnQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwicHVzaENvbXBvbmVudE9wZXJhdGlvbnMiLCJvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zIiwiRGlkQ3JlYXRlRWxlbWVudCIsImRpZENyZWF0ZUVsZW1lbnQiLCJzMCIsIkRpZFJlbmRlckxheW91dCIsImRpZFJlbmRlckxheW91dCIsIkFwcGVuZCIsIm1hY3JvcyIsImlubGluZXMiLCJyZXR1cm5lZCIsImlzR2V0IiwiRSIsImlzTWF5YmVMb2NhbCIsImd1YXJkZWRBcHBlbmQiLCJjYXV0aW91c0FwcGVuZCIsIkJsb2NrIiwiX3RlbXBsYXRlIiwiX2ludmVyc2UiLCJ0ZW1wbGF0ZSIsImludmVyc2UiLCJ0ZW1wbGF0ZUJsb2NrIiwic2NhbiIsImludmVyc2VCbG9jayIsImJsb2NrcyIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJhdHRycyIsImludm9rZSIsInZtIiwibGF5b3V0Iiwic3ltYm9sVGFibGUiLCJzeW1ib2xzIiwiaGFzRXZhbCIsInN0YWNrIiwic2NvcGUiLCJwdXNoUm9vdFNjb3BlIiwiYmluZFNlbGYiLCJwb3AiLCJiaW5kQmxvY2siLCJpbmRleE9mIiwibG9va3VwIiwiJGV2YWwiLCJjYWxsZXJOYW1lcyIsImkiLCJzeW1ib2wiLCJiaW5kU3ltYm9sIiwibnVtUG9zaXRpb25hbEFyZ3MiLCJpbnZlcnNlU3ltYm9sIiwiZGVmYXVsdFN5bWJvbCIsImRlZmF1bHRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJwdXNoRnJhbWUiLCJjYWxsIiwiaGFuZGxlIiwidG9KU09OIiwiR2xpbW1lckRlYnVnIiwiQ29tcG9uZW50IiwidGFnIiwiYXJncyIsImJsb2NrIiwiaGFzQ29tcG9uZW50RGVmaW5pdGlvbiIsImNoaWxkIiwiYXR0cnNCbG9jayIsImRlZmluaXRpb24iLCJnZXRDb21wb25lbnREZWZpbml0aW9uIiwicHVzaENvbXBvbmVudE1hbmFnZXIiLCJpbnZva2VDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwic3RtdHMiLCJzdGF0ZW1lbnRzIiwiUGFydGlhbEludm9rZXIiLCJvdXRlclN5bWJvbHMiLCJldmFsSW5mbyIsIl9wYXJ0aWFsIiwicGFydGlhbCIsInBhcnRpYWxTeW1ib2xzIiwib3V0ZXJTY29wZSIsInBhcnRpYWxTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsImdldENhbGxlclNjb3BlIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0U2VsZiIsImxvY2FscyIsInNsb3QiLCJyZWYiLCJnZXRTeW1ib2wiLCJldmFsU2NvcGUiLCJ1bmRlZmluZWQiLCJiaW5kIiwiYmluZFBhcnRpYWxNYXAiLCJQYXJ0aWFsIiwiaGVscGVyIiwibmFtZVJlZiIsInBvc2l0aW9uYWwiLCJhdCIsIm4iLCJoYXNQYXJ0aWFsIiwibG9va3VwUGFydGlhbCIsIlN0cmluZyIsInN0YXJ0TGFiZWxzIiwicmV0dXJuVG8iLCJwdXNoSW1tZWRpYXRlIiwicHVzaEFyZ3MiLCJkdXAiLCJ0ZXN0IiwiZW50ZXIiLCJqdW1wVW5sZXNzIiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwiY29tcGlsZUR5bmFtaWNCbG9jayIsImludm9rZUR5bmFtaWMiLCJwb3BTY29wZSIsInBvcEZyYW1lIiwibGFiZWwiLCJleGl0IiwicmV0dXJuIiwic3RvcExhYmVscyIsIkludm9rZUR5bmFtaWNZaWVsZCIsImNhbGxlckNvdW50IiwicHVzaENhbGxlclNjb3BlIiwidGFibGUiLCJjYWxsZWVDb3VudCIsImNvdW50IiwiTWF0aCIsIm1pbiIsImZyb21CYXNlIiwiWWllbGQiLCJ0byIsImNvbXBpbGVMaXN0IiwiZ2V0QmxvY2siLCJEZWJ1Z2dlciIsImRlYnVnZ2VyIiwiQ2xpZW50U2lkZVN0YXRlbWVudCIsIkVYUFJFU1NJT05TIiwiQ0xJRU5UX1NJREVfRVhQUlMiLCJFeHByZXNzaW9ucyIsImV4cHJlc3Npb24iLCJBcnJheSIsImlzQXJyYXkiLCJwcmltaXRpdmUiLCJVbmtub3duIiwiaGFzSGVscGVyIiwiSGVscGVyIiwiYXNQYXJ0aWFsIiwicmVzb2x2ZU1heWJlTG9jYWwiLCJnZXRWYXJpYWJsZSIsImdldFByb3BlcnR5IiwiQ29uY2F0IiwicGFydHMiLCJjb25jYXQiLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJmdW5jdGlvbiIsImxvb2t1cEhlbHBlciIsIkdldCIsImhlYWQiLCJwYXRoIiwiTWF5YmVMb2NhbCIsInNsaWNlIiwiVW5kZWZpbmVkIiwiSGFzQmxvY2siLCJoYXNCbG9jayIsIkhhc0Jsb2NrUGFyYW1zIiwiaGFzQmxvY2tQYXJhbXMiLCJDbGllbnRTaWRlRXhwcmVzc2lvbiIsIkJsb2NrcyIsImFkZE1pc3NpbmciLCJtaXNzaW5nIiwiaGFuZGxlZCIsIkJMT0NLUyIsIklubGluZXMiLCJJTkxJTkVTIiwicG9wdWxhdGVCdWlsdGlucyIsIl9oYXNoIiwiaW52b2tlU3RhdGljIiwianVtcCIsImp1bXBJZiIsInB1dEl0ZXJhdG9yIiwiZnAiLCJlbnRlckxpc3QiLCJpdGVyYXRlIiwiZXhpdExpc3QiLCJrZXlzIiwidmFsdWVzIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiX3BhcmFtcyIsImV4cHJlc3Npb25zIiwicHVzaER5bmFtaWNTY29wZSIsImJpbmREeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJjb21waWxlU3RhdGVtZW50Iiwic3RhdGVtZW50IiwiY29tcGlsZVN0YXRlbWVudHMiLCJiIl0sIm1hcHBpbmdzIjoiOztBQUFBLFNBQVNBLEdBQVQsUUFBb0Isb0JBQXBCO0FBQ0EsU0FBU0MsTUFBVCxFQUFpQkMsSUFBakIsRUFBdUJDLFdBQXZCLFFBQWtELGVBQWxEO0FBQ0EsT0FBTyxLQUFLQyxVQUFaLE1BQTRCLHNCQUE1QjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsNkJBQTFCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QixZQUF6QjtBQUNBLE9BQU8sS0FBS0MsVUFBWixNQUE0Qix1QkFBNUI7QUFDQSxPQUFPQyxjQUFQLE1BQTJCLGFBQTNCO0FBQ0EsSUFBSUMsTUFBTUwsV0FBV0ssR0FBckI7QUFDQSxPQUFPLElBQU1DLGNBQWMsUUFBcEI7O0lBQ0RDLFM7QUFDRix5QkFBd0I7QUFBQSxZQUFaQyxNQUFZLHVFQUFILENBQUc7O0FBQUE7O0FBQ3BCLGFBQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNBLGFBQUtDLEtBQUwsR0FBYVgsTUFBYjtBQUNBLGFBQUtZLEtBQUwsR0FBYSxFQUFiO0FBQ0g7O3dCQUNEQyxHLGdCQUFJQyxJLEVBQU1DLEksRUFBTTtBQUNaLGFBQUtILEtBQUwsQ0FBV0ksSUFBWCxDQUFn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