@glimmer/compiler
Version:
682 lines (597 loc) • 78.5 kB
JavaScript
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import TemplateVisitor from './template-visitor';
import JavaScriptCompiler from './javascript-compiler';
import { assert } from '@glimmer/util';
import { isLiteral, SyntaxError } from '@glimmer/syntax';
import { getAttrNamespace } from './utils';
import { SymbolAllocator } from './allocate-symbols';
import { locationToOffset } from './location';
function isTrustedValue(value) {
return value.escaped !== undefined && !value.escaped;
}
export var THIS = 0;
var TemplateCompiler = function () {
function TemplateCompiler(source) {
_classCallCheck(this, TemplateCompiler);
this.source = source;
this.templateId = 0;
this.templateIds = [];
this.opcodes = [];
this.locations = [];
this.includeMeta = true;
}
TemplateCompiler.compile = function compile(ast, source, options) {
var templateVisitor = new TemplateVisitor();
templateVisitor.visit(ast);
var compiler = new TemplateCompiler(source);
var _compiler$process = compiler.process(templateVisitor.actions),
opcodes = _compiler$process.opcodes,
templateLocations = _compiler$process.locations;
var _process = new SymbolAllocator(opcodes, templateLocations).process(),
ops = _process.ops,
allocationLocations = _process.locations;
var out = JavaScriptCompiler.process(ops, allocationLocations, ast.symbols, options);
if (false) {
console.log('Template ->', out);
}
return out;
};
TemplateCompiler.prototype.process = function process(actions) {
var _this = this;
actions.forEach(function (_ref) {
var name = _ref[0],
args = _ref[1];
if (!_this[name]) {
throw new Error('Unimplemented ' + name + ' on TemplateCompiler');
}
_this[name](args);
});
return { opcodes: this.opcodes, locations: this.locations };
};
TemplateCompiler.prototype.startProgram = function startProgram(_ref2) {
var program = _ref2[0];
this.opcode(['startProgram', program], program);
};
TemplateCompiler.prototype.endProgram = function endProgram() {
this.opcode(['endProgram'], null);
};
TemplateCompiler.prototype.startBlock = function startBlock(_ref3) {
var program = _ref3[0];
this.templateId++;
this.opcode(['startBlock', program], program);
};
TemplateCompiler.prototype.endBlock = function endBlock() {
this.templateIds.push(this.templateId - 1);
this.opcode(['endBlock'], null);
};
TemplateCompiler.prototype.text = function text(_ref4) {
var action = _ref4[0];
this.opcode(['text', action.chars], action);
};
TemplateCompiler.prototype.comment = function comment(_ref5) {
var action = _ref5[0];
this.opcode(['comment', action.value], action);
};
TemplateCompiler.prototype.openElement = function openElement(_ref6) {
var action = _ref6[0];
var attributes = action.attributes;
var simple = true;
for (var i = 0; i < attributes.length; i++) {
var attr = attributes[i];
if (attr.name === '...attributes') {
simple = false;
break;
}
}
if (action.modifiers.length > 0) {
simple = false;
}
var actionIsComponent = false;
var dynamic = destructureDynamicComponent(action);
if (dynamic) {
this.expression(dynamic, "ComponentHead" /* ComponentHead */, action);
this.opcode(['openComponent', action], action);
actionIsComponent = true;
} else if (isNamedBlock(action)) {
this.opcode(['openNamedBlock', action], action);
} else if (isComponent(action)) {
this.opcode(['openComponent', action], action);
actionIsComponent = true;
} else {
this.opcode(['openElement', [action, simple]], action);
}
if (!isNamedBlock(action)) {
// TODO: Assert no attributes
var typeAttr = null;
var attrs = action.attributes;
for (var _i = 0; _i < attrs.length; _i++) {
if (attrs[_i].name === 'type') {
typeAttr = attrs[_i];
continue;
}
this.attribute([attrs[_i]], !simple || actionIsComponent);
}
if (typeAttr) {
this.attribute([typeAttr], !simple || actionIsComponent);
}
for (var _i2 = 0; _i2 < action.modifiers.length; _i2++) {
this.modifier([action.modifiers[_i2]]);
}
this.opcode(['flushElement', action], null);
}
};
TemplateCompiler.prototype.closeElement = function closeElement(_ref7) {
var action = _ref7[0];
if (isNamedBlock(action)) {
this.opcode(['closeNamedBlock', action]);
} else if (destructureDynamicComponent(action)) {
this.opcode(['closeDynamicComponent', action], action);
} else if (isComponent(action)) {
this.opcode(['closeComponent', action], action);
} else {
this.opcode(['closeElement', action], action);
}
};
TemplateCompiler.prototype.attribute = function attribute(_ref8, isComponent) {
var action = _ref8[0];
var name = action.name,
value = action.value;
var namespace = getAttrNamespace(name);
var isStatic = this.prepareAttributeValue(value);
if (name.charAt(0) === '@') {
// Arguments
if (isStatic) {
this.opcode(['staticArg', name], action);
} else if (action.value.type === 'MustacheStatement') {
this.opcode(['dynamicArg', name], action);
} else {
this.opcode(['dynamicArg', name], action);
}
} else {
var isTrusting = isTrustedValue(value);
if (isStatic && name === '...attributes') {
this.opcode(['attrSplat'], action);
} else if (isStatic && !isComponent) {
this.opcode(['staticAttr', [name, namespace]], action);
} else if (isTrusting) {
this.opcode(isComponent ? ['trustingComponentAttr', [name, namespace]] : ['trustingAttr', [name, namespace]], action);
} else if (action.value.type === 'MustacheStatement') {
this.opcode(isComponent ? ['componentAttr', [name, namespace]] : ['dynamicAttr', [name, namespace]], action);
} else {
this.opcode(isComponent ? ['componentAttr', [name, namespace]] : ['dynamicAttr', [name, namespace]], action);
}
}
};
TemplateCompiler.prototype.modifier = function modifier(_ref9) {
var action = _ref9[0];
this.prepareHelper(action, 'modifier');
this.expression(action.path, "ModifierHead" /* ModifierHead */, action);
this.opcode(['modifier'], action);
};
TemplateCompiler.prototype.mustache = function mustache(_ref10) {
var _mustache = _ref10[0];
var path = _mustache.path;
if (isLiteral(path)) {
this.expression(_mustache.path, "Expression" /* Expression */, _mustache);
this.opcode(['append', !_mustache.escaped], _mustache);
} else if (path.type !== 'PathExpression') {
throw new SyntaxError('Expected PathExpression, got ' + path.type, path.loc);
} else if (isYield(path)) {
var to = assertValidYield(_mustache);
this.yield(to, _mustache);
} else if (isPartial(path)) {
var params = assertValidPartial(_mustache);
this.partial(params, _mustache);
} else if (isDebugger(path)) {
assertValidDebuggerUsage(_mustache);
this.debugger('debugger', _mustache);
} else if (isKeyword(_mustache)) {
this.keyword(_mustache);
this.opcode(['append', !_mustache.escaped], _mustache);
} else if (isHelperInvocation(_mustache)) {
this.prepareHelper(_mustache, 'helper');
this.expression(_mustache.path, "CallHead" /* CallHead */, _mustache.path);
this.opcode(['helper'], _mustache);
this.opcode(['append', !_mustache.escaped], _mustache);
} else {
this.expression(_mustache.path, mustacheContext(_mustache.path), _mustache);
this.opcode(['append', !_mustache.escaped], _mustache);
}
};
TemplateCompiler.prototype.block = function block(_ref11) {
var action /*, index, count*/ = _ref11[0];
this.prepareHelper(action, 'block');
var templateId = this.templateIds.pop();
var inverseId = action.inverse === null ? null : this.templateIds.pop();
this.expression(action.path, "BlockHead" /* BlockHead */, action);
this.opcode(['block', [templateId, inverseId]], action);
};
/// Internal actions, not found in the original processed actions
// private path(head: string, rest: string[], context: ExpressionContext, loc: AST.BaseNode) {
// if (head[0] === '@') {
// this.argPath(head, rest, loc);
// } else {
// this.varPath(head, rest, context, loc);
// }
// }
TemplateCompiler.prototype.argPath = function argPath(head, rest, loc) {
this.opcode(['getArg', head], loc);
this.opcode(['getPath', rest], loc);
};
TemplateCompiler.prototype.varPath = function varPath(head, rest, context, loc) {
this.opcode(['getVar', [head, context]], loc);
this.opcode(['getPath', rest], loc);
};
TemplateCompiler.prototype.thisPath = function thisPath(rest, loc) {
this.opcode(['getThis'], loc);
this.opcode(['getPath', rest], loc);
};
TemplateCompiler.prototype.expression = function expression(path, context, expr) {
if (isLiteral(path)) {
this.opcode(['literal', path.value], expr);
} else if (path.type !== 'PathExpression') {
throw new SyntaxError('Expected PathExpression, got ' + path.type, path.loc);
} else if (isKeyword(expr)) {
this.keyword(expr);
} else {
this.path(path, context);
}
};
/// Internal Syntax
TemplateCompiler.prototype.yield = function _yield(to, action) {
this.prepareParams(action.params);
this.opcode(['yield', to], action);
};
TemplateCompiler.prototype.debugger = function _debugger(_name, action) {
this.opcode(['debugger', null], action);
};
TemplateCompiler.prototype.hasBlock = function hasBlock(name, action) {
this.opcode(['hasBlock', name], action);
};
TemplateCompiler.prototype.hasBlockParams = function hasBlockParams(name, action) {
this.opcode(['hasBlockParams', name], action);
};
TemplateCompiler.prototype.partial = function partial(_params, action) {
this.prepareParams(action.params);
this.opcode(['partial'], action);
};
TemplateCompiler.prototype.keyword = function keyword(action) {
var path = action.path;
if (isHasBlock(path)) {
var name = assertValidHasBlockUsage(path.original, action);
this.hasBlock(name, action);
} else if (isHasBlockParams(path)) {
var _name2 = assertValidHasBlockUsage(path.original, action);
this.hasBlockParams(_name2, action);
}
};
/// Expressions, invoked recursively from prepareParams and prepareHash
TemplateCompiler.prototype.SubExpression = function SubExpression(expr) {
if (isKeyword(expr)) {
this.keyword(expr);
} else {
this.prepareHelper(expr, 'helper');
this.expression(expr.path, "CallHead" /* CallHead */, expr);
this.opcode(['helper']);
}
};
TemplateCompiler.prototype.PathExpression = function PathExpression(expr) {
this.path(expr, "Expression" /* Expression */);
};
TemplateCompiler.prototype.path = function path(expr, context) {
var _expr$parts = expr.parts,
head = _expr$parts[0],
rest = _expr$parts.slice(1);
if (expr.data) {
this.argPath('@' + head, rest, expr);
} else if (expr.this) {
this.thisPath(expr.parts, expr);
} else {
this.varPath(head, rest, context, expr);
}
};
TemplateCompiler.prototype.StringLiteral = function StringLiteral(action) {
this.opcode(['literal', action.value], action);
};
TemplateCompiler.prototype.BooleanLiteral = function BooleanLiteral(action) {
this.opcode(['literal', action.value], action);
};
TemplateCompiler.prototype.NumberLiteral = function NumberLiteral(action) {
this.opcode(['literal', action.value], action);
};
TemplateCompiler.prototype.NullLiteral = function NullLiteral(action) {
this.opcode(['literal', action.value], action);
};
TemplateCompiler.prototype.UndefinedLiteral = function UndefinedLiteral(action) {
this.opcode(['literal', action.value], action);
};
/// Utilities
TemplateCompiler.prototype.opcode = function opcode(_opcode) {
var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
if (action) {
this.locations.push(this.location(action));
} else {
this.locations.push(null);
}
if (this.includeMeta && action) {
_opcode.push(this.meta(action));
}
this.opcodes.push(_opcode);
};
TemplateCompiler.prototype.helperCall = function helperCall(call, node) {
this.prepareHelper(call, 'helper');
this.expression(call.path, "CallHead" /* CallHead */, node);
this.opcode(['helper'], node);
};
TemplateCompiler.prototype.mustacheCall = function mustacheCall(call) {
this.prepareHelper(call, 'helper');
this.expression(call.path, "CallHead" /* CallHead */, call);
this.opcode(['helper'], call);
};
TemplateCompiler.prototype.prepareHelper = function prepareHelper(expr, context) {
assertIsSimplePath(expr.path, expr.loc, context);
var params = expr.params,
hash = expr.hash;
this.prepareHash(hash);
this.prepareParams(params);
};
TemplateCompiler.prototype.prepareParams = function prepareParams(params) {
if (!params.length) {
this.opcode(['literal', null], null);
return;
}
for (var i = params.length - 1; i >= 0; i--) {
var param = params[i];
false && assert(this[param.type], 'Unimplemented ' + param.type + ' on TemplateCompiler');
this[param.type](param);
}
this.opcode(['prepareArray', params.length], null);
};
TemplateCompiler.prototype.prepareHash = function prepareHash(hash) {
var pairs = hash.pairs;
if (!pairs.length) {
this.opcode(['literal', null], null);
return;
}
for (var i = pairs.length - 1; i >= 0; i--) {
var _pairs$i = pairs[i],
key = _pairs$i.key,
value = _pairs$i.value;
false && assert(this[value.type], 'Unimplemented ' + value.type + ' on TemplateCompiler');
this[value.type](value);
this.opcode(['literal', key], null);
}
this.opcode(['prepareObject', pairs.length], null);
};
TemplateCompiler.prototype.prepareAttributeValue = function prepareAttributeValue(value) {
// returns the static value if the value is static
if (value.type === 'ConcatStatement') {
this.prepareConcatParts(value.parts);
this.opcode(['concat'], value);
return false;
} else {
return this.mustacheAttrValue(value);
}
};
TemplateCompiler.prototype.prepareConcatParts = function prepareConcatParts(parts) {
for (var i = parts.length - 1; i >= 0; i--) {
var part = parts[i];
this.mustacheAttrValue(part);
}
this.opcode(['prepareArray', parts.length], null);
};
TemplateCompiler.prototype.mustacheAttrValue = function mustacheAttrValue(value) {
if (value.type === 'TextNode') {
this.opcode(['literal', value.chars]);
return true;
} else if (isKeyword(value)) {
this.keyword(value);
} else if (isHelperInvocation(value)) {
this.prepareHelper(value, 'helper');
this.expression(value.path, "CallHead" /* CallHead */, value);
this.opcode(['helper'], value);
} else {
this.expression(value.path, "AppendSingleId" /* AppendSingleId */, value);
}
return false;
};
TemplateCompiler.prototype.meta = function meta(node) {
var loc = node.loc;
if (!loc) {
return [];
}
var source = loc.source,
start = loc.start,
end = loc.end;
return ['loc', [source || null, [start.line, start.column], [end.line, end.column]]];
};
TemplateCompiler.prototype.location = function location(node) {
var loc = node.loc;
if (!loc) return null;
var source = loc.source,
start = loc.start,
end = loc.end;
var startOffset = locationToOffset(this.source, start.line - 1, start.column);
var endOffset = locationToOffset(this.source, end.line - 1, end.column);
if (startOffset === null || endOffset === null) {
// Should this be an assertion?
return null;
}
return {
source: source || null,
start: startOffset,
end: endOffset
};
};
return TemplateCompiler;
}();
export default TemplateCompiler;
function isHelperInvocation(mustache) {
if (mustache.type !== 'SubExpression' && mustache.type !== 'MustacheStatement') {
return false;
}
return mustache.params && mustache.params.length > 0 || mustache.hash && mustache.hash.pairs.length > 0;
}
function isSimplePath(_ref12) {
var parts = _ref12.parts;
return parts.length === 1;
}
function isYield(path) {
return path.original === 'yield';
}
function isPartial(path) {
return path.original === 'partial';
}
function isDebugger(path) {
return path.original === 'debugger';
}
function isHasBlock(path) {
if (path.type !== 'PathExpression') return false;
return path.original === 'has-block';
}
function isHasBlockParams(path) {
if (path.type !== 'PathExpression') return false;
return path.original === 'has-block-params';
}
function isKeyword(node) {
if (isCall(node)) {
return isHasBlock(node.path) || isHasBlockParams(node.path);
} else if (isPath(node)) {
return isHasBlock(node) || isHasBlockParams(node);
} else {
return false;
}
}
function isCall(node) {
return node.type === 'SubExpression' || node.type === 'MustacheStatement';
}
function isPath(node) {
return node.type === 'PathExpression';
}
function destructureDynamicComponent(element) {
var open = element.tag.charAt(0);
var _element$tag$split = element.tag.split('.'),
maybeLocal = _element$tag$split[0],
rest = _element$tag$split.slice(1);
var isNamedArgument = open === '@';
var isLocal = element.symbols.has(maybeLocal);
var isThisPath = maybeLocal === 'this';
if (isLocal) {
return {
type: 'PathExpression',
data: false,
parts: [maybeLocal].concat(rest),
this: false,
original: element.tag,
loc: element.loc
};
} else if (isNamedArgument) {
return {
type: 'PathExpression',
data: true,
parts: [maybeLocal.slice(1)].concat(rest),
this: false,
original: element.tag,
loc: element.loc
};
} else if (isThisPath) {
return {
type: 'PathExpression',
data: false,
parts: rest,
this: true,
original: element.tag,
loc: element.loc
};
} else {
return null;
}
}
function isComponent(element) {
var open = element.tag.charAt(0);
var isPath = element.tag.indexOf('.') > -1;
var isUpperCase = open === open.toUpperCase() && open !== open.toLowerCase();
return isUpperCase && !isPath || !!destructureDynamicComponent(element);
}
function isNamedBlock(element) {
var open = element.tag.charAt(0);
return open === ':';
}
function assertIsSimplePath(path, loc, context) {
if (path.type !== 'PathExpression') {
throw new SyntaxError('`' + path.type + '` is not a valid ' + context + ' on line ' + loc.start.line + '.', path.loc);
}
if (!isSimplePath(path)) {
throw new SyntaxError('`' + path.original + '` is not a valid name for a ' + context + ' on line ' + loc.start.line + '.', path.loc);
}
}
function assertValidYield(statement) {
var pairs = statement.hash.pairs;
if (pairs.length === 1 && pairs[0].key !== 'to' || pairs.length > 1) {
throw new SyntaxError('yield only takes a single named argument: \'to\'', statement.loc);
} else if (pairs.length === 1 && pairs[0].value.type !== 'StringLiteral') {
throw new SyntaxError('you can only yield to a literal value', statement.loc);
} else if (pairs.length === 0) {
return 'default';
} else {
return pairs[0].value.value;
}
}
function assertValidPartial(statement) {
var params = statement.params,
hash = statement.hash,
escaped = statement.escaped,
loc = statement.loc;
if (params && params.length !== 1) {
throw new SyntaxError('Partial found with no arguments. You must specify a template name. (on line ' + loc.start.line + ')', statement.loc);
} else if (hash && hash.pairs.length > 0) {
throw new SyntaxError('partial does not take any named arguments (on line ' + loc.start.line + ')', statement.loc);
} else if (!escaped) {
throw new SyntaxError('{{{partial ...}}} is not supported, please use {{partial ...}} instead (on line ' + loc.start.line + ')', statement.loc);
}
return params;
}
function assertValidHasBlockUsage(type, call) {
var params = call.params,
hash = call.hash,
loc = call.loc;
if (hash && hash.pairs.length > 0) {
throw new SyntaxError(type + ' does not take any named arguments', call.loc);
}
if (params.length === 0) {
return 'default';
} else if (params.length === 1) {
var param = params[0];
if (param.type === 'StringLiteral') {
return param.value;
} else {
throw new SyntaxError('you can only yield to a literal value (on line ' + loc.start.line + ')', call.loc);
}
} else {
throw new SyntaxError(type + ' only takes a single positional argument (on line ' + loc.start.line + ')', call.loc);
}
}
function assertValidDebuggerUsage(statement) {
var params = statement.params,
hash = statement.hash;
if (hash && hash.pairs.length > 0) {
throw new SyntaxError('debugger does not take any named arguments', statement.loc);
}
if (params.length === 0) {
return 'default';
} else {
throw new SyntaxError('debugger does not take any positional arguments', statement.loc);
}
}
function mustacheContext(body) {
if (body.type === 'PathExpression') {
if (body.parts.length > 1 || body.data) {
return "Expression" /* Expression */;
} else {
return "AppendSingleId" /* AppendSingleId */;
}
} else {
return "Expression" /* Expression */;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi90ZW1wbGF0ZS1jb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQUEsZUFBQSxNQUFBLG9CQUFBO0FBQ0EsT0FBQSxrQkFBQSxNQUFBLHVCQUFBO0FBQ0EsU0FBQSxNQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsU0FBQSxFQUFBLFdBQUEsUUFBQSxpQkFBQTtBQUNBLFNBQUEsZ0JBQUEsUUFBQSxTQUFBO0FBQ0EsU0FBQSxlQUFBLFFBQUEsb0JBQUE7O0FBSUEsU0FBQSxnQkFBQSxRQUFBLFlBQUE7QUFPQSxTQUFBLGNBQUEsQ0FBQSxLQUFBLEVBQWtDO0FBQ2hDLFdBQU8sTUFBQSxPQUFBLEtBQUEsU0FBQSxJQUErQixDQUFDLE1BQXZDLE9BQUE7QUFDRDtBQUVELE9BQU8sSUFBTSxPQUFOLENBQUE7O0lBRU8sZ0I7QUFxQlosOEJBQUEsTUFBQSxFQUFrQztBQUFBOztBQUFkLGFBQUEsTUFBQSxHQUFBLE1BQUE7QUFFWixhQUFBLFVBQUEsR0FBQSxDQUFBO0FBQ0EsYUFBQSxXQUFBLEdBQUEsRUFBQTtBQUNBLGFBQUEsT0FBQSxHQUFBLEVBQUE7QUFDQSxhQUFBLFNBQUEsR0FBQSxFQUFBO0FBQ0EsYUFBQSxXQUFBLEdBQUEsSUFBQTtBQU44Qjs7cUJBcEJ0QyxPLG9CQUFBLEcsRUFBQSxNLEVBQUEsTyxFQUEwRTtBQUN4RSxZQUFJLGtCQUFrQixJQUF0QixlQUFzQixFQUF0QjtBQUNBLHdCQUFBLEtBQUEsQ0FBQSxHQUFBO0FBRUEsWUFBSSxXQUFXLElBQUEsZ0JBQUEsQ0FBZixNQUFlLENBQWY7O0FBSndFLGdDQUt4QixTQUFBLE9BQUEsQ0FBaUIsZ0JBQWpFLE9BQWdELENBTHdCO0FBQUEsWUFLcEUsT0FMb0UscUJBS3BFLE9BTG9FO0FBQUEsWUFLcEUsaUJBTG9FLHFCQUt6RCxTQUx5RDs7QUFBQSx1QkFNMUIsSUFBQSxlQUFBLENBQUEsT0FBQSxFQUFBLGlCQUFBLEVBQTlDLE9BQThDLEVBTjBCO0FBQUEsWUFNcEUsR0FOb0UsWUFNcEUsR0FOb0U7QUFBQSxZQU1wRSxtQkFOb0UsWUFNN0QsU0FONkQ7O0FBV3hFLFlBQUksTUFBTSxtQkFBQSxPQUFBLENBQUEsR0FBQSxFQUFBLG1CQUFBLEVBQXFELElBQXJELE9BQUEsRUFBVixPQUFVLENBQVY7QUFFQSxZQUFBLEtBQUEsRUFBVztBQUNULG9CQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUNEO0FBRUQsZUFBQSxHQUFBO0FBQ0QsSzs7K0JBVUQsTyxvQkFBQSxPLEVBQ21CO0FBQUE7O0FBRWpCLGdCQUFBLE9BQUEsQ0FBZ0IsZ0JBQWlCO0FBQUEsZ0JBQWhCLElBQWdCO0FBQUEsZ0JBQWpCLElBQWlCOztBQUMvQixnQkFBSSxDQUFDLE1BQUwsSUFBSyxDQUFMLEVBQWlCO0FBQ2Ysc0JBQU0sSUFBQSxLQUFBLG9CQUFOLElBQU0sMEJBQU47QUFDRDtBQUNELGtCQUFBLElBQUEsRUFBQSxJQUFBO0FBSkYsU0FBQTtBQU1BLGVBQU8sRUFBRSxTQUFTLEtBQVgsT0FBQSxFQUF5QixXQUFXLEtBQTNDLFNBQU8sRUFBUDtBQUNELEs7OytCQUVELFksZ0NBQXNDO0FBQUEsWUFBdEMsT0FBc0M7O0FBQ3BDLGFBQUEsTUFBQSxDQUFZLENBQUEsY0FBQSxFQUFaLE9BQVksQ0FBWixFQUFBLE9BQUE7QUFDRCxLOzsrQkFFRCxVLHlCQUFVO0FBQ1IsYUFBQSxNQUFBLENBQVksQ0FBWixZQUFZLENBQVosRUFBQSxJQUFBO0FBQ0QsSzs7K0JBRUQsVSw4QkFBaUM7QUFBQSxZQUFqQyxPQUFpQzs7QUFDL0IsYUFBQSxVQUFBO0FBQ0EsYUFBQSxNQUFBLENBQVksQ0FBQSxZQUFBLEVBQVosT0FBWSxDQUFaLEVBQUEsT0FBQTtBQUNELEs7OytCQUVELFEsdUJBQVE7QUFDTixhQUFBLFdBQUEsQ0FBQSxJQUFBLENBQXNCLEtBQUEsVUFBQSxHQUF0QixDQUFBO0FBQ0EsYUFBQSxNQUFBLENBQVksQ0FBWixVQUFZLENBQVosRUFBQSxJQUFBO0FBQ0QsSzs7K0JBRUQsSSx3QkFBNkI7QUFBQSxZQUE3QixNQUE2Qjs7QUFDM0IsYUFBQSxNQUFBLENBQVksQ0FBQSxNQUFBLEVBQVMsT0FBckIsS0FBWSxDQUFaLEVBQUEsTUFBQTtBQUNELEs7OytCQUVELE8sMkJBQXdDO0FBQUEsWUFBeEMsTUFBd0M7O0FBQ3RDLGFBQUEsTUFBQSxDQUFZLENBQUEsU0FBQSxFQUFZLE9BQXhCLEtBQVksQ0FBWixFQUFBLE1BQUE7QUFDRCxLOzsrQkFFRCxXLCtCQUF1QztBQUFBLFlBQXZDLE1BQXVDOztBQUNyQyxZQUFJLGFBQWEsT0FBakIsVUFBQTtBQUNBLFlBQUksU0FBSixJQUFBO0FBRUEsYUFBSyxJQUFJLElBQVQsQ0FBQSxFQUFnQixJQUFJLFdBQXBCLE1BQUEsRUFBQSxHQUFBLEVBQTRDO0FBQzFDLGdCQUFJLE9BQU8sV0FBWCxDQUFXLENBQVg7QUFDQSxnQkFBSSxLQUFBLElBQUEsS0FBSixlQUFBLEVBQW1DO0FBQ2pDLHlCQUFBLEtBQUE7QUFDQTtBQUNEO0FBQ0Y7QUFFRCxZQUFJLE9BQUEsU0FBQSxDQUFBLE1BQUEsR0FBSixDQUFBLEVBQWlDO0FBQy9CLHFCQUFBLEtBQUE7QUFDRDtBQUVELFlBQUksb0JBQUosS0FBQTtBQUVBLFlBQUksVUFBVSw0QkFBZCxNQUFjLENBQWQ7QUFFQSxZQUFBLE9BQUEsRUFBYTtBQUNYLGlCQUFBLFVBQUEsQ0FBQSxPQUFBLEVBQUEsZUFBQSxDQUFBLG1CQUFBLEVBQUEsTUFBQTtBQUNBLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGVBQUEsRUFBWixNQUFZLENBQVosRUFBQSxNQUFBO0FBQ0EsZ0NBQUEsSUFBQTtBQUhGLFNBQUEsTUFJTyxJQUFJLGFBQUosTUFBSSxDQUFKLEVBQTBCO0FBQy9CLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGdCQUFBLEVBQVosTUFBWSxDQUFaLEVBQUEsTUFBQTtBQURLLFNBQUEsTUFFQSxJQUFJLFlBQUosTUFBSSxDQUFKLEVBQXlCO0FBQzlCLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGVBQUEsRUFBWixNQUFZLENBQVosRUFBQSxNQUFBO0FBQ0EsZ0NBQUEsSUFBQTtBQUZLLFNBQUEsTUFHQTtBQUNMLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGFBQUEsRUFBZ0IsQ0FBQSxNQUFBLEVBQTVCLE1BQTRCLENBQWhCLENBQVosRUFBQSxNQUFBO0FBQ0Q7QUFFRCxZQUFJLENBQUMsYUFBTCxNQUFLLENBQUwsRUFBMkI7QUFDekI7QUFDQSxnQkFBSSxXQUFKLElBQUE7QUFDQSxnQkFBSSxRQUFRLE9BQVosVUFBQTtBQUNBLGlCQUFLLElBQUksS0FBVCxDQUFBLEVBQWdCLEtBQUksTUFBcEIsTUFBQSxFQUFBLElBQUEsRUFBdUM7QUFDckMsb0JBQUksTUFBQSxFQUFBLEVBQUEsSUFBQSxLQUFKLE1BQUEsRUFBOEI7QUFDNUIsK0JBQVcsTUFBWCxFQUFXLENBQVg7QUFDQTtBQUNEO0FBQ0QscUJBQUEsU0FBQSxDQUFlLENBQUMsTUFBaEIsRUFBZ0IsQ0FBRCxDQUFmLEVBQTJCLENBQUEsTUFBQSxJQUEzQixpQkFBQTtBQUNEO0FBRUQsZ0JBQUEsUUFBQSxFQUFjO0FBQ1oscUJBQUEsU0FBQSxDQUFlLENBQWYsUUFBZSxDQUFmLEVBQTJCLENBQUEsTUFBQSxJQUEzQixpQkFBQTtBQUNEO0FBRUQsaUJBQUssSUFBSSxNQUFULENBQUEsRUFBZ0IsTUFBSSxPQUFBLFNBQUEsQ0FBcEIsTUFBQSxFQUFBLEtBQUEsRUFBa0Q7QUFDaEQscUJBQUEsUUFBQSxDQUFjLENBQUMsT0FBQSxTQUFBLENBQWYsR0FBZSxDQUFELENBQWQ7QUFDRDtBQUVELGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGNBQUEsRUFBWixNQUFZLENBQVosRUFBQSxJQUFBO0FBQ0Q7QUFDRixLOzsrQkFFRCxZLGdDQUF3QztBQUFBLFlBQXhDLE1BQXdDOztBQUN0QyxZQUFJLGFBQUosTUFBSSxDQUFKLEVBQTBCO0FBQ3hCLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGlCQUFBLEVBQVosTUFBWSxDQUFaO0FBREYsU0FBQSxNQUVPLElBQUksNEJBQUosTUFBSSxDQUFKLEVBQXlDO0FBQzlDLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLHVCQUFBLEVBQVosTUFBWSxDQUFaLEVBQUEsTUFBQTtBQURLLFNBQUEsTUFFQSxJQUFJLFlBQUosTUFBSSxDQUFKLEVBQXlCO0FBQzlCLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGdCQUFBLEVBQVosTUFBWSxDQUFaLEVBQUEsTUFBQTtBQURLLFNBQUEsTUFFQTtBQUNMLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLGNBQUEsRUFBWixNQUFZLENBQVosRUFBQSxNQUFBO0FBQ0Q7QUFDRixLOzsrQkFFRCxTLDZCQUFBLFcsRUFBd0Q7QUFBQSxZQUF4RCxNQUF3RDtBQUFBLFlBQ2xELElBRGtELEdBQ3RELE1BRHNELENBQ2xELElBRGtEO0FBQUEsWUFDbEQsS0FEa0QsR0FDdEQsTUFEc0QsQ0FDbEQsS0FEa0Q7O0FBR3RELFlBQUksWUFBWSxpQkFBaEIsSUFBZ0IsQ0FBaEI7QUFDQSxZQUFJLFdBQVcsS0FBQSxxQkFBQSxDQUFmLEtBQWUsQ0FBZjtBQUVBLFlBQUksS0FBQSxNQUFBLENBQUEsQ0FBQSxNQUFKLEdBQUEsRUFBNEI7QUFDMUI7QUFDQSxnQkFBQSxRQUFBLEVBQWM7QUFDWixxQkFBQSxNQUFBLENBQVksQ0FBQSxXQUFBLEVBQVosSUFBWSxDQUFaLEVBQUEsTUFBQTtBQURGLGFBQUEsTUFFTyxJQUFJLE9BQUEsS0FBQSxDQUFBLElBQUEsS0FBSixtQkFBQSxFQUErQztBQUNwRCxxQkFBQSxNQUFBLENBQVksQ0FBQSxZQUFBLEVBQVosSUFBWSxDQUFaLEVBQUEsTUFBQTtBQURLLGFBQUEsTUFFQTtBQUNMLHFCQUFBLE1BQUEsQ0FBWSxDQUFBLFlBQUEsRUFBWixJQUFZLENBQVosRUFBQSxNQUFBO0FBQ0Q7QUFSSCxTQUFBLE1BU087QUFDTCxnQkFBSSxhQUFhLGVBQWpCLEtBQWlCLENBQWpCO0FBRUEsZ0JBQUksWUFBWSxTQUFoQixlQUFBLEVBQTBDO0FBQ3hDLHFCQUFBLE1BQUEsQ0FBWSxDQUFaLFdBQVksQ0FBWixFQUFBLE1BQUE7QUFERixhQUFBLE1BRU8sSUFBSSxZQUFZLENBQWhCLFdBQUEsRUFBOEI7QUFDbkMscUJBQUEsTUFBQSxDQUFZLENBQUEsWUFBQSxFQUFlLENBQUEsSUFBQSxFQUEzQixTQUEyQixDQUFmLENBQVosRUFBQSxNQUFBO0FBREssYUFBQSxNQUVBLElBQUEsVUFBQSxFQUFnQjtBQUNyQixxQkFBQSxNQUFBLENBQ0UsY0FDSSxDQUFBLHVCQUFBLEVBQTBCLENBQUEsSUFBQSxFQUQ5QixTQUM4QixDQUExQixDQURKLEdBRUksQ0FBQSxjQUFBLEVBQWlCLENBQUEsSUFBQSxFQUh2QixTQUd1QixDQUFqQixDQUhOLEVBQUEsTUFBQTtBQURLLGFBQUEsTUFPQSxJQUFJLE9BQUEsS0FBQSxDQUFBLElBQUEsS0FBSixtQkFBQSxFQUErQztBQUNwRCxxQkFBQSxNQUFBLENBQ0UsY0FBYyxDQUFBLGVBQUEsRUFBa0IsQ0FBQSxJQUFBLEVBQWhDLFNBQWdDLENBQWxCLENBQWQsR0FBcUQsQ0FBQSxhQUFBLEVBQWdCLENBQUEsSUFBQSxFQUR2RSxTQUN1RSxDQUFoQixDQUR2RCxFQUFBLE1BQUE7QUFESyxhQUFBLE1BS0E7QUFDTCxxQkFBQSxNQUFBLENBQ0UsY0FBYyxDQUFBLGVBQUEsRUFBa0IsQ0FBQSxJQUFBLEVBQWhDLFNBQWdDLENBQWxCLENBQWQsR0FBcUQsQ0FBQSxhQUFBLEVBQWdCLENBQUEsSUFBQSxFQUR2RSxTQUN1RSxDQUFoQixDQUR2RCxFQUFBLE1BQUE7QUFJRDtBQUNGO0FBQ0YsSzs7K0JBRUQsUSw0QkFBaUQ7QUFBQSxZQUFqRCxNQUFpRDs7QUFDL0MsYUFBQSxhQUFBLENBQUEsTUFBQSxFQUFBLFVBQUE7QUFDQSxhQUFBLFVBQUEsQ0FBZ0IsT0FBaEIsSUFBQSxFQUFBLGNBQUEsQ0FBQSxrQkFBQSxFQUFBLE1BQUE7QUFDQSxhQUFBLE1BQUEsQ0FBWSxDQUFaLFVBQVksQ0FBWixFQUFBLE1BQUE7QUFDRCxLOzsrQkFFRCxRLDZCQUE0QztBQUFBLFlBQTVDLFNBQTRDO0FBQUEsWUFDdEMsSUFEc0MsR0FDMUMsU0FEMEMsQ0FDdEMsSUFEc0M7O0FBRzFDLFlBQUksVUFBSixJQUFJLENBQUosRUFBcUI7QUFDbkIsaUJBQUEsVUFBQSxDQUFnQixVQUFoQixJQUFBLEVBQUEsWUFBQSxDQUFBLGdCQUFBLEVBQUEsU0FBQTtBQUNBLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLFFBQUEsRUFBVyxDQUFDLFVBQXhCLE9BQVksQ0FBWixFQUFBLFNBQUE7QUFGRixTQUFBLE1BR08sSUFBSSxLQUFBLElBQUEsS0FBSixnQkFBQSxFQUFvQztBQUN6QyxrQkFBTSxJQUFBLFdBQUEsbUNBQWdELEtBQWhELElBQUEsRUFBNkQsS0FBbkUsR0FBTSxDQUFOO0FBREssU0FBQSxNQUVBLElBQUksUUFBSixJQUFJLENBQUosRUFBbUI7QUFDeEIsZ0JBQUksS0FBSyxpQkFBVCxTQUFTLENBQVQ7QUFDQSxpQkFBQSxLQUFBLENBQUEsRUFBQSxFQUFBLFNBQUE7QUFGSyxTQUFBLE1BR0EsSUFBSSxVQUFKLElBQUksQ0FBSixFQUFxQjtBQUMxQixnQkFBSSxTQUFTLG1CQUFiLFNBQWEsQ0FBYjtBQUNBLGlCQUFBLE9BQUEsQ0FBQSxNQUFBLEVBQUEsU0FBQTtBQUZLLFNBQUEsTUFHQSxJQUFJLFdBQUosSUFBSSxDQUFKLEVBQXNCO0FBQzNCLHFDQUFBLFNBQUE7QUFDQSxpQkFBQSxRQUFBLENBQUEsVUFBQSxFQUFBLFNBQUE7QUFGSyxTQUFBLE1BR0EsSUFBSSxVQUFKLFNBQUksQ0FBSixFQUF5QjtBQUM5QixpQkFBQSxPQUFBLENBQUEsU0FBQTtBQUNBLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLFFBQUEsRUFBVyxDQUFDLFVBQXhCLE9BQVksQ0FBWixFQUFBLFNBQUE7QUFGSyxTQUFBLE1BR0EsSUFBSSxtQkFBSixTQUFJLENBQUosRUFBa0M7QUFDdkMsaUJBQUEsYUFBQSxDQUFBLFNBQUEsRUFBQSxRQUFBO0FBQ0EsaUJBQUEsVUFBQSxDQUFnQixVQUFoQixJQUFBLEVBQUEsVUFBQSxDQUFBLGNBQUEsRUFBMkQsVUFBM0QsSUFBQTtBQUNBLGlCQUFBLE1BQUEsQ0FBWSxDQUFaLFFBQVksQ0FBWixFQUFBLFNBQUE7QUFDQSxpQkFBQSxNQUFBLENBQVksQ0FBQSxRQUFBLEVBQVcsQ0FBQyxVQUF4QixPQUFZLENBQVosRUFBQSxTQUFBO0FBSkssU0FBQSxNQUtBO0FBQ0wsaUJBQUEsVUFBQSxDQUFnQixVQUFoQixJQUFBLEVBQStCLGdCQUFnQixVQUEvQyxJQUErQixDQUEvQixFQUFBLFNBQUE7QUFDQSxpQkFBQSxNQUFBLENBQVksQ0FBQSxRQUFBLEVBQVcsQ0FBQyxVQUF4QixPQUFZLENBQVosRUFBQSxTQUFBO0FBQ0Q7QUFDRixLOzsrQkFFRCxLLDBCQUF1RDtBQUFBLFlBQWpELE1BQWlELENBQXZELGtCQUF1RDs7QUFDckQsYUFBQSxhQUFBLENBQUEsTUFBQSxFQUFBLE9BQUE7QUFDQSxZQUFJLGFBQWEsS0FBQSxXQUFBLENBQWpCLEdBQWlCLEVBQWpCO0FBQ0EsWUFBSSxZQUFZLE9BQUEsT0FBQSxLQUFBLElBQUEsR0FBQSxJQUFBLEdBQWlDLEtBQUEsV0FBQSxDQUFqRCxHQUFpRCxFQUFqRDtBQUNBLGFBQUEsVUFBQSxDQUFnQixPQUFoQixJQUFBLEVBQUEsV0FBQSxDQUFBLGVBQUEsRUFBQSxNQUFBO0FBQ0EsYUFBQSxNQUFBLENBQVksQ0FBQSxPQUFBLEVBQVUsQ0FBQSxVQUFBLEVBQXRCLFNBQXNCLENBQVYsQ0FBWixFQUFBLE1BQUE7QUFDRCxLO0FBRUQ7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OytCQUVRLE8sb0JBQUEsSSxFQUFBLEksRUFBQSxHLEVBQXVEO0FBQzdELGFBQUEsTUFBQSxDQUFZLENBQUEsUUFBQSxFQUFaLElBQVksQ0FBWixFQUFBLEdBQUE7QUFDQSxhQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWixJQUFZLENBQVosRUFBQSxHQUFBO0FBQ0QsSzs7K0JBRU8sTyxvQkFBQSxJLEVBQUEsSSxFQUFBLE8sRUFBQSxHLEVBQW1GO0FBQ3pGLGFBQUEsTUFBQSxDQUFZLENBQUEsUUFBQSxFQUFXLENBQUEsSUFBQSxFQUF2QixPQUF1QixDQUFYLENBQVosRUFBQSxHQUFBO0FBQ0EsYUFBQSxNQUFBLENBQVksQ0FBQSxTQUFBLEVBQVosSUFBWSxDQUFaLEVBQUEsR0FBQTtBQUNELEs7OytCQUVPLFEscUJBQUEsSSxFQUFBLEcsRUFBMEM7QUFDaEQsYUFBQSxNQUFBLENBQVksQ0FBWixTQUFZLENBQVosRUFBQSxHQUFBO0FBQ0EsYUFBQSxNQUFBLENBQVksQ0FBQSxTQUFBLEVBQVosSUFBWSxDQUFaLEVBQUEsR0FBQTtBQUNELEs7OytCQUVPLFUsdUJBQUEsSSxFQUFBLE8sRUFBQSxJLEVBQTJFO0FBQ2pGLFlBQUksVUFBSixJQUFJLENBQUosRUFBcUI7QUFDbkIsaUJBQUEsTUFBQSxDQUFZLENBQUEsU0FBQSxFQUFZLEtBQXhCLEtBQVksQ0FBWixFQUFBLElBQUE7QUFERixTQUFBLE1BRU8sSUFBSSxLQUFBLElBQUEsS0FBSixnQkFBQSxFQUFvQztBQUN6QyxrQkFBTSxJQUFBLFdBQUEsbUNBQWdELEtBQWhELElBQUEsRUFBNkQsS0FBbkUsR0FBTSxDQUFOO0FBREssU0FBQSxNQUVBLElBQUksVUFBSixJQUFJLENBQUosRUFBcUI7QUFDMUIsaUJBQUEsT0FBQSxDQUFBLElBQUE7QUFESyxTQUFBLE1BRUE7QUFDTCxpQkFBQSxJQUFBLENBQUEsSUFBQSxFQUFBLE9BQUE7QUFDRDtBQUNGLEs7QUFFRDs7OytCQUVBLEssbUJBQUEsRSxFQUFBLE0sRUFBK0M7QUFDN0MsYUFBQSxhQUFBLENBQW1CLE9BQW5CLE1BQUE7QUFDQSxhQUFBLE1BQUEsQ0FBWSxDQUFBLE9BQUEsRUFBWixFQUFZLENBQVosRUFBQSxNQUFBO0FBQ0QsSzs7K0JBRUQsUSxzQkFBQSxLLEVBQUEsTSxFQUFxRDtBQUNuRCxhQUFBLE1BQUEsQ0FBWSxDQUFBLFVBQUEsRUFBWixJQUFZLENBQVosRUFBQSxNQUFBO0FBQ0QsSzs7K0JBRUQsUSxxQkFBQSxJLEVBQUEsTSxFQUF1QztBQUNyQyxhQUFBLE1BQUEsQ0FBWSxDQUFBLFVBQUEsRUFBWixJQUFZLENBQVosRUFBQSxNQUFBO0FBQ0QsSzs7K0JBRUQsYywyQkFBQSxJLEVBQUEsTSxFQUE2QztBQUMzQyxhQUFBLE1BQUEsQ0FBWSxDQUFBLGdCQUFBLEVBQVosSUFBWSxDQUFaLEVBQUEsTUFBQTtBQUNELEs7OytCQUVELE8sb0JBQUEsTyxFQUFBLE0sRUFBZ0U7QUFDOUQsYUFBQSxhQUFBLENBQW1CLE9BQW5CLE1BQUE7QUFDQSxhQUFBLE1BQUEsQ0FBWSxDQUFaLFNBQVksQ0FBWixFQUFBLE1BQUE7QUFDRCxLOzsrQkFFRCxPLG9CQUFBLE0sRUFBd0I7QUFBQSxZQUNsQixJQURrQixHQUN0QixNQURzQixDQUNsQixJQURrQjs7QUFHdEIsWUFBSSxXQUFKLElBQUksQ0FBSixFQUFzQjtBQUNwQixnQkFBSSxPQUFPLHlCQUF5QixLQUF6QixRQUFBLEVBQVgsTUFBVyxDQUFYO0FBQ0EsaUJBQUEsUUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBO0FBRkYsU0FBQSxNQUdPLElBQUksaUJBQUosSUFBSSxDQUFKLEVBQTRCO0FBQ2pDLGdCQUFJLFNBQU8seUJBQXlCLEtBQXpCLFFBQUEsRUFBWCxNQUFXLENBQVg7QUFDQSxpQkFBQSxjQUFBLENBQUEsTUFBQSxFQUFBLE1BQUE7QUFDRDtBQUNGLEs7QUFFRDs7OytCQUVBLGEsMEJBQUEsSSxFQUFxQztBQUNuQyxZQUFJLFVBQUosSUFBSSxDQUFKLEVBQXFCO0FBQ25CLGlCQUFBLE9BQUEsQ0FBQSxJQUFBO0FBREYsU0FBQSxNQUVPO0FBQ0wsaUJBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxRQUFBO0FBQ0EsaUJBQUEsVUFBQSxDQUFnQixLQUFoQixJQUFBLEVBQUEsVUFBQSxDQUFBLGNBQUEsRUFBQSxJQUFBO0FBQ0EsaUJBQUEsTUFBQSxDQUFZLENBQVosUUFBWSxDQUFaO0FBQ0Q7QUFDRixLOzsrQkFFRCxjLDJCQUFBLEksRUFBdUM7QUFDckMsYUFBQSxJQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsQ0FBQSxnQkFBQTtBQUNELEs7OytCQUVPLEksaUJBQUEsSSxFQUFBLE8sRUFBeUQ7QUFBQSwwQkFDekMsS0FBdEIsS0FEK0Q7QUFBQSxZQUMzRCxJQUQyRDtBQUFBLFlBQzNELElBRDJEOztBQUcvRCxZQUFJLEtBQUosSUFBQSxFQUFlO0FBQ2IsaUJBQUEsT0FBQSxPQUFBLElBQUEsRUFBQSxJQUFBLEVBQUEsSUFBQTtBQURGLFNBQUEsTUFFTyxJQUFJLEtBQUosSUFBQSxFQUFlO0FBQ3BCLGlCQUFBLFFBQUEsQ0FBYyxLQUFkLEtBQUEsRUFBQSxJQUFBO0FBREssU0FBQSxNQUVBO0FBQ0wsaUJBQUEsT0FBQSxDQUFBLElBQUEsRUFBQSxJQUFBLEVBQUEsT0FBQSxFQUFBLElBQUE7QUFDRDtBQUNGLEs7OytCQUVELGEsMEJBQUEsTSxFQUF1QztBQUNyQyxhQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWSxPQUF4QixLQUFZLENBQVosRUFBQSxNQUFBO0FBQ0QsSzs7K0JBRUQsYywyQkFBQSxNLEVBQXlDO0FBQ3ZDLGFBQUEsTUFBQSxDQUFZLENBQUEsU0FBQSxFQUFZLE9BQXhCLEtBQVksQ0FBWixFQUFBLE1BQUE7QUFDRCxLOzsrQkFFRCxhLDBCQUFBLE0sRUFBdUM7QUFDckMsYUFBQSxNQUFBLENBQVksQ0FBQSxTQUFBLEVBQVksT0FBeEIsS0FBWSxDQUFaLEVBQUEsTUFBQTtBQUNELEs7OytCQUVELFcsd0JBQUEsTSxFQUFtQztBQUNqQyxhQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWSxPQUF4QixLQUFZLENBQVosRUFBQSxNQUFBO0FBQ0QsSzs7K0JBRUQsZ0IsNkJBQUEsTSxFQUE2QztBQUMzQyxhQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWSxPQUF4QixLQUFZLENBQVosRUFBQSxNQUFBO0FBQ0QsSztBQUVEOzs7K0JBRUEsTSxtQkFBQSxPLEVBQXdGO0FBQUEsWUFBbkMsTUFBbUMsdUVBQXhGLElBQXdGOztBQUN0RixZQUFBLE1BQUEsRUFBWTtBQUNWLGlCQUFBLFNBQUEsQ0FBQSxJQUFBLENBQW9CLEtBQUEsUUFBQSxDQUFwQixNQUFvQixDQUFwQjtBQURGLFNBQUEsTUFFTztBQUNMLGlCQUFBLFNBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUNEO0FBRUQsWUFBSSxLQUFBLFdBQUEsSUFBSixNQUFBLEVBQWdDO0FBQzdCLG9CQUFBLElBQUEsQ0FBb0IsS0FBQSxJQUFBLENBQXBCLE1BQW9CLENBQXBCO0FBQ0Y7QUFFRCxhQUFBLE9BQUEsQ0FBQSxJQUFBLENBQUEsT0FBQTtBQUNELEs7OytCQUVELFUsdUJBQUEsSSxFQUFBLEksRUFBeUM7QUFDdkMsYUFBQSxhQUFBLENBQUEsSUFBQSxFQUFBLFFBQUE7QUFDQSxhQUFBLFVBQUEsQ0FBZ0IsS0FBaEIsSUFBQSxFQUFBLFVBQUEsQ0FBQSxjQUFBLEVBQUEsSUFBQTtBQUNBLGFBQUEsTUFBQSxDQUFZLENBQVosUUFBWSxDQUFaLEVBQUEsSUFBQTtBQUNELEs7OytCQUVELFkseUJBQUEsSSxFQUF3QztBQUN0QyxhQUFBLGFBQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQTtBQUNBLGFBQUEsVUFBQSxDQUFnQixLQUFoQixJQUFBLEVBQUEsVUFBQSxDQUFBLGNBQUEsRUFBQSxJQUFBO0FBQ0EsYUFBQSxNQUFBLENBQVksQ0FBWixRQUFZLENBQVosRUFBQSxJQUFBO0FBQ0QsSzs7K0JBRUQsYSwwQkFBQSxJLEVBQUEsTyxFQUE2QztBQUMzQywyQkFBbUIsS0FBbkIsSUFBQSxFQUE4QixLQUE5QixHQUFBLEVBQUEsT0FBQTtBQUQyQyxZQUd2QyxNQUh1QyxHQUczQyxJQUgyQyxDQUd2QyxNQUh1QztBQUFBLFlBR3ZDLElBSHVDLEdBRzNDLElBSDJDLENBR3ZDLElBSHVDOztBQUszQyxhQUFBLFdBQUEsQ0FBQSxJQUFBO0FBQ0EsYUFBQSxhQUFBLENBQUEsTUFBQTtBQUNELEs7OytCQUVELGEsMEJBQUEsTSxFQUFzQztBQUNwQyxZQUFJLENBQUMsT0FBTCxNQUFBLEVBQW9CO0FBQ2xCLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWixJQUFZLENBQVosRUFBQSxJQUFBO0FBQ0E7QUFDRDtBQUVELGFBQUssSUFBSSxJQUFJLE9BQUEsTUFBQSxHQUFiLENBQUEsRUFBZ0MsS0FBaEMsQ0FBQSxFQUFBLEdBQUEsRUFBNkM7QUFDM0MsZ0JBQUksUUFBUSxPQUFaLENBQVksQ0FBWjtBQUQyQyxxQkFHM0MsT0FBTyxLQUFLLE1BQVosSUFBTyxDQUFQLHFCQUEwQyxNQUhDLElBRzNDLDBCQUgyQzs7QUFJM0MsaUJBQUssTUFBTCxJQUFBLEVBQUEsS0FBQTtBQUNEO0FBRUQsYUFBQSxNQUFBLENBQVksQ0FBQSxjQUFBLEVBQWlCLE9BQTdCLE1BQVksQ0FBWixFQUFBLElBQUE7QUFDRCxLOzsrQkFFRCxXLHdCQUFBLEksRUFBMEI7QUFDeEIsWUFBSSxRQUFRLEtBQVosS0FBQTtBQUVBLFlBQUksQ0FBQyxNQUFMLE1BQUEsRUFBbUI7QUFDakIsaUJBQUEsTUFBQSxDQUFZLENBQUEsU0FBQSxFQUFaLElBQVksQ0FBWixFQUFBLElBQUE7QUFDQTtBQUNEO0FBRUQsYUFBSyxJQUFJLElBQUksTUFBQSxNQUFBLEdBQWIsQ0FBQSxFQUErQixLQUEvQixDQUFBLEVBQUEsR0FBQSxFQUE0QztBQUFBLDJCQUNyQixNQUFyQixDQUFxQixDQURxQjtBQUFBLGdCQUN0QyxHQURzQyxZQUN0QyxHQURzQztBQUFBLGdCQUN0QyxLQURzQyxZQUN0QyxLQURzQzs7QUFBQSxxQkFHMUMsT0FBTyxLQUFLLE1BQVosSUFBTyxDQUFQLHFCQUEwQyxNQUhBLElBRzFDLDBCQUgwQzs7QUFJMUMsaUJBQUssTUFBTCxJQUFBLEVBQUEsS0FBQTtBQUNBLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWixHQUFZLENBQVosRUFBQSxJQUFBO0FBQ0Q7QUFFRCxhQUFBLE1BQUEsQ0FBWSxDQUFBLGVBQUEsRUFBa0IsTUFBOUIsTUFBWSxDQUFaLEVBQUEsSUFBQTtBQUNELEs7OytCQUVELHFCLGtDQUFBLEssRUFBa0Q7QUFDaEQ7QUFFQSxZQUFJLE1BQUEsSUFBQSxLQUFKLGlCQUFBLEVBQXNDO0FBQ3BDLGlCQUFBLGtCQUFBLENBQXdCLE1BQXhCLEtBQUE7QUFDQSxpQkFBQSxNQUFBLENBQVksQ0FBWixRQUFZLENBQVosRUFBQSxLQUFBO0FBQ0EsbUJBQUEsS0FBQTtBQUhGLFNBQUEsTUFJTztBQUNMLG1CQUFPLEtBQUEsaUJBQUEsQ0FBUCxLQUFPLENBQVA7QUFDRDtBQUNGLEs7OytCQUVELGtCLCtCQUFBLEssRUFBc0Q7QUFDcEQsYUFBSyxJQUFJLElBQUksTUFBQSxNQUFBLEdBQWIsQ0FBQSxFQUErQixLQUEvQixDQUFBLEVBQUEsR0FBQSxFQUE0QztBQUMxQyxnQkFBSSxPQUFPLE1BQVgsQ0FBVyxDQUFYO0FBRUEsaUJBQUEsaUJBQUEsQ0FBQSxJQUFBO0FBQ0Q7QUFFRCxhQUFBLE1BQUEsQ0FBWSxDQUFBLGNBQUEsRUFBaUIsTUFBN0IsTUFBWSxDQUFaLEVBQUEsSUFBQTtBQUNELEs7OytCQUVPLGlCLDhCQUFBLEssRUFBNkQ7QUFDbkUsWUFBSSxNQUFBLElBQUEsS0FBSixVQUFBLEVBQStCO0FBQzdCLGlCQUFBLE1BQUEsQ0FBWSxDQUFBLFNBQUEsRUFBWSxNQUF4QixLQUFZLENBQVo7QUFDQSxtQkFBQSxJQUFBO0FBRkYsU0FBQSxNQUdPLElBQUksVUFBSixLQUFJLENBQUosRUFBc0I7QUFDM0IsaUJBQUEsT0FBQSxDQUFBLEtBQUE7QUFESyxTQUFBLE1BRUEsSUFBSSxtQkFBSixLQUFJLENBQUosRUFBK0I7QUFDcEMsaUJBQUEsYUFBQSxDQUFBLEtBQUEsRUFBQSxRQUFBO0FBQ0EsaUJBQUEsVUFBQSxDQUFnQixNQUFoQixJQUFBLEVBQUEsVUFBQSxDQUFBLGNBQUEsRUFBQSxLQUFBO0FBQ0EsaUJBQUEsTUFBQSxDQUFZLENBQVosUUFBWSxDQUFaLEVBQUEsS0FBQTtBQUhLLFNBQUEsTUFJQTtBQUNMLGlCQUFBLFVBQUEsQ0FBZ0IsTUFBaEIsSUFBQSxFQUFBLGdCQUFBLENBQUEsb0JBQUEsRUFBQSxLQUFBO0FBQ0Q7QUFFRCxlQUFBLEtBQUE7QUFDRCxLOzsrQkFFRCxJLGlCQUFBLEksRUFBdUI7QUFDckIsWUFBSSxNQUFNLEtBQVYsR0FBQTtBQUNBLFlBQUksQ0FBSixHQUFBLEVBQVU7QUFDUixtQkFBQSxFQUFBO0FBQ0Q7QUFKb0IsWUFNakIsTUFOaUIsR0FNckIsR0FOcUIsQ0FNakIsTUFOaUI7QUFBQSxZQU1qQixLQU5pQixHQU1yQixHQU5xQixDQU1qQixLQU5pQjtBQUFBLFlBTWpCLEdBTmlCLEdBTXJCLEdBTnFCLENBTWpCLEdBTmlCOztBQU9yQixlQUFPLENBQUEsS0FBQSxFQUFRLENBQUMsVUFBRCxJQUFBLEVBQWlCLENBQUMsTUFBRCxJQUFBLEVBQWEsTUFBOUIsTUFBaUIsQ0FBakIsRUFBNkMsQ0FBQyxJQUFELElBQUEsRUFBVyxJQUF2RSxNQUE0RCxDQUE3QyxDQUFSLENBQVA7QUFDRCxLOzsrQkFFRCxRLHFCQUFBLEksRUFBMkI7QUFDekIsWUFBSSxNQUFNLEtBQVYsR0FBQTtBQUVBLFlBQUksQ0FBSixHQUFBLEVBQVUsT0FBQSxJQUFBO0FBSGUsWUFLckIsTUFMcUIsR0FLekIsR0FMeUIsQ0FLckIsTUFMcUI7QUFBQSxZQUtyQixLQUxxQixHQUt6QixHQUx5QixDQUtyQixLQUxxQjtBQUFBLFlBS3JCLEdBTHFCLEdBS3pCLEdBTHlCLENBS3JCLEdBTHFCOztBQU16QixZQUFJLGNBQWMsaUJBQWlCLEtBQWpCLE1BQUEsRUFBOEIsTUFBQSxJQUFBLEdBQTlCLENBQUEsRUFBOEMsTUFBaEUsTUFBa0IsQ0FBbEI7QUFDQSxZQUFJLFlBQVksaUJBQWlCLEtBQWpCLE1BQUEsRUFBOEIsSUFBQSxJQUFBLEdBQTlCLENBQUEsRUFBNEMsSUFBNUQsTUFBZ0IsQ0FBaEI7QUFFQSxZQUFJLGdCQUFBLElBQUEsSUFBd0IsY0FBNUIsSUFBQSxFQUFnRDtBQUM5QztBQUNBLG1CQUFBLElBQUE7QUFDRDtBQUVELGVBQU87QUFDTCxvQkFBUSxVQURILElBQUE7QUFFTCxtQkFGSyxXQUFBO0FBR0wsaUJBQUs7QUFIQSxTQUFQO0FBS0QsSzs7Ozs7ZUFyZVcsZ0I7O0FBd2VkLFNBQUEsa0JBQUEsQ0FBQSxRQUFBLEVBQytCO0FBRTdCLFFBQUksU0FBQSxJQUFBLEtBQUEsZUFBQSxJQUFxQyxTQUFBLElBQUEsS0FBekMsbUJBQUEsRUFBZ0Y7QUFDOUUsZUFBQSxLQUFBO0FBQ0Q7QUFFRCxXQUNHLFNBQUEsTUFBQSxJQUFtQixTQUFBLE1BQUEsQ0FBQSxNQUFBLEdBQXBCLENBQUMsSUFDQSxTQUFBLElBQUEsSUFBaUIsU0FBQSxJQUFBLENBQUEsS0FBQSxDQUFBLE1BQUEsR0FGcEIsQ0FBQTtBQUlEO0FBRUQsU0FBQSxZQUFBLFNBQW1EO0FBQUEsUUFBbkQsS0FBbUQsVUFBbkQsS0FBbUQ7O0FBQ2pELFdBQU8sTUFBQSxNQUFBLEtBQVAsQ0FBQTtBQUNEO0FBRUQsU0FBQSxPQUFBLENBQUEsSUFBQSxFQUF5QztBQUN2QyxXQUFPLEtBQUEsUUFBQSxLQUFQLE9BQUE7QUFDRDtBQUVELFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBMkM7QUFDekMsV0FBTyxLQUFBLFFBQUEsS0FBUCxTQUFBO0FBQ0Q7QUFFRCxTQUFBLFVBQUEsQ0FBQSxJQUFBLEVBQTRDO0FBQzFDLFdBQU8sS0FBQSxRQUFBLEtBQVAsVUFBQTtBQUNEO0FBRUQsU0FBQSxVQUFBLENBQUEsSUFBQSxFQUF3QztBQUN0QyxRQUFJLEtBQUEsSUFBQSxLQUFKLGdCQUFBLEVBQW9DLE9BQUEsS0FBQTtBQUNwQyxXQUFPLEtBQUEsUUFBQSxLQUFQLFdBQUE7QUFDRDtBQUVELFNBQUEsZ0JBQUEsQ0FBQSxJQUFBLEVBQThDO0FBQzVDLFFBQUksS0FBQSxJQUFBLEtBQUosZ0JBQUEsRUFBb0MsT0FBQSxLQUFBO0FBQ3BDLFdBQU8sS0FBQSxRQUFBLEtBQVAsa0JBQUE7QUFDRDtBQUVELFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBaUU7QUFDL0QsUUFBSSxPQUFKLElBQUksQ0FBSixFQUFrQjtBQUNoQixlQUFPLFdBQVcsS0FBWCxJQUFBLEtBQXlCLGlCQUFpQixLQUFqRCxJQUFnQyxDQUFoQztBQURGLEtBQUEsTUFFTyxJQUFJLE9BQUosSUFBSSxDQUFKLEVBQWtCO0FBQ3ZCLGVBQU8sV0FBQSxJQUFBLEtBQW9CLGlCQUEzQixJQUEyQixDQUEzQjtBQURLLEtBQUEsTUFFQTtBQUNMLGVBQUEsS0FBQTtBQUNEO0FBQ0Y7QUFFRCxTQUFBLE1BQUEsQ0FBQSxJQUFBLEVBQXlDO0FBQ3ZDLFdBQU8sS0FBQSxJQUFBLEtBQUEsZUFBQSxJQUFpQyxLQUFBLElBQUEsS0FBeEMsbUJBQUE7QUFDRDtBQUVELFNBQUEsTUFBQSxDQUFBLElBQUEsRUFBbUQ7QUFDakQsV0FBTyxLQUFBLElBQUEsS0FBUCxnQkFBQTtBQUNEO0FBRUQsU0FBQSwyQkFBQSxDQUFBLE9BQUEsRUFBNkQ7QUFDM0QsUUFBSSxPQUFPLFFBQUEsR0FBQSxDQUFBLE1BQUEsQ0FBWCxDQUFXLENBQVg7O0FBRDJELDZCQUcvQixRQUFBLEdBQUEsQ0FBQSxLQUFBLENBQTVCLEdBQTRCLENBSCtCO0FBQUEsUUFHdkQsVUFIdUQ7QUFBQSxRQUd2RCxJQUh1RDs7QUFJM0QsUUFBSSxrQkFBa0IsU0FBdEIsR0FBQTtBQUNBLFFBQUksVUFBVSxRQUFBLE9BQUEsQ0FBQSxHQUFBLENBQWQsVUFBYyxDQUFkO0FBQ0EsUUFBSSxhQUFhLGVBQWpCLE1BQUE7QUFFQSxRQUFBLE9BQUEsRUFBYTtBQUNYLGVBQU87QUFDTCxrQkFESyxnQkFBQTtBQUVMLGtCQUZLLEtBQUE7QUFHTCxvQkFBTyxVQUFQLFNBSEssSUFHTCxDQUhLO0FBSUwsa0JBSkssS0FBQTtBQUtMLHNCQUFVLFFBTEwsR0FBQTtBQU1MLGlCQUFLLFFBQVE7QUFOUixTQUFQO0FBREYsS0FBQSxNQVNPLElBQUEsZUFBQSxFQUFxQjtBQUMxQixlQUFPO0FBQ0wsa0JBREssZ0JBQUE7QUFFTCxrQkFGSyxJQUFBO0FBR0wsb0JBQVEsV0FBQSxLQUFBLENBQUQsQ0FBQyxDQUFSLFNBSEssSUFHTCxDQUhLO0FBSUwsa0JBSkssS0FBQTtBQUtMLHNCQUFVLFFBTEwsR0FBQTtBQU1MLGlCQUFLLFFBQVE7QUFOUixTQUFQO0FBREssS0FBQSxNQVNBLElBQUEsVUFBQSxFQUFnQjtBQUNyQixlQUFPO0FBQ0wsa0JBREssZ0JBQUE7QUFFTCxrQkFGSyxLQUFBO0FBR0wsbUJBSEssSUFBQTtBQUlMLGtCQUpLLElBQUE7QUFLTCxzQkFBVSxRQUxMLEdBQUE7QUFNTCxpQkFBSyxRQUFRO0FBTlIsU0FBUDtBQURLLEtBQUEsTUFTQTtBQUNMLGVBQUEsSUFBQTtBQUNEO0FBQ0Y7QUFFRCxTQUFBLFdBQUEsQ0FBQSxPQUFBLEVBQTZDO0FBQzNDLFFBQUksT0FBTyxRQUFBLEdBQUEsQ0FBQSxNQUFBLENBQVgsQ0FBVyxDQUFYO0FBQ0EsUUFBSSxTQUFTLFFBQUEsR0FBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLElBQTJCLENBQXhDLENBQUE7QUFFQSxRQUFJLGNBQWMsU0FBUyxLQUFULFdBQVMsRUFBVCxJQUErQixTQUFTLEtBQTFELFdBQTBELEVBQTFEO0FBRUEsV0FBUSxlQUFlLENBQWhCLE1BQUMsSUFBMkIsQ0FBQyxDQUFDLDRCQUFyQyxPQUFxQyxDQUFyQztBQUNEO0FBRUQsU0FBQSxZQUFBLENBQUEsT0FBQSxFQUE4QztBQUM1QyxRQUFJLE9BQU8sUUFBQSxHQUFBLENBQUEsTUFBQSxDQUFYLENBQVcsQ0FBWDtBQUVBLFdBQU8sU0FBUCxHQUFBO0FBQ0Q7QUFFRCxTQUFBLGtCQUFBLENBQUEsSUFBQSxFQUFBLEdBQUEsRUFBQSxPQUFBLEVBQTBGO0FBQ3hGLFFBQUksS0FBQSxJQUFBLEtBQUosZ0JBQUEsRUFBb0M7QUFDbEMsY0FBTSxJQUFBLFdBQUEsT0FDQyxLQUFLLElBRE4seUJBQytCLE9BRC9CLGlCQUNrRCxJQUFBLEtBQUEsQ0FEbEQsSUFBQSxRQUVKLEtBRkYsR0FBTSxDQUFOO0FBSUQ7QUFFRCxRQUFJLENBQUMsYUFBTCxJQUFLLENBQUwsRUFBeUI7QUFDdkIsY0FBTSxJQUFBLFdBQUEsT0FDQyxLQUFLLFFBRE4sb0NBQzhDLE9BRDlDLGlCQUNpRSxJQUFBLEtBQUEsQ0FEakUsSUFBQSxRQUVKLEtBRkYsR0FBTSxDQUFOO0FBSUQ7QUFDRjtBQUVELFNBQUEsZ0JBQUEsQ0FBQSxTQUFBLEVBQTBEO0FBQUEsUUFDcEQsS0FEb0QsR0FDeEMsVUFBaEIsSUFEd0QsQ0FDcEQsS0FEb0Q7O0FBR3hELFFBQUssTUFBQSxNQUFBLEtBQUEsQ0FBQSxJQUFzQixNQUFBLENBQUEsRUFBQSxHQUFBLEtBQXZCLElBQUMsSUFBZ0QsTUFBQSxNQUFBLEdBQXJELENBQUEsRUFBdUU7QUFDckUsY0FBTSxJQUFBLFdBQUEscURBQWtFLFVBQXhFLEdBQU0sQ0FBTjtBQURGLEtBQUEsTUFFTyxJQUFJLE1BQUEsTUFBQSxLQUFBLENBQUEsSUFBc0IsTUFBQSxDQUFBLEVBQUEsS0FBQSxDQUFBLElBQUEsS0FBMUIsZUFBQSxFQUFtRTtBQUN4RSxjQUFNLElBQUEsV0FBQSwwQ0FBeUQsVUFBL0QsR0FBTSxDQUFOO0FBREssS0FBQSxNQUVBLElBQUksTUFBQSxNQUFBLEtBQUosQ0FBQSxFQUF3QjtBQUM3QixlQUFBLFNBQUE7QUFESyxLQUFBLE1BRUE7QUFDTCxlQUFRLE1BQUEsQ0FBQSxFQUFBLEtBQUEsQ0FBUixLQUFBO0FBQ0Q7QUFDRjtBQUVELFNBQUEsa0JBQUEsQ0FBQSxTQUFBLEVBQTREO0FBQUEsUUFDdEQsTUFEc0QsR0FDMUQsU0FEMEQsQ0FDdEQsTUFEc0Q7QUFBQSxRQUN0RCxJQURzRCxHQUMxRCxTQUQwRCxDQUN0RCxJQURzRDtBQUFBLFFBQ3RELE9BRHNELEdBQzFELFNBRDBELENBQ3RELE9BRHNEO0FBQUEsUUFDdEQsR0FEc0QsR0FDMUQsU0FEMEQsQ0FDdEQsR0FEc0Q7O0FBRzFELFFBQUksVUFBVSxPQUFBLE1BQUEsS0FBZCxDQUFBLEVBQW1DO0FBQ2pDLGNBQU0sSUFBQSxXQUFBLGtGQUMyRSxJQUFBLEtBQUEsQ0FEM0UsSUFBQSxRQUVKLFVBRkYsR0FBTSxDQUFOO0FBREYsS0FBQSxNQUtPLElBQUksUUFBUSxLQUFBLEtBQUEsQ0FBQSxNQUFBLEdBQVosQ0FBQSxFQUFtQztBQUN4QyxjQUFNLElBQUEsV0FBQSx5REFDa0QsSUFBQSxLQUFBLENBRGxELElBQUEsUUFFSixVQUZGLEdBQU0sQ0FBTjtBQURLLEtBQUEsTUFLQSxJQUFJLENBQUosT0FBQSxFQUFjO0FBQ25CLGNBQU0sSUFBQSxXQUFBLHNGQUMrRSxJQUFBLEtBQUEsQ0FEL0UsSUFBQSxRQUVKLFVBRkYsR0FBTSxDQUFOO0FBSUQ7QUFFRCxXQUFBLE1BQUE7QUFDRDtBQUVELFNBQUEsd0JBQUEsQ0FBQSxJQUFBLEVBQUEsSUFBQSxFQUE4RDtBQUFBLFFBQ3hELE1BRHdELEdBQzVELElBRDRELENBQ3hELE1BRHdEO0FBQUEsUUFDeEQsSUFEd0QsR0FDNUQsSUFENEQsQ0FDeEQsSUFEd0Q7QUFBQSxRQUN4RCxHQUR3RCxHQUM1RCxJQUQ0RCxDQUN4RCxHQUR3RDs7QUFHNUQsUUFBSSxRQUFRLEtBQUEsS0FBQSxDQUFBLE1BQUEsR0FBWixDQUFBLEVBQW1DO0FBQ2pDLGNBQU0sSUFBQSxXQUFBLENBQUEsSUFBQSx5Q0FBNkQsS0FBbkUsR0FBTSxDQUFOO0FBQ0Q7QUFFRCxRQUFJLE9BQUEsTUFBQSxLQUFKLENBQUEsRUFBeUI7QUFDdkIsZUFBQSxTQUFBO0FBREYsS0FBQSxNQUVPLElBQUksT0FBQSxNQUFBLEtBQUosQ0FBQSxFQUF5QjtBQUM5QixZQUFJLFFBQVEsT0FBWixDQUFZLENBQVo7QUFDQSxZQUFJLE1BQUEsSUFBQSxLQUFKLGVBQUEsRUFBb0M7QUFDbEMsbUJBQU8sTUFBUCxLQUFBO0FBREYsU0FBQSxNQUVPO0FBQ0wsa0JBQU0sSUFBQSxXQUFBLHFEQUM4QyxJQUFBLEtBQUEsQ0FEOUMsSUFBQSxRQUVKLEtBRkYsR0FBTSxDQUFOO0FBSUQ7QUFUSSxLQUFBLE1BVUE7QUFDTCxjQUFNLElBQUEsV0FBQSxDQUNELElBREMsMERBQ3dELElBQUEsS0FBQSxDQUR4RCxJQUFBLFFBRUosS0FGRixHQUFNLENBQU47QUFJRDtBQUNGO0FBRUQsU0FBQSx3QkFBQSxDQUFBLFNBQUEsRUFBa0U7QUFBQSxRQUM1RCxNQUQ0RCxHQUNoRSxTQURnRSxDQUM1RCxNQUQ0RDtBQUFBLFFBQzVELElBRDRELEdBQ2hFLFNBRGdFLENBQzVELElBRDREOztBQUdoRSxRQUFJLFFBQVEsS0FBQSxLQUFBLENBQUEsTUFBQSxHQUFaLENBQUEsRUFBbUM7QUFDakMsY0FBTSxJQUFBLFdBQUEsK0NBQThELFVBQXBFLEdBQU0sQ0FBTjtBQUNEO0FBRUQsUUFBSSxPQUFBLE1BQUEsS0FBSixDQUFBLEVBQXlCO0FBQ3ZCLGVBQUEsU0FBQTtBQURGLEtBQUEsTUFFTztBQUNMLGNBQU0sSUFBQSxXQUFBLG9EQUFtRSxVQUF6RSxHQUFNLENBQU47QUFDRDtBQUNGO0FBRUQsU0FBQSxlQUFBLENBQUEsSUFBQSxFQUE2QztBQUMzQyxRQUFJLEtBQUEsSUFBQSxLQUFKLGdCQUFBLEVBQW9DO0FBQ2xDLFlBQUksS0FBQSxLQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBeUIsS0FBN0IsSUFBQSxFQUF3QztBQUN0QyxtQkFBQSxZQUFBLENBQUEsZ0JBQUE7QUFERixTQUFBLE1BRU87QUFDTCx1QkFBQSxnQkFBQSxDQUFBLG9CQUFBO0FBQ0Q7QUFMSCxLQUFBLE1BTU87QUFDTCxtQkFBQSxZQUFBLENBQUEsZ0JBQUE7QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVmlzaXRvciwgeyBBY3Rpb24gfSBmcm9tICcuL3RlbXBsYXRlLXZpc2l0b3InO1xuaW1wb3J0IEphdmFTY3JpcHRDb21waWxlciwgeyBUZW1wbGF0ZSB9IGZyb20gJy4vamF2YXNjcmlwdC1jb21waWxlcic7XG5pbXBvcnQgeyBhc3NlcnQsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQVNULCBpc0xpdGVyYWwsIFN5bnRheEVycm9yIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IGdldEF0dHJOYW1lc3BhY2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFN5bWJvbEFsbG9jYXRvciB9IGZyb20gJy4vYWxsb2NhdGUtc3ltYm9scyc7XG5pbXBvcnQgeyBQcm9jZXNzb3IsIElucHV0T3BzLCBBbGxvY2F0ZVN5bWJvbHNPcHMsIE9wcywgU291cmNlTG9jYXRpb24gfSBmcm9tICcuL2NvbXBpbGVyLW9wcyc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IEV4cHJlc3Npb25Db250ZXh0IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBsb2NhdGlvblRvT2Zmc2V0IH0gZnJvbSAnLi9sb2NhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZU9wdGlvbnMge1xuICBtZXRhPzogdW5rbm93bjtcbiAgY3VzdG9taXplQ29tcG9uZW50TmFtZT8odGFnOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlz