ngx-input-color
Version:
Angular color input component and color picker (with HSL, HSV, RGB, CMYK, HEX, alpha, eye-dropper, etc)
157 lines • 22.3 kB
JavaScript
import { cmykToRgb, hexToRgb, hslToRgba, hsvToRgb, parseCmykString, parseHslString, parseHsvString, parseRgbString, rgbaToHex, rgbToCmyk, rgbToCmykString, rgbToHsl, rgbToHslaString, rgbToHsv, rgbToHsvString, } from './conversion';
import { colorNames } from './css-color-names';
export class NgxColor {
constructor(input) {
this._rgb = { r: 0, g: 0, b: 0, a: 1 };
this._name = '';
if (!input)
return;
if (input instanceof NgxColor) {
this._rgb = { ...input._rgb };
this._name = input._name;
return;
}
if (typeof input === 'object') {
if ('r' in input && 'g' in input && 'b' in input) {
this._rgb = { r: +input.r, g: +input.g, b: +input.b, a: input.a !== undefined ? +input.a : 1 };
return;
}
if ('h' in input && 's' in input && 'l' in input) {
this._rgb = NgxColor.hslaToRgba(input);
return;
}
if ('h' in input && 's' in input && 'v' in input) {
this._rgb = NgxColor.hsvaToRgba(input);
return;
}
if ('c' in input && 'm' in input && 'y' in input && 'k' in input) {
this._rgb = NgxColor.cmykToRgba(input);
return;
}
}
if (typeof input === 'string') {
const name = input.trim().toLowerCase();
if (colorNames[name]) {
this._rgb = hexToRgb(colorNames[name]);
this._name = name;
return;
}
else if (/^#?[0-9a-f]{3,8}$/i.test(name)) {
this._rgb = hexToRgb(name);
return;
}
if (name.includes('rgb')) {
this._rgb = parseRgbString(name);
return;
}
if (name.includes('hsl')) {
this._rgb = NgxColor.hslaToRgba(parseHslString(name));
return;
}
if (name.includes('hsv')) {
this._rgb = NgxColor.hsvaToRgba(parseHsvString(name));
return;
}
if (name.includes('cmyk')) {
this._rgb = NgxColor.cmykToRgba(parseCmykString(name));
return;
}
throw new Error('Unknown color string: ' + input);
}
}
get isValid() {
return (typeof this._rgb.r === 'number' &&
typeof this._rgb.g === 'number' &&
typeof this._rgb.b === 'number' &&
!isNaN(this._rgb.r) &&
!isNaN(this._rgb.g) &&
!isNaN(this._rgb.b));
}
async name() {
if (this._name)
return this._name;
const hex = this.toHexString();
for (const [n, h] of Object.entries(colorNames)) {
if (h.toLowerCase() === hex.toLowerCase())
return n;
}
return '';
}
toRgb() {
return this._rgb;
}
toRgbString() {
const { r, g, b, a } = this.toRgb();
return a === 1
? `rgb(${Math.round(r)},${Math.round(g)},${Math.round(b)})`
: `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${+a.toFixed(3)})`;
}
toHexString(allowAlpha = true) {
const { r, g, b, a } = this.toRgb();
return rgbaToHex(r, g, b, a, allowAlpha && a < 1);
}
toHsl() {
return NgxColor.rgbToHsla(this.toRgb());
}
toHsv() {
return NgxColor.rgbToHsva(this.toRgb());
}
toCmyk() {
return NgxColor.rgbToCmyk(this.toRgb());
}
static cmykToRgba(cmyk) {
const { c, m, y, k } = cmyk;
return { ...cmykToRgb(c, m, y, k), a: cmyk.a !== undefined ? +cmyk.a : 1 };
}
static rgbToCmyk(rgba) {
const { r, g, b } = rgba;
return rgbToCmyk(r, g, b);
}
static rgbToHsla(rgba) {
const { r, g, b, a } = rgba;
return { ...rgbToHsl(r, g, b), a };
}
static rgbToHsva(rgba) {
const { r, g, b, a } = rgba;
return { ...rgbToHsv(r, g, b), a };
}
static hsvaToRgba(hsva) {
const { h, s, v, a } = hsva;
return { ...hsvToRgb(h, s, v), a: a !== undefined ? a : 1 };
}
static hslaToRgba(hsla) {
const { h, s, l, a } = hsla;
return { ...hslToRgba(h, s, l), a: a !== undefined ? a : 1 };
}
equals(other) {
if (!other)
return false;
return this.toHexString().toLowerCase() === other.toHexString().toLowerCase();
}
isDark() {
const { r, g, b, a } = this.toRgb();
return a < 0.5 ? false : 0.299 * r + 0.587 * g + 0.114 * b < 128;
}
isLight() {
return !this.isDark();
}
async getOutputResult(outputType) {
const { r, g, b, a } = this._rgb;
switch (outputType) {
case 'CMYK':
return rgbToCmykString(r, g, b);
case 'HSL':
return rgbToHslaString(r, g, b, a);
case 'HSV':
return rgbToHsvString(r, g, b, a);
case 'RGB':
return a < 1 ? `rgba(${r}, ${g}, ${b}, ${+a.toFixed(2)})` : `rgb(${r}, ${g}, ${b})`;
case 'HEX':
return this.toHexString(true);
default:
let name = await this.name();
return name ?? this.toHexString(true);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWlucHV0LWNvbG9yL3NyYy91dGlscy9jb2xvci1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsY0FBYyxFQUNkLGNBQWMsRUFDZCxjQUFjLEVBQ2QsU0FBUyxFQUNULFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGVBQWUsRUFDZixRQUFRLEVBQ1IsY0FBYyxHQUNmLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUsvQyxNQUFNLE9BQU8sUUFBUTtJQUluQixZQUFZLEtBQWtCO1FBSHRCLFNBQUksR0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR3pCLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixJQUFJLEtBQUssWUFBWSxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUcsS0FBYSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hHLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBYSxDQUFDLENBQUM7Z0JBQy9DLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBYSxDQUFDLENBQUM7Z0JBQy9DLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFhLENBQUMsQ0FBQztnQkFDL0MsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixPQUFPO1lBQ1QsQ0FBQztpQkFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sQ0FDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxRQUFRO1lBQy9CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssUUFBUTtZQUMvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ1osQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUc7WUFDM0QsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEYsQ0FBQztJQUVELFdBQVcsQ0FBQyxVQUFVLEdBQUcsSUFBSTtRQUMzQixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVU7UUFDMUIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM1QixPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFHLElBQVksQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQy9GLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVU7UUFDekIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBVTtRQUN6QixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVU7UUFDekIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM1QixPQUFPLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDNUIsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBVTtRQUMxQixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkUsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQXNCO1FBQzFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWpDLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDbkIsS0FBSyxNQUFNO2dCQUNULE9BQU8sZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbEMsS0FBSyxLQUFLO2dCQUNSLE9BQU8sZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXJDLEtBQUssS0FBSztnQkFDUixPQUFPLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVwQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFFdEYsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoQztnQkFDRSxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBjbXlrVG9SZ2IsXHJcbiAgaGV4VG9SZ2IsXHJcbiAgaHNsVG9SZ2JhLFxyXG4gIGhzdlRvUmdiLFxyXG4gIHBhcnNlQ215a1N0cmluZyxcclxuICBwYXJzZUhzbFN0cmluZyxcclxuICBwYXJzZUhzdlN0cmluZyxcclxuICBwYXJzZVJnYlN0cmluZyxcclxuICByZ2JhVG9IZXgsXHJcbiAgcmdiVG9DbXlrLFxyXG4gIHJnYlRvQ215a1N0cmluZyxcclxuICByZ2JUb0hzbCxcclxuICByZ2JUb0hzbGFTdHJpbmcsXHJcbiAgcmdiVG9Ic3YsXHJcbiAgcmdiVG9Ic3ZTdHJpbmcsXHJcbn0gZnJvbSAnLi9jb252ZXJzaW9uJztcclxuaW1wb3J0IHsgY29sb3JOYW1lcyB9IGZyb20gJy4vY3NzLWNvbG9yLW5hbWVzJztcclxuaW1wb3J0IHsgQ01ZSywgSFNMLCBIU0xBLCBIU1YsIEhTVkEsIFJHQiwgUkdCQSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcbmV4cG9ydCB0eXBlIENvbG9ySW5wdXQgPSBzdHJpbmcgfCBDTVlLIHwgSFNMQSB8IEhTVkEgfCBSR0JBIHwgTmd4Q29sb3I7XHJcbmV4cG9ydCB0eXBlIE91dHB1dFR5cGUgPSAnQ01ZSycgfCAnSFNMJyB8ICdIU1YnIHwgJ1JHQicgfCAnSEVYJztcclxuXHJcbmV4cG9ydCBjbGFzcyBOZ3hDb2xvciB7XHJcbiAgcHJpdmF0ZSBfcmdiOiBSR0JBID0geyByOiAwLCBnOiAwLCBiOiAwLCBhOiAxIH07XHJcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGlucHV0PzogQ29sb3JJbnB1dCkge1xyXG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuO1xyXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTmd4Q29sb3IpIHtcclxuICAgICAgdGhpcy5fcmdiID0geyAuLi5pbnB1dC5fcmdiIH07XHJcbiAgICAgIHRoaXMuX25hbWUgPSBpbnB1dC5fbmFtZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKCdyJyBpbiBpbnB1dCAmJiAnZycgaW4gaW5wdXQgJiYgJ2InIGluIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0geyByOiAraW5wdXQuciwgZzogK2lucHV0LmcsIGI6ICtpbnB1dC5iLCBhOiAoaW5wdXQgYXMgYW55KS5hICE9PSB1bmRlZmluZWQgPyAraW5wdXQuYSA6IDEgfTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdoJyBpbiBpbnB1dCAmJiAncycgaW4gaW5wdXQgJiYgJ2wnIGluIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gTmd4Q29sb3IuaHNsYVRvUmdiYShpbnB1dCBhcyBIU0xBKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdoJyBpbiBpbnB1dCAmJiAncycgaW4gaW5wdXQgJiYgJ3YnIGluIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gTmd4Q29sb3IuaHN2YVRvUmdiYShpbnB1dCBhcyBIU1ZBKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdjJyBpbiBpbnB1dCAmJiAnbScgaW4gaW5wdXQgJiYgJ3knIGluIGlucHV0ICYmICdrJyBpbiBpbnB1dCkge1xyXG4gICAgICAgIHRoaXMuX3JnYiA9IE5neENvbG9yLmNteWtUb1JnYmEoaW5wdXQgYXMgQ01ZSyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCBuYW1lID0gaW5wdXQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmIChjb2xvck5hbWVzW25hbWVdKSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gaGV4VG9SZ2IoY29sb3JOYW1lc1tuYW1lXSk7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eIz9bMC05YS1mXXszLDh9JC9pLnRlc3QobmFtZSkpIHtcclxuICAgICAgICB0aGlzLl9yZ2IgPSBoZXhUb1JnYihuYW1lKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJ3JnYicpKSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gcGFyc2VSZ2JTdHJpbmcobmFtZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCdoc2wnKSkge1xyXG4gICAgICAgIHRoaXMuX3JnYiA9IE5neENvbG9yLmhzbGFUb1JnYmEocGFyc2VIc2xTdHJpbmcobmFtZSkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobmFtZS5pbmNsdWRlcygnaHN2JykpIHtcclxuICAgICAgICB0aGlzLl9yZ2IgPSBOZ3hDb2xvci5oc3ZhVG9SZ2JhKHBhcnNlSHN2U3RyaW5nKG5hbWUpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJ2NteWsnKSkge1xyXG4gICAgICAgIHRoaXMuX3JnYiA9IE5neENvbG9yLmNteWtUb1JnYmEocGFyc2VDbXlrU3RyaW5nKG5hbWUpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNvbG9yIHN0cmluZzogJyArIGlucHV0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdHlwZW9mIHRoaXMuX3JnYi5yID09PSAnbnVtYmVyJyAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5fcmdiLmcgPT09ICdudW1iZXInICYmXHJcbiAgICAgIHR5cGVvZiB0aGlzLl9yZ2IuYiA9PT0gJ251bWJlcicgJiZcclxuICAgICAgIWlzTmFOKHRoaXMuX3JnYi5yKSAmJlxyXG4gICAgICAhaXNOYU4odGhpcy5fcmdiLmcpICYmXHJcbiAgICAgICFpc05hTih0aGlzLl9yZ2IuYilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuYW1lKCkge1xyXG4gICAgaWYgKHRoaXMuX25hbWUpIHJldHVybiB0aGlzLl9uYW1lO1xyXG4gICAgY29uc3QgaGV4ID0gdGhpcy50b0hleFN0cmluZygpO1xyXG4gICAgZm9yIChjb25zdCBbbiwgaF0gb2YgT2JqZWN0LmVudHJpZXMoY29sb3JOYW1lcykpIHtcclxuICAgICAgaWYgKGgudG9Mb3dlckNhc2UoKSA9PT0gaGV4LnRvTG93ZXJDYXNlKCkpIHJldHVybiBuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgdG9SZ2IoKTogUkdCQSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmdiO1xyXG4gIH1cclxuXHJcbiAgdG9SZ2JTdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gdGhpcy50b1JnYigpO1xyXG4gICAgcmV0dXJuIGEgPT09IDFcclxuICAgICAgPyBgcmdiKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9KWBcclxuICAgICAgOiBgcmdiYSgke01hdGgucm91bmQocil9LCR7TWF0aC5yb3VuZChnKX0sJHtNYXRoLnJvdW5kKGIpfSwkeythLnRvRml4ZWQoMyl9KWA7XHJcbiAgfVxyXG5cclxuICB0b0hleFN0cmluZyhhbGxvd0FscGhhID0gdHJ1ZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB7IHIsIGcsIGIsIGEgfSA9IHRoaXMudG9SZ2IoKTtcclxuICAgIHJldHVybiByZ2JhVG9IZXgociwgZywgYiwgYSwgYWxsb3dBbHBoYSAmJiBhIDwgMSk7XHJcbiAgfVxyXG5cclxuICB0b0hzbCgpOiBIU0xBIHtcclxuICAgIHJldHVybiBOZ3hDb2xvci5yZ2JUb0hzbGEodGhpcy50b1JnYigpKTtcclxuICB9XHJcblxyXG4gIHRvSHN2KCk6IEhTVkEge1xyXG4gICAgcmV0dXJuIE5neENvbG9yLnJnYlRvSHN2YSh0aGlzLnRvUmdiKCkpO1xyXG4gIH1cclxuXHJcbiAgdG9DbXlrKCk6IENNWUsge1xyXG4gICAgcmV0dXJuIE5neENvbG9yLnJnYlRvQ215ayh0aGlzLnRvUmdiKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNteWtUb1JnYmEoY215azogQ01ZSyk6IFJHQkEge1xyXG4gICAgY29uc3QgeyBjLCBtLCB5LCBrIH0gPSBjbXlrO1xyXG4gICAgcmV0dXJuIHsgLi4uY215a1RvUmdiKGMsIG0sIHksIGspLCBhOiAoY215ayBhcyBhbnkpLmEgIT09IHVuZGVmaW5lZCA/ICsoY215ayBhcyBhbnkpLmEgOiAxIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmdiVG9DbXlrKHJnYmE6IFJHQkEpOiBDTVlLIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiB9ID0gcmdiYTtcclxuICAgIHJldHVybiByZ2JUb0NteWsociwgZywgYik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmdiVG9Ic2xhKHJnYmE6IFJHQkEpOiBIU0xBIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gcmdiYTtcclxuICAgIHJldHVybiB7IC4uLnJnYlRvSHNsKHIsIGcsIGIpLCBhIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmdiVG9Ic3ZhKHJnYmE6IFJHQkEpOiBIU1ZBIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gcmdiYTtcclxuICAgIHJldHVybiB7IC4uLnJnYlRvSHN2KHIsIGcsIGIpLCBhIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaHN2YVRvUmdiYShoc3ZhOiBIU1ZBKTogUkdCQSB7XHJcbiAgICBjb25zdCB7IGgsIHMsIHYsIGEgfSA9IGhzdmE7XHJcbiAgICByZXR1cm4geyAuLi5oc3ZUb1JnYihoLCBzLCB2KSwgYTogYSAhPT0gdW5kZWZpbmVkID8gYSA6IDEgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoc2xhVG9SZ2JhKGhzbGE6IEhTTEEpOiBSR0JBIHtcclxuICAgIGNvbnN0IHsgaCwgcywgbCwgYSB9ID0gaHNsYTtcclxuICAgIHJldHVybiB7IC4uLmhzbFRvUmdiYShoLCBzLCBsKSwgYTogYSAhPT0gdW5kZWZpbmVkID8gYSA6IDEgfTtcclxuICB9XHJcblxyXG4gIGVxdWFscyhvdGhlcj86IE5neENvbG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIW90aGVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy50b0hleFN0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IG90aGVyLnRvSGV4U3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGlzRGFyaygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gdGhpcy50b1JnYigpO1xyXG4gICAgcmV0dXJuIGEgPCAwLjUgPyBmYWxzZSA6IDAuMjk5ICogciArIDAuNTg3ICogZyArIDAuMTE0ICogYiA8IDEyODtcclxuICB9XHJcblxyXG4gIGlzTGlnaHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNEYXJrKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRPdXRwdXRSZXN1bHQob3V0cHV0VHlwZTogT3V0cHV0VHlwZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB7IHIsIGcsIGIsIGEgfSA9IHRoaXMuX3JnYjtcclxuXHJcbiAgICBzd2l0Y2ggKG91dHB1dFR5cGUpIHtcclxuICAgICAgY2FzZSAnQ01ZSyc6XHJcbiAgICAgICAgcmV0dXJuIHJnYlRvQ215a1N0cmluZyhyLCBnLCBiKTtcclxuXHJcbiAgICAgIGNhc2UgJ0hTTCc6XHJcbiAgICAgICAgcmV0dXJuIHJnYlRvSHNsYVN0cmluZyhyLCBnLCBiLCBhKTtcclxuXHJcbiAgICAgIGNhc2UgJ0hTVic6XHJcbiAgICAgICAgcmV0dXJuIHJnYlRvSHN2U3RyaW5nKHIsIGcsIGIsIGEpO1xyXG5cclxuICAgICAgY2FzZSAnUkdCJzpcclxuICAgICAgICByZXR1cm4gYSA8IDEgPyBgcmdiYSgke3J9LCAke2d9LCAke2J9LCAkeythLnRvRml4ZWQoMil9KWAgOiBgcmdiKCR7cn0sICR7Z30sICR7Yn0pYDtcclxuXHJcbiAgICAgIGNhc2UgJ0hFWCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxldCBuYW1lID0gYXdhaXQgdGhpcy5uYW1lKCk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWUgPz8gdGhpcy50b0hleFN0cmluZyh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19