@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
209 lines • 19.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, ViewChild, ElementRef, HostListener, Output, EventEmitter, Input } from '@angular/core';
import { hexToRgb, rgbToHex, rgbToHsv } from './color-utils';
export class ColorPalette {
constructor() {
this.baseClass = true;
this.colorChange = new EventEmitter(true);
this.mousedown = false;
}
/**
* @return {?}
*/
draw() {
if (!this.ctx) {
this.ctx = this.canvas.nativeElement.getContext('2d');
}
/** @type {?} */
const width = this.canvas.nativeElement.width;
/** @type {?} */
const height = this.canvas.nativeElement.height;
if (this.hue) {
this.ctx.fillStyle = this.hue;
}
else {
this.ctx.fillStyle = '#ff0000';
}
this.ctx.fillRect(0, 0, width, height);
/** @type {?} */
const whiteGrad = this.ctx.createLinearGradient(0, 0, width, 0);
whiteGrad.addColorStop(0, 'rgba(255,255,255,1)');
whiteGrad.addColorStop(1, 'rgba(255,255,255,0)');
this.ctx.fillStyle = whiteGrad;
this.ctx.fillRect(0, 0, width, height);
/** @type {?} */
const blackGrad = this.ctx.createLinearGradient(0, 0, 0, height);
blackGrad.addColorStop(0, 'rgba(0,0,0,0)');
blackGrad.addColorStop(1, 'rgba(0,0,0,1)');
this.ctx.fillStyle = blackGrad;
this.ctx.fillRect(0, 0, width, height);
if (this.selectedPosition) {
this.ctx.strokeStyle = 'white';
this.ctx.fillStyle = 'white';
this.ctx.beginPath();
this.ctx.arc(this.selectedPosition.x, this.selectedPosition.y, 5, 0, 2 * Math.PI);
this.ctx.lineWidth = 3;
this.ctx.stroke();
this.ctx.closePath();
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.color && !changes.color.isFirstChange()) {
/** @type {?} */
const rgbColor = hexToRgb(this.color);
if (rgbColor) {
/** @type {?} */
const hsv = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b);
this.selectedPosition = {
x: (hsv.s * 250) / 100,
y: 250 - (hsv.v * 250) / 100
};
this.draw();
}
}
else if (changes.hue && !changes.hue.isFirstChange()) {
this.draw();
/** @type {?} */
const pos = this.selectedPosition;
if (pos) {
this.colorChange.emit(this.getColorAtPosition(pos.x, pos.y));
}
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
if (this.color) {
/** @type {?} */
const rgbColor = hexToRgb(this.color);
if (rgbColor) {
/** @type {?} */
const hsv = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b);
this.selectedPosition = {
x: (hsv.s * 250) / 100,
y: 250 - (hsv.v * 250) / 100
};
}
}
this.draw();
}
/**
* @param {?} evt
* @return {?}
*/
onMouseUp(evt) {
this.mousedown = false;
}
/**
* @param {?} evt
* @return {?}
*/
onMouseDown(evt) {
this.mousedown = true;
/** @type {?} */
const xPos = evt.offsetX < 0 ? 0 : evt.offsetX >= 250 ? 249 : evt.offsetX;
/** @type {?} */
const yPos = evt.offsetY < 0 ? 0 : evt.offsetY >= 250 ? 249 : evt.offsetY;
this.selectedPosition = {
x: xPos,
y: yPos,
};
this.draw();
this.emitColor(xPos, yPos);
}
/**
* @param {?} evt
* @return {?}
*/
onMouseMove(evt) {
if (this.mousedown) {
/** @type {?} */
const xPos = evt.offsetX < 0 ? 0 : evt.offsetX >= 250 ? 249 : evt.offsetX;
/** @type {?} */
const yPos = evt.offsetY < 0 ? 0 : evt.offsetY >= 250 ? 249 : evt.offsetY;
this.selectedPosition = {
x: xPos,
y: yPos,
};
this.draw();
this.emitColor(xPos, yPos);
}
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
emitColor(x, y) {
/** @type {?} */
const rgbaColor = this.getColorAtPosition(x, y);
this.colorChange.emit(rgbaColor);
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
getColorAtPosition(x, y) {
/** @type {?} */
const imageData = this.ctx.getImageData(x, y, 1, 1).data;
return rgbToHex(imageData[0], imageData[1], imageData[2]);
}
}
ColorPalette.decorators = [
{ type: Component, args: [{
selector: 'suka-color-palette',
template: `
<canvas
#canvas
class="color-palette"
width="250"
height="250"
(mousedown)="onMouseDown($event)"
(mousemove)="onMouseMove($event)"
>
</canvas>
`
}] }
];
ColorPalette.propDecorators = {
baseClass: [{ type: HostBinding, args: ['class.color-palette-container',] }],
hue: [{ type: Input }],
color: [{ type: Input }],
colorChange: [{ type: Output }],
canvas: [{ type: ViewChild, args: ['canvas', { static: false },] }],
onMouseUp: [{ type: HostListener, args: ['window:mouseup', ['$event'],] }]
};
if (false) {
/** @type {?} */
ColorPalette.prototype.baseClass;
/** @type {?} */
ColorPalette.prototype.hue;
/** @type {?} */
ColorPalette.prototype.color;
/** @type {?} */
ColorPalette.prototype.colorChange;
/** @type {?} */
ColorPalette.prototype.canvas;
/**
* @type {?}
* @private
*/
ColorPalette.prototype.ctx;
/**
* @type {?}
* @private
*/
ColorPalette.prototype.mousedown;
/** @type {?} */
ColorPalette.prototype.selectedPosition;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsZXR0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvY29sb3ItcGlja2VyL2NvbG9yLXBhbGV0dGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUVaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQVksTUFBTSxlQUFlLENBQUM7QUFnQnZFLE1BQU0sT0FBTyxZQUFZO0lBZHpCO1FBZWdELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFLckQsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFNN0QsY0FBUyxHQUFHLEtBQUssQ0FBQztJQWtJNUIsQ0FBQzs7OztJQTlIQyxJQUFJO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2RDs7Y0FFSyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSzs7Y0FDdkMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU07UUFFL0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7O2NBRWpDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMvRCxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDOztjQUVqQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0MsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUN2QixDQUFDLEVBQ0QsQ0FBQyxFQUNELENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUNaLENBQUM7WUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRTs7a0JBQzdDLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUVyQyxJQUFJLFFBQVEsRUFBRTs7c0JBQ04sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHO29CQUN0QixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7b0JBQ3RCLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7aUJBQzdCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2I7U0FDRjthQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOztrQkFFTixHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUVqQyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5RDtTQUNGO0lBQ0gsQ0FBQzs7OztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7O2tCQUNSLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUVyQyxJQUFJLFFBQVEsRUFBRTs7c0JBQ04sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHO29CQUN0QixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7b0JBQ3RCLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7aUJBQzdCLENBQUM7YUFDSDtTQUNGO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7SUFHRCxTQUFTLENBQUMsR0FBZTtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxHQUFlO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOztjQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU87O2NBQ25FLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTztRQUV6RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIsQ0FBQyxFQUFFLElBQUk7WUFDUCxDQUFDLEVBQUUsSUFBSTtTQUNSLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxHQUFlO1FBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTs7a0JBQ1osSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPOztrQkFDbkUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPO1lBRXpFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRztnQkFDdEIsQ0FBQyxFQUFFLElBQUk7Z0JBQ1AsQ0FBQyxFQUFFLElBQUk7YUFDUixDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDOzs7Ozs7SUFFRCxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7O2NBQ3RCLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7Ozs7SUFFRCxrQkFBa0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUzs7Y0FDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDeEQsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDOzs7WUEzSkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7OztHQVVUO2FBQ0Y7Ozt3QkFFRSxXQUFXLFNBQUMsK0JBQStCO2tCQUUzQyxLQUFLO29CQUVMLEtBQUs7MEJBQ0wsTUFBTTtxQkFFTixTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzt3QkE2Rm5DLFlBQVksU0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7OztJQXBHMUMsaUNBQStEOztJQUUvRCwyQkFBcUI7O0lBRXJCLDZCQUF1Qjs7SUFDdkIsbUNBQXFFOztJQUVyRSw4QkFBNEU7Ozs7O0lBRTVFLDJCQUFzQzs7Ozs7SUFFdEMsaUNBQTBCOztJQUUxQix3Q0FBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgSW5wdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBoZXhUb1JnYiwgcmdiVG9IZXgsIHJnYlRvSHN2LCBoc3ZUb0hleCB9IGZyb20gJy4vY29sb3ItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWNvbG9yLXBhbGV0dGUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxjYW52YXNcbiAgICAgICNjYW52YXNcbiAgICAgIGNsYXNzPVwiY29sb3ItcGFsZXR0ZVwiXG4gICAgICB3aWR0aD1cIjI1MFwiXG4gICAgICBoZWlnaHQ9XCIyNTBcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvY2FudmFzPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIENvbG9yUGFsZXR0ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuY29sb3ItcGFsZXR0ZS1jb250YWluZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGh1ZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBjb2xvckNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHtzdGF0aWM6IGZhbHNlfSkgY2FudmFzOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICBwcml2YXRlIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgbW91c2Vkb3duID0gZmFsc2U7XG5cbiAgcHVibGljIHNlbGVjdGVkUG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcblxuICBkcmF3KCkge1xuICAgIGlmICghdGhpcy5jdHgpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmhlaWdodDtcblxuICAgIGlmICh0aGlzLmh1ZSkge1xuICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gdGhpcy5odWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9ICcjZmYwMDAwJztcbiAgICB9XG5cbiAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIGNvbnN0IHdoaXRlR3JhZCA9IHRoaXMuY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIHdpZHRoLCAwKTtcbiAgICB3aGl0ZUdyYWQuYWRkQ29sb3JTdG9wKDAsICdyZ2JhKDI1NSwyNTUsMjU1LDEpJyk7XG4gICAgd2hpdGVHcmFkLmFkZENvbG9yU3RvcCgxLCAncmdiYSgyNTUsMjU1LDI1NSwwKScpO1xuXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gd2hpdGVHcmFkO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY29uc3QgYmxhY2tHcmFkID0gdGhpcy5jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgaGVpZ2h0KTtcbiAgICBibGFja0dyYWQuYWRkQ29sb3JTdG9wKDAsICdyZ2JhKDAsMCwwLDApJyk7XG4gICAgYmxhY2tHcmFkLmFkZENvbG9yU3RvcCgxLCAncmdiYSgwLDAsMCwxKScpO1xuXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gYmxhY2tHcmFkO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQb3NpdGlvbikge1xuICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xuICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ3doaXRlJztcbiAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgdGhpcy5jdHguYXJjKFxuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24ueCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvc2l0aW9uLnksXG4gICAgICAgIDUsXG4gICAgICAgIDAsXG4gICAgICAgIDIgKiBNYXRoLlBJXG4gICAgICApO1xuICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gMztcbiAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNvbG9yICYmICFjaGFuZ2VzLmNvbG9yLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgY29uc3QgcmdiQ29sb3IgPSBoZXhUb1JnYih0aGlzLmNvbG9yKTtcblxuICAgICAgaWYgKHJnYkNvbG9yKSB7XG4gICAgICAgIGNvbnN0IGhzdiA9IHJnYlRvSHN2KHJnYkNvbG9yLnIsIHJnYkNvbG9yLmcsIHJnYkNvbG9yLmIpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogKGhzdi5zICogMjUwKSAvIDEwMCxcbiAgICAgICAgICB5OiAyNTAgLSAoaHN2LnYgKiAyNTApIC8gMTAwXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5odWUgJiYgIWNoYW5nZXMuaHVlLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgdGhpcy5kcmF3KCk7XG5cbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuc2VsZWN0ZWRQb3NpdGlvbjtcblxuICAgICAgaWYgKHBvcykge1xuICAgICAgICB0aGlzLmNvbG9yQ2hhbmdlLmVtaXQodGhpcy5nZXRDb2xvckF0UG9zaXRpb24ocG9zLngsIHBvcy55KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICBjb25zdCByZ2JDb2xvciA9IGhleFRvUmdiKHRoaXMuY29sb3IpO1xuXG4gICAgICBpZiAocmdiQ29sb3IpIHtcbiAgICAgICAgY29uc3QgaHN2ID0gcmdiVG9Ic3YocmdiQ29sb3IuciwgcmdiQ29sb3IuZywgcmdiQ29sb3IuYik7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgICB4OiAoaHN2LnMgKiAyNTApIC8gMTAwLFxuICAgICAgICAgIHk6IDI1MCAtIChoc3YudiAqIDI1MCkgLyAxMDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VVcChldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLm1vdXNlZG93biA9IGZhbHNlO1xuICB9XG5cbiAgb25Nb3VzZURvd24oZXZ0OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5tb3VzZWRvd24gPSB0cnVlO1xuICAgIGNvbnN0IHhQb3MgPSBldnQub2Zmc2V0WCA8IDAgPyAwIDogZXZ0Lm9mZnNldFggPj0gMjUwID8gMjQ5IDogZXZ0Lm9mZnNldFg7XG4gICAgY29uc3QgeVBvcyA9IGV2dC5vZmZzZXRZIDwgMCA/IDAgOiBldnQub2Zmc2V0WSA+PSAyNTAgPyAyNDkgOiBldnQub2Zmc2V0WTtcblxuICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgIHg6IHhQb3MsXG4gICAgICB5OiB5UG9zLFxuICAgIH07XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdGhpcy5lbWl0Q29sb3IoeFBvcywgeVBvcyk7XG4gIH1cblxuICBvbk1vdXNlTW92ZShldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5tb3VzZWRvd24pIHtcbiAgICAgIGNvbnN0IHhQb3MgPSBldnQub2Zmc2V0WCA8IDAgPyAwIDogZXZ0Lm9mZnNldFggPj0gMjUwID8gMjQ5IDogZXZ0Lm9mZnNldFg7XG4gICAgICBjb25zdCB5UG9zID0gZXZ0Lm9mZnNldFkgPCAwID8gMCA6IGV2dC5vZmZzZXRZID49IDI1MCA/IDI0OSA6IGV2dC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHhQb3MsXG4gICAgICAgIHk6IHlQb3MsXG4gICAgICB9O1xuICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB0aGlzLmVtaXRDb2xvcih4UG9zLCB5UG9zKTtcbiAgICB9XG4gIH1cblxuICBlbWl0Q29sb3IoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSB0aGlzLmdldENvbG9yQXRQb3NpdGlvbih4LCB5KTtcbiAgICB0aGlzLmNvbG9yQ2hhbmdlLmVtaXQocmdiYUNvbG9yKTtcbiAgfVxuXG4gIGdldENvbG9yQXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSh4LCB5LCAxLCAxKS5kYXRhO1xuICAgIHJldHVybiByZ2JUb0hleChpbWFnZURhdGFbMF0sIGltYWdlRGF0YVsxXSwgaW1hZ2VEYXRhWzJdKTtcbiAgfVxufVxuIl19