UNPKG

@jsenv/terminal-recorder

Version:

Record terminal output as .svg, .gif, .webm, .mp4

400 lines (367 loc) 100 kB
// 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