UNPKG

ng-antd-color-picker

Version:

The angular version of the color-picker component based on antd styles.

197 lines 25.3 kB
import { DOCUMENT } from '@angular/common'; import { Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core'; import { calculateColor, calculateOffset } from '../util/util'; import { HandlerComponent } from './handler.component'; import { PaletteComponent } from './palette.component'; import * as i0 from "@angular/core"; function getPosition(e) { const obj = 'touches' in e ? e.touches[0] : e; const scrollXOffset = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset; const scrollYOffset = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset; return { pageX: obj.pageX - scrollXOffset, pageY: obj.pageY - scrollYOffset }; } export class PickerComponent { toRgbString() { return this.color?.toRgbString(); } toHsb() { return `hsl(${this.color?.toHsb().h},100%, 50%)`; } constructor(cdr, document) { this.cdr = cdr; this.document = document; this.color = null; this.nzOnChange = new EventEmitter(); this.nzOnChangeComplete = new EventEmitter(); this.disabled = false; this.offsetValue = { x: 0, y: 0 }; this.dragRef = false; this.mouseMoveRef = () => null; this.mouseUpRef = () => null; this.updateOffset = (e, direction = 'y') => { const { pageX, pageY } = getPosition(e); const { x: rectX, y: rectY, width, height } = this.containerRef?.nativeElement?.getBoundingClientRect() || { x: 0, y: 0, width: 0, height: 0 }; const { width: targetWidth, height: targetHeight } = this.transformRef?.nativeElement?.getBoundingClientRect() || { width: 0, height: 0 }; const centerOffsetX = targetWidth / 2; const centerOffsetY = targetHeight / 2; const offsetX = Math.max(0, Math.min(pageX - rectX, width)) - centerOffsetX; const offsetY = Math.max(0, Math.min(pageY - rectY, height)) - centerOffsetY; const calcOffset = { x: offsetX, y: direction === 'x' ? this.offsetValue.y : offsetY }; // Exclusion of boundary cases if ((targetWidth === 0 && targetHeight === 0) || targetWidth !== targetHeight) { return; } this.offsetValue = calcOffset; this.nzOnChange.emit(calculateColor(calcOffset, this.containerRef.nativeElement, this.transformRef.nativeElement, this.color)); this.cdr.detectChanges(); }; this.onDragMove = (e) => { e.preventDefault(); this.updateOffset(e); }; this.onDragStop = (e) => { e.preventDefault(); this.dragRef = false; this.document.removeEventListener('mousemove', this.onDragMove); this.document.removeEventListener('mouseup', this.mouseUpRef); this.document.removeEventListener('touchmove', this.mouseMoveRef); this.document.removeEventListener('touchend', this.mouseUpRef); this.mouseMoveRef = () => null; this.mouseUpRef = () => null; this.nzOnChangeComplete?.emit(); }; this.onDragStart = (e) => { if (this.disabled) { return; } this.updateOffset(e); this.dragRef = true; this.document.addEventListener('mousemove', this.onDragMove); this.document.addEventListener('mouseup', this.onDragStop); this.document.addEventListener('touchmove', this.onDragMove); this.document.addEventListener('touchend', this.onDragStop); this.mouseMoveRef = this.onDragMove; this.mouseUpRef = this.onDragStop; this.cdr.markForCheck(); }; } ngOnInit() { this.document.removeEventListener('mousemove', this.mouseMoveRef); this.document.removeEventListener('mouseup', this.mouseUpRef); this.document.removeEventListener('touchmove', this.mouseMoveRef); this.document.removeEventListener('touchend', this.mouseUpRef); this.mouseMoveRef = () => null; this.mouseUpRef = () => null; } ngOnChanges(changes) { const { color } = changes; if (color) { if (!this.dragRef && this.containerRef && this.transformRef) { const calcOffset = calculateOffset(this.containerRef.nativeElement, this.transformRef.nativeElement, this.color); if (calcOffset) { this.offsetValue = calcOffset; this.cdr.detectChanges(); } } } } ngAfterViewInit() { if (!this.dragRef && this.containerRef && this.transformRef) { const calcOffset = calculateOffset(this.containerRef.nativeElement, this.transformRef.nativeElement, this.color); if (calcOffset) { this.offsetValue = calcOffset; this.cdr.detectChanges(); } } } dragStartHandle(e) { this.onDragStart(e); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: PickerComponent, isStandalone: true, selector: "color-picker", inputs: { color: "color", disabled: "disabled" }, outputs: { nzOnChange: "nzOnChange", nzOnChangeComplete: "nzOnChangeComplete" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["slider"], descendants: true }, { propertyName: "transformRef", first: true, predicate: ["transform"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <div #slider class="ant-color-picker-select" (mousedown)="dragStartHandle($event)" (touchstart)="dragStartHandle($event)" > <color-palette> <div #transform style="position: absolute; z-index: 1;" [style.left]="offsetValue.x + 'px'" [style.top]="offsetValue.y + 'px'" > <color-handler [color]="toRgbString()" /> </div> <div class="ant-color-picker-saturation" style=" background-image: linear-gradient(0deg, #000, transparent), linear-gradient(90deg, #fff, hsla(0, 0%, 100%, 0)); " [style.background-color]="toHsb()" ></div> </color-palette> </div> `, isInline: true, dependencies: [{ kind: "component", type: HandlerComponent, selector: "color-handler", inputs: ["color", "size"] }, { kind: "component", type: PaletteComponent, selector: "color-palette" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PickerComponent, decorators: [{ type: Component, args: [{ selector: 'color-picker', standalone: true, imports: [HandlerComponent, PaletteComponent], template: ` <div #slider class="ant-color-picker-select" (mousedown)="dragStartHandle($event)" (touchstart)="dragStartHandle($event)" > <color-palette> <div #transform style="position: absolute; z-index: 1;" [style.left]="offsetValue.x + 'px'" [style.top]="offsetValue.y + 'px'" > <color-handler [color]="toRgbString()" /> </div> <div class="ant-color-picker-saturation" style=" background-image: linear-gradient(0deg, #000, transparent), linear-gradient(90deg, #fff, hsla(0, 0%, 100%, 0)); " [style.background-color]="toHsb()" ></div> </color-palette> </div> ` }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { containerRef: [{ type: ViewChild, args: ['slider', { static: false }] }], transformRef: [{ type: ViewChild, args: ['transform', { static: false }] }], color: [{ type: Input }], nzOnChange: [{ type: Output }], nzOnChangeComplete: [{ type: Output }], disabled: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWFudGQtY29sb3ItcGlja2VyL3NyYy9saWIvY29tcG9uZW50cy9waWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBTXZELFNBQVMsV0FBVyxDQUFDLENBQVk7SUFDL0IsTUFBTSxHQUFHLEdBQUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDNUcsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUMxRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDO0FBQ2hGLENBQUM7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a0JBaEMzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7b0JBQzdDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQ7aUJBQ0Y7OzBCQXlCSSxNQUFNOzJCQUFDLFFBQVE7eUNBdkJzQixZQUFZO3NCQUFuRCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0ssWUFBWTtzQkFBdEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVoQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0UsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29sb3InO1xuaW1wb3J0IHsgSHNiYUNvbG9yVHlwZSwgVHJhbnNmb3JtT2Zmc2V0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlJztcbmltcG9ydCB7IGNhbGN1bGF0ZUNvbG9yLCBjYWxjdWxhdGVPZmZzZXQgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgSGFuZGxlckNvbXBvbmVudCB9IGZyb20gJy4vaGFuZGxlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFsZXR0ZUNvbXBvbmVudCB9IGZyb20gJy4vcGFsZXR0ZS5jb21wb25lbnQnO1xuXG50eXBlIEV2ZW50VHlwZSA9IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50O1xuXG50eXBlIEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSkgPT4gdm9pZDtcblxuZnVuY3Rpb24gZ2V0UG9zaXRpb24oZTogRXZlbnRUeXBlKTogeyBwYWdlWDogbnVtYmVyOyBwYWdlWTogbnVtYmVyIH0ge1xuICBjb25zdCBvYmogPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG4gIGNvbnN0IHNjcm9sbFhPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgd2luZG93LnBhZ2VYT2Zmc2V0O1xuICBjb25zdCBzY3JvbGxZT2Zmc2V0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7IHBhZ2VYOiBvYmoucGFnZVggLSBzY3JvbGxYT2Zmc2V0LCBwYWdlWTogb2JqLnBhZ2VZIC0gc2Nyb2xsWU9mZnNldCB9O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb2xvci1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbSGFuZGxlckNvbXBvbmVudCwgUGFsZXR0ZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI3NsaWRlclxuICAgICAgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXNlbGVjdFwiXG4gICAgICAobW91c2Vkb3duKT1cImRyYWdTdGFydEhhbmRsZSgkZXZlbnQpXCJcbiAgICAgICh0b3VjaHN0YXJ0KT1cImRyYWdTdGFydEhhbmRsZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8Y29sb3ItcGFsZXR0ZT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICN0cmFuc2Zvcm1cbiAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTtcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cIm9mZnNldFZhbHVlLnggKyAncHgnXCJcbiAgICAgICAgICBbc3R5bGUudG9wXT1cIm9mZnNldFZhbHVlLnkgKyAncHgnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjb2xvci1oYW5kbGVyIFtjb2xvcl09XCJ0b1JnYlN0cmluZygpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFudC1jb2xvci1waWNrZXItc2F0dXJhdGlvblwiXG4gICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDBkZWcsICMwMDAsIHRyYW5zcGFyZW50KSxcbiAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICNmZmYsIGhzbGEoMCwgMCUsIDEwMCUsIDApKTtcbiAgICAgIFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwidG9Ic2IoKVwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvY29sb3ItcGFsZXR0ZT5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250YWluZXJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndHJhbnNmb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRyYW5zZm9ybVJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBJbnB1dCgpIGNvbG9yOiBDb2xvciB8IG51bGwgPSBudWxsO1xuICBAT3V0cHV0KCkgbnpPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sb3I+KCk7XG4gIEBPdXRwdXQoKSBuek9uQ2hhbmdlQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPEhzYmFDb2xvclR5cGU+KCk7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgb2Zmc2V0VmFsdWU6IFRyYW5zZm9ybU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICBkcmFnUmVmOiBib29sZWFuID0gZmFsc2U7XG4gIG1vdXNlTW92ZVJlZjogKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcbiAgbW91c2VVcFJlZjogKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcblxuICB0b1JnYlN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbG9yPy50b1JnYlN0cmluZygpIGFzIHN0cmluZztcbiAgfVxuXG4gIHRvSHNiKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBoc2woJHt0aGlzLmNvbG9yPy50b0hzYigpLmh9LDEwMCUsIDUwJSlgO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlUmVmKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm1vdXNlVXBSZWYpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5tb3VzZU1vdmVSZWYpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm1vdXNlVXBSZWYpO1xuICAgIHRoaXMubW91c2VNb3ZlUmVmID0gKCkgPT4gbnVsbDtcbiAgICB0aGlzLm1vdXNlVXBSZWYgPSAoKSA9PiBudWxsO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29sb3IgfSA9IGNoYW5nZXM7XG5cbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGlmICghdGhpcy5kcmFnUmVmICYmIHRoaXMuY29udGFpbmVyUmVmICYmIHRoaXMudHJhbnNmb3JtUmVmKSB7XG4gICAgICAgIGNvbnN0IGNhbGNPZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQoXG4gICAgICAgICAgdGhpcy5jb250YWluZXJSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMuY29sb3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNhbGNPZmZzZXQpIHtcbiAgICAgICAgICB0aGlzLm9mZnNldFZhbHVlID0gY2FsY09mZnNldDtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdSZWYgJiYgdGhpcy5jb250YWluZXJSZWYgJiYgdGhpcy50cmFuc2Zvcm1SZWYpIHtcbiAgICAgIGNvbnN0IGNhbGNPZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQodGhpcy5jb250YWluZXJSZWYubmF0aXZlRWxlbWVudCwgdGhpcy50cmFuc2Zvcm1SZWYubmF0aXZlRWxlbWVudCwgdGhpcy5jb2xvcik7XG4gICAgICBpZiAoY2FsY09mZnNldCkge1xuICAgICAgICB0aGlzLm9mZnNldFZhbHVlID0gY2FsY09mZnNldDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRyYWdTdGFydEhhbmRsZShlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIHRoaXMub25EcmFnU3RhcnQoZSk7XG4gIH1cblxuICB1cGRhdGVPZmZzZXQ6IEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSwgZGlyZWN0aW9uOiAneCcgfCAneScgPSAneScpID0+IHtcbiAgICBjb25zdCB7IHBhZ2VYLCBwYWdlWSB9ID0gZ2V0UG9zaXRpb24oZSk7XG4gICAgY29uc3Qge1xuICAgICAgeDogcmVjdFgsXG4gICAgICB5OiByZWN0WSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBjb25zdCB7IHdpZHRoOiB0YXJnZXRXaWR0aCwgaGVpZ2h0OiB0YXJnZXRIZWlnaHQgfSA9IHRoaXMudHJhbnNmb3JtUmVmPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG5cbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gdGFyZ2V0V2lkdGggLyAyO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSB0YXJnZXRIZWlnaHQgLyAyO1xuXG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VYIC0gcmVjdFgsIHdpZHRoKSkgLSBjZW50ZXJPZmZzZXRYO1xuICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWSAtIHJlY3RZLCBoZWlnaHQpKSAtIGNlbnRlck9mZnNldFk7XG5cbiAgICBjb25zdCBjYWxjT2Zmc2V0ID0ge1xuICAgICAgeDogb2Zmc2V0WCxcbiAgICAgIHk6IGRpcmVjdGlvbiA9PT0gJ3gnID8gdGhpcy5vZmZzZXRWYWx1ZS55IDogb2Zmc2V0WVxuICAgIH07XG4gICAgLy8gRXhjbHVzaW9uIG9mIGJvdW5kYXJ5IGNhc2VzXG4gICAgaWYgKCh0YXJnZXRXaWR0aCA9PT0gMCAmJiB0YXJnZXRIZWlnaHQgPT09IDApIHx8IHRhcmdldFdpZHRoICE9PSB0YXJnZXRIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vZmZzZXRWYWx1ZSA9IGNhbGNPZmZzZXQ7XG4gICAgdGhpcy5uek9uQ2hhbmdlLmVtaXQoXG4gICAgICBjYWxjdWxhdGVDb2xvcihjYWxjT2Zmc2V0LCB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnRyYW5zZm9ybVJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbG9yKVxuICAgICk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9O1xuXG4gIG9uRHJhZ01vdmU6IEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnVwZGF0ZU9mZnNldChlKTtcbiAgfTtcblxuICBvbkRyYWdTdG9wOiBFdmVudEhhbmRsZSA9IChlOiBFdmVudFR5cGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnUmVmID0gZmFsc2U7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZ01vdmUpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm1vdXNlTW92ZVJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5tb3VzZU1vdmVSZWYgPSAoKSA9PiBudWxsO1xuICAgIHRoaXMubW91c2VVcFJlZiA9ICgpID0+IG51bGw7XG4gICAgdGhpcy5uek9uQ2hhbmdlQ29tcGxldGU/LmVtaXQoKTtcbiAgfTtcblxuICBvbkRyYWdTdGFydDogRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlKSA9PiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoZSk7XG4gICAgdGhpcy5kcmFnUmVmID0gdHJ1ZTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnTW92ZSk7XG4gICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdTdG9wKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25EcmFnTW92ZSk7XG4gICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25EcmFnU3RvcCk7XG4gICAgdGhpcy5tb3VzZU1vdmVSZWYgPSB0aGlzLm9uRHJhZ01vdmU7XG4gICAgdGhpcy5tb3VzZVVwUmVmID0gdGhpcy5vbkRyYWdTdG9wO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xufVxuIl19