ccc-tnt-psd2ui/npm-packages/mac-v2.4.x/ag-psd/dist-es/helpers.js
2023-07-27 15:04:13 +08:00

317 lines
41 KiB
JavaScript

import { fromByteArray } from 'base64-js';
import { deflate } from 'pako';
export var MOCK_HANDLERS = false;
export var RAW_IMAGE_DATA = false;
export var fromBlendMode = {};
export var toBlendMode = {
'pass': 'pass through',
'norm': 'normal',
'diss': 'dissolve',
'dark': 'darken',
'mul ': 'multiply',
'idiv': 'color burn',
'lbrn': 'linear burn',
'dkCl': 'darker color',
'lite': 'lighten',
'scrn': 'screen',
'div ': 'color dodge',
'lddg': 'linear dodge',
'lgCl': 'lighter color',
'over': 'overlay',
'sLit': 'soft light',
'hLit': 'hard light',
'vLit': 'vivid light',
'lLit': 'linear light',
'pLit': 'pin light',
'hMix': 'hard mix',
'diff': 'difference',
'smud': 'exclusion',
'fsub': 'subtract',
'fdiv': 'divide',
'hue ': 'hue',
'sat ': 'saturation',
'colr': 'color',
'lum ': 'luminosity',
};
Object.keys(toBlendMode).forEach(function (key) { return fromBlendMode[toBlendMode[key]] = key; });
export var layerColors = [
'none', 'red', 'orange', 'yellow', 'green', 'blue', 'violet', 'gray'
];
export var largeAdditionalInfoKeys = [
// from documentation
'LMsk', 'Lr16', 'Lr32', 'Layr', 'Mt16', 'Mt32', 'Mtrn', 'Alph', 'FMsk', 'lnk2', 'FEid', 'FXid', 'PxSD',
// from guessing
'cinf',
];
export function revMap(map) {
var result = {};
Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
return result;
}
export function createEnum(prefix, def, map) {
var rev = revMap(map);
var decode = function (val) {
var value = val.split('.')[1];
if (value && !rev[value])
throw new Error("Unrecognized value for enum: '".concat(val, "'"));
return rev[value] || def;
};
var encode = function (val) {
if (val && !map[val])
throw new Error("Invalid value for enum: '".concat(val, "'"));
return "".concat(prefix, ".").concat(map[val] || map[def]);
};
return { decode: decode, encode: encode };
}
export var ColorSpace;
(function (ColorSpace) {
ColorSpace[ColorSpace["RGB"] = 0] = "RGB";
ColorSpace[ColorSpace["HSB"] = 1] = "HSB";
ColorSpace[ColorSpace["CMYK"] = 2] = "CMYK";
ColorSpace[ColorSpace["Lab"] = 7] = "Lab";
ColorSpace[ColorSpace["Grayscale"] = 8] = "Grayscale";
})(ColorSpace || (ColorSpace = {}));
export var LayerMaskFlags;
(function (LayerMaskFlags) {
LayerMaskFlags[LayerMaskFlags["PositionRelativeToLayer"] = 1] = "PositionRelativeToLayer";
LayerMaskFlags[LayerMaskFlags["LayerMaskDisabled"] = 2] = "LayerMaskDisabled";
LayerMaskFlags[LayerMaskFlags["InvertLayerMaskWhenBlending"] = 4] = "InvertLayerMaskWhenBlending";
LayerMaskFlags[LayerMaskFlags["LayerMaskFromRenderingOtherData"] = 8] = "LayerMaskFromRenderingOtherData";
LayerMaskFlags[LayerMaskFlags["MaskHasParametersAppliedToIt"] = 16] = "MaskHasParametersAppliedToIt";
})(LayerMaskFlags || (LayerMaskFlags = {}));
export var MaskParams;
(function (MaskParams) {
MaskParams[MaskParams["UserMaskDensity"] = 1] = "UserMaskDensity";
MaskParams[MaskParams["UserMaskFeather"] = 2] = "UserMaskFeather";
MaskParams[MaskParams["VectorMaskDensity"] = 4] = "VectorMaskDensity";
MaskParams[MaskParams["VectorMaskFeather"] = 8] = "VectorMaskFeather";
})(MaskParams || (MaskParams = {}));
export var ChannelID;
(function (ChannelID) {
ChannelID[ChannelID["Color0"] = 0] = "Color0";
ChannelID[ChannelID["Color1"] = 1] = "Color1";
ChannelID[ChannelID["Color2"] = 2] = "Color2";
ChannelID[ChannelID["Color3"] = 3] = "Color3";
ChannelID[ChannelID["Transparency"] = -1] = "Transparency";
ChannelID[ChannelID["UserMask"] = -2] = "UserMask";
ChannelID[ChannelID["RealUserMask"] = -3] = "RealUserMask";
})(ChannelID || (ChannelID = {}));
export var Compression;
(function (Compression) {
Compression[Compression["RawData"] = 0] = "RawData";
Compression[Compression["RleCompressed"] = 1] = "RleCompressed";
Compression[Compression["ZipWithoutPrediction"] = 2] = "ZipWithoutPrediction";
Compression[Compression["ZipWithPrediction"] = 3] = "ZipWithPrediction";
})(Compression || (Compression = {}));
export function offsetForChannel(channelId, cmyk) {
switch (channelId) {
case 0 /* ChannelID.Color0 */: return 0;
case 1 /* ChannelID.Color1 */: return 1;
case 2 /* ChannelID.Color2 */: return 2;
case 3 /* ChannelID.Color3 */: return cmyk ? 3 : channelId + 1;
case -1 /* ChannelID.Transparency */: return cmyk ? 4 : 3;
default: return channelId + 1;
}
}
export function clamp(value, min, max) {
return value < min ? min : (value > max ? max : value);
}
export function hasAlpha(data) {
var size = data.width * data.height * 4;
for (var i = 3; i < size; i += 4) {
if (data.data[i] !== 255) {
return true;
}
}
return false;
}
export function resetImageData(_a) {
var data = _a.data;
var buffer = new Uint32Array(data.buffer);
var size = buffer.length | 0;
for (var p = 0; p < size; p = (p + 1) | 0) {
buffer[p] = 0xff000000;
}
}
export function decodeBitmap(input, output, width, height) {
for (var y = 0, p = 0, o = 0; y < height; y++) {
for (var x = 0; x < width;) {
var b = input[o++];
for (var i = 0; i < 8 && x < width; i++, x++) {
var v = b & 0x80 ? 0 : 255;
b = b << 1;
output[p++] = v;
output[p++] = v;
output[p++] = v;
output[p++] = 255;
}
}
}
}
export function writeDataRaw(data, offset, width, height) {
if (!width || !height)
return undefined;
var array = new Uint8Array(width * height);
for (var i = 0; i < array.length; i++) {
array[i] = data.data[i * 4 + offset];
}
return array;
}
export function writeDataRLE(buffer, _a, offsets, large) {
var data = _a.data, width = _a.width, height = _a.height;
if (!width || !height)
return undefined;
var stride = (4 * width) | 0;
var ol = 0;
var o = (offsets.length * (large ? 4 : 2) * height) | 0;
for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
var offset = offsets_1[_i];
for (var y = 0, p = offset | 0; y < height; y++) {
var strideStart = (y * stride) | 0;
var strideEnd = (strideStart + stride) | 0;
var lastIndex = (strideEnd + offset - 4) | 0;
var lastIndex2 = (lastIndex - 4) | 0;
var startOffset = o;
for (p = (strideStart + offset) | 0; p < strideEnd; p = (p + 4) | 0) {
if (p < lastIndex2) {
var value1 = data[p];
p = (p + 4) | 0;
var value2 = data[p];
p = (p + 4) | 0;
var value3 = data[p];
if (value1 === value2 && value1 === value3) {
var count = 3;
while (count < 128 && p < lastIndex && data[(p + 4) | 0] === value1) {
count = (count + 1) | 0;
p = (p + 4) | 0;
}
buffer[o++] = 1 - count;
buffer[o++] = value1;
}
else {
var countIndex = o;
var writeLast = true;
var count = 1;
buffer[o++] = 0;
buffer[o++] = value1;
while (p < lastIndex && count < 128) {
p = (p + 4) | 0;
value1 = value2;
value2 = value3;
value3 = data[p];
if (value1 === value2 && value1 === value3) {
p = (p - 12) | 0;
writeLast = false;
break;
}
else {
count++;
buffer[o++] = value1;
}
}
if (writeLast) {
if (count < 127) {
buffer[o++] = value2;
buffer[o++] = value3;
count += 2;
}
else if (count < 128) {
buffer[o++] = value2;
count++;
p = (p - 4) | 0;
}
else {
p = (p - 8) | 0;
}
}
buffer[countIndex] = count - 1;
}
}
else if (p === lastIndex) {
buffer[o++] = 0;
buffer[o++] = data[p];
}
else { // p === lastIndex2
buffer[o++] = 1;
buffer[o++] = data[p];
p = (p + 4) | 0;
buffer[o++] = data[p];
}
}
var length_1 = o - startOffset;
if (large) {
buffer[ol++] = (length_1 >> 24) & 0xff;
buffer[ol++] = (length_1 >> 16) & 0xff;
}
buffer[ol++] = (length_1 >> 8) & 0xff;
buffer[ol++] = length_1 & 0xff;
}
}
return buffer.slice(0, o);
}
export function writeDataZipWithoutPrediction(_a, offsets) {
var data = _a.data, width = _a.width, height = _a.height;
var size = width * height;
var channel = new Uint8Array(size);
var buffers = [];
var totalLength = 0;
for (var _i = 0, offsets_2 = offsets; _i < offsets_2.length; _i++) {
var offset = offsets_2[_i];
for (var i = 0, o = offset; i < size; i++, o += 4) {
channel[i] = data[o];
}
var buffer = deflate(channel);
buffers.push(buffer);
totalLength += buffer.byteLength;
}
if (buffers.length > 0) {
var buffer = new Uint8Array(totalLength);
var offset = 0;
for (var _b = 0, buffers_1 = buffers; _b < buffers_1.length; _b++) {
var b = buffers_1[_b];
buffer.set(b, offset);
offset += b.byteLength;
}
return buffer;
}
else {
return buffers[0];
}
}
export var createCanvas = function () {
throw new Error('Canvas not initialized, use initializeCanvas method to set up createCanvas method');
};
export var createCanvasFromData = function () {
throw new Error('Canvas not initialized, use initializeCanvas method to set up createCanvasFromData method');
};
var tempCanvas = undefined;
export var createImageData = function (width, height) {
if (!tempCanvas)
tempCanvas = createCanvas(1, 1);
return tempCanvas.getContext('2d').createImageData(width, height);
};
if (typeof document !== 'undefined') {
createCanvas = function (width, height) {
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
return canvas;
};
createCanvasFromData = function (data) {
var image = new Image();
image.src = 'data:image/jpeg;base64,' + fromByteArray(data);
var canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
canvas.getContext('2d').drawImage(image, 0, 0);
return canvas;
};
}
export function initializeCanvas(createCanvasMethod, createCanvasFromDataMethod, createImageDataMethod) {
createCanvas = createCanvasMethod;
createCanvasFromData = createCanvasFromDataMethod || createCanvasFromData;
createImageData = createImageDataMethod || createImageData;
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,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R0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDL0Isa0JBQXdFLEVBQ3hFLDBCQUFvRSxFQUNwRSxxQkFBb0U7SUFFcEUsWUFBWSxHQUFHLGtCQUFrQixDQUFDO0lBQ2xDLG9CQUFvQixHQUFHLDBCQUEwQixJQUFJLG9CQUFvQixDQUFDO0lBQzFFLGVBQWUsR0FBRyxxQkFBcUIsSUFBSSxlQUFlLENBQUM7QUFDNUQsQ0FBQyIsImZpbGUiOiJoZWxwZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbUJ5dGVBcnJheSB9IGZyb20gJ2Jhc2U2NC1qcyc7XG5pbXBvcnQgeyBkZWZsYXRlIH0gZnJvbSAncGFrbyc7XG5pbXBvcnQgeyBMYXllciwgQmxlbmRNb2RlLCBMYXllckNvbG9yIH0gZnJvbSAnLi9wc2QnO1xuXG5leHBvcnQgY29uc3QgTU9DS19IQU5ETEVSUyA9IGZhbHNlO1xuZXhwb3J0IGNvbnN0IFJBV19JTUFHRV9EQVRBID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBmcm9tQmxlbmRNb2RlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5leHBvcnQgY29uc3QgdG9CbGVuZE1vZGU6IHsgW2tleTogc3RyaW5nXTogQmxlbmRNb2RlIH0gPSB7XG5cdCdwYXNzJzogJ3Bhc3MgdGhyb3VnaCcsXG5cdCdub3JtJzogJ25vcm1hbCcsXG5cdCdkaXNzJzogJ2Rpc3NvbHZlJyxcblx0J2RhcmsnOiAnZGFya2VuJyxcblx0J211bCAnOiAnbXVsdGlwbHknLFxuXHQnaWRpdic6ICdjb2xvciBidXJuJyxcblx0J2xicm4nOiAnbGluZWFyIGJ1cm4nLFxuXHQnZGtDbCc6ICdkYXJrZXIgY29sb3InLFxuXHQnbGl0ZSc6ICdsaWdodGVuJyxcblx0J3Njcm4nOiAnc2NyZWVuJyxcblx0J2RpdiAnOiAnY29sb3IgZG9kZ2UnLFxuXHQnbGRkZyc6ICdsaW5lYXIgZG9kZ2UnLFxuXHQnbGdDbCc6ICdsaWdodGVyIGNvbG9yJyxcblx0J292ZXInOiAnb3ZlcmxheScsXG5cdCdzTGl0JzogJ3NvZnQgbGlnaHQnLFxuXHQnaExpdCc6ICdoYXJkIGxpZ2h0Jyxcblx0J3ZMaXQnOiAndml2aWQgbGlnaHQnLFxuXHQnbExpdCc6ICdsaW5lYXIgbGlnaHQnLFxuXHQncExpdCc6ICdwaW4gbGlnaHQnLFxuXHQnaE1peCc6ICdoYXJkIG1peCcsXG5cdCdkaWZmJzogJ2RpZmZlcmVuY2UnLFxuXHQnc211ZCc6ICdleGNsdXNpb24nLFxuXHQnZnN1Yic6ICdzdWJ0cmFjdCcsXG5cdCdmZGl2JzogJ2RpdmlkZScsXG5cdCdodWUgJzogJ2h1ZScsXG5cdCdzYXQgJzogJ3NhdHVyYXRpb24nLFxuXHQnY29scic6ICdjb2xvcicsXG5cdCdsdW0gJzogJ2x1bWlub3NpdHknLFxufTtcblxuT2JqZWN0LmtleXModG9CbGVuZE1vZGUpLmZvckVhY2goa2V5ID0+IGZyb21CbGVuZE1vZGVbdG9CbGVuZE1vZGVba2V5XV0gPSBrZXkpO1xuXG5leHBvcnQgY29uc3QgbGF5ZXJDb2xvcnM6IExheWVyQ29sb3JbXSA9IFtcblx0J25vbmUnLCAncmVkJywgJ29yYW5nZScsICd5ZWxsb3cnLCAnZ3JlZW4nLCAnYmx1ZScsICd2aW9sZXQnLCAnZ3JheSdcbl07XG5cbmV4cG9ydCBjb25zdCBsYXJnZUFkZGl0aW9uYWxJbmZvS2V5cyA9IFtcblx0Ly8gZnJvbSBkb2N1bWVudGF0aW9uXG5cdCdMTXNrJywgJ0xyMTYnLCAnTHIzMicsICdMYXlyJywgJ010MTYnLCAnTXQzMicsICdNdHJuJywgJ0FscGgnLCAnRk1zaycsICdsbmsyJywgJ0ZFaWQnLCAnRlhpZCcsICdQeFNEJyxcblx0Ly8gZnJvbSBndWVzc2luZ1xuXHQnY2luZicsXG5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpY3Qge1xuXHRba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZNYXAobWFwOiBEaWN0KSB7XG5cdGNvbnN0IHJlc3VsdDogRGljdCA9IHt9O1xuXHRPYmplY3Qua2V5cyhtYXApLmZvckVhY2goa2V5ID0+IHJlc3VsdFttYXBba2V5XV0gPSBrZXkpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW51bTxUPihwcmVmaXg6IHN0cmluZywgZGVmOiBzdHJpbmcsIG1hcDogRGljdCkge1xuXHRjb25zdCByZXYgPSByZXZNYXAobWFwKTtcblx0Y29uc3QgZGVjb2RlID0gKHZhbDogc3RyaW5nKTogVCA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSB2YWwuc3BsaXQoJy4nKVsxXTtcblx0XHRpZiAodmFsdWUgJiYgIXJldlt2YWx1ZV0pIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIHZhbHVlIGZvciBlbnVtOiAnJHt2YWx9J2ApO1xuXHRcdHJldHVybiAocmV2W3ZhbHVlXSBhcyBhbnkpIHx8IGRlZjtcblx0fTtcblx0Y29uc3QgZW5jb2RlID0gKHZhbDogVCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG5cdFx0aWYgKHZhbCAmJiAhbWFwW3ZhbCBhcyBhbnldKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIGVudW06ICcke3ZhbH0nYCk7XG5cdFx0cmV0dXJuIGAke3ByZWZpeH0uJHttYXBbdmFsIGFzIGFueV0gfHwgbWFwW2RlZl19YDtcblx0fTtcblx0cmV0dXJuIHsgZGVjb2RlLCBlbmNvZGUgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQ29sb3JTcGFjZSB7XG5cdFJHQiA9IDAsXG5cdEhTQiA9IDEsXG5cdENNWUsgPSAyLFxuXHRMYWIgPSA3LFxuXHRHcmF5c2NhbGUgPSA4LFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBMYXllck1hc2tGbGFncyB7XG5cdFBvc2l0aW9uUmVsYXRpdmVUb0xheWVyID0gMSxcblx0TGF5ZXJNYXNrRGlzYWJsZWQgPSAyLFxuXHRJbnZlcnRMYXllck1hc2tXaGVuQmxlbmRpbmcgPSA0LCAvLyBvYnNvbGV0ZVxuXHRMYXllck1hc2tGcm9tUmVuZGVyaW5nT3RoZXJEYXRhID0gOCxcblx0TWFza0hhc1BhcmFtZXRlcnNBcHBsaWVkVG9JdCA9IDE2LFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBNYXNrUGFyYW1zIHtcblx0VXNlck1hc2tEZW5zaXR5ID0gMSxcblx0VXNlck1hc2tGZWF0aGVyID0gMixcblx0VmVjdG9yTWFza0RlbnNpdHkgPSA0LFxuXHRWZWN0b3JNYXNrRmVhdGhlciA9IDgsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIENoYW5uZWxJRCB7XG5cdENvbG9yMCA9IDAsIC8vIHJlZCAocmdiKSAvIGN5YW4gKGNteWspXG5cdENvbG9yMSA9IDEsIC8vIGdyZWVuIChyZ2IpIC8gbWFnZW50YSAoY215aylcblx0Q29sb3IyID0gMiwgLy8gYmx1ZSAocmdiKSAvIHllbGxvdyAoY215aylcblx0Q29sb3IzID0gMywgLy8gLSAocmdiKSAvIGJsYWNrIChjbXlrKVxuXHRUcmFuc3BhcmVuY3kgPSAtMSxcblx0VXNlck1hc2sgPSAtMixcblx0UmVhbFVzZXJNYXNrID0gLTMsXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIENvbXByZXNzaW9uIHtcblx0UmF3RGF0YSA9IDAsXG5cdFJsZUNvbXByZXNzZWQgPSAxLFxuXHRaaXBXaXRob3V0UHJlZGljdGlvbiA9IDIsXG5cdFppcFdpdGhQcmVkaWN0aW9uID0gMyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsRGF0YSB7XG5cdGNoYW5uZWxJZDogQ2hhbm5lbElEO1xuXHRjb21wcmVzc2lvbjogQ29tcHJlc3Npb247XG5cdGJ1ZmZlcjogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblx0bGVuZ3RoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm91bmRzIHtcblx0dG9wOiBudW1iZXI7XG5cdGxlZnQ6IG51bWJlcjtcblx0cmlnaHQ6IG51bWJlcjtcblx0Ym90dG9tOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJDaGFubmVsRGF0YSB7XG5cdGxheWVyOiBMYXllcjtcblx0Y2hhbm5lbHM6IENoYW5uZWxEYXRhW107XG5cdHRvcDogbnVtYmVyO1xuXHRsZWZ0OiBudW1iZXI7XG5cdHJpZ2h0OiBudW1iZXI7XG5cdGJvdHRvbTogbnVtYmVyO1xuXHRtYXNrPzogQm91bmRzO1xufVxuXG5leHBvcnQgdHlwZSBQaXhlbEFycmF5ID0gVWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsRGF0YSB7XG5cdGRhdGE6IFBpeGVsQXJyYXk7XG5cdHdpZHRoOiBudW1iZXI7XG5cdGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2Zmc2V0Rm9yQ2hhbm5lbChjaGFubmVsSWQ6IENoYW5uZWxJRCwgY215azogYm9vbGVhbikge1xuXHRzd2l0Y2ggKGNoYW5uZWxJZCkge1xuXHRcdGNhc2UgQ2hhbm5lbElELkNvbG9yMDogcmV0dXJuIDA7XG5cdFx0Y2FzZSBDaGFubmVsSUQuQ29sb3IxOiByZXR1cm4gMTtcblx0XHRjYXNlIENoYW5uZWxJRC5Db2xvcjI6IHJldHVybiAyO1xuXHRcdGNhc2UgQ2hhbm5lbElELkNvbG9yMzogcmV0dXJuIGNteWsgPyAzIDogY2hhbm5lbElkICsgMTtcblx0XHRjYXNlIENoYW5uZWxJRC5UcmFuc3BhcmVuY3k6IHJldHVybiBjbXlrID8gNCA6IDM7XG5cdFx0ZGVmYXVsdDogcmV0dXJuIGNoYW5uZWxJZCArIDE7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuXHRyZXR1cm4gdmFsdWUgPCBtaW4gPyBtaW4gOiAodmFsdWUgPiBtYXggPyBtYXggOiB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbHBoYShkYXRhOiBQaXhlbERhdGEpIHtcblx0Y29uc3Qgc2l6ZSA9IGRhdGEud2lkdGggKiBkYXRhLmhlaWdodCAqIDQ7XG5cblx0Zm9yIChsZXQgaSA9IDM7IGkgPCBzaXplOyBpICs9IDQpIHtcblx0XHRpZiAoZGF0YS5kYXRhW2ldICE9PSAyNTUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0SW1hZ2VEYXRhKHsgZGF0YSB9OiBQaXhlbERhdGEpIHtcblx0Y29uc3QgYnVmZmVyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyKTtcblx0Y29uc3Qgc2l6ZSA9IGJ1ZmZlci5sZW5ndGggfCAwO1xuXG5cdGZvciAobGV0IHAgPSAwOyBwIDwgc2l6ZTsgcCA9IChwICsgMSkgfCAwKSB7XG5cdFx0YnVmZmVyW3BdID0gMHhmZjAwMDAwMDtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQml0bWFwKGlucHV0OiBQaXhlbEFycmF5LCBvdXRwdXQ6IFBpeGVsQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG5cdGZvciAobGV0IHkgPSAwLCBwID0gMCwgbyA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuXHRcdGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7KSB7XG5cdFx0XHRsZXQgYiA9IGlucHV0W28rK107XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgOCAmJiB4IDwgd2lkdGg7IGkrKywgeCsrKSB7XG5cdFx0XHRcdGNvbnN0IHYgPSBiICYgMHg4MCA/IDAgOiAyNTU7XG5cdFx0XHRcdGIgPSBiIDw8IDE7XG5cdFx0XHRcdG91dHB1dFtwKytdID0gdjtcblx0XHRcdFx0b3V0cHV0W3ArK10gPSB2O1xuXHRcdFx0XHRvdXRwdXRbcCsrXSA9IHY7XG5cdFx0XHRcdG91dHB1dFtwKytdID0gMjU1O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEYXRhUmF3KGRhdGE6IFBpeGVsRGF0YSwgb2Zmc2V0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG5cdGlmICghd2lkdGggfHwgIWhlaWdodClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRhcnJheVtpXSA9IGRhdGEuZGF0YVtpICogNCArIG9mZnNldF07XG5cdH1cblxuXHRyZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZURhdGFSTEUoYnVmZmVyOiBVaW50OEFycmF5LCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfTogUGl4ZWxEYXRhLCBvZmZzZXRzOiBudW1iZXJbXSwgbGFyZ2U6IGJvb2xlYW4pIHtcblx0aWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHN0cmlkZSA9ICg0ICogd2lkdGgpIHwgMDtcblxuXHRsZXQgb2wgPSAwO1xuXHRsZXQgbyA9IChvZmZzZXRzLmxlbmd0aCAqIChsYXJnZSA/IDQgOiAyKSAqIGhlaWdodCkgfCAwO1xuXG5cdGZvciAoY29uc3Qgb2Zmc2V0IG9mIG9mZnNldHMpIHtcblx0XHRmb3IgKGxldCB5ID0gMCwgcCA9IG9mZnNldCB8IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuXHRcdFx0Y29uc3Qgc3RyaWRlU3RhcnQgPSAoeSAqIHN0cmlkZSkgfCAwO1xuXHRcdFx0Y29uc3Qgc3RyaWRlRW5kID0gKHN0cmlkZVN0YXJ0ICsgc3RyaWRlKSB8IDA7XG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSAoc3RyaWRlRW5kICsgb2Zmc2V0IC0gNCkgfCAwO1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4MiA9IChsYXN0SW5kZXggLSA0KSB8IDA7XG5cdFx0XHRjb25zdCBzdGFydE9mZnNldCA9IG87XG5cblx0XHRcdGZvciAocCA9IChzdHJpZGVTdGFydCArIG9mZnNldCkgfCAwOyBwIDwgc3RyaWRlRW5kOyBwID0gKHAgKyA0KSB8IDApIHtcblx0XHRcdFx0aWYgKHAgPCBsYXN0SW5kZXgyKSB7XG5cdFx0XHRcdFx0bGV0IHZhbHVlMSA9IGRhdGFbcF07XG5cdFx0XHRcdFx0cCA9IChwICsgNCkgfCAwO1xuXHRcdFx0XHRcdGxldCB2YWx1ZTIgPSBkYXRhW3BdO1xuXHRcdFx0XHRcdHAgPSAocCArIDQpIHwgMDtcblx0XHRcdFx0XHRsZXQgdmFsdWUzID0gZGF0YVtwXTtcblxuXHRcdFx0XHRcdGlmICh2YWx1ZTEgPT09IHZhbHVlMiAmJiB2YWx1ZTEgPT09IHZhbHVlMykge1xuXHRcdFx0XHRcdFx0bGV0IGNvdW50ID0gMztcblxuXHRcdFx0XHRcdFx0d2hpbGUgKGNvdW50IDwgMTI4ICYmIHAgPCBsYXN0SW5kZXggJiYgZGF0YVsocCArIDQpIHwgMF0gPT09IHZhbHVlMSkge1xuXHRcdFx0XHRcdFx0XHRjb3VudCA9IChjb3VudCArIDEpIHwgMDtcblx0XHRcdFx0XHRcdFx0cCA9IChwICsgNCkgfCAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRidWZmZXJbbysrXSA9IDEgLSBjb3VudDtcblx0XHRcdFx0XHRcdGJ1ZmZlcltvKytdID0gdmFsdWUxO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb3VudEluZGV4ID0gbztcblx0XHRcdFx0XHRcdGxldCB3cml0ZUxhc3QgPSB0cnVlO1xuXHRcdFx0XHRcdFx0bGV0IGNvdW50ID0gMTtcblx0XHRcdFx0XHRcdGJ1ZmZlcltvKytdID0gMDtcblx0XHRcdFx0XHRcdGJ1ZmZlcltvKytdID0gdmFsdWUxO1xuXG5cdFx0XHRcdFx0XHR3aGlsZSAocCA8IGxhc3RJbmRleCAmJiBjb3VudCA8IDEyOCkge1xuXHRcdFx0XHRcdFx0XHRwID0gKHAgKyA0KSB8IDA7XG5cdFx0XHRcdFx0XHRcdHZhbHVlMSA9IHZhbHVlMjtcblx0XHRcdFx0XHRcdFx0dmFsdWUyID0gdmFsdWUzO1xuXHRcdFx0XHRcdFx0XHR2YWx1ZTMgPSBkYXRhW3BdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZTEgPT09IHZhbHVlMiAmJiB2YWx1ZTEgPT09IHZhbHVlMykge1xuXHRcdFx0XHRcdFx0XHRcdHAgPSAocCAtIDEyKSB8IDA7XG5cdFx0XHRcdFx0XHRcdFx0d3JpdGVMYXN0ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0XHRcdFx0XHRidWZmZXJbbysrXSA9IHZhbHVlMTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAod3JpdGVMYXN0KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjb3VudCA8IDEyNykge1xuXHRcdFx0XHRcdFx0XHRcdGJ1ZmZlcltvKytdID0gdmFsdWUyO1xuXHRcdFx0XHRcdFx0XHRcdGJ1ZmZlcltvKytdID0gdmFsdWUzO1xuXHRcdFx0XHRcdFx0XHRcdGNvdW50ICs9IDI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoY291bnQgPCAxMjgpIHtcblx0XHRcdFx0XHRcdFx0XHRidWZmZXJbbysrXSA9IHZhbHVlMjtcblx0XHRcdFx0XHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHRcdFx0XHRcdHAgPSAocCAtIDQpIHwgMDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRwID0gKHAgLSA4KSB8IDA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnVmZmVyW2NvdW50SW5kZXhdID0gY291bnQgLSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwID09PSBsYXN0SW5kZXgpIHtcblx0XHRcdFx0XHRidWZmZXJbbysrXSA9IDA7XG5cdFx0XHRcdFx0YnVmZmVyW28rK10gPSBkYXRhW3BdO1xuXHRcdFx0XHR9IGVsc2UgeyAvLyBwID09PSBsYXN0SW5kZXgyXG5cdFx0XHRcdFx0YnVmZmVyW28rK10gPSAxO1xuXHRcdFx0XHRcdGJ1ZmZlcltvKytdID0gZGF0YVtwXTtcblx0XHRcdFx0XHRwID0gKHAgKyA0KSB8IDA7XG5cdFx0XHRcdFx0YnVmZmVyW28rK10gPSBkYXRhW3BdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGxlbmd0aCA9IG8gLSBzdGFydE9mZnNldDtcblxuXHRcdFx0aWYgKGxhcmdlKSB7XG5cdFx0XHRcdGJ1ZmZlcltvbCsrXSA9IChsZW5ndGggPj4gMjQpICYgMHhmZjtcblx0XHRcdFx0YnVmZmVyW29sKytdID0gKGxlbmd0aCA+PiAxNikgJiAweGZmO1xuXHRcdFx0fVxuXG5cdFx0XHRidWZmZXJbb2wrK10gPSAobGVuZ3RoID4+IDgpICYgMHhmZjtcblx0XHRcdGJ1ZmZlcltvbCsrXSA9IGxlbmd0aCAmIDB4ZmY7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBvKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRGF0YVppcFdpdGhvdXRQcmVkaWN0aW9uKHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9OiBQaXhlbERhdGEsIG9mZnNldHM6IG51bWJlcltdKSB7XG5cdGNvbnN0IHNpemUgPSB3aWR0aCAqIGhlaWdodDtcblx0Y29uc3QgY2hhbm5lbCA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuXHRjb25zdCBidWZmZXJzOiBVaW50OEFycmF5W10gPSBbXTtcblx0bGV0IHRvdGFsTGVuZ3RoID0gMDtcblxuXHRmb3IgKGNvbnN0IG9mZnNldCBvZiBvZmZzZXRzKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG8gPSBvZmZzZXQ7IGkgPCBzaXplOyBpKyssIG8gKz0gNCkge1xuXHRcdFx0Y2hhbm5lbFtpXSA9IGRhdGFbb107XG5cdFx0fVxuXG5cdFx0Y29uc3QgYnVmZmVyID0gZGVmbGF0ZShjaGFubmVsKTtcblx0XHRidWZmZXJzLnB1c2goYnVmZmVyKTtcblx0XHR0b3RhbExlbmd0aCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcblx0fVxuXG5cdGlmIChidWZmZXJzLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG5cdFx0bGV0IG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKGNvbnN0IGIgb2YgYnVmZmVycykge1xuXHRcdFx0YnVmZmVyLnNldChiLCBvZmZzZXQpO1xuXHRcdFx0b2Zmc2V0ICs9IGIuYnl0ZUxlbmd0aDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZmVyO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBidWZmZXJzWzBdO1xuXHR9XG59XG5cbmV4cG9ydCBsZXQgY3JlYXRlQ2FudmFzOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IEhUTUxDYW52YXNFbGVtZW50ID0gKCkgPT4ge1xuXHR0aHJvdyBuZXcgRXJyb3IoJ0NhbnZhcyBub3QgaW5pdGlhbGl6ZWQsIHVzZSBpbml0aWFsaXplQ2FudmFzIG1ldGhvZCB0byBzZXQgdXAgY3JlYXRlQ2FudmFzIG1ldGhvZCcpO1xufTtcblxuZXhwb3J0IGxldCBjcmVhdGVDYW52YXNGcm9tRGF0YTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IEhUTUxDYW52YXNFbGVtZW50ID0gKCkgPT4ge1xuXHR0aHJvdyBuZXcgRXJyb3IoJ0NhbnZhcyBub3QgaW5pdGlhbGl6ZWQsIHVzZSBpbml0aWFsaXplQ2FudmFzIG1ldGhvZCB0byBzZXQgdXAgY3JlYXRlQ2FudmFzRnJvbURhdGEgbWV0aG9kJyk7XG59O1xuXG5sZXQgdGVtcENhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBsZXQgY3JlYXRlSW1hZ2VEYXRhOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IEltYWdlRGF0YSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG5cdGlmICghdGVtcENhbnZhcykgdGVtcENhbnZhcyA9IGNyZWF0ZUNhbnZhcygxLCAxKTtcblx0cmV0dXJuIHRlbXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnKSEuY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xufTtcblxuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Y3JlYXRlQ2FudmFzID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcblx0XHRjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblx0XHRjYW52YXMud2lkdGggPSB3aWR0aDtcblx0XHRjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHJldHVybiBjYW52YXM7XG5cdH07XG5cblx0Y3JlYXRlQ2FudmFzRnJvbURhdGEgPSAoZGF0YSkgPT4ge1xuXHRcdGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG5cdFx0aW1hZ2Uuc3JjID0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIGZyb21CeXRlQXJyYXkoZGF0YSk7XG5cdFx0Y29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cdFx0Y2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG5cdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblx0XHRjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSEuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcblx0XHRyZXR1cm4gY2FudmFzO1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNhbnZhcyhcblx0Y3JlYXRlQ2FudmFzTWV0aG9kOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IEhUTUxDYW52YXNFbGVtZW50LFxuXHRjcmVhdGVDYW52YXNGcm9tRGF0YU1ldGhvZD86IChkYXRhOiBVaW50OEFycmF5KSA9PiBIVE1MQ2FudmFzRWxlbWVudCxcblx0Y3JlYXRlSW1hZ2VEYXRhTWV0aG9kPzogKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiBJbWFnZURhdGFcbikge1xuXHRjcmVhdGVDYW52YXMgPSBjcmVhdGVDYW52YXNNZXRob2Q7XG5cdGNyZWF0ZUNhbnZhc0Zyb21EYXRhID0gY3JlYXRlQ2FudmFzRnJvbURhdGFNZXRob2QgfHwgY3JlYXRlQ2FudmFzRnJvbURhdGE7XG5cdGNyZWF0ZUltYWdlRGF0YSA9IGNyZWF0ZUltYWdlRGF0YU1ldGhvZCB8fCBjcmVhdGVJbWFnZURhdGE7XG59XG4iXSwic291cmNlUm9vdCI6IkM6XFxQcm9qZWN0c1xcZ2l0aHViXFxhZy1wc2RcXHNyYyJ9