@ribajs/bs5
Version:
Bootstrap 5 module for Riba.js
609 lines • 47.7 kB
JavaScript
import { Component } from "@ribajs/core";
import { EventDispatcher } from "@ribajs/events";
import { scrollTo } from "@ribajs/utils/src/dom.js";
import { debounce } from "@ribajs/utils/src/control";
import { Bs5Service } from "../../services/index.js";
import { Dragscroll, ScrollEventsService, getScrollPosition, } from "@ribajs/extras";
const SLIDER_INNER_SELECTOR = ".slider-row";
const SLIDES_SELECTOR = `${SLIDER_INNER_SELECTOR} .slide`;
export class Bs5SliderComponent extends Component {
resizeObserver;
bs5;
get sliderInner() {
return this.querySelector(SLIDER_INNER_SELECTOR);
}
get slideElements() {
return Array.from(this.querySelectorAll(SLIDES_SELECTOR));
}
get controlsElements() {
return this.querySelectorAll(".slider-control-prev, .slider-control-next");
}
get indicatorsElement() {
return this.querySelector(".slider-indicators");
}
static EVENTS = {
scrolling: "scrolling",
scrollended: "scrollended",
};
static get observedAttributes() {
return [
"items",
"slides-to-scroll",
"controls",
"controls-position",
"drag",
"sticky",
"indicators",
"indicators-position",
"infinite",
"columns",
];
}
defaultScope = {
slidesToScroll: 1,
controls: true,
controlsPosition: "inside-middle",
sticky: false,
indicators: true,
indicatorsPosition: "inside-bottom",
drag: false,
touchScroll: true,
angle: "horizontal",
infinite: false,
columns: 0,
items: [],
nextIndex: -1,
prevIndex: -1,
enableNextControl: false,
enablePrevControl: false,
showControls: false,
showIndicators: false,
activeSlides: [],
isScrolling: false,
slideItemStyle: {},
next: this.next.bind(this),
prev: this.prev.bind(this),
goTo: this.goTo.bind(this),
enableTouchScroll: this.enableTouchScroll.bind(this),
disableTouchScroll: this.disableTouchScroll.bind(this),
controlsPositionClass: "",
indicatorsPositionClass: "",
};
static tagName = "bs5-slider";
autobind = true;
dragscrollService;
continuousAutoplayService;
scrollEventsService;
autoplayIntervalIndex = null;
continuousAutoplayIntervalIndex = null;
resumeTimer = null;
routerEvents = new EventDispatcher("main");
scope = {
...this.defaultScope,
};
constructor() {
super();
this.bs5 = Bs5Service.getSingleton();
this.onViewChanges = this.onViewChanges.bind(this);
this.onVisibilityChanged = this.onVisibilityChanged.bind(this);
this.onScroll = this.onScroll.bind(this);
this.onScrollEnd = this.onScrollEnd.bind(this);
}
next() {
this.scrollToNextSlide();
}
prev() {
this.scrollToPrevSlide();
}
goTo(index, fromRight = false) {
if (index === -1 && !this.scope.infinite) {
console.warn(`End of slider reached!`);
return -1;
}
if (index !== -1 && fromRight && this.scope.activeSlides.length > 1) {
index = index - this.scope.activeSlides.length + 1;
if (index < 0) {
index = 0;
}
}
const item = this.scope.items[index];
if (!item || !this.sliderInner || !item.el) {
console.warn(`Slide element with index "${index}" not found!`);
return -1;
}
scrollTo(item.el, 0, this.sliderInner, this.scope.angle);
return index;
}
getNextIndex(currentActive) {
let nextIndex = currentActive + this.scope.slidesToScroll;
if (nextIndex > this.scope.items.length - 1) {
if (this.scope.infinite) {
nextIndex = nextIndex - this.scope.items.length;
}
else {
return -1;
}
}
return nextIndex;
}
getPrevIndex(currentActive) {
let prevIndex = currentActive - this.scope.slidesToScroll;
if (prevIndex < 0) {
if (this.scope.infinite) {
prevIndex = this.scope.items.length - 1 + (prevIndex + 1);
}
else {
return -1;
}
}
return prevIndex;
}
scrollToNextSlide() {
if (this.scope.isScrolling) {
this.scope.nextIndex = this.getNextIndex(this.scope.nextIndex);
this.updateControls();
}
return this.goTo(this.scope.nextIndex, true);
}
scrollToPrevSlide() {
if (this.scope.isScrolling) {
this.scope.prevIndex = this.getPrevIndex(this.scope.prevIndex);
this.updateControls();
}
return this.goTo(this.scope.prevIndex, false);
}
initOptions() {
this.setOptions();
}
setOptions() {
if (this.scope.drag) {
this.enableDesktopDragscroll();
}
else {
this.disableDesktopDragscroll();
}
if (this.scope.touchScroll) {
this.enableTouchScroll();
}
else {
this.disableTouchScroll();
}
this.updateColumns();
this.setControlsOptions();
this.setIndicatorsOptions();
}
updateColumns() {
this.scope.slideItemStyle ||= {};
if (this.scope.columns > 0) {
this.scope.slideItemStyle.flex = `0 0 ${100 / this.scope.columns}%`;
}
else {
this.scope.slideItemStyle.flex = "";
}
}
setControlsOptions() {
const position = this.scope.controlsPosition?.split("-");
if (this.scope.controls && position.length === 2) {
this.scope.controlsPositionClass = `control-${position[0]} control-${position[1]}`;
}
else {
this.scope.controlsPositionClass = "";
}
}
setIndicatorsOptions() {
const positions = this.scope.indicatorsPosition?.split("-");
if (this.scope.indicators && positions.length === 2) {
this.scope.indicatorsPositionClass = `indicators-${positions[0]} indicators-${positions[1]}`;
}
else {
this.scope.indicatorsPositionClass = "";
}
}
_onViewChanges() {
this.debug("onViewChanges");
if (!this.scope.items?.length || !this.slideElements?.length) {
return;
}
try {
this.updateSlides();
}
catch (error) {
this.throw(error);
}
}
onViewChanges = debounce(this._onViewChanges.bind(this));
onVisibilityChanged(event) {
if (event.detail.visible) {
this.dragscrollService?.checkDraggable();
this.continuousAutoplayService?.update();
}
}
onScroll(event) {
this.scope.isScrolling = true;
this.dispatchEvent(new CustomEvent(event.type, { detail: event.detail }));
}
onScrollEnd(event) {
this.scope.isScrolling = false;
if (!this.scope.items?.length) {
return;
}
if (event.detail.direction === "none") {
return;
}
try {
this.updateSlides();
}
catch (error) {
this.throw(error);
}
this.dispatchEvent(new CustomEvent(event.type, { detail: event.detail }));
}
connectedCallback() {
if (this.scope.items.length || this.scope.slideTemplate) {
this.updateItems();
}
else {
this.initItemsByChildren();
}
super.connectedCallback();
this.init(Bs5SliderComponent.observedAttributes);
this.addEventListeners();
}
addEventListeners() {
this.routerEvents.on("newPageReady", this.onViewChanges);
if (window.ResizeObserver) {
this.resizeObserver = new window.ResizeObserver(this.onViewChanges);
this.resizeObserver?.observe(this);
}
window.addEventListener("resize", this.onViewChanges, { passive: true });
this.addEventListener("visibility-changed", this.onVisibilityChanged);
this.sliderInner?.addEventListener(Bs5SliderComponent.EVENTS.scrolling, this.onScroll, {
passive: true,
});
this.sliderInner?.addEventListener(Bs5SliderComponent.EVENTS.scrollended, this.onScrollEnd, {
passive: true,
});
}
removeEventListeners() {
this.routerEvents.off("newPageReady", this.onViewChanges, this);
window.removeEventListener("resize", this.onViewChanges);
this.resizeObserver?.unobserve(this);
this.bs5.events.off("breakpoint:changed", this.onViewChanges, this);
this.removeEventListener("visibility-changed", this.onVisibilityChanged);
this.sliderInner?.removeEventListener(Bs5SliderComponent.EVENTS.scrolling, this.onScroll);
this.sliderInner?.removeEventListener(Bs5SliderComponent.EVENTS.scrollended, this.onScrollEnd);
}
initAll() {
this.initSlideshowInner();
this.initOptions();
this.addEventListeners();
this.updateSlides();
}
async beforeBind() {
await super.beforeBind();
this.validateItems();
}
async afterBind() {
this.initAll();
this.updateItems();
this.classList.add(`${Bs5SliderComponent.tagName}-ready`);
await super.afterBind();
}
async afterAllBind() {
this.updateItems();
await super.afterAllBind();
}
initSlideshowInner() {
if (!this.sliderInner) {
this.throw(new Error("Can't init slider inner!"));
return;
}
this.scrollEventsService = new ScrollEventsService(this.sliderInner);
}
enableDesktopDragscroll() {
if (!this.dragscrollService) {
if (!this.sliderInner) {
return;
}
const dragscrollOptions = { detectGlobalMove: true };
this.dragscrollService = new Dragscroll(this.sliderInner, dragscrollOptions);
}
}
disableDesktopDragscroll() {
if (this.dragscrollService) {
this.dragscrollService.destroy();
this.dragscrollService = undefined;
}
}
enableTouchScroll() {
this.classList.remove("touchscroll-disabled");
}
disableTouchScroll() {
this.classList.add("touchscroll-disabled");
}
validateItems() {
if (!this.scope.items) {
this.throw(new Error("No items to validate!"));
return;
}
for (let i = 0; i < this.scope.items.length; i++) {
const item = this.scope.items[i];
item.index = item.index || i;
item.active = item.active || false;
}
}
updateItems() {
let hasChange = false;
const slideEls = this.slideElements;
if (!this.scope.slideTemplate) {
slideEls.forEach((slideEl, index) => {
const exists = this.scope.items.find((item) => item.el === slideEl);
if (!exists) {
this.addItemByElement(slideEl, index);
hasChange = true;
}
});
}
for (const item of this.scope.items) {
const exists = slideEls.find((slideEl) => slideEl === item.el);
if (!exists) {
this.removeItem(item.index, false);
hasChange = true;
}
}
if (hasChange) {
this.updateItemIndexes();
this.updateSlides();
}
return hasChange;
}
removeItem(index, updateIndex = true) {
const item = this.scope.items[index];
if (!item) {
return;
}
item.el?.remove();
this.scope.items.splice(index, 1);
if (updateIndex)
this.updateItemIndexes();
}
updateItemIndexes() {
for (let i = 0; i < this.scope.items.length; i++) {
const item = this.scope.items[i];
item.index = i;
}
}
addItemByElement(slideElement, index) {
slideElement.setAttribute("index", index.toString());
const attributes = {
active: false,
index,
el: slideElement,
};
this.scope.items.push(attributes);
}
initItemsByChildren() {
if (!this.slideElements) {
this.throw(new Error("Can't not add items by child's because no slide child's are found!"));
}
this.scope.items = [];
this.slideElements.forEach(this.addItemByElement.bind(this));
}
getScrollPosition() {
if (!this.sliderInner) {
return null;
}
const scrollPosition = getScrollPosition(this.sliderInner);
return scrollPosition;
}
getCurrentClosestNumber(goal, curr, prev) {
return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev;
}
setAllSlidesInactive(excludeIndex = -1) {
for (const item of this.scope.items) {
if (item.index !== excludeIndex) {
item.active = false;
item.el?.classList.remove("active");
}
}
}
setSlideActive(index) {
if (index === -1 || !this.scope.items?.length) {
console.warn(new Error("Most centered slide not found!"));
index = 0;
}
if (!this.scope.items?.[index]) {
index = 0;
}
if (!this.scope.items?.[index]) {
this.throw(new Error("Slide item to set active, not found!"));
return 0;
}
const item = this.scope.items[index];
item.active = true;
item.el?.classList.add("active");
}
setSlidesActive(slides) {
this.setAllSlidesInactive();
for (const slideIndex of slides) {
this.setSlideActive(slideIndex);
}
}
isScrollable() {
if (!this.sliderInner) {
return false;
}
const hasScrollableContent = this.scope.angle === "horizontal"
? this.sliderInner.scrollWidth > this.sliderInner.clientWidth
: this.sliderInner.scrollHeight > this.sliderInner.clientHeight;
return hasScrollableContent;
}
getSlideElementByIndex(index) {
if (!this.sliderInner) {
return undefined;
}
const slideEl = this.sliderInner.querySelector(`[index="${index}"]`);
return slideEl;
}
isSlideVisible(item, offset) {
if (!this.sliderInner) {
return false;
}
const containerRect = this.sliderInner.getBoundingClientRect();
item.el ||= this.getSlideElementByIndex(item.index);
const slideEl = item.el;
if (!slideEl) {
console.warn("Slide element not found!");
return false;
}
const slideRect = slideEl.getBoundingClientRect();
const isVisible = this.scope.angle === "horizontal"
? slideRect.left + offset >= containerRect.left &&
slideRect.right - offset <= containerRect.right
: slideRect.top + offset >= containerRect.top &&
slideRect.bottom - offset <= containerRect.bottom;
return isVisible;
}
getVisibleSlides(offset) {
const activeSlides = [];
if (!this.scope.items?.length) {
return activeSlides;
}
for (const item of this.scope.items) {
if (this.isSlideVisible(item, offset)) {
activeSlides.push(item.index);
}
}
return activeSlides.sort((a, b) => a - b);
}
setVisibleSlidesActive(offset) {
this.setAllSlidesInactive();
const activeSlides = this.getVisibleSlides(offset);
this.setSlidesActive(activeSlides);
return activeSlides;
}
updateActiveSlides(offset = 8) {
const activeSlides = this.setVisibleSlidesActive(offset);
const firstIndex = activeSlides[0] || 0;
const lastIndex = activeSlides[activeSlides.length - 1] || 0;
const prevIndex = this.getPrevIndex(firstIndex);
const nextIndex = this.getNextIndex(lastIndex);
return {
firstIndex,
lastIndex,
activeSlides,
prevIndex,
nextIndex,
};
}
updateSlides(offset = 8, isRetry = false) {
if (!this.scope.items.length) {
return [];
}
const { activeSlides, firstIndex, prevIndex, nextIndex } = this.updateActiveSlides(offset);
if (!activeSlides.length && !isRetry) {
let fallbackOffset = offset * 2;
if (this.scope.angle === "horizontal") {
const slideWidth = this.scope.items[0]?.el?.clientWidth || 0;
if (slideWidth) {
fallbackOffset = Math.round(slideWidth / 2 - 0.5);
}
}
else {
const slideHeight = this.scope.items[0]?.el?.clientHeight || 0;
if (slideHeight) {
fallbackOffset = Math.round(slideHeight / 2 - 0.5);
}
}
return this.updateSlides(fallbackOffset, true);
}
this.scope.activeSlides = activeSlides;
this.scope.prevIndex = prevIndex;
this.scope.nextIndex = nextIndex;
this.updateControls();
this.updateIndicators();
if (this.scope.sticky) {
this.goTo(firstIndex);
}
return activeSlides;
}
updateControls() {
const isScrollable = this.isScrollable();
this.scope.showControls =
this.scope.controls && isScrollable && this.scope.items.length > 1;
if (this.scope.infinite) {
this.scope.enableNextControl = true;
this.scope.enablePrevControl = true;
return;
}
this.scope.enableNextControl =
isScrollable &&
this.scope.nextIndex !== -1 &&
this.scope.nextIndex <= this.scope.items.length - 1;
this.scope.enablePrevControl =
isScrollable && this.scope.prevIndex !== -1 && this.scope.prevIndex >= 0;
}
updateIndicators() {
const isScrollable = this.isScrollable();
this.scope.showIndicators =
this.scope.indicators && isScrollable && this.scope.items.length > 1;
}
requiredAttributes() {
return [];
}
parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) {
super.parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace);
if (attributeName === "items") {
this.validateItems();
}
if (attributeName === "drag") {
if (this.scope.drag) {
this.enableDesktopDragscroll();
}
else {
this.disableDesktopDragscroll();
}
}
if (attributeName === "touchScroll") {
if (this.scope.touchScroll) {
this.enableTouchScroll();
}
else {
this.disableTouchScroll();
}
}
if (attributeName === "controls" || attributeName === "controlsPosition") {
this.setControlsOptions();
}
if (attributeName === "indicators" ||
attributeName === "indicatorsPosition") {
this.setIndicatorsOptions();
}
if (attributeName === "columns") {
this.updateColumns();
}
}
disconnectedCallback() {
this.removeEventListeners();
}
async beforeTemplate() {
const templates = Array.from(this.querySelectorAll("template"));
for (const template of templates) {
const type = template.getAttribute("type");
switch (type) {
case "slide-item":
this.scope.slideTemplate =
template.content.children.item(0)?.outerHTML || undefined;
this.debug("Slide template found!", this.scope.slideTemplate);
break;
default:
console.warn(`Unknown template type: ${type}`, template);
break;
}
}
}
template() {
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LXNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9iczUtc2xpZGVyL2JzNS1zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsVUFBVSxFQUlWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FFbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztBQUU1QyxNQUFNLGVBQWUsR0FBRyxHQUFHLHFCQUFxQixTQUFTLENBQUM7QUFNMUQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFNBQVM7SUFDckMsY0FBYyxDQUFrQjtJQUNoQyxHQUFHLENBQWE7SUFFMUIsSUFBYyxXQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBYyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBYyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFjLGdCQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxJQUFjLGlCQUFpQjtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQU0sR0FBRztRQUNyQixTQUFTLEVBQUUsV0FBVztRQUN0QixXQUFXLEVBQUUsYUFBYTtLQUMzQixDQUFDO0lBRUYsTUFBTSxLQUFLLGtCQUFrQjtRQUMzQixPQUFPO1lBQ0wsT0FBTztZQUNQLGtCQUFrQjtZQUNsQixVQUFVO1lBQ1YsbUJBQW1CO1lBQ25CLE1BQU07WUFDTixRQUFRO1lBQ1IsWUFBWTtZQUNaLHFCQUFxQjtZQUNyQixVQUFVO1lBQ1YsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDO0lBRVMsWUFBWSxHQUE0QjtRQUVoRCxjQUFjLEVBQUUsQ0FBQztRQUNqQixRQUFRLEVBQUUsSUFBSTtRQUNkLGdCQUFnQixFQUFFLGVBQWU7UUFDakMsTUFBTSxFQUFFLEtBQUs7UUFDYixVQUFVLEVBQUUsSUFBSTtRQUNoQixrQkFBa0IsRUFBRSxlQUFlO1FBQ25DLElBQUksRUFBRSxLQUFLO1FBQ1gsV0FBVyxFQUFFLElBQUk7UUFDakIsS0FBSyxFQUFFLFlBQVk7UUFDbkIsUUFBUSxFQUFFLEtBQUs7UUFDZixPQUFPLEVBQUUsQ0FBQztRQUdWLEtBQUssRUFBRSxFQUFFO1FBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNiLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDYixpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsWUFBWSxFQUFFLEtBQUs7UUFDbkIsY0FBYyxFQUFFLEtBQUs7UUFDckIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsV0FBVyxFQUFFLEtBQUs7UUFDbEIsY0FBYyxFQUFFLEVBQUU7UUFHbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEQsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFHdEQscUJBQXFCLEVBQUUsRUFBRTtRQUN6Qix1QkFBdUIsRUFBRSxFQUFFO0tBQzVCLENBQUM7SUFFSyxNQUFNLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztJQUUzQixRQUFRLEdBQUcsSUFBSSxDQUFDO0lBRWhCLGlCQUFpQixDQUFjO0lBRS9CLHlCQUF5QixDQUFjO0lBRXZDLG1CQUFtQixDQUF1QjtJQUUxQyxxQkFBcUIsR0FBa0IsSUFBSSxDQUFDO0lBRTVDLCtCQUErQixHQUFrQixJQUFJLENBQUM7SUFFdEQsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFbEMsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLEtBQUssR0FBNEI7UUFDdEMsR0FBRyxJQUFJLENBQUMsWUFBWTtLQUNyQixDQUFDO0lBRUY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBR3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBR2pELENBQUM7SUFLTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUtNLElBQUk7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBUVMsSUFBSSxDQUFDLEtBQWEsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUM3QyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDO1FBR0QsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDbkQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsS0FBSyxjQUFjLENBQUMsQ0FBQztZQUMvRCxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQztRQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBT1MsWUFBWSxDQUFDLGFBQXFCO1FBQzFDLElBQUksU0FBUyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUUxRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixTQUFTLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNsRCxDQUFDO2lCQUFNLENBQUM7Z0JBRU4sT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQU9TLFlBQVksQ0FBQyxhQUFxQjtRQUMxQyxJQUFJLFNBQVMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFFMUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLENBQUM7Z0JBRU4sT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUtTLGlCQUFpQjtRQUV6QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFLUyxpQkFBaUI7UUFFekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRVMsV0FBVztRQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVTLFVBQVU7UUFDbEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFDO1FBRWpDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUM7UUFDdEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUNqRCxHQUFHLENBQzJCLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEdBQUcsV0FBVyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVTLG9CQUFvQjtRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FDcEQsR0FBRyxDQUM2QixDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixHQUFHLGNBQWMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9GLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFUyxjQUFjO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVTLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUV6RCxtQkFBbUIsQ0FBQyxLQUFrQjtRQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVTLFFBQVEsQ0FBQyxLQUFxQztRQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFOUIsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsSUFBSSxXQUFXLENBQW9CLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQ3pFLENBQUM7SUFDSixDQUFDO0lBRVMsV0FBVyxDQUFDLEtBQXFDO1FBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDOUIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUdELElBQUksQ0FBQyxhQUFhLENBQ2hCLElBQUksV0FBVyxDQUFvQixLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFFRCxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBR3pELElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBR0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFHekUsSUFBSSxDQUFDLGdCQUFnQixDQUNuQixvQkFBMkIsRUFDM0IsSUFBSSxDQUFDLG1CQUFtQixDQUN6QixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FDaEMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFDbkMsSUFBSSxDQUFDLFFBQXlCLEVBQzlCO1lBQ0UsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUNoQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUNyQyxJQUFJLENBQUMsV0FBNEIsRUFDakM7WUFDRSxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLG1CQUFtQixDQUN0QixvQkFBMkIsRUFDM0IsSUFBSSxDQUFDLG1CQUFtQixDQUN6QixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FDbkMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFDbkMsSUFBSSxDQUFDLFFBQXlCLENBQy9CLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUNuQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUNyQyxJQUFJLENBQUMsV0FBNEIsQ0FDbEMsQ0FBQztJQUNKLENBQUM7SUFFUyxPQUFPO1FBQ2YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRVMsS0FBSyxDQUFDLFVBQVU7UUFDeEIsTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxLQUFLLENBQUMsU0FBUztRQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDO1FBQzFELE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFUyxLQUFLLENBQUMsWUFBWTtRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVTLGtCQUFrQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1lBQ2xELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFUyx1QkFBdUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBc0IsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxVQUFVLENBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGlCQUFpQixDQUNsQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFUyx3QkFBd0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsYUFBYTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUMvQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBR3BDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3RDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFHRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQU1TLFVBQVUsQ0FBQyxLQUFhLEVBQUUsV0FBVyxHQUFHLElBQUk7UUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxXQUFXO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxZQUF5QixFQUFFLEtBQWE7UUFDakUsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQW1CO1lBQ2pDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsS0FBSztZQUNMLEVBQUUsRUFBRSxZQUFZO1NBQ2pCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQU1TLG1CQUFtQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQ1IsSUFBSSxLQUFLLENBQ1Asb0VBQW9FLENBQ3JFLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFUyxpQkFBaUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQVNTLHVCQUF1QixDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsSUFBWTtRQUN4RSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRSxDQUFDO0lBRVMsb0JBQW9CLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFhO1FBQ3BDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7WUFDMUQsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDWixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVTLGVBQWUsQ0FBQyxNQUFnQjtRQUN4QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBR0QsTUFBTSxvQkFBb0IsR0FDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssWUFBWTtZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXO1lBQzdELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUVwRSxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUM1QyxXQUFXLEtBQUssSUFBSSxDQUNOLENBQUM7UUFDakIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVTLGNBQWMsQ0FBQyxJQUFvQixFQUFFLE1BQWM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBR2xELE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFlBQVk7WUFDL0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJO2dCQUM3QyxTQUFTLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxhQUFhLENBQUMsS0FBSztZQUNqRCxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxNQUFNLElBQUksYUFBYSxDQUFDLEdBQUc7Z0JBQzNDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFFeEQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLGdCQUFnQixDQUFDLE1BQWM7UUFDdkMsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM5QixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVTLHNCQUFzQixDQUFDLE1BQWM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkMsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsT0FBTztZQUNMLFVBQVU7WUFDVixTQUFTO1lBQ1QsWUFBWTtZQUNaLFNBQVM7WUFDVCxTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFUyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsS0FBSztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUN0RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFHbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxJQUFJLGNBQWMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUNmLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUM7Z0JBQy9ELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBR0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRVMsY0FBYztRQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRXJFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUNwQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO1lBQzFCLFlBQVk7Z0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO1lBQzFCLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVTLGdCQUFnQjtRQUN4QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBU1MsOEJBQThCLENBQ3RDLGFBQTRDLEVBQzVDLFFBQWEsRUFDYixRQUFhLEVBQ2IsU0FBd0I7UUFFeEIsS0FBSyxDQUFDLDhCQUE4QixDQUNsQyxhQUFhLEVBQ2IsUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLENBQ1YsQ0FBQztRQUVGLElBQUksYUFBYSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksYUFBYSxLQUFLLFVBQVUsSUFBSSxhQUFhLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFDRSxhQUFhLEtBQUssWUFBWTtZQUM5QixhQUFhLEtBQUssb0JBQW9CLEVBQ3RDLENBQUM7WUFDRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBR1Msb0JBQW9CO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBSTlCLENBQUM7SUFFUyxLQUFLLENBQUMsY0FBYztRQUM1QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUNiLEtBQUssWUFBWTtvQkFDZixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7d0JBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksU0FBUyxDQUFDO29CQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQzlELE1BQU07Z0JBRVI7b0JBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3pELE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFUyxRQUFRO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyJ9