com.phloxui
Version:
PhloxUI Ng2+ Framework
254 lines (253 loc) • 32.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export class ColorUtils {
/**
* @param {?} value
* @return {?}
*/
static isHexValue(value) {
let /** @type {?} */ isHexValue = /^#[0-9A-F]{6}$/i.test(value);
return isHexValue;
}
/**
* @param {?} hex
* @return {?}
*/
static hexToRGB(hex) {
let /** @type {?} */ c = [];
if (!hex.startsWith("#")) {
c = ("#" + hex).substring(1).split('');
}
else {
c = hex.substring(1).split('');
}
if (c.length == 3) {
c = [c[0], c[0], c[1], c[1], c[2], c[2]];
}
c = '0x' + c.join('');
return 'rgb(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',') + ')';
}
/**
* @param {?} value
* @return {?}
*/
static componentToHex(value) {
let /** @type {?} */ hex = value.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
static rgbToHex(r, g, b) {
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);
}
/**
* @param {?} hex
* @param {?} percentage
* @return {?}
*/
static shadeHexColor(hex, percentage) {
let /** @type {?} */ hexString = hex;
if (hex.startsWith("#")) {
hexString = hex.substr(1);
}
let /** @type {?} */ num = parseInt(hexString, 16);
let /** @type {?} */ amt = Math.round(2.55 * percentage);
let /** @type {?} */ R = (num >> 16) + amt;
let /** @type {?} */ G = (num >> 8 & 0x00FF) + amt;
let /** @type {?} */ B = (num & 0x0000FF) + amt;
return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);
}
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @param {?} percentage
* @return {?}
*/
static shadeRGBColor(r, g, b, percentage) {
// let f = color.split(",");
let /** @type {?} */ t = percentage < 0 ? 0 : 255;
let /** @type {?} */ p = percentage < 0 ? percentage * -1 : percentage;
let /** @type {?} */ R = (Math.round((t - r) * p) + r);
let /** @type {?} */ RString = R + "";
if (RString.length > 3) {
RString = RString.substr(0, 3);
}
let /** @type {?} */ G = (Math.round((t - g) * p) + g);
let /** @type {?} */ GString = G + "";
if (GString.length > 3) {
GString = GString.substr(0, 3);
}
let /** @type {?} */ B = (Math.round((t - b) * p) + b);
let /** @type {?} */ BString = B + "";
if (BString.length > 3) {
BString = BString.substr(0, 3);
}
return "rgb(" + RString + "," + GString + "," + BString + ")";
}
/**
* @param {?} color1
* @param {?} color2
* @param {?} point
* @return {?}
*/
static blendHexColors(color1, color2, point) {
if (color1.length == 4) {
color1 = color1[1] + color1[1] + color1[2] + color1[2] + color1[3] + color1[3];
}
else {
color1 = color1.substring(1);
}
if (color2.length == 4) {
color2 = color2[1] + color2[1] + color2[2] + color2[2] + color2[3] + color2[3];
}
else {
color2 = color2.substring(1);
}
// we have valid input, convert colors to rgb
let /** @type {?} */ color1Array = [parseInt(color1[0] + color1[1], 16), parseInt(color1[2] + color1[3], 16), parseInt(color1[4] + color1[5], 16)];
let /** @type {?} */ color2Array = [parseInt(color2[0] + color2[1], 16), parseInt(color2[2] + color2[3], 16), parseInt(color2[4] + color2[5], 16)];
// blend
let /** @type {?} */ color3 = [
(1 - point) * color1Array[0] + point * color2Array[0],
(1 - point) * color1Array[1] + point * color2Array[1],
(1 - point) * color1Array[2] + point * color2Array[2]
];
// convert to hex
return '#' + this.componentToHex(Math.round(color3[0])) + this.componentToHex(Math.round(color3[1])) + this.componentToHex(Math.round(color3[2]));
}
/**
* @param {?} hueDegree
* @param {?} saturation
* @param {?} brightness
* @return {?}
*/
static hsbToRGB(hueDegree, saturation, brightness) {
if (hueDegree < 0) {
hueDegree = 0;
}
if (hueDegree >= 360) {
hueDegree = 359;
}
if (saturation < 0) {
saturation = 0;
}
if (saturation > 100) {
saturation = 100;
}
if (brightness < 0) {
brightness = 0;
}
if (brightness > 100) {
brightness = 100;
}
hueDegree /= 360;
saturation /= 100;
brightness /= 100;
let /** @type {?} */ r, /** @type {?} */ g, /** @type {?} */ b;
if (saturation === 0) {
r = g = b = brightness; // achromatic
}
else {
const /** @type {?} */ hue2rgb = (p, q, t) => {
if (t < 0)
t += 1;
if (t > 1)
t -= 1;
if (t < 1 / 6)
return p + (q - p) * 6 * t;
if (t < 1 / 2)
return q;
if (t < 2 / 3)
return p + (q - p) * (2 / 3 - t) * 6;
return p;
};
const /** @type {?} */ q = brightness < 0.5 ? brightness * (1 + saturation) : brightness + saturation - brightness * saturation;
const /** @type {?} */ p = 2 * brightness - q;
r = hue2rgb(p, q, hueDegree + 1 / 3);
g = hue2rgb(p, q, hueDegree);
b = hue2rgb(p, q, hueDegree - 1 / 3);
}
let /** @type {?} */ rgbArray = [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
return "rgb(" + rgbArray[0] + "," + rgbArray[1] + "," + rgbArray[2] + ")";
}
/**
* @param {?} hueDegree
* @param {?} saturation
* @param {?} brightness
* @return {?}
*/
static hsbToHex(hueDegree, saturation, brightness) {
let /** @type {?} */ rgbString = this.hsbToRGB(hueDegree, saturation, brightness);
let /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(',');
return this.rgbToHex(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2]));
}
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
static rgbToHsl(r, g, b) {
r /= 255;
g /= 255;
b /= 255;
let /** @type {?} */ max = Math.max(r, g, b);
let /** @type {?} */ min = Math.min(r, g, b);
let /** @type {?} */ h, /** @type {?} */ s, /** @type {?} */ l = (max + min) / 2;
if (max == min) {
h = s = 0; // achromatic
}
else {
let /** @type {?} */ d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
return [h, s, l];
}
/**
* @param {?} hex
* @return {?}
*/
static hexToHsl(hex) {
let /** @type {?} */ rgbString = this.hexToRGB(hex);
let /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(',');
return this.rgbToHsl(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2]));
}
/**
* @param {?} r
* @param {?} g
* @param {?} b
* @return {?}
*/
static rgbToHue(r, g, b) {
return Math.round(this.rgbToHsl(r, g, b)[0] * 360);
}
/**
* @param {?} hex
* @return {?}
*/
static hexToHue(hex) {
let /** @type {?} */ rgbString = this.hexToRGB(hex);
let /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(',');
return this.rgbToHue(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2]));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sb3JVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0NvbG9yVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQU07Ozs7O0lBQ0ssTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ2xDLHFCQUFJLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Ozs7O0lBR2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFXO1FBQzlCLHFCQUFJLENBQUMsR0FBUSxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Ozs7OztJQUd4RSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQVU7UUFDbkMscUJBQUksR0FBRyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7O0lBR3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7SUFJbkYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDdkQscUJBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUVELHFCQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLHFCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQztRQUN4QyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O0lBSXBLLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsVUFBa0I7O1FBRTNFLHFCQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxxQkFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDdEQscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQzs7Ozs7Ozs7SUFJM0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFFLEtBQWE7UUFFdEUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQzs7UUFHRCxxQkFBSSxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xJLHFCQUFJLFdBQVcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1FBR2xJLHFCQUFJLE1BQU0sR0FBRztZQUNULENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNyRCxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ3hELENBQUM7O1FBR0YsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7SUFNL0ksTUFBTSxDQUFDLFFBQVEsQ0FB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Q0FBQztRQUU5RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVsRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBDb2xvclV0aWxzIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzSGV4VmFsdWUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNIZXhWYWx1ZSA9IC9eI1swLTlBLUZdezZ9JC9pLnRlc3QodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc0hleFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGV4VG9SR0IoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYzogYW55ID0gW107XG4gICAgICAgIGlmICghaGV4LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgICBjID0gKFwiI1wiICsgaGV4KS5zdWJzdHJpbmcoMSkuc3BsaXQoJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGhleC5zdWJzdHJpbmcoMSkuc3BsaXQoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgIGMgPSBbY1swXSwgY1swXSwgY1sxXSwgY1sxXSwgY1syXSwgY1syXV07XG4gICAgICAgIH1cbiAgICAgICAgYyA9ICcweCcgKyBjLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiAncmdiKCcgKyBbKGMgPj4gMTYpICYgMjU1LCAoYyA+PiA4KSAmIDI1NSwgYyAmIDI1NV0uam9pbignLCcpICsgJyknO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29tcG9uZW50VG9IZXgodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBoZXg6IHN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKDE2KTtcblxuICAgICAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PSAxID8gXCIwXCIgKyBoZXggOiBoZXg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZ2JUb0hleChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy5jb21wb25lbnRUb0hleChyKSArIHRoaXMuY29tcG9uZW50VG9IZXgoZykgKyB0aGlzLmNvbXBvbmVudFRvSGV4KGIpO1xuICAgIH1cblxuICAgIC8vIHBlcmNlbnRhZ2UgPT4gYXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDBcbiAgICBwdWJsaWMgc3RhdGljIHNoYWRlSGV4Q29sb3IoaGV4OiBzdHJpbmcsIHBlcmNlbnRhZ2U6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBoZXhTdHJpbmc6IHN0cmluZyA9IGhleDtcbiAgICAgICAgaWYgKGhleC5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICAgICAgaGV4U3RyaW5nID0gaGV4LnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBudW0gPSBwYXJzZUludChoZXhTdHJpbmcsIDE2KTtcbiAgICAgICAgbGV0IGFtdCA9IE1hdGgucm91bmQoMi41NSAqIHBlcmNlbnRhZ2UpO1xuICAgICAgICBsZXQgUiA9IChudW0gPj4gMTYpICsgYW10O1xuICAgICAgICBsZXQgRyA9IChudW0gPj4gOCAmIDB4MDBGRikgKyBhbXQ7XG4gICAgICAgIGxldCBCID0gKG51bSAmIDB4MDAwMEZGKSArIGFtdDtcbiAgICAgICAgcmV0dXJuICcjJyArICgweDEwMDAwMDAgKyAoUiA8IDI1NSA/IFIgPCAxID8gMCA6IFIgOiAyNTUpICogMHgxMDAwMCArIChHIDwgMjU1ID8gRyA8IDEgPyAwIDogRyA6IDI1NSkgKiAweDEwMCArIChCIDwgMjU1ID8gQiA8IDEgPyAwIDogQiA6IDI1NSkpLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcbiAgICB9XG5cbiAgICAvLyBwZXJjZW50YWdlID0+IGFzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwXG4gICAgcHVibGljIHN0YXRpYyBzaGFkZVJHQkNvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIHBlcmNlbnRhZ2U6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIGxldCBmID0gY29sb3Iuc3BsaXQoXCIsXCIpO1xuICAgICAgICBsZXQgdCA9IHBlcmNlbnRhZ2UgPCAwID8gMCA6IDI1NTtcbiAgICAgICAgbGV0IHAgPSBwZXJjZW50YWdlIDwgMCA/IHBlcmNlbnRhZ2UgKiAtMSA6IHBlcmNlbnRhZ2U7XG4gICAgICAgIGxldCBSID0gKE1hdGgucm91bmQoKHQgLSByKSAqIHApICsgcik7XG4gICAgICAgIGxldCBSU3RyaW5nID0gUiArIFwiXCI7XG4gICAgICAgIGlmIChSU3RyaW5nLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIFJTdHJpbmcgPSBSU3RyaW5nLnN1YnN0cigwLCAzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgRyA9IChNYXRoLnJvdW5kKCh0IC0gZykgKiBwKSArIGcpO1xuICAgICAgICBsZXQgR1N0cmluZyA9IEcgKyBcIlwiO1xuICAgICAgICBpZiAoR1N0cmluZy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICBHU3RyaW5nID0gR1N0cmluZy5zdWJzdHIoMCwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IEIgPSAoTWF0aC5yb3VuZCgodCAtIGIpICogcCkgKyBiKTtcbiAgICAgICAgbGV0IEJTdHJpbmcgPSBCICsgXCJcIjtcbiAgICAgICAgaWYgKEJTdHJpbmcubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgQlN0cmluZyA9IEJTdHJpbmcuc3Vic3RyKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwicmdiKFwiICsgUlN0cmluZyArIFwiLFwiICsgR1N0cmluZyArIFwiLFwiICsgQlN0cmluZyArIFwiKVwiO1xuICAgIH1cblxuICAgIC8vIHBvaW50ID0+IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBmaXJzdCBjb2xvciwgYXMgYSBkZWNpbWFsIGJldHdlZW4gMCBhbmQgMVxuICAgIHB1YmxpYyBzdGF0aWMgYmxlbmRIZXhDb2xvcnMoY29sb3IxOiBzdHJpbmcsIGNvbG9yMjogc3RyaW5nLCBwb2ludDogbnVtYmVyKTogc3RyaW5nIHtcblxuICAgICAgICBpZiAoY29sb3IxLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgICAgICBjb2xvcjEgPSBjb2xvcjFbMV0gKyBjb2xvcjFbMV0gKyBjb2xvcjFbMl0gKyBjb2xvcjFbMl0gKyBjb2xvcjFbM10gKyBjb2xvcjFbM107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2xvcjEgPSBjb2xvcjEuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9IGlmIChjb2xvcjIubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgIGNvbG9yMiA9IGNvbG9yMlsxXSArIGNvbG9yMlsxXSArIGNvbG9yMlsyXSArIGNvbG9yMlsyXSArIGNvbG9yMlszXSArIGNvbG9yMlszXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yMiA9IGNvbG9yMi5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBoYXZlIHZhbGlkIGlucHV0LCBjb252ZXJ0IGNvbG9ycyB0byByZ2JcbiAgICAgICAgbGV0IGNvbG9yMUFycmF5ID0gW3BhcnNlSW50KGNvbG9yMVswXSArIGNvbG9yMVsxXSwgMTYpLCBwYXJzZUludChjb2xvcjFbMl0gKyBjb2xvcjFbM10sIDE2KSwgcGFyc2VJbnQoY29sb3IxWzRdICsgY29sb3IxWzVdLCAxNildO1xuICAgICAgICBsZXQgY29sb3IyQXJyYXkgPSBbcGFyc2VJbnQoY29sb3IyWzBdICsgY29sb3IyWzFdLCAxNiksIHBhcnNlSW50KGNvbG9yMlsyXSArIGNvbG9yMlszXSwgMTYpLCBwYXJzZUludChjb2xvcjJbNF0gKyBjb2xvcjJbNV0sIDE2KV07XG5cbiAgICAgICAgLy8gYmxlbmRcbiAgICAgICAgbGV0IGNvbG9yMyA9IFtcbiAgICAgICAgICAgICgxIC0gcG9pbnQpICogY29sb3IxQXJyYXlbMF0gKyBwb2ludCAqIGNvbG9yMkFycmF5WzBdLFxuICAgICAgICAgICAgKDEgLSBwb2ludCkgKiBjb2xvcjFBcnJheVsxXSArIHBvaW50ICogY29sb3IyQXJyYXlbMV0sXG4gICAgICAgICAgICAoMSAtIHBvaW50KSAqIGNvbG9yMUFycmF5WzJdICsgcG9pbnQgKiBjb2xvcjJBcnJheVsyXVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gaGV4XG4gICAgICAgIHJldHVybiAnIycgKyB0aGlzLmNvbXBvbmVudFRvSGV4KE1hdGgucm91bmQoY29sb3IzWzBdKSkgKyB0aGlzLmNvbXBvbmVudFRvSGV4KE1hdGgucm91bmQoY29sb3IzWzFdKSkgKyB0aGlzLmNvbXBvbmVudFRvSGV4KE1hdGgucm91bmQoY29sb3IzWzJdKSk7XG4gICAgfVxuXG4gICAgLy8gaHVlIC0+IGRlZ3JlZSBudW1iZXIgYmV0d2VlbiAwIC0gMzU5XG4gICAgLy8gc2F0dXJhdGlvbiAtPiBwZXJjZW50YWdlIG51bWJlciBiZXR3ZWVuIDAgLSAxMDBcbiAgICAvLyBicmlnaHRuZXNzIC0+IHBlcmNlbnRhZ2UgbnVtYmVyIGJldHdlZW4gMCAtIDEwMFxuICAgIHB1YmxpYyBzdGF0aWMgaHNiVG9SR0IoaHVlRGVncmVlOiBudW1iZXIsIHNhdHVyYXRpb246IG51bWJlciwgYnJpZ2h0bmVzczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGh1ZURlZ3JlZSA8IDApIHtcbiAgICAgICAgICAgIGh1ZURlZ3JlZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGh1ZURlZ3JlZSA+PSAzNjApIHtcbiAgICAgICAgICAgIGh1ZURlZ3JlZSA9IDM1OTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2F0dXJhdGlvbiA8IDApIHtcbiAgICAgICAgICAgIHNhdHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYXR1cmF0aW9uID4gMTAwKSB7XG4gICAgICAgICAgICBzYXR1cmF0aW9uID0gMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmlnaHRuZXNzIDwgMCkge1xuICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyaWdodG5lc3MgPiAxMDApIHtcbiAgICAgICAgICAgIGJyaWdodG5lc3MgPSAxMDA7XG4gICAgICAgIH1cblxuICAgICAgICBodWVEZWdyZWUgLz0gMzYwO1xuICAgICAgICBzYXR1cmF0aW9uIC89IDEwMDtcbiAgICAgICAgYnJpZ2h0bmVzcyAvPSAxMDA7XG5cbiAgICAgICAgbGV0IHIsIGcsIGI7XG4gICAgICAgIGlmIChzYXR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByID0gZyA9IGIgPSBicmlnaHRuZXNzOyAvLyBhY2hyb21hdGljXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBodWUycmdiID0gKHA6IGFueSwgcTogYW55LCB0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBxID0gYnJpZ2h0bmVzcyA8IDAuNSA/IGJyaWdodG5lc3MgKiAoMSArIHNhdHVyYXRpb24pIDogYnJpZ2h0bmVzcyArIHNhdHVyYXRpb24gLSBicmlnaHRuZXNzICogc2F0dXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHAgPSAyICogYnJpZ2h0bmVzcyAtIHE7XG4gICAgICAgICAgICByID0gaHVlMnJnYihwLCBxLCBodWVEZWdyZWUgKyAxIC8gMyk7XG4gICAgICAgICAgICBnID0gaHVlMnJnYihwLCBxLCBodWVEZWdyZWUpO1xuICAgICAgICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaHVlRGVncmVlIC0gMSAvIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJnYkFycmF5ID0gW01hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSldO1xuXG4gICAgICAgIHJldHVybiBcInJnYihcIiArIHJnYkFycmF5WzBdICsgXCIsXCIgKyByZ2JBcnJheVsxXSArIFwiLFwiICsgcmdiQXJyYXlbMl0gKyBcIilcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhzYlRvSGV4KGh1ZURlZ3JlZTogbnVtYmVyLCBzYXR1cmF0aW9uOiBudW1iZXIsIGJyaWdodG5lc3M6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCByZ2JTdHJpbmcgPSB0aGlzLmhzYlRvUkdCKGh1ZURlZ3JlZSwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcyk7XG4gICAgICAgIGxldCByZ2I6IHN0cmluZ1tdID0gcmdiU3RyaW5nLnN1YnN0cmluZyg0LCByZ2JTdHJpbmcubGVuZ3RoIC0gMSkucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZ2JUb0hleChwYXJzZUludChyZ2JbMF0pLCBwYXJzZUludChyZ2JbMV0pLCBwYXJzZUludChyZ2JbMl0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJnYlRvSHNsKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIHIgLz0gMjU1O1xuICAgICAgICBnIC89IDI1NTtcbiAgICAgICAgYiAvPSAyNTU7XG5cbiAgICAgICAgbGV0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgICAgICBsZXQgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgICAgIGxldCBoLCBzLCBsID0gKG1heCArIG1pbikgLyAyO1xuXG4gICAgICAgIGlmIChtYXggPT0gbWluKSB7XG4gICAgICAgICAgICBoID0gcyA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkID0gbWF4IC0gbWluO1xuICAgICAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgICAgICAgICAgc3dpdGNoIChtYXgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBnOiBoID0gKGIgLSByKSAvIGQgKyAyOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaCAvPSA2O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtoLCBzLCBsXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhleFRvSHNsKGhleDogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgcmdiU3RyaW5nID0gdGhpcy5oZXhUb1JHQihoZXgpO1xuICAgICAgICBsZXQgcmdiOiBzdHJpbmdbXSA9IHJnYlN0cmluZy5zdWJzdHJpbmcoNCwgcmdiU3RyaW5nLmxlbmd0aCAtIDEpLnJlcGxhY2UoLyAvZywgJycpLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmdiVG9Ic2wocGFyc2VJbnQocmdiWzBdKSwgcGFyc2VJbnQocmdiWzFdKSwgcGFyc2VJbnQocmdiWzJdKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZ2JUb0h1ZShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5yZ2JUb0hzbChyLCBnLCBiKVswXSAqIDM2MCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoZXhUb0h1ZShoZXg6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCByZ2JTdHJpbmcgPSB0aGlzLmhleFRvUkdCKGhleCk7XG4gICAgICAgIGxldCByZ2I6IHN0cmluZ1tdID0gcmdiU3RyaW5nLnN1YnN0cmluZyg0LCByZ2JTdHJpbmcubGVuZ3RoIC0gMSkucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZ2JUb0h1ZShwYXJzZUludChyZ2JbMF0pLCBwYXJzZUludChyZ2JbMV0pLCBwYXJzZUludChyZ2JbMl0pKTtcbiAgICB9XG59XG4iXX0=