@jsenv/terminal-recorder
Version:
Record terminal output as .svg, .gif, .webm, .mp4
400 lines (367 loc) • 100 kB
JavaScript
// https://github.com/incubated-geek-cc/video-to-GIF/blob/main/js/GIFEncoder.js
// https://github.com/jnordberg/gif.js
// https://github.com/jnordberg/gif.js/blob/master/src/GIFEncoder.js
import { createLzwEncoder } from "/lzw_encoder.js";
import { createNeuQuant } from "/neuquant.js";
export const createGifEncoder = ({
width,
height,
/*
* Sets quality of color quantization (conversion of images to the maximum 256
* colors allowed by the GIF specification). Lower values (minimum = 1)
* produce better colors, but slow processing significantly. 10 is the
* default, and produces good color mapping at reasonable speeds. Values
* greater than 20 do not yield significant improvements in speed.
*/
quality = 10,
/**
* Sets the number of times the set of GIF frames should be played.
* -1 means no repeat, 0 means indefinitely
*
* int number of iterations.
*/
repeat = -1,
comment = "",
}) => {
const byteArray = [];
const writeByte = (data) => {
byteArray.push(data);
};
const writeUTFBytes = (string) => {
let i = 0;
while (i < string.length) {
writeByte(string.charCodeAt(i));
i++;
}
};
const writeBytes = (array, offset = 0, length = array.length) => {
let i = offset;
while (i < length) {
writeByte(array[i]);
i++;
}
};
let charCodeMap;
const fillCharCodes = () => {
if (charCodeMap) {
return;
}
charCodeMap = new Map();
let i = 0;
while (i < 256) {
charCodeMap.set(i, String.fromCharCode(i));
i++;
}
};
const readAsBinaryString = () => {
fillCharCodes();
let binaryString = "";
for (const byte of byteArray) {
binaryString += charCodeMap.get(byte);
}
return binaryString;
};
let transparent = null; // transparent color if given
let transIndex = 0; // transparent index in color table
let colorDepth; // number of bit planes
let usedEntry = []; // active palette entries
let palSize = 7; // color table size (bits-1)
let dispose = -1; // disposal code (-1 = use default
let firstFrame = true;
let finished = false;
const writeShort = (pValue) => {
writeByte(pValue & 0xff);
writeByte((pValue >> 8) & 0xff);
};
const encoder = {
/**
* Sets the GIF frame disposal code for the last added frame and any
* subsequent frames. Default is 0 if no transparent color has been set,
* otherwise 2.
* @param code
* int disposal code.
*/
setDispose: (code) => {
if (code >= 0) dispose = code;
},
/**
* Sets the transparent color for the last added frame and any subsequent
* frames. Since all colors are subject to modification in the quantization
* process, the color in the final palette for each frame closest to the given
* color becomes the transparent color for that frame. May be set to null to
* indicate no transparent color.
* @param
* Color to be treated as transparent on display.
*/
setTransparent: (c) => {
transparent = c;
},
/**
* The addFrame method takes an incoming BitmapData object to create each frames
* @param
* BitmapData object to be treated as a GIF's frame
*/
addFrame: (context, options) => {
let delay = 0;
if (options) {
if (options.quality) {
quality = options.quality < 1 ? 1 : options.quality;
}
if (options.delay) {
delay = Math.round(options.delay / 10);
}
}
const canvas = context.canvas;
try {
const imageData = context.getImageData(
0,
0,
canvas.width,
canvas.height,
).data;
const pixels = [];
// build pixels
{
var count = 0;
let y = 0;
while (y < height) {
let x = 0;
while (x < width) {
const b = y * width * 4 + x * 4;
pixels[count++] = imageData[b];
pixels[count++] = imageData[b + 1];
pixels[count++] = imageData[b + 2];
x++;
}
y++;
}
}
let colorTab;
let indexedPixels = [];
// analyze pixels ( build color table & map pixels)
{
var len = pixels.length;
var nPix = len / 3;
const neuQuant = createNeuQuant({
pixels,
len,
sample: quality,
});
// initialize quantizer
colorTab = neuQuant.process(); // create reduced palette
// map image pixels to new palette
var k = 0;
for (var j = 0; j < nPix; j++) {
var index = neuQuant.map(
pixels[k++] & 0xff,
pixels[k++] & 0xff,
pixels[k++] & 0xff,
);
usedEntry[index] = true;
indexedPixels[j] = index;
}
pixels.length = 0;
colorDepth = 8;
palSize = 7;
// get closest match to transparent color if specified
if (transparent !== null) {
/**
* Returns index of palette color closest to c
*/
const findClosest = (c) => {
var r = (c & 0xff0000) >> 16;
var g = (c & 0x00ff00) >> 8;
var b = c & 0x0000ff;
var minpos = 0;
var dmin = 256 * 256 * 256;
var len = colorTab.length;
for (var i = 0; i < len; ) {
var dr = r - (colorTab[i++] & 0xff);
var dg = g - (colorTab[i++] & 0xff);
var db = b - (colorTab[i] & 0xff);
var d = dr * dr + dg * dg + db * db;
var index = i / 3;
if (usedEntry[index] && d < dmin) {
dmin = d;
minpos = index;
}
i++;
}
return minpos;
};
transIndex = colorTab === null ? -1 : findClosest(transparent);
}
}
const writePalette = () => {
writeBytes(colorTab);
var n = 3 * 256 - colorTab.length;
for (var i = 0; i < n; i++) writeByte(0);
};
if (firstFrame) {
// write logical screen descriptior
{
// logical screen size
writeShort(width);
writeShort(height);
// packed fields
writeByte(
0x80 | // 1 : global color table flag = 1 (gct used)
0x70 | // 2-4 : color resolution = 7
0x00 | // 5 : gct sort flag = 0
palSize,
); // 6-8 : gct size
writeByte(0); // background color index
writeByte(0); // pixel aspect ratio - assume 1:1
}
// write palette
writePalette(); // global color table
// Writes Netscape application extension to define repeat count.
if (repeat >= 0) {
writeByte(0x21); // extension introducer
writeByte(0xff); // app extension label
writeByte(11); // block size
writeUTFBytes("NETSCAPE2.0"); // app id + auth code
writeByte(3); // sub-block size
writeByte(1); // loop sub-block id
writeShort(repeat); // loop count (extra iterations, 0=repeat forever)
writeByte(0); // block terminator
}
}
// write graphic control extension
{
writeByte(0x21); // extension introducer
writeByte(0xf9); // GCE label
writeByte(4); // data block size
var transp;
var disp;
if (transparent === null) {
transp = 0;
disp = 0; // dispose = no action
} else {
transp = 1;
disp = 2; // force clear if using transparent color
}
if (dispose >= 0) {
disp = dispose & 7; // user override
}
disp <<= 2;
// packed fields
writeByte(
0 | // 1:3 reserved
disp | // 4:6 disposal
0 | // 7 user input - 0 = none
transp,
); // 8 transparency flag
writeShort(delay); // delay x 1/100 sec
writeByte(transIndex); // transparent color index
writeByte(0); // block terminator
}
// write comment
if (comment !== "") {
writeByte(0x21); // extension introducer
writeByte(0xfe); // comment label
writeByte(comment.length); // Block Size (s)
writeUTFBytes(comment);
writeByte(0); // block terminator
}
// write image descriptor
{
writeByte(0x2c); // image separator
writeShort(0); // image position x,y = 0,0
writeShort(0);
writeShort(width); // image size
writeShort(height);
// packed fields
if (firstFrame) {
// no LCT - GCT is used for first (or only) frame
writeByte(0);
} else {
// specify normal LCT
writeByte(
0x80 | // 1 local color table 1=yes
0 | // 2 interlace - 0=no
0 | // 3 sorted - 0=no
0 | // 4-5 reserved
palSize,
); // 6-8 size of color table
}
}
if (!firstFrame) {
writePalette(); // local color table
}
colorTab = null;
// encode and write pixel data
{
const lzwEncoder = createLzwEncoder({
width,
height,
pixels: indexedPixels,
colorDepth,
});
lzwEncoder.encode({
writeByte,
writeBytes,
});
}
firstFrame = false;
indexedPixels.length = 0;
return true;
} catch {
return false;
}
},
/**
* Adds final trailer to the GIF stream, if you don't call the finish method
* the GIF asDataUrl will not be valid.
*/
finish: () => {
if (finished) return false;
finished = true;
try {
writeByte(0x3b); // gif trailer
return true;
} catch {
return false;
}
},
readAsBinaryString,
toDataUrl: () => {
const gifAsBinaryString = readAsBinaryString();
return `data:image/gif;base64,${encode64(gifAsBinaryString)}`;
},
};
writeUTFBytes("GIF89a"); // header
return encoder;
};
const encode64 = (input) => {
let output = "";
let i = 0;
let l = input.length;
let key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
let chr1;
let chr2;
let chr3;
let enc1;
let enc2;
let enc3;
let enc4;
while (i < l) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) enc3 = enc4 = 64;
else if (isNaN(chr3)) enc4 = 64;
output =
output +
key.charAt(enc1) +
key.charAt(enc2) +
key.charAt(enc3) +
key.charAt(enc4);
}
return output;
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL3BhY2thZ2VzL3Rvb2xpbmcvdGVybWluYWwtcmVjb3JkZXIvc3JjL2NsaWVudC9naWZfZW5jb2Rlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vaW5jdWJhdGVkLWdlZWstY2MvdmlkZW8tdG8tR0lGL2Jsb2IvbWFpbi9qcy9HSUZFbmNvZGVyLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vam5vcmRiZXJnL2dpZi5qc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pub3JkYmVyZy9naWYuanMvYmxvYi9tYXN0ZXIvc3JjL0dJRkVuY29kZXIuanNcblxuaW1wb3J0IHsgY3JlYXRlTHp3RW5jb2RlciB9IGZyb20gXCIuL2x6d19lbmNvZGVyLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVOZXVRdWFudCB9IGZyb20gXCIuL25ldXF1YW50LmpzXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHaWZFbmNvZGVyID0gKHtcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgLypcbiAgICogU2V0cyBxdWFsaXR5IG9mIGNvbG9yIHF1YW50aXphdGlvbiAoY29udmVyc2lvbiBvZiBpbWFnZXMgdG8gdGhlIG1heGltdW0gMjU2XG4gICAqIGNvbG9ycyBhbGxvd2VkIGJ5IHRoZSBHSUYgc3BlY2lmaWNhdGlvbikuIExvd2VyIHZhbHVlcyAobWluaW11bSA9IDEpXG4gICAqIHByb2R1Y2UgYmV0dGVyIGNvbG9ycywgYnV0IHNsb3cgcHJvY2Vzc2luZyBzaWduaWZpY2FudGx5LiAxMCBpcyB0aGVcbiAgICogZGVmYXVsdCwgYW5kIHByb2R1Y2VzIGdvb2QgY29sb3IgbWFwcGluZyBhdCByZWFzb25hYmxlIHNwZWVkcy4gVmFsdWVzXG4gICAqIGdyZWF0ZXIgdGhhbiAyMCBkbyBub3QgeWllbGQgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzIGluIHNwZWVkLlxuICAgKi9cbiAgcXVhbGl0eSA9IDEwLFxuICAvKipcbiAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzZXQgb2YgR0lGIGZyYW1lcyBzaG91bGQgYmUgcGxheWVkLlxuICAgKiAtMSBtZWFucyBubyByZXBlYXQsIDAgbWVhbnMgaW5kZWZpbml0ZWx5XG4gICAqXG4gICAqIGludCBudW1iZXIgb2YgaXRlcmF0aW9ucy5cbiAgICovXG4gIHJlcGVhdCA9IC0xLFxuICBjb21tZW50ID0gXCJcIixcbn0pID0+IHtcbiAgY29uc3QgYnl0ZUFycmF5ID0gW107XG4gIGNvbnN0IHdyaXRlQnl0ZSA9IChkYXRhKSA9PiB7XG4gICAgYnl0ZUFycmF5LnB1c2goZGF0YSk7XG4gIH07XG4gIGNvbnN0IHdyaXRlVVRGQnl0ZXMgPSAoc3RyaW5nKSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgd3JpdGVCeXRlKHN0cmluZy5jaGFyQ29kZUF0KGkpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH07XG4gIGNvbnN0IHdyaXRlQnl0ZXMgPSAoYXJyYXksIG9mZnNldCA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCkgPT4ge1xuICAgIGxldCBpID0gb2Zmc2V0O1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICB3cml0ZUJ5dGUoYXJyYXlbaV0pO1xuICAgICAgaSsrO1xuICAgIH1cbiAgfTtcbiAgbGV0IGNoYXJDb2RlTWFwO1xuICBjb25zdCBmaWxsQ2hhckNvZGVzID0gKCkgPT4ge1xuICAgIGlmIChjaGFyQ29kZU1hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjaGFyQ29kZU1hcCA9IG5ldyBNYXAoKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCAyNTYpIHtcbiAgICAgIGNoYXJDb2RlTWFwLnNldChpLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBc0JpbmFyeVN0cmluZyA9ICgpID0+IHtcbiAgICBmaWxsQ2hhckNvZGVzKCk7XG4gICAgbGV0IGJpbmFyeVN0cmluZyA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBieXRlIG9mIGJ5dGVBcnJheSkge1xuICAgICAgYmluYXJ5U3RyaW5nICs9IGNoYXJDb2RlTWFwLmdldChieXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmFyeVN0cmluZztcbiAgfTtcblxuICBsZXQgdHJhbnNwYXJlbnQgPSBudWxsOyAvLyB0cmFuc3BhcmVudCBjb2xvciBpZiBnaXZlblxuICBsZXQgdHJhbnNJbmRleCA9IDA7IC8vIHRyYW5zcGFyZW50IGluZGV4IGluIGNvbG9yIHRhYmxlXG4gIGxldCBjb2xvckRlcHRoOyAvLyBudW1iZXIgb2YgYml0IHBsYW5lc1xuICBsZXQgdXNlZEVudHJ5ID0gW107IC8vIGFjdGl2ZSBwYWxldHRlIGVudHJpZXNcbiAgbGV0IHBhbFNpemUgPSA3OyAvLyBjb2xvciB0YWJsZSBzaXplIChiaXRzLTEpXG4gIGxldCBkaXNwb3NlID0gLTE7IC8vIGRpc3Bvc2FsIGNvZGUgKC0xID0gdXNlIGRlZmF1bHRcbiAgbGV0IGZpcnN0RnJhbWUgPSB0cnVlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBjb25zdCB3cml0ZVNob3J0ID0gKHBWYWx1ZSkgPT4ge1xuICAgIHdyaXRlQnl0ZShwVmFsdWUgJiAweGZmKTtcbiAgICB3cml0ZUJ5dGUoKHBWYWx1ZSA+PiA4KSAmIDB4ZmYpO1xuICB9O1xuXG4gIGNvbnN0IGVuY29kZXIgPSB7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgR0lGIGZyYW1lIGRpc3Bvc2FsIGNvZGUgZm9yIHRoZSBsYXN0IGFkZGVkIGZyYW1lIGFuZCBhbnlcbiAgICAgKiBzdWJzZXF1ZW50IGZyYW1lcy4gRGVmYXVsdCBpcyAwIGlmIG5vIHRyYW5zcGFyZW50IGNvbG9yIGhhcyBiZWVuIHNldCxcbiAgICAgKiBvdGhlcndpc2UgMi5cbiAgICAgKiBAcGFyYW0gY29kZVxuICAgICAqIGludCBkaXNwb3NhbCBjb2RlLlxuICAgICAqL1xuICAgIHNldERpc3Bvc2U6IChjb2RlKSA9PiB7XG4gICAgICBpZiAoY29kZSA+PSAwKSBkaXNwb3NlID0gY29kZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdHJhbnNwYXJlbnQgY29sb3IgZm9yIHRoZSBsYXN0IGFkZGVkIGZyYW1lIGFuZCBhbnkgc3Vic2VxdWVudFxuICAgICAqIGZyYW1lcy4gU2luY2UgYWxsIGNvbG9ycyBhcmUgc3ViamVjdCB0byBtb2RpZmljYXRpb24gaW4gdGhlIHF1YW50aXphdGlvblxuICAgICAqIHByb2Nlc3MsIHRoZSBjb2xvciBpbiB0aGUgZmluYWwgcGFsZXR0ZSBmb3IgZWFjaCBmcmFtZSBjbG9zZXN0IHRvIHRoZSBnaXZlblxuICAgICAqIGNvbG9yIGJlY29tZXMgdGhlIHRyYW5zcGFyZW50IGNvbG9yIGZvciB0aGF0IGZyYW1lLiBNYXkgYmUgc2V0IHRvIG51bGwgdG9cbiAgICAgKiBpbmRpY2F0ZSBubyB0cmFuc3BhcmVudCBjb2xvci5cbiAgICAgKiBAcGFyYW1cbiAgICAgKiBDb2xvciB0byBiZSB0cmVhdGVkIGFzIHRyYW5zcGFyZW50IG9uIGRpc3BsYXkuXG4gICAgICovXG4gICAgc2V0VHJhbnNwYXJlbnQ6IChjKSA9PiB7XG4gICAgICB0cmFuc3BhcmVudCA9IGM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBhZGRGcmFtZSBtZXRob2QgdGFrZXMgYW4gaW5jb21pbmcgQml0bWFwRGF0YSBvYmplY3QgdG8gY3JlYXRlIGVhY2ggZnJhbWVzXG4gICAgICogQHBhcmFtXG4gICAgICogQml0bWFwRGF0YSBvYmplY3QgdG8gYmUgdHJlYXRlZCBhcyBhIEdJRidzIGZyYW1lXG4gICAgICovXG4gICAgYWRkRnJhbWU6IChjb250ZXh0LCBvcHRpb25zKSA9PiB7XG4gICAgICBsZXQgZGVsYXkgPSAwO1xuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSkge1xuICAgICAgICAgIHF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHkgPCAxID8gMSA6IG9wdGlvbnMucXVhbGl0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5kZWxheSkge1xuICAgICAgICAgIGRlbGF5ID0gTWF0aC5yb3VuZChvcHRpb25zLmRlbGF5IC8gMTApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbnZhcyA9IGNvbnRleHQuY2FudmFzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGNhbnZhcy53aWR0aCxcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0LFxuICAgICAgICApLmRhdGE7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gW107XG4gICAgICAgIC8vIGJ1aWxkIHBpeGVsc1xuICAgICAgICB7XG4gICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICBsZXQgeSA9IDA7XG4gICAgICAgICAgd2hpbGUgKHkgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgIGxldCB4ID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh4IDwgd2lkdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgYiA9IHkgKiB3aWR0aCAqIDQgKyB4ICogNDtcbiAgICAgICAgICAgICAgcGl4ZWxzW2NvdW50KytdID0gaW1hZ2VEYXRhW2JdO1xuICAgICAgICAgICAgICBwaXhlbHNbY291bnQrK10gPSBpbWFnZURhdGFbYiArIDFdO1xuICAgICAgICAgICAgICBwaXhlbHNbY291bnQrK10gPSBpbWFnZURhdGFbYiArIDJdO1xuICAgICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjb2xvclRhYjtcbiAgICAgICAgbGV0IGluZGV4ZWRQaXhlbHMgPSBbXTtcbiAgICAgICAgLy8gYW5hbHl6ZSBwaXhlbHMgKCBidWlsZCBjb2xvciB0YWJsZSAmIG1hcCBwaXhlbHMpXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGVuID0gcGl4ZWxzLmxlbmd0aDtcbiAgICAgICAgICB2YXIgblBpeCA9IGxlbiAvIDM7XG4gICAgICAgICAgY29uc3QgbmV1UXVhbnQgPSBjcmVhdGVOZXVRdWFudCh7XG4gICAgICAgICAgICBwaXhlbHMsXG4gICAgICAgICAgICBsZW4sXG4gICAgICAgICAgICBzYW1wbGU6IHF1YWxpdHksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBpbml0aWFsaXplIHF1YW50aXplclxuICAgICAgICAgIGNvbG9yVGFiID0gbmV1UXVhbnQucHJvY2VzcygpOyAvLyBjcmVhdGUgcmVkdWNlZCBwYWxldHRlXG5cbiAgICAgICAgICAvLyBtYXAgaW1hZ2UgcGl4ZWxzIHRvIG5ldyBwYWxldHRlXG4gICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgblBpeDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBuZXVRdWFudC5tYXAoXG4gICAgICAgICAgICAgIHBpeGVsc1trKytdICYgMHhmZixcbiAgICAgICAgICAgICAgcGl4ZWxzW2srK10gJiAweGZmLFxuICAgICAgICAgICAgICBwaXhlbHNbaysrXSAmIDB4ZmYsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdXNlZEVudHJ5W2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICBpbmRleGVkUGl4ZWxzW2pdID0gaW5kZXg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGl4ZWxzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgY29sb3JEZXB0aCA9IDg7XG4gICAgICAgICAgcGFsU2l6ZSA9IDc7XG5cbiAgICAgICAgICAvLyBnZXQgY2xvc2VzdCBtYXRjaCB0byB0cmFuc3BhcmVudCBjb2xvciBpZiBzcGVjaWZpZWRcbiAgICAgICAgICBpZiAodHJhbnNwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmV0dXJucyBpbmRleCBvZiBwYWxldHRlIGNvbG9yIGNsb3Nlc3QgdG8gY1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBmaW5kQ2xvc2VzdCA9IChjKSA9PiB7XG4gICAgICAgICAgICAgIHZhciByID0gKGMgJiAweGZmMDAwMCkgPj4gMTY7XG4gICAgICAgICAgICAgIHZhciBnID0gKGMgJiAweDAwZmYwMCkgPj4gODtcbiAgICAgICAgICAgICAgdmFyIGIgPSBjICYgMHgwMDAwZmY7XG4gICAgICAgICAgICAgIHZhciBtaW5wb3MgPSAwO1xuICAgICAgICAgICAgICB2YXIgZG1pbiA9IDI1NiAqIDI1NiAqIDI1NjtcbiAgICAgICAgICAgICAgdmFyIGxlbiA9IGNvbG9yVGFiLmxlbmd0aDtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyID0gciAtIChjb2xvclRhYltpKytdICYgMHhmZik7XG4gICAgICAgICAgICAgICAgdmFyIGRnID0gZyAtIChjb2xvclRhYltpKytdICYgMHhmZik7XG4gICAgICAgICAgICAgICAgdmFyIGRiID0gYiAtIChjb2xvclRhYltpXSAmIDB4ZmYpO1xuICAgICAgICAgICAgICAgIHZhciBkID0gZHIgKiBkciArIGRnICogZGcgKyBkYiAqIGRiO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGkgLyAzO1xuICAgICAgICAgICAgICAgIGlmICh1c2VkRW50cnlbaW5kZXhdICYmIGQgPCBkbWluKSB7XG4gICAgICAgICAgICAgICAgICBkbWluID0gZDtcbiAgICAgICAgICAgICAgICAgIG1pbnBvcyA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG1pbnBvcztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cmFuc0luZGV4ID0gY29sb3JUYWIgPT09IG51bGwgPyAtMSA6IGZpbmRDbG9zZXN0KHRyYW5zcGFyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3cml0ZVBhbGV0dGUgPSAoKSA9PiB7XG4gICAgICAgICAgd3JpdGVCeXRlcyhjb2xvclRhYik7XG4gICAgICAgICAgdmFyIG4gPSAzICogMjU2IC0gY29sb3JUYWIubGVuZ3RoO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB3cml0ZUJ5dGUoMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGZpcnN0RnJhbWUpIHtcbiAgICAgICAgICAvLyB3cml0ZSBsb2dpY2FsIHNjcmVlbiBkZXNjcmlwdGlvclxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIGxvZ2ljYWwgc2NyZWVuIHNpemVcbiAgICAgICAgICAgIHdyaXRlU2hvcnQod2lkdGgpO1xuICAgICAgICAgICAgd3JpdGVTaG9ydChoZWlnaHQpO1xuICAgICAgICAgICAgLy8gcGFja2VkIGZpZWxkc1xuICAgICAgICAgICAgd3JpdGVCeXRlKFxuICAgICAgICAgICAgICAweDgwIHwgLy8gMSA6IGdsb2JhbCBjb2xvciB0YWJsZSBmbGFnID0gMSAoZ2N0IHVzZWQpXG4gICAgICAgICAgICAgICAgMHg3MCB8IC8vIDItNCA6IGNvbG9yIHJlc29sdXRpb24gPSA3XG4gICAgICAgICAgICAgICAgMHgwMCB8IC8vIDUgOiBnY3Qgc29ydCBmbGFnID0gMFxuICAgICAgICAgICAgICAgIHBhbFNpemUsXG4gICAgICAgICAgICApOyAvLyA2LTggOiBnY3Qgc2l6ZVxuXG4gICAgICAgICAgICB3cml0ZUJ5dGUoMCk7IC8vIGJhY2tncm91bmQgY29sb3IgaW5kZXhcbiAgICAgICAgICAgIHdyaXRlQnl0ZSgwKTsgLy8gcGl4ZWwgYXNwZWN0IHJhdGlvIC0gYXNzdW1lIDE6MVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHdyaXRlIHBhbGV0dGVcbiAgICAgICAgICB3cml0ZVBhbGV0dGUoKTsgLy8gZ2xvYmFsIGNvbG9yIHRhYmxlXG5cbiAgICAgICAgICAvLyBXcml0ZXMgTmV0c2NhcGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uIHRvIGRlZmluZSByZXBlYXQgY291bnQuXG4gICAgICAgICAgaWYgKHJlcGVhdCA+PSAwKSB7XG4gICAgICAgICAgICB3cml0ZUJ5dGUoMHgyMSk7IC8vIGV4dGVuc2lvbiBpbnRyb2R1Y2VyXG4gICAgICAgICAgICB3cml0ZUJ5dGUoMHhmZik7IC8vIGFwcCBleHRlbnNpb24gbGFiZWxcbiAgICAgICAgICAgIHdyaXRlQnl0ZSgxMSk7IC8vIGJsb2NrIHNpemVcbiAgICAgICAgICAgIHdyaXRlVVRGQnl0ZXMoXCJORVRTQ0FQRTIuMFwiKTsgLy8gYXBwIGlkICsgYXV0aCBjb2RlXG4gICAgICAgICAgICB3cml0ZUJ5dGUoMyk7IC8vIHN1Yi1ibG9jayBzaXplXG4gICAgICAgICAgICB3cml0ZUJ5dGUoMSk7IC8vIGxvb3Agc3ViLWJsb2NrIGlkXG4gICAgICAgICAgICB3cml0ZVNob3J0KHJlcGVhdCk7IC8vIGxvb3AgY291bnQgKGV4dHJhIGl0ZXJhdGlvbnMsIDA9cmVwZWF0IGZvcmV2ZXIpXG4gICAgICAgICAgICB3cml0ZUJ5dGUoMCk7IC8vIGJsb2NrIHRlcm1pbmF0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3cml0ZSBncmFwaGljIGNvbnRyb2wgZXh0ZW5zaW9uXG4gICAgICAgIHtcbiAgICAgICAgICB3cml0ZUJ5dGUoMHgyMSk7IC8vIGV4dGVuc2lvbiBpbnRyb2R1Y2VyXG4gICAgICAgICAgd3JpdGVCeXRlKDB4ZjkpOyAvLyBHQ0UgbGFiZWxcbiAgICAgICAgICB3cml0ZUJ5dGUoNCk7IC8vIGRhdGEgYmxvY2sgc2l6ZVxuICAgICAgICAgIHZhciB0cmFuc3A7XG4gICAgICAgICAgdmFyIGRpc3A7XG4gICAgICAgICAgaWYgKHRyYW5zcGFyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0cmFuc3AgPSAwO1xuICAgICAgICAgICAgZGlzcCA9IDA7IC8vIGRpc3Bvc2UgPSBubyBhY3Rpb25cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhbnNwID0gMTtcbiAgICAgICAgICAgIGRpc3AgPSAyOyAvLyBmb3JjZSBjbGVhciBpZiB1c2luZyB0cmFuc3BhcmVudCBjb2xvclxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGlzcG9zZSA+PSAwKSB7XG4gICAgICAgICAgICBkaXNwID0gZGlzcG9zZSAmIDc7IC8vIHVzZXIgb3ZlcnJpZGVcbiAgICAgICAgICB9XG4gICAgICAgICAgZGlzcCA8PD0gMjtcbiAgICAgICAgICAvLyBwYWNrZWQgZmllbGRzXG4gICAgICAgICAgd3JpdGVCeXRlKFxuICAgICAgICAgICAgMCB8IC8vIDE6MyByZXNlcnZlZFxuICAgICAgICAgICAgICBkaXNwIHwgLy8gNDo2IGRpc3Bvc2FsXG4gICAgICAgICAgICAgIDAgfCAvLyA3IHVzZXIgaW5wdXQgLSAwID0gbm9uZVxuICAgICAgICAgICAgICB0cmFuc3AsXG4gICAgICAgICAgKTsgLy8gOCB0cmFuc3BhcmVuY3kgZmxhZ1xuXG4gICAgICAgICAgd3JpdGVTaG9ydChkZWxheSk7IC8vIGRlbGF5IHggMS8xMDAgc2VjXG4gICAgICAgICAgd3JpdGVCeXRlKHRyYW5zSW5kZXgpOyAvLyB0cmFuc3BhcmVudCBjb2xvciBpbmRleFxuICAgICAgICAgIHdyaXRlQnl0ZSgwKTsgLy8gYmxvY2sgdGVybWluYXRvclxuICAgICAgICB9XG5cbiAgICAgICAgLy8gd3JpdGUgY29tbWVudFxuICAgICAgICBpZiAoY29tbWVudCAhPT0gXCJcIikge1xuICAgICAgICAgIHdyaXRlQnl0ZSgweDIxKTsgLy8gZXh0ZW5zaW9uIGludHJvZHVjZXJcbiAgICAgICAgICB3cml0ZUJ5dGUoMHhmZSk7IC8vIGNvbW1lbnQgbGFiZWxcbiAgICAgICAgICB3cml0ZUJ5dGUoY29tbWVudC5sZW5ndGgpOyAvLyBCbG9jayBTaXplIChzKVxuICAgICAgICAgIHdyaXRlVVRGQnl0ZXMoY29tbWVudCk7XG4gICAgICAgICAgd3JpdGVCeXRlKDApOyAvLyBibG9jayB0ZXJtaW5hdG9yXG4gICAgICAgIH1cblxuICAgICAgICAvLyB3cml0ZSBpbWFnZSBkZXNjcmlwdG9yXG4gICAgICAgIHtcbiAgICAgICAgICB3cml0ZUJ5dGUoMHgyYyk7IC8vIGltYWdlIHNlcGFyYXRvclxuICAgICAgICAgIHdyaXRlU2hvcnQoMCk7IC8vIGltYWdlIHBvc2l0aW9uIHgseSA9IDAsMFxuICAgICAgICAgIHdyaXRlU2hvcnQoMCk7XG4gICAgICAgICAgd3JpdGVTaG9ydCh3aWR0aCk7IC8vIGltYWdlIHNpemVcbiAgICAgICAgICB3cml0ZVNob3J0KGhlaWdodCk7XG5cbiAgICAgICAgICAvLyBwYWNrZWQgZmllbGRzXG4gICAgICAgICAgaWYgKGZpcnN0RnJhbWUpIHtcbiAgICAgICAgICAgIC8vIG5vIExDVCAtIEdDVCBpcyB1c2VkIGZvciBmaXJzdCAob3Igb25seSkgZnJhbWVcbiAgICAgICAgICAgIHdyaXRlQnl0ZSgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3BlY2lmeSBub3JtYWwgTENUXG4gICAgICAgICAgICB3cml0ZUJ5dGUoXG4gICAgICAgICAgICAgIDB4ODAgfCAvLyAxIGxvY2FsIGNvbG9yIHRhYmxlIDE9eWVzXG4gICAgICAgICAgICAgICAgMCB8IC8vIDIgaW50ZXJsYWNlIC0gMD1ub1xuICAgICAgICAgICAgICAgIDAgfCAvLyAzIHNvcnRlZCAtIDA9bm9cbiAgICAgICAgICAgICAgICAwIHwgLy8gNC01IHJlc2VydmVkXG4gICAgICAgICAgICAgICAgcGFsU2l6ZSxcbiAgICAgICAgICAgICk7IC8vIDYtOCBzaXplIG9mIGNvbG9yIHRhYmxlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaXJzdEZyYW1lKSB7XG4gICAgICAgICAgd3JpdGVQYWxldHRlKCk7IC8vIGxvY2FsIGNvbG9yIHRhYmxlXG4gICAgICAgIH1cbiAgICAgICAgY29sb3JUYWIgPSBudWxsO1xuXG4gICAgICAgIC8vIGVuY29kZSBhbmQgd3JpdGUgcGl4ZWwgZGF0YVxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbHp3RW5jb2RlciA9IGNyZWF0ZUx6d0VuY29kZXIoe1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICBwaXhlbHM6IGluZGV4ZWRQaXhlbHMsXG4gICAgICAgICAgICBjb2xvckRlcHRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGx6d0VuY29kZXIuZW5jb2RlKHtcbiAgICAgICAgICAgIHdyaXRlQnl0ZSxcbiAgICAgICAgICAgIHdyaXRlQnl0ZXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3RGcmFtZSA9IGZhbHNlO1xuICAgICAgICBpbmRleGVkUGl4ZWxzLmxlbmd0aCA9IDA7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmaW5hbCB0cmFpbGVyIHRvIHRoZSBHSUYgc3RyZWFtLCBpZiB5b3UgZG9uJ3QgY2FsbCB0aGUgZmluaXNoIG1ldGhvZFxuICAgICAqIHRoZSBHSUYgYXNEYXRhVXJsIHdpbGwgbm90IGJlIHZhbGlkLlxuICAgICAqL1xuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHdyaXRlQnl0ZSgweDNiKTsgLy8gZ2lmIHRyYWlsZXJcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWFkQXNCaW5hcnlTdHJpbmcsXG4gICAgdG9EYXRhVXJsOiAoKSA9PiB7XG4gICAgICBjb25zdCBnaWZBc0JpbmFyeVN0cmluZyA9IHJlYWRBc0JpbmFyeVN0cmluZygpO1xuICAgICAgcmV0dXJuIGBkYXRhOmltYWdlL2dpZjtiYXNlNjQsJHtlbmNvZGU2NChnaWZBc0JpbmFyeVN0cmluZyl9YDtcbiAgICB9LFxuICB9O1xuXG4gIHdyaXRlVVRGQnl0ZXMoXCJHSUY4OWFcIik7IC8vIGhlYWRlclxuXG4gIHJldHVybiBlbmNvZGVyO1xufTtcblxuY29uc3QgZW5jb2RlNjQgPSAoaW5wdXQpID0+IHtcbiAgbGV0IG91dHB1dCA9IFwiXCI7XG4gIGxldCBpID0gMDtcbiAgbGV0IGwgPSBpbnB1dC5sZW5ndGg7XG4gIGxldCBrZXkgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG4gIGxldCBjaHIxO1xuICBsZXQgY2hyMjtcbiAgbGV0IGNocjM7XG4gIGxldCBlbmMxO1xuICBsZXQgZW5jMjtcbiAgbGV0IGVuYzM7XG4gIGxldCBlbmM0O1xuICB3aGlsZSAoaSA8IGwpIHtcbiAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuICAgIGNocjIgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4gICAgY2hyMyA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICBlbmMxID0gY2hyMSA+PiAyO1xuICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuICAgIGVuYzMgPSAoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KTtcbiAgICBlbmM0ID0gY2hyMyAmIDYzO1xuICAgIGlmIChpc05hTihjaHIyKSkgZW5jMyA9IGVuYzQgPSA2NDtcbiAgICBlbHNlIGlmIChpc05hTihjaHIzKSkgZW5jNCA9IDY0O1xuICAgIG91dHB1dCA9XG4gICAgICBvdXRwdXQgK1xuICAgICAga2V5LmNoYXJBdChlbmMxKSArXG4gICAgICBrZXkuY2hhckF0KGVuYzIpICtcbiAgICAgIGtleS5jaGFyQXQoZW5jMykgK1xuICAgICAga2V5LmNoYXJBdChlbmM0KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRW5FLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFrQjtBQUNuRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWU7O0FBRTlDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNULENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNULENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDLENBQUM7O0FBRUgsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRUwsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRU4sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQU