angular-odata
Version:
Client side OData typescript library for Angular
645 lines • 90.9 kB
JavaScript
const COMPARISON_OPERATORS = ['eq', 'ne', 'gt', 'ge', 'lt', 'le'];
const LOGICAL_OPERATORS = ['and', 'or', 'not'];
const COLLECTION_OPERATORS = ['any', 'all'];
const BOOLEAN_FUNCTIONS = ['startswith', 'endswith', 'contains'];
const SUPPORTED_EXPAND_PROPERTIES = [
'expand',
'levels',
'select',
'top',
'count',
'orderby',
'filter',
];
const FUNCTION_REGEX = /\((.*)\)/;
const INDEXOF_REGEX = /(?!indexof)\((\w+)\)/;
export var StandardAggregateMethods;
(function (StandardAggregateMethods) {
StandardAggregateMethods["sum"] = "sum";
StandardAggregateMethods["min"] = "min";
StandardAggregateMethods["max"] = "max";
StandardAggregateMethods["average"] = "average";
StandardAggregateMethods["countdistinct"] = "countdistinct";
})(StandardAggregateMethods || (StandardAggregateMethods = {}));
export var QueryCustomTypes;
(function (QueryCustomTypes) {
QueryCustomTypes[QueryCustomTypes["Raw"] = 0] = "Raw";
QueryCustomTypes[QueryCustomTypes["Alias"] = 1] = "Alias";
QueryCustomTypes[QueryCustomTypes["Duration"] = 2] = "Duration";
QueryCustomTypes[QueryCustomTypes["Binary"] = 3] = "Binary";
})(QueryCustomTypes || (QueryCustomTypes = {}));
//https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_QueryOptions
export const raw = (value) => ({
type: QueryCustomTypes.Raw,
value,
});
export const alias = (value, name) => ({
type: QueryCustomTypes.Alias,
value,
name,
});
export const duration = (value) => ({
type: QueryCustomTypes.Duration,
value,
});
export const binary = (value) => ({
type: QueryCustomTypes.Binary,
value,
});
export const isQueryCustomType = (value) => typeof value === 'object' &&
'type' in value &&
value.type in QueryCustomTypes;
export const isRawType = (value) => isQueryCustomType(value) &&
value.type === QueryCustomTypes.Raw;
export const ITEM_ROOT = '';
export default function ({ select, search, skiptoken, format, top, skip, filter, transform, compute, orderBy, key, count, expand, action, func, aliases, escape, } = {}) {
const [path, params] = buildPathAndQuery({
select,
search,
skiptoken,
format,
top,
skip,
filter,
transform,
compute,
orderBy,
key,
count,
expand,
action,
func,
aliases,
escape,
});
return buildUrl(path, params);
}
export function buildPathAndQuery({ select, search, skiptoken, format, top, skip, filter, apply, transform, compute, orderBy, key, count, expand, action, func, aliases, escape, } = {}) {
let path = '';
aliases = aliases || [];
const query = {};
// key is not (null, undefined)
if (key != undefined) {
path += `(${normalizeValue(key, { aliases, escape })})`;
}
// Select
if (select) {
query.$select = isRawType(select)
? select.value
: Array.isArray(select)
? select.join(',')
: select;
}
// Compute
if (compute) {
query.$compute = isRawType(compute)
? compute.value
: Array.isArray(compute)
? compute.join(',')
: compute;
}
// Search
if (search) {
query.$search = search;
}
// Skiptoken
if (skiptoken) {
query.$skiptoken = skiptoken;
}
// Format
if (format) {
query.$format = format;
}
// Filter
if (filter || typeof count === 'object') {
query.$filter = buildFilter(typeof count === 'object' ? count : filter, {
aliases,
escape,
});
}
// Transform
if (transform) {
query.$apply = buildTransforms(transform, { aliases, escape });
}
// Apply
if (apply) {
query.$apply = query.$apply
? query.$apply + '/' + buildApply(apply, { aliases, escape })
: buildApply(apply, { aliases, escape });
}
// Expand
if (expand) {
query.$expand = buildExpand(expand, { aliases, escape });
}
// OrderBy
if (orderBy) {
query.$orderby = buildOrderBy(orderBy);
}
// Count
if (isRawType(count)) {
query.$count = count.value;
}
else if (typeof count === 'boolean') {
query.$count = true;
}
else if (count) {
path += '/$count';
}
// Top
if (isRawType(top)) {
query.$top = top.value;
}
else if (typeof top === 'number') {
query.$top = top;
}
// Skip
if (isRawType(skip)) {
query.$top = skip.value;
}
else if (typeof skip === 'number') {
query.$skip = skip;
}
if (action) {
path += `/${action}`;
}
if (func) {
if (typeof func === 'string') {
path += `/${func}()`;
}
else if (typeof func === 'object') {
const [funcName] = Object.keys(func);
const funcArgs = normalizeValue(func[funcName], {
aliases,
escape,
});
path += `/${funcName}(${funcArgs})`;
}
}
if (aliases.length > 0) {
Object.assign(query, aliases.reduce((acc, alias) => Object.assign(acc, {
[`@${alias.name}`]: normalizeValue(alias.value, {
escape,
}),
}), {}));
}
// Filter empty values
const params = Object.entries(query)
.filter(([, value]) => value !== undefined && value !== '')
.reduce((acc, [key, value]) => Object.assign(acc, { [key]: value }), {});
return [path, params];
}
function renderPrimitiveValue(key, val, { aliases, escape, }) {
return `${key} eq ${normalizeValue(val, { aliases, escape })}`;
}
function buildFilter(filters = {}, { aliases, propPrefix, escape, }) {
return (Array.isArray(filters) ? filters : [filters]).reduce((acc, filter) => {
if (filter) {
const builtFilter = buildFilterCore(filter, {
aliases,
propPrefix,
escape,
});
if (builtFilter) {
acc.push(builtFilter);
}
}
return acc;
}, []).join(' and ');
function buildFilterCore(filter = {}, { aliases, propPrefix, escape, }) {
let filterExpr = '';
if (isRawType(filter)) {
// Use raw query custom filter string
filterExpr = filter.value;
}
else if (typeof filter === 'string') {
// Use raw filter string
filterExpr = filter;
}
else if (filter && typeof filter === 'object') {
const filtersArray = Object.keys(filter).reduce((result, filterKey) => {
const value = filter[filterKey];
let propName = '';
if (propPrefix) {
if (filterKey === ITEM_ROOT) {
propName = propPrefix;
}
else if (INDEXOF_REGEX.test(filterKey)) {
propName = filterKey.replace(INDEXOF_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
? `(${propPrefix})`
: `(${propPrefix}/${$1.trim()})`);
}
else if (FUNCTION_REGEX.test(filterKey)) {
propName = filterKey.replace(FUNCTION_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
? `(${propPrefix})`
: `(${propPrefix}/${$1.trim()})`);
}
else {
propName = `${propPrefix}/${filterKey}`;
}
}
else {
propName = filterKey;
}
if (filterKey === ITEM_ROOT && Array.isArray(value)) {
return result.concat(value.map((arrayValue) => renderPrimitiveValue(propName, arrayValue, { escape, aliases })));
}
if (['number', 'string', 'boolean'].indexOf(typeof value) !== -1 ||
value instanceof Date ||
value === null) {
// Simple key/value handled as equals operator
result.push(renderPrimitiveValue(propName, value, { aliases, escape }));
}
else if (Array.isArray(value)) {
const op = filterKey;
const builtFilters = value
.map((v) => buildFilter(v, { aliases, propPrefix, escape }))
.filter((f) => f)
.map((f) => LOGICAL_OPERATORS.indexOf(op) !== -1 ? `(${f})` : f);
if (builtFilters.length) {
if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
if (builtFilters.length) {
if (op === 'not') {
result.push(parseNot(builtFilters));
}
else {
result.push(`(${builtFilters.join(` ${op} `)})`);
}
}
}
else {
result.push(builtFilters.join(` ${op} `));
}
}
}
else if (LOGICAL_OPERATORS.indexOf(propName) !== -1) {
const op = propName;
const builtFilters = Object.keys(value).map((valueKey) => buildFilterCore({ [valueKey]: value[valueKey] }, { aliases, escape }));
if (builtFilters.length) {
if (op === 'not') {
result.push(parseNot(builtFilters));
}
else {
result.push(`${builtFilters.join(` ${op} `)}`);
}
}
}
else if (typeof value === 'object') {
if ('type' in value) {
result.push(renderPrimitiveValue(propName, value, { aliases, escape }));
}
else {
const operators = Object.keys(value);
operators.forEach((op) => {
if (COMPARISON_OPERATORS.indexOf(op) !== -1) {
result.push(`${propName} ${op} ${normalizeValue(value[op], {
aliases,
escape,
})}`);
}
else if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
if (Array.isArray(value[op])) {
result.push(value[op]
.map((v) => '(' +
buildFilterCore(v, {
aliases,
propPrefix: propName,
escape,
}) +
')')
.join(` ${op} `));
}
else {
result.push('(' +
buildFilterCore(value[op], {
aliases,
propPrefix: propName,
escape,
}) +
')');
}
}
else if (COLLECTION_OPERATORS.indexOf(op) !== -1) {
const collectionClause = buildCollectionClause(filterKey.toLowerCase(), value[op], op, propName);
if (collectionClause) {
result.push(collectionClause);
}
}
else if (op === 'has') {
result.push(`${propName} ${op} ${normalizeValue(value[op], {
aliases,
escape,
})}`);
}
else if (op === 'in') {
const resultingValues = Array.isArray(value[op])
? value[op]
: value[op].value.map((typedValue) => ({
type: value[op].type,
value: typedValue,
}));
result.push(propName +
' in (' +
resultingValues
.map((v) => normalizeValue(v, { aliases, escape }))
.join(',') +
')');
}
else if (BOOLEAN_FUNCTIONS.indexOf(op) !== -1) {
// Simple boolean functions (startswith, endswith, contains)
result.push(`${op}(${propName},${normalizeValue(value[op], {
aliases,
escape,
})})`);
}
else {
// Nested property
const filter = buildFilterCore(value, {
aliases,
propPrefix: propName,
escape,
});
if (filter) {
result.push(filter);
}
}
});
}
}
else if (value === undefined) {
// Ignore/omit filter if value is `undefined`
}
else {
throw new Error(`Unexpected value type: ${value}`);
}
return result;
}, []);
filterExpr = filtersArray.join(' and ');
} /* else {
throw new Error(`Unexpected filters type: ${filter}`);
} */
return filterExpr;
}
function buildCollectionClause(lambdaParameter, value, op, propName) {
let clause = '';
if (typeof value === 'string' || value instanceof String) {
clause = getStringCollectionClause(lambdaParameter, value, op, propName);
}
else if (value) {
// normalize {any:[{prop1: 1}, {prop2: 1}]} --> {any:{prop1: 1, prop2: 1}}; same for 'all',
// simple values collection: {any:[{'': 'simpleVal1'}, {'': 'simpleVal2'}]} --> {any:{'': ['simpleVal1', 'simpleVal2']}}; same for 'all',
const filterValue = Array.isArray(value)
? value.reduce((acc, item) => {
if (item.hasOwnProperty(ITEM_ROOT)) {
if (!acc.hasOwnProperty(ITEM_ROOT)) {
acc[ITEM_ROOT] = [];
}
acc[ITEM_ROOT].push(item[ITEM_ROOT]);
return acc;
}
return { ...acc, ...item };
}, {})
: value;
const filter = buildFilterCore(filterValue, {
aliases,
propPrefix: lambdaParameter,
escape,
});
clause = `${propName}/${op}(${filter ? `${lambdaParameter}:${filter}` : ''})`;
}
return clause;
}
}
function getStringCollectionClause(lambdaParameter, value, collectionOperator, propName) {
let clause = '';
const conditionOperator = collectionOperator == 'all' ? 'ne' : 'eq';
clause = `${propName}/${collectionOperator}(${lambdaParameter}: ${lambdaParameter} ${conditionOperator} '${value}')`;
return clause;
}
function escapeIllegalChars(string) {
string = string.replace(/%/g, '%25');
string = string.replace(/\+/g, '%2B');
string = string.replace(/\//g, '%2F');
string = string.replace(/\?/g, '%3F');
string = string.replace(/#/g, '%23');
string = string.replace(/&/g, '%26');
string = string.replace(/'/g, "''");
return string;
}
export function normalizeValue(value, { aliases, escape = false, } = {}) {
if (typeof value === 'string') {
return escape ? `'${escapeIllegalChars(value)}'` : `'${value}'`;
}
else if (value instanceof Date) {
return value.toISOString();
}
else if (typeof value === 'number') {
return value;
}
else if (Array.isArray(value)) {
return `[${value
.map((d) => normalizeValue(d, { aliases, escape }))
.join(',')}]`;
}
else if (value === null) {
return value;
}
else if (typeof value === 'object') {
switch (value.type) {
case QueryCustomTypes.Raw:
return value.value;
case QueryCustomTypes.Duration:
return `duration'${value.value}'`;
case QueryCustomTypes.Binary:
return `binary'${value.value}'`;
case QueryCustomTypes.Alias:
// Store
if (Array.isArray(aliases)) {
if (value.name === undefined) {
value.name = `a${aliases.length + 1}`;
}
aliases.push(value);
}
return `@${value.name}`;
default:
return Object.entries(value)
.filter(([, v]) => v !== undefined)
.map(([k, v]) => `${k}=${normalizeValue(v, { aliases, escape })}`)
.join(',');
}
}
return value;
}
function buildExpand(expands, { aliases, escape = false, }) {
if (isRawType(expands)) {
return expands.value;
}
else if (typeof expands === 'number') {
return expands;
}
else if (typeof expands === 'string') {
if (expands.indexOf('/') === -1) {
return expands;
}
// Change `Foo/Bar/Baz` to `Foo($expand=Bar($expand=Baz))`
return expands
.split('/')
.reverse()
.reduce((results, item, index, arr) => {
if (index === 0) {
// Inner-most item
return `$expand=${item}`;
}
else if (index === arr.length - 1) {
// Outer-most item, don't add `$expand=` prefix (added above)
return `${item}(${results})`;
}
else {
// Other items
return `$expand=${item}(${results})`;
}
}, '');
}
else if (Array.isArray(expands)) {
return `${expands
.map((e) => buildExpand(e, { aliases, escape }))
.join(',')}`;
}
else if (typeof expands === 'object') {
const expandKeys = Object.keys(expands);
if (expandKeys.some((key) => SUPPORTED_EXPAND_PROPERTIES.indexOf(key.toLowerCase()) !== -1)) {
return expandKeys
.map((key) => {
let value;
switch (key) {
case 'filter':
value = buildFilter(expands[key], {
aliases,
escape,
});
break;
case 'orderBy':
value = buildOrderBy(expands[key]);
break;
case 'levels':
case 'count':
case 'top':
case 'skip':
value = `${expands[key]}`;
if (isRawType(value))
value = value.value;
break;
default:
value = buildExpand(expands[key], { aliases, escape });
}
return `$${key.toLowerCase()}=${value}`;
})
.join(';');
}
else {
return expandKeys
.map((key) => {
const builtExpand = buildExpand(expands[key], { aliases, escape });
return builtExpand ? `${key}(${builtExpand})` : key;
})
.join(',');
}
}
return '';
}
function buildTransforms(transforms, { aliases, escape = false, }) {
// Wrap single object an array for simplified processing
const transformsArray = Array.isArray(transforms) ? transforms : [transforms];
const transformsResult = transformsArray.reduce((result, transform) => {
const { aggregate, filter, groupBy, ...rest } = transform;
// TODO: support as many of the following:
// topcount, topsum, toppercent,
// bottomsum, bottomcount, bottompercent,
// identity, concat, expand, search, compute, isdefined
const unsupportedKeys = Object.keys(rest);
if (unsupportedKeys.length) {
throw new Error(`Unsupported transform(s): ${unsupportedKeys}`);
}
if (aggregate) {
result.push(`aggregate(${buildAggregate(aggregate)})`);
}
if (filter) {
const builtFilter = buildFilter(filter, { aliases, escape });
if (builtFilter) {
result.push(`filter(${buildFilter(builtFilter, { aliases, escape })})`);
}
}
if (groupBy) {
result.push(`groupby(${buildGroupBy(groupBy, { aliases, escape })})`);
}
return result;
}, []);
return transformsResult.join('/') || undefined;
}
function buildAggregate(aggregate) {
// Wrap single object in an array for simplified processing
const aggregateArray = Array.isArray(aggregate) ? aggregate : [aggregate];
return aggregateArray
.map((aggregateItem) => {
return typeof aggregateItem === 'string'
? aggregateItem
: Object.keys(aggregateItem).map((aggregateKey) => {
const aggregateValue = aggregateItem[aggregateKey];
// TODO: Are these always required? Can/should we default them if so?
if (!aggregateValue.with) {
throw new Error(`'with' property required for '${aggregateKey}'`);
}
if (!aggregateValue.as) {
throw new Error(`'as' property required for '${aggregateKey}'`);
}
return `${aggregateKey} with ${aggregateValue.with} as ${aggregateValue.as}`;
});
})
.join(',');
}
function buildGroupBy(groupBy, { aliases, escape = false, }) {
if (!groupBy.properties) {
throw new Error(`'properties' property required for groupBy`);
}
let result = `(${groupBy.properties.join(',')})`;
if (groupBy.transform) {
result += `,${buildTransforms(groupBy.transform, { aliases, escape })}`;
}
return result;
}
function buildOrderBy(orderBy, prefix = '') {
if (isRawType(orderBy)) {
return orderBy.value;
}
else if (Array.isArray(orderBy)) {
return orderBy
.map((value) => Array.isArray(value) &&
value.length === 2 &&
['asc', 'desc'].indexOf(value[1]) !== -1
? value.join(' ')
: value)
.map((v) => `${prefix}${v}`)
.join(',');
}
else if (typeof orderBy === 'object') {
return Object.entries(orderBy)
.map(([k, v]) => buildOrderBy(v, `${k}/`))
.map((v) => `${prefix}${v}`)
.join(',');
}
return `${prefix}${orderBy}`;
}
function buildApply(apply, { aliases, escape = false, }) {
const applyArray = Array.isArray(apply) ? apply : [apply];
return applyArray
.map((v) => normalizeValue(v, { aliases, escape }))
.join('/');
}
function buildUrl(path, params) {
// This can be refactored using URL API. But IE does not support it.
const queries = Object.entries(params).map(([key, value]) => `${key}=${value}`);
return queries.length ? `${path}?${queries.join('&')}` : path;
}
function parseNot(builtFilters) {
return `not (${builtFilters.join(' and ')})`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcXVlcnkvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sMkJBQTJCLEdBQUc7SUFDbEMsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtDQUNULENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7QUFDbEMsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUM7QUFRN0MsTUFBTSxDQUFOLElBQVksd0JBTVg7QUFORCxXQUFZLHdCQUF3QjtJQUNsQyx1Q0FBVyxDQUFBO0lBQ1gsdUNBQVcsQ0FBQTtJQUNYLHVDQUFXLENBQUE7SUFDWCwrQ0FBbUIsQ0FBQTtJQUNuQiwyREFBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBTlcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQU1uQztBQTZDRCxNQUFNLENBQU4sSUFBWSxnQkFLWDtBQUxELFdBQVksZ0JBQWdCO0lBQzFCLHFEQUFHLENBQUE7SUFDSCx5REFBSyxDQUFBO0lBQ0wsK0RBQVEsQ0FBQTtJQUNSLDJEQUFNLENBQUE7QUFDUixDQUFDLEVBTFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUszQjtBQVNELHVHQUF1RztBQUN2RyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFhLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHO0lBQzFCLEtBQUs7Q0FDTixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFVLEVBQUUsSUFBYSxFQUFtQixFQUFFLENBQUMsQ0FBQztJQUNwRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztJQUM1QixLQUFLO0lBQ0wsSUFBSTtDQUNMLENBQUMsQ0FBQztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWEsRUFBbUIsRUFBRSxDQUFDLENBQUM7SUFDM0QsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7SUFDL0IsS0FBSztDQUNOLENBQUMsQ0FBQztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBbUIsRUFBRSxDQUFDLENBQUM7SUFDekQsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE1BQU07SUFDN0IsS0FBSztDQUNOLENBQUMsQ0FBQztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDOUMsT0FBTyxLQUFLLEtBQUssUUFBUTtJQUN6QixNQUFNLElBQUksS0FBSztJQUNmLEtBQUssQ0FBQyxJQUFJLElBQUksZ0JBQWdCLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDdEMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLEtBQXlCLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztBQWtCM0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUU1QixNQUFNLENBQUMsT0FBTyxXQUFjLEVBQzFCLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUCxHQUFHLEVBQ0gsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxFQUNKLE9BQU8sRUFDUCxNQUFNLE1BQ3NCLEVBQUU7SUFDOUIsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztRQUN2QyxNQUFNO1FBQ04sTUFBTTtRQUNOLFNBQVM7UUFDVCxNQUFNO1FBQ04sR0FBRztRQUNILElBQUk7UUFDSixNQUFNO1FBQ04sU0FBUztRQUNULE9BQU87UUFDUCxPQUFPO1FBQ1AsR0FBRztRQUNILEtBQUs7UUFDTCxNQUFNO1FBQ04sTUFBTTtRQUNOLElBQUk7UUFDSixPQUFPO1FBQ1AsTUFBTTtLQUNQLENBQUMsQ0FBQztJQUVILE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFJLEVBQ25DLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULE9BQU8sRUFDUCxPQUFPLEVBQ1AsR0FBRyxFQUNILEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxNQUNzQixFQUFFO0lBQzlCLElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUN0QixPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUV4QixNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7SUFFdEIsK0JBQStCO0lBQy9CLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxHQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25FLENBQUM7SUFFRCxTQUFTO0lBQ1QsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLEtBQUssQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMvQixDQUFDLENBQUUsTUFBcUMsQ0FBQyxLQUFLO1lBQzlDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVELFVBQVU7SUFDVixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1lBQ2pDLENBQUMsQ0FBRSxPQUFzQyxDQUFDLEtBQUs7WUFDL0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUN0QixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVM7SUFDVCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVELFlBQVk7SUFDWixJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsS0FBSyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUVELFNBQVM7SUFDVCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVELFNBQVM7SUFDVCxJQUFJLE1BQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxLQUFLLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ3RFLE9BQU87WUFDUCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7SUFDWixJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsS0FBSyxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFFBQVE7SUFDUixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTTtZQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3RCxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxTQUFTO0lBQ1QsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLEtBQUssQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxVQUFVO0lBQ1YsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLEtBQUssQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxRQUFRO0lBQ1IsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQixLQUFLLENBQUMsTUFBTSxHQUFJLEtBQXlCLENBQUMsS0FBSyxDQUFDO0lBQ2xELENBQUM7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7U0FBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxTQUFTLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU07SUFDTixJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25CLEtBQUssQ0FBQyxJQUFJLEdBQUksR0FBa0MsQ0FBQyxLQUFLLENBQUM7SUFDekQsQ0FBQztTQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU87SUFDUCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxJQUFJLEdBQUksSUFBbUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQztTQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDcEMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQVUsRUFBRTtnQkFDdkQsT0FBTztnQkFDUCxNQUFNO2FBQ1AsQ0FBQyxDQUFDO1lBRUgsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLFFBQVEsR0FBRyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQ1gsS0FBSyxFQUNMLE9BQU8sQ0FBQyxNQUFNLENBQ1osQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDYixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixDQUFDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQzlDLE1BQU07YUFDUCxDQUFDO1NBQ0gsQ0FBQyxFQUNKLEVBQUUsQ0FDSCxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1NBQzFELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFM0UsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FDM0IsR0FBVyxFQUNYLEdBQVEsRUFDUixFQUNFLE9BQU8sRUFDUCxNQUFNLEdBSVA7SUFFRCxPQUFPLEdBQUcsR0FBRyxPQUFPLGNBQWMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2pFLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsVUFBdUIsRUFBRSxFQUN6QixFQUNFLE9BQU8sRUFDUCxVQUFVLEVBQ1YsTUFBTSxHQUNpRTtJQUV6RSxPQUNFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUNuRCxDQUFDLEdBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN4QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRTtnQkFDMUMsT0FBTztnQkFDUCxVQUFVO2dCQUNWLE1BQU07YUFDUCxDQUFDLENBQUM7WUFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsRUFBRSxDQUVMLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWhCLFNBQVMsZUFBZSxDQUN0QixTQUFzQixFQUFFLEVBQ3hCLEVBQ0UsT0FBTyxFQUNQLFVBQVUsRUFDVixNQUFNLEdBQ2lFO1FBRXpFLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RCLHFDQUFxQztZQUNyQyxVQUFVLEdBQUksTUFBMEIsQ0FBQyxLQUFLLENBQUM7UUFDakQsQ0FBQzthQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEMsd0JBQXdCO1lBQ3hCLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQzthQUFNLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUM3QyxDQUFDLE1BQWEsRUFBRSxTQUFTLEVBQUUsRUFBRTtnQkFDM0IsTUFBTSxLQUFLLEdBQUksTUFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQzVCLFFBQVEsR0FBRyxVQUFVLENBQUM7b0JBQ3hCLENBQUM7eUJBQU0sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQ3pDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUNwRCxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssU0FBUzs0QkFDckIsQ0FBQyxDQUFDLElBQUksVUFBVSxHQUFHOzRCQUNuQixDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQ25DLENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDMUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQ3JELEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTOzRCQUNyQixDQUFDLENBQUMsSUFBSSxVQUFVLEdBQUc7NEJBQ25CLENBQUMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FDbkMsQ0FBQztvQkFDSixDQUFDO3lCQUFNLENBQUM7d0JBQ04sUUFBUSxHQUFHLEdBQUcsVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUMxQyxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixRQUFRLEdBQUcsU0FBUyxDQUFDO2dCQUN2QixDQUFDO2dCQUVELElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3BELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFLENBQzVCLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDaEUsQ0FDRixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsSUFDRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM1RCxLQUFLLFlBQVksSUFBSTtvQkFDckIsS0FBSyxLQUFLLElBQUksRUFDZCxDQUFDO29CQUNELDhDQUE4QztvQkFDOUMsTUFBTSxDQUFDLElBQUksQ0FDVCxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQzNELENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDO29CQUNyQixNQUFNLFlBQVksR0FBRyxLQUFLO3lCQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7eUJBQzNELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO3lCQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNwRCxDQUFDO29CQUNKLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUN4QixJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOzRCQUN6QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQ0FDeEIsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7b0NBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQXdCLENBQUMsQ0FBQyxDQUFDO2dDQUNsRCxDQUFDO3FDQUFNLENBQUM7b0NBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDbkQsQ0FBQzs0QkFDSCxDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQzVDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3RELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQztvQkFDcEIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN2RCxlQUFlLENBQ2IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUMvQixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FDcEIsQ0FDRixDQUFDO29CQUNGLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUN4QixJQUFJLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQzs0QkFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBd0IsQ0FBQyxDQUFDLENBQUM7d0JBQ2xELENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNyQyxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDcEIsTUFBTSxDQUFDLElBQUksQ0FDVCxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQzNELENBQUM7b0JBQ0osQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3JDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTs0QkFDdkIsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQ0FDNUMsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLFFBQVEsSUFBSSxFQUFFLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRTtvQ0FDN0MsT0FBTztvQ0FDUCxNQUFNO2lDQUNQLENBQUMsRUFBRSxDQUNMLENBQUM7NEJBQ0osQ0FBQztpQ0FBTSxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNoRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQ0FDN0IsTUFBTSxDQUFDLElBQUksQ0FDVCxLQUFLLENBQUMsRUFBRSxDQUFDO3lDQUNOLEdBQUcsQ0FDRixDQUFDLENBQU0sRUFBRSxFQUFFLENBQ1QsR0FBRzt3Q0FDSCxlQUFlLENBQUMsQ0FBQyxFQUFFOzRDQUNqQixPQUFPOzRDQUNQLFVBQVUsRUFBRSxRQUFROzRDQUNwQixNQUFNO3lDQUNQLENBQUM7d0NBQ0YsR0FBRyxDQUNOO3lDQUNBLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQ25CLENBQUM7Z0NBQ0osQ0FBQztxQ0FBTSxDQUFDO29DQUNOLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRzt3Q0FDRCxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFOzRDQUN6QixPQUFPOzRDQUNQLFVBQVUsRUFBRSxRQUFROzRDQUNwQixNQUFNO3lDQUNQLENBQUM7d0NBQ0YsR0FBRyxDQUNOLENBQUM7Z0NBQ0osQ0FBQzs0QkFDSCxDQUFDO2lDQUFNLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ25ELE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQzVDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFDdkIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUNULEVBQUUsRUFDRixRQUFRLENBQ1QsQ0FBQztnQ0FDRixJQUFJLGdCQUFnQixFQUFFLENBQUM7b0NBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQ0FDaEMsQ0FBQzs0QkFDSCxDQUFDO2lDQUFNLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO2dDQUN4QixNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsUUFBUSxJQUFJLEVBQUUsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29DQUM3QyxPQUFPO29DQUNQLE1BQU07aUNBQ1AsQ0FBQyxFQUFFLENBQ0wsQ0FBQzs0QkFDSixDQUFDO2lDQUFNLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dDQUN2QixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztvQ0FDOUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0NBQ1gsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dDQUN4QyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUk7d0NBQ3BCLEtBQUssRUFBRSxVQUFVO3FDQUNsQixDQUFDLENBQUMsQ0FBQztnQ0FFUixNQUFNLENBQUMsSUFBSSxDQUNULFFBQVE7b0NBQ04sT0FBTztvQ0FDUCxlQUFlO3lDQUNaLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO3lDQUN2RCxJQUFJLENBQUMsR0FBRyxDQUFDO29DQUNaLEdBQUcsQ0FDTixDQUFDOzRCQUNKLENBQUM7aUNBQU0sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQ0FDaEQsNERBQTREO2dDQUM1RCxNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsRUFBRSxJQUFJLFFBQVEsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29DQUM3QyxPQUFPO29DQUNQLE1BQU07aUNBQ1AsQ0FBQyxHQUFHLENBQ04sQ0FBQzs0QkFDSixDQUFDO2lDQUFNLENBQUM7Z0NBQ04sa0JBQWtCO2dDQUNsQixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFO29DQUNwQyxPQUFPO29DQUNQLFVBQVUsRUFBRSxRQUFRO29DQUNwQixNQUFNO2lDQUNQLENBQUMsQ0FBQztnQ0FDSCxJQUFJLE1BQU0sRUFBRSxDQUFDO29DQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQ3RCLENBQUM7NEJBQ0gsQ0FBQzt3QkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7cUJBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQy9CLDZDQUE2QztnQkFDL0MsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBRUQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO1lBRUYsVUFBVSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDOztjQUVJO1FBQ04sT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELFNBQVMscUJBQXFCLENBQzVCLGVBQXVCLEVBQ3ZCLEtBQVUsRUFDVixFQUFVLEVBQ1YsUUFBZ0I7UUFFaEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxNQUFNLEVBQUUsQ0FBQztZQUN6RCxNQUFNLEdBQUcseUJBQXlCLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0UsQ0FBQzthQUFNLElBQUksS0FBSyxFQUFFLENBQUM7WUFDakIsMkZBQTJGO1lBQzNGLHlJQUF5STtZQUN6SSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ3pCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDOzRCQUNuQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixDQUFDO3dCQUNELEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sR0FBRyxDQUFDO29CQUNiLENBQUM7b0JBQ0QsT0FBTyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQzdCLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1IsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUVWLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUU7Z0JBQzFDLE9BQU87Z0JBQ1AsVUFBVSxFQUFFLGVBQWU7Z0JBQzNCLE1BQU07YUFDUCxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxRQUFRLElBQUksRUFBRSxJQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUM1QyxHQUFHLENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUNoQyxlQUF1QixFQUN2QixLQUFVLEVBQ1Ysa0JBQTBCLEVBQzFCLFFBQWdCO0lBRWhCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEUsTUFBTSxHQUFHLEdBQUcsUUFBUSxJQUFJLGtCQUFrQixJQUFJLGVBQWUsS0FBSyxlQUFlLElBQUksaUJBQWlCLEtBQUssS0FBSyxJQUFJLENBQUM7SUFFckgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsTUFBYztJQUN4QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQzVCLEtBQVksRUFDWixFQUNFLE9BQU8sRUFDUCxNQUFNLEdBQUcsS0FBSyxNQUN1QyxFQUFFO0lBRXpELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQztJQUNsRSxDQUFDO1NBQU0sSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsQ0FBQztTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxJQUFJLEtBQUs7YUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzthQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO1NBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixLQUFLLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQixLQUFLLGdCQUFnQixDQUFDLFFBQVE7Z0JBQzVCLE9BQU8sWUFBWSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDcEMsS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUMxQixPQUFPLFVBQVUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ2xDLEtBQUssZ0JBQWdCLENBQUMsS0FBSztnQkFDekIsUUFBUTtnQkFDUixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUM3QixLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEMsQ0FBQztvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QixDQUFDO2dCQUNELE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUI7Z0JBQ0UsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztxQkFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO3FCQUNsQyxHQUFHLENBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ1QsR0FBRyxDQUFDLElBQUksY0FBYyxDQUFDLENBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQzVEO3FCQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNsQixPQUFrQixFQUNsQixFQUNFLE9BQU8sRUFDUCxNQUFNLEdBQUcsS0FBSyxHQUNvQztJQUVwRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQVEsT0FBMkIsQ0FBQyxLQUFLLENBQUM7SUFDNUMsQ0FBQztTQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsT0FBTyxPQUFjLENBQUM7SUFDeEIsQ0FBQztTQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxPQUFPLE9BQU87YUFDWCxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsT0FBTyxFQUFFO2FBQ1QsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLGtCQUFrQjtnQkFDbEIsT0FBTyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sSUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsNkRBQTZEO2dCQUM3RCxPQUFPLEdBQUcsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sQ0FBQztnQkFDTixjQUFjO2dCQUNkLE9BQU8sV0FBVyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEdBQUksT0FBMkM7YUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztTQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QyxJQUNFLFVBQVUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDdkUsRUFDRCxDQUFDO1lBQ0QsT0FBTyxVQUFVO2lCQUNkLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNYLElBQUksS0FBSyxDQUFDO2dCQUNWLFFBQVEsR0FBRyxFQUFFLENBQUM7b0JBQ1osS0FBSyxRQUFRO3dCQUNYLEtBQUssR0FBRyxXQUFXLENBQUUsT0FBb0MsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDOUQsT0FBTzs0QkFDUCxNQUFNO3lCQUNQLENBQUMsQ0FBQzt3QkFDSCxNQUFNO29CQUNSLEtBQUssU0FBUzt3QkFDWixLQUFLLEdBQUcsWUFBWSxDQUNqQixPQUFvQyxDQUFDLEdBQUcsQ0FBZSxDQUN6RCxDQUFDO3dCQUNGLE1BQU07b0JBQ1IsS0FBSyxRQUFRLENBQUM7b0JBQ2QsS0FBSyxPQUFPLENBQUM7b0JBQ2IsS0FBSyxLQUFLLENBQUM7b0JBQ1gsS0FBSyxNQUFNO3dCQUNULEtBQUssR0FBRyxHQUFJLE9BQW9DLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDOzRCQUNsQixLQUFLLEdBQUksS0FBb0MsQ0FBQyxLQUFLLENBQUM7d0JBQ3RELE1BQU07b0JBQ1I7d0JBQ0UsS0FBSyxHQUFHLFdBQVcsQ0FDaEIsT0FBb0MsQ0FBQyxHQUFHLENBQWMsRUFDdkQsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQ3BCLENBQUM7Z0JBQ04sQ0FBQztnQkFDRCxPQUFPLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFDLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sVUFBVTtpQkFDZCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQzVCLE9BQW9DLENBQ25DLEdBQUcsQ0FDd0IsRUFDN0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQ3BCLENBQUM7Z0JBQ0YsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDdEQsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLFVBQXlDLEVBQ3pDLEVBQ0UsT0FBTyxFQUNQLE1BQU0sR0FBRyxLQUFLLEdBQ29DO0lBRXBELHdEQUF3RDtJQUN4RCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMs