UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

583 lines 81.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultTypeFormatter = exports.defaultLinkFormatter = exports.defaultAnchorFormatter = exports.MarkdownRenderer = void 0; const markdown_doc_1 = require("./markdown-doc"); const schema_1 = require("../schema"); const transpile_1 = require("../transpile/transpile"); /** * Generates `MarkdownDocument` instances from `API.json` or its parts. * * This class can be used in two ways: * * 1. Instantiate it via the constructor with `options`, which requires * passing in some global context about the module and language you are * generated for. (This context can be found in the top-level `metadata` * field of API.json.) Then, call a `visitXxx` method to generate a * `MarkdownDocument` for the appropriate part of the schema. * * 2. Generate a `MarkdownDocument` from the complete `API.json` using the * `fromSchema` static method (no instantiation needed). Global context is * automatically inferred from the API.json. * * Both choices allow customizing the output via `MarkdownFormattingOptions`. */ class MarkdownRenderer { static fromSchema(schema, options) { const documentation = new markdown_doc_1.MarkdownDocument(); if (schema.version !== schema_1.CURRENT_SCHEMA_VERSION) { throw new Error(`Unexpected schema version: ${schema.version}`); } if (schema.readme) { const md = new markdown_doc_1.MarkdownDocument(); md.lines(schema.readme); documentation.section(md); } if (schema.apiReference) { const renderer = new MarkdownRenderer({ anchorFormatter: options.anchorFormatter, linkFormatter: options.linkFormatter, typeFormatter: options.typeFormatter, language: transpile_1.Language.fromString(schema.language), ...schema.metadata, }); documentation.section(renderer.visitApiReference(schema.apiReference, options.header)); } return documentation; } static fromSubmodules(submodules, fileSuffix, options) { const documentation = new markdown_doc_1.MarkdownDocument(); const renderer = new MarkdownRenderer({ anchorFormatter: options.anchorFormatter, linkFormatter: options.linkFormatter, typeFormatter: options.typeFormatter, language: options.language, packageName: options.packageName, packageVersion: options.packageVersion, }); const apiRef = renderer.visitSubmodules(submodules, fileSuffix); documentation.section(apiRef); return documentation; } constructor(options) { var _a, _b, _c; this.anchorFormatter = (_a = options.anchorFormatter) !== null && _a !== void 0 ? _a : exports.defaultAnchorFormatter; this.linkFormatter = (_b = options.linkFormatter) !== null && _b !== void 0 ? _b : exports.defaultLinkFormatter; this.typeFormatter = (_c = options.typeFormatter) !== null && _c !== void 0 ? _c : exports.defaultTypeFormatter; this.language = options.language; this.metadata = { packageName: options.packageName, packageVersion: options.packageVersion, submodule: options.submodule, }; } visitSubmodules(submodules, fileSuffix) { const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Submodules' }, id: 'submodules' }); md.lines('The following submodules are available:'); md.lines(''); for (const submodule of submodules) { md.lines(`- [${(0, transpile_1.submoduleRelName)(submodule)}](./${(0, transpile_1.submoduleRelName)(submodule)}.${fileSuffix})`); } md.lines(''); return md; } visitApiReference(apiRef, header = { title: 'API Reference', id: 'api-reference' }) { const md = new markdown_doc_1.MarkdownDocument({ header: { title: header.title }, id: header.id }); md.section(this.visitConstructs(apiRef.constructs)); md.section(this.visitStructs(apiRef.structs)); md.section(this.visitClasses(apiRef.classes)); md.section(this.visitInterfaces(apiRef.interfaces)); md.section(this.visitEnums(apiRef.enums)); return md; } visitConstructs(constructs) { if (constructs.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Constructs' } }); for (const construct of constructs) { md.section(this.visitConstruct(construct)); } return md; } visitStructs(structs) { if (structs.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Structs' } }); for (const struct of structs) { md.section(this.visitStruct(struct)); } return md; } visitClasses(classes) { if (classes.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Classes' } }); for (const klass of classes) { md.section(this.visitClass(klass)); } return md; } visitInterfaces(ifaces) { if (ifaces.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Protocols' } }); for (const iface of ifaces) { md.section(this.visitInterface(iface)); } return md; } visitEnums(enums) { if (enums.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Enums' } }); for (const enu of enums) { md.section(this.visitEnum(enu)); } return md; } visitConstruct(construct) { return this.visitClass(construct); } visitStruct(struct) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: struct.id, displayName: struct.displayName, fqn: struct.fqn, ...this.metadata, }), header: { title: struct.displayName }, }); if (struct.docs) { md.docs(struct.docs, this.language); } const initializer = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: `${struct.id}.Initializer`, displayName: 'Initializer', fqn: `${struct.fqn}.Initializer`, ...this.metadata, }), header: { title: 'Initializer' }, }); if (struct.usage) { initializer.code(this.language.toString(), struct.usage); } md.section(initializer); md.section(this.visitProperties(struct.properties)); return md; } visitClass(klass) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: klass.id, displayName: klass.displayName, fqn: klass.fqn, ...this.metadata, }), header: { title: klass.displayName }, }); if (klass.interfaces.length > 0) { const ifaces = []; for (const iface of klass.interfaces) { ifaces.push(this.linkFormatter(iface, this.metadata)); } md.bullet(`${markdown_doc_1.MarkdownDocument.italic('Implements:')} ${ifaces.join(', ')}`); md.lines(''); } if (klass.docs) { md.docs(klass.docs, this.language); } if (klass.initializer) { md.section(this.visitInitializer(klass.initializer)); } md.section(this.visitInstanceMethods(klass.instanceMethods)); md.section(this.visitStaticFunctions(klass.staticMethods)); md.section(this.visitProperties(klass.properties)); md.section(this.visitConstants(klass.constants)); return md; } visitInterface(iface) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: iface.id, displayName: iface.displayName, fqn: iface.fqn, ...this.metadata, }), header: { title: iface.displayName }, }); if (iface.interfaces.length > 0) { const bases = []; for (const base of iface.interfaces) { bases.push(this.linkFormatter(base, this.metadata)); } md.bullet(`${markdown_doc_1.MarkdownDocument.italic('Extends:')} ${bases.join(', ')}`); md.lines(''); } if (iface.implementations.length > 0) { const impls = []; for (const impl of iface.implementations) { impls.push(this.linkFormatter(impl, this.metadata)); } md.bullet(`${markdown_doc_1.MarkdownDocument.italic('Implemented By:')} ${impls.join(', ')}`); md.lines(''); } if (iface.docs) { md.docs(iface.docs, this.language); } md.section(this.visitInstanceMethods(iface.instanceMethods)); md.section(this.visitProperties(iface.properties)); return md; } visitEnum(enu) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: enu.id, displayName: enu.displayName, fqn: enu.fqn, ...this.metadata, }), header: { title: enu.displayName }, }); if (enu.docs) { md.docs(enu.docs, this.language); } md.section(this.visitEnumMembers(enu.members)); return md; } visitEnumMembers(enus) { if (enus.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Members' } }); md.table(this.createTable(enus)); md.split(); for (const enu of enus) { md.section(this.visitEnumMember(enu)); } return md; } visitProperties(properties) { if (properties.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Properties' } }); md.table(this.createTableWithTypes(properties)); md.split(); for (const prop of properties) { md.section(this.visitProperty(prop)); } return md; } visitInitializer(init) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: init.id, displayName: init.displayName, fqn: init.fqn, ...this.metadata, }), header: { title: 'Initializers', }, }); if (init.usage) { md.code(this.language.toString(), init.usage); } md.table(this.createTableWithTypes(init.parameters)); md.split(); for (const param of init.parameters) { md.section(this.visitParameter(param)); } return md; } visitInstanceMethods(methods) { if (methods.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Methods' } }); md.table(this.createTable(methods)); md.split(); for (const method of methods) { md.section(this.visitInstanceMethod(method)); } return md; } visitStaticFunctions(methods) { if (methods.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Static Functions' } }); md.table(this.createTable(methods)); md.split(); for (const method of methods) { md.section(this.visitStaticFunction(method)); } return md; } visitConstants(constants) { if (constants.length === 0) { return markdown_doc_1.MarkdownDocument.EMPTY; } const md = new markdown_doc_1.MarkdownDocument({ header: { title: 'Constants' } }); md.table(this.createTableWithTypes(constants)); md.split(); for (const con of constants) { md.section(this.visitConstant(con)); } return md; } visitEnumMember(em) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: em.id, displayName: em.displayName, fqn: em.fqn, ...this.metadata, }), header: { title: em.displayName, pre: true, strike: em.docs.deprecated, }, }); if (em.docs.deprecated) { md.bullet(`${markdown_doc_1.MarkdownDocument.italic('Deprecated:')} ${em.docs.deprecationReason}`); md.lines(''); } if (em.docs) { md.docs(em.docs, this.language); } md.split(); md.lines(''); return md; } visitProperty(prop) { const optionality = prop.optional ? 'Optional' : 'Required'; const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: prop.id, displayName: prop.displayName, fqn: prop.fqn, ...this.metadata, }), header: { title: prop.displayName, sup: optionality, pre: true, strike: prop.docs.deprecated, }, }); if (prop.docs.deprecated) { md.bullet(`${markdown_doc_1.MarkdownDocument.italic('Deprecated:')} ${prop.docs.deprecationReason}`); md.lines(''); } if (prop.usage) { md.code(this.language.toString(), prop.usage); } const metadata = { Type: this.typeFormatter(prop.type, this.metadata, this.linkFormatter), }; if (prop.default) { const sanitized = markdown_doc_1.MarkdownDocument.sanitize(prop.default); metadata.Default = markdown_doc_1.MarkdownDocument.removeNewlines(sanitized); } for (const [key, value] of Object.entries(metadata)) { md.bullet(`${markdown_doc_1.MarkdownDocument.italic(`${key}:`)} ${value}`); } md.lines(''); if (prop.docs) { md.docs(prop.docs, this.language); } md.split(); return md; } visitParameter(parameter) { const optionality = parameter.optional ? 'Optional' : 'Required'; const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: parameter.id, displayName: parameter.displayName, fqn: parameter.fqn, ...this.metadata, }), header: { title: parameter.displayName, sup: optionality, pre: true, strike: parameter.docs.deprecated, }, }); if (parameter.docs.deprecated) { md.bullet(`${markdown_doc_1.MarkdownDocument.italic('Deprecated:')} ${parameter.docs.deprecationReason}`); md.lines(''); } const metadata = { Type: this.typeFormatter(parameter.type, this.metadata, this.linkFormatter), }; if (parameter.default) { const sanitized = markdown_doc_1.MarkdownDocument.sanitize(parameter.default); metadata.Default = markdown_doc_1.MarkdownDocument.removeNewlines(sanitized); } for (const [key, value] of Object.entries(metadata)) { md.bullet(`${markdown_doc_1.MarkdownDocument.italic(`${key}:`)} ${value}`); } md.lines(''); if (parameter.docs) { md.docs(parameter.docs, this.language); } md.split(); return md; } visitInstanceMethod(method) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: method.id, displayName: method.displayName, fqn: method.fqn, ...this.metadata, }), header: { title: method.displayName, pre: true, strike: method.docs.deprecated, }, }); if (method.usage) { md.code(this.language.toString(), method.usage); } if (method.docs) { md.docs(method.docs, this.language); } for (const param of method.parameters) { md.section(this.visitParameter(param)); } return md; } visitStaticFunction(method) { const md = new markdown_doc_1.MarkdownDocument({ id: this.anchorFormatter({ id: method.id, displayName: method.displayName, fqn: method.fqn, ...this.metadata, }), header: { title: method.displayName, pre: true, strike: method.docs.deprecated, }, }); if (method.usage) { md.code(this.language.toString(), method.usage); } if (method.docs) { md.docs(method.docs, this.language); } for (const param of method.parameters) { md.section(this.visitParameter(param)); } return md; } visitConstant(constant) { return this.visitProperty(constant); } createTable(items) { var _a, _b, _c; const tableRows = []; tableRows.push(['Name', 'Description'].map(markdown_doc_1.MarkdownDocument.bold)); for (const item of items) { const link = markdown_doc_1.MarkdownDocument.pre(this.linkFormatter({ fqn: item.fqn, displayName: item.displayName, id: item.id, ...this.metadata, }, this.metadata)); const description = ((_a = item.docs) === null || _a === void 0 ? void 0 : _a.summary) && ((_b = item.docs) === null || _b === void 0 ? void 0 : _b.summary.length) > 0 ? (_c = item.docs) === null || _c === void 0 ? void 0 : _c.summary : markdown_doc_1.MarkdownDocument.italic('No description.'); tableRows.push([link, description]); } return tableRows; } createTableWithTypes(items) { var _a, _b, _c; const tableRows = []; tableRows.push(['Name', 'Type', 'Description'].map(markdown_doc_1.MarkdownDocument.bold)); for (const item of items) { const link = markdown_doc_1.MarkdownDocument.pre(this.linkFormatter({ fqn: item.fqn, displayName: item.displayName, id: item.id, ...this.metadata, }, this.metadata)); const type = markdown_doc_1.MarkdownDocument.pre(this.typeFormatter(item.type, this.metadata, this.linkFormatter)); const description = ((_a = item.docs) === null || _a === void 0 ? void 0 : _a.summary) && ((_b = item.docs) === null || _b === void 0 ? void 0 : _b.summary.length) > 0 ? (_c = item.docs) === null || _c === void 0 ? void 0 : _c.summary : markdown_doc_1.MarkdownDocument.italic('No description.'); tableRows.push([link, type, description]); } return tableRows; } } exports.MarkdownRenderer = MarkdownRenderer; function sanitize(str) { return str.replace(/ /g, '-'); } const defaultAnchorFormatter = (type) => { // HTML5 allows any character in IDs /except/ whitespace return sanitize(type.id); }; exports.defaultAnchorFormatter = defaultAnchorFormatter; const defaultLinkFormatter = (type, metadata) => { if (type.packageName === metadata.packageName && type.submodule === metadata.submodule) { return `<a href="#${sanitize(type.id)}">${type.displayName}</a>`; } else { // do not display a link if the type isn't in this document return type.fqn; } }; exports.defaultLinkFormatter = defaultLinkFormatter; function isJsiiType(value) { return (value !== null && typeof value === 'object' && (value === null || value === void 0 ? void 0 : value.fqn) && (value === null || value === void 0 ? void 0 : value.id) && (value === null || value === void 0 ? void 0 : value.displayName)); } const defaultTypeFormatter = (type, metadata, linkFormatter) => { var _a; let result = type.formattingPattern; const typeRefs = []; for (const typeRef of (_a = type.types) !== null && _a !== void 0 ? _a : []) { if (isJsiiType(typeRef)) { typeRefs.push(linkFormatter(typeRef, metadata)); } else { typeRefs.push((0, exports.defaultTypeFormatter)(typeRef, metadata, linkFormatter)); } } // substitute referred types into the original string const placeholderMatcher = /\%/g; for (const typeRef of typeRefs) { const matches = placeholderMatcher.exec(result); if (!matches) { // it's possible the number of %'s doesn't match the number of types provided // e.g. csharp unions are currently rendered to `{ name: 'object', types: [type1, type2] }` continue; } const insertionIdx = matches.index; result = result.substring(0, insertionIdx) + typeRef + result.substring(insertionIdx + 1); } return result; }; exports.defaultTypeFormatter = defaultTypeFormatter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tcmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi9yZW5kZXIvbWFya2Rvd24tcmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGlEQUFrRDtBQUNsRCxzQ0FBNFI7QUFDNVIsc0RBQW9FO0FBK0RwRTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQWEsZ0JBQWdCO0lBQ3BCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYyxFQUFFLE9BQWtDO1FBQ3pFLE1BQU0sYUFBYSxHQUFHLElBQUksK0JBQWdCLEVBQUUsQ0FBQztRQUU3QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssK0JBQXNCLEVBQUUsQ0FBQztZQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsRUFBRSxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksZ0JBQWdCLENBQUM7Z0JBQ3BDLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtnQkFDeEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO2dCQUNwQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7Z0JBQ3BDLFFBQVEsRUFBRSxvQkFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUM5QyxHQUFHLE1BQU0sQ0FBQyxRQUFRO2FBQ25CLENBQUMsQ0FBQztZQUVILGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQXdDLEVBQUUsVUFBa0IsRUFBRSxPQUFnQztRQUN6SCxNQUFNLGFBQWEsR0FBRyxJQUFJLCtCQUFnQixFQUFFLENBQUM7UUFFN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztZQUNwQyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3BDLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtZQUNwQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztTQUN2QyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTlCLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFRRCxZQUFZLE9BQWdDOztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQUEsT0FBTyxDQUFDLGVBQWUsbUNBQUksOEJBQXNCLENBQUM7UUFDekUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFBLE9BQU8sQ0FBQyxhQUFhLG1DQUFJLDRCQUFvQixDQUFDO1FBQ25FLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBQSxPQUFPLENBQUMsYUFBYSxtQ0FBSSw0QkFBb0IsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1NBQzdCLENBQUM7SUFDSixDQUFDO0lBRU0sZUFBZSxDQUFDLFVBQXdDLEVBQUUsVUFBa0I7UUFDakYsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RixFQUFFLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDcEQsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNiLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUEsNEJBQWdCLEVBQUMsU0FBUyxDQUFDLE9BQU8sSUFBQSw0QkFBZ0IsRUFBQyxTQUFTLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0saUJBQWlCLENBQ3RCLE1BQTBCLEVBQzFCLFNBQXNDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFO1FBRXJGLE1BQU0sRUFBRSxHQUFHLElBQUksK0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5QyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLGVBQWUsQ0FDcEIsVUFBNkI7UUFFN0IsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sK0JBQWdCLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRSxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxZQUFZLENBQ2pCLE9BQXVCO1FBRXZCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLCtCQUFnQixDQUFDLEtBQUssQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sWUFBWSxDQUNqQixPQUFzQjtRQUV0QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTywrQkFBZ0IsQ0FBQyxLQUFLLENBQUM7UUFDaEMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLElBQUksK0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLGVBQWUsQ0FDcEIsTUFBeUI7UUFFekIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sK0JBQWdCLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxVQUFVLENBQ2YsS0FBbUI7UUFFbkIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sK0JBQWdCLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRSxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxjQUFjLENBQ25CLFNBQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sV0FBVyxDQUNoQixNQUFvQjtRQUVwQixNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDO1lBQzlCLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUN2QixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ2YsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNqQixDQUFDO1lBQ0YsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQztZQUN2QyxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkIsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsY0FBYztnQkFDOUIsV0FBVyxFQUFFLGFBQWE7Z0JBQzFCLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLGNBQWM7Z0JBQ2hDLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakIsQ0FBQztZQUNGLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7U0FDakMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sVUFBVSxDQUNmLEtBQWtCO1FBRWxCLE1BQU0sRUFBRSxHQUFHLElBQUksK0JBQWdCLENBQUM7WUFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQ3ZCLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDWixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztnQkFDZCxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ2pCLENBQUM7WUFDRixNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRTtTQUNyQyxDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLCtCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQzdELEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzNELEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDakQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sY0FBYyxDQUNuQixLQUFzQjtRQUV0QixNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDO1lBQzlCLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUN2QixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1osV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7Z0JBQ2QsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNqQixDQUFDO1lBQ0YsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUU7U0FDckMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRywrQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNqQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLCtCQUFnQixDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUM3RCxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sU0FBUyxDQUNkLEdBQWU7UUFFZixNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDO1lBQzlCLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUN2QixFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO2dCQUM1QixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7Z0JBQ1osR0FBRyxJQUFJLENBQUMsUUFBUTthQUNqQixDQUFDO1lBQ0YsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUU7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDYixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUUvQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxnQkFBZ0IsQ0FDckIsSUFBd0I7UUFFeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sK0JBQWdCLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFWCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxlQUFlLENBQ3BCLFVBQTRCO1FBRTVCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLCtCQUFnQixDQUFDLEtBQUssQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFWCxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxnQkFBZ0IsQ0FDckIsSUFBdUI7UUFFdkIsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQztZQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkIsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNYLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakIsQ0FBQztZQUNGLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsY0FBYzthQUN0QjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckQsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRVgsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLG9CQUFvQixDQUN6QixPQUF1QjtRQUV2QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTywrQkFBZ0IsQ0FBQyxLQUFLLENBQUM7UUFDaEMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLElBQUksK0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVYLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sb0JBQW9CLENBQ3pCLE9BQXVCO1FBRXZCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLCtCQUFnQixDQUFDLEtBQUssQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFWCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLGNBQWMsQ0FDbkIsU0FBMkI7UUFFM0IsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sK0JBQWdCLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVYLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLGVBQWUsQ0FDcEIsRUFBb0I7UUFFcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQztZQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNULFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztnQkFDM0IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO2dCQUNYLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakIsQ0FBQztZQUNGLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVc7Z0JBQ3JCLEdBQUcsRUFBRSxJQUFJO2dCQUNULE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVU7YUFDM0I7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsRUFBRSxDQUFDLE1BQU0sQ0FDUCxHQUFHLCtCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQ3pFLENBQUM7WUFDRixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUViLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLGFBQWEsQ0FDbEIsSUFBb0I7UUFFcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFDL0IsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsVUFBVSxDQUFDO1FBRWYsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQztZQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdkIsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNYLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakIsQ0FBQztZQUNGLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQ3ZCLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixHQUFHLEVBQUUsSUFBSTtnQkFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxNQUFNLENBQ1AsR0FBRywrQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUMzRSxDQUFDO1lBQ0YsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUEyQjtZQUN2QyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUN2RSxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxTQUFTLEdBQUcsK0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRCxRQUFRLENBQUMsT0FBTyxHQUFHLCtCQUFnQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsK0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFWCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxjQUFjLENBQ25CLFNBQTBCO1FBRTFCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBRWpFLE1BQU0sRUFBRSxHQUFHLElBQUksK0JBQWdCLENBQUM7WUFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQ3ZCLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDaEIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO2dCQUNsQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUc7Z0JBQ2xCLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakIsQ0FBQztZQUNGLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsU0FBUyxDQUFDLFdBQVc7Z0JBQzVCLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixHQUFHLEVBQUUsSUFBSTtnQkFDVCxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVO2FBQ2xDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxNQUFNLENBQ1AsR0FBRywrQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUNoRixDQUFDO1lBQ0YsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLENBQUM7UUFHRCxNQUFNLFFBQVEsR0FBUTtZQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUM1RSxDQUFDO1FBRUYsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsTUFBTSxTQUFTLEdBQUcsK0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvRCxRQUFRLENBQUMsT0FBTyxHQUFHLCtCQUFnQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsK0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWIsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRVgsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sbUJBQW1CLENBQ3hCLE1BQW9CO1FBRXBCLE1BQU0sRUFBRSxHQUFHLElBQUksK0JBQWdCLENBQUM7WUFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQ3ZCLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDYixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ2pCLENBQUM7WUFDRixNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUN6QixHQUFHLEVBQUUsSUFBSTtnQkFDVCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEIsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLG1CQUFtQixDQUN4QixNQUFvQjtRQUVwQixNQUFNLEVBQUUsR0FBRyxJQUFJLCtCQUFnQixDQUFDO1lBQzlCLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUN2QixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ2YsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNqQixDQUFDO1lBQ0YsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDekIsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVTthQUMvQjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxhQUFhLENBQ2xCLFFBQXdCO1FBRXhCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQXdCOztRQUMxQyxNQUFNLFNBQVMsR0FBZSxFQUFFLENBQUM7UUFDakMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsK0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLCtCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUNuRCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsR0FBRyxJQUFJLENBQUMsUUFBUTthQUNqQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sV0FBVyxHQUFHLENBQUEsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxPQUFPLEtBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxJQUFJLDBDQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUcsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsT0FBTztnQkFDcEIsQ0FBQyxDQUFDLCtCQUFnQixDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQXNCOztRQUNqRCxNQUFNLFNBQVMsR0FBZSxFQUFFLENBQUM7UUFDakMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLCtCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFM0UsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRywrQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDbkQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNYLEdBQUcsSUFBSSxDQUFDLFFBQVE7YUFDakIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNuQixNQUFNLElBQUksR0FBRywrQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxXQUFXLEdBQUcsQ0FBQSxNQUFBLElBQUksQ0FBQyxJQUFJLDBDQUFFLE9BQU8sS0FBSSxDQUFBLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsT0FBTyxDQUFDLE1BQU0sSUFBRyxDQUFDO2dCQUNyRSxDQUFDLENBQUMsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxPQUFPO2dCQUNwQixDQUFDLENBQUMsK0JBQWdCLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBaHFCRCw0Q0FncUJDO0FBYUQsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFTSxNQUFNLHNCQUFzQixHQUFHLENBQUMsSUFBZ0IsRUFBRSxFQUFFO0lBQ3pELHdEQUF3RDtJQUN4RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBSFcsUUFBQSxzQkFBc0IsMEJBR2pDO0FBRUssTUFBTSxvQkFBb0IsR0FBRyxDQUFDLElBQWdCLEVBQUUsUUFBZ0MsRUFBRSxFQUFFO0lBQ3pGLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZGLE9BQU8sYUFBYSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQztJQUNuRSxDQUFDO1NBQU0sQ0FBQztRQUNOLDJEQUEyRDtRQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUMsQ0FBQztBQVBXLFFBQUEsb0JBQW9CLHdCQU8vQjtBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQVU7SUFDNUIsT0FBTyxDQUNMLEtBQUssS0FBSyxJQUFJO1dBQ1gsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsR0FBRyxDQUFBO1lBQ1YsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEVBQUUsQ0FBQTtZQUNULEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxXQUFXLENBQUEsQ0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFTSxNQUFNLG9CQUFvQixHQUFHLENBQ2xDLElBQWdCLEVBQ2hCLFFBQWdDLEVBQ2hDLGFBQTZFLEVBQ3JFLEVBQUU7O0lBQ1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNwQixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQUEsSUFBSSxDQUFDLEtBQUssbUNBQUksRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBQSw0QkFBb0IsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFFRCxxREFBcUQ7SUFDckQsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDakMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsNkVBQTZFO1lBQzdFLDJGQUEyRjtZQUMzRixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDM0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBN0JXLFFBQUEsb0JBQW9CLHdCQTZCL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBNYXJrZG93bkRvY3VtZW50IH0gZnJvbSAnLi9tYXJrZG93bi1kb2MnO1xuaW1wb3J0IHsgQXBpUmVmZXJlbmNl