UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

191 lines 27 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { DOCUMENT, NgClass } from '@angular/common'; import { Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core'; import { calculateColor, calculateOffset } from '../util/util'; import { GradientComponent } from './gradient.component'; 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 SliderComponent { constructor(cdr, document) { this.cdr = cdr; this.document = document; this.gradientColors = []; this.direction = 'to right'; this.type = 'hue'; this.color = null; this.value = null; this.disabled = false; this.nzOnChange = new EventEmitter(); this.nzOnChangeComplete = new EventEmitter(); this.offsetValue = { x: 0, y: 0 }; this.dragRef = false; this.mouseMoveRef = () => null; this.mouseUpRef = () => null; this.updateOffset = (e, direction = 'x') => { 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.type)); 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.type); }; 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, this.type); 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, this.type); if (calcOffset) { this.offsetValue = calcOffset; this.cdr.detectChanges(); } } } dragStartHandle(e) { this.onDragStart(e); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: SliderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: SliderComponent, isStandalone: true, selector: "color-slider", inputs: { gradientColors: "gradientColors", direction: "direction", type: "type", color: "color", value: "value", 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 (mousedown)="dragStartHandle($event)" (touchstart)="dragStartHandle($event)" class="ant-color-picker-slider" [ngClass]="'ant-color-picker-slider-' + type" > <color-palette> <div #transform style="position: absolute; z-index: 1;" [style.left]="offsetValue.x + 'px'" [style.top]="offsetValue.y + 'px'" > <color-handler size="small" [color]="value"></color-handler> </div> <color-gradient [colors]="gradientColors" [direction]="direction" [type]="type"></color-gradient> </color-palette> </div> `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "component", type: PaletteComponent, selector: "color-palette" }, { kind: "component", type: GradientComponent, selector: "color-gradient", inputs: ["colors", "direction", "type"] }, { kind: "component", type: HandlerComponent, selector: "color-handler", inputs: ["color", "size"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: SliderComponent, decorators: [{ type: Component, args: [{ selector: 'color-slider', standalone: true, imports: [PaletteComponent, GradientComponent, HandlerComponent, NgClass], template: ` <div #slider (mousedown)="dragStartHandle($event)" (touchstart)="dragStartHandle($event)" class="ant-color-picker-slider" [ngClass]="'ant-color-picker-slider-' + type" > <color-palette> <div #transform style="position: absolute; z-index: 1;" [style.left]="offsetValue.x + 'px'" [style.top]="offsetValue.y + 'px'" > <color-handler size="small" [color]="value"></color-handler> </div> <color-gradient [colors]="gradientColors" [direction]="direction" [type]="type"></color-gradient> </color-palette> </div> `, styles: [":host{display:block;width:100%}\n"] }] }], 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 }] }], gradientColors: [{ type: Input }], direction: [{ type: Input }], type: [{ type: Input }], color: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input }], nzOnChange: [{ type: Output }], nzOnChangeComplete: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3NsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBTXZELFNBQVMsV0FBVyxDQUFDLENBQVk7SUFDL0IsTUFBTSxHQUFHLEdBQUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDNUcsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUMxRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxFQUFF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eEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixDQUFDOzhHQXBFVSxlQUFlLG1EQW9CaEIsUUFBUTtrR0FwQlAsZUFBZSw0ZkE5QmhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVCwyR0FyQlMsZ0JBQWdCLDBEQUFFLGlCQUFpQixvR0FBRSxnQkFBZ0IscUZBQUUsT0FBTzs7MkZBK0I3RCxlQUFlO2tCQW5DM0IsU0FBUzsrQkFFRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFlBQy9EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVDs7MEJBOEJFLE1BQU07MkJBQUMsUUFBUTt5Q0FuQnNCLFlBQVk7c0JBQW5ELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSyxZQUFZO3NCQUF0RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWhDLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNhLFVBQVU7c0JBQTVCLE1BQU07Z0JBQ1ksa0JBQWtCO3NCQUFwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRE9DVU1FTlQsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb2xvcic7XG5pbXBvcnQgeyBIc2JhQ29sb3JUeXBlLCBUcmFuc2Zvcm1PZmZzZXQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGUnO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29sb3IsIGNhbGN1bGF0ZU9mZnNldCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBHcmFkaWVudENvbXBvbmVudCB9IGZyb20gJy4vZ3JhZGllbnQuY29tcG9uZW50JztcbmltcG9ydCB7IEhhbmRsZXJDb21wb25lbnQgfSBmcm9tICcuL2hhbmRsZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBhbGV0dGVDb21wb25lbnQgfSBmcm9tICcuL3BhbGV0dGUuY29tcG9uZW50JztcblxudHlwZSBFdmVudFR5cGUgPSBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudDtcblxudHlwZSBFdmVudEhhbmRsZSA9IChlOiBFdmVudFR5cGUpID0+IHZvaWQ7XG5cbmZ1bmN0aW9uIGdldFBvc2l0aW9uKGU6IEV2ZW50VHlwZSk6IHsgcGFnZVg6IG51bWJlcjsgcGFnZVk6IG51bWJlciB9IHtcbiAgY29uc3Qgb2JqID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuICBjb25zdCBzY3JvbGxYT2Zmc2V0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgY29uc3Qgc2Nyb2xsWU9mZnNldCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgfHwgd2luZG93LnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4geyBwYWdlWDogb2JqLnBhZ2VYIC0gc2Nyb2xsWE9mZnNldCwgcGFnZVk6IG9iai5wYWdlWSAtIHNjcm9sbFlPZmZzZXQgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnY29sb3Itc2xpZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1BhbGV0dGVDb21wb25lbnQsIEdyYWRpZW50Q29tcG9uZW50LCBIYW5kbGVyQ29tcG9uZW50LCBOZ0NsYXNzXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjc2xpZGVyXG4gICAgICAobW91c2Vkb3duKT1cImRyYWdTdGFydEhhbmRsZSgkZXZlbnQpXCJcbiAgICAgICh0b3VjaHN0YXJ0KT1cImRyYWdTdGFydEhhbmRsZSgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiYW50LWNvbG9yLXBpY2tlci1zbGlkZXJcIlxuICAgICAgW25nQ2xhc3NdPVwiJ2FudC1jb2xvci1waWNrZXItc2xpZGVyLScgKyB0eXBlXCJcbiAgICA+XG4gICAgICA8Y29sb3ItcGFsZXR0ZT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICN0cmFuc2Zvcm1cbiAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTtcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cIm9mZnNldFZhbHVlLnggKyAncHgnXCJcbiAgICAgICAgICBbc3R5bGUudG9wXT1cIm9mZnNldFZhbHVlLnkgKyAncHgnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjb2xvci1oYW5kbGVyIHNpemU9XCJzbWFsbFwiIFtjb2xvcl09XCJ2YWx1ZVwiPjwvY29sb3ItaGFuZGxlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxjb2xvci1ncmFkaWVudCBbY29sb3JzXT1cImdyYWRpZW50Q29sb3JzXCIgW2RpcmVjdGlvbl09XCJkaXJlY3Rpb25cIiBbdHlwZV09XCJ0eXBlXCI+PC9jb2xvci1ncmFkaWVudD5cbiAgICAgIDwvY29sb3ItcGFsZXR0ZT5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgYFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0cmFuc2Zvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgdHJhbnNmb3JtUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQElucHV0KCkgZ3JhZGllbnRDb2xvcnM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogc3RyaW5nID0gJ3RvIHJpZ2h0JztcbiAgQElucHV0KCkgdHlwZTogSHNiYUNvbG9yVHlwZSA9ICdodWUnO1xuICBASW5wdXQoKSBjb2xvcjogQ29sb3IgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sb3I+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2hhbmdlQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPEhzYmFDb2xvclR5cGU+KCk7XG5cbiAgb2Zmc2V0VmFsdWU6IFRyYW5zZm9ybU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICBkcmFnUmVmOiBib29sZWFuID0gZmFsc2U7XG4gIG1vdXNlTW92ZVJlZjogKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcbiAgbW91c2VVcFJlZjogKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVSZWYpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm1vdXNlTW92ZVJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5tb3VzZU1vdmVSZWYgPSAoKSA9PiBudWxsO1xuICAgIHRoaXMubW91c2VVcFJlZiA9ICgpID0+IG51bGw7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb2xvciB9ID0gY2hhbmdlcztcblxuICAgIGlmIChjb2xvcikge1xuICAgICAgaWYgKCF0aGlzLmRyYWdSZWYgJiYgdGhpcy5jb250YWluZXJSZWYgJiYgdGhpcy50cmFuc2Zvcm1SZWYpIHtcbiAgICAgICAgY29uc3QgY2FsY09mZnNldCA9IGNhbGN1bGF0ZU9mZnNldChcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5jb2xvcixcbiAgICAgICAgICB0aGlzLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNhbGNPZmZzZXQpIHtcbiAgICAgICAgICB0aGlzLm9mZnNldFZhbHVlID0gY2FsY09mZnNldDtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdSZWYgJiYgdGhpcy5jb250YWluZXJSZWYgJiYgdGhpcy50cmFuc2Zvcm1SZWYpIHtcbiAgICAgIGNvbnN0IGNhbGNPZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQoXG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMudHJhbnNmb3JtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuY29sb3IsXG4gICAgICAgIHRoaXMudHlwZVxuICAgICAgKTtcbiAgICAgIGlmIChjYWxjT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMub2Zmc2V0VmFsdWUgPSBjYWxjT2Zmc2V0O1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZHJhZ1N0YXJ0SGFuZGxlKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkRyYWdTdGFydChlKTtcbiAgfVxuXG4gIHVwZGF0ZU9mZnNldDogRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlLCBkaXJlY3Rpb246ICd4JyB8ICd5JyA9ICd4JykgPT4ge1xuICAgIGNvbnN0IHsgcGFnZVgsIHBhZ2VZIH0gPSBnZXRQb3NpdGlvbihlKTtcbiAgICBjb25zdCB7XG4gICAgICB4OiByZWN0WCxcbiAgICAgIHk6IHJlY3RZLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy5jb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIGNvbnN0IHsgd2lkdGg6IHRhcmdldFdpZHRoLCBoZWlnaHQ6IHRhcmdldEhlaWdodCB9ID0gdGhpcy50cmFuc2Zvcm1SZWY/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcblxuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSB0YXJnZXRXaWR0aCAvIDI7XG4gICAgY29uc3QgY2VudGVyT2Zmc2V0WSA9IHRhcmdldEhlaWdodCAvIDI7XG5cbiAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVggLSByZWN0WCwgd2lkdGgpKSAtIGNlbnRlck9mZnNldFg7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VZIC0gcmVjdFksIGhlaWdodCkpIC0gY2VudGVyT2Zmc2V0WTtcblxuICAgIGNvbnN0IGNhbGNPZmZzZXQgPSB7XG4gICAgICB4OiBvZmZzZXRYLFxuICAgICAgeTogZGlyZWN0aW9uID09PSAneCcgPyB0aGlzLm9mZnNldFZhbHVlLnkgOiBvZmZzZXRZXG4gICAgfTtcblxuICAgIC8vIEV4Y2x1c2lvbiBvZiBib3VuZGFyeSBjYXNlc1xuICAgIGlmICgodGFyZ2V0V2lkdGggPT09IDAgJiYgdGFyZ2V0SGVpZ2h0ID09PSAwKSB8fCB0YXJnZXRXaWR0aCAhPT0gdGFyZ2V0SGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vZmZzZXRWYWx1ZSA9IGNhbGNPZmZzZXQ7XG4gICAgdGhpcy5uek9uQ2hhbmdlLmVtaXQoXG4gICAgICBjYWxjdWxhdGVDb2xvcihcbiAgICAgICAgY2FsY09mZnNldCxcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1SZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5jb2xvcixcbiAgICAgICAgdGhpcy50eXBlXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG5cbiAgb25EcmFnTW92ZTogRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KGUpO1xuICB9O1xuXG4gIG9uRHJhZ1N0b3A6IEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdSZWYgPSBmYWxzZTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnTW92ZSk7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwUmVmKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMubW91c2VNb3ZlUmVmKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5tb3VzZVVwUmVmKTtcbiAgICB0aGlzLm1vdXNlTW92ZVJlZiA9ICgpID0+IG51bGw7XG4gICAgdGhpcy5tb3VzZVVwUmVmID0gKCkgPT4gbnVsbDtcbiAgICB0aGlzLm56T25DaGFuZ2VDb21wbGV0ZT8uZW1pdCh0aGlzLnR5cGUpO1xuICB9O1xuXG4gIG9uRHJhZ1N0YXJ0OiBFdmVudEhhbmRsZSA9IChlOiBFdmVudFR5cGUpID0+IHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU9mZnNldChlKTtcbiAgICB0aGlzLmRyYWdSZWYgPSB0cnVlO1xuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbkRyYWdNb3ZlKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uRHJhZ1N0b3ApO1xuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdNb3ZlKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdTdG9wKTtcbiAgICB0aGlzLm1vdXNlTW92ZVJlZiA9IHRoaXMub25EcmFnTW92ZTtcbiAgICB0aGlzLm1vdXNlVXBSZWYgPSB0aGlzLm9uRHJhZ1N0b3A7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH07XG59XG4iXX0=