angular-color-picker-fixed
Version:
Radial Color Picker - Angular
155 lines • 20.5 kB
JavaScript
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