@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
401 lines • 34.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Input, Output, EventEmitter, NgZone } from '@angular/core';
import { fromEvent } from 'rxjs';
import { GridsterPrototypeService } from './gridster-prototype.service';
import { GridListItem } from '../gridList/GridListItem';
import { Draggable } from '../utils/draggable';
import { utils } from '../utils/utils';
export class GridsterItemPrototypeDirective {
/**
* @param {?} zone
* @param {?} elementRef
* @param {?} gridsterPrototype
*/
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
/**
* @return {?}
*/
get dragAndDrop() {
return true;
}
/**
* @return {?}
*/
get gridster() {
return this.dragContextGridster;
}
/**
* @return {?}
*/
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();
});
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscribtions.forEach((sub) => {
sub.unsubscribe();
});
}
/**
* @param {?} gridster
* @return {?}
*/
onDrop(gridster) {
if (!this.config.helper) {
this.$element.parentNode.removeChild(this.$element);
}
this.drop.emit({
item: this.item,
gridster: gridster
});
}
/**
* @return {?}
*/
onCancel() {
this.cancel.emit({ item: this.item });
}
/**
* @param {?} gridster
* @return {?}
*/
onEnter(gridster) {
this.enter.emit({
item: this.item,
gridster: gridster
});
}
/**
* @param {?} gridster
* @return {?}
*/
onOver(gridster) { }
/**
* @param {?} gridster
* @return {?}
*/
onOut(gridster) {
this.out.emit({
item: this.item,
gridster: gridster
});
}
/**
* @param {?} gridster
* @return {?}
*/
getPositionToGridster(gridster) {
/** @type {?} */
const relativeContainerCoords = this.getContainerCoordsToGridster(gridster);
return {
y: this.positionY - relativeContainerCoords.top,
x: this.positionX - relativeContainerCoords.left
};
}
/**
* @param {?} gridster
* @return {?}
*/
setDragContextGridster(gridster) {
this.dragContextGridster = gridster;
}
/**
* @param {?} gridster
* @return {?}
*/
getContainerCoordsToGridster(gridster) {
return {
left: gridster.gridsterRect.left - this.parentRect.left,
top: gridster.gridsterRect.top - this.parentRect.top
};
}
/**
* @return {?}
*/
enableDragDrop() {
/** @type {?} */
let cursorToElementPosition;
/** @type {?} */
const draggable = new Draggable(this.elementRef.nativeElement);
/** @type {?} */
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);
});
});
/** @type {?} */
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);
});
/** @type {?} */
const dragStopSub = draggable.dragStop
.subscribe((event) => {
this.zone.run(() => {
this.onStop(event);
this.$element = null;
});
});
/** @type {?} */
const scrollSub = fromEvent(document, 'scroll')
.subscribe(() => {
if (this.$element) {
this.updateParentElementData();
}
});
this.subscribtions = this.subscribtions.concat([dragStartSub, dragSub, dragStopSub, scrollSub]);
}
/**
* @param {?} element
* @param {?} position
* @return {?}
*/
setElementPosition(element, position) {
this.positionX = position.x;
this.positionY = position.y;
utils.setCssElementPosition(element, position);
}
/**
* @return {?}
*/
updateParentElementData() {
this.parentRect = this.$element.parentElement.getBoundingClientRect();
this.parentOffset = {
left: this.$element.parentElement.offsetLeft,
top: this.$element.parentElement.offsetTop
};
}
/**
* @param {?} event
* @return {?}
*/
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 });
}
/**
* @param {?} event
* @return {?}
*/
onDrag(event) {
this.gridsterPrototype.updatePrototypePosition(this, event);
}
/**
* @param {?} event
* @return {?}
*/
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);
}
}
/**
* @return {?}
*/
provideDragElement() {
/** @type {?} */
let dragElement = this.elementRef.nativeElement;
if (this.config.helper) {
dragElement = (/** @type {?} */ ((dragElement).cloneNode(true)));
document.body.appendChild(this.fixStylesForBodyHelper(dragElement));
}
else {
this.fixStylesForRelativeElement(dragElement);
}
return dragElement;
}
/**
* @param {?} el
* @return {?}
*/
fixStylesForRelativeElement(el) {
if (window.getComputedStyle(el).position === 'absolute') {
return el;
}
/** @type {?} */
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.
* @param {?} el
* @return {?}
*/
fixStylesForBodyHelper(el) {
/** @type {?} */
const bodyRect = document.body.getBoundingClientRect();
/** @type {?} */
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.decorators = [
{ type: Directive, args: [{
selector: '[ngxGridsterItemPrototype]'
},] }
];
/** @nocollapse */
GridsterItemPrototypeDirective.ctorParameters = () => [
{ type: NgZone },
{ type: ElementRef },
{ type: GridsterPrototypeService }
];
GridsterItemPrototypeDirective.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 }]
};
if (false) {
/** @type {?} */
GridsterItemPrototypeDirective.prototype.drop;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.start;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.cancel;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.enter;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.out;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.data;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.config;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.x;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.y;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.w;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.wSm;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.wMd;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.wLg;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.wXl;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.h;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.hSm;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.hMd;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.hLg;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.hXl;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.positionX;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.positionY;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.autoSize;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.$element;
/**
* Mouse drag observable
* @type {?}
*/
GridsterItemPrototypeDirective.prototype.drag;
/**
* Subscribtion for drag observable
* @type {?}
*/
GridsterItemPrototypeDirective.prototype.dragSubscription;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.isDragging;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.item;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.containerRectange;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.dragContextGridster;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.parentRect;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.parentOffset;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.subscribtions;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.zone;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.elementRef;
/** @type {?} */
GridsterItemPrototypeDirective.prototype.gridsterPrototype;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxZQUFZLEVBQ3BFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUt2QyxNQUFNLE9BQU8sOEJBQThCOzs7Ozs7SUE2RHZDLFlBQW9CLElBQVksRUFDWixVQUFzQixFQUN0QixpQkFBMkM7UUFGM0MsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQTlEckQsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsUUFBRyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHMUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUVuQixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FB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O2tCQUNMLEtBQUs7a0JBQ0wsS0FBSztnQkFDTCxLQUFLO2tCQUNMLEtBQUs7a0JBQ0wsS0FBSztrQkFDTCxLQUFLO2tCQUNMLEtBQUs7Ozs7SUFwQk4sOENBQW9DOztJQUNwQywrQ0FBcUM7O0lBQ3JDLGdEQUFzQzs7SUFDdEMsK0NBQXFDOztJQUNyQyw2Q0FBbUM7O0lBRW5DLDhDQUFtQjs7SUFDbkIsZ0RBQTBCOztJQUUxQiwyQ0FBYTs7SUFDYiwyQ0FBYTs7SUFDYiwyQ0FBbUI7O0lBQ25CLDZDQUFxQjs7SUFDckIsNkNBQXFCOztJQUNyQiw2Q0FBcUI7O0lBQ3JCLDZDQUFxQjs7SUFDckIsMkNBQW1COztJQUNuQiw2Q0FBcUI7O0lBQ3JCLDZDQUFxQjs7SUFDckIsNkNBQXFCOztJQUNyQiw2Q0FBcUI7O0lBRXJCLG1EQUFrQjs7SUFDbEIsbURBQWtCOztJQUVsQixrREFBaUI7O0lBRWpCLGtEQUFzQjs7Ozs7SUFLdEIsOENBQXNCOzs7OztJQUt0QiwwREFBK0I7O0lBRS9CLG9EQUFtQjs7SUFFbkIsOENBQW1COztJQUVuQiwyREFBOEI7O0lBRTlCLDZEQUE2Qzs7SUFDN0Msb0RBQStCOztJQUMvQixzREFBa0Q7O0lBRWxELHVEQUFnRDs7SUFXcEMsOENBQW9COztJQUNwQixvREFBOEI7O0lBQzlCLDJEQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgSG9zdEJpbmRpbmcsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXG4gICAgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi4vZ3JpZExpc3QvR3JpZExpc3RJdGVtJztcbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XG5pbXBvcnQgeyBEcmFnZ2FibGUgfSBmcm9tICcuLi91dGlscy9kcmFnZ2FibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW25neEdyaWRzdGVySXRlbVByb3RvdHlwZV0nXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAT3V0cHV0KCkgZHJvcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgc3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG91dCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcbiAgICBASW5wdXQoKSBjb25maWc6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIHggPSAwO1xuICAgIHB1YmxpYyB5ID0gMDtcbiAgICBASW5wdXQoKSB3OiBudW1iZXI7XG4gICAgQElucHV0KCkgd1NtOiBudW1iZXI7XG4gICAgQElucHV0KCkgd01kOiBudW1iZXI7XG4gICAgQElucHV0KCkgd0xnOiBudW1iZXI7XG4gICAgQElucHV0KCkgd1hsOiBudW1iZXI7XG4gICAgQElucHV0KCkgaDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhTbTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhNZDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhMZzogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhYbDogbnVtYmVyO1xuXG4gICAgcG9zaXRpb25YOiBudW1iZXI7XG4gICAgcG9zaXRpb25ZOiBudW1iZXI7XG5cbiAgICBhdXRvU2l6ZSA9IGZhbHNlO1xuXG4gICAgJGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICogTW91c2UgZHJhZyBvYnNlcnZhYmxlXG4gICAgICovXG4gICAgZHJhZzogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJ0aW9uIGZvciBkcmFnIG9ic2VydmFibGVcbiAgICAgKi9cbiAgICBkcmFnU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBpdGVtOiBHcmlkTGlzdEl0ZW07XG5cbiAgICBjb250YWluZXJSZWN0YW5nZTogQ2xpZW50UmVjdDtcblxuICAgIHByaXZhdGUgZHJhZ0NvbnRleHRHcmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgcGFyZW50UmVjdDogQ2xpZW50UmVjdDtcbiAgICBwcml2YXRlIHBhcmVudE9mZnNldDoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYnRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG5cbiAgICAvLyBtdXN0IGJlIHNldCB0byB0cnVlIGJlY2F1c2Ugb2YgaXRlbSBkcmFnQW5kRHJvcCBjb25maWd1cmF0aW9uXG4gICAgZ2V0IGRyYWdBbmREcm9wKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQgZ3JpZHN0ZXIoKTogR3JpZHN0ZXJTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0NvbnRleHRHcmlkc3RlcjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBncmlkc3RlclByb3RvdHlwZTogR3JpZHN0ZXJQcm90b3R5cGVTZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5pdGVtID0gKG5ldyBHcmlkTGlzdEl0ZW0oKSkuc2V0RnJvbUdyaWRzdGVySXRlbVByb3RvdHlwZSh0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy53U20gPSB0aGlzLndTbSB8fCB0aGlzLnc7XG4gICAgICAgIHRoaXMuaFNtID0gdGhpcy5oU20gfHwgdGhpcy5oO1xuICAgICAgICB0aGlzLndNZCA9IHRoaXMud01kIHx8IHRoaXMudztcbiAgICAgICAgdGhpcy5oTWQgPSB0aGlzLmhNZCB8fCB0aGlzLmg7XG4gICAgICAgIHRoaXMud0xnID0gdGhpcy53TGcgfHwgdGhpcy53O1xuICAgICAgICB0aGlzLmhMZyA9IHRoaXMuaExnIHx8IHRoaXMuaDtcbiAgICAgICAgdGhpcy53WGwgPSB0aGlzLndYbCB8fCB0aGlzLnc7XG4gICAgICAgIHRoaXMuaFhsID0gdGhpcy5oWGwgfHwgdGhpcy5oO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnRHJvcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyb3AuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25DYW5jZWwgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KHtpdGVtOiB0aGlzLml0ZW19KTtcbiAgICB9XG5cbiAgICBvbkVudGVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50ZXIuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25PdmVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7fVxuXG4gICAgb25PdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdXQuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25Ub0dyaWRzdGVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVDb250YWluZXJDb29yZHMgPSB0aGlzLmdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uWSAtIHJlbGF0aXZlQ29udGFpbmVyQ29vcmRzLnRvcCxcbiAgICAgICAgICAgIHg6IHRoaXMucG9zaXRpb25YIC0gcmVsYXRpdmVDb250YWluZXJDb29yZHMubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldERyYWdDb250ZXh0R3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmRyYWdDb250ZXh0R3JpZHN0ZXIgPSBncmlkc3RlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiBncmlkc3Rlci5ncmlkc3RlclJlY3QubGVmdCAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBncmlkc3Rlci5ncmlkc3RlclJlY3QudG9wIC0gdGhpcy5wYXJlbnRSZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJhZ0Ryb3AoKSB7XG4gICAgICAgIGxldCBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gbmV3IERyYWdnYWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZHJhZ1N0YXJ0U3ViID0gZHJhZ2dhYmxlLmRyYWdTdGFydFxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQgPSB0aGlzLnByb3ZpZGVEcmFnRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdGFydChldmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yVG9FbGVtZW50UG9zaXRpb24gPSBldmVudC5nZXRSZWxhdGl2ZUNvb3JkaW5hdGVzKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZHJhZ1N1YiA9IGRyYWdnYWJsZS5kcmFnTW92ZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi54ICAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gY3Vyc29yVG9FbGVtZW50UG9zaXRpb24ueSAgLSB0aGlzLnBhcmVudFJlY3QudG9wXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZyhldmVudCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkcmFnU3RvcFN1YiA9IGRyYWdnYWJsZS5kcmFnU3RvcFxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdG9wKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY3JvbGxTdWIgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbGVtZW50RGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9ucyA9IHRoaXMuc3Vic2NyaWJ0aW9ucy5jb25jYXQoW2RyYWdTdGFydFN1YiwgZHJhZ1N1YiwgZHJhZ1N0b3BTdWIsIHNjcm9sbFN1Yl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RWxlbWVudFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjoge3g6IG51bWJlciwgeTogbnVtYmVyfSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uWCA9IHBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMucG9zaXRpb25ZID0gcG9zaXRpb24ueTtcbiAgICAgICAgdXRpbHMuc2V0Q3NzRWxlbWVudFBvc2l0aW9uKGVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCkge1xuICAgICAgICB0aGlzLnBhcmVudFJlY3QgPSB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0ge1xuICAgICAgICAgICAgbGVmdDogdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQsXG4gICAgICAgICAgICB0b3A6IHRoaXMuJGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRUb3BcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3RhcnQgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS5kcmFnSXRlbVN0YXJ0KHRoaXMsIGV2ZW50KTtcblxuICAgICAgICB0aGlzLnN0YXJ0LmVtaXQoe2l0ZW06IHRoaXMuaXRlbX0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EcmFnIChldmVudDogRHJhZ2dhYmxlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS51cGRhdGVQcm90b3R5cGVQb3NpdGlvbih0aGlzLCBldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblN0b3AgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyaWRzdGVyUHJvdG90eXBlLmRyYWdJdGVtU3RvcCh0aGlzLCBldmVudCk7XG5cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICAgICAgICB1dGlscy5yZXNldENTU0VsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb3ZpZGVEcmFnRWxlbWVudCAoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgZHJhZ0VsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICBkcmFnRWxlbWVudCA9IDxhbnk+KGRyYWdFbGVtZW50KS5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5maXhTdHlsZXNGb3JCb2R5SGVscGVyKGRyYWdFbGVtZW50KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpeFN0eWxlc0ZvclJlbGF0aXZlRWxlbWVudChkcmFnRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHJhZ0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JSZWxhdGl2ZUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkucG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UgPSBlbC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50UG9zaXRpb24oZWwsIHtcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gdGhpcy5jb250YWluZXJSZWN0YW5nZS50b3BcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gZWxlbWVudCBpcyBjbG9uZWQgYW5kIGFwcGVuZCB0byBib2R5IGl0IHNob3VsZCBoYXZlIHBvc2l0aW9uIGFic29sdXRlIGFuZCBjb29yZHMgc2V0IGJ5IG9yaWdpbmFsXG4gICAgICogcmVsYXRpdmUgcHJvdG90eXBlIGVsZW1lbnQgcG9zaXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JCb2R5SGVscGVyIChlbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbihlbCwge1xuICAgICAgICAgICAgeDogcmVjdC5sZWZ0IC0gYm9keVJlY3QubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gYm9keVJlY3QudG9wXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9XG5cbn1cbiJdfQ==