gamelet-cli
Version:
Download project from code.gamelet.com, edit/test in vscode and sync back to server.
629 lines • 54.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.database = exports.Database = void 0;
const TimeRange_1 = require("./../types/TimeRange");
const SubmitType_1 = require("./../types/SubmitType");
const file_1 = require("../../utils/file");
const Constant_1 = require("../Constant");
const UserManager_1 = require("./UserManager");
const net_1 = require("../../utils/net");
class Database {
constructor() {
this._userItems = {};
this._userBadges = {};
// key = username|scoreKey
this._userScores = {};
// username / category / key
this._userStates = {};
this._login = {};
this._gltPoints = 100;
}
_initialize(folder) {
this.importBadges(folder + '/static/json/badges.json');
this.importItems(folder + '/static/json/items.json');
this.importScoreModes(folder + '/static/json/score_modes.json');
this._dbFolder = folder + '/.cg/db';
}
importBadges(file) {
(0, file_1.getFileJson)(file)
.then(json => {
this._badges = json.list;
});
}
importItems(file) {
(0, file_1.getFileJson)(file)
.then(json => {
this._items = json.list;
});
}
importScoreModes(file) {
(0, file_1.getFileJson)(file)
.then(json => {
this._scoreModes = json.list;
});
}
requireLogin(user) {
return user;
}
getUserState(username, category, key) {
let uState = this._userStates[username] = this._userStates[username] || {};
let cState = uState[category] = uState[category] || {};
let kState = cState[key] = cState[key] || {
username: username,
category: category,
key: key,
time: (0, net_1.getServerTimestamp)(),
value: '',
};
return kState;
}
listUserStateKeys(username, category) {
let uState = this._userStates[username];
let cState = uState && uState[category];
return cState ? Object.keys(cState) : [];
}
listUserStateCategories(username) {
let uState = this._userStates[username];
return uState ? Object.keys(uState) : [];
}
listScoreModes() {
return Promise.resolve(this._scoreModes);
}
listGameBadges() {
return Promise.resolve(this._badges);
}
getGameBadge(badgeCode) {
return this.listGameBadges().then(list => list.find(b => b.code == badgeCode));
}
getUserBadge(username, badgeCode) {
let list = this._userBadges[username];
return list && list.find(ub => ub.gameBadge.code == badgeCode);
}
addUserBadge(userBadge) {
let list = this._userBadges[userBadge.user.username];
if (!list) {
list = this._userBadges[userBadge.user.username] = [];
}
list.push(userBadge);
}
listGameItems() {
return Promise.resolve(this._items);
}
getGameItem(itemCode) {
return this.listGameItems().then(list => list.find(i => i.code == itemCode));
}
getUserItem(username, itemCode) {
let list = this._userItems[username];
return list && list.find(ui => ui.itemCode == itemCode);
}
addUserItem(userItem) {
let list = this._userItems[userItem.user.username];
if (!list) {
list = this._userItems[userItem.user.username] = [];
}
list.push(userItem);
}
getUserScoreMap(username, scoreKey) {
let key = `${username}|${scoreKey}`;
let userScoreMap = this._userScores[key];
if (!userScoreMap) {
userScoreMap = this._userScores[key] = {
scoreKey: scoreKey,
};
}
return userScoreMap;
}
getUserScore(username, scoreKey, timeRange) {
let userScoreMap = this.getUserScoreMap(username, scoreKey);
return userScoreMap[timeRange.value];
}
submitUserScore(user, scoreKey, timeRange, submitType, score) {
let userScoreMap = this.getUserScoreMap(user.username, scoreKey);
let userScore = userScoreMap[timeRange.value];
if (!userScore) {
userScore = {
user: user,
score: score,
time: (0, net_1.getServerTimestamp)(),
};
userScoreMap[timeRange.value] = userScore;
}
else {
let currentScore = userScore.score;
let newScore = currentScore;
let time = (0, net_1.getServerTimestamp)();
if (submitType == SubmitType_1.SubmitType.KEEP_HIGHEST) {
if (score > currentScore) {
newScore = score;
}
}
else if (submitType == SubmitType_1.SubmitType.KEEP_LOWEST) {
if (score < currentScore) {
newScore = score;
}
}
else if (submitType == SubmitType_1.SubmitType.OVERWRITE) {
newScore = score;
}
else if (submitType == SubmitType_1.SubmitType.ADD) {
newScore = currentScore + score;
}
else if (submitType == SubmitType_1.SubmitType.ADD_SINCE) {
newScore = currentScore + score;
time = userScore.time;
}
if (newScore != currentScore) {
userScore.time = time;
userScore.score = newScore;
}
}
return userScore;
}
executeCommand(user, command) {
let key = [command.service, command.method].join('__');
let func = this[key];
if (func) {
return Promise.resolve()
.then(() => {
return func.apply(this, [user].concat(JSON.parse(command.params)));
})
.then(result => {
if (result && result._result_) {
return result._result_;
}
else {
return [result];
}
});
}
else {
return Promise.reject(`${key} is not implemneted in dev database.`);
}
}
// system service----------------
system__echo(user, message) {
return [message];
}
system__debugReport(user, subject, content) {
return [1];
}
// badge service ----------------
badge__listGameBadgesByStatus(user, pcode, statusList) {
return this.listGameBadges()
.then(list => list.filter(badge => statusList.find(status => status.value == badge.status)));
}
badge__listGameBadgesByCodes(user, pcode, badgeCodes) {
return this.listGameBadges()
.then(list => list.filter(badge => badgeCodes.includes(badge.code)));
}
badge__getUserBadge(user, pcode, username, badgeCode) {
let list = this._userBadges[username];
let badge = list && list.find(ub => ub.gameBadge.code == badgeCode);
return this.getUserBadge(username, badgeCode);
}
badge__awardBadge(user, pcode, badgeCode) {
return this.getGameBadge(badgeCode)
.then(badge => {
if (!badge) {
return Promise.reject('Badge not found');
}
let me = this.requireLogin(user);
let userBadge = this.getUserBadge(me.username, badgeCode);
if (userBadge && userBadge.count && !badge.repeatable) {
return Promise.reject('The user already has the badge');
}
if (!userBadge) {
userBadge = {
user: me,
gameBadge: badge,
count: 0,
createTime: (0, net_1.getServerTimestamp)(),
modifyTime: 0,
};
this.addUserBadge(userBadge);
}
badge.aquired++;
userBadge.count++;
userBadge.modifyTime = (0, net_1.getServerTimestamp)();
return userBadge;
});
}
badge__removeUserBadge(user, pcode, badgeCode) {
return this.getGameBadge(badgeCode)
.then(badge => {
if (!badge) {
return Promise.reject('Badge not found');
}
let me = this.requireLogin(user);
let userBadge = this.getUserBadge(me.username, badgeCode);
if (!userBadge || !userBadge.count) {
throw new Error('The user does not have the badge');
}
badge.aquired -= userBadge.count;
userBadge.count = 0;
return Promise.resolve();
});
}
badge__listUserBadgesByUser(user, pcode, username) {
return (this._userBadges[username] || []);
}
badge__listUserBadgesByBadge(user, pcode, badgeCode, start, length) {
let list = [];
for (let uname in this._userBadges) {
let ubadges = this._userBadges[uname];
let ubadge = ubadges.find(ub => ub.gameBadge.code == badgeCode);
if (ubadge) {
list.push(ubadge);
}
}
if (start < list.length) {
return list.slice(start, length);
}
return [];
}
// client service ----------------------
client__getMsgServerUrl(user, pcode) {
return 'http://localhost:' + Constant_1.Constant.ServerPort;
}
client__isAllowGltDollar(user, pcode) {
return true;
}
// item service ------------------------
item__awardItem(user, pcode, itemCode, count) {
return this.getGameItem(itemCode)
.then(item => {
if (!item) {
return Promise.reject('Item not found');
}
if (count <= 0) {
return Promise.reject('count is 0 or less');
}
let me = this.requireLogin(user);
let userItem = this.getUserItem(me.username, itemCode);
if (userItem) {
if (item.validDays) {
if (userItem.count >= 1) {
return Promise.reject('A user can have only one of this item.');
}
}
else if (userItem.count >= item.limitPerUser) {
return Promise.reject('The amount of the item exceeded its limit');
}
}
else {
userItem = {
user: me,
itemCode: itemCode,
count: 0,
expireTime: 0,
modifyTime: 0,
};
this.addUserItem(userItem);
}
userItem.count++;
let validDays = item.validDays ? item.validDays : 3650;
userItem.expireTime = (0, net_1.getServerTimestamp)(validDays * Constant_1.Constant.ONE_DAY);
userItem.modifyTime = (0, net_1.getServerTimestamp)(0);
return userItem;
});
}
item__consumeItem(user, pcode, itemCode, count) {
return this.getGameItem(itemCode)
.then(item => {
if (!item) {
return Promise.reject('Item not found');
}
if (count < 0) {
return Promise.reject('count is a negative number');
}
let me = this.requireLogin(user);
let userItem = this.getUserItem(me.username, itemCode);
if (!userItem || !userItem.count) {
return Promise.reject('The user does not have the item');
}
let newCount = userItem.count - count;
if (newCount < 0) {
return Promise.reject('The user does not have enough of the item to consume');
}
userItem.count = newCount;
return userItem;
});
}
item__listGameItems(user, pcode) {
return this.listGameItems();
}
item__listGameItemsByStatus(user, pcode, statusCodes) {
return this.listGameItems()
.then(list => list.filter(item => statusCodes.includes(item.status)));
}
item__listGameItemsByCodes(user, pcode, itemCodes) {
return this.listGameItems()
.then(list => list.filter(item => itemCodes.includes(item.code)));
}
item__getUserItem(user, pcode, itemCode) {
let me = this.requireLogin(user);
let userItem = this.getUserItem(me.username, itemCode);
if (userItem && userItem.count > 0) {
return userItem;
}
else {
return null;
}
}
item__requireUserItem(user, pcode, itemCode, count) {
let me = this.requireLogin(user);
let userItem = this.getUserItem(me.username, itemCode);
if (count > 0) {
if (!userItem || userItem.count < count) {
throw new Error('Insufficient amount of the item');
}
}
return userItem;
}
item__requireOneOfUserItems(user, pcode, itemCodes, counts) {
let me = this.requireLogin(user);
return itemCodes.map((itemCode, index) => {
let userItem = this.getUserItem(me.username, itemCode);
let count = counts[index];
if (count > 0) {
if (!userItem || userItem.count < counts[index]) {
throw new Error('Insufficient amount of an item');
}
}
return userItem;
});
}
item__listUserItemsByCodesAndClient(user, pcode, clientCode, itemCodes) {
if (clientCode == pcode) {
return this.item__listUserItems(user, pcode, 0, 1000).filter(ui => itemCodes.includes(ui.itemCode));
}
return [];
}
item__listUserItems(user, pcode, start, length) {
let me = this.requireLogin(user);
let list = this._userItems[me.username] || [];
return list;
}
// score service
score__listPublicScoreModes() {
return this.listScoreModes().then(list => list.filter(mode => !mode.disabled && mode.length));
}
score__submitScore(user, pcode, scoreKey, score, submitTypeValue) {
let me = this.requireLogin(user);
let submitType = SubmitType_1.SubmitType.getByValue(submitTypeValue);
TimeRange_1.TimeRange.listAll().forEach(timeRange => {
this.submitUserScore(me, scoreKey, timeRange, submitType, score);
});
return this.getUserScoreMap(me.username, scoreKey);
}
score__submitScores(user, pcode, submits) {
let list = submits.map(submit => {
return this.score__submitScore(user, pcode, submit[0], submit[1], submit[2]);
});
return list;
}
score__getScore(user, pcode, scoreKey, timeRange) {
let me = this.requireLogin(user);
return this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange)) || {
user: me,
score: 0,
time: 0,
};
}
score__getScoreMap(user, pcode, scoreKey) {
let me = this.requireLogin(user);
return this.getUserScoreMap(me.username, scoreKey);
}
score__getScoreAndRank(user, pcode, scoreKey, timeRange, orderType, timestamp) {
let me = user;
let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
if (!userScore) {
return {
_result_: [null, 0, (0, net_1.getServerTimestamp)()]
};
}
return [userScore, 1, (0, net_1.getServerTimestamp)()];
}
score__listScores(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length) {
let me = user;
let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
return {
scores: userScore ? [userScore] : [],
rankStart: 1,
periodStart: (0, net_1.getServerTimestamp)(),
};
}
score__listScoresAndRankAroundUser(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length) {
return this.score__listScores(user, pcode, scoreKey, timeRange, orderType, timestamp, start, length);
}
score__getScoresTotal(user, pcode, scoreKey, timeRange) {
let me = user;
let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
return userScore ? 1 : 0;
}
score__listScoresByUsernames(user, pcode, scoreKey, usernames, timeRange, timestamp) {
let me = user;
let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
if (userScore && usernames.includes(userScore.user.username)) {
let scoreMap = {};
scoreMap[userScore.user.username] = userScore;
return {
_result_: [[userScore], scoreMap]
};
}
else {
return {
_result_: [[], {}]
};
}
}
score__listScoresHistory(user, pcode, scoreKey, timeRange, startTime, endTime) {
let me = user;
let userScore = me && this.getUserScore(me.username, scoreKey, TimeRange_1.TimeRange.getByValue(timeRange));
return userScore ? [userScore] : [];
}
score__listCurrencyScores(user, pcode) {
let me = this.requireLogin(user);
return this.listScoreModes()
.then(modes => modes.filter(mode => mode.toDollarRate))
.then(modes => {
let list = [];
modes.forEach(mode => {
let userScore = this.getUserScore(me.username, mode.key, TimeRange_1.TimeRange.HISTORY);
if (userScore) {
let scoreWithMode = Object.assign({
scoreMode: mode,
}, userScore);
list.push(scoreWithMode);
}
});
return list;
});
}
score__submitGameDollar(user, pcode, scoreKey, score, meta) {
let me = this.requireLogin(user);
return this.listScoreModes()
.then(modes => modes.find(m => m.key == scoreKey))
.then(mode => {
if (!mode || !mode.toDollarRate) {
return Promise.reject('score key is not a currency key');
}
TimeRange_1.TimeRange.listAll().forEach(timeRange => this.submitUserScore(me, scoreKey, timeRange, SubmitType_1.SubmitType.ADD_SINCE, score));
return this.getUserScoreMap(me.username, scoreKey);
});
}
score__submitGameDollars(user, pcode, submits, meta) {
return Promise.all(submits.map(submit => this.score__submitGameDollar(user, pcode, submit[0], submit[1], meta)));
}
// state service
state__getState(user, pcode, username, category, key) {
let userState = this.getUserState(username, category, key);
return userState.time ? userState : null;
}
state__getMyState(user, pcode, category, key) {
let me = this.requireLogin(user);
return this.state__getState(user, pcode, me.username, category, key);
}
state__getMyStateByClient(user, pcode, clientCode, category, key) {
return pcode == clientCode && this.state__getMyState(user, pcode, category, key);
}
state__setState(user, pcode, username, cateogry, key, value) {
let userState = this.getUserState(username, cateogry, key);
userState.value = value;
userState.time = (0, net_1.getServerTimestamp)();
(0, file_1.saveData)(getUserStateFile(this._dbFolder, userState), JSON.stringify(userState));
return userState;
}
state__setMyState(user, pcode, cateogry, key, value) {
let me = this.requireLogin(user);
return this.state__setState(user, pcode, me.username, cateogry, key, value);
}
state__removeState(user, pcode, username, cateogry, key) {
let userState = this.getUserState(username, cateogry, key);
if (userState.time) {
delete userState.value;
delete userState.time;
return 1;
}
else {
return 0;
}
}
state__removeMyState(user, pcode, category, key) {
let me = this.requireLogin(user);
return this.state__removeState(user, pcode, me.username, category, key);
}
state__getStates(user, pcode, usernames, categories, keys) {
let list = [];
for (let uname of usernames) {
const userCats = categories || this.listUserStateCategories(uname);
for (let cat of userCats) {
const catKeys = keys || this.listUserStateKeys(uname, cat);
for (let key of catKeys) {
let userState = this.getUserState(uname, cat, key);
if (userState.time) {
list.push(userState);
}
}
}
}
return list;
}
state__getMyStates(user, pcode, categories, keys) {
let me = this.requireLogin(user);
return this.state__getStates(user, pcode, [me.username], categories, keys);
}
state__getMyStatesByClient(user, pcode, clientCode, categories, keys) {
return pcode == clientCode ? this.state__getMyStates(user, pcode, categories, keys) : [];
}
state__removeStates(user, pcode, usernames, categories, keys) {
let removed = 0;
for (let uname of usernames) {
for (let cat of categories) {
for (let key of keys) {
let userState = this.getUserState(uname, cat, key);
if (userState.time) {
delete userState.value;
delete userState.time;
++removed;
}
}
}
}
return removed;
}
// user service
user__getByUsername(user, pcode, username) {
return UserManager_1.userManager.getByUsername(username);
}
user__listByUsernames(user, pcode, usernames) {
return UserManager_1.userManager.listByUsernames(usernames);
}
user__getWallet(user, pcode) {
let me = this.requireLogin(user);
return this.score__listCurrencyScores(user, pcode)
.then(userScores => {
let dollars = 0;
userScores.forEach(uscore => {
dollars += uscore.score * uscore.scoreMode.toDollarRate;
});
return {
_result_: [
userScores,
me,
dollars,
this._gltPoints,
]
};
});
}
user__getReview(user, pcode) {
return null;
}
// team service
team__getTeamship(pcode, username) {
return null;
}
team__listTeamships(pcode, teamname) {
return [];
}
team__listTeamshipsByUsernames(pcode, usernames) {
return [];
}
team__searchTeams(pcode, searchTerm, start, length) {
return [];
}
// transaction
transaction__listTransactions(pcode, categories, timestamp, backward, start, length) {
return [];
}
transaction__listPurchaseItemTransactions(pcode, itemCode, start, length) {
return [];
}
}
exports.Database = Database;
function getUserStateFile(dbFolder, userState) {
return `${dbFolder}/user/${userState.username}/state/${userState.category}/${userState.key}.json`;
}
exports.database = new Database();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmVyL21hbmFnZXJzL0RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG9EQUFpRDtBQUNqRCxzREFBbUQ7QUFDbkQsMkNBQXlEO0FBQ3pELDBDQUF1QztBQUN2QywrQ0FBNEM7QUFDNUMseUNBQXFEO0FBRXJELE1BQWEsUUFBUTtJQUFyQjtRQU1ZLGVBQVUsR0FBcUMsRUFBRSxDQUFDO1FBQ2xELGdCQUFXLEdBQXNDLEVBQUUsQ0FBQztRQUM1RCwwQkFBMEI7UUFDbEIsZ0JBQVcsR0FBdUMsRUFBRSxDQUFDO1FBQzdELDRCQUE0QjtRQUNwQixnQkFBVyxHQUEwRSxFQUFFLENBQUM7UUFFeEYsV0FBTSxHQUFvRCxFQUFFLENBQUM7UUFFN0QsZUFBVSxHQUFXLEdBQUcsQ0FBQztJQXNtQnJDLENBQUM7SUFsbUJHLFdBQVcsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLENBQUE7UUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcseUJBQXlCLENBQUMsQ0FBQTtRQUNwRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLCtCQUErQixDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFDTyxZQUFZLENBQUMsSUFBWTtRQUM3QixJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDO2FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUNPLFdBQVcsQ0FBQyxJQUFZO1FBQzVCLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUM7YUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBQ08sZ0JBQWdCLENBQUMsSUFBWTtRQUNqQyxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDO2FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFFLEdBQVc7UUFDaEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJO1lBQ3RDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsSUFBSSxFQUFFLElBQUEsd0JBQWtCLEdBQUU7WUFDMUIsS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDeEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUNPLHVCQUF1QixDQUFDLFFBQWdCO1FBQzVDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRU8sY0FBYztRQUNsQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyxjQUFjO1FBQ2xCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNPLFlBQVksQ0FBQyxTQUFpQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDTyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxTQUFpQjtRQUNwRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ08sWUFBWSxDQUFDLFNBQXVCO1FBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ08sYUFBYTtRQUNqQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDTyxXQUFXLENBQUMsUUFBZ0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ08sV0FBVyxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDbEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ08sV0FBVyxDQUFDLFFBQXFCO1FBQ3JDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU8sZUFBZSxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDdEQsSUFBSSxHQUFHLEdBQUcsR0FBRyxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEIsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUc7Z0JBQ25DLFFBQVEsRUFBRSxRQUFRO2FBQ3JCLENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUNPLFlBQVksQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsU0FBb0I7UUFDekUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDTyxlQUFlLENBQUMsSUFBYSxFQUFFLFFBQWdCLEVBQUUsU0FBb0IsRUFBRSxVQUFzQixFQUFFLEtBQWE7UUFDaEgsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksU0FBUyxHQUFpQixZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNiLFNBQVMsR0FBRztnQkFDUixJQUFJLEVBQUUsSUFBSTtnQkFDVixLQUFLLEVBQUUsS0FBSztnQkFDWixJQUFJLEVBQUUsSUFBQSx3QkFBa0IsR0FBRTthQUM3QixDQUFBO1lBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM1QixJQUFJLElBQUksR0FBRyxJQUFBLHdCQUFrQixHQUFFLENBQUM7WUFDaEMsSUFBSSxVQUFVLElBQUksdUJBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7b0JBQ3ZCLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQUksVUFBVSxJQUFJLHVCQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlDLElBQUksS0FBSyxHQUFHLFlBQVksRUFBRSxDQUFDO29CQUN2QixRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFVBQVUsSUFBSSx1QkFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM1QyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLENBQUM7aUJBQU0sSUFBSSxVQUFVLElBQUksdUJBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEMsUUFBUSxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDcEMsQ0FBQztpQkFBTSxJQUFJLFVBQVUsSUFBSSx1QkFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM1QyxRQUFRLEdBQUcsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsQ0FBQztZQUVELElBQUksUUFBUSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUMzQixTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDdEIsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7WUFDL0IsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQWEsRUFBRSxPQUFZO1FBQ3RDLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUvQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFO2lCQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM1QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUE7Z0JBQzFCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ25CLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQTtRQUVWLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDTCxDQUFDO0lBRUQsaUNBQWlDO0lBQ3pCLFlBQVksQ0FBQyxJQUFhLEVBQUUsT0FBWTtRQUM1QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNPLG1CQUFtQixDQUFDLElBQWEsRUFBRSxPQUFlLEVBQUUsT0FBZTtRQUN2RSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsaUNBQWlDO0lBQ3pCLDZCQUE2QixDQUFDLElBQWEsRUFBRSxLQUFhLEVBQUUsVUFBOEI7UUFDOUYsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFO2FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BHLENBQUM7SUFDTyw0QkFBNEIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFVBQXlCO1FBQ3hGLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRTthQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFDTyxtQkFBbUIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsU0FBaUI7UUFDekYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNPLGlCQUFpQixDQUFDLElBQWEsRUFBRSxLQUFhLEVBQUUsU0FBaUI7UUFDckUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQzthQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzFELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2IsU0FBUyxHQUFHO29CQUNSLElBQUksRUFBRSxFQUFFO29CQUNSLFNBQVMsRUFBRSxLQUFLO29CQUNoQixLQUFLLEVBQUUsQ0FBQztvQkFDUixVQUFVLEVBQUUsSUFBQSx3QkFBa0IsR0FBRTtvQkFDaEMsVUFBVSxFQUFFLENBQUM7aUJBQ2hCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixTQUFTLENBQUMsVUFBVSxHQUFHLElBQUEsd0JBQWtCLEdBQUUsQ0FBQztZQUM1QyxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFDTyxzQkFBc0IsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFNBQWlCO1FBQzFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7YUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNULE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUNELEtBQUssQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQztZQUNqQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNwQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFDTywyQkFBMkIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCO1FBQzlFLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDTyw0QkFBNEIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDL0csSUFBSSxJQUFJLEdBQW1CLEVBQUUsQ0FBQztRQUM5QixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQztZQUNoRSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsd0NBQXdDO0lBQ2hDLHVCQUF1QixDQUFDLElBQWEsRUFBRSxLQUFhO1FBQ3hELE9BQU8sbUJBQW1CLEdBQUcsbUJBQVEsQ0FBQyxVQUFVLENBQUM7SUFDckQsQ0FBQztJQUNPLHdCQUF3QixDQUFDLElBQWEsRUFBRSxLQUFhO1FBQ3pELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUNELHdDQUF3QztJQUNoQyxlQUFlLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLEtBQWE7UUFDakYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQzthQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNiLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqQixJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO29CQUNwRSxDQUFDO2dCQUNMLENBQUM7cUJBQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDN0MsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osUUFBUSxHQUFHO29CQUNQLElBQUksRUFBRSxFQUFFO29CQUNSLFFBQVEsRUFBRSxRQUFRO29CQUNsQixLQUFLLEVBQUUsQ0FBQztvQkFDUixVQUFVLEVBQUUsQ0FBQztvQkFDL0IsVUFBVSxFQUFFLENBQUM7aUJBQ0UsQ0FBQTtnQkFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFDRCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZELFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBQSx3QkFBa0IsRUFBQyxTQUFTLEdBQUcsbUJBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RSxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUEsd0JBQWtCLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBQ08saUJBQWlCLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLEtBQWE7UUFDbkYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQzthQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNaLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFFRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMvQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDdEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDbEYsQ0FBQztZQUNELFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1lBQzFCLE9BQU8sUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUNPLG1CQUFtQixDQUFDLElBQWEsRUFBRSxLQUFhO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQy9CLENBQUM7SUFDTywyQkFBMkIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFdBQXFCO1FBQ25GLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRTthQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzdFLENBQUM7SUFDTywwQkFBMEIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFNBQW1CO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRTthQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFDTyxpQkFBaUIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCO1FBQ3BFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUNPLHFCQUFxQixDQUFDLElBQWEsRUFBRSxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxLQUFhO1FBQ3ZGLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBQ08sMkJBQTJCLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxTQUFtQixFQUFFLE1BQWdCO1FBQ25HLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7Z0JBQ3RELENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBQ08sbUNBQW1DLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxVQUFrQixFQUFFLFNBQW1CO1FBQzdHLElBQUksVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNPLG1CQUFtQixDQUFDLElBQWEsRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDbkYsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELGdCQUFnQjtJQUNSLDJCQUEyQjtRQUMvQixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQ2pHLENBQUM7SUFDTyxrQkFBa0IsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsS0FBYSxFQUFFLGVBQXVCO1FBQzdHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxVQUFVLEdBQUcsdUJBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEQscUJBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBQ08sbUJBQW1CLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxPQUFxQjtRQUMzRSxJQUFJLElBQUksR0FBc0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ08sZUFBZSxDQUFDLElBQWEsRUFBRSxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtRQUNyRixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJO1lBQ2hGLElBQUksRUFBRSxFQUFFO1lBQ1IsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLEVBQUUsQ0FBQztTQUNWLENBQUM7SUFDTixDQUFDO0lBQ08sa0JBQWtCLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQjtRQUNyRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDTyxzQkFBc0IsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCO1FBQ2xJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUNkLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLHFCQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2IsT0FBTztnQkFDSCxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUEsd0JBQWtCLEdBQUUsQ0FBQzthQUM1QyxDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUEsd0JBQWtCLEdBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDTyxpQkFBaUIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDNUosSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2QsSUFBSSxTQUFTLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUscUJBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNoRyxPQUFPO1lBQ0gsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQyxTQUFTLEVBQUUsQ0FBQztZQUNaLFdBQVcsRUFBRSxJQUFBLHdCQUFrQixHQUFFO1NBQ3BDLENBQUE7SUFDTCxDQUFDO0lBQ08sa0NBQWtDLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLEtBQWEsRUFBRSxNQUFjO1FBQzdLLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBQ08scUJBQXFCLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLFNBQWlCO1FBQzNGLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUNkLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLHFCQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDTyw0QkFBNEIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsU0FBbUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCO1FBQzFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUNkLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLHFCQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0QsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUM5QyxPQUFPO2dCQUNILFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDO2FBQ3BDLENBQUE7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU87Z0JBQ0gsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNyQixDQUFBO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLE9BQWU7UUFDbEksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2QsSUFBSSxTQUFTLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUscUJBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNoRyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3ZDLENBQUM7SUFDTyx5QkFBeUIsQ0FBQyxJQUFhLEVBQUUsS0FBYTtRQUMxRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRTthQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksSUFBSSxHQUFnQyxFQUFFLENBQUM7WUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUscUJBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDWixJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO3dCQUM5QixTQUFTLEVBQUUsSUFBSTtxQkFDbEIsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUE7WUFDRixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFDTyx1QkFBdUIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsS0FBYSxFQUFFLElBQTRCO1FBQ3ZILElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFO2FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDO2FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNULElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO1lBQzVELENBQUM7WUFDRCxxQkFBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsdUJBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNySCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLE9BQWMsRUFBRSxJQUE0QjtRQUN2RyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BILENBQUM7SUFFRCxnQkFBZ0I7SUFDUixlQUFlLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQUUsR0FBVztRQUNqRyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0QsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBQ08saUJBQWlCLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLEdBQVc7UUFDakYsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ08seUJBQXlCLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxVQUFrQixFQUFFLFFBQWdCLEVBQUUsR0FBVztRQUM3RyxPQUFPLEtBQUssSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFDTyxlQUFlLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQUUsR0FBVyxFQUFFLEtBQWE7UUFDaEgsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBQSx3QkFBa0IsR0FBRSxDQUFDO1FBQ3RDLElBQUEsZUFBUSxFQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDTyxpQkFBaUIsQ0FBQyxJQUFhLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsR0FBVyxFQUFFLEtB