UNPKG

angular-color-picker-fixed

Version:
155 lines 20.5 kB
import { __decorate } from "tslib"; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { Platform } from '@angular/cdk/platform'; import { AfterViewInit, Directive, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core'; import { fromEvent, merge } from 'rxjs'; import { filter, takeUntil, tap } from 'rxjs/operators'; import { calculateQuadrant, determineCSSRotationAngle } from '../helpers/helpers'; let RotatableDirective = class RotatableDirective { constructor(el, renderer, platform) { this.el = el; this.renderer = renderer; this.platform = platform; this.dragging = false; this.rotateStart = new EventEmitter(); this.rotating = new EventEmitter(); this.rotateStop = new EventEmitter(); if (this.platform.IOS || this.platform.ANDROID) { this.mouseDownEv = 'touchstart'; this.mouseUpEv = 'touchend'; this.mouseMoveEv = 'touchmove'; this.cancelEv = 'touchcancel'; } else { this.mouseDownEv = 'mousedown'; this.mouseUpEv = 'mouseup'; this.mouseMoveEv = 'mousemove'; this.cancelEv = 'mouseout'; } } get isDisabled() { return this.disable ? coerceBooleanProperty(this.disable) : false; } ngOnInit() { } ngOnChanges(changes) { if (changes.angle && changes.angle.currentValue) { // console.log(changes.angle.currentValue); const angle = changes.angle.currentValue + 90; this.renderer.setStyle(this.el.nativeElement, 'transform', `rotate(${angle}deg)`); } } ngAfterViewInit() { // console.log(this.isDisabled); requestAnimationFrame(this.initialRender.bind(this)); this.rect = this.el.nativeElement.getBoundingClientRect(); this.mouseUp$ = fromEvent(this.el.nativeElement, this.mouseUpEv, { passive: true }); this.mouseOut$ = fromEvent(this.el.nativeElement, this.cancelEv, { passive: true }); this.mouseDownSub = fromEvent(this.el.nativeElement, this.mouseDownEv, { passive: true }) .pipe(filter((val) => { return this.active && !this.isDisabled; })) .subscribe((downEvent) => { this.dragging = true; this.rect = this.el.nativeElement.getBoundingClientRect(); // console.log('mouse down', downEvent, this.rect); this.point = this.createPoint(downEvent); this.rotateStart.emit(this.point); this.applyRotation(); this.mouseMoveSub = fromEvent(this.el.nativeElement, this.mouseMoveEv).pipe(takeUntil(merge(this.mouseOut$, this.mouseUp$).pipe(tap((upEvent) => { this.rect = this.el.nativeElement.getBoundingClientRect(); // console.log('mouse up', upEvent, this.rect); this.dragging = false; this.mouseMoveSub.unsubscribe(); this.rotateStop.emit(this.point); })))).subscribe((moveEvent) => { this.rect = this.el.nativeElement.getBoundingClientRect(); // console.log('mouse move', moveEvent, this.rect); this.point = this.createPoint(moveEvent); // console.log(this.point); this.applyRotation(); }); }); } initialRender() { const angle = this.angle + 90; this.renderer.setStyle(this.el.nativeElement, 'transform', `rotate(${angle}deg)`); } rotationRender() { // console.log(this.rotation); this.renderer.setStyle(this.el.nativeElement, 'transform', `rotate(${this.rotation}deg)`); } ngOnDestroy() { if (this.mouseDownSub) { this.mouseDownSub.unsubscribe(); } if (this.mouseMoveSub) { this.mouseMoveSub.unsubscribe(); } if (this.mouseUpSub) { this.mouseUpSub.unsubscribe(); } // console.log('directive destroy'); } applyRotation() { const quadrant = calculateQuadrant(this.point); const rotation = determineCSSRotationAngle(this.point, quadrant); // console.log(rotation); this.rotating.emit(rotation); this.rotation = rotation; requestAnimationFrame(this.rotationRender.bind(this)); } createPoint(mouseEvent) { let point; if (mouseEvent.targetTouches) { point = { x: this._normalizeX(mouseEvent.targetTouches[0].clientX), y: this._normalizeY(mouseEvent.targetTouches[0].clientY) }; } else { point = { x: this._normalizeX(mouseEvent.clientX), y: this._normalizeY(mouseEvent.clientY) }; } // console.log('point', point); return point; } _normalizeX(coordX) { return coordX - this.rect.left - this.rect.width / 2; } _normalizeY(coordY) { return ((coordY - this.rect.top) * -1) + this.rect.height / 2; } }; RotatableDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: Platform } ]; __decorate([ Input() ], RotatableDirective.prototype, "angle", void 0); __decorate([ Input() ], RotatableDirective.prototype, "disable", void 0); __decorate([ Input() ], RotatableDirective.prototype, "active", void 0); __decorate([ Output() ], RotatableDirective.prototype, "rotateStart", void 0); __decorate([ Output() ], RotatableDirective.prototype, "rotating", void 0); __decorate([ Output() ], RotatableDirective.prototype, "rotateStop", void 0); RotatableDirective = __decorate([ Directive({ selector: '[rcpRotatable]' }) ], RotatableDirective); export { RotatableDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0ByYWRpYWwtY29sb3ItcGlja2VyL2FuZ3VsYXItY29sb3ItcGlja2VyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvcm90YXRhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFDTCxhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsYUFBYSxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQTRCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtsRixJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtJQTZCN0IsWUFDVSxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsUUFBa0I7UUFGbEIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQTlCckIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQW1CUCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFXcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxD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LENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUN6RCxDQUFDO1NBQ0g7YUFBTTtZQUNMLEtBQUssR0FBRztnQkFDTixDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUN2QyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2FBQ3hDLENBQUM7U0FDSDtRQUNELCtCQUErQjtRQUMvQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxXQUFXLENBQUMsTUFBTTtRQUN4QixPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFNO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FFRixDQUFBOztZQXJJZSxVQUFVO1lBQ0osU0FBUztZQUNULFFBQVE7O0FBbkJuQjtJQUFSLEtBQUssRUFBRTtpREFBZTtBQUNkO0lBQVIsS0FBSyxFQUFFO21EQUFrQjtBQUNqQjtJQUFSLEtBQUssRUFBRTtrREFBaUI7QUFNZjtJQUFULE1BQU0sRUFBRTt1REFBOEM7QUFDN0M7SUFBVCxNQUFNLEVBQUU7b0RBQTJDO0FBQzFDO0lBQVQsTUFBTSxFQUFFO3NEQUE2QztBQXZCM0Msa0JBQWtCO0lBSDlCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxnQkFBZ0I7S0FDM0IsQ0FBQztHQUNXLGtCQUFrQixDQW1LOUI7U0FuS1ksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVRdWFkcmFudCwgZGV0ZXJtaW5lQ1NTUm90YXRpb25BbmdsZSB9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tyY3BSb3RhdGFibGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBSb3RhdGFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgcHVibGljIHJvdGF0aW9uOiBhbnk7XG4gIHB1YmxpYyBkcmFnZ2luZyA9IGZhbHNlO1xuICBwdWJsaWMgbW91c2VEb3duU3ViOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBtb3VzZU1vdmVTdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIG1vdXNlVXBTdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIHJlY3Q6IGFueTtcblxuICBwdWJsaWMgY2FuY2VsRXY6IHN0cmluZztcbiAgcHVibGljIG1vdXNlRG93bkV2OiBzdHJpbmc7XG4gIHB1YmxpYyBtb3VzZU1vdmVFdjogc3RyaW5nO1xuICBwdWJsaWMgbW91c2VVcEV2OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgYW5nbGU6IG51bWJlcjtcbiAgQElucHV0KCkgZGlzYWJsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgYWN0aXZlOiBib29sZWFuO1xuXG4gIGdldCBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGUgPyBjb2VyY2VCb29sZWFuUHJvcGVydHkodGhpcy5kaXNhYmxlKSA6IGZhbHNlO1xuICB9XG5cbiAgQE91dHB1dCgpIHB1YmxpYyByb3RhdGVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcHVibGljIHJvdGF0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcm90YXRlU3RvcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHByaXZhdGUgcG9pbnQ6IGFueTtcbiAgcHJpdmF0ZSBtb3VzZVVwJDogT2JzZXJ2YWJsZTxhbnk+O1xuICBwcml2YXRlIG1vdXNlT3V0JDogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXG4gICkge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtLklPUyB8fCB0aGlzLnBsYXRmb3JtLkFORFJPSUQpIHtcbiAgICAgIHRoaXMubW91c2VEb3duRXYgPSAndG91Y2hzdGFydCc7XG4gICAgICB0aGlzLm1vdXNlVXBFdiA9ICd0b3VjaGVuZCc7XG4gICAgICB0aGlzLm1vdXNlTW92ZUV2ID0gJ3RvdWNobW92ZSc7XG4gICAgICB0aGlzLmNhbmNlbEV2ID0gJ3RvdWNoY2FuY2VsJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb3VzZURvd25FdiA9ICdtb3VzZWRvd24nO1xuICAgICAgdGhpcy5tb3VzZVVwRXYgPSAnbW91c2V1cCc7XG4gICAgICB0aGlzLm1vdXNlTW92ZUV2ID0gJ21vdXNlbW92ZSc7XG4gICAgICB0aGlzLmNhbmNlbEV2ID0gJ21vdXNlb3V0JztcbiAgICB9XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuYW5nbGUgJiYgY2hhbmdlcy5hbmdsZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGNoYW5nZXMuYW5nbGUuY3VycmVudFZhbHVlKTtcbiAgICAgIGNvbnN0IGFuZ2xlID0gY2hhbmdlcy5hbmdsZS5jdXJyZW50VmFsdWUgKyA5MDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlfWRlZylgKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5pc0Rpc2FibGVkKTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5pbml0aWFsUmVuZGVyLmJpbmQodGhpcykpO1xuICAgIHRoaXMucmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLm1vdXNlVXAkID0gZnJvbUV2ZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5tb3VzZVVwRXYsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB0aGlzLm1vdXNlT3V0JCA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY2FuY2VsRXYsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMubW91c2VEb3duU3ViID0gZnJvbUV2ZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5tb3VzZURvd25FdiwgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCh2YWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmUgJiYgIXRoaXMuaXNEaXNhYmxlZDtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRvd25FdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnbW91c2UgZG93bicsIGRvd25FdmVudCwgdGhpcy5yZWN0KTtcbiAgICAgICAgdGhpcy5wb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoZG93bkV2ZW50KTtcbiAgICAgICAgdGhpcy5yb3RhdGVTdGFydC5lbWl0KHRoaXMucG9pbnQpO1xuICAgICAgICB0aGlzLmFwcGx5Um90YXRpb24oKTtcblxuXG4gICAgICAgIHRoaXMubW91c2VNb3ZlU3ViID0gZnJvbUV2ZW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5tb3VzZU1vdmVFdikucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwobWVyZ2UodGhpcy5tb3VzZU91dCQsIHRoaXMubW91c2VVcCQpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHVwRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW91c2UgdXAnLCB1cEV2ZW50LCB0aGlzLnJlY3QpO1xuICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMubW91c2VNb3ZlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgIHRoaXMucm90YXRlU3RvcC5lbWl0KHRoaXMucG9pbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApKVxuICAgICAgICApLnN1YnNjcmliZSgobW92ZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb3VzZSBtb3ZlJywgbW92ZUV2ZW50LCB0aGlzLnJlY3QpO1xuXG4gICAgICAgICAgdGhpcy5wb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQobW92ZUV2ZW50KTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnBvaW50KTtcbiAgICAgICAgICB0aGlzLmFwcGx5Um90YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsUmVuZGVyKCkge1xuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5hbmdsZSArIDkwO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlfWRlZylgKTtcbiAgfVxuXG4gIHB1YmxpYyByb3RhdGlvblJlbmRlcigpIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnJvdGF0aW9uKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGByb3RhdGUoJHt0aGlzLnJvdGF0aW9ufWRlZylgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm1vdXNlRG93blN1Yikge1xuICAgICAgdGhpcy5tb3VzZURvd25TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW91c2VNb3ZlU3ViKSB7XG4gICAgICB0aGlzLm1vdXNlTW92ZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb3VzZVVwU3ViKSB7XG4gICAgICB0aGlzLm1vdXNlVXBTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ2RpcmVjdGl2ZSBkZXN0cm95Jyk7XG4gIH1cblxuXG5cbiAgcHJpdmF0ZSBhcHBseVJvdGF0aW9uKCkge1xuICAgIGNvbnN0IHF1YWRyYW50ID0gY2FsY3VsYXRlUXVhZHJhbnQodGhpcy5wb2ludCk7XG4gICAgY29uc3Qgcm90YXRpb24gPSBkZXRlcm1pbmVDU1NSb3RhdGlvbkFuZ2xlKHRoaXMucG9pbnQsIHF1YWRyYW50KTtcbiAgICAvLyBjb25zb2xlLmxvZyhyb3RhdGlvbik7XG4gICAgdGhpcy5yb3RhdGluZy5lbWl0KHJvdGF0aW9uKTtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucm90YXRpb25SZW5kZXIuYmluZCh0aGlzKSk7XG5cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUG9pbnQobW91c2VFdmVudCkge1xuICAgIGxldCBwb2ludDtcbiAgICBpZiAobW91c2VFdmVudC50YXJnZXRUb3VjaGVzKSB7XG4gICAgICBwb2ludCA9IHtcbiAgICAgICAgeDogdGhpcy5fbm9ybWFsaXplWChtb3VzZUV2ZW50LnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WCksXG4gICAgICAgIHk6IHRoaXMuX25vcm1hbGl6ZVkobW91c2VFdmVudC50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFkpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludCA9IHtcbiAgICAgICAgeDogdGhpcy5fbm9ybWFsaXplWChtb3VzZUV2ZW50LmNsaWVudFgpLFxuICAgICAgICB5OiB0aGlzLl9ub3JtYWxpemVZKG1vdXNlRXZlbnQuY2xpZW50WSlcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdwb2ludCcsIHBvaW50KTtcbiAgICByZXR1cm4gcG9pbnQ7XG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVYKGNvb3JkWCkge1xuICAgIHJldHVybiBjb29yZFggLSB0aGlzLnJlY3QubGVmdCAtIHRoaXMucmVjdC53aWR0aCAvIDI7XG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVZKGNvb3JkWSkge1xuICAgIHJldHVybiAoKGNvb3JkWSAtIHRoaXMucmVjdC50b3ApICogLTEpICsgdGhpcy5yZWN0LmhlaWdodCAvIDI7XG4gIH1cblxufVxuIl19