UNPKG

@blare/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

508 lines 54.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Component, ElementRef, ViewChild, NgZone, Input, Output, EventEmitter, ChangeDetectionStrategy, HostBinding, ViewEncapsulation } from '@angular/core'; import { Subscription, fromEvent } from 'rxjs'; import { debounceTime, filter, publish } from 'rxjs/operators'; import { utils } from './utils/utils'; import { GridsterService } from './gridster.service'; import { GridsterPrototypeService } from './gridster-prototype/gridster-prototype.service'; import { GridsterOptions } from './GridsterOptions'; var GridsterComponent = /** @class */ (function () { function GridsterComponent(zone, elementRef, gridster, gridsterPrototype) { this.zone = zone; this.gridsterPrototype = gridsterPrototype; this.optionsChange = new EventEmitter(); this.ready = new EventEmitter(); this.reflow = new EventEmitter(); this.prototypeDrop = new EventEmitter(); this.prototypeEnter = new EventEmitter(); this.prototypeOut = new EventEmitter(); this.draggableOptions = {}; this.isDragging = false; this.isResizing = false; this.isReady = false; this.isPrototypeEntered = false; this.isDisabled = false; this.subscription = new Subscription(); this.gridster = gridster; this.$element = elementRef.nativeElement; } /** * @return {?} */ GridsterComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.gridsterOptions = new GridsterOptions(this.options, this.container); if (this.options.useCSSTransforms) { this.$element.classList.add('css-transform'); } this.subscription.add(this.gridsterOptions.change.subscribe(function (options) { _this.gridster.options = options; if (_this.gridster.gridList) { _this.gridster.gridList.options = options; } _this.optionsChange.emit(options); })); this.gridster.init(this); this.subscription.add(fromEvent(window, 'resize') .pipe(debounceTime(this.gridster.options.responsiveDebounce || 0), filter(function () { return _this.gridster.options.responsiveView; })) .subscribe(function () { return _this.reload(); })); this.zone.runOutsideAngular(function () { _this.subscription.add(fromEvent(document, 'scroll', { passive: true }).subscribe(function () { return _this.updateGridsterElementData(); })); /** @type {?} */ var scrollableContainer = utils.getScrollableContainer(_this.$element); if (scrollableContainer) { _this.subscription.add(fromEvent(scrollableContainer, 'scroll', { passive: true }) .subscribe(function () { return _this.updateGridsterElementData(); })); } }); }; /** * @return {?} */ GridsterComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.gridster.start(); this.updateGridsterElementData(); this.connectGridsterPrototype(); this.gridster.$positionHighlight = this.$positionHighlight.nativeElement; }; /** * @return {?} */ GridsterComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.subscription.unsubscribe(); }; /** * Change gridster config option and rebuild * @param string name * @param any value * @return GridsterComponent */ /** * Change gridster config option and rebuild * @template THIS * @this {THIS} * @param {?} name * @param {?} value * @return {THIS} */ GridsterComponent.prototype.setOption = /** * Change gridster config option and rebuild * @template THIS * @this {THIS} * @param {?} name * @param {?} value * @return {THIS} */ function (name, value) { if (name === 'dragAndDrop') { if (value) { (/** @type {?} */ (this)).enableDraggable(); } else { (/** @type {?} */ (this)).disableDraggable(); } } if (name === 'resizable') { if (value) { (/** @type {?} */ (this)).enableResizable(); } else { (/** @type {?} */ (this)).disableResizable(); } } if (name === 'lanes') { (/** @type {?} */ (this)).gridster.options.lanes = value; (/** @type {?} */ (this)).gridster.gridList.fixItemsPositions((/** @type {?} */ (this)).gridster.options); (/** @type {?} */ (this)).reflowGridster(); } if (name === 'direction') { (/** @type {?} */ (this)).gridster.options.direction = value; (/** @type {?} */ (this)).gridster.gridList.pullItemsToLeft(); } if (name === 'widthHeightRatio') { (/** @type {?} */ (this)).gridster.options.widthHeightRatio = parseFloat(value || 1); } if (name === 'responsiveView') { (/** @type {?} */ (this)).gridster.options.responsiveView = !!value; } (/** @type {?} */ (this)).gridster.gridList.setOption(name, value); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @return {THIS} */ GridsterComponent.prototype.reload = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { var _this = this; setTimeout(function () { (/** @type {?} */ (_this)).gridster.fixItemsPositions(); (/** @type {?} */ (_this)).reflowGridster(); }); return (/** @type {?} */ (this)); }; /** * @param {?=} isInit * @return {?} */ GridsterComponent.prototype.reflowGridster = /** * @param {?=} isInit * @return {?} */ function (isInit) { if (isInit === void 0) { isInit = false; } this.gridster.reflow(); this.reflow.emit({ isInit: isInit, gridsterComponent: this }); }; /** * @return {?} */ GridsterComponent.prototype.updateGridsterElementData = /** * @return {?} */ function () { this.gridster.gridsterScrollData = this.getScrollPositionFromParents(this.$element); this.gridster.gridsterRect = this.$element.getBoundingClientRect(); }; /** * @return {?} */ GridsterComponent.prototype.setReady = /** * @return {?} */ function () { var _this = this; setTimeout(function () { return (_this.isReady = true); }); this.ready.emit(); }; /** * @param {?=} scrollableItemElementSelector * @return {?} */ GridsterComponent.prototype.adjustItemsHeightToContent = /** * @param {?=} scrollableItemElementSelector * @return {?} */ function (scrollableItemElementSelector) { var _this = this; if (scrollableItemElementSelector === void 0) { scrollableItemElementSelector = '.gridster-item-inner'; } this.gridster.items // convert each item to object with information about content height and scroll height .map(function (item) { /** @type {?} */ var scrollEl = item.$element.querySelector(scrollableItemElementSelector); /** @type {?} */ var contentEl = scrollEl.lastElementChild; /** @type {?} */ var scrollElDistance = utils.getRelativeCoordinates(scrollEl, item.$element); /** @type {?} */ var scrollElRect = scrollEl.getBoundingClientRect(); /** @type {?} */ var contentRect = contentEl.getBoundingClientRect(); return { item: item, contentHeight: contentRect.bottom - scrollElRect.top, scrollElDistance: scrollElDistance }; }) // calculate required height in lanes amount and update item "h" .forEach(function (data) { data.item.h = Math.ceil((/** @type {?} */ (((data.contentHeight / (_this.gridster.cellHeight - data.scrollElDistance.top)))))); }); this.gridster.fixItemsPositions(); this.gridster.reflow(); }; /** * @param {?} item * @return {?} */ GridsterComponent.prototype.disable = /** * @param {?} item * @return {?} */ function (item) { /** @type {?} */ var itemIdx = this.gridster.items.indexOf(item.itemComponent); this.isDisabled = true; if (itemIdx >= 0) { delete this.gridster.items[this.gridster.items.indexOf(item.itemComponent)]; } this.gridster.onDragOut(item); }; /** * @return {?} */ GridsterComponent.prototype.enable = /** * @return {?} */ function () { this.isDisabled = false; }; /** * @param {?} element * @param {?=} data * @return {?} */ GridsterComponent.prototype.getScrollPositionFromParents = /** * @param {?} element * @param {?=} data * @return {?} */ function (element, data) { if (data === void 0) { data = { scrollTop: 0, scrollLeft: 0 }; } if (element.parentElement && element.parentElement !== document.body) { data.scrollTop += element.parentElement.scrollTop; data.scrollLeft += element.parentElement.scrollLeft; return this.getScrollPositionFromParents(element.parentElement, data); } return { scrollTop: data.scrollTop, scrollLeft: data.scrollLeft }; }; /** * Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop). */ /** * Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop). * @return {?} */ GridsterComponent.prototype.connectGridsterPrototype = /** * Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop). * @return {?} */ function () { var _this = this; this.gridsterPrototype.observeDropOut(this.gridster).subscribe(); /** @type {?} */ var dropOverObservable = (/** @type {?} */ ((this.gridsterPrototype .observeDropOver(this.gridster) .pipe(publish())))); /** @type {?} */ var dragObservable = this.gridsterPrototype.observeDragOver(this.gridster); dragObservable.dragOver .pipe(filter(function () { return !_this.isDisabled; })) .subscribe(function (prototype) { if (!_this.isPrototypeEntered) { return; } _this.gridster.onDrag(prototype.item); }); dragObservable.dragEnter .pipe(filter(function () { return !_this.isDisabled; })) .subscribe(function (prototype) { _this.isPrototypeEntered = true; if (_this.gridster.items.indexOf(prototype.item) < 0) { _this.gridster.items.push(prototype.item); } _this.gridster.onStart(prototype.item); prototype.setDragContextGridster(_this.gridster); if (_this.parent) { _this.parent.disable(prototype.item); } _this.prototypeEnter.emit({ item: prototype.item }); }); dragObservable.dragOut .pipe(filter(function () { return !_this.isDisabled; })) .subscribe(function (prototype) { if (!_this.isPrototypeEntered) { return; } _this.gridster.onDragOut(prototype.item); _this.isPrototypeEntered = false; _this.prototypeOut.emit({ item: prototype.item }); if (_this.parent) { _this.parent.enable(); _this.parent.isPrototypeEntered = true; if (_this.parent.gridster.items.indexOf(prototype.item) < 0) { _this.parent.gridster.items.push(prototype.item); } _this.parent.gridster.onStart(prototype.item); prototype.setDragContextGridster(_this.parent.gridster); // timeout is needed to be sure that "enter" event is fired after "out" setTimeout(function () { _this.parent.prototypeEnter.emit({ item: prototype.item }); prototype.onEnter(_this.parent.gridster); }); } }); dropOverObservable .pipe(filter(function () { return !_this.isDisabled; })) .subscribe(function (data) { if (!_this.isPrototypeEntered) { return; } _this.gridster.onStop(data.item.item); _this.gridster.removeItem(data.item.item); _this.isPrototypeEntered = false; if (_this.parent) { _this.parent.enable(); } _this.prototypeDrop.emit({ item: data.item.item }); }); dropOverObservable.connect(); }; /** * @return {?} */ GridsterComponent.prototype.enableDraggable = /** * @return {?} */ function () { this.gridster.options.dragAndDrop = true; this.gridster.items .filter(function (item) { return item.itemComponent && item.itemComponent.dragAndDrop; }) .forEach(function (item) { return item.itemComponent.enableDragDrop(); }); }; /** * @return {?} */ GridsterComponent.prototype.disableDraggable = /** * @return {?} */ function () { this.gridster.options.dragAndDrop = false; this.gridster.items .filter(function (item) { return item.itemComponent; }) .forEach(function (item) { return item.itemComponent.disableDraggable(); }); }; /** * @return {?} */ GridsterComponent.prototype.enableResizable = /** * @return {?} */ function () { this.gridster.options.resizable = true; this.gridster.items .filter(function (item) { return item.itemComponent && item.itemComponent.resizable; }) .forEach(function (item) { return item.itemComponent.enableResizable(); }); }; /** * @return {?} */ GridsterComponent.prototype.disableResizable = /** * @return {?} */ function () { this.gridster.options.resizable = false; this.gridster.items.forEach(function (item) { return item.itemComponent.disableResizable(); }); }; GridsterComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-gridster', template: "<div class=\"gridster-container\" #container>\n <ng-content></ng-content>\n <div class=\"position-highlight\" style=\"display:none;\" #positionHighlight>\n <div class=\"inner\"></div>\n </div>\n </div>", providers: [GridsterService], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: ["\n ngx-gridster {\n position: relative;\n display: block;\n left: 0;\n width: 100%;\n }\n\n ngx-gridster.gridster--dragging {\n -moz-user-select: none;\n -khtml-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n\n ngx-gridster .gridster-container {\n position: relative;\n width: 100%;\n list-style: none;\n -webkit-transition: width 0.2s, height 0.2s;\n transition: width 0.2s, height 0.2s;\n }\n\n ngx-gridster .position-highlight {\n display: block;\n position: absolute;\n z-index: 1;\n }\n "] }] } ]; /** @nocollapse */ GridsterComponent.ctorParameters = function () { return [ { type: NgZone }, { type: ElementRef }, { type: GridsterService }, { type: GridsterPrototypeService } ]; }; GridsterComponent.propDecorators = { options: [{ type: Input }], optionsChange: [{ type: Output }], ready: [{ type: Output }], reflow: [{ type: Output }], prototypeDrop: [{ type: Output }], prototypeEnter: [{ type: Output }], prototypeOut: [{ type: Output }], draggableOptions: [{ type: Input }], parent: [{ type: Input }], $positionHighlight: [{ type: ViewChild, args: ['positionHighlight',] }], isDragging: [{ type: HostBinding, args: ['class.gridster--dragging',] }], isResizing: [{ type: HostBinding, args: ['class.gridster--resizing',] }], isReady: [{ type: HostBinding, args: ['class.gridster--ready',] }], container: [{ type: ViewChild, args: ['container',] }] }; return GridsterComponent; }()); export { GridsterComponent }; if (false) { /** @type {?} */ GridsterComponent.prototype.options; /** @type {?} */ GridsterComponent.prototype.optionsChange; /** @type {?} */ GridsterComponent.prototype.ready; /** @type {?} */ GridsterComponent.prototype.reflow; /** @type {?} */ GridsterComponent.prototype.prototypeDrop; /** @type {?} */ GridsterComponent.prototype.prototypeEnter; /** @type {?} */ GridsterComponent.prototype.prototypeOut; /** @type {?} */ GridsterComponent.prototype.draggableOptions; /** @type {?} */ GridsterComponent.prototype.parent; /** @type {?} */ GridsterComponent.prototype.$positionHighlight; /** @type {?} */ GridsterComponent.prototype.isDragging; /** @type {?} */ GridsterComponent.prototype.isResizing; /** @type {?} */ GridsterComponent.prototype.isReady; /** @type {?} */ GridsterComponent.prototype.container; /** @type {?} */ GridsterComponent.prototype.gridster; /** @type {?} */ GridsterComponent.prototype.$element; /** @type {?} */ GridsterComponent.prototype.gridsterOptions; /** @type {?} */ GridsterComponent.prototype.isPrototypeEntered; /** @type {?} */ GridsterComponent.prototype.isDisabled; /** @type {?} */ GridsterComponent.prototype.subscription; /** @type {?} */ GridsterComponent.prototype.zone; /** @type {?} */ GridsterComponent.prototype.gridsterPrototype; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUlULFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFSCxZQUFZLEVBQ1osU0FBUyxFQUVaLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFHM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBEO0lBc0VJLDJCQUNZLElBQVksRUFDcEIsVUFBc0IsRUFDdEIsUUFBeUIsRUFDakIsaUJBQTJDO1FBSDNDLFNBQUksR0FBSixJQUFJLENBQVE7UUFHWixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBNUI3QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDaEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDakMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUMzRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBQzVELGlCQUFZLEdBQUcsSUFB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aUNBQ04sTUFBTTsrQkFDTixNQUFNO21DQUNOLEtBQUs7eUJBQ0wsS0FBSztxQ0FFTCxTQUFTLFNBQUMsbUJBQW1COzZCQUM3QixXQUFXLFNBQUMsMEJBQTBCOzZCQUN0QyxXQUFXLFNBQUMsMEJBQTBCOzBCQUV0QyxXQUFXLFNBQUMsdUJBQXVCOzRCQUVuQyxTQUFTLFNBQUMsV0FBVzs7SUFrVzFCLHdCQUFDO0NBQUEsQUEvWkQsSUErWkM7U0FuWFksaUJBQWlCOzs7SUFDMUIsb0NBQW1DOztJQUNuQywwQ0FBa0Q7O0lBQ2xELGtDQUEwQzs7SUFDMUMsbUNBQTJDOztJQUMzQywwQ0FBcUU7O0lBQ3JFLDJDQUFzRTs7SUFDdEUseUNBQW9FOztJQUNwRSw2Q0FBMEQ7O0lBQzFELG1DQUFtQzs7SUFFbkMsK0NBQW1EOztJQUNuRCx1Q0FBNEQ7O0lBQzVELHVDQUE0RDs7SUFFNUQsb0NBQXNEOztJQUV0RCxzQ0FBOEM7O0lBQzlDLHFDQUEwQjs7SUFDMUIscUNBQXNCOztJQUV0Qiw0Q0FBaUM7O0lBQ2pDLCtDQUEyQjs7SUFDM0IsdUNBQTJCOztJQUMzQix5Q0FBMEM7O0lBR3RDLGlDQUFvQjs7SUFHcEIsOENBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgT25EZXN0cm95LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIE5nWm9uZSxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBPYnNlcnZhYmxlLFxuICAgIFN1YnNjcmlwdGlvbixcbiAgICBmcm9tRXZlbnQsXG4gICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHB1Ymxpc2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgeyBHcmlkc3RlclNlcnZpY2UgfSBmcm9tICcuL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUdyaWRzdGVyT3B0aW9ucyB9IGZyb20gJy4vSUdyaWRzdGVyT3B0aW9ucyc7XG5pbXBvcnQgeyBJR3JpZHN0ZXJEcmFnZ2FibGVPcHRpb25zIH0gZnJvbSAnLi9JR3JpZHN0ZXJEcmFnZ2FibGVPcHRpb25zJztcbmltcG9ydCB7IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLXByb3RvdHlwZS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkTGlzdEl0ZW0gfSBmcm9tICcuL2dyaWRMaXN0L0dyaWRMaXN0SXRlbSc7XG5pbXBvcnQgeyBHcmlkc3Rlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRzdGVyT3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LWdyaWRzdGVyJyxcbiAgICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJncmlkc3Rlci1jb250YWluZXJcIiAjY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLWhpZ2hsaWdodFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiICNwb3NpdGlvbkhpZ2hsaWdodD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gLFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICBuZ3gtZ3JpZHN0ZXIge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZ3gtZ3JpZHN0ZXIuZ3JpZHN0ZXItLWRyYWdnaW5nIHtcbiAgICAgICAgICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgICAgIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmd4LWdyaWRzdGVyIC5ncmlkc3Rlci1jb250YWluZXIge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMC4ycywgaGVpZ2h0IDAuMnM7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4ycywgaGVpZ2h0IDAuMnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5neC1ncmlkc3RlciAucG9zaXRpb24taGlnaGxpZ2h0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYFxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbR3JpZHN0ZXJTZXJ2aWNlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIG9wdGlvbnM6IElHcmlkc3Rlck9wdGlvbnM7XG4gICAgQE91dHB1dCgpIG9wdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcmVmbG93ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHByb3RvdHlwZURyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaXRlbTogR3JpZExpc3RJdGVtIH0+KCk7XG4gICAgQE91dHB1dCgpIHByb3RvdHlwZUVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IEdyaWRMaXN0SXRlbSB9PigpO1xuICAgIEBPdXRwdXQoKSBwcm90b3R5cGVPdXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaXRlbTogR3JpZExpc3RJdGVtIH0+KCk7XG4gICAgQElucHV0KCkgZHJhZ2dhYmxlT3B0aW9uczogSUdyaWRzdGVyRHJhZ2dhYmxlT3B0aW9ucyA9IHt9O1xuICAgIEBJbnB1dCgpIHBhcmVudDogR3JpZHN0ZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdwb3NpdGlvbkhpZ2hsaWdodCcpICRwb3NpdGlvbkhpZ2hsaWdodDtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdyaWRzdGVyLS1kcmFnZ2luZycpIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdyaWRzdGVyLS1yZXNpemluZycpIGlzUmVzaXppbmcgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ3JpZHN0ZXItLXJlYWR5JykgaXNSZWFkeSA9IGZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2U7XG4gICAgJGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgZ3JpZHN0ZXJPcHRpb25zOiBHcmlkc3Rlck9wdGlvbnM7XG4gICAgaXNQcm90b3R5cGVFbnRlcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZ3JpZHN0ZXJQcm90b3R5cGU6IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXI7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJPcHRpb25zID0gbmV3IEdyaWRzdGVyT3B0aW9ucyh0aGlzLm9wdGlvbnMsIHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNTU1RyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY3NzLXRyYW5zZm9ybScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlck9wdGlvbnMuY2hhbmdlLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLmdyaWRMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3Qub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZS5lbWl0KG9wdGlvbnMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyLmluaXQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZURlYm91bmNlIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5ncmlkc3Rlci5vcHRpb25zLnJlc3BvbnNpdmVWaWV3KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVsb2FkKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnLCB7IHBhc3NpdmU6IHRydWUgfSkuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZHN0ZXJFbGVtZW50RGF0YSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGVDb250YWluZXIgPSB1dGlscy5nZXRTY3JvbGxhYmxlQ29udGFpbmVyKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHNjcm9sbGFibGVDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICAgICAgICAgIGZyb21FdmVudChzY3JvbGxhYmxlQ29udGFpbmVyLCAnc2Nyb2xsJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZHN0ZXJFbGVtZW50RGF0YSgpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuc3RhcnQoKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRzdGVyRWxlbWVudERhdGEoKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3RHcmlkc3RlclByb3RvdHlwZSgpO1xuXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJHBvc2l0aW9uSGlnaGxpZ2h0ID0gdGhpcy4kcG9zaXRpb25IaWdobGlnaHQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgZ3JpZHN0ZXIgY29uZmlnIG9wdGlvbiBhbmQgcmVidWlsZFxuICAgICAqIEBwYXJhbSBzdHJpbmcgbmFtZVxuICAgICAqIEBwYXJhbSBhbnkgdmFsdWVcbiAgICAgKiBAcmV0dXJuIEdyaWRzdGVyQ29tcG9uZW50XG4gICAgICovXG4gICAgc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RyYWdBbmREcm9wJykge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnZ2FibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlRHJhZ2dhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICdyZXNpemFibGUnKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlc2l6YWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVSZXNpemFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ2xhbmVzJykge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmxhbmVzID0gdmFsdWU7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3QuZml4SXRlbXNQb3NpdGlvbnModGhpcy5ncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93R3JpZHN0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ2RpcmVjdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3QucHVsbEl0ZW1zVG9MZWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd3aWR0aEhlaWdodFJhdGlvJykge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLndpZHRoSGVpZ2h0UmF0aW8gPSBwYXJzZUZsb2F0KHZhbHVlIHx8IDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAncmVzcG9uc2l2ZVZpZXcnKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZVZpZXcgPSAhIXZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3Quc2V0T3B0aW9uKG5hbWUsIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5maXhJdGVtc1Bvc2l0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5yZWZsb3dHcmlkc3RlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZWZsb3dHcmlkc3Rlcihpc0luaXQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyLnJlZmxvdygpO1xuICAgICAgICB0aGlzLnJlZmxvdy5lbWl0KHtcbiAgICAgICAgICAgIGlzSW5pdDogaXNJbml0LFxuICAgICAgICAgICAgZ3JpZHN0ZXJDb21wb25lbnQ6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlR3JpZHN0ZXJFbGVtZW50RGF0YSgpIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5ncmlkc3RlclNjcm9sbERhdGEgPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uRnJvbVBhcmVudHMoXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZHN0ZXJSZWN0ID0gdGhpcy4kZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICBzZXRSZWFkeSgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5pc1JlYWR5ID0gdHJ1ZSkpO1xuICAgICAgICB0aGlzLnJlYWR5LmVtaXQoKTtcbiAgICB9XG5cbiAgICBhZGp1c3RJdGVtc0hlaWdodFRvQ29udGVudChcbiAgICAgICAgc2Nyb2xsYWJsZUl0ZW1FbGVtZW50U2VsZWN0b3I6IHN0cmluZyA9ICcuZ3JpZHN0ZXItaXRlbS1pbm5lcidcbiAgICApIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5pdGVtc1xuICAgICAgICAgICAgLy8gY29udmVydCBlYWNoIGl0ZW0gdG8gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBoZWlnaHQgYW5kIHNjcm9sbCBoZWlnaHRcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IEdyaWRMaXN0SXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEVsID0gaXRlbS4kZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlSXRlbUVsZW1lbnRTZWxlY3RvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEVsID0gc2Nyb2xsRWwubGFzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxFbERpc3RhbmNlID0gdXRpbHMuZ2V0UmVsYXRpdmVDb29yZGluYXRlcyhcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRWwsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uJGVsZW1lbnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEVsUmVjdCA9IHNjcm9sbEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRSZWN0ID0gY29udGVudEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodDogY29udGVudFJlY3QuYm90dG9tIC0gc2Nyb2xsRWxSZWN0LnRvcCxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRWxEaXN0YW5jZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHJlcXVpcmVkIGhlaWdodCBpbiBsYW5lcyBhbW91bnQgYW5kIHVwZGF0ZSBpdGVtIFwiaFwiXG4gICAgICAgICAgICAuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLml0ZW0uaCA9IE1hdGguY2VpbCg8YW55PihcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEuY29udGVudEhlaWdodCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ncmlkc3Rlci5jZWxsSGVpZ2h0IC0gZGF0YS5zY3JvbGxFbERpc3RhbmNlLnRvcCkpXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyLmZpeEl0ZW1zUG9zaXRpb25zKCk7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIucmVmbG93KCk7XG4gICAgfVxuXG4gICAgZGlzYWJsZShpdGVtKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZHggPSB0aGlzLmdyaWRzdGVyLml0ZW1zLmluZGV4T2YoaXRlbS5pdGVtQ29tcG9uZW50KTtcblxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaXRlbUlkeCA+PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ncmlkc3Rlci5pdGVtc1tcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVyLml0ZW1zLmluZGV4T2YoaXRlbS5pdGVtQ29tcG9uZW50KVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRzdGVyLm9uRHJhZ091dChpdGVtKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsUG9zaXRpb25Gcm9tUGFyZW50cyhcbiAgICAgICAgZWxlbWVudDogRWxlbWVudCxcbiAgICAgICAgZGF0YSA9IHsgc2Nyb2xsVG9wOiAwLCBzY3JvbGxMZWZ0OiAwIH1cbiAgICApOiB7IHNjcm9sbFRvcDogbnVtYmVyOyBzY3JvbGxMZWZ0OiBudW1iZXIgfSB7XG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICBkYXRhLnNjcm9sbFRvcCArPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgZGF0YS5zY3JvbGxMZWZ0ICs9IGVsZW1lbnQucGFyZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbkZyb21QYXJlbnRzKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogZGF0YS5zY3JvbGxUb3AsXG4gICAgICAgICAgICBzY3JvbGxMZWZ0OiBkYXRhLnNjcm9sbExlZnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IGdyaWRzdGVyIHByb3RvdHlwZSBpdGVtIHRvIGdyaWRzdGVyIGRyYWdnaW5nIGhvb2tzIChvblN0YXJ0LCBvbkRyYWcsIG9uU3RvcCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25uZWN0R3JpZHN0ZXJQcm90b3R5cGUoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUub2JzZXJ2ZURyb3BPdXQodGhpcy5ncmlkc3Rlcikuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgY29uc3QgZHJvcE92ZXJPYnNlcnZhYmxlID0gPENvbm5lY3RhYmxlT2JzZXJ2YWJsZTxhbnk+PihcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGVcbiAgICAgICAgICAgICAgICAub2JzZXJ2ZURyb3BPdmVyKHRoaXMuZ3JpZHN0ZXIpXG4gICAgICAgICAgICAgICAgLnBpcGUocHVibGlzaCgpKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRyYWdPYnNlcnZhYmxlID0gdGhpcy5ncmlkc3RlclByb3RvdHlwZS5vYnNlcnZlRHJhZ092ZXIoXG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgZHJhZ09ic2VydmFibGUuZHJhZ092ZXJcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5pc0Rpc2FibGVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb3RvdHlwZTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJvdG90eXBlRW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub25EcmFnKHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRyYWdPYnNlcnZhYmxlLmRyYWdFbnRlclxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLmlzRGlzYWJsZWQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJvdG90eXBlOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUHJvdG90eXBlRW50ZXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci5pdGVtcy5pbmRleE9mKHByb3RvdHlwZS5pdGVtKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5pdGVtcy5wdXNoKHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vblN0YXJ0KHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgICAgICBwcm90b3R5cGUuc2V0RHJhZ0NvbnRleHRHcmlkc3Rlcih0aGlzLmdyaWRzdGVyKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5kaXNhYmxlKHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b3R5cGVFbnRlci5lbWl0KHsgaXRlbTogcHJvdG90eXBlLml0ZW0gfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkcmFnT2JzZXJ2YWJsZS5kcmFnT3V0XG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuaXNEaXNhYmxlZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChw