UNPKG

mutable-div

Version:

Directives to enable moving or resizing a div element.

130 lines 25.5 kB
import { Component, Input, ViewChildren } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../draggable-element.directive"; export class ResizeHandlersComponent { constructor() { this.selected = false; this.minimumSize = 20; } ngAfterViewInit() { this.setHandlePositions(); } ngOnChanges() { if (this.selected) { this.setHandlePositions(); } } setHandlePositions() { this.handles.forEach((element, index) => { switch (index) { case 0: this.setHandleStyles(element, { left: '-7px', right: '', top: '-7px', bottom: '' }); break; case 1: this.setHandleStyles(element, { left: '', right: '-7px', top: '-7px', bottom: '' }); break; case 2: this.setHandleStyles(element, { left: '-7px', right: '', top: '', bottom: '-7px' }); break; default: this.setHandleStyles(element, { left: '', right: '-7px', top: '', bottom: '-7px' }); } }); } setHandleStyles(element, styles) { element.nativeElement.style.left = styles.left; element.nativeElement.style.right = styles.right; element.nativeElement.style.top = styles.top; element.nativeElement.style.bottom = styles.bottom; } onPointerDown(event) { event.stopPropagation(); } resize(className, coordinates) { const parentElement = this.parentElement.nativeElement; const size = this.calculatingPosition(parentElement, className, coordinates); if (size.width > this.minimumSize && size.height > this.minimumSize) { if (className.includes('TOP-LEFT')) { parentElement.style.left = size.position.x + 'px'; parentElement.style.width = size.width + 'px'; parentElement.style.top = size.position.y + 'px'; parentElement.style.height = size.height + 'px'; } else if (className.includes('TOP-RIGHT')) { parentElement.style.width = size.width + 'px'; parentElement.style.top = size.position.y + 'px'; parentElement.style.height = size.height + 'px'; } else if (className.includes('BOTTOM-LEFT')) { parentElement.style.left = size.position.x + 'px'; parentElement.style.width = size.width + 'px'; parentElement.style.height = size.height + 'px'; } else { parentElement.style.width = size.width + 'px'; parentElement.style.height = size.height + 'px'; } } this.setHandlePositions(); } calculatingPosition(parentElement, className, coordinates) { switch (this.rotate) { case 90: return { width: className.includes('LEFT') ? parentElement.offsetWidth - coordinates.y : parentElement.offsetWidth + coordinates.y, height: className.includes('TOP') ? parentElement.offsetHeight + coordinates.x : parentElement.offsetHeight - coordinates.x, position: { x: parentElement.offsetLeft + coordinates.y, y: parentElement.offsetTop - coordinates.x } }; break; case 180: return { width: className.includes('LEFT') ? parentElement.offsetWidth + coordinates.x : parentElement.offsetWidth - coordinates.x, height: className.includes('TOP') ? parentElement.offsetHeight + coordinates.y : parentElement.offsetHeight - coordinates.y, position: { x: parentElement.offsetLeft - coordinates.x, y: parentElement.offsetTop - coordinates.y } }; break; case 270: return { width: className.includes('LEFT') ? parentElement.offsetWidth + coordinates.y : parentElement.offsetWidth - coordinates.y, height: className.includes('TOP') ? parentElement.offsetHeight - coordinates.x : parentElement.offsetHeight + coordinates.x, position: { x: parentElement.offsetLeft - coordinates.y, y: parentElement.offsetTop + coordinates.x } }; break; default: return { width: className.includes('LEFT') ? parentElement.offsetWidth - coordinates.x : parentElement.offsetWidth + coordinates.x, height: className.includes('TOP') ? parentElement.offsetHeight - coordinates.y : parentElement.offsetHeight + coordinates.y, position: { x: parentElement.offsetLeft + coordinates.x, y: parentElement.offsetTop + coordinates.y } }; } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResizeHandlersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ResizeHandlersComponent, selector: "lib-resize-handlers", inputs: { parentElement: "parentElement", rotate: "rotate", selected: "selected" }, viewQueries: [{ propertyName: "handles", predicate: ["handle"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"selected\" class=\"resize-handlers\">\n <div #handle #topLeft\n class=\"TOP-LEFT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(topLeft.className, $event)\"></div>\n <div #handle #topRight\n class=\"TOP-RIGHT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(topRight.className, $event)\"></div>\n <div #handle #bottomLeft\n class=\"BOTTOM-LEFT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(bottomLeft.className, $event)\"></div>\n <div #handle #bottomRight\n class=\"BOTTOM-RIGHT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(bottomRight.className, $event)\"></div>\n</div>\n", styles: [".resize-handlers{width:100%;height:100%;position:absolute;top:0;left:0;border:2px solid #424242;box-sizing:border-box}.handle{position:absolute;width:20px;height:20px;background:#fff;opacity:50%}.TOP-LEFT{left:-7px;top:-7px;border-top:3px solid #424242;border-left:3px solid #424242}.TOP-LEFT:hover,.TOP-LEFT:active{border-radius:unset;background:transparent;border-bottom:black;border-right:black}.TOP-RIGHT{right:-7px;top:-7px;border-top:3px solid #424242;border-right:3px solid #424242}.TOP-RIGHT:hover,.TOP-RIGHT:active{border-radius:unset;background:transparent;border-bottom:black;border-left:black}.BOTTOM-LEFT{left:-7px;bottom:-7px;border-bottom:3px solid #424242;border-left:3px solid #424242}.BOTTOM-LEFT:hover,.BOTTOM-LEFT:active{border-radius:unset;background:transparent;border-top:black;border-right:black}.BOTTOM-RIGHT{right:-7px;bottom:-7px;border-bottom:3px solid #424242;border-right:3px solid #424242}.BOTTOM-RIGHT:hover,.BOTTOM-RIGHT:active{border-radius:unset;background:transparent;border-top:black;border-left:black}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DraggableElementDirective, selector: "[draggable]", inputs: ["rotate"], outputs: ["coordinates", "stopped"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResizeHandlersComponent, decorators: [{ type: Component, args: [{ selector: 'lib-resize-handlers', template: "<div *ngIf=\"selected\" class=\"resize-handlers\">\n <div #handle #topLeft\n class=\"TOP-LEFT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(topLeft.className, $event)\"></div>\n <div #handle #topRight\n class=\"TOP-RIGHT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(topRight.className, $event)\"></div>\n <div #handle #bottomLeft\n class=\"BOTTOM-LEFT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(bottomLeft.className, $event)\"></div>\n <div #handle #bottomRight\n class=\"BOTTOM-RIGHT handle\"\n draggable\n (pointerdown)=\"onPointerDown($event)\"\n (coordinates)=\"resize(bottomRight.className, $event)\"></div>\n</div>\n", styles: [".resize-handlers{width:100%;height:100%;position:absolute;top:0;left:0;border:2px solid #424242;box-sizing:border-box}.handle{position:absolute;width:20px;height:20px;background:#fff;opacity:50%}.TOP-LEFT{left:-7px;top:-7px;border-top:3px solid #424242;border-left:3px solid #424242}.TOP-LEFT:hover,.TOP-LEFT:active{border-radius:unset;background:transparent;border-bottom:black;border-right:black}.TOP-RIGHT{right:-7px;top:-7px;border-top:3px solid #424242;border-right:3px solid #424242}.TOP-RIGHT:hover,.TOP-RIGHT:active{border-radius:unset;background:transparent;border-bottom:black;border-left:black}.BOTTOM-LEFT{left:-7px;bottom:-7px;border-bottom:3px solid #424242;border-left:3px solid #424242}.BOTTOM-LEFT:hover,.BOTTOM-LEFT:active{border-radius:unset;background:transparent;border-top:black;border-right:black}.BOTTOM-RIGHT{right:-7px;bottom:-7px;border-bottom:3px solid #424242;border-right:3px solid #424242}.BOTTOM-RIGHT:hover,.BOTTOM-RIGHT:active{border-radius:unset;background:transparent;border-top:black;border-left:black}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { parentElement: [{ type: Input }], rotate: [{ type: Input }], selected: [{ type: Input }], handles: [{ type: ViewChildren, args: ['handle'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLWhhbmRsZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL211dGFibGUtZGl2L3NyYy9saWIvcmVzaXplLWhhbmRsZXJzL3Jlc2l6ZS1oYW5kbGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tdXRhYmxlLWRpdi9zcmMvbGliL3Jlc2l6ZS1oYW5kbGVycy9yZXNpemUtaGFuZGxlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEVBR0wsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDOzs7O0FBVXZCLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEM7UUFOUyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSTFCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO0lBRUQsQ0FBQztJQUVqQixlQUFlO1FBQ2IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RDLFFBQVEsS0FBSyxFQUFFO2dCQUNiLEtBQUssQ0FBQztvQkFDSixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNwRixNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFLElB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QkFDRSxPQUFPO29CQUNMLEtBQUssRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUM7b0JBQ3pILE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBRSxhQUFhLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLGFBQWEsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUM7b0JBQzdILFFBQVEsRUFBRTt3QkFDUixDQUFDLEVBQUUsYUFBYSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQzt3QkFDM0MsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUM7cUJBQzNDO2lCQUNGLENBQUM7U0FDTDtJQUNILENBQUM7a0lBdEhVLHVCQUF1QjtzSEFBdkIsdUJBQXVCLDBQQ2xCcEMsczFCQXNCQTs7NEZESmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjswRUFNdEIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFa0IsT0FBTztzQkFBOUIsWUFBWTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kZWwvcG9zaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uL21vZGVsL3NpemUubW9kZWwnO1xuaW1wb3J0IHsgSGFuZGxlQmFyIH0gZnJvbSAnLi4vbW9kZWwvaGFuZGxlLWJhci5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1yZXNpemUtaGFuZGxlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzaXplLWhhbmRsZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVzaXplLWhhbmRsZXJzLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZXNpemVIYW5kbGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcGFyZW50RWxlbWVudDogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgcm90YXRlOiBudW1iZXI7XG4gIEBJbnB1dCgpIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZHJlbignaGFuZGxlJykgaGFuZGxlczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIG1pbmltdW1TaXplID0gMjA7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRIYW5kbGVQb3NpdGlvbnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNldEhhbmRsZVBvc2l0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHNldEhhbmRsZVBvc2l0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZXMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHRoaXMuc2V0SGFuZGxlU3R5bGVzKGVsZW1lbnQsIHsgbGVmdDogJy03cHgnLCByaWdodDogJycsIHRvcDogJy03cHgnLCBib3R0b206ICcnIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdGhpcy5zZXRIYW5kbGVTdHlsZXMoZWxlbWVudCwgeyBsZWZ0OiAnJywgcmlnaHQ6ICctN3B4JywgdG9wOiAnLTdweCcsIGJvdHRvbTogJycgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0aGlzLnNldEhhbmRsZVN0eWxlcyhlbGVtZW50LCB7IGxlZnQ6ICctN3B4JywgcmlnaHQ6ICcnLCB0b3A6ICcnLCBib3R0b206ICctN3B4JyB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLnNldEhhbmRsZVN0eWxlcyhlbGVtZW50LCB7IGxlZnQ6ICcnLCByaWdodDogJy03cHgnLCB0b3A6ICcnLCBib3R0b206ICctN3B4JyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldEhhbmRsZVN0eWxlcyhlbGVtZW50OiBFbGVtZW50UmVmLCBzdHlsZXM6IEhhbmRsZUJhcikge1xuICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gc3R5bGVzLmxlZnQ7XG4gICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gc3R5bGVzLnJpZ2h0O1xuICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSBzdHlsZXMudG9wO1xuICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5ib3R0b20gPSBzdHlsZXMuYm90dG9tO1xuICB9XG5cbiAgb25Qb2ludGVyRG93bihldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICByZXNpemUoY2xhc3NOYW1lOiBzdHJpbmcsIGNvb3JkaW5hdGVzOiBQb3NpdGlvbikge1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLnBhcmVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBzaXplID0gdGhpcy5jYWxjdWxhdGluZ1Bvc2l0aW9uKHBhcmVudEVsZW1lbnQsIGNsYXNzTmFtZSwgY29vcmRpbmF0ZXMpO1xuICAgIGlmIChzaXplLndpZHRoID4gdGhpcy5taW5pbXVtU2l6ZSAmJiBzaXplLmhlaWdodCA+IHRoaXMubWluaW11bVNpemUpIHtcbiAgICAgIGlmIChjbGFzc05hbWUuaW5jbHVkZXMoJ1RPUC1MRUZUJykpIHtcbiAgICAgICAgcGFyZW50RWxlbWVudC5zdHlsZS5sZWZ0ID0gc2l6ZS5wb3NpdGlvbi54ICsgJ3B4JztcbiAgICAgICAgcGFyZW50RWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xuICAgICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLnRvcCA9ICBzaXplLnBvc2l0aW9uLnkgKyAncHgnO1xuICAgICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgJ3B4JztcbiAgICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lLmluY2x1ZGVzKCdUT1AtUklHSFQnKSkge1xuICAgICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArICdweCc7XG4gICAgICAgIHBhcmVudEVsZW1lbnQuc3R5bGUudG9wID0gc2l6ZS5wb3NpdGlvbi55ICsgJ3B4JztcbiAgICAgICAgcGFyZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7XG4gICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5pbmNsdWRlcygnQk9UVE9NLUxFRlQnKSkge1xuICAgICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLmxlZnQgPSBzaXplLnBvc2l0aW9uLnggKyAncHgnO1xuICAgICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArICdweCc7XG4gICAgICAgIHBhcmVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyAncHgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyZW50RWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xuICAgICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRIYW5kbGVQb3NpdGlvbnMoKTtcbiAgfVxuXG4gIGNhbGN1bGF0aW5nUG9zaXRpb24ocGFyZW50RWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZywgY29vcmRpbmF0ZXM6IFBvc2l0aW9uKTogU2l6ZSB7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0ZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogY2xhc3NOYW1lLmluY2x1ZGVzKCdMRUZUJykgPyBwYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoIC0gY29vcmRpbmF0ZXMueSA6IHBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGggKyBjb29yZGluYXRlcy55LFxuICAgICAgICAgIGhlaWdodDogY2xhc3NOYW1lLmluY2x1ZGVzKCdUT1AnKSA/IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgY29vcmRpbmF0ZXMueCA6ICBwYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCAtIGNvb3JkaW5hdGVzLngsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCArIGNvb3JkaW5hdGVzLnksXG4gICAgICAgICAgICB5OiBwYXJlbnRFbGVtZW50Lm9mZnNldFRvcCAtIGNvb3JkaW5hdGVzLnhcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2lkdGg6IGNsYXNzTmFtZS5pbmNsdWRlcygnTEVGVCcpID8gcGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCArIGNvb3JkaW5hdGVzLnggOiBwYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoIC0gY29vcmRpbmF0ZXMueCxcbiAgICAgICAgICBoZWlnaHQ6IGNsYXNzTmFtZS5pbmNsdWRlcygnVE9QJykgPyBwYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCArIGNvb3JkaW5hdGVzLnkgOiAgcGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQgLSBjb29yZGluYXRlcy55LFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwYXJlbnRFbGVtZW50Lm9mZnNldExlZnQgLSBjb29yZGluYXRlcy54LFxuICAgICAgICAgICAgeTogcGFyZW50RWxlbWVudC5vZmZzZXRUb3AgLSBjb29yZGluYXRlcy55XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBjbGFzc05hbWUuaW5jbHVkZXMoJ0xFRlQnKSA/IHBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGggKyBjb29yZGluYXRlcy55IDogcGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCAtIGNvb3JkaW5hdGVzLnksXG4gICAgICAgICAgaGVpZ2h0OiBjbGFzc05hbWUuaW5jbHVkZXMoJ1RPUCcpID8gcGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQgLSBjb29yZGluYXRlcy54IDogIHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgY29vcmRpbmF0ZXMueCxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0IC0gY29vcmRpbmF0ZXMueSxcbiAgICAgICAgICAgIHk6IHBhcmVudEVsZW1lbnQub2Zmc2V0VG9wICsgY29vcmRpbmF0ZXMueFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBjbGFzc05hbWUuaW5jbHVkZXMoJ0xFRlQnKSA/IHBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGggLSBjb29yZGluYXRlcy54IDogcGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCArIGNvb3JkaW5hdGVzLngsXG4gICAgICAgICAgaGVpZ2h0OiBjbGFzc05hbWUuaW5jbHVkZXMoJ1RPUCcpID8gIHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gY29vcmRpbmF0ZXMueSA6ICBwYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCArIGNvb3JkaW5hdGVzLnksXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCArIGNvb3JkaW5hdGVzLngsXG4gICAgICAgICAgICB5OiBwYXJlbnRFbGVtZW50Lm9mZnNldFRvcCArIGNvb3JkaW5hdGVzLnlcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRcIiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVyc1wiPlxuICA8ZGl2ICNoYW5kbGUgI3RvcExlZnRcbiAgICAgICBjbGFzcz1cIlRPUC1MRUZUIGhhbmRsZVwiXG4gICAgICAgZHJhZ2dhYmxlXG4gICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUG9pbnRlckRvd24oJGV2ZW50KVwiXG4gICAgICAgKGNvb3JkaW5hdGVzKT1cInJlc2l6ZSh0b3BMZWZ0LmNsYXNzTmFtZSwgJGV2ZW50KVwiPjwvZGl2PlxuICA8ZGl2ICNoYW5kbGUgI3RvcFJpZ2h0XG4gICAgICAgY2xhc3M9XCJUT1AtUklHSFQgaGFuZGxlXCJcbiAgICAgICBkcmFnZ2FibGVcbiAgICAgICAocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkZXZlbnQpXCJcbiAgICAgICAoY29vcmRpbmF0ZXMpPVwicmVzaXplKHRvcFJpZ2h0LmNsYXNzTmFtZSwgJGV2ZW50KVwiPjwvZGl2PlxuICA8ZGl2ICNoYW5kbGUgI2JvdHRvbUxlZnRcbiAgICAgICBjbGFzcz1cIkJPVFRPTS1MRUZUIGhhbmRsZVwiXG4gICAgICAgZHJhZ2dhYmxlXG4gICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUG9pbnRlckRvd24oJGV2ZW50KVwiXG4gICAgICAgKGNvb3JkaW5hdGVzKT1cInJlc2l6ZShib3R0b21MZWZ0LmNsYXNzTmFtZSwgJGV2ZW50KVwiPjwvZGl2PlxuICA8ZGl2ICNoYW5kbGUgI2JvdHRvbVJpZ2h0XG4gICAgICAgY2xhc3M9XCJCT1RUT00tUklHSFQgaGFuZGxlXCJcbiAgICAgICBkcmFnZ2FibGVcbiAgICAgICAocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkZXZlbnQpXCJcbiAgICAgICAoY29vcmRpbmF0ZXMpPVwicmVzaXplKGJvdHRvbVJpZ2h0LmNsYXNzTmFtZSwgJGV2ZW50KVwiPjwvZGl2PlxuPC9kaXY+XG4iXX0=