@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
487 lines • 37.9 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';
var GridsterItemPrototypeDirective = /** @class */ (function () {
function GridsterItemPrototypeDirective(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);
}
Object.defineProperty(GridsterItemPrototypeDirective.prototype, "dragAndDrop", {
// must be set to true because of item dragAndDrop configuration
get:
// must be set to true because of item dragAndDrop configuration
/**
* @return {?}
*/
function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(GridsterItemPrototypeDirective.prototype, "gridster", {
get: /**
* @return {?}
*/
function () {
return this.dragContextGridster;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
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(function () {
_this.enableDragDrop();
});
};
/**
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.subscribtions.forEach(function (sub) {
sub.unsubscribe();
});
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onDrop = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
if (!this.config.helper) {
this.$element.parentNode.removeChild(this.$element);
}
this.drop.emit({
item: this.item,
gridster: gridster
});
};
/**
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onCancel = /**
* @return {?}
*/
function () {
this.cancel.emit({ item: this.item });
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onEnter = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
this.enter.emit({
item: this.item,
gridster: gridster
});
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onOver = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) { };
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onOut = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
this.out.emit({
item: this.item,
gridster: gridster
});
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.getPositionToGridster = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
/** @type {?} */
var relativeContainerCoords = this.getContainerCoordsToGridster(gridster);
return {
y: this.positionY - relativeContainerCoords.top,
x: this.positionX - relativeContainerCoords.left
};
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.setDragContextGridster = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
this.dragContextGridster = gridster;
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.getContainerCoordsToGridster = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
return {
left: gridster.gridsterRect.left - this.parentRect.left,
top: gridster.gridsterRect.top - this.parentRect.top
};
};
/**
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.enableDragDrop = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var cursorToElementPosition;
/** @type {?} */
var draggable = new Draggable(this.elementRef.nativeElement);
/** @type {?} */
var dragStartSub = draggable.dragStart
.subscribe(function (event) {
_this.zone.run(function () {
_this.$element = _this.provideDragElement();
_this.containerRectange = _this.$element.parentElement.getBoundingClientRect();
_this.updateParentElementData();
_this.onStart(event);
cursorToElementPosition = event.getRelativeCoordinates(_this.$element);
});
});
/** @type {?} */
var dragSub = draggable.dragMove
.subscribe(function (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 {?} */
var dragStopSub = draggable.dragStop
.subscribe(function (event) {
_this.zone.run(function () {
_this.onStop(event);
_this.$element = null;
});
});
/** @type {?} */
var scrollSub = fromEvent(document, 'scroll')
.subscribe(function () {
if (_this.$element) {
_this.updateParentElementData();
}
});
this.subscribtions = this.subscribtions.concat([dragStartSub, dragSub, dragStopSub, scrollSub]);
};
/**
* @param {?} element
* @param {?} position
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.setElementPosition = /**
* @param {?} element
* @param {?} position
* @return {?}
*/
function (element, position) {
this.positionX = position.x;
this.positionY = position.y;
utils.setCssElementPosition(element, position);
};
/**
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.updateParentElementData = /**
* @return {?}
*/
function () {
this.parentRect = this.$element.parentElement.getBoundingClientRect();
this.parentOffset = {
left: this.$element.parentElement.offsetLeft,
top: this.$element.parentElement.offsetTop
};
};
/**
* @param {?} event
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onStart = /**
* @param {?} event
* @return {?}
*/
function (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 {?}
*/
GridsterItemPrototypeDirective.prototype.onDrag = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.gridsterPrototype.updatePrototypePosition(this, event);
};
/**
* @param {?} event
* @return {?}
*/
GridsterItemPrototypeDirective.prototype.onStop = /**
* @param {?} event
* @return {?}
*/
function (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 {?}
*/
GridsterItemPrototypeDirective.prototype.provideDragElement = /**
* @return {?}
*/
function () {
/** @type {?} */
var 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 {?}
*/
GridsterItemPrototypeDirective.prototype.fixStylesForRelativeElement = /**
* @param {?} el
* @return {?}
*/
function (el) {
if (window.getComputedStyle(el).position === 'absolute') {
return el;
}
/** @type {?} */
var 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.
*/
/**
* 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 {?}
*/
GridsterItemPrototypeDirective.prototype.fixStylesForBodyHelper = /**
* 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 {?}
*/
function (el) {
/** @type {?} */
var bodyRect = document.body.getBoundingClientRect();
/** @type {?} */
var 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 = function () { return [
{ 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 }]
};
return GridsterItemPrototypeDirective;
}());
export { GridsterItemPrototypeDirective };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxZQUFZLEVBQ3BFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QztJQWdFSSx3Q0FBb0IsSUFBWSxFQUNaLFVBQXNCLEVBQ3RCLGlCQUEyQztRQUYzQyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBOURyRCxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixRQUFHLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxQixXQUFNLEdBQVEsRUFBRSxDQUFDO1FBRW5CLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixNQUFDLEdBQUcsQ0FBQyxDQUFD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QUN6Qzs7OztnQkFaRyxNQUFNO2dCQURVLFVBQVU7Z0JBSXJCLHdCQUF3Qjs7O3VCQVc1QixNQUFNO3dCQUNOLE1BQU07eUJBQ04sTUFBTTt3QkFDTixNQUFNO3NCQUNOLE1BQU07dUJBRU4sS0FBSzt5QkFDTCxLQUFLO29CQUlMLEtBQUs7c0JBQ0wsS0FBSztzQkFDTCxLQUFLO3NCQUNMLEtBQUs7c0JBQ0wsS0FBSztvQkFDTCxLQUFLO3NCQUNMLEtBQUs7c0JBQ0wsS0FBSztzQkFDTCxLQUFLO3NCQUNMLEtBQUs7O0lBNFBWLHFDQUFDO0NBQUEsQUFwUkQsSUFvUkM7U0FqUlksOEJBQThCOzs7SUFDdkMsOENBQW9DOztJQUNwQywrQ0FBcUM7O0lBQ3JDLGdEQUFzQzs7SUFDdEMsK0NBQXFDOztJQUNyQyw2Q0FBbUM7O0lBRW5DLDhDQUFtQjs7SUFDbkIsZ0RBQTBCOztJQUUxQiwyQ0FBYTs7SUFDYiwyQ0FBYTs7SUFDYiwyQ0FBbUI7O0lBQ25CLDZDQUFxQjs7SUFDckIsNkNBQXFCOztJQUNyQiw2Q0FBcUI7O0lBQ3JCLDZDQUFxQjs7SUFDckIsMkNBQW1COztJQUNuQiw2Q0FBcUI7O0lBQ3JCLDZDQUFxQjs7SUFDckIsNkNBQXFCOztJQUNyQiw2Q0FBcUI7O0lBRXJCLG1EQUFrQjs7SUFDbEIsbURBQWtCOztJQUVsQixrREFBaUI7O0lBRWpCLGtEQUFzQjs7Ozs7SUFLdEIsOENBQXNCOzs7OztJQUt0QiwwREFBK0I7O0lBRS9CLG9EQUFtQjs7SUFFbkIsOENBQW1COztJQUVuQiwyREFBOEI7O0lBRTlCLDZEQUE2Qzs7SUFDN0Msb0RBQStCOztJQUMvQixzREFBa0Q7O0lBRWxELHVEQUFnRDs7SUFXcEMsOENBQW9COztJQUNwQixvREFBOEI7O0lBQzlCLDJEQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgSG9zdEJpbmRpbmcsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXG4gICAgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi4vZ3JpZExpc3QvR3JpZExpc3RJdGVtJztcbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XG5pbXBvcnQgeyBEcmFnZ2FibGUgfSBmcm9tICcuLi91dGlscy9kcmFnZ2FibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW25neEdyaWRzdGVySXRlbVByb3RvdHlwZV0nXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAT3V0cHV0KCkgZHJvcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgc3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG91dCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcbiAgICBASW5wdXQoKSBjb25maWc6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIHggPSAwO1xuICAgIHB1YmxpYyB5ID0gMDtcbiAgICBASW5wdXQoKSB3OiBudW1iZXI7XG4gICAgQElucHV0KCkgd1NtOiBudW1iZXI7XG4gICAgQElucHV0KCkgd01kOiBudW1iZXI7XG4gICAgQElucHV0KCkgd0xnOiBudW1iZXI7XG4gICAgQElucHV0KCkgd1hsOiBudW1iZXI7XG4gICAgQElucHV0KCkgaDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhTbTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhNZDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhMZzogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhYbDogbnVtYmVyO1xuXG4gICAgcG9zaXRpb25YOiBudW1iZXI7XG4gICAgcG9zaXRpb25ZOiBudW1iZXI7XG5cbiAgICBhdXRvU2l6ZSA9IGZhbHNlO1xuXG4gICAgJGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICogTW91c2UgZHJhZyBvYnNlcnZhYmxlXG4gICAgICovXG4gICAgZHJhZzogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJ0aW9uIGZvciBkcmFnIG9ic2VydmFibGVcbiAgICAgKi9cbiAgICBkcmFnU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBpdGVtOiBHcmlkTGlzdEl0ZW07XG5cbiAgICBjb250YWluZXJSZWN0YW5nZTogQ2xpZW50UmVjdDtcblxuICAgIHByaXZhdGUgZHJhZ0NvbnRleHRHcmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgcGFyZW50UmVjdDogQ2xpZW50UmVjdDtcbiAgICBwcml2YXRlIHBhcmVudE9mZnNldDoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYnRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG5cbiAgICAvLyBtdXN0IGJlIHNldCB0byB0cnVlIGJlY2F1c2Ugb2YgaXRlbSBkcmFnQW5kRHJvcCBjb25maWd1cmF0aW9uXG4gICAgZ2V0IGRyYWdBbmREcm9wKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQgZ3JpZHN0ZXIoKTogR3JpZHN0ZXJTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0NvbnRleHRHcmlkc3RlcjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBncmlkc3RlclByb3RvdHlwZTogR3JpZHN0ZXJQcm90b3R5cGVTZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5pdGVtID0gKG5ldyBHcmlkTGlzdEl0ZW0oKSkuc2V0RnJvbUdyaWRzdGVySXRlbVByb3RvdHlwZSh0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy53U20gPSB0aGlzLndTbSB8fCB0aGlzLnc7XG4gICAgICAgIHRoaXMuaFNtID0gdGhpcy5oU20gfHwgdGhpcy5oO1xuICAgICAgICB0aGlzLndNZCA9IHRoaXMud01kIHx8IHRoaXMudztcbiAgICAgICAgdGhpcy5oTWQgPSB0aGlzLmhNZCB8fCB0aGlzLmg7XG4gICAgICAgIHRoaXMud0xnID0gdGhpcy53TGcgfHwgdGhpcy53O1xuICAgICAgICB0aGlzLmhMZyA9IHRoaXMuaExnIHx8IHRoaXMuaDtcbiAgICAgICAgdGhpcy53WGwgPSB0aGlzLndYbCB8fCB0aGlzLnc7XG4gICAgICAgIHRoaXMuaFhsID0gdGhpcy5oWGwgfHwgdGhpcy5oO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnRHJvcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyb3AuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25DYW5jZWwgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KHtpdGVtOiB0aGlzLml0ZW19KTtcbiAgICB9XG5cbiAgICBvbkVudGVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50ZXIuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25PdmVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7fVxuXG4gICAgb25PdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdXQuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25Ub0dyaWRzdGVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVDb250YWluZXJDb29yZHMgPSB0aGlzLmdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uWSAtIHJlbGF0aXZlQ29udGFpbmVyQ29vcmRzLnRvcCxcbiAgICAgICAgICAgIHg6IHRoaXMucG9zaXRpb25YIC0gcmVsYXRpdmVDb250YWluZXJDb29yZHMubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldERyYWdDb250ZXh0R3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmRyYWdDb250ZXh0R3JpZHN0ZXIgPSBncmlkc3RlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiBncmlkc3Rlci5ncmlkc3RlclJlY3QubGVmdCAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBncmlkc3Rlci5ncmlkc3RlclJlY3QudG9wIC0gdGhpcy5wYXJlbnRSZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJhZ0Ryb3AoKSB7XG4gICAgICAgIGxldCBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gbmV3IERyYWdnYWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZHJhZ1N0YXJ0U3ViID0gZHJhZ2dhYmxlLmRyYWdTdGFydFxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQgPSB0aGlzLnByb3ZpZGVEcmFnRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdGFydChldmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yVG9FbGVtZW50UG9zaXRpb24gPSBldmVudC5nZXRSZWxhdGl2ZUNvb3JkaW5hdGVzKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZHJhZ1N1YiA9IGRyYWdnYWJsZS5kcmFnTW92ZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi54ICAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gY3Vyc29yVG9FbGVtZW50UG9zaXRpb24ueSAgLSB0aGlzLnBhcmVudFJlY3QudG9wXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZyhldmVudCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkcmFnU3RvcFN1YiA9IGRyYWdnYWJsZS5kcmFnU3RvcFxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdG9wKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY3JvbGxTdWIgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbGVtZW50RGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9ucyA9IHRoaXMuc3Vic2NyaWJ0aW9ucy5jb25jYXQoW2RyYWdTdGFydFN1YiwgZHJhZ1N1YiwgZHJhZ1N0b3BTdWIsIHNjcm9sbFN1Yl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RWxlbWVudFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjoge3g6IG51bWJlciwgeTogbnVtYmVyfSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uWCA9IHBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMucG9zaXRpb25ZID0gcG9zaXRpb24ueTtcbiAgICAgICAgdXRpbHMuc2V0Q3NzRWxlbWVudFBvc2l0aW9uKGVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCkge1xuICAgICAgICB0aGlzLnBhcmVudFJlY3QgPSB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0ge1xuICAgICAgICAgICAgbGVmdDogdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQsXG4gICAgICAgICAgICB0b3A6IHRoaXMuJGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRUb3BcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3RhcnQgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS5kcmFnSXRlbVN0YXJ0KHRoaXMsIGV2ZW50KTtcblxuICAgICAgICB0aGlzLnN0YXJ0LmVtaXQoe2l0ZW06IHRoaXMuaXRlbX0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EcmFnIChldmVudDogRHJhZ2dhYmxlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS51cGRhdGVQcm90b3R5cGVQb3NpdGlvbih0aGlzLCBldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblN0b3AgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyaWRzdGVyUHJvdG90eXBlLmRyYWdJdGVtU3RvcCh0aGlzLCBldmVudCk7XG5cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICAgICAgICB1dGlscy5yZXNldENTU0VsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb3ZpZGVEcmFnRWxlbWVudCAoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgZHJhZ0VsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICBkcmFnRWxlbWVudCA9IDxhbnk+KGRyYWdFbGVtZW50KS5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5maXhTdHlsZXNGb3JCb2R5SGVscGVyKGRyYWdFbGVtZW50KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpeFN0eWxlc0ZvclJlbGF0aXZlRWxlbWVudChkcmFnRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHJhZ0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JSZWxhdGl2ZUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkucG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UgPSBlbC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50UG9zaXRpb24oZWwsIHtcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gdGhpcy5jb250YWluZXJSZWN0YW5nZS50b3BcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gZWxlbWVudCBpcyBjbG9uZWQgYW5kIGFwcGVuZCB0byBib2R5IGl0IHNob3VsZCBoYXZlIHBvc2l0aW9uIGFic29sdXRlIGFuZCBjb29yZHMgc2V0IGJ5IG9yaWdpbmFsXG4gICAgICogcmVsYXRpdmUgcHJvdG90eXBlIGVsZW1lbnQgcG9zaXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JCb2R5SGVscGVyIChlbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbihlbCwge1xuICAgICAgICAgICAgeDogcmVjdC5sZWZ0IC0gYm9keVJlY3QubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gYm9keVJlY3QudG9wXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9XG5cbn1cbiJdfQ==