UNPKG

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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWlucHV0LWNvbG9yL3NyYy91dGlscy9jb2xvci1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsY0FBYyxFQUNkLGNBQWMsRUFDZCxjQUFjLEVBQ2QsU0FBUyxFQUNULFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGVBQWUsRUFDZixRQUFRLEVBQ1IsY0FBYyxHQUNmLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUsvQyxNQUFNLE9BQU8sUUFBUTtJQUluQixZQUFZLEtBQWtCO1FBSHRCLFNBQUksR0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR3pCLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixJQUFJLEtBQUssWUFBWSxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUs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LElBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQy9GLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVU7UUFDekIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBVTtRQUN6QixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVU7UUFDekIsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUM1QixPQUFPLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDNUIsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBVTtRQUMxQixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbkUsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQXNCO1FBQzFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWpDLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDbkIsS0FBSyxNQUFNO2dCQUNULE9BQU8sZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbEMsS0FBSyxLQUFLO2dCQUNSLE9BQU8sZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXJDLEtBQUssS0FBSztnQkFDUixPQUFPLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVwQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFFdEYsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoQztnQkFDRSxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBjbXlrVG9SZ2IsXHJcbiAgaGV4VG9SZ2IsXHJcbiAgaHNsVG9SZ2JhLFxyXG4gIGhzdlRvUmdiLFxyXG4gIHBhcnNlQ215a1N0cmluZyxcclxuICBwYXJzZUhzbFN0cmluZyxcclxuICBwYXJzZUhzdlN0cmluZyxcclxuICBwYXJzZVJnYlN0cmluZyxcclxuICByZ2JhVG9IZXgsXHJcbiAgcmdiVG9DbXlrLFxyXG4gIHJnYlRvQ215a1N0cmluZyxcclxuICByZ2JUb0hzbCxcclxuICByZ2JUb0hzbGFTdHJpbmcsXHJcbiAgcmdiVG9Ic3YsXHJcbiAgcmdiVG9Ic3ZTdHJpbmcsXHJcbn0gZnJvbSAnLi9jb252ZXJzaW9uJztcclxuaW1wb3J0IHsgY29sb3JOYW1lcyB9IGZyb20gJy4vY3NzLWNvbG9yLW5hbWVzJztcclxuaW1wb3J0IHsgQ01ZSywgSFNMLCBIU0xBLCBIU1YsIEhTVkEsIFJHQiwgUkdCQSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcbmV4cG9ydCB0eXBlIENvbG9ySW5wdXQgPSBzdHJpbmcgfCBDTVlLIHwgSFNMQSB8IEhTVkEgfCBSR0JBIHwgTmd4Q29sb3I7XHJcbmV4cG9ydCB0eXBlIE91dHB1dFR5cGUgPSAnQ01ZSycgfCAnSFNMJyB8ICdIU1YnIHwgJ1JHQicgfCAnSEVYJztcclxuXHJcbmV4cG9ydCBjbGFzcyBOZ3hDb2xvciB7XHJcbiAgcHJpdmF0ZSBfcmdiOiBSR0JBID0geyByOiAwLCBnOiAwLCBiOiAwLCBhOiAxIH07XHJcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGlucHV0PzogQ29sb3JJbnB1dCkge1xyXG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuO1xyXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTmd4Q29sb3IpIHtcclxuICAgICAgdGhpcy5fcmdiID0geyAuLi5pbnB1dC5fcmdiIH07XHJcbiAgICAgIHRoaXMuX25hbWUgPSBpbnB1dC5fbmFtZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKCdyJyBpbiBpbnB1dCAmJiAnZycgaW4gaW5wdXQgJiYgJ2InIGluIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0geyByOiAraW5wdXQuciwgZzogK2lucHV0LmcsIGI6ICtpbnB1dC5iLCBhOiAoaW5wdXQgYXMgYW55KS5hICE9PSB1bmRlZmluZWQgPyAraW5wdXQuYSA6IDEgfTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdoJyBpbiBpbnB1dCAmJiAncycgaW4gaW5wdXQgJiYgJ2wnIGluIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gTmd4Q29sb3IuaHNsYVRvUmdiYShpbnB1dCBhcyBIU0xBKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdoJyBpbiBpbnB1dCAmJiAncycgaW4gaW5wdXQgJiYgJ3YnIGluIGlucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gTmd4Q29sb3IuaHN2YVRvUmdiYShpbnB1dCBhcyBIU1ZBKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdjJyBpbiBpbnB1dCAmJiAnbScgaW4gaW5wdXQgJiYgJ3knIGluIGlucHV0ICYmICdrJyBpbiBpbnB1dCkge1xyXG4gICAgICAgIHRoaXMuX3JnYiA9IE5neENvbG9yLmNteWtUb1JnYmEoaW5wdXQgYXMgQ01ZSyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCBuYW1lID0gaW5wdXQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmIChjb2xvck5hbWVzW25hbWVdKSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gaGV4VG9SZ2IoY29sb3JOYW1lc1tuYW1lXSk7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eIz9bMC05YS1mXXszLDh9JC9pLnRlc3QobmFtZSkpIHtcclxuICAgICAgICB0aGlzLl9yZ2IgPSBoZXhUb1JnYihuYW1lKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJ3JnYicpKSB7XHJcbiAgICAgICAgdGhpcy5fcmdiID0gcGFyc2VSZ2JTdHJpbmcobmFtZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKCdoc2wnKSkge1xyXG4gICAgICAgIHRoaXMuX3JnYiA9IE5neENvbG9yLmhzbGFUb1JnYmEocGFyc2VIc2xTdHJpbmcobmFtZSkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobmFtZS5pbmNsdWRlcygnaHN2JykpIHtcclxuICAgICAgICB0aGlzLl9yZ2IgPSBOZ3hDb2xvci5oc3ZhVG9SZ2JhKHBhcnNlSHN2U3RyaW5nKG5hbWUpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoJ2NteWsnKSkge1xyXG4gICAgICAgIHRoaXMuX3JnYiA9IE5neENvbG9yLmNteWtUb1JnYmEocGFyc2VDbXlrU3RyaW5nKG5hbWUpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNvbG9yIHN0cmluZzogJyArIGlucHV0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdHlwZW9mIHRoaXMuX3JnYi5yID09PSAnbnVtYmVyJyAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5fcmdiLmcgPT09ICdudW1iZXInICYmXHJcbiAgICAgIHR5cGVvZiB0aGlzLl9yZ2IuYiA9PT0gJ251bWJlcicgJiZcclxuICAgICAgIWlzTmFOKHRoaXMuX3JnYi5yKSAmJlxyXG4gICAgICAhaXNOYU4odGhpcy5fcmdiLmcpICYmXHJcbiAgICAgICFpc05hTih0aGlzLl9yZ2IuYilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuYW1lKCkge1xyXG4gICAgaWYgKHRoaXMuX25hbWUpIHJldHVybiB0aGlzLl9uYW1lO1xyXG4gICAgY29uc3QgaGV4ID0gdGhpcy50b0hleFN0cmluZygpO1xyXG4gICAgZm9yIChjb25zdCBbbiwgaF0gb2YgT2JqZWN0LmVudHJpZXMoY29sb3JOYW1lcykpIHtcclxuICAgICAgaWYgKGgudG9Mb3dlckNhc2UoKSA9PT0gaGV4LnRvTG93ZXJDYXNlKCkpIHJldHVybiBuO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgdG9SZ2IoKTogUkdCQSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmdiO1xyXG4gIH1cclxuXHJcbiAgdG9SZ2JTdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gdGhpcy50b1JnYigpO1xyXG4gICAgcmV0dXJuIGEgPT09IDFcclxuICAgICAgPyBgcmdiKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9KWBcclxuICAgICAgOiBgcmdiYSgke01hdGgucm91bmQocil9LCR7TWF0aC5yb3VuZChnKX0sJHtNYXRoLnJvdW5kKGIpfSwkeythLnRvRml4ZWQoMyl9KWA7XHJcbiAgfVxyXG5cclxuICB0b0hleFN0cmluZyhhbGxvd0FscGhhID0gdHJ1ZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB7IHIsIGcsIGIsIGEgfSA9IHRoaXMudG9SZ2IoKTtcclxuICAgIHJldHVybiByZ2JhVG9IZXgociwgZywgYiwgYSwgYWxsb3dBbHBoYSAmJiBhIDwgMSk7XHJcbiAgfVxyXG5cclxuICB0b0hzbCgpOiBIU0xBIHtcclxuICAgIHJldHVybiBOZ3hDb2xvci5yZ2JUb0hzbGEodGhpcy50b1JnYigpKTtcclxuICB9XHJcblxyXG4gIHRvSHN2KCk6IEhTVkEge1xyXG4gICAgcmV0dXJuIE5neENvbG9yLnJnYlRvSHN2YSh0aGlzLnRvUmdiKCkpO1xyXG4gIH1cclxuXHJcbiAgdG9DbXlrKCk6IENNWUsge1xyXG4gICAgcmV0dXJuIE5neENvbG9yLnJnYlRvQ215ayh0aGlzLnRvUmdiKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNteWtUb1JnYmEoY215azogQ01ZSyk6IFJHQkEge1xyXG4gICAgY29uc3QgeyBjLCBtLCB5LCBrIH0gPSBjbXlrO1xyXG4gICAgcmV0dXJuIHsgLi4uY215a1RvUmdiKGMsIG0sIHksIGspLCBhOiAoY215ayBhcyBhbnkpLmEgIT09IHVuZGVmaW5lZCA/ICsoY215ayBhcyBhbnkpLmEgOiAxIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmdiVG9DbXlrKHJnYmE6IFJHQkEpOiBDTVlLIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiB9ID0gcmdiYTtcclxuICAgIHJldHVybiByZ2JUb0NteWsociwgZywgYik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmdiVG9Ic2xhKHJnYmE6IFJHQkEpOiBIU0xBIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gcmdiYTtcclxuICAgIHJldHVybiB7IC4uLnJnYlRvSHNsKHIsIGcsIGIpLCBhIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmdiVG9Ic3ZhKHJnYmE6IFJHQkEpOiBIU1ZBIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gcmdiYTtcclxuICAgIHJldHVybiB7IC4uLnJnYlRvSHN2KHIsIGcsIGIpLCBhIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaHN2YVRvUmdiYShoc3ZhOiBIU1ZBKTogUkdCQSB7XHJcbiAgICBjb25zdCB7IGgsIHMsIHYsIGEgfSA9IGhzdmE7XHJcbiAgICByZXR1cm4geyAuLi5oc3ZUb1JnYihoLCBzLCB2KSwgYTogYSAhPT0gdW5kZWZpbmVkID8gYSA6IDEgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoc2xhVG9SZ2JhKGhzbGE6IEhTTEEpOiBSR0JBIHtcclxuICAgIGNvbnN0IHsgaCwgcywgbCwgYSB9ID0gaHNsYTtcclxuICAgIHJldHVybiB7IC4uLmhzbFRvUmdiYShoLCBzLCBsKSwgYTogYSAhPT0gdW5kZWZpbmVkID8gYSA6IDEgfTtcclxuICB9XHJcblxyXG4gIGVxdWFscyhvdGhlcj86IE5neENvbG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIW90aGVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy50b0hleFN0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IG90aGVyLnRvSGV4U3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGlzRGFyaygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gdGhpcy50b1JnYigpO1xyXG4gICAgcmV0dXJuIGEgPCAwLjUgPyBmYWxzZSA6IDAuMjk5ICogciArIDAuNTg3ICogZyArIDAuMTE0ICogYiA8IDEyODtcclxuICB9XHJcblxyXG4gIGlzTGlnaHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNEYXJrKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRPdXRwdXRSZXN1bHQob3V0cHV0VHlwZTogT3V0cHV0VHlwZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB7IHIsIGcsIGIsIGEgfSA9IHRoaXMuX3JnYjtcclxuXHJcbiAgICBzd2l0Y2ggKG91dHB1dFR5cGUpIHtcclxuICAgICAgY2FzZSAnQ01ZSyc6XHJcbiAgICAgICAgcmV0dXJuIHJnYlRvQ215a1N0cmluZyhyLCBnLCBiKTtcclxuXHJcbiAgICAgIGNhc2UgJ0hTTCc6XHJcbiAgICAgICAgcmV0dXJuIHJnYlRvSHNsYVN0cmluZyhyLCBnLCBiLCBhKTtcclxuXHJcbiAgICAgIGNhc2UgJ0hTVic6XHJcbiAgICAgICAgcmV0dXJuIHJnYlRvSHN2U3RyaW5nKHIsIGcsIGIsIGEpO1xyXG5cclxuICAgICAgY2FzZSAnUkdCJzpcclxuICAgICAgICByZXR1cm4gYSA8IDEgPyBgcmdiYSgke3J9LCAke2d9LCAke2J9LCAkeythLnRvRml4ZWQoMil9KWAgOiBgcmdiKCR7cn0sICR7Z30sICR7Yn0pYDtcclxuXHJcbiAgICAgIGNhc2UgJ0hFWCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGxldCBuYW1lID0gYXdhaXQgdGhpcy5uYW1lKCk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWUgPz8gdGhpcy50b0hleFN0cmluZyh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19