UNPKG

@pubgcorp/pk-template

Version:
507 lines 44.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createLanguageRuntime = exports.PktRuntime = exports.compilePkt = void 0; const lazy_1 = require("../lazy"); const utils_1 = require("./utils"); const styleSheet_1 = require("./styles/styleSheet"); const jsonSchema_1 = require("./jsonSchema"); const selectors_1 = __importDefault(require("./selectors")); const pk_yaml_1 = require("../pk-yaml"); const jslib_1 = __importDefault(require("./jslib")); const common_1 = require("../common"); const path_1 = require("path"); const PKT_INITIAL_STATE = 'pkt:$initial'; const PKT_IMPORT_INITIAL_STATE = 'import:$initial'; // TODO: merge loadPkt in scope.ts const compilePkt = (src, uri) => { const yamls = (0, pk_yaml_1.parseYamlAsPkt)(src, uri); if (yamls.length == 0) { return { header: {}, statements: [] }; } if (yamls[0] && (yamls[0]['/properties'] || yamls[0]['/schema'] || yamls[0]['/import'] || yamls[0]['/require'])) { const header = yamls[0]; return { header, statements: yamls.slice(1) }; } return { header: {}, statements: yamls }; }; exports.compilePkt = compilePkt; class PktRuntime { constructor() { // style this.expandStyle = (vm, scope, object) => scope.styleSheet.apply(vm, scope, object); this.initialState = PKT_INITIAL_STATE; } buildProperties(properties, parentValues) { const values = Object.assign({ cluster: null, env: null, namespace: null }, (properties || {})); for (const k in parentValues) { if (k in values) values[k] = parentValues[k]; } return values; } checkStrictCheckedValues(header, strictValues, uri) { if (header['/properties']) { const undefinedValue = Object.keys(strictValues) .find(k => !(k in header['/properties'])); if (undefinedValue) { throw new Error(`${undefinedValue} is not defined at ${uri}`); } } } executeFile(vm, scope, rpath, strictValues) { if (rpath.toLowerCase().endsWith('.pkt')) { const { uri, data } = scope.loadPkt(rpath); this.checkStrictCheckedValues(data.header, strictValues, uri); const values = strictValues ? this.evalObject(vm, scope, strictValues) : {}; scope.child2({ uri, values }, (cscope) => { vm.execute(cscope, { uri, pkt: data }, PKT_INITIAL_STATE); }); } else { const { uri, data } = scope.loadText(rpath); const values = strictValues ? this.evalObject(vm, scope, strictValues) : {}; scope.child2({ uri, values }, (cscope) => { vm.runtime.evalTemplateAll(vm, cscope, data) .filter(o => o) .forEach(o => cscope.add(o)); }); } } importFile(vm, scope, rpath) { if (!rpath.toLowerCase().endsWith('.pkt') && !rpath.toLowerCase().endsWith('.pkt')) { throw scope.error(`can not import non pkt or non yaml file ${rpath}`); } if (rpath.toLowerCase().endsWith('.pkt')) { const { uri, data } = scope.loadPkt(rpath); vm.execute(scope, { uri, pkt: data }, PKT_IMPORT_INITIAL_STATE); } else if (rpath.toLowerCase().endsWith('.yaml')) { const yaml = scope.loadYaml(rpath); scope.objects.push(yaml); } } expandStyleSheet(vm, scope, object) { this.expandStyle(vm, scope, object); } expandCaretPath(object) { (0, common_1.forEachTreeObjectKey)(object, (node, key, value) => { if (key.startsWith('^') && key.length > 1) { delete node[key]; (0, utils_1.setValue)(node, key.substr(1), value); } }); } deleteUndefined(node) { if (node === undefined) { return; } if (Array.isArray(node)) { for (let i = node.length - 1; i >= 0; --i) { const val = node[i]; if (val === undefined) { node.splice(i, 1); } else { this.deleteUndefined(node[i]); } } } else if (typeof node === 'object') { if (node === null) return node; Object.keys(node) .forEach((key) => { const val = node[key]; if (val === undefined) { delete node[key]; } else { this.deleteUndefined(node[key]); } }); } } evalObject(vm, scope, object) { object = vm.evalAllCustomTags(scope, object); this.expandCaretPath(object); this.expandStyleSheet(vm, scope, object); this.deleteUndefined(object); return object; } // evaluater evalTemplate(vm, scope, tpl) { const _ = (0, lazy_1.getUnderscore)(); return _.template(tpl)(vm.sandbox(scope)); } evalTemplateAll(vm, scope, text) { try { const tpl = (0, lazy_1.getUnderscore)().template(text); const yaml = tpl(vm.sandbox(scope)); const objects = (0, pk_yaml_1.parseYamlAll)(yaml); return objects; } catch (e) { throw scope.error('failed to parse template', e); } } // } // const pktLanguage: ILanguageSpec<PktRuntime> = { createLanguageSpec() { const spec = { compile: this.compile, initialState: PKT_INITIAL_STATE, states: {}, sandbox: this.sandbox, }; for (const key of Object.getOwnPropertyNames(PktRuntime.prototype)) { const item = this[key]; if (typeof item == 'function') { const m = key.match(/^([^_]+):(\d+):([^_]+)$/); if (m) { const state = spec.states[m[1]] || (spec.states[m[1]] = {}); state[m[3]] = { name: m[3], order: Number(m[2]), handler: this[key], }; } } } return spec; } compile(scope, src, uri) { try { return { uri, pkt: (0, exports.compilePkt)(src, uri), withObject: true, }; } catch (e) { throw scope.error(`failed to parse yaml ${uri}`, e); } } sandbox(scope, values) { const $ = values ? Object.assign(Object.assign(Object.assign({}, scope), (0, jslib_1.default)(scope)), values) : Object.assign(Object.assign({}, scope), (0, jslib_1.default)(scope)); const sandbox = Object.assign({ $, console, Buffer }, scope.values); return sandbox; } ['pkt:100:$initial'](vm, scope, stmt, next) { if (!stmt) return {}; if (!scope) throw 'no parent scope'; const uri = stmt.uri; const pkt = stmt.pkt; const options = stmt.options; scope.trace.into(() => { const values = (0, utils_1.deepCloneWithFunction)(scope.values); scope.child2({ uri, values }, cscope => { cscope.trace.step('header'); const rst = vm.execute(cscope, pkt.header, 'decl'); if (rst.exit) { return {}; } for (let i = 0; i < pkt.statements.length; ++i) { cscope.trace.step(i); const rst = vm.execute(cscope, pkt.statements[i], 'stmt'); if (rst.exit) { return {}; } } }); }); return {}; } ['import:100:$initial'](vm, scope, stmt) { if (!stmt) return {}; if (!scope) throw 'no parent scope'; const uri = stmt.uri; const pkt = stmt.pkt; const withObject = stmt.withObject; scope.trace.into(() => { scope.trace.step('header'); const rst = vm.execute(scope, pkt.header, 'decl'); if (rst.exit) { return {}; } for (let i = 0; i < pkt.statements.length; ++i) { scope.trace.step(i); const rst = vm.execute(scope, pkt.statements[i], 'stmt'); if (rst.exit) { return {}; } } }); return {}; } ['decl:100:/properties'](vm, scope, stmt, next) { // 2. build properties scope.trace.step('/properties'); if (stmt['/properties']) { scope.values = vm.runtime.buildProperties(stmt['/properties'], scope.values); } return next(scope); } ['decl:101:/schema'](vm, scope, stmt, next) { scope.trace.step('schema'); const schema = new jsonSchema_1.JsonSchema(stmt['/schema']); const errors = schema.validate(scope.values); if (errors) { throw scope.error('property validation failed', new Error(errors)); } return next(scope); } ['decl:102:/import'](vm, scope, stmt, next) { scope.trace.step('/import'); let rpathes = stmt['/import']; if (!Array.isArray(rpathes)) { rpathes = [rpathes]; } for (const rpath of rpathes) { let childValues = {}; const objects = []; scope.child2({ objects, orphan: true }, (cscope) => { vm.runtime.importFile(vm, cscope, rpath); childValues = cscope.values; }); scope.objects.push(...objects); scope.values = Object.assign(Object.assign({}, scope.values), childValues); } return next(scope); } ['decl:103:/stylesheet'](vm, scope, stmt, next) { scope.trace.step('/stylesheet'); scope.styleSheet = styleSheet_1.StyleSheet.Build(scope, stmt); return next(scope); } ['decl:103:/require'](vm, scope, stmt, next) { scope.trace.step('/require'); const uri = scope.resolve(stmt['/require']); if (!uri.endsWith('.js')) { throw scope.error('/require only accepts *.js files'); } if (uri) { const obj = require(uri); const name = (0, path_1.parse)(uri).name; scope.values = Object.assign(Object.assign({}, scope.values), { [name]: obj }); } return next(scope); } ['decl:104:/values'](vm, scope, stmt, next) { if (stmt['/values']) { scope.trace.step('/values'); scope.values = Object.assign(Object.assign({}, scope.values), vm.runtime.evalObject(vm, scope, stmt['/values'] || {})); } return next(scope); } ['decl:105:/assign'](vm, scope, stmt, next) { if (stmt['/assign']) { throw scope.error('header cannot have /assign statement'); // scope.trace.step('/assign'); // scope.values = { // ...scope.values, // ...scope.evalObject(stmt['/assign'] || {}), // }; } return next(scope); } ['stmt:000:/if'](vm, scope, stmt, next) { return vm.runtime.evalObject(vm, scope, stmt['/if']) ? next(scope) : {}; } ['stmt:001:/unless'](vm, scope, stmt, next) { return vm.runtime.evalObject(vm, scope, stmt['/unless']) ? {} : next(scope); } ['stmt:003:/endIf'](vm, scope, stmt, next) { return vm.runtime.evalObject(vm, scope, stmt['/endIf']) ? { exit: true } : {}; } ['stmt:004:/end']() { return { exit: true }; } ['stmt:010:/select'](vm, scope, stmt, next) { const predicate = selectors_1.default.compile(stmt['/select']); const before = scope.objects.filter(predicate); const after = before.map(o => o); const rst = scope.child2({ objects: after }, cscope => { return next(cscope); }); // add new objects for (const obj of after) { if (!before.includes(obj)) { scope.objects.push(obj); } } // remove deleted objects for (const obj of before) { if (!after.includes(obj)) { const idx = scope.objects.indexOf(obj); if (idx == -1) { throw new Error('unknown error'); } scope.objects.splice(idx, 1); } } if (rst.exit) { return rst; } return {}; } ['stmt:100:/foreach'](vm, scope, stmt, next) { scope.trace.into(() => { scope.objects.forEach((o, i) => { scope.trace.step(i); scope.object = o; vm.eval(stmt['/foreach'], scope); }); }); scope.object = null; return {}; } ['stmt:100:/values'](vm, scope, stmt, next) { const evaluatedValues = vm.runtime.evalObject(vm, scope, stmt['/values'] || {}); scope.defineValues(evaluatedValues); return {}; } ['stmt:100:/assign'](vm, scope, stmt, next) { const values = vm.runtime.evalObject(vm, scope, stmt['/assign'] || {}); for (const key of Object.keys(values)) { if (key in scope.values) { scope.values[key] = values[key]; } else { const msg = `value ${key} is not defined`; throw (0, utils_1.pktError)(scope, new Error(msg), msg); } } return {}; } ['stmt:100:/exit'](vm, scope, stmt, next) { const value = vm.runtime.evalObject(vm, scope, stmt['/exit']); if (value) { return { exit: true }; } else { return {}; } } ['stmt:100:/add'](vm, scope, stmt, next) { const object = vm.runtime.evalObject(vm, scope, stmt['/add']); scope.add(object); return {}; } ['stmt:100:/script'](vm, scope, stmt, next) { vm.eval(stmt['/script'], scope); return {}; } ['stmt:100:/template'](vm, scope, stmt, next) { const objects = vm.runtime.evalTemplateAll(vm, scope, stmt['/template']); objects.forEach(object => scope.add(object)); return {}; } ['stmt:100:/include'](vm, scope, stmt, next) { const rpath = stmt['/include']; const _with = stmt['/with'] || {}; const objects = []; scope.child2({ objects }, (cscope) => { vm.runtime.executeFile(vm, cscope, rpath, _with); }); scope.objects.push(...objects); return {}; } ['stmt:100:/apply'](vm, scope, stmt, next) { const rpath = stmt['/apply']; const _with = stmt['/with'] || {}; vm.runtime.executeFile(vm, scope, rpath, _with); return {}; } ['stmt:100:/jsonpath'](vm, scope, stmt, next) { const query = stmt['/jsonpath']; const apply = stmt['.apply']; const merge = stmt['.merge']; const exec = stmt['.exec']; const jsonpath = (0, lazy_1.getJsonPath)(); scope.trace.into(() => { scope.objects.forEach((o, i) => { scope.trace.step(i); const nodes = jsonpath.nodes(o, query); nodes.forEach((node) => { scope.child2({}, cscope => { cscope.object = o; cscope.value = node.value; if (apply) { const value = vm.runtime.evalObject(vm, scope, apply); jsonpath.apply(o, jsonpath.stringify(node.path), () => value); } if (merge) { const value = vm.runtime.evalObject(vm, scope, merge); const merged = Object.assign(Object.assign({}, node.value), value); jsonpath.apply(o, jsonpath.stringify(node.path), () => merged); } if (exec) { vm.eval(exec, cscope); } }); }); }); }); return {}; } ['stmt:100:/jsonpatch'](vm, scope, stmt, next) { const jsonpatch = (0, lazy_1.getJsonPatch)(); const patch = Array.isArray(stmt['/jsonpatch']) ? stmt['/jsonpatch'] : [stmt['/jsonpatch']]; scope.trace.into(() => { scope.objects.forEach((o, i) => { scope.trace.step(i); scope.object = o; const p = vm.runtime.evalObject(vm, scope, patch); jsonpatch.apply(o, p); scope.object = null; }); }); scope.object = null; return {}; } ['stmt:100:/routine'](vm, scope, stmt, next) { const objects = []; scope.child2({ objects }, scope => { for (const cstmt of stmt['/routine']) { const rst = vm.execute(scope, cstmt, 'stmt'); if (rst.exit) { return rst; } } }); scope.objects.push(...objects); return {}; } ['stmt:200:/comment'](vm, scope, stmt, next) { return {}; } ['stmt:500:$default'](vm, scope, stmt, next) { if (!stmt) { return {}; } const o = {}; Object.keys(stmt) .filter(k => k.length == 0 || k[0] !== '/') .forEach(k => o[k] = stmt[k]); if (Object.keys(o).length != 0) { const object = vm.runtime.evalObject(vm, scope, o); if (object) { scope.add(object); } } return {}; } } exports.PktRuntime = PktRuntime; ; const createLanguageRuntime = () => new PktRuntime(); exports.createLanguageRuntime = createLanguageRuntime; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2VTcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BrLXRlbXBsYXRlL2xhbmd1YWdlU3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxrQ0FBbUU7QUFDbkUsbUNBQW9FO0FBQ3BFLG9EQUFpRDtBQUNqRCw2Q0FBMEM7QUFDMUMsNERBQW9DO0FBQ3BDLHdDQUF1RTtBQUN2RSxvREFBNEI7QUFDNUIsc0NBQWlEO0FBR2pELCtCQUFrRTtBQUVsRSxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUN6QyxNQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDO0FBS25ELGtDQUFrQztBQUMzQixNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQVEsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFjLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDO0tBQ3ZDO0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtRQUMvRyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9DO0lBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQzNDLENBQUMsQ0FBQTtBQVZZLFFBQUEsVUFBVSxjQVV0QjtBQUVELE1BQWEsVUFBVTtJQUF2QjtRQWdFRSxRQUFRO1FBQ0EsZ0JBQVcsR0FBRyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLE1BQVcsRUFBUSxFQUFFLENBQ3RGLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUF3YjVDLGlCQUFZLEdBQUcsaUJBQWlCLENBQUM7SUFDbkMsQ0FBQztJQTFmUyxlQUFlLENBQUMsVUFBZSxFQUFFLFlBQXFCO1FBQzVELE1BQU0sTUFBTSxtQkFDVixPQUFPLEVBQUUsSUFBSSxFQUNiLEdBQUcsRUFBRSxJQUFJLEVBQ1QsU0FBUyxFQUFFLElBQUksSUFDWixDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FDdEIsQ0FBQztRQUNGLEtBQUssTUFBTSxDQUFDLElBQUksWUFBWSxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLE1BQU07Z0JBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFHTyx3QkFBd0IsQ0FBQyxNQUFrQixFQUFFLFlBQXFCLEVBQUUsR0FBVztRQUNyRixJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6QixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztpQkFDN0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxFQUFFO2dCQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsY0FBYyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUMvRDtTQUNGO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsWUFBcUI7UUFDbEcsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUU7Z0JBQy9DLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFjLEVBQUUsRUFBRTtnQkFDL0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7cUJBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsS0FBYTtRQUMxRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEYsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztTQUNqRTthQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLE1BQVc7UUFDOUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFNTyxlQUFlLENBQUMsTUFBVztRQUNqQyxJQUFBLDZCQUFvQixFQUFDLE1BQU0sRUFBRSxDQUFDLElBQVMsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDbEUsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBQSxnQkFBUSxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR08sZUFBZSxDQUFDLElBQVM7UUFDL0IsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO29CQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDbkI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0I7YUFDRjtTQUNGO2FBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDbkMsSUFBSSxJQUFJLEtBQUssSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDZCxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7b0JBQ3JCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNsQjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNqQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLE1BQVc7UUFDeEUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxZQUFZO0lBQ1osWUFBWSxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFDbEUsTUFBTSxDQUFDLEdBQUcsSUFBQSxvQkFBYSxHQUFFLENBQUM7UUFDMUIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ08sZUFBZSxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVk7UUFDOUUsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLElBQUEsb0JBQWEsR0FBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUEsc0JBQVksRUFBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUNELElBQUk7SUFFSixtREFBbUQ7SUFDbkQsa0JBQWtCO1FBQ2hCLE1BQU0sSUFBSSxHQUE4QjtZQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsWUFBWSxFQUFFLGlCQUFpQjtZQUMvQixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDO1FBQ0YsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxHQUFJLElBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxJQUFJLE9BQU8sSUFBSSxJQUFJLFVBQVUsRUFBRTtnQkFDN0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsRUFBRTtvQkFDTCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDNUQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO3dCQUNaLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNWLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixPQUFPLEVBQUcsSUFBWSxDQUFDLEdBQUcsQ0FBQztxQkFDNUIsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQzdDLElBQUk7WUFDRixPQUFPO2dCQUNMLEdBQUc7Z0JBQ0gsR0FBRyxFQUFFLElBQUEsa0JBQVUsRUFBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFBO1NBQ0Y7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQWEsRUFBRSxNQUFnQjtRQUNyQyxNQUFNLENBQUMsR0FBRyxNQUFNO1lBQ2QsQ0FBQywrQ0FBTSxLQUFLLEdBQUssSUFBQSxlQUFLLEVBQUMsS0FBSyxDQUFDLEdBQUssTUFBTSxFQUN4QyxDQUFDLGlDQUFNLEtBQUssR0FBSyxJQUFBLGVBQUssRUFBQyxLQUFLLENBQUMsQ0FBRSxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxtQkFBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSyxLQUFLLENBQUMsTUFBTSxDQUFFLENBQUM7UUFDeEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUNELENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDN0YsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0saUJBQWlCLENBQUM7UUFFcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBVyxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFzQixDQUFDO1FBRTVDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFBLDZCQUFxQixFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO29CQUNaLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2dCQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQzFELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTt3QkFDWixPQUFPLEVBQUUsQ0FBQztxQkFDWDtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUztRQUMzRSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxpQkFBaUIsQ0FBQztRQUVwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFXLENBQUM7UUFDN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVuQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ1osT0FBTyxFQUFFLENBQUM7YUFDWDtZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDOUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtvQkFDWixPQUFPLEVBQUUsQ0FBQztpQkFDWDthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQ2pHLHNCQUFzQjtRQUN0QixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN2QixLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUU7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM3RixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLHVCQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQzdGLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMzQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNyQjtRQUVELEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFO1lBQzNCLElBQUksV0FBVyxHQUFZLEVBQUUsQ0FBQztZQUU5QixNQUFNLE9BQU8sR0FBVSxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDakQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBRS9CLEtBQUssQ0FBQyxNQUFNLG1DQUNQLEtBQUssQ0FBQyxNQUFNLEdBQ1osV0FBVyxDQUNmLENBQUM7U0FDSDtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQ2pHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLEdBQUcsdUJBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQzlGLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxJQUFBLFlBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDakMsS0FBSyxDQUFDLE1BQU0sbUNBQ1AsS0FBSyxDQUFDLE1BQU0sS0FDZixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FDWixDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM3RixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNuQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QixLQUFLLENBQUMsTUFBTSxtQ0FDUCxLQUFLLENBQUMsTUFBTSxHQUNaLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUMzRCxDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM3RixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCwrQkFBK0I7WUFDL0IsbUJBQW1CO1lBQ25CLHVCQUF1QjtZQUN2QixrREFBa0Q7WUFDbEQsS0FBSztTQUNOO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELENBQUMsY0FBYyxDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQ3pGLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUNELENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDN0YsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM1RixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUNELENBQUMsZUFBZSxDQUFDO1FBQ2YsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUN2QixDQUFDO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM3RixNQUFNLFNBQVMsR0FBRyxtQkFBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILGtCQUFrQjtRQUNsQixLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7U0FDRjtRQUVELHlCQUF5QjtRQUN6QixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDeEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQ2xDO2dCQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBR0QsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ1osT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDOUYsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQzdGLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLEtBQUssQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM3RixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RSxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLEdBQUcsU0FBUyxHQUFHLGlCQUFpQixDQUFDO2dCQUMxQyxNQUFNLElBQUEsZ0JBQVEsRUFBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDNUM7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDM0YsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLEtBQUssRUFBRTtZQUNULE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkI7YUFBTTtZQUNMLE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDMUYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5RCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDN0YsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUMvRixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM5RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBVSxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUE7UUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUEyQixFQUFFLEtBQWEsRUFBRSxJQUFTLEVBQUUsSUFBbUI7UUFDNUYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUMvRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0IsTUFBTSxRQUFRLEdBQUcsSUFBQSxrQkFBVyxHQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQkFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7d0JBQ3hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7d0JBQzFCLElBQUksS0FBSyxFQUFFOzRCQUNULE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQ3RELFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUMvRDt3QkFDRCxJQUFJLEtBQUssRUFBRTs0QkFDVCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUN0RCxNQUFNLE1BQU0sbUNBQVEsSUFBSSxDQUFDLEtBQUssR0FBSyxLQUFLLENBQUUsQ0FBQzs0QkFDM0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQ2hFO3dCQUNELElBQUksSUFBSSxFQUFFOzRCQUNSLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3lCQUN2QjtvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBRWhHLE1BQU0sU0FBUyxHQUFHLElBQUEsbUJBQVksR0FBRSxDQUFDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM1RixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDakIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQzlGLE1BQU0sT0FBTyxHQUFVLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO29CQUNaLE9BQU8sR0FBRyxDQUFDO2lCQUNaO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFL0IsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsS0FBYSxFQUFFLElBQVMsRUFBRSxJQUFtQjtRQUM5RixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBMkIsRUFBRSxLQUFhLEVBQUUsSUFBUyxFQUFFLElBQW1CO1FBQzlGLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsTUFBTSxDQUFDLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQzthQUMxQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDOUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25CO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FFRjtBQTNmRCxnQ0EyZkM7QUFBQSxDQUFDO0FBRUssTUFBTSxxQkFBcUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO0FBQS9DLFFBQUEscUJBQXFCLHlCQUEwQiJ9