UNPKG

ngx-input-color

Version:

Angular color input component and color picker (with HSL, HSV, RGB, CMYK, HEX, alpha, eye-dropper, etc)

181 lines 26.9 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, HostListener, Input, Output, ViewChild, forwardRef } from '@angular/core'; import { getOffsetPosition } from '../utils/get-offset-position'; import { NG_VALUE_ACCESSOR, FormControl, } from '@angular/forms'; import * as i0 from "@angular/core"; export class SaturationComponent { constructor() { this.color = 'red'; this.step = 1; this.min = { x: 0, y: 0 }; this.max = { x: 100, y: 100 }; this.change = new EventEmitter(); this.isDragging = false; this.x = 0; this.y = 0; this.myControl = new FormControl(null); this.isDisabled = false; this._onChange = (value) => { }; this._onTouched = () => { }; this._validatorOnChange = () => { }; } updateRects() { this.saturationRect = this.saturation.nativeElement.getBoundingClientRect(); this.thumbRect = this.thumb.nativeElement.getBoundingClientRect(); } writeValue(val) { if (!val) val = { x: 0, y: 0 }; let value = val; this.myControl.setValue(value, { emitEvent: false }); this.updateRects(); const saturationRec = this.saturationRect; const thumbRec = this.thumbRect; this.x = ((value.x - this.min.x) * (saturationRec.width - thumbRec.width / 2)) / (this.max.x - this.min.x); this.y = ((value.y - this.min.y) * (saturationRec.height - thumbRec.height / 2)) / (this.max.y - this.min.y); if (val !== value) { this.valueChanged(value); } } validate(control) { return this.myControl.errors; } registerOnValidatorChange(fn) { this._validatorOnChange = fn; } registerOnChange(fn) { this._onChange = fn; } registerOnTouched(fn) { this._onTouched = fn; } setDisabledState(disabled) { this.isDisabled = disabled; if (disabled) this.myControl.disable(); else this.myControl.enable(); } dragStart(ev) { ev.stopPropagation(); ev.preventDefault(); this.isDragging = true; this.updateRects(); this.updatePosition(ev); } onResize() { this.writeValue(this.myControl.value); } onDrag(ev) { if (!this.isDragging) return; this.updatePosition(ev); } updatePosition(ev) { if (!this.isDragging) return; if (!this.saturationRect || !this.thumbRect) this.updateRects(); let position = getOffsetPosition(ev, this.saturation.nativeElement); let thumbRec = this.thumbRect; let saturationRec = this.saturationRect; if (position.x < 0) { this.x = 0; } else if (position.x > saturationRec.width - (thumbRec.width / 2 - 3)) { this.x = saturationRec.width - (thumbRec.width / 2 - 3); } else { this.x = position.x; } // this.x = this.x - thumbRec.width / 2; if (position.y < 0) { this.y = 0; } else if (position.y > saturationRec.height - (thumbRec.height / 2 - 3)) { this.y = saturationRec.height - (thumbRec.height / 2 - 3); } else { this.y = position.y; } // this.y = this.y - thumbRec.height / 2; this.setValueByPosition(thumbRec, saturationRec); } onDragEnd(ev) { this.isDragging = false; } setValueByPosition(thumbRec, saturationRec) { const percentageX = this.x / (saturationRec.width - thumbRec.width); let newValueX = this.min.x + percentageX * (this.max.x - this.min.x); newValueX = Math.round(newValueX / this.step) * this.step; let valueX = Math.min(Math.max(newValueX, this.min.x), this.max.x); //----------------------------- const percentageY = this.y / (saturationRec.height - thumbRec.height); let newValueY = this.min.y + percentageY * (this.max.y - this.min.y); newValueY = Math.round(newValueY / this.step) * this.step; let valueY = Math.min(Math.max(newValueY, this.min.y), this.max.y); const newValue = { x: valueX, y: valueY }; if (!this.myControl.value || this.myControl.value.x !== valueX || this.myControl.value.y !== valueY) { this.valueChanged(newValue); } } valueChanged(value) { this.myControl.setValue(value, { emitEvent: false }); this._onChange(value); this.change.emit(value); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SaturationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SaturationComponent, isStandalone: true, selector: "saturation", inputs: { width: "width", height: "height", color: "color", step: "step", min: "min", max: "max" }, outputs: { change: "change" }, host: { listeners: { "window:resize": "onResize($event)", "document:mousemove": "onDrag($event)", "document:touchmove": "onDrag($event)", "document:mouseup": "onDragEnd($event)", "document:touchend": "onDragEnd($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SaturationComponent), multi: true, }, ], viewQueries: [{ propertyName: "saturation", first: true, predicate: ["saturation"], descendants: true, static: true }, { propertyName: "thumb", first: true, predicate: ["thumb"], descendants: true, static: true }], ngImport: i0, template: "<div\r\n class=\"saturation-container\"\r\n [style.width.px]=\"width\"\r\n [style.height.px]=\"height\"\r\n (mousedown)=\"dragStart($event)\"\r\n (touchstart)=\"dragStart($event)\">\r\n <div class=\"saturation\" #saturation>\r\n <div class=\"s-bg\" [style.background]=\"color\"></div>\r\n <div class=\"s-white\"></div>\r\n <div class=\"s-black\"></div>\r\n </div>\r\n <div class=\"thumb\" #thumb [style.left.px]=\"x\" [style.top.px]=\"y\"></div>\r\n</div>\r\n", styles: [".saturation-container{position:relative;width:100%;height:200px}.saturation-container .thumb{border:3px #000000 solid;box-shadow:inset 0 0 0 2px #fff;width:12px;height:12px;display:block;border-radius:10px;position:absolute;pointer-events:none;cursor:pointer}.saturation{position:absolute;inset:6px;border-radius:4px;overflow:hidden}.saturation .s-white,.saturation .s-black,.saturation .s-bg{position:absolute;inset:0}.saturation .s-white{background:linear-gradient(to right,#fff,#fff0)}.saturation .s-black{background:linear-gradient(to bottom,#0000,#000)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SaturationComponent, decorators: [{ type: Component, args: [{ selector: 'saturation', standalone: true, imports: [CommonModule], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SaturationComponent), multi: true, }, ], template: "<div\r\n class=\"saturation-container\"\r\n [style.width.px]=\"width\"\r\n [style.height.px]=\"height\"\r\n (mousedown)=\"dragStart($event)\"\r\n (touchstart)=\"dragStart($event)\">\r\n <div class=\"saturation\" #saturation>\r\n <div class=\"s-bg\" [style.background]=\"color\"></div>\r\n <div class=\"s-white\"></div>\r\n <div class=\"s-black\"></div>\r\n </div>\r\n <div class=\"thumb\" #thumb [style.left.px]=\"x\" [style.top.px]=\"y\"></div>\r\n</div>\r\n", styles: [".saturation-container{position:relative;width:100%;height:200px}.saturation-container .thumb{border:3px #000000 solid;box-shadow:inset 0 0 0 2px #fff;width:12px;height:12px;display:block;border-radius:10px;position:absolute;pointer-events:none;cursor:pointer}.saturation{position:absolute;inset:6px;border-radius:4px;overflow:hidden}.saturation .s-white,.saturation .s-black,.saturation .s-bg{position:absolute;inset:0}.saturation .s-white{background:linear-gradient(to right,#fff,#fff0)}.saturation .s-black{background:linear-gradient(to bottom,#0000,#000)}\n"] }] }], ctorParameters: () => [], propDecorators: { width: [{ type: Input }], height: [{ type: Input }], color: [{ type: Input }], step: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], change: [{ type: Output }], saturation: [{ type: ViewChild, args: ['saturation', { static: true }] }], thumb: [{ type: ViewChild, args: ['thumb', { static: true }] }], onResize: [{ type: HostListener, args: ['window:resize', ['$event']] }], onDrag: [{ type: HostListener, args: ['document:mousemove', ['$event']] }, { type: HostListener, args: ['document:touchmove', ['$event']] }], onDragEnd: [{ type: HostListener, args: ['document:mouseup', ['$event']] }, { type: HostListener, args: ['document:touchend', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F0dXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW5wdXQtY29sb3Ivc3JjL3NhdHVyYXRpb24vc2F0dXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW5wdXQtY29sb3Ivc3JjL3NhdHVyYXRpb24vc2F0dXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLFdBQVcsR0FHWixNQUFNLGdCQUFnQixDQUFDOztBQWlCeEIsTUFBTSxPQUFPLG1CQUFtQjtJQXVCOUI7UUFwQlMsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNkLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxRQUFHLEdBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxRQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN4QixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUVqRCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBR25CLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sY0FBUyxHQUFHLElBQUksV0FBVyxDQUFtQixJQUFJLENBQUMsQ0FBQztRQUNwRCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FB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LFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUM3QyxZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWtDOUMsU0FBUztzQkFGUixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDM0MsWUFBWTt1QkFBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBnZXRPZmZzZXRQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2dldC1vZmZzZXQtcG9zaXRpb24nO1xyXG5pbXBvcnQge1xyXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSVBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL0lQb3NpdGlvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NhdHVyYXRpb24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NhdHVyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zYXR1cmF0aW9uLmNvbXBvbmVudC5zY3NzJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNhdHVyYXRpb25Db21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNhdHVyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgQElucHV0KCkgd2lkdGg/OiBudW1iZXI7XHJcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGNvbG9yID0gJ3JlZCc7XHJcbiAgQElucHV0KCkgc3RlcCA9IDE7XHJcbiAgQElucHV0KCkgbWluOiBJUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcclxuICBASW5wdXQoKSBtYXggPSB7IHg6IDEwMCwgeTogMTAwIH07XHJcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBvc2l0aW9uPigpO1xyXG5cclxuICBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnc2F0dXJhdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHNhdHVyYXRpb24hOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCd0aHVtYicsIHsgc3RhdGljOiB0cnVlIH0pIHRodW1iITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgeCA9IDA7XHJcbiAgeSA9IDA7XHJcbiAgbXlDb250cm9sID0gbmV3IEZvcm1Db250cm9sPElQb3NpdGlvbiB8IG51bGw+KG51bGwpO1xyXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICBfb25DaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge307XHJcbiAgX29uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG4gIF92YWxpZGF0b3JPbkNoYW5nZSA9ICgpID0+IHt9O1xyXG5cclxuICBwcml2YXRlIHNhdHVyYXRpb25SZWN0PzogRE9NUmVjdDtcclxuICBwcml2YXRlIHRodW1iUmVjdD86IERPTVJlY3Q7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVSZWN0cygpIHtcclxuICAgIHRoaXMuc2F0dXJhdGlvblJlY3QgPSB0aGlzLnNhdHVyYXRpb24ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMudGh1bWJSZWN0ID0gdGhpcy50aHVtYi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWw/OiBJUG9zaXRpb24gfCBudWxsKTogdm9pZCB7XHJcbiAgICBpZiAoIXZhbCkgdmFsID0geyB4OiAwLCB5OiAwIH07XHJcbiAgICBsZXQgdmFsdWU6IElQb3NpdGlvbiA9IHZhbDtcclxuICAgIHRoaXMubXlDb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLnVwZGF0ZVJlY3RzKCk7XHJcbiAgICBjb25zdCBzYXR1cmF0aW9uUmVjID0gdGhpcy5zYXR1cmF0aW9uUmVjdCE7XHJcbiAgICBjb25zdCB0aHVtYlJlYyA9IHRoaXMudGh1bWJSZWN0ITtcclxuICAgIHRoaXMueCA9ICgodmFsdWUueCAtIHRoaXMubWluLngpICogKHNhdHVyYXRpb25SZWMud2lkdGggLSB0aHVtYlJlYy53aWR0aCAvIDIpKSAvICh0aGlzLm1heC54IC0gdGhpcy5taW4ueCk7XHJcbiAgICB0aGlzLnkgPSAoKHZhbHVlLnkgLSB0aGlzLm1pbi55KSAqIChzYXR1cmF0aW9uUmVjLmhlaWdodCAtIHRodW1iUmVjLmhlaWdodCAvIDIpKSAvICh0aGlzLm1heC55IC0gdGhpcy5taW4ueSk7XHJcbiAgICBpZiAodmFsICE9PSB2YWx1ZSkge1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlZCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm15Q29udHJvbC5lcnJvcnM7XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2U/KGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcbiAgc2V0RGlzYWJsZWRTdGF0ZT8oZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gICAgaWYgKGRpc2FibGVkKSB0aGlzLm15Q29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICBlbHNlIHRoaXMubXlDb250cm9sLmVuYWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZHJhZ1N0YXJ0KGV2OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkge1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudXBkYXRlUmVjdHMoKTtcclxuICAgIHRoaXMudXBkYXRlUG9zaXRpb24oZXYpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5teUNvbnRyb2wudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaG1vdmUnLCBbJyRldmVudCddKVxyXG4gIG9uRHJhZyhldjogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XHJcbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKGV2KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oZXY6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xyXG4gICAgaWYgKCF0aGlzLnNhdHVyYXRpb25SZWN0IHx8ICF0aGlzLnRodW1iUmVjdCkgdGhpcy51cGRhdGVSZWN0cygpO1xyXG4gICAgbGV0IHBvc2l0aW9uID0gZ2V0T2Zmc2V0UG9zaXRpb24oZXYsIHRoaXMuc2F0dXJhdGlvbi5uYXRpdmVFbGVtZW50KTtcclxuICAgIGxldCB0aHVtYlJlYyA9IHRoaXMudGh1bWJSZWN0ITtcclxuICAgIGxldCBzYXR1cmF0aW9uUmVjID0gdGhpcy5zYXR1cmF0aW9uUmVjdCE7XHJcbiAgICBpZiAocG9zaXRpb24ueCA8IDApIHtcclxuICAgICAgdGhpcy54ID0gMDtcclxuICAgIH0gZWxzZSBpZiAocG9zaXRpb24ueCA+IHNhdHVyYXRpb25SZWMud2lkdGggLSAodGh1bWJSZWMud2lkdGggLyAyIC0gMykpIHtcclxuICAgICAgdGhpcy54ID0gc2F0dXJhdGlvblJlYy53aWR0aCAtICh0aHVtYlJlYy53aWR0aCAvIDIgLSAzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMueCA9IHBvc2l0aW9uLng7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLnggPSB0aGlzLnggLSB0aHVtYlJlYy53aWR0aCAvIDI7XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uLnkgPCAwKSB7XHJcbiAgICAgIHRoaXMueSA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLnkgPiBzYXR1cmF0aW9uUmVjLmhlaWdodCAtICh0aHVtYlJlYy5oZWlnaHQgLyAyIC0gMykpIHtcclxuICAgICAgdGhpcy55ID0gc2F0dXJhdGlvblJlYy5oZWlnaHQgLSAodGh1bWJSZWMuaGVpZ2h0IC8gMiAtIDMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy55ID0gcG9zaXRpb24ueTtcclxuICAgIH1cclxuICAgIC8vICB0aGlzLnkgPSB0aGlzLnkgLSB0aHVtYlJlYy5oZWlnaHQgLyAyO1xyXG4gICAgdGhpcy5zZXRWYWx1ZUJ5UG9zaXRpb24odGh1bWJSZWMsIHNhdHVyYXRpb25SZWMpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hlbmQnLCBbJyRldmVudCddKVxyXG4gIG9uRHJhZ0VuZChldjogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpIHtcclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWVCeVBvc2l0aW9uKHRodW1iUmVjOiBET01SZWN0LCBzYXR1cmF0aW9uUmVjOiBET01SZWN0KSB7XHJcbiAgICBjb25zdCBwZXJjZW50YWdlWCA9IHRoaXMueCAvIChzYXR1cmF0aW9uUmVjLndpZHRoIC0gdGh1bWJSZWMud2lkdGgpO1xyXG4gICAgbGV0IG5ld1ZhbHVlWCA9IHRoaXMubWluLnggKyBwZXJjZW50YWdlWCAqICh0aGlzLm1heC54IC0gdGhpcy5taW4ueCk7XHJcbiAgICBuZXdWYWx1ZVggPSBNYXRoLnJvdW5kKG5ld1ZhbHVlWCAvIHRoaXMuc3RlcCkgKiB0aGlzLnN0ZXA7XHJcbiAgICBsZXQgdmFsdWVYID0gTWF0aC5taW4oTWF0aC5tYXgobmV3VmFsdWVYLCB0aGlzLm1pbi54KSwgdGhpcy5tYXgueCk7XHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBjb25zdCBwZXJjZW50YWdlWSA9IHRoaXMueSAvIChzYXR1cmF0aW9uUmVjLmhlaWdodCAtIHRodW1iUmVjLmhlaWdodCk7XHJcbiAgICBsZXQgbmV3VmFsdWVZID0gdGhpcy5taW4ueSArIHBlcmNlbnRhZ2VZICogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KTtcclxuICAgIG5ld1ZhbHVlWSA9IE1hdGgucm91bmQobmV3VmFsdWVZIC8gdGhpcy5zdGVwKSAqIHRoaXMuc3RlcDtcclxuICAgIGxldCB2YWx1ZVkgPSBNYXRoLm1pbihNYXRoLm1heChuZXdWYWx1ZVksIHRoaXMubWluLnkpLCB0aGlzLm1heC55KTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0geyB4OiB2YWx1ZVgsIHk6IHZhbHVlWSB9O1xyXG4gICAgaWYgKCF0aGlzLm15Q29udHJvbC52YWx1ZSB8fCB0aGlzLm15Q29udHJvbC52YWx1ZS54ICE9PSB2YWx1ZVggfHwgdGhpcy5teUNvbnRyb2wudmFsdWUueSAhPT0gdmFsdWVZKSB7XHJcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbHVlQ2hhbmdlZCh2YWx1ZTogSVBvc2l0aW9uKSB7XHJcbiAgICB0aGlzLm15Q29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xyXG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICBjbGFzcz1cInNhdHVyYXRpb24tY29udGFpbmVyXCJcclxuICBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIlxyXG4gIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0XCJcclxuICAobW91c2Vkb3duKT1cImRyYWdTdGFydCgkZXZlbnQpXCJcclxuICAodG91Y2hzdGFydCk9XCJkcmFnU3RhcnQoJGV2ZW50KVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJzYXR1cmF0aW9uXCIgI3NhdHVyYXRpb24+XHJcbiAgICA8ZGl2IGNsYXNzPVwicy1iZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNvbG9yXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicy13aGl0ZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInMtYmxhY2tcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwidGh1bWJcIiAjdGh1bWIgW3N0eWxlLmxlZnQucHhdPVwieFwiIFtzdHlsZS50b3AucHhdPVwieVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuIl19