UNPKG

angular2gridsterv3

Version:
241 lines 32 kB
import { Directive, Input, Output, EventEmitter } from '@angular/core'; import { fromEvent } from 'rxjs'; import { GridListItem } from '../gridList/GridListItem'; import { Draggable } from '../utils/draggable'; import { utils } from '../utils/utils'; import * as i0 from "@angular/core"; import * as i1 from "./gridster-prototype.service"; export class GridsterItemPrototypeDirective { constructor(zone, elementRef, gridsterPrototype) { this.zone = zone; this.elementRef = elementRef; this.gridsterPrototype = gridsterPrototype; this.drop = new EventEmitter(); this.start = new EventEmitter(); this.cancel = new EventEmitter(); this.enter = new EventEmitter(); this.out = new EventEmitter(); this.config = {}; this.x = 0; this.y = 0; this.autoSize = false; this.isDragging = false; this.subscribtions = []; this.item = (new GridListItem()).setFromGridsterItemPrototype(this); } // must be set to true because of item dragAndDrop configuration get dragAndDrop() { return true; } get gridster() { return this.dragContextGridster; } ngOnInit() { this.wSm = this.wSm || this.w; this.hSm = this.hSm || this.h; this.wMd = this.wMd || this.w; this.hMd = this.hMd || this.h; this.wLg = this.wLg || this.w; this.hLg = this.hLg || this.h; this.wXl = this.wXl || this.w; this.hXl = this.hXl || this.h; this.zone.runOutsideAngular(() => { this.enableDragDrop(); }); } ngOnDestroy() { this.subscribtions.forEach((sub) => { sub.unsubscribe(); }); } onDrop(gridster) { if (!this.config.helper) { this.$element.parentNode.removeChild(this.$element); } this.drop.emit({ item: this.item, gridster: gridster }); } onCancel() { this.cancel.emit({ item: this.item }); } onEnter(gridster) { this.enter.emit({ item: this.item, gridster: gridster }); } onOver(gridster) { } onOut(gridster) { this.out.emit({ item: this.item, gridster: gridster }); } getPositionToGridster(gridster) { const relativeContainerCoords = this.getContainerCoordsToGridster(gridster); return { y: this.positionY - relativeContainerCoords.top, x: this.positionX - relativeContainerCoords.left }; } setDragContextGridster(gridster) { this.dragContextGridster = gridster; } getContainerCoordsToGridster(gridster) { return { left: gridster.gridsterRect.left - this.parentRect.left, top: gridster.gridsterRect.top - this.parentRect.top }; } enableDragDrop() { let cursorToElementPosition; const draggable = new Draggable(this.elementRef.nativeElement); const dragStartSub = draggable.dragStart .subscribe((event) => { this.zone.run(() => { this.$element = this.provideDragElement(); this.containerRectange = this.$element.parentElement.getBoundingClientRect(); this.updateParentElementData(); this.onStart(event); cursorToElementPosition = event.getRelativeCoordinates(this.$element); }); }); const dragSub = draggable.dragMove .subscribe((event) => { this.setElementPosition(this.$element, { x: event.clientX - cursorToElementPosition.x - this.parentRect.left, y: event.clientY - cursorToElementPosition.y - this.parentRect.top }); this.onDrag(event); }); const dragStopSub = draggable.dragStop .subscribe((event) => { this.zone.run(() => { this.onStop(event); this.$element = null; }); }); const scrollSub = fromEvent(document, 'scroll') .subscribe(() => { if (this.$element) { this.updateParentElementData(); } }); this.subscribtions = this.subscribtions.concat([dragStartSub, dragSub, dragStopSub, scrollSub]); } setElementPosition(element, position) { this.positionX = position.x; this.positionY = position.y; utils.setCssElementPosition(element, position); } updateParentElementData() { this.parentRect = this.$element.parentElement.getBoundingClientRect(); this.parentOffset = { left: this.$element.parentElement.offsetLeft, top: this.$element.parentElement.offsetTop }; } onStart(event) { this.isDragging = true; this.$element.style.pointerEvents = 'none'; this.$element.style.position = 'absolute'; this.gridsterPrototype.dragItemStart(this, event); this.start.emit({ item: this.item }); } onDrag(event) { this.gridsterPrototype.updatePrototypePosition(this, event); } onStop(event) { this.gridsterPrototype.dragItemStop(this, event); this.isDragging = false; this.$element.style.pointerEvents = 'auto'; this.$element.style.position = ''; utils.resetCSSElementPosition(this.$element); if (this.config.helper) { this.$element.parentNode.removeChild(this.$element); } } provideDragElement() { let dragElement = this.elementRef.nativeElement; if (this.config.helper) { dragElement = (dragElement).cloneNode(true); document.body.appendChild(this.fixStylesForBodyHelper(dragElement)); } else { this.fixStylesForRelativeElement(dragElement); } return dragElement; } fixStylesForRelativeElement(el) { if (window.getComputedStyle(el).position === 'absolute') { return el; } const rect = this.elementRef.nativeElement.getBoundingClientRect(); this.containerRectange = el.parentElement.getBoundingClientRect(); el.style.position = 'absolute'; this.setElementPosition(el, { x: rect.left - this.containerRectange.left, y: rect.top - this.containerRectange.top }); return el; } /** * When element is cloned and append to body it should have position absolute and coords set by original * relative prototype element position. */ fixStylesForBodyHelper(el) { const bodyRect = document.body.getBoundingClientRect(); const rect = this.elementRef.nativeElement.getBoundingClientRect(); el.style.position = 'absolute'; this.setElementPosition(el, { x: rect.left - bodyRect.left, y: rect.top - bodyRect.top }); return el; } } GridsterItemPrototypeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterItemPrototypeDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.GridsterPrototypeService }], target: i0.ɵɵFactoryTarget.Directive }); GridsterItemPrototypeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: GridsterItemPrototypeDirective, selector: "[ngxGridsterItemPrototype]", inputs: { data: "data", config: "config", w: "w", wSm: "wSm", wMd: "wMd", wLg: "wLg", wXl: "wXl", h: "h", hSm: "hSm", hMd: "hMd", hLg: "hLg", hXl: "hXl" }, outputs: { drop: "drop", start: "start", cancel: "cancel", enter: "enter", out: "out" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterItemPrototypeDirective, decorators: [{ type: Directive, args: [{ selector: '[ngxGridsterItemPrototype]' }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.GridsterPrototypeService }]; }, propDecorators: { drop: [{ type: Output }], start: [{ type: Output }], cancel: [{ type: Output }], enter: [{ type: Output }], out: [{ type: Output }], data: [{ type: Input }], config: [{ type: Input }], w: [{ type: Input }], wSm: [{ type: Input }], wMd: [{ type: Input }], wLg: [{ type: Input }], wXl: [{ type: Input }], h: [{ type: Input }], hSm: [{ type: Input }], hMd: [{ type: Input }], hLg: [{ type: Input }], hXl: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjJncmlkc3RlcnYzL3NyYy9saWIvZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQWUsWUFBWSxFQUM3RCxNQUFNLGVBQWUsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUczRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBS3ZDLE1BQU0sT0FBTyw4QkFBOEI7SUE2RHZDLFlBQW9CLElBQVksRUFDWixVQUFzQixFQUN0QixpQkFBMkM7UUFGM0MsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQTlEckQsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsUUFBRyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHMUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUVuQixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQWViLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFjakIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVVYLGtCQUFhLEdBQXdCLEVBQUUsQ0FBQztRQWU1QyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFkRCxnRUFBZ0U7SUFDaEUsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFTRCxRQUFRO1FBQ0osSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQWlCLEVBQUUsRUFBRTtZQUM3QyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTSxDQUFFLFFBQXlCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxPQUFPLENBQUUsUUFBeUI7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTSxDQUFFLFFBQXlCLElBQVMsQ0FBQztJQUUzQyxLQUFLLENBQUUsUUFBeUI7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQscUJBQXFCLENBQUMsUUFBeUI7UUFDM0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUUsT0FBTztZQUNILENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLHVCQUF1QixDQUFDLEdBQUc7WUFDL0MsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLENBQUMsSUFBSTtTQUNuRCxDQUFDO0lBQ04sQ0FBQztJQUVELHNCQUFzQixDQUFDLFFBQXlCO1FBQzVDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVPLDRCQUE0QixDQUFDLFFBQXlCO1FBQzFELE9BQU87WUFDSCxJQUFJLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO1lBQ3ZELEdBQUcsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUc7U0FDdkQsQ0FBQztJQUNOLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksdUJBQXVCLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUvRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUzthQUNuQyxTQUFTLENBQUMsQ0FBQyxLQUFxQixFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3RSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFcEIsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRVAsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVE7YUFDN0IsU0FBUyxDQUFDLENBQUMsS0FBcUIsRUFBRSxFQUFFO1lBRWpDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNuQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLEdBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJO2dCQUNwRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLEdBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHO2FBQ3RFLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFUCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUTthQUNqQyxTQUFTLENBQUMsQ0FBQyxLQUFxQixFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFUCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQzthQUMxQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2xDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsT0FBb0IsRUFBRSxRQUFnQztRQUM3RSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVTtZQUM1QyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUztTQUM3QyxDQUFDO0lBQ04sQ0FBQztJQUVPLE9BQU8sQ0FBRSxLQUFxQjtRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUV2QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFFMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLE1BQU0sQ0FBRSxLQUFxQjtRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxNQUFNLENBQUUsS0FBcUI7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUVoRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ3BCLFdBQVcsR0FBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVqRCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUN2RTthQUFNO1lBQ0gsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVPLDJCQUEyQixDQUFDLEVBQWU7UUFDL0MsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUNyRCxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRWxFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFO1lBQ3hCLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJO1lBQzFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO1NBQzNDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHNCQUFzQixDQUFFLEVBQWU7UUFDM0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFbkUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUk7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUc7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDOzsySEEvUVEsOEJBQThCOytHQUE5Qiw4QkFBOEI7MkZBQTlCLDhCQUE4QjtrQkFIMUMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsNEJBQTRCO2lCQUN6Qzs2SkFFYSxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csR0FBRztzQkFBWixNQUFNO2dCQUVFLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBSUcsQ0FBQztzQkFBVCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxDQUFDO3NCQUFULEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBIb3N0QmluZGluZywgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSxcclxuICAgIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2UgfSBmcm9tICcuL2dyaWRzdGVyLXByb3RvdHlwZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi4vZ3JpZExpc3QvR3JpZExpc3RJdGVtJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZHN0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvRHJhZ2dhYmxlRXZlbnQnO1xyXG5pbXBvcnQgeyBEcmFnZ2FibGUgfSBmcm9tICcuLi91dGlscy9kcmFnZ2FibGUnO1xyXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbbmd4R3JpZHN0ZXJJdGVtUHJvdG90eXBlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBlbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBvdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gICAgQElucHV0KCkgY29uZmlnOiBhbnkgPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgeCA9IDA7XHJcbiAgICBwdWJsaWMgeSA9IDA7XHJcbiAgICBASW5wdXQoKSB3OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSB3U206IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHdNZDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgd0xnOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSB3WGw6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGhTbTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgaE1kOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBoTGc6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGhYbDogbnVtYmVyO1xyXG5cclxuICAgIHBvc2l0aW9uWDogbnVtYmVyO1xyXG4gICAgcG9zaXRpb25ZOiBudW1iZXI7XHJcblxyXG4gICAgYXV0b1NpemUgPSBmYWxzZTtcclxuXHJcbiAgICAkZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3VzZSBkcmFnIG9ic2VydmFibGVcclxuICAgICAqL1xyXG4gICAgZHJhZzogT2JzZXJ2YWJsZTxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJ0aW9uIGZvciBkcmFnIG9ic2VydmFibGVcclxuICAgICAqL1xyXG4gICAgZHJhZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpdGVtOiBHcmlkTGlzdEl0ZW07XHJcblxyXG4gICAgY29udGFpbmVyUmVjdGFuZ2U6IENsaWVudFJlY3Q7XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnQ29udGV4dEdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHBhcmVudFJlY3Q6IENsaWVudFJlY3Q7XHJcbiAgICBwcml2YXRlIHBhcmVudE9mZnNldDoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9O1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaWJ0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xyXG5cclxuICAgIC8vIG11c3QgYmUgc2V0IHRvIHRydWUgYmVjYXVzZSBvZiBpdGVtIGRyYWdBbmREcm9wIGNvbmZpZ3VyYXRpb25cclxuICAgIGdldCBkcmFnQW5kRHJvcCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ3JpZHN0ZXIoKTogR3JpZHN0ZXJTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnQ29udGV4dEdyaWRzdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBncmlkc3RlclByb3RvdHlwZTogR3JpZHN0ZXJQcm90b3R5cGVTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbSA9IChuZXcgR3JpZExpc3RJdGVtKCkpLnNldEZyb21Hcmlkc3Rlckl0ZW1Qcm90b3R5cGUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy53U20gPSB0aGlzLndTbSB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oU20gPSB0aGlzLmhTbSB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy53TWQgPSB0aGlzLndNZCB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oTWQgPSB0aGlzLmhNZCB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy53TGcgPSB0aGlzLndMZyB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oTGcgPSB0aGlzLmhMZyB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy53WGwgPSB0aGlzLndYbCB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oWGwgPSB0aGlzLmhYbCB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnRHJvcCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9ucy5mb3JFYWNoKChzdWI6IFN1YnNjcmlwdGlvbikgPT4ge1xyXG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRyb3AgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmhlbHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRyb3AuZW1pdCh7XHJcbiAgICAgICAgICAgIGl0ZW06IHRoaXMuaXRlbSxcclxuICAgICAgICAgICAgZ3JpZHN0ZXI6IGdyaWRzdGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwgKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsLmVtaXQoe2l0ZW06IHRoaXMuaXRlbX0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRW50ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVudGVyLmVtaXQoe1xyXG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXHJcbiAgICAgICAgICAgIGdyaWRzdGVyOiBncmlkc3RlclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT3ZlciAoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHZvaWQge31cclxuXHJcbiAgICBvbk91dCAoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3V0LmVtaXQoe1xyXG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXHJcbiAgICAgICAgICAgIGdyaWRzdGVyOiBncmlkc3RlclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc2l0aW9uVG9Hcmlkc3Rlcihncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVsYXRpdmVDb250YWluZXJDb29yZHMgPSB0aGlzLmdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uWSAtIHJlbGF0aXZlQ29udGFpbmVyQ29vcmRzLnRvcCxcclxuICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvblggLSByZWxhdGl2ZUNvbnRhaW5lckNvb3Jkcy5sZWZ0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREcmFnQ29udGV4dEdyaWRzdGVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLmRyYWdDb250ZXh0R3JpZHN0ZXIgPSBncmlkc3RlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVmdDogZ3JpZHN0ZXIuZ3JpZHN0ZXJSZWN0LmxlZnQgLSB0aGlzLnBhcmVudFJlY3QubGVmdCxcclxuICAgICAgICAgICAgdG9wOiBncmlkc3Rlci5ncmlkc3RlclJlY3QudG9wIC0gdGhpcy5wYXJlbnRSZWN0LnRvcFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbmFibGVEcmFnRHJvcCgpIHtcclxuICAgICAgICBsZXQgY3Vyc29yVG9FbGVtZW50UG9zaXRpb247XHJcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gbmV3IERyYWdnYWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdTdGFydFN1YiA9IGRyYWdnYWJsZS5kcmFnU3RhcnRcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50ID0gdGhpcy5wcm92aWRlRHJhZ0VsZW1lbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFyZW50RWxlbWVudERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3RhcnQoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbiA9IGV2ZW50LmdldFJlbGF0aXZlQ29vcmRpbmF0ZXModGhpcy4kZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdTdWIgPSBkcmFnZ2FibGUuZHJhZ01vdmVcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50UG9zaXRpb24odGhpcy4kZWxlbWVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi54ICAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi55ICAtIHRoaXMucGFyZW50UmVjdC50b3BcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25EcmFnKGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdTdG9wU3ViID0gZHJhZ2dhYmxlLmRyYWdTdG9wXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnZ2FibGVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN0b3AoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxTdWIgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbGVtZW50RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25zID0gdGhpcy5zdWJzY3JpYnRpb25zLmNvbmNhdChbZHJhZ1N0YXJ0U3ViLCBkcmFnU3ViLCBkcmFnU3RvcFN1Yiwgc2Nyb2xsU3ViXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRFbGVtZW50UG9zaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9KSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvblggPSBwb3NpdGlvbi54O1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25ZID0gcG9zaXRpb24ueTtcclxuICAgICAgICB1dGlscy5zZXRDc3NFbGVtZW50UG9zaXRpb24oZWxlbWVudCwgcG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlUGFyZW50RWxlbWVudERhdGEoKSB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRSZWN0ID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0ge1xyXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0VG9wXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU3RhcnQgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICB0aGlzLiRlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS5kcmFnSXRlbVN0YXJ0KHRoaXMsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGFydC5lbWl0KHtpdGVtOiB0aGlzLml0ZW19KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZyAoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS51cGRhdGVQcm90b3R5cGVQb3NpdGlvbih0aGlzLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblN0b3AgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUuZHJhZ0l0ZW1TdG9wKHRoaXMsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJztcclxuICAgICAgICB1dGlscy5yZXNldENTU0VsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmhlbHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvdmlkZURyYWdFbGVtZW50ICgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IGRyYWdFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5oZWxwZXIpIHtcclxuICAgICAgICAgICAgZHJhZ0VsZW1lbnQgPSA8YW55PihkcmFnRWxlbWVudCkuY2xvbmVOb2RlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmZpeFN0eWxlc0ZvckJvZHlIZWxwZXIoZHJhZ0VsZW1lbnQpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpeFN0eWxlc0ZvclJlbGF0aXZlRWxlbWVudChkcmFnRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZHJhZ0VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JSZWxhdGl2ZUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gZWwucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudFBvc2l0aW9uKGVsLCB7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UubGVmdCxcclxuICAgICAgICAgICAgeTogcmVjdC50b3AgLSB0aGlzLmNvbnRhaW5lclJlY3RhbmdlLnRvcFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIGVsZW1lbnQgaXMgY2xvbmVkIGFuZCBhcHBlbmQgdG8gYm9keSBpdCBzaG91bGQgaGF2ZSBwb3NpdGlvbiBhYnNvbHV0ZSBhbmQgY29vcmRzIHNldCBieSBvcmlnaW5hbFxyXG4gICAgICogcmVsYXRpdmUgcHJvdG90eXBlIGVsZW1lbnQgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZml4U3R5bGVzRm9yQm9keUhlbHBlciAoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudFBvc2l0aW9uKGVsLCB7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIGJvZHlSZWN0LmxlZnQsXHJcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gYm9keVJlY3QudG9wXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH1cclxuXHJcbn1cclxuIl19