@senx/warpview
Version:
WarpView Elements
296 lines • 44.1 kB
JavaScript
/*
* Copyright 2021 SenX S.A.S.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
export var Colors;
(function (Colors) {
Colors["COHESIVE"] = "COHESIVE";
Colors["COHESIVE_2"] = "COHESIVE_2";
Colors["BELIZE"] = "BELIZE";
Colors["VIRIDIS"] = "VIRIDIS";
Colors["MAGMA"] = "MAGMA";
Colors["INFERNO"] = "INFERNO";
Colors["PLASMA"] = "PLASMA";
Colors["YL_OR_RD"] = "YL_OR_RD";
Colors["YL_GN_BU"] = "YL_GN_BU";
Colors["BU_GN"] = "BU_GN";
Colors["WARP10"] = "WARP10";
Colors["NINETEEN_EIGHTY_FOUR"] = "NINETEEN_EIGHTY_FOUR";
Colors["ATLANTIS"] = "ATLANTIS";
Colors["DO_ANDROIDS_DREAM"] = "DO_ANDROIDS_DREAM";
Colors["DELOREAN"] = "DELOREAN";
Colors["CTHULHU"] = "CTHULHU";
Colors["ECTOPLASM"] = "ECTOPLASM";
Colors["T_MAX_400_FILM"] = "T_MAX_400_FILM";
})(Colors || (Colors = {}));
export class ColorLib {
static getColor(i, scheme) {
if (!ColorLib.color[scheme]) {
scheme = 'WARP10';
}
return ColorLib.color[scheme][i % 2 === 0
? i % ColorLib.color[scheme].length
: ColorLib.color[scheme].length - i % ColorLib.color[scheme].length];
}
static getColorGradient(id, scheme) {
return [
[0, ColorLib.transparentize(ColorLib.getColor(id, scheme), 0)],
[1, ColorLib.transparentize(ColorLib.getColor(id, scheme), 0.7)]
];
}
static getBlendedColorGradient(id, scheme, bg = '#000000') {
return [
[0, ColorLib.blend_colors(bg, ColorLib.getColor(id, scheme), 0)],
[1, ColorLib.blend_colors(bg, ColorLib.getColor(id, scheme), 1)]
];
}
static hexToRgb(hex) {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? [
parseInt(result[1], 16),
parseInt(result[2], 16),
parseInt(result[3], 16)
] : null;
}
static transparentize(color, alpha = 0.5) {
return 'rgba(' + ColorLib.hexToRgb(color).concat(alpha).join(',') + ')';
}
static generateTransparentColors(num, scheme) {
const color = [];
for (let i = 0; i < num; i++) {
color.push(ColorLib.transparentize(ColorLib.getColor(i, scheme)));
}
return color;
}
static hsvGradientFromRgbColors(c1, c2, steps) {
const c1hsv = ColorLib.rgb2hsv(c1.r, c1.g, c1.b);
const c2hsv = ColorLib.rgb2hsv(c2.r, c2.g, c2.b);
c1.h = c1hsv[0];
c1.s = c1hsv[1];
c1.v = c1hsv[2];
c2.h = c2hsv[0];
c2.s = c2hsv[1];
c2.v = c2hsv[2];
const gradient = ColorLib.hsvGradient(c1, c2, steps);
for (const i in gradient) {
if (gradient[i]) {
gradient[i].rgb = ColorLib.hsv2rgb(gradient[i].h, gradient[i].s, gradient[i].v);
gradient[i].r = Math.floor(gradient[i].rgb[0]);
gradient[i].g = Math.floor(gradient[i].rgb[1]);
gradient[i].b = Math.floor(gradient[i].rgb[2]);
}
}
return gradient;
}
static rgb2hsv(r, g, b) {
// Normalize
const normR = r / 255.0;
const normG = g / 255.0;
const normB = b / 255.0;
const M = Math.max(normR, normG, normB);
const m = Math.min(normR, normG, normB);
const d = M - m;
let h;
let s;
let v;
v = M;
if (d === 0) {
h = 0;
s = 0;
}
else {
s = d / v;
switch (M) {
case normR:
h = ((normG - normB) + d * (normG < normB ? 6 : 0)) / 6 * d;
break;
case normG:
h = ((normB - normR) + d * 2) / 6 * d;
break;
case normB:
h = ((normR - normG) + d * 4) / 6 * d;
break;
}
}
return [h, s, v];
}
static hsvGradient(c1, c2, steps) {
const gradient = new Array(steps);
// determine clockwise and counter-clockwise distance between hues
const distCCW = (c1.h >= c2.h) ? c1.h - c2.h : 1 + c1.h - c2.h;
const distCW = (c1.h >= c2.h) ? 1 + c2.h - c1.h : c2.h - c1.h;
// make gradient for this part
for (let i = 0; i < steps; i++) {
// interpolate h, s, b
let h = (distCW <= distCCW) ? c1.h + (distCW * i / (steps - 1)) : c1.h - (distCCW * i / (steps - 1));
if (h < 0) {
h = 1 + h;
}
if (h > 1) {
h = h - 1;
}
const s = (1 - i / (steps - 1)) * c1.s + i / (steps - 1) * c2.s;
const v = (1 - i / (steps - 1)) * c1.v + i / (steps - 1) * c2.v;
// add to gradient array
gradient[i] = { h, s, v };
}
return gradient;
}
static hsv2rgb(h, s, v) {
let r;
let g;
let b;
const i = Math.floor(h * 6);
const f = h * 6 - i;
const p = v * (1 - s);
const q = v * (1 - f * s);
const t = v * (1 - (1 - f) * s);
switch (i % 6) {
case 0:
r = v;
g = t;
b = p;
break;
case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
case 5:
r = v;
g = p;
b = q;
break;
}
return [r * 255, g * 255, b * 255];
}
static rgb2hex(r, g, b) {
function componentToHex(c) {
const hex = c.toString(16);
return hex.length === 1 ? '0' + hex : hex;
}
return '#' + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
static blend_colors(color1, color2, percentage) {
// check input
color1 = color1 || '#000000';
color2 = color2 || '#ffffff';
percentage = percentage || 0.5;
// 1: validate input, make sure we have provided a valid hex
if (color1.length !== 4 && color1.length !== 7) {
throw new Error('colors must be provided as hexes');
}
if (color2.length !== 4 && color2.length !== 7) {
throw new Error('colors must be provided as hexes');
}
if (percentage > 1 || percentage < 0) {
throw new Error('percentage must be between 0 and 1');
}
// 2: check to see if we need to convert 3 char hex to 6 char hex, else slice off hash
// the three character hex is just a representation of the 6 hex where each character is repeated
// ie: #060 => #006600 (green)
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);
}
// 3: we have valid input, convert colors to rgb
color1 = [parseInt(color1[0] + color1[1], 16), parseInt(color1[2] + color1[3], 16), parseInt(color1[4] + color1[5], 16)];
color2 = [parseInt(color2[0] + color2[1], 16), parseInt(color2[2] + color2[3], 16), parseInt(color2[4] + color2[5], 16)];
// 4: blend
const color3 = [
(1 - percentage) * color1[0] + percentage * color2[0],
(1 - percentage) * color1[1] + percentage * color2[1],
(1 - percentage) * color1[2] + percentage * color2[2]
];
// return hex
return '#' + ColorLib.int_to_hex(color3[0]) + ColorLib.int_to_hex(color3[1]) + ColorLib.int_to_hex(color3[2]);
}
/*
convert a Number to a two character hex string
must round, or we will end up with more digits than expected (2)
note: can also result in single digit, which will need to be padded with a 0 to the left
@param: num => the number to conver to hex
@returns: string => the hex representation of the provided number
*/
static int_to_hex(num) {
let hex = Math.round(num).toString(16);
if (hex.length === 1) {
hex = '0' + hex;
}
return hex;
}
}
ColorLib.color = {
COHESIVE: ['#F2D354', '#E4612F', '#D32C2E', '#6D2627', '#6C7F55', '#934FC6', '#F07A5D', '#ED8371', '#94E751',
'#C457F7', '#973AF7', '#B6FF7A', '#C7FFD5', '#90E4D0', '#E09234', '#D2FF91', '#17B201'],
COHESIVE_2: ['#6F694E', '#65D0B2', '#D8F546', '#FF724B', '#D6523E', '#F9F470', '#F4BC78', '#B1D637', '#FFCFC8',
'#56CDAB', '#CFDD22', '#B3F5D2', '#97DB29', '#9DC5EE', '#CFC0F5', '#EDEA29', '#5EC027', '#386C94'],
BELIZE: ['#5899DA', '#E8743B', '#19A979', '#ED4A7B', '#945ECF', '#13A4B4', '#525DF4', '#BF399E', '#6C8893',
'#EE6868', '#2F6497'],
VIRIDIS: ['#440154', '#481f70', '#443983', '#3b528b', '#31688e', '#287c8e', '#21918c', '#20a486', '#35b779',
'#5ec962', '#90d743', '#c8e020'],
MAGMA: ['#000004', '#100b2d', '#2c115f', '#51127c', '#721f81', '#932b80', '#b73779', '#d8456c', '#f1605d',
'#fc8961', '#feb078', '#fed799'],
INFERNO: ['#000004', '#110a30', '#320a5e', '#57106e', '#781c6d', '#9a2865', '#bc3754', '#d84c3e', '#ed6925',
'#f98e09', '#fbb61a', '#f4df53'],
PLASMA: ['#0d0887', '#3a049a', '#5c01a6', '#7e03a8', '#9c179e', '#b52f8c', '#cc4778', '#de5f65', '#ed7953',
'#f89540', '#fdb42f', '#fbd524'],
YL_OR_RD: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],
YL_GN_BU: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],
BU_GN: ['#f7fcfd', '#ebf7fa', '#dcf2f2', '#c8eae4', '#aadfd2', '#88d1bc', '#68c2a3', '#4eb485', '#37a266',
'#228c49', '#0d7635', '#025f27'],
WARP10: [
'#ff9900', '#E53935', '#F4511E', '#D81B60',
'#00ACC1', '#1E88E5', '#43A047', '#FFB300',
'#6D4C41', '#FDD835', '#00897B', '#3949AB',
'#5E35B1', '#8E24AA', '#C0CA33', '#039BE5',
'#7CB342', '#004eff'
],
NINETEEN_EIGHTY_FOUR: ['#fc9ca2', '#fb747d', '#fa4c58', '#f92432', '#e30613', '#c70512', '#9f040e', '#77030b', '#500207'],
ATLANTIS: ['#edf2fb', '#e2eafc', '#d7e3fc', '#ccdbfd', '#c1d3fe', '#b6ccfe', '#abc4ff'],
DO_ANDROIDS_DREAM: ['#d8f3dc', '#b7e4c7', '#95d5b2', '#74c69d', '#52b788', '#40916c', '#2d6a4f', '#1b4332',
'#081c15'],
DELOREAN: ['#b98b73', '#cb997e', '#ddbea9', '#ffe8d6', '#d4c7b0', '#b7b7a4', '#a5a58d', '#6b705c', '#3f4238'],
CTHULHU: ['#004c6d', '#006083', '#007599', '#008bad', '#00a1c1', '#00b8d3', '#00cfe3', '#00e7f2', '#00ffff'],
ECTOPLASM: ['#006466', '#065a60', '#0b525b', '#144552', '#1b3a4b', '#212f45', '#272640', '#312244', '#3e1f47', '#4d194d'],
T_MAX_400_FILM: ['#f8f9fa', '#e9ecef', '#dee2e6', '#ced4da', '#adb5bd', '#6c757d', '#495057', '#343a40', '#212529'],
MATRIX: ['#025f27', '#025f27', '#0d7635', '#228c49', '#37a266', '#4eb485', '#68c2a3', '#88d1bc'],
CHARTANA: ['#77BE69', '#FADE2B', '#F24865', '#5694F2',
'#FF9830', '#B876D9'],
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItbGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FycHZpZXctbmcvc3JjL2xpYi91dGlscy9jb2xvci1saWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFOLElBQVksTUFtQlg7QUFuQkQsV0FBWSxNQUFNO0lBQ2hCLCtCQUFxQixDQUFBO0lBQ3JCLG1DQUF5QixDQUFBO0lBQ3pCLDJCQUFpQixDQUFBO0lBQ2pCLDZCQUFtQixDQUFBO0lBQ25CLHlCQUFlLENBQUE7SUFDZiw2QkFBbUIsQ0FBQTtJQUNuQiwyQkFBaUIsQ0FBQTtJQUNqQiwrQkFBcUIsQ0FBQTtJQUNyQiwrQkFBcUIsQ0FBQTtJQUNyQix5QkFBZSxDQUFBO0lBQ2YsMkJBQWlCLENBQUE7SUFDakIsdURBQTZDLENBQUE7SUFDN0MsK0JBQXFCLENBQUE7SUFDckIsaURBQXVDLENBQUE7SUFDdkMsK0JBQXFCLENBQUE7SUFDckIsNkJBQW1CLENBQUE7SUFDbkIsaUNBQXVCLENBQUE7SUFDdkIsMkNBQWlDLENBQUE7QUFDbkMsQ0FBQyxFQW5CVyxNQUFNLEtBQU4sTUFBTSxRQW1CakI7QUFFRCxNQUFNLE9BQU8sUUFBUTtJQXVDbkIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFTLEVBQUUsTUFBYztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixNQUFNLEdBQUcsUUFBUSxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTTtZQUNuQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFN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QUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO1lBQ3hCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNmLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1NB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QVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQTFRTSxjQUFLLEdBQUc7SUFDYixRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7UUFDMUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUN6RixVQUFVLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7UUFDNUcsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDcEcsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQ3hHLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDdkIsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQ3pHLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ2xDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztRQUN2RyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUNsQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7UUFDekcsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDbEMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQ3hHLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ2xDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQzdHLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQzdHLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztRQUN2RyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUNsQyxNQUFNLEVBQUU7UUFDTixTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQzFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVM7UUFDMUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztRQUMxQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQzFDLFNBQVMsRUFBRSxTQUFTO0tBQUM7SUFDdkIsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUN6SCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDdkYsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztRQUN4RyxTQUFTLENBQUM7SUFDWixRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUM3RyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUM1RyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDekgsY0FBYyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDbkgsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUNoRyxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQ25ELFNBQVMsRUFBRSxTQUFTLENBQUM7Q0FDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiAgQ29weXJpZ2h0IDIwMjEgIFNlblggUy5BLlMuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cbmV4cG9ydCBlbnVtIENvbG9ycyB7XG4gIENPSEVTSVZFID0gJ0NPSEVTSVZFJyxcbiAgQ09IRVNJVkVfMiA9ICdDT0hFU0lWRV8yJyxcbiAgQkVMSVpFID0gJ0JFTElaRScsXG4gIFZJUklESVMgPSAnVklSSURJUycsXG4gIE1BR01BID0gJ01BR01BJyxcbiAgSU5GRVJOTyA9ICdJTkZFUk5PJyxcbiAgUExBU01BID0gJ1BMQVNNQScsXG4gIFlMX09SX1JEID0gJ1lMX09SX1JEJyxcbiAgWUxfR05fQlUgPSAnWUxfR05fQlUnLFxuICBCVV9HTiA9ICdCVV9HTicsXG4gIFdBUlAxMCA9ICdXQVJQMTAnLFxuICBOSU5FVEVFTl9FSUdIVFlfRk9VUiA9ICdOSU5FVEVFTl9FSUdIVFlfRk9VUicsXG4gIEFUTEFOVElTID0gJ0FUTEFOVElTJyxcbiAgRE9fQU5EUk9JRFNfRFJFQU0gPSAnRE9fQU5EUk9JRFNfRFJFQU0nLFxuICBERUxPUkVBTiA9ICdERUxPUkVBTicsXG4gIENUSFVMSFUgPSAnQ1RIVUxIVScsXG4gIEVDVE9QTEFTTSA9ICdFQ1RPUExBU00nLFxuICBUX01BWF80MDBfRklMTSA9ICdUX01BWF80MDBfRklMTScsXG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvckxpYiB7XG4gIHN0YXRpYyBjb2xvciA9IHtcbiAgICBDT0hFU0lWRTogWycjRjJEMzU0JywgJyNFNDYxMkYnLCAnI0QzMkMyRScsICcjNkQyNjI3JywgJyM2QzdGNTUnLCAnIzkzNEZDNicsICcjRjA3QTVEJywgJyNFRDgzNzEnLCAnIzk0RTc1MScsXG4gICAgICAnI0M0NTdGNycsICcjOTczQUY3JywgJyNCNkZGN0EnLCAnI0M3RkZENScsICcjOTBFNEQwJywgJyNFMDkyMzQnLCAnI0QyRkY5MScsICcjMTdCMjAxJ10sXG4gICAgQ09IRVNJVkVfMjogWycjNkY2OTRFJywgJyM2NUQwQjInLCAnI0Q4RjU0NicsICcjRkY3MjRCJywgJyNENjUyM0UnLCAnI0Y5RjQ3MCcsICcjRjRCQzc4JywgJyNCMUQ2MzcnLCAnI0ZGQ0ZDOCcsXG4gICAgICAnIzU2Q0RBQicsICcjQ0ZERDIyJywgJyNCM0Y1RDInLCAnIzk3REIyOScsICcjOURDNUVFJywgJyNDRkMwRjUnLCAnI0VERUEyOScsICcjNUVDMDI3JywgJyMzODZDOTQnXSxcbiAgICBCRUxJWkU6IFsnIzU4OTlEQScsICcjRTg3NDNCJywgJyMxOUE5NzknLCAnI0VENEE3QicsICcjOTQ1RUNGJywgJyMxM0E0QjQnLCAnIzUyNURGNCcsICcjQkYzOTlFJywgJyM2Qzg4OTMnLFxuICAgICAgJyNFRTY4NjgnLCAnIzJGNjQ5NyddLFxuICAgIFZJUklESVM6IFsnIzQ0MDE1NCcsICcjNDgxZjcwJywgJyM0NDM5ODMnLCAnIzNiNTI4YicsICcjMzE2ODhlJywgJyMyODdjOGUnLCAnIzIxOTE4YycsICcjMjBhNDg2JywgJyMzNWI3NzknLFxuICAgICAgJyM1ZWM5NjInLCAnIzkwZDc0MycsICcjYzhlMDIwJ10sXG4gICAgTUFHTUE6IFsnIzAwMDAwNCcsICcjMTAwYjJkJywgJyMyYzExNWYnLCAnIzUxMTI3YycsICcjNzIxZjgxJywgJyM5MzJiODAnLCAnI2I3Mzc3OScsICcjZDg0NTZjJywgJyNmMTYwNWQnLFxuICAgICAgJyNmYzg5NjEnLCAnI2ZlYjA3OCcsICcjZmVkNzk5J10sXG4gICAgSU5GRVJOTzogWycjMDAwMDA0JywgJyMxMTBhMzAnLCAnIzMyMGE1ZScsICcjNTcxMDZlJywgJyM3ODFjNmQnLCAnIzlhMjg2NScsICcjYmMzNzU0JywgJyNkODRjM2UnLCAnI2VkNjkyNScsXG4gICAgICAnI2Y5OGUwOScsICcjZmJiNjFhJywgJyNmNGRmNTMnXSxcbiAgICBQTEFTTUE6IFsnIzBkMDg4NycsICcjM2EwNDlhJywgJyM1YzAxYTYnLCAnIzdlMDNhOCcsICcjOWMxNzllJywgJyNiNTJmOGMnLCAnI2NjNDc3OCcsICcjZGU1ZjY1JywgJyNlZDc5NTMnLFxuICAgICAgJyNmODk1NDAnLCAnI2ZkYjQyZicsICcjZmJkNTI0J10sXG4gICAgWUxfT1JfUkQ6IFsnI2ZmZmZjYycsICcjZmZlZGEwJywgJyNmZWQ5NzYnLCAnI2ZlYjI0YycsICcjZmQ4ZDNjJywgJyNmYzRlMmEnLCAnI2UzMWExYycsICcjYmQwMDI2JywgJyM4MDAwMjYnXSxcbiAgICBZTF9HTl9CVTogWycjZmZmZmQ5JywgJyNlZGY4YjEnLCAnI2M3ZTliNCcsICcjN2ZjZGJiJywgJyM0MWI2YzQnLCAnIzFkOTFjMCcsICcjMjI1ZWE4JywgJyMyNTM0OTQnLCAnIzA4MWQ1OCddLFxuICAgIEJVX0dOOiBbJyNmN2ZjZmQnLCAnI2ViZjdmYScsICcjZGNmMmYyJywgJyNjOGVhZTQnLCAnI2FhZGZkMicsICcjODhkMWJjJywgJyM2OGMyYTMnLCAnIzRlYjQ4NScsICcjMzdhMjY2JyxcbiAgICAgICcjMjI4YzQ5JywgJyMwZDc2MzUnLCAnIzAyNWYyNyddLFxuICAgIFdBUlAxMDogW1xuICAgICAgJyNmZjk5MDAnLCAnI0U1MzkzNScsICcjRjQ1MTFFJywgJyNEODFCNjAnLFxuICAgICAgJyMwMEFDQzEnLCAnIzFFODhFNScsICcjNDNBMDQ3JywgJyNGRkIzMDAnLFxuICAgICAgJyM2RDRDNDEnLCAnI0ZERDgzNScsICcjMDA4OTdCJywgJyMzOTQ5QUInLFxuICAgICAgJyM1RTM1QjEnLCAnIzhFMjRBQScsICcjQzBDQTMzJywgJyMwMzlCRTUnLFxuICAgICAgJyM3Q0IzNDInLCAnIzAwNGVmZiddLFxuICAgIE5JTkVURUVOX0VJR0hUWV9GT1VSOiBbJyNmYzljYTInLCAnI2ZiNzQ3ZCcsICcjZmE0YzU4JywgJyNmOTI0MzInLCAnI2UzMDYxMycsICcjYzcwNTEyJywgJyM5ZjA0MGUnLCAnIzc3MDMwYicsICcjNTAwMjA3J10sXG4gICAgQVRMQU5USVM6IFsnI2VkZjJmYicsICcjZTJlYWZjJywgJyNkN2UzZmMnLCAnI2NjZGJmZCcsICcjYzFkM2ZlJywgJyNiNmNjZmUnLCAnI2FiYzRmZiddLFxuICAgIERPX0FORFJPSURTX0RSRUFNOiBbJyNkOGYzZGMnLCAnI2I3ZTRjNycsICcjOTVkNWIyJywgJyM3NGM2OWQnLCAnIzUyYjc4OCcsICcjNDA5MTZjJywgJyMyZDZhNGYnLCAnIzFiNDMzMicsXG4gICAgICAnIzA4MWMxNSddLFxuICAgIERFTE9SRUFOOiBbJyNiOThiNzMnLCAnI2NiOTk3ZScsICcjZGRiZWE5JywgJyNmZmU4ZDYnLCAnI2Q0YzdiMCcsICcjYjdiN2E0JywgJyNhNWE1OGQnLCAnIzZiNzA1YycsICcjM2Y0MjM4J10sXG4gICAgQ1RIVUxIVTogWycjMDA0YzZkJywgJyMwMDYwODMnLCAnIzAwNzU5OScsICcjMDA4YmFkJywgJyMwMGExYzEnLCAnIzAwYjhkMycsICcjMDBjZmUzJywgJyMwMGU3ZjInLCAnIzAwZmZmZiddLFxuICAgIEVDVE9QTEFTTTogWycjMDA2NDY2JywgJyMwNjVhNjAnLCAnIzBiNTI1YicsICcjMTQ0NTUyJywgJyMxYjNhNGInLCAnIzIxMmY0NScsICcjMjcyNjQwJywgJyMzMTIyNDQnLCAnIzNlMWY0NycsICcjNGQxOTRkJ10sXG4gICAgVF9NQVhfNDAwX0ZJTE06IFsnI2Y4ZjlmYScsICcjZTllY2VmJywgJyNkZWUyZTYnLCAnI2NlZDRkYScsICcjYWRiNWJkJywgJyM2Yzc1N2QnLCAnIzQ5NTA1NycsICcjMzQzYTQwJywgJyMyMTI1MjknXSxcbiAgICBNQVRSSVg6IFsnIzAyNWYyNycsICcjMDI1ZjI3JywgJyMwZDc2MzUnLCAnIzIyOGM0OScsICcjMzdhMjY2JywgJyM0ZWI0ODUnLCAnIzY4YzJhMycsICcjODhkMWJjJ10sXG4gICAgQ0hBUlRBTkE6IFsnIzc3QkU2OScsICcjRkFERTJCJywgJyNGMjQ4NjUnLCAnIzU2OTRGMicsXG4gICAgICAnI0ZGOTgzMCcsICcjQjg3NkQ5J10sXG4gIH07XG5cbiAgc3RhdGljIGdldENvbG9yKGk6IG51bWJlciwgc2NoZW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIUNvbG9yTGliLmNvbG9yW3NjaGVtZV0pIHtcbiAgICAgIHNjaGVtZSA9ICdXQVJQMTAnO1xuICAgIH1cbiAgICByZXR1cm4gQ29sb3JMaWIuY29sb3Jbc2NoZW1lXVtpICUgMiA9PT0gMFxuICAgICAgPyBpICUgQ29sb3JMaWIuY29sb3Jbc2NoZW1lXS5sZW5ndGhcbiAgICAgIDogQ29sb3JMaWIuY29sb3Jbc2NoZW1lXS5sZW5ndGggLSBpICUgQ29sb3JMaWIuY29sb3Jbc2NoZW1lXS5sZW5ndGhcbiAgICAgIF07XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29sb3JHcmFkaWVudChpZDogbnVtYmVyLCBzY2hlbWU6IHN0cmluZykge1xuICAgIHJldHVybiBbXG4gICAgICBbMCwgQ29sb3JMaWIudHJhbnNwYXJlbnRpemUoQ29sb3JMaWIuZ2V0Q29sb3IoaWQsIHNjaGVtZSksIDApXSxcbiAgICAgIFsxLCBDb2xvckxpYi50cmFuc3BhcmVudGl6ZShDb2xvckxpYi5nZXRDb2xvcihpZCwgc2NoZW1lKSwgMC43KV1cbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGdldEJsZW5kZWRDb2xvckdyYWRpZW50KGlkOiBudW1iZXIsIHNjaGVtZTogc3RyaW5nLCBiZyA9ICcjMDAwMDAwJykge1xuICAgIHJldHVybiBbXG4gICAgICBbMCwgQ29sb3JMaWIuYmxlbmRfY29sb3JzKGJnLCBDb2xvckxpYi5nZXRDb2xvcihpZCwgc2NoZW1lKSwgMCldLFxuICAgICAgWzEsIENvbG9yTGliLmJsZW5kX2NvbG9ycyhiZywgQ29sb3JMaWIuZ2V0Q29sb3IoaWQsIHNjaGVtZSksIDEpXVxuICAgIF07XG4gIH1cblxuICBzdGF0aWMgaGV4VG9SZ2IoaGV4KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IFtcbiAgICAgIHBhcnNlSW50KHJlc3VsdFsxXSwgMTYpLFxuICAgICAgcGFyc2VJbnQocmVzdWx0WzJdLCAxNiksXG4gICAgICBwYXJzZUludChyZXN1bHRbM10sIDE2KVxuICAgIF0gOiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHRyYW5zcGFyZW50aXplKGNvbG9yLCBhbHBoYSA9IDAuNSk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdyZ2JhKCcgKyBDb2xvckxpYi5oZXhUb1JnYihjb2xvcikuY29uY2F0KGFscGhhKS5qb2luKCcsJykgKyAnKSc7XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGVUcmFuc3BhcmVudENvbG9ycyhudW0sIHNjaGVtZSkge1xuICAgIGNvbnN0IGNvbG9yID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgICAgY29sb3IucHVzaChDb2xvckxpYi50cmFuc3BhcmVudGl6ZShDb2xvckxpYi5nZXRDb2xvcihpLCBzY2hlbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHN0YXRpYyBoc3ZHcmFkaWVudEZyb21SZ2JDb2xvcnMoYzEsIGMyLCBzdGVwcykge1xuICAgIGNvbnN0IGMxaHN2ID0gQ29sb3JMaWIucmdiMmhzdihjMS5yLCBjMS5nLCBjMS5iKTtcbiAgICBjb25zdCBjMmhzdiA9IENvbG9yTGliLnJnYjJoc3YoYzIuciwgYzIuZywgYzIuYik7XG4gICAgYzEuaCA9IGMxaHN2WzBdO1xuICAgIGMxLnMgPSBjMWhzdlsxXTtcbiAgICBjMS52ID0gYzFoc3ZbMl07XG4gICAgYzIuaCA9IGMyaHN2WzBdO1xuICAgIGMyLnMgPSBjMmhzdlsxXTtcbiAgICBjMi52ID0gYzJoc3ZbMl07XG4gICAgY29uc3QgZ3JhZGllbnQgPSBDb2xvckxpYi5oc3ZHcmFkaWVudChjMSwgYzIsIHN0ZXBzKTtcbiAgICBmb3IgKGNvbnN0IGkgaW4gZ3JhZGllbnQpIHtcbiAgICAgIGlmIChncmFkaWVudFtpXSkge1xuICAgICAgICBncmFkaWVudFtpXS5yZ2IgPSBDb2xvckxpYi5oc3YycmdiKGdyYWRpZW50W2ldLmgsIGdyYWRpZW50W2ldLnMsIGdyYWRpZW50W2ldLnYpO1xuICAgICAgICBncmFkaWVudFtpXS5yID0gTWF0aC5mbG9vcihncmFkaWVudFtpXS5yZ2JbMF0pO1xuICAgICAgICBncmFkaWVudFtpXS5nID0gTWF0aC5mbG9vcihncmFkaWVudFtpXS5yZ2JbMV0pO1xuICAgICAgICBncmFkaWVudFtpXS5iID0gTWF0aC5mbG9vcihncmFkaWVudFtpXS5yZ2JbMl0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ3JhZGllbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZ2IyaHN2KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAvLyBOb3JtYWxpemVcbiAgICBjb25zdCBub3JtUiA9IHIgLyAyNTUuMDtcbiAgICBjb25zdCBub3JtRyA9IGcgLyAyNTUuMDtcbiAgICBjb25zdCBub3JtQiA9IGIgLyAyNTUuMDtcbiAgICBjb25zdCBNID0gTWF0aC5tYXgobm9ybVIsIG5vcm1HLCBub3JtQik7XG4gICAgY29uc3QgbSA9IE1hdGgubWluKG5vcm1SLCBub3JtRywgbm9ybUIpO1xuICAgIGNvbnN0IGQgPSBNIC0gbTtcbiAgICBsZXQgaDtcbiAgICBsZXQgcztcbiAgICBsZXQgdjtcbiAgICB2ID0gTTtcbiAgICBpZiAoZCA9PT0gMCkge1xuICAgICAgaCA9IDA7XG4gICAgICBzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyA9IGQgLyB2O1xuICAgICAgc3dpdGNoIChNKSB7XG4gICAgICAgIGNhc2Ugbm9ybVI6XG4gICAgICAgICAgaCA9ICgobm9ybUcgLSBub3JtQikgKyBkICogKG5vcm1HIDwgbm9ybUIgPyA2IDogMCkpIC8gNiAqIGQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugbm9ybUc6XG4gICAgICAgICAgaCA9ICgobm9ybUIgLSBub3JtUikgKyBkICogMikgLyA2ICogZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBub3JtQjpcbiAgICAgICAgICBoID0gKChub3JtUiAtIG5vcm1HKSArIGQgKiA0KSAvIDYgKiBkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2gsIHMsIHZdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaHN2R3JhZGllbnQoYzE6IGFueSwgYzI6IGFueSwgc3RlcHM6IGFueSkge1xuICAgIGNvbnN0IGdyYWRpZW50ID0gbmV3IEFycmF5KHN0ZXBzKTtcbiAgICAvLyBkZXRlcm1pbmUgY2xvY2t3aXNlIGFuZCBjb3VudGVyLWNsb2Nrd2lzZSBkaXN0YW5jZSBiZXR3ZWVuIGh1ZXNcbiAgICBjb25zdCBkaXN0Q0NXID0gKGMxLmggPj0gYzIuaCkgPyBjMS5oIC0gYzIuaCA6IDEgKyBjMS5oIC0gYzIuaDtcbiAgICBjb25zdCBkaXN0Q1cgPSAoYzEuaCA+PSBjMi5oKSA/IDEgKyBjMi5oIC0gYzEuaCA6IGMyLmggLSBjMS5oO1xuICAgIC8vIG1ha2UgZ3JhZGllbnQgZm9yIHRoaXMgcGFydFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHM7IGkrKykge1xuICAgICAgLy8gaW50ZXJwb2xhdGUgaCwgcywgYlxuICAgICAgbGV0IGggPSAoZGlzdENXIDw9IGRpc3RDQ1cpID8gYzEuaCArIChkaXN0Q1cgKiBpIC8gKHN0ZXBzIC0gMSkpIDogYzEuaCAtIChkaXN0Q0NXICogaSAvIChzdGVwcyAtIDEpKTtcbiAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICBoID0gMSArIGg7XG4gICAgICB9XG4gICAgICBpZiAoaCA+IDEpIHtcbiAgICAgICAgaCA9IGggLSAxO1xuICAgICAgfVxuICAgICAgY29uc3QgcyA9ICgxIC0gaSAvIChzdGVwcyAtIDEpKSAqIGMxLnMgKyBpIC8gKHN0ZXBzIC0gMSkgKiBjMi5zO1xuICAgICAgY29uc3QgdiA9ICgxIC0gaSAvIChzdGVwcyAtIDEpKSAqIGMxLnYgKyBpIC8gKHN0ZXBzIC0gMSkgKiBjMi52O1xuICAgICAgLy8gYWRkIHRvIGdyYWRpZW50IGFycmF5XG4gICAgICBncmFkaWVudFtpXSA9IHtoLCBzLCB2fTtcbiAgICB9XG4gICAgcmV0dXJuIGdyYWRpZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaHN2MnJnYihoOiBhbnksIHM6IGFueSwgdjogYW55KSB7XG4gICAgbGV0IHI7XG4gICAgbGV0IGc7XG4gICAgbGV0IGI7XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoaCAqIDYpO1xuICAgIGNvbnN0IGYgPSBoICogNiAtIGk7XG4gICAgY29uc3QgcCA9IHYgKiAoMSAtIHMpO1xuICAgIGNvbnN0IHEgPSB2ICogKDEgLSBmICogcyk7XG4gICAgY29uc3QgdCA9IHYgKiAoMSAtICgxIC0gZikgKiBzKTtcbiAgICBzd2l0Y2ggKGkgJSA2KSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHIgPSB2O1xuICAgICAgICBnID0gdDtcbiAgICAgICAgYiA9IHA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICByID0gcTtcbiAgICAgICAgZyA9IHY7XG4gICAgICAgIGIgPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgciA9IHA7XG4gICAgICAgIGcgPSB2O1xuICAgICAgICBiID0gdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHIgPSBwO1xuICAgICAgICBnID0gcTtcbiAgICAgICAgYiA9IHY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByID0gdDtcbiAgICAgICAgZyA9IHA7XG4gICAgICAgIGIgPSB2O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgciA9IHY7XG4gICAgICAgIGcgPSBwO1xuICAgICAgICBiID0gcTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG4gIH1cblxuICBzdGF0aWMgcmdiMmhleChyLCBnLCBiKSB7XG4gICAgZnVuY3Rpb24gY29tcG9uZW50VG9IZXgoYykge1xuICAgICAgY29uc3QgaGV4ID0gYy50b1N0cmluZygxNik7XG4gICAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleDtcbiAgICB9XG5cbiAgICByZXR1cm4gJyMnICsgY29tcG9uZW50VG9IZXgocikgKyBjb21wb25lbnRUb0hleChnKSArIGNvbXBvbmVudFRvSGV4KGIpO1xuICB9XG5cbiAgc3RhdGljIGJsZW5kX2NvbG9ycyhjb2xvcjEsIGNvbG9yMiwgcGVyY2VudGFnZSkge1xuICAgIC8vIGNoZWNrIGlucHV0XG4gICAgY29sb3IxID0gY29sb3IxIHx8ICcjMDAwMDAwJztcbiAgICBjb2xvcjIgPSBjb2xvcjIgfHwgJyNmZmZmZmYnO1xuICAgIHBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlIHx8IDAuNTtcbiAgICAvLyAxOiB2YWxpZGF0ZSBpbnB1dCwgbWFrZSBzdXJlIHdlIGhhdmUgcHJvdmlkZWQgYSB2YWxpZCBoZXhcbiAgICBpZiAoY29sb3IxLmxlbmd0aCAhPT0gNCAmJiBjb2xvcjEubGVuZ3RoICE9PSA3KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbG9ycyBtdXN0IGJlIHByb3ZpZGVkIGFzIGhleGVzJyk7XG4gICAgfVxuICAgIGlmIChjb2xvcjIubGVuZ3RoICE9PSA0ICYmIGNvbG9yMi5sZW5ndGggIT09IDcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29sb3JzIG11c3QgYmUgcHJvdmlkZWQgYXMgaGV4ZXMnKTtcbiAgICB9XG4gICAgaWYgKHBlcmNlbnRhZ2UgPiAxIHx8IHBlcmNlbnRhZ2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnKTtcbiAgICB9XG4gICAgLy8gMjogY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gY29udmVydCAzIGNoYXIgaGV4IHRvIDYgY2hhciBoZXgsIGVsc2Ugc2xpY2Ugb2ZmIGhhc2hcbiAgICAvLyAgICAgIHRoZSB0aHJlZSBjaGFyYWN0ZXIgaGV4IGlzIGp1c3QgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgNiBoZXggd2hlcmUgZWFjaCBjaGFyYWN0ZXIgaXMgcmVwZWF0ZWRcbiAgICAvLyAgICAgIGllOiAjMDYwID0+ICMwMDY2MDAgKGdyZWVuKVxuICAgIGlmIChjb2xvcjEubGVuZ3RoID09PSA0KSB7XG4gICAgICBjb2xvcjEgPSBjb2xvcjFbMV0gKyBjb2xvcjFbMV0gKyBjb2xvcjFbMl0gKyBjb2xvcjFbMl0gKyBjb2xvcjFbM10gKyBjb2xvcjFbM107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbG9yMSA9IGNvbG9yMS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIGlmIChjb2xvcjIubGVuZ3RoID09PSA0KSB7XG4gICAgICBjb2xvcjIgPSBjb2xvcjJbMV0gKyBjb2xvcjJbMV0gKyBjb2xvcjJbMl0gKyBjb2xvcjJbMl0gKyBjb2xvcjJbM10gKyBjb2xvcjJbM107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbG9yMiA9IGNvbG9yMi5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIC8vIDM6IHdlIGhhdmUgdmFsaWQgaW5wdXQsIGNvbnZlcnQgY29sb3JzIHRvIHJnYlxuICAgIGNvbG9yMSA9IFtwYXJzZUludChjb2xvcjFbMF0gKyBjb2xvcjFbMV0sIDE2KSwgcGFyc2VJbnQoY29sb3IxWzJdICsgY29sb3IxWzNdLCAxNiksIHBhcnNlSW50KGNvbG9yMVs0XSArIGNvbG9yMVs1XSwgMTYpXTtcbiAgICBjb2xvcjIgPSBbcGFyc2VJbnQoY29sb3IyWzBdICsgY29sb3IyWzFdLCAxNiksIHBhcnNlSW50KGNvbG9yMlsyXSArIGNvbG9yMlszXSwgMTYpLCBwYXJzZUludChjb2xvcjJbNF0gKyBjb2xvcjJbNV0sIDE2KV07XG4gICAgLy8gNDogYmxlbmRcbiAgICBjb25zdCBjb2xvcjMgPSBbXG4gICAgICAoMSAtIHBlcmNlbnRhZ2UpICogY29sb3IxWzBdICsgcGVyY2VudGFnZSAqIGNvbG9yMlswXSxcbiAgICAgICgxIC0gcGVyY2VudGFnZSkgKiBjb2xvcjFbMV0gKyBwZXJjZW50YWdlICogY29sb3IyWzFdLFxuICAgICAgKDEgLSBwZXJjZW50YWdlKSAqIGNvbG9yMVsyXSArIHBlcmNlbnRhZ2UgKiBjb2xvcjJbMl1cbiAgICBdO1xuICAgIC8vIHJldHVybiBoZXhcbiAgICByZXR1cm4gJyMnICsgQ29sb3JMaWIuaW50X3RvX2hleChjb2xvcjNbMF0pICsgQ29sb3JMaWIuaW50X3RvX2hleChjb2xvcjNbMV0pICsgQ29sb3JMaWIuaW50X3RvX2hleChjb2xvcjNbMl0pO1xuICB9XG5cbiAgLypcbiAgICAgIGNvbnZlcnQgYSBOdW1iZXIgdG8gYSB0d28gY2hhcmFjdGVyIGhleCBzdHJpbmdcbiAgICAgIG11c3Qgcm91bmQsIG9yIHdlIHdpbGwgZW5kIHVwIHdpdGggbW9yZSBkaWdpdHMgdGhhbiBleHBlY3RlZCAoMilcbiAgICAgIG5vdGU6IGNhbiBhbHNvIHJlc3VsdCBpbiBzaW5nbGUgZGlnaXQsIHdoaWNoIHdpbGwgbmVlZCB0byBiZSBwYWRkZWQgd2l0aCBhIDAgdG8gdGhlIGxlZnRcbiAgICAgIEBwYXJhbTogbnVtICAgICAgICAgPT4gdGhlIG51bWJlciB0byBjb252ZXIgdG8gaGV4XG4gICAgICBAcmV0dXJuczogc3RyaW5nICAgID0+IHRoZSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIG51bWJlclxuICAqL1xuICBzdGF0aWMgaW50X3RvX2hleChudW06IG51bWJlcikge1xuICAgIGxldCBoZXggPSBNYXRoLnJvdW5kKG51bSkudG9TdHJpbmcoMTYpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAxKSB7XG4gICAgICBoZXggPSAnMCcgKyBoZXg7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG4gIH1cbn1cbiJdfQ==