truly-ui
Version:
Web Components for Desktop Applications.
266 lines (264 loc) • 38.8 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Input, ContentChildren, Component, forwardRef, ViewChild, Output, EventEmitter } from '@angular/core';
import { TlView } from './view/view';
import * as i0 from "@angular/core";
const globalListeners = [];
export class TlMultiView {
constructor(renderer) {
this.renderer = renderer;
this.transitionTime = '300ms';
this.height = '100%';
this.backdroungColor = 'transparent';
this.selectedChange = new EventEmitter();
this.moving = false;
this.viewBounding = [];
this.currentTranslatePosition = 0;
this.movement = '';
}
ngOnChanges(changes) {
if (!(changes['modelValue'].firstChange)) {
this.changeModelValue(changes['modelValue'].currentValue);
}
}
changeModelValue(value) {
this.modelValue = value;
this.selectedChange.emit(value);
this.changeViewSelected(value);
}
ngAfterContentInit() {
this.handleViewBounding();
this.listenMouseDown();
this.listenMouseUp();
this.listenMouseMove();
this.listenMouseLeave();
const selectedView = this.views.find(view => view.selected);
if (!selectedView && this.views.first) {
this.views.first.selected = true;
}
}
ngAfterViewInit() {
this.setWidthMultiView();
this.setWidthEachView();
this.handleSelectedView();
}
setWidthEachView() {
this.views.forEach((item, index) => {
item.viewComponents.nativeElement.style.width = this.multiViewContainer.nativeElement.offsetWidth + 'px';
if (index > 0) {
item.viewComponents.nativeElement.style.left = this.multiViewContainer.nativeElement.offsetWidth + 'px';
}
});
}
handleSelectedView() {
if (!this.selectedView) {
this.selectedView = this.viewBounding[0];
}
}
handleViewBounding() {
this.views.forEach((item, index) => {
if (!item.value) {
item.value = index + 1;
}
this.viewBounding.push({
viewItem: item,
viewPosition: Math.round(this.multiViewContainer.nativeElement.offsetWidth * (index))
});
});
this.changeViewSelected(this.modelValue);
}
setWidthMultiView() {
this.renderer.setStyle(this.multiViewTranslate.nativeElement, 'width', this.multiViewContainer.nativeElement.offsetWidth * this.views.toArray().length + 'px');
}
listenMouseDown() {
globalListeners.push(this.renderer.listen(this.multiViewContainer.nativeElement, 'mousedown', ($event) => {
this.mouseClickPositionX = $event.clientX;
this.moving = true;
}));
}
listenMouseLeave() {
this.renderer.listen(this.multiViewContainer.nativeElement, 'mouseleave', () => {
this.moving = false;
this.snapViewPosition();
});
}
listenMouseUp() {
globalListeners.push(this.renderer.listen(document, 'mouseup', () => {
this.moving = false;
this.snapViewPosition();
}));
}
snapViewPosition() {
const translateSnap = this.multiViewTranslate.nativeElement.offsetWidth / this.views.length;
this.translateAreaWidth = translateSnap * (this.views.length - 1);
if (this.isDistanceMovedEnoughToSnap(this.getDistanceMoved(), translateSnap)) {
this.isForwardMove() ? this.handleDragForward() : this.handleDragBackward();
}
else {
this.translateSection('-' + this.selectedView.viewPosition, this.transitionTime);
}
}
getDistanceMoved() {
let distanceMoved = parseInt(String(this.movementPosition).replace('-', ''), 10);
if (!this.isSelectedViewIndexGreaterThanZero()) {
return distanceMoved;
}
distanceMoved = this.isForwardMove() ? (distanceMoved - this.selectedView.viewPosition) :
(this.selectedView.viewPosition - distanceMoved);
return distanceMoved;
}
isSelectedViewIndexGreaterThanZero() {
return this.viewBounding.indexOf(this.selectedView) > 0;
}
isDistanceMovedEnoughToSnap(distanceMoved, translateSnap) {
return distanceMoved > (translateSnap / 3);
}
isForwardMove() {
return this.movement === 'forward';
}
handleDragForward() {
const translatePos = parseInt(String(this.currentTranslatePosition).replace('-', ''), 10);
if ((translatePos > this.selectedView.viewPosition)) {
const index = this.viewBounding.indexOf(this.selectedView) + 1;
if (this.viewBounding[index]) {
this.changeModelValue(this.viewBounding[index].viewItem.value);
}
}
}
handleDragBackward() {
const translatePos = parseInt(String(this.currentTranslatePosition).replace('-', ''), 10);
if (translatePos < this.selectedView.viewPosition) {
const index = this.viewBounding.indexOf(this.selectedView) - 1;
if (this.viewBounding[index]) {
this.changeModelValue(this.viewBounding[index].viewItem.value);
}
}
}
listenMouseMove() {
globalListeners.push(this.renderer.listen(window, 'mousemove', ($event) => {
if (this.moving) {
this.translateMove($event);
}
}));
}
translateSection(translate, time) {
this.currentTranslatePosition = translate;
this.handleDuration(time);
this.setTranslate(this.currentTranslatePosition);
}
translateMove($event, time) {
this.movementPosition = this.getMousePosition($event);
const translatePos = this.getTranslateCurrentPosition();
this.setMoveDirection($event);
if (this.isMoving(translatePos)) {
this.movementPosition = $event.movementX - translatePos;
}
if (this.isFirstAndFinished($event, translatePos)) {
this.setTranslate('-' + this.viewBounding[0].viewPosition);
return;
}
if (this.isLastAndFinished($event, translatePos)) {
this.setTranslate('-' + this.viewBounding[this.viewBounding.length - 1].viewPosition);
return;
}
this.handleMovingSlow(time);
}
getTranslateCurrentPosition() {
return parseInt(String(this.currentTranslatePosition).replace('-', ''), 10);
}
handleMovingSlow(time) {
this.handleDuration(time);
this.setTranslate(this.movementPosition);
this.currentTranslatePosition = this.movementPosition;
}
getMousePosition($event) {
return this.multiViewTranslate.nativeElement.offsetLeft + $event.clientX - this.mouseClickPositionX;
}
setTranslate(value) {
this.renderer.setStyle(this.multiViewTranslate.nativeElement, 'transform', 'translateX(' + value + 'px)');
}
isLastAndFinished($event, translatePos) {
return ($event.movementX <= 0) && (translatePos >= this.translateAreaWidth);
}
isMoving(translatePos) {
return translatePos > 0;
}
isFirstAndFinished($event, translatePos) {
return (translatePos === 0) && ($event.movementX >= 0);
}
setMoveDirection($event) {
$event.movementX < 0 ? this.movement = 'forward' : this.movement = 'backward';
}
handleDuration(time) {
time ? this.setTransitionStyle(time) : this.removeTransitionStyle();
}
setTransitionStyle(time) {
this.renderer.setStyle(this.multiViewTranslate.nativeElement, 'transition', 'all ' + time);
}
removeTransitionStyle() {
this.renderer.removeStyle(this.multiViewTranslate.nativeElement, 'transition');
}
selectView(view) {
if (!view) {
return console.warn('TlView with value [' + this.modelValue + '] not found.');
}
this.viewBounding.forEach(item => item.viewItem.selected = false);
this.selectedView = view;
view.selected = true;
}
changeViewSelected(value) {
if ((this.viewBounding.length > 0) && (value)) {
const view = this.viewBounding.filter((item) => item.viewItem.value === value);
this.selectView(view[0]);
this.translateSection('-' + view[0].viewPosition, this.transitionTime);
}
}
ngOnDestroy() {
globalListeners.forEach((value) => {
value();
});
}
}
/** @nocollapse */ TlMultiView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMultiView, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlMultiView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlMultiView, selector: "tl-multiview", inputs: { modelValue: "modelValue", transitionTime: "transitionTime", height: "height", backdroungColor: "backdroungColor" }, outputs: { selectedChange: "selectedChange" }, queries: [{ propertyName: "views", predicate: i0.forwardRef(function () { return TlView; }) }], viewQueries: [{ propertyName: "multiViewContainer", first: true, predicate: ["multiViewContainer"], descendants: true, static: true }, { propertyName: "multiViewTranslate", first: true, predicate: ["multiViewTranslate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-multiview-wrapper\">\n <div class=\"ui-multiview-container\" #multiViewContainer>\n <div class=\"ui-multiview-translate\" #multiViewTranslate [style.height]=\"height\" [style.background]=\"backdroungColor\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: ["*{-webkit-user-select:none;user-select:none;cursor:pointer}.ui-multiview-wrapper{overflow:hidden;width:100%;height:100%;touch-action:pinch-zoom}.ui-multiview-container{position:relative;overflow:visible;width:100%;height:100%}.ui-multiview-translate{position:relative;display:flex}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMultiView, decorators: [{
type: Component,
args: [{ selector: 'tl-multiview', template: "<div class=\"ui-multiview-wrapper\">\n <div class=\"ui-multiview-container\" #multiViewContainer>\n <div class=\"ui-multiview-translate\" #multiViewTranslate [style.height]=\"height\" [style.background]=\"backdroungColor\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: ["*{-webkit-user-select:none;user-select:none;cursor:pointer}.ui-multiview-wrapper{overflow:hidden;width:100%;height:100%;touch-action:pinch-zoom}.ui-multiview-container{position:relative;overflow:visible;width:100%;height:100%}.ui-multiview-translate{position:relative;display:flex}\n"] }]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { modelValue: [{
type: Input
}], transitionTime: [{
type: Input
}], height: [{
type: Input
}], backdroungColor: [{
type: Input
}], views: [{
type: ContentChildren,
args: [forwardRef(() => TlView)]
}], multiViewContainer: [{
type: ViewChild,
args: ['multiViewContainer', { static: true }]
}], multiViewTranslate: [{
type: ViewChild,
args: ['multiViewTranslate', { static: true }]
}], selectedChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGl2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvbXVsdGl2aWV3L211bHRpdmlldy50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL211bHRpdmlldy9tdWx0aXZpZXcuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBQ0wsS0FBSyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQWEsVUFBVSxFQUErQixTQUFTLEVBQ2hHLE1BQU0sRUFBYSxZQUFZLEVBQ2hDLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBRXJDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQU8zQixNQUFNLE9BQU8sV0FBVztJQWtDdEIsWUFBcUIsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTlCL0IsbUJBQWMsR0FBRyxPQUFPLENBQUM7UUFFekIsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUVoQixvQkFBZSxHQUFHLGFBQWEsQ0FBQztRQVF2QixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQU1sQiw2QkFBd0IsR0FBRyxDQUFDLENBQUM7UUFJN0IsYUFBUSxHQUFHLEVBQUUsQ0FBQztJQUlzQixDQUFDO0lBRzdDLFdBQVcsQ0FBRSxPQUFzQjtRQUNqQyxJQUFNLENBQUMsQ0FBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUUsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxLQUFLO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFFLEtBQUssQ0FBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBRSxLQUFLLENBQUUsQ0FBQztJQUNuQyxDQUFDO0lBR0Qsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBRSxDQUFDO1FBQzlELElBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUc7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNsQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLENBQUUsSUFBSSxFQUFFLEtBQUssRUFBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3pHLElBQUssS0FBSyxHQUFHLENBQUMsRUFBRztnQkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN6RztRQUNILENBQUMsQ0FBRSxDQUFDO0lBQ04sQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUUsQ0FBQyxDQUFFLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLENBQUUsSUFBSSxFQUFFLEtBQUssRUFBRyxFQUFFO1lBQ3BDLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFHO2dCQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDeEI7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBRTtnQkFDdEIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBRTthQUN4RixDQUFFLENBQUM7UUFDTixDQUFDLENBQUUsQ0FBQztRQUNKLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUNwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUUsQ0FBQztJQUM3RixDQUFDO0lBRUQsZUFBZTtRQUNiLGVBQWUsQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBRSxNQUFNLEVBQUcsRUFBRTtZQUMzRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDLENBQUUsQ0FBRSxDQUFDO0lBQ1IsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRTtZQUM5RSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUUsQ0FBQztJQUNOLENBQUM7SUFFRCxhQUFhO1FBQ1gsZUFBZSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUNwRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUUsQ0FBRSxDQUFDO0lBQ1IsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFLLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBRztZQUM5RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM3RTthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFFLENBQUM7U0FDcEY7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFFLE1BQU0sQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUUsQ0FBQyxPQUFPLENBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBRSxFQUFFLEVBQUUsQ0FBRSxDQUFDO1FBQ3ZGLElBQUssQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsRUFBRztZQUNoRCxPQUFPLGFBQWEsQ0FBQztTQUN0QjtRQUNELGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN2RixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxrQ0FBa0M7UUFDaEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxhQUFhLEVBQUUsYUFBYTtRQUN0RCxPQUFPLGFBQWEsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBRSxNQUFNLENBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFFLENBQUMsT0FBTyxDQUFFLEdBQUcsRUFBRSxFQUFFLENBQUUsRUFBRSxFQUFFLENBQUUsQ0FBQztRQUNoRyxJQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUc7WUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBRSxHQUFHLENBQUMsQ0FBQztZQUNqRSxJQUFLLElBQUksQ0FBQyxZQUFZLENBQUUsS0FBSyxDQUFFLEVBQUc7Z0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFFLEtBQUssQ0FBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRTtTQUNGO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUUsTUFBTSxDQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBRSxDQUFDLE9BQU8sQ0FBRSxHQUFHLEVBQUUsRUFBRSxDQUFFLEVBQUUsRUFBRSxDQUFFLENBQUM7UUFDaEcsSUFBSyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUc7WUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBRSxHQUFHLENBQUMsQ0FBQztZQUNqRSxJQUFLLElBQUksQ0FBQyxZQUFZLENBQUUsS0FBSyxDQUFFLEVBQUc7Z0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFFLEtBQUssQ0FBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUUsQ0FBQzthQUNwRTtTQUNGO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixlQUFlLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBRSxNQUFNLEVBQUcsRUFBRTtZQUM1RSxJQUFLLElBQUksQ0FBQyxNQUFNLEVBQUc7Z0JBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUUsTUFBTSxDQUFFLENBQUM7YUFDOUI7UUFDSCxDQUFDLENBQUUsQ0FBRSxDQUFDO0lBQ1IsQ0FBQztJQUVELGdCQUFnQixDQUFFLFNBQWMsRUFBRSxJQUFZO1FBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxhQUFhLENBQUUsTUFBTSxFQUFFLElBQUs7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxNQUFNLENBQUUsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUUsTUFBTSxDQUFFLENBQUM7UUFFaEMsSUFBSyxJQUFJLENBQUMsUUFBUSxDQUFFLFlBQVksQ0FBRSxFQUFHO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztTQUN6RDtRQUNELElBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFFLE1BQU0sRUFBRSxZQUFZLENBQUUsRUFBRztZQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFFLENBQUMsQ0FBRSxDQUFDLFlBQVksQ0FBRSxDQUFDO1lBQy9ELE9BQU87U0FDUjtRQUNELElBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFFLE1BQU0sRUFBRSxZQUFZLENBQUUsRUFBRztZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBRSxDQUFDLFlBQVksQ0FBRSxDQUFDO1lBQzFGLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLE9BQU8sUUFBUSxDQUFFLE1BQU0sQ0FBRSxJQUFJLENBQUMsd0JBQXdCLENBQUUsQ0FBQyxPQUFPLENBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBRSxFQUFFLEVBQUUsQ0FBRSxDQUFDO0lBQ3BGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxJQUFJO1FBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUUsSUFBSSxDQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ3hELENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxNQUFNO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDdEcsQ0FBQztJQUVELFlBQVksQ0FBRSxLQUFVO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGFBQWEsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFFLENBQUM7SUFDOUcsQ0FBQztJQUVELGlCQUFpQixDQUFFLE1BQWtCLEVBQUUsWUFBb0I7UUFDekQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELFFBQVEsQ0FBRSxZQUFvQjtRQUM1QixPQUFPLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQixDQUFFLE1BQWtCLEVBQUUsWUFBb0I7UUFDMUQsT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVELGdCQUFnQixDQUFFLE1BQWtCO1FBQ2xDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDaEYsQ0FBQztJQUVELGNBQWMsQ0FBRSxJQUFZO1FBQzFCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFFLElBQUksQ0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUN4RSxDQUFDO0lBRUQsa0JBQWtCLENBQUUsSUFBWTtRQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFFLENBQUM7SUFDL0YsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBRSxDQUFDO0lBQ25GLENBQUM7SUFFRCxVQUFVLENBQUUsSUFBWTtRQUN0QixJQUFLLENBQUMsSUFBSSxFQUFHO1lBQ1gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFFLHFCQUFxQixHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFFLENBQUM7U0FDakY7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxrQkFBa0IsQ0FBRSxLQUFhO1FBQy9CLElBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFHO1lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFFLENBQUUsSUFBSSxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUUsQ0FBQztZQUNuRixJQUFJLENBQUMsVUFBVSxDQUFFLElBQUksQ0FBRSxDQUFDLENBQUUsQ0FBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBRSxHQUFHLEdBQUcsSUFBSSxDQUFFLENBQUMsQ0FBRSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFFLENBQUM7U0FDNUU7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULGVBQWUsQ0FBQyxPQUFPLENBQUUsQ0FBRSxLQUFLLEVBQUcsRUFBRTtZQUNuQyxLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUMsQ0FBRSxDQUFDO0lBQ04sQ0FBQzs7NEhBbFJVLFdBQVc7Z0hBQVgsV0FBVywwUkFVYyxNQUFNLHVUQzdDNUMsOFNBT0E7NEZENEJhLFdBQVc7a0JBTHZCLFNBQVM7K0JBQ0UsY0FBYztnR0FNZixVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRXlDLEtBQUs7c0JBQW5ELGVBQWU7dUJBQUUsVUFBVSxDQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBRTtnQkFFTyxrQkFBa0I7c0JBQXBFLFNBQVM7dUJBQUUsb0JBQW9CLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUVHLGtCQUFrQjtzQkFBcEUsU0FBUzt1QkFBRSxvQkFBb0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRTlCLGNBQWM7c0JBQS9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU29mdHdhcmVcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7XG4gIElucHV0LCBDb250ZW50Q2hpbGRyZW4sIENvbXBvbmVudCwgUXVlcnlMaXN0LCBmb3J3YXJkUmVmLCBBZnRlckNvbnRlbnRJbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3SW5pdCxcbiAgT3V0cHV0LCBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBUbFZpZXcgfSBmcm9tICcuL3ZpZXcvdmlldyc7XG5cbmNvbnN0IGdsb2JhbExpc3RlbmVycyA9IFtdO1xuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndGwtbXVsdGl2aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpdmlldy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL211bHRpdmlldy5zY3NzJyBdLFxufSApXG5leHBvcnQgY2xhc3MgVGxNdWx0aVZpZXcgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgbW9kZWxWYWx1ZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHRyYW5zaXRpb25UaW1lID0gJzMwMG1zJztcblxuICBASW5wdXQoKSBoZWlnaHQgPSAnMTAwJSc7XG5cbiAgQElucHV0KCkgYmFja2Ryb3VuZ0NvbG9yID0gJ3RyYW5zcGFyZW50JztcblxuICBAQ29udGVudENoaWxkcmVuKCBmb3J3YXJkUmVmKCAoKSA9PiBUbFZpZXcgKSApIHZpZXdzOiBRdWVyeUxpc3Q8VGxWaWV3PjtcblxuICBAVmlld0NoaWxkKCAnbXVsdGlWaWV3Q29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0gKSBtdWx0aVZpZXdDb250YWluZXI7XG5cbiAgQFZpZXdDaGlsZCggJ211bHRpVmlld1RyYW5zbGF0ZScsIHtzdGF0aWM6IHRydWV9ICkgbXVsdGlWaWV3VHJhbnNsYXRlO1xuXG4gIEBPdXRwdXQoKSBwcml2YXRlIHNlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcml2YXRlIG1vdmluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdmlld0JvdW5kaW5nID0gW107XG5cbiAgcHJpdmF0ZSBtb3VzZUNsaWNrUG9zaXRpb25YO1xuXG4gIHByaXZhdGUgc2VsZWN0ZWRWaWV3O1xuXG4gIHByaXZhdGUgY3VycmVudFRyYW5zbGF0ZVBvc2l0aW9uID0gMDtcblxuICBwcml2YXRlIHRyYW5zbGF0ZUFyZWFXaWR0aDtcblxuICBwcml2YXRlIG1vdmVtZW50ID0gJyc7XG5cbiAgcHJpdmF0ZSBtb3ZlbWVudFBvc2l0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIgKSB7fVxuXG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKSB7XG4gICAgaWYgKCAgISggY2hhbmdlc1snbW9kZWxWYWx1ZSddLmZpcnN0Q2hhbmdlKSkge1xuICAgICAgdGhpcy5jaGFuZ2VNb2RlbFZhbHVlKCBjaGFuZ2VzWydtb2RlbFZhbHVlJ10uY3VycmVudFZhbHVlICk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlTW9kZWxWYWx1ZSggdmFsdWUgKSB7XG4gICAgdGhpcy5tb2RlbFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KCB2YWx1ZSApO1xuICAgIHRoaXMuY2hhbmdlVmlld1NlbGVjdGVkKCB2YWx1ZSApO1xuICB9XG5cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5oYW5kbGVWaWV3Qm91bmRpbmcoKTtcbiAgICB0aGlzLmxpc3Rlbk1vdXNlRG93bigpO1xuICAgIHRoaXMubGlzdGVuTW91c2VVcCgpO1xuICAgIHRoaXMubGlzdGVuTW91c2VNb3ZlKCk7XG4gICAgdGhpcy5saXN0ZW5Nb3VzZUxlYXZlKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRWaWV3ID0gdGhpcy52aWV3cy5maW5kKCB2aWV3ID0+IHZpZXcuc2VsZWN0ZWQgKTtcbiAgICBpZiAoICFzZWxlY3RlZFZpZXcgJiYgdGhpcy52aWV3cy5maXJzdCApIHtcbiAgICAgIHRoaXMudmlld3MuZmlyc3Quc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNldFdpZHRoTXVsdGlWaWV3KCk7XG4gICAgdGhpcy5zZXRXaWR0aEVhY2hWaWV3KCk7XG4gICAgdGhpcy5oYW5kbGVTZWxlY3RlZFZpZXcoKTtcbiAgfVxuXG4gIHNldFdpZHRoRWFjaFZpZXcoKSB7XG4gICAgdGhpcy52aWV3cy5mb3JFYWNoKCAoIGl0ZW0sIGluZGV4ICkgPT4ge1xuICAgICAgaXRlbS52aWV3Q29tcG9uZW50cy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5tdWx0aVZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XG4gICAgICBpZiAoIGluZGV4ID4gMCApIHtcbiAgICAgICAgaXRlbS52aWV3Q29tcG9uZW50cy5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLm11bHRpVmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICAgIH1cbiAgICB9ICk7XG4gIH1cblxuICBoYW5kbGVTZWxlY3RlZFZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVmlldykge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLnZpZXdCb3VuZGluZ1sgMCBdO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVZpZXdCb3VuZGluZygpIHtcbiAgICB0aGlzLnZpZXdzLmZvckVhY2goICggaXRlbSwgaW5kZXggKSA9PiB7XG4gICAgICBpZiAoICFpdGVtLnZhbHVlICkge1xuICAgICAgICBpdGVtLnZhbHVlID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3Qm91bmRpbmcucHVzaCgge1xuICAgICAgICB2aWV3SXRlbTogaXRlbSxcbiAgICAgICAgdmlld1Bvc2l0aW9uOiBNYXRoLnJvdW5kKCB0aGlzLm11bHRpVmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogKGluZGV4KSApXG4gICAgICB9ICk7XG4gICAgfSApO1xuICAgIHRoaXMuY2hhbmdlVmlld1NlbGVjdGVkKHRoaXMubW9kZWxWYWx1ZSk7XG4gIH1cblxuICBzZXRXaWR0aE11bHRpVmlldygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKCB0aGlzLm11bHRpVmlld1RyYW5zbGF0ZS5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLFxuICAgICAgdGhpcy5tdWx0aVZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIHRoaXMudmlld3MudG9BcnJheSgpLmxlbmd0aCArICdweCcgKTtcbiAgfVxuXG4gIGxpc3Rlbk1vdXNlRG93bigpIHtcbiAgICBnbG9iYWxMaXN0ZW5lcnMucHVzaCggdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMubXVsdGlWaWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nLCAoICRldmVudCApID0+IHtcbiAgICAgIHRoaXMubW91c2VDbGlja1Bvc2l0aW9uWCA9ICRldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgIH0gKSApO1xuICB9XG5cbiAgbGlzdGVuTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5tdWx0aVZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zbmFwVmlld1Bvc2l0aW9uKCk7XG4gICAgfSApO1xuICB9XG5cbiAgbGlzdGVuTW91c2VVcCgpIHtcbiAgICBnbG9iYWxMaXN0ZW5lcnMucHVzaCggdGhpcy5yZW5kZXJlci5saXN0ZW4oIGRvY3VtZW50LCAnbW91c2V1cCcsICgpID0+IHtcbiAgICAgIHRoaXMubW92aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNuYXBWaWV3UG9zaXRpb24oKTtcbiAgICB9ICkgKTtcbiAgfVxuXG4gIHNuYXBWaWV3UG9zaXRpb24oKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlU25hcCA9IHRoaXMubXVsdGlWaWV3VHJhbnNsYXRlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyB0aGlzLnZpZXdzLmxlbmd0aDtcbiAgICB0aGlzLnRyYW5zbGF0ZUFyZWFXaWR0aCA9IHRyYW5zbGF0ZVNuYXAgKiAodGhpcy52aWV3cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoIHRoaXMuaXNEaXN0YW5jZU1vdmVkRW5vdWdoVG9TbmFwKHRoaXMuZ2V0RGlzdGFuY2VNb3ZlZCgpLCB0cmFuc2xhdGVTbmFwKSApIHtcbiAgICAgIHRoaXMuaXNGb3J3YXJkTW92ZSgpID8gdGhpcy5oYW5kbGVEcmFnRm9yd2FyZCgpIDogdGhpcy5oYW5kbGVEcmFnQmFja3dhcmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2xhdGVTZWN0aW9uKCAnLScgKyB0aGlzLnNlbGVjdGVkVmlldy52aWV3UG9zaXRpb24sIHRoaXMudHJhbnNpdGlvblRpbWUgKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXN0YW5jZU1vdmVkKCkge1xuICAgIGxldCBkaXN0YW5jZU1vdmVkID0gcGFyc2VJbnQoIFN0cmluZyggdGhpcy5tb3ZlbWVudFBvc2l0aW9uICkucmVwbGFjZSggJy0nLCAnJyApLCAxMCApO1xuICAgIGlmICggIXRoaXMuaXNTZWxlY3RlZFZpZXdJbmRleEdyZWF0ZXJUaGFuWmVybygpICkge1xuICAgICAgcmV0dXJuIGRpc3RhbmNlTW92ZWQ7XG4gICAgfVxuICAgIGRpc3RhbmNlTW92ZWQgPSB0aGlzLmlzRm9yd2FyZE1vdmUoKSA/IChkaXN0YW5jZU1vdmVkIC0gdGhpcy5zZWxlY3RlZFZpZXcudmlld1Bvc2l0aW9uKSA6XG4gICAgICAodGhpcy5zZWxlY3RlZFZpZXcudmlld1Bvc2l0aW9uIC0gZGlzdGFuY2VNb3ZlZCk7XG4gICAgcmV0dXJuIGRpc3RhbmNlTW92ZWQ7XG4gIH1cblxuICBpc1NlbGVjdGVkVmlld0luZGV4R3JlYXRlclRoYW5aZXJvKCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdCb3VuZGluZy5pbmRleE9mKCB0aGlzLnNlbGVjdGVkVmlldyApID4gMDtcbiAgfVxuXG4gIGlzRGlzdGFuY2VNb3ZlZEVub3VnaFRvU25hcChkaXN0YW5jZU1vdmVkLCB0cmFuc2xhdGVTbmFwKSB7XG4gICAgcmV0dXJuIGRpc3RhbmNlTW92ZWQgPiAodHJhbnNsYXRlU25hcCAvIDMpO1xuICB9XG5cbiAgaXNGb3J3YXJkTW92ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlbWVudCA9PT0gJ2ZvcndhcmQnO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0ZvcndhcmQoKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlUG9zID0gcGFyc2VJbnQoIFN0cmluZyggdGhpcy5jdXJyZW50VHJhbnNsYXRlUG9zaXRpb24gKS5yZXBsYWNlKCAnLScsICcnICksIDEwICk7XG4gICAgaWYgKCAodHJhbnNsYXRlUG9zID4gdGhpcy5zZWxlY3RlZFZpZXcudmlld1Bvc2l0aW9uKSApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aWV3Qm91bmRpbmcuaW5kZXhPZiggdGhpcy5zZWxlY3RlZFZpZXcgKSArIDE7XG4gICAgICBpZiAoIHRoaXMudmlld0JvdW5kaW5nWyBpbmRleCBdICkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vZGVsVmFsdWUodGhpcy52aWV3Qm91bmRpbmdbIGluZGV4IF0udmlld0l0ZW0udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZURyYWdCYWNrd2FyZCgpIHtcbiAgICBjb25zdCB0cmFuc2xhdGVQb3MgPSBwYXJzZUludCggU3RyaW5nKCB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiApLnJlcGxhY2UoICctJywgJycgKSwgMTAgKTtcbiAgICBpZiAoIHRyYW5zbGF0ZVBvcyA8IHRoaXMuc2VsZWN0ZWRWaWV3LnZpZXdQb3NpdGlvbiApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aWV3Qm91bmRpbmcuaW5kZXhPZiggdGhpcy5zZWxlY3RlZFZpZXcgKSAtIDE7XG4gICAgICBpZiAoIHRoaXMudmlld0JvdW5kaW5nWyBpbmRleCBdICkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vZGVsVmFsdWUoIHRoaXMudmlld0JvdW5kaW5nWyBpbmRleCBdLnZpZXdJdGVtLnZhbHVlICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGlzdGVuTW91c2VNb3ZlKCkge1xuICAgIGdsb2JhbExpc3RlbmVycy5wdXNoKCB0aGlzLnJlbmRlcmVyLmxpc3Rlbiggd2luZG93LCAnbW91c2Vtb3ZlJywgKCAkZXZlbnQgKSA9PiB7XG4gICAgICBpZiAoIHRoaXMubW92aW5nICkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1vdmUoICRldmVudCApO1xuICAgICAgfVxuICAgIH0gKSApO1xuICB9XG5cbiAgdHJhbnNsYXRlU2VjdGlvbiggdHJhbnNsYXRlOiBhbnksIHRpbWU6IHN0cmluZyApIHtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiA9IHRyYW5zbGF0ZTtcbiAgICB0aGlzLmhhbmRsZUR1cmF0aW9uKCB0aW1lICk7XG4gICAgdGhpcy5zZXRUcmFuc2xhdGUoIHRoaXMuY3VycmVudFRyYW5zbGF0ZVBvc2l0aW9uICk7XG4gIH1cblxuICB0cmFuc2xhdGVNb3ZlKCAkZXZlbnQsIHRpbWU/ICkge1xuICAgIHRoaXMubW92ZW1lbnRQb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbiggJGV2ZW50ICk7XG4gICAgY29uc3QgdHJhbnNsYXRlUG9zID0gdGhpcy5nZXRUcmFuc2xhdGVDdXJyZW50UG9zaXRpb24oKTtcbiAgICB0aGlzLnNldE1vdmVEaXJlY3Rpb24oICRldmVudCApO1xuXG4gICAgaWYgKCB0aGlzLmlzTW92aW5nKCB0cmFuc2xhdGVQb3MgKSApIHtcbiAgICAgIHRoaXMubW92ZW1lbnRQb3NpdGlvbiA9ICRldmVudC5tb3ZlbWVudFggLSB0cmFuc2xhdGVQb3M7XG4gICAgfVxuICAgIGlmICggdGhpcy5pc0ZpcnN0QW5kRmluaXNoZWQoICRldmVudCwgdHJhbnNsYXRlUG9zICkgKSB7XG4gICAgICB0aGlzLnNldFRyYW5zbGF0ZSggJy0nICsgdGhpcy52aWV3Qm91bmRpbmdbIDAgXS52aWV3UG9zaXRpb24gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCB0aGlzLmlzTGFzdEFuZEZpbmlzaGVkKCAkZXZlbnQsIHRyYW5zbGF0ZVBvcyApICkge1xuICAgICAgdGhpcy5zZXRUcmFuc2xhdGUoICctJyArIHRoaXMudmlld0JvdW5kaW5nWyB0aGlzLnZpZXdCb3VuZGluZy5sZW5ndGggLSAxIF0udmlld1Bvc2l0aW9uICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlTW92aW5nU2xvdyggdGltZSApO1xuICB9XG5cbiAgZ2V0VHJhbnNsYXRlQ3VycmVudFBvc2l0aW9uKCkge1xuICAgIHJldHVybiBwYXJzZUludCggU3RyaW5nKCB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiApLnJlcGxhY2UoICctJywgJycgKSwgMTAgKTtcbiAgfVxuXG4gIGhhbmRsZU1vdmluZ1Nsb3coIHRpbWUgKSB7XG4gICAgdGhpcy5oYW5kbGVEdXJhdGlvbiggdGltZSApO1xuICAgIHRoaXMuc2V0VHJhbnNsYXRlKCB0aGlzLm1vdmVtZW50UG9zaXRpb24gKTtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiA9IHRoaXMubW92ZW1lbnRQb3NpdGlvbjtcbiAgfVxuXG4gIGdldE1vdXNlUG9zaXRpb24oICRldmVudCApIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aVZpZXdUcmFuc2xhdGUubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgJGV2ZW50LmNsaWVudFggLSB0aGlzLm1vdXNlQ2xpY2tQb3NpdGlvblg7XG4gIH1cblxuICBzZXRUcmFuc2xhdGUoIHZhbHVlOiBhbnkgKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5tdWx0aVZpZXdUcmFuc2xhdGUubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVYKCcgKyB2YWx1ZSArICdweCknICk7XG4gIH1cblxuICBpc0xhc3RBbmRGaW5pc2hlZCggJGV2ZW50OiBNb3VzZUV2ZW50LCB0cmFuc2xhdGVQb3M6IG51bWJlciApIHtcbiAgICByZXR1cm4gKCRldmVudC5tb3ZlbWVudFggPD0gMCkgJiYgKHRyYW5zbGF0ZVBvcyA+PSB0aGlzLnRyYW5zbGF0ZUFyZWFXaWR0aCk7XG4gIH1cblxuICBpc01vdmluZyggdHJhbnNsYXRlUG9zOiBudW1iZXIgKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZVBvcyA+IDA7XG4gIH1cblxuICBpc0ZpcnN0QW5kRmluaXNoZWQoICRldmVudDogTW91c2VFdmVudCwgdHJhbnNsYXRlUG9zOiBudW1iZXIgKSB7XG4gICAgcmV0dXJuICh0cmFuc2xhdGVQb3MgPT09IDApICYmICggJGV2ZW50Lm1vdmVtZW50WCA+PSAwICk7XG4gIH1cblxuICBzZXRNb3ZlRGlyZWN0aW9uKCAkZXZlbnQ6IE1vdXNlRXZlbnQgKSB7XG4gICAgJGV2ZW50Lm1vdmVtZW50WCA8IDAgPyB0aGlzLm1vdmVtZW50ID0gJ2ZvcndhcmQnIDogdGhpcy5tb3ZlbWVudCA9ICdiYWNrd2FyZCc7XG4gIH1cblxuICBoYW5kbGVEdXJhdGlvbiggdGltZTogc3RyaW5nICkge1xuICAgIHRpbWUgPyB0aGlzLnNldFRyYW5zaXRpb25TdHlsZSggdGltZSApIDogdGhpcy5yZW1vdmVUcmFuc2l0aW9uU3R5bGUoKTtcbiAgfVxuXG4gIHNldFRyYW5zaXRpb25TdHlsZSggdGltZTogc3RyaW5nICkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoIHRoaXMubXVsdGlWaWV3VHJhbnNsYXRlLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgJ2FsbCAnICsgdGltZSApO1xuICB9XG5cbiAgcmVtb3ZlVHJhbnNpdGlvblN0eWxlKCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUoIHRoaXMubXVsdGlWaWV3VHJhbnNsYXRlLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJyApO1xuICB9XG5cbiAgc2VsZWN0VmlldyggdmlldzogVGxWaWV3ICkge1xuICAgIGlmICggIXZpZXcgKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKCAnVGxWaWV3IHdpdGggdmFsdWUgWycgKyB0aGlzLm1vZGVsVmFsdWUgKyAnXSBub3QgZm91bmQuJyApO1xuICAgIH1cbiAgICB0aGlzLnZpZXdCb3VuZGluZy5mb3JFYWNoKCBpdGVtID0+IGl0ZW0udmlld0l0ZW0uc2VsZWN0ZWQgPSBmYWxzZSApO1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdmlldztcbiAgICB2aWV3LnNlbGVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNoYW5nZVZpZXdTZWxlY3RlZCggdmFsdWU6IHN0cmluZyApIHtcbiAgICBpZiAoICh0aGlzLnZpZXdCb3VuZGluZy5sZW5ndGggPiAwKSAmJiAodmFsdWUpICkge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0JvdW5kaW5nLmZpbHRlciggKCBpdGVtICkgPT4gaXRlbS52aWV3SXRlbS52YWx1ZSA9PT0gdmFsdWUgKTtcbiAgICAgIHRoaXMuc2VsZWN0Vmlldyggdmlld1sgMCBdICk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlY3Rpb24oICctJyArIHZpZXdbIDAgXS52aWV3UG9zaXRpb24sIHRoaXMudHJhbnNpdGlvblRpbWUgKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBnbG9iYWxMaXN0ZW5lcnMuZm9yRWFjaCggKCB2YWx1ZSApID0+IHtcbiAgICAgIHZhbHVlKCk7XG4gICAgfSApO1xuICB9XG5cbn1cblxuIiwiPGRpdiBjbGFzcz1cInVpLW11bHRpdmlldy13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ1aS1tdWx0aXZpZXctY29udGFpbmVyXCIgI211bHRpVmlld0NvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1tdWx0aXZpZXctdHJhbnNsYXRlXCIgI211bHRpVmlld1RyYW5zbGF0ZSBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhY2tkcm91bmdDb2xvclwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19