woff2-decode 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","names":["Buffer","Buffer","brotliDecompressPure","brotliDecompress"],"sources":["../node_modules/brotli/dec/streams.js","../node_modules/brotli/dec/bit_reader.js","../node_modules/base64-js/index.js","../node_modules/brotli/dec/dictionary.bin.js","../node_modules/brotli/dec/dictionary-browser.js","../node_modules/brotli/dec/dictionary.js","../node_modules/brotli/dec/huffman.js","../node_modules/brotli/dec/context.js","../node_modules/brotli/dec/prefix.js","../node_modules/brotli/dec/transform.js","../node_modules/brotli/dec/decode.js","../node_modules/brotli/decompress.js","../src/brotli.ts","../src/buffer.ts","../src/known-tags.ts","../src/variable-length.ts","../src/decode.ts"],"sourcesContent":["function BrotliInput(buffer) {\n this.buffer = buffer;\n this.pos = 0;\n}\n\nBrotliInput.prototype.read = function(buf, i, count) {\n if (this.pos + count > this.buffer.length) {\n count = this.buffer.length - this.pos;\n }\n \n for (var p = 0; p < count; p++)\n buf[i + p] = this.buffer[this.pos + p];\n \n this.pos += count;\n return count;\n}\n\nexports.BrotliInput = BrotliInput;\n\nfunction BrotliOutput(buf) {\n this.buffer = buf;\n this.pos = 0;\n}\n\nBrotliOutput.prototype.write = function(buf, count) {\n if (this.pos + count > this.buffer.length)\n throw new Error('Output buffer is not large enough');\n \n this.buffer.set(buf.subarray(0, count), this.pos);\n this.pos += count;\n return count;\n};\n\nexports.BrotliOutput = BrotliOutput;\n","/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Bit reading helpers\n*/\n\nvar BROTLI_READ_SIZE = 4096;\nvar BROTLI_IBUF_SIZE = (2 * BROTLI_READ_SIZE + 32);\nvar BROTLI_IBUF_MASK = (2 * BROTLI_READ_SIZE - 1);\n\nvar kBitMask = new Uint32Array([\n 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767,\n 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215\n]);\n\n/* Input byte buffer, consist of a ringbuffer and a \"slack\" region where */\n/* bytes from the start of the ringbuffer are copied. */\nfunction BrotliBitReader(input) {\n this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE);\n this.input_ = input; /* input callback */\n \n this.reset();\n}\n\nBrotliBitReader.READ_SIZE = BROTLI_READ_SIZE;\nBrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK;\n\nBrotliBitReader.prototype.reset = function() {\n this.buf_ptr_ = 0; /* next input will write here */\n this.val_ = 0; /* pre-fetched bits */\n this.pos_ = 0; /* byte position in stream */\n this.bit_pos_ = 0; /* current bit-reading position in val_ */\n this.bit_end_pos_ = 0; /* bit-reading end position from LSB of val_ */\n this.eos_ = 0; /* input stream is finished */\n \n this.readMoreInput();\n for (var i = 0; i < 4; i++) {\n this.val_ |= this.buf_[this.pos_] << (8 * i);\n ++this.pos_;\n }\n \n return this.bit_end_pos_ > 0;\n};\n\n/* Fills up the input ringbuffer by calling the input callback.\n\n Does nothing if there are at least 32 bytes present after current position.\n\n Returns 0 if either:\n - the input callback returned an error, or\n - there is no more input and the position is past the end of the stream.\n\n After encountering the end of the input stream, 32 additional zero bytes are\n copied to the ringbuffer, therefore it is safe to call this function after\n every 32 bytes of input is read.\n*/\nBrotliBitReader.prototype.readMoreInput = function() {\n if (this.bit_end_pos_ > 256) {\n return;\n } else if (this.eos_) {\n if (this.bit_pos_ > this.bit_end_pos_)\n throw new Error('Unexpected end of input ' + this.bit_pos_ + ' ' + this.bit_end_pos_);\n } else {\n var dst = this.buf_ptr_;\n var bytes_read = this.input_.read(this.buf_, dst, BROTLI_READ_SIZE);\n if (bytes_read < 0) {\n throw new Error('Unexpected end of input');\n }\n \n if (bytes_read < BROTLI_READ_SIZE) {\n this.eos_ = 1;\n /* Store 32 bytes of zero after the stream end. */\n for (var p = 0; p < 32; p++)\n this.buf_[dst + bytes_read + p] = 0;\n }\n \n if (dst === 0) {\n /* Copy the head of the ringbuffer to the slack region. */\n for (var p = 0; p < 32; p++)\n this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p];\n\n this.buf_ptr_ = BROTLI_READ_SIZE;\n } else {\n this.buf_ptr_ = 0;\n }\n \n this.bit_end_pos_ += bytes_read << 3;\n }\n};\n\n/* Guarantees that there are at least 24 bits in the buffer. */\nBrotliBitReader.prototype.fillBitWindow = function() { \n while (this.bit_pos_ >= 8) {\n this.val_ >>>= 8;\n this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24;\n ++this.pos_;\n this.bit_pos_ = this.bit_pos_ - 8 >>> 0;\n this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0;\n }\n};\n\n/* Reads the specified number of bits from Read Buffer. */\nBrotliBitReader.prototype.readBits = function(n_bits) {\n if (32 - this.bit_pos_ < n_bits) {\n this.fillBitWindow();\n }\n \n var val = ((this.val_ >>> this.bit_pos_) & kBitMask[n_bits]);\n this.bit_pos_ += n_bits;\n return val;\n};\n\nmodule.exports = BrotliBitReader;\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","module.exports=\"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\";\n","var base64 = require('base64-js');\n\n/**\n * The normal dictionary-data.js is quite large, which makes it \n * unsuitable for browser usage. In order to make it smaller, \n * we read dictionary.bin, which is a compressed version of\n * the dictionary, and on initial load, Brotli decompresses \n * it's own dictionary. 😜\n */\nexports.init = function() {\n var BrotliDecompressBuffer = require('./decode').BrotliDecompressBuffer;\n var compressed = base64.toByteArray(require('./dictionary.bin.js'));\n return BrotliDecompressBuffer(compressed);\n};\n","/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Collection of static dictionary words.\n*/\n\nvar data = require('./dictionary-data');\nexports.init = function() {\n exports.dictionary = data.init();\n};\n\nexports.offsetsByLength = new Uint32Array([\n 0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032,\n 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536,\n 115968, 118528, 119872, 121280, 122016,\n]);\n\nexports.sizeBitsByLength = new Uint8Array([\n 0, 0, 0, 0, 10, 10, 11, 11, 10, 10,\n 10, 10, 10, 9, 9, 8, 7, 7, 8, 7,\n 7, 6, 6, 5, 5,\n]);\n\nexports.minDictionaryWordLength = 4;\nexports.maxDictionaryWordLength = 24;\n","function HuffmanCode(bits, value) {\n this.bits = bits; /* number of bits used for this symbol */\n this.value = value; /* symbol value or table offset */\n}\n\nexports.HuffmanCode = HuffmanCode;\n\nvar MAX_LENGTH = 15;\n\n/* Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the\n bit-wise reversal of the len least significant bits of key. */\nfunction GetNextKey(key, len) {\n var step = 1 << (len - 1);\n while (key & step) {\n step >>= 1;\n }\n return (key & (step - 1)) + step;\n}\n\n/* Stores code in table[0], table[step], table[2*step], ..., table[end] */\n/* Assumes that end is an integer multiple of step */\nfunction ReplicateValue(table, i, step, end, code) {\n do {\n end -= step;\n table[i + end] = new HuffmanCode(code.bits, code.value);\n } while (end > 0);\n}\n\n/* Returns the table width of the next 2nd level table. count is the histogram\n of bit lengths for the remaining symbols, len is the code length of the next\n processed symbol */\nfunction NextTableBitSize(count, len, root_bits) {\n var left = 1 << (len - root_bits);\n while (len < MAX_LENGTH) {\n left -= count[len];\n if (left <= 0) break;\n ++len;\n left <<= 1;\n }\n return len - root_bits;\n}\n\nexports.BrotliBuildHuffmanTable = function(root_table, table, root_bits, code_lengths, code_lengths_size) {\n var start_table = table;\n var code; /* current table entry */\n var len; /* current code length */\n var symbol; /* symbol index in original or sorted table */\n var key; /* reversed prefix code */\n var step; /* step size to replicate values in current table */\n var low; /* low bits for current root entry */\n var mask; /* mask for low bits */\n var table_bits; /* key length of current table */\n var table_size; /* size of current table */\n var total_size; /* sum of root table size and 2nd level table sizes */\n var sorted; /* symbols sorted by code length */\n var count = new Int32Array(MAX_LENGTH + 1); /* number of codes of each length */\n var offset = new Int32Array(MAX_LENGTH + 1); /* offsets in sorted table for each length */\n\n sorted = new Int32Array(code_lengths_size);\n\n /* build histogram of code lengths */\n for (symbol = 0; symbol < code_lengths_size; symbol++) {\n count[code_lengths[symbol]]++;\n }\n\n /* generate offsets into sorted symbol table by code length */\n offset[1] = 0;\n for (len = 1; len < MAX_LENGTH; len++) {\n offset[len + 1] = offset[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (symbol = 0; symbol < code_lengths_size; symbol++) {\n if (code_lengths[symbol] !== 0) {\n sorted[offset[code_lengths[symbol]]++] = symbol;\n }\n }\n \n table_bits = root_bits;\n table_size = 1 << table_bits;\n total_size = table_size;\n\n /* special case code with only one value */\n if (offset[MAX_LENGTH] === 1) {\n for (key = 0; key < total_size; ++key) {\n root_table[table + key] = new HuffmanCode(0, sorted[0] & 0xffff);\n }\n \n return total_size;\n }\n\n /* fill in root table */\n key = 0;\n symbol = 0;\n for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) {\n for (; count[len] > 0; --count[len]) {\n code = new HuffmanCode(len & 0xff, sorted[symbol++] & 0xffff);\n ReplicateValue(root_table, table + key, step, table_size, code);\n key = GetNextKey(key, len);\n }\n }\n\n /* fill in 2nd level tables and add pointers to root table */\n mask = total_size - 1;\n low = -1;\n for (len = root_bits + 1, step = 2; len <= MAX_LENGTH; ++len, step <<= 1) {\n for (; count[len] > 0; --count[len]) {\n if ((key & mask) !== low) {\n table += table_size;\n table_bits = NextTableBitSize(count, len, root_bits);\n table_size = 1 << table_bits;\n total_size += table_size;\n low = key & mask;\n root_table[start_table + low] = new HuffmanCode((table_bits + root_bits) & 0xff, ((table - start_table) - low) & 0xffff);\n }\n code = new HuffmanCode((len - root_bits) & 0xff, sorted[symbol++] & 0xffff);\n ReplicateValue(root_table, table + (key >> root_bits), step, table_size, code);\n key = GetNextKey(key, len);\n }\n }\n \n return total_size;\n}\n","/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Lookup table to map the previous two bytes to a context id.\n\n There are four different context modeling modes defined here:\n CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,\n CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,\n CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,\n CONTEXT_SIGNED: second-order context model tuned for signed integers.\n\n The context id for the UTF8 context model is calculated as follows. If p1\n and p2 are the previous two bytes, we calcualte the context as\n\n context = kContextLookup[p1] | kContextLookup[p2 + 256].\n\n If the previous two bytes are ASCII characters (i.e. < 128), this will be\n equivalent to\n\n context = 4 * context1(p1) + context2(p2),\n\n where context1 is based on the previous byte in the following way:\n\n 0 : non-ASCII control\n 1 : \\t, \\n, \\r\n 2 : space\n 3 : other punctuation\n 4 : \" '\n 5 : %\n 6 : ( < [ {\n 7 : ) > ] }\n 8 : , ; :\n 9 : .\n 10 : =\n 11 : number\n 12 : upper-case vowel\n 13 : upper-case consonant\n 14 : lower-case vowel\n 15 : lower-case consonant\n\n and context2 is based on the second last byte:\n\n 0 : control, space\n 1 : punctuation\n 2 : upper-case letter, number\n 3 : lower-case letter\n\n If the last byte is ASCII, and the second last byte is not (in a valid UTF8\n stream it will be a continuation byte, value between 128 and 191), the\n context is the same as if the second last byte was an ASCII control or space.\n\n If the last byte is a UTF8 lead byte (value >= 192), then the next byte will\n be a continuation byte and the context id is 2 or 3 depending on the LSB of\n the last byte and to a lesser extent on the second last byte if it is ASCII.\n\n If the last byte is a UTF8 continuation byte, the second last byte can be:\n - continuation byte: the next byte is probably ASCII or lead byte (assuming\n 4-byte UTF8 characters are rare) and the context id is 0 or 1.\n - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1\n - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3\n\n The possible value combinations of the previous two bytes, the range of\n context ids and the type of the next byte is summarized in the table below:\n\n |--------\\-----------------------------------------------------------------|\n | \\ Last byte |\n | Second \\---------------------------------------------------------------|\n | last byte \\ ASCII | cont. byte | lead byte |\n | \\ (0-127) | (128-191) | (192-) |\n |=============|===================|=====================|==================|\n | ASCII | next: ASCII/lead | not valid | next: cont. |\n | (0-127) | context: 4 - 63 | | context: 2 - 3 |\n |-------------|-------------------|---------------------|------------------|\n | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |\n | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |\n |-------------|-------------------|---------------------|------------------|\n | lead byte | not valid | next: ASCII/lead | not valid |\n | (192-207) | | context: 0 - 1 | |\n |-------------|-------------------|---------------------|------------------|\n | lead byte | not valid | next: cont. | not valid |\n | (208-) | | context: 2 - 3 | |\n |-------------|-------------------|---------------------|------------------|\n\n The context id for the signed context mode is calculated as:\n\n context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2].\n\n For any context modeling modes, the context ids can be calculated by |-ing\n together two lookups from one table using context model dependent offsets:\n\n context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2].\n\n where offset1 and offset2 are dependent on the context mode.\n*/\n\nvar CONTEXT_LSB6 = 0;\nvar CONTEXT_MSB6 = 1;\nvar CONTEXT_UTF8 = 2;\nvar CONTEXT_SIGNED = 3;\n\n/* Common context lookup table for all context modes. */\nexports.lookup = new Uint8Array([\n /* CONTEXT_UTF8, last byte. */\n /* ASCII range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,\n 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,\n 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,\n 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,\n 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,\n 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0,\n /* UTF8 continuation byte range. */\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n /* UTF8 lead byte range. */\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n /* CONTEXT_UTF8 second last byte. */\n /* ASCII range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,\n 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,\n 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,\n /* UTF8 continuation byte range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n /* UTF8 lead byte range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n /* CONTEXT_SIGNED, second last byte. */\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,\n /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */\n 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,\n /* CONTEXT_LSB6, last byte. */\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n /* CONTEXT_MSB6, last byte. */\n 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,\n 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,\n 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11,\n 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,\n 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,\n 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,\n 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,\n 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,\n 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,\n 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,\n 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,\n 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,\n 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,\n 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,\n 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,\n 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,\n /* CONTEXT_{M,L}SB6, second last byte, */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n]);\n\nexports.lookupOffsets = new Uint16Array([\n /* CONTEXT_LSB6 */\n 1024, 1536,\n /* CONTEXT_MSB6 */\n 1280, 1536,\n /* CONTEXT_UTF8 */\n 0, 256,\n /* CONTEXT_SIGNED */\n 768, 512,\n]);\n","/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Lookup tables to map prefix codes to value ranges. This is used during\n decoding of the block lengths, literal insertion lengths and copy lengths.\n*/\n\n/* Represents the range of values belonging to a prefix code: */\n/* [offset, offset + 2^nbits) */\nfunction PrefixCodeRange(offset, nbits) {\n this.offset = offset;\n this.nbits = nbits;\n}\n\nexports.kBlockLengthPrefixCode = [\n new PrefixCodeRange(1, 2), new PrefixCodeRange(5, 2), new PrefixCodeRange(9, 2), new PrefixCodeRange(13, 2),\n new PrefixCodeRange(17, 3), new PrefixCodeRange(25, 3), new PrefixCodeRange(33, 3), new PrefixCodeRange(41, 3),\n new PrefixCodeRange(49, 4), new PrefixCodeRange(65, 4), new PrefixCodeRange(81, 4), new PrefixCodeRange(97, 4),\n new PrefixCodeRange(113, 5), new PrefixCodeRange(145, 5), new PrefixCodeRange(177, 5), new PrefixCodeRange(209, 5),\n new PrefixCodeRange(241, 6), new PrefixCodeRange(305, 6), new PrefixCodeRange(369, 7), new PrefixCodeRange(497, 8),\n new PrefixCodeRange(753, 9), new PrefixCodeRange(1265, 10), new PrefixCodeRange(2289, 11), new PrefixCodeRange(4337, 12),\n new PrefixCodeRange(8433, 13), new PrefixCodeRange(16625, 24)\n];\n\nexports.kInsertLengthPrefixCode = [\n new PrefixCodeRange(0, 0), new PrefixCodeRange(1, 0), new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0),\n new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 1), new PrefixCodeRange(8, 1),\n new PrefixCodeRange(10, 2), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 3), new PrefixCodeRange(26, 3),\n new PrefixCodeRange(34, 4), new PrefixCodeRange(50, 4), new PrefixCodeRange(66, 5), new PrefixCodeRange(98, 5),\n new PrefixCodeRange(130, 6), new PrefixCodeRange(194, 7), new PrefixCodeRange(322, 8), new PrefixCodeRange(578, 9),\n new PrefixCodeRange(1090, 10), new PrefixCodeRange(2114, 12), new PrefixCodeRange(6210, 14), new PrefixCodeRange(22594, 24),\n];\n\nexports.kCopyLengthPrefixCode = [\n new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0),\n new PrefixCodeRange(6, 0), new PrefixCodeRange(7, 0), new PrefixCodeRange(8, 0), new PrefixCodeRange(9, 0),\n new PrefixCodeRange(10, 1), new PrefixCodeRange(12, 1), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 2),\n new PrefixCodeRange(22, 3), new PrefixCodeRange(30, 3), new PrefixCodeRange(38, 4), new PrefixCodeRange(54, 4),\n new PrefixCodeRange(70, 5), new PrefixCodeRange(102, 5), new PrefixCodeRange(134, 6), new PrefixCodeRange(198, 7),\n new PrefixCodeRange(326, 8), new PrefixCodeRange(582, 9), new PrefixCodeRange(1094, 10), new PrefixCodeRange(2118, 24),\n];\n\nexports.kInsertRangeLut = [\n 0, 0, 8, 8, 0, 16, 8, 16, 16,\n];\n\nexports.kCopyRangeLut = [\n 0, 8, 0, 8, 16, 0, 16, 8, 16,\n];\n","/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Transformations on dictionary words.\n*/\n\nvar BrotliDictionary = require('./dictionary');\n\nvar kIdentity = 0;\nvar kOmitLast1 = 1;\nvar kOmitLast2 = 2;\nvar kOmitLast3 = 3;\nvar kOmitLast4 = 4;\nvar kOmitLast5 = 5;\nvar kOmitLast6 = 6;\nvar kOmitLast7 = 7;\nvar kOmitLast8 = 8;\nvar kOmitLast9 = 9;\nvar kUppercaseFirst = 10;\nvar kUppercaseAll = 11;\nvar kOmitFirst1 = 12;\nvar kOmitFirst2 = 13;\nvar kOmitFirst3 = 14;\nvar kOmitFirst4 = 15;\nvar kOmitFirst5 = 16;\nvar kOmitFirst6 = 17;\nvar kOmitFirst7 = 18;\nvar kOmitFirst8 = 19;\nvar kOmitFirst9 = 20;\n\nfunction Transform(prefix, transform, suffix) {\n this.prefix = new Uint8Array(prefix.length);\n this.transform = transform;\n this.suffix = new Uint8Array(suffix.length);\n \n for (var i = 0; i < prefix.length; i++)\n this.prefix[i] = prefix.charCodeAt(i);\n \n for (var i = 0; i < suffix.length; i++)\n this.suffix[i] = suffix.charCodeAt(i);\n}\n\nvar kTransforms = [\n new Transform( \"\", kIdentity, \"\" ),\n new Transform( \"\", kIdentity, \" \" ),\n new Transform( \" \", kIdentity, \" \" ),\n new Transform( \"\", kOmitFirst1, \"\" ),\n new Transform( \"\", kUppercaseFirst, \" \" ),\n new Transform( \"\", kIdentity, \" the \" ),\n new Transform( \" \", kIdentity, \"\" ),\n new Transform( \"s \", kIdentity, \" \" ),\n new Transform( \"\", kIdentity, \" of \" ),\n new Transform( \"\", kUppercaseFirst, \"\" ),\n new Transform( \"\", kIdentity, \" and \" ),\n new Transform( \"\", kOmitFirst2, \"\" ),\n new Transform( \"\", kOmitLast1, \"\" ),\n new Transform( \", \", kIdentity, \" \" ),\n new Transform( \"\", kIdentity, \", \" ),\n new Transform( \" \", kUppercaseFirst, \" \" ),\n new Transform( \"\", kIdentity, \" in \" ),\n new Transform( \"\", kIdentity, \" to \" ),\n new Transform( \"e \", kIdentity, \" \" ),\n new Transform( \"\", kIdentity, \"\\\"\" ),\n new Transform( \"\", kIdentity, \".\" ),\n new Transform( \"\", kIdentity, \"\\\">\" ),\n new Transform( \"\", kIdentity, \"\\n\" ),\n new Transform( \"\", kOmitLast3, \"\" ),\n new Transform( \"\", kIdentity, \"]\" ),\n new Transform( \"\", kIdentity, \" for \" ),\n new Transform( \"\", kOmitFirst3, \"\" ),\n new Transform( \"\", kOmitLast2, \"\" ),\n new Transform( \"\", kIdentity, \" a \" ),\n new Transform( \"\", kIdentity, \" that \" ),\n new Transform( \" \", kUppercaseFirst, \"\" ),\n new Transform( \"\", kIdentity, \". \" ),\n new Transform( \".\", kIdentity, \"\" ),\n new Transform( \" \", kIdentity, \", \" ),\n new Transform( \"\", kOmitFirst4, \"\" ),\n new Transform( \"\", kIdentity, \" with \" ),\n new Transform( \"\", kIdentity, \"'\" ),\n new Transform( \"\", kIdentity, \" from \" ),\n new Transform( \"\", kIdentity, \" by \" ),\n new Transform( \"\", kOmitFirst5, \"\" ),\n new Transform( \"\", kOmitFirst6, \"\" ),\n new Transform( \" the \", kIdentity, \"\" ),\n new Transform( \"\", kOmitLast4, \"\" ),\n new Transform( \"\", kIdentity, \". The \" ),\n new Transform( \"\", kUppercaseAll, \"\" ),\n new Transform( \"\", kIdentity, \" on \" ),\n new Transform( \"\", kIdentity, \" as \" ),\n new Transform( \"\", kIdentity, \" is \" ),\n new Transform( \"\", kOmitLast7, \"\" ),\n new Transform( \"\", kOmitLast1, \"ing \" ),\n new Transform( \"\", kIdentity, \"\\n\\t\" ),\n new Transform( \"\", kIdentity, \":\" ),\n new Transform( \" \", kIdentity, \". \" ),\n new Transform( \"\", kIdentity, \"ed \" ),\n new Transform( \"\", kOmitFirst9, \"\" ),\n new Transform( \"\", kOmitFirst7, \"\" ),\n new Transform( \"\", kOmitLast6, \"\" ),\n new Transform( \"\", kIdentity, \"(\" ),\n new Transform( \"\", kUppercaseFirst, \", \" ),\n new Transform( \"\", kOmitLast8, \"\" ),\n new Transform( \"\", kIdentity, \" at \" ),\n new Transform( \"\", kIdentity, \"ly \" ),\n new Transform( \" the \", kIdentity, \" of \" ),\n new Transform( \"\", kOmitLast5, \"\" ),\n new Transform( \"\", kOmitLast9, \"\" ),\n new Transform( \" \", kUppercaseFirst, \", \" ),\n new Transform( \"\", kUppercaseFirst, \"\\\"\" ),\n new Transform( \".\", kIdentity, \"(\" ),\n new Transform( \"\", kUppercaseAll, \" \" ),\n new Transform( \"\", kUppercaseFirst, \"\\\">\" ),\n new Transform( \"\", kIdentity, \"=\\\"\" ),\n new Transform( \" \", kIdentity, \".\" ),\n new Transform( \".com/\", kIdentity, \"\" ),\n new Transform( \" the \", kIdentity, \" of the \" ),\n new Transform( \"\", kUppercaseFirst, \"'\" ),\n new Transform( \"\", kIdentity, \". This \" ),\n new Transform( \"\", kIdentity, \",\" ),\n new Transform( \".\", kIdentity, \" \" ),\n new Transform( \"\", kUppercaseFirst, \"(\" ),\n new Transform( \"\", kUppercaseFirst, \".\" ),\n new Transform( \"\", kIdentity, \" not \" ),\n new Transform( \" \", kIdentity, \"=\\\"\" ),\n new Transform( \"\", kIdentity, \"er \" ),\n new Transform( \" \", kUppercaseAll, \" \" ),\n new Transform( \"\", kIdentity, \"al \" ),\n new Transform( \" \", kUppercaseAll, \"\" ),\n new Transform( \"\", kIdentity, \"='\" ),\n new Transform( \"\", kUppercaseAll, \"\\\"\" ),\n new Transform( \"\", kUppercaseFirst, \". \" ),\n new Transform( \" \", kIdentity, \"(\" ),\n new Transform( \"\", kIdentity, \"ful \" ),\n new Transform( \" \", kUppercaseFirst, \". \" ),\n new Transform( \"\", kIdentity, \"ive \" ),\n new Transform( \"\", kIdentity, \"less \" ),\n new Transform( \"\", kUppercaseAll, \"'\" ),\n new Transform( \"\", kIdentity, \"est \" ),\n new Transform( \" \", kUppercaseFirst, \".\" ),\n new Transform( \"\", kUppercaseAll, \"\\\">\" ),\n new Transform( \" \", kIdentity, \"='\" ),\n new Transform( \"\", kUppercaseFirst, \",\" ),\n new Transform( \"\", kIdentity, \"ize \" ),\n new Transform( \"\", kUppercaseAll, \".\" ),\n new Transform( \"\\xc2\\xa0\", kIdentity, \"\" ),\n new Transform( \" \", kIdentity, \",\" ),\n new Transform( \"\", kUppercaseFirst, \"=\\\"\" ),\n new Transform( \"\", kUppercaseAll, \"=\\\"\" ),\n new Transform( \"\", kIdentity, \"ous \" ),\n new Transform( \"\", kUppercaseAll, \", \" ),\n new Transform( \"\", kUppercaseFirst, \"='\" ),\n new Transform( \" \", kUppercaseFirst, \",\" ),\n new Transform( \" \", kUppercaseAll, \"=\\\"\" ),\n new Transform( \" \", kUppercaseAll, \", \" ),\n new Transform( \"\", kUppercaseAll, \",\" ),\n new Transform( \"\", kUppercaseAll, \"(\" ),\n new Transform( \"\", kUppercaseAll, \". \" ),\n new Transform( \" \", kUppercaseAll, \".\" ),\n new Transform( \"\", kUppercaseAll, \"='\" ),\n new Transform( \" \", kUppercaseAll, \". \" ),\n new Transform( \" \", kUppercaseFirst, \"=\\\"\" ),\n new Transform( \" \", kUppercaseAll, \"='\" ),\n new Transform( \" \", kUppercaseFirst, \"='\" )\n];\n\nexports.kTransforms = kTransforms;\nexports.kNumTransforms = kTransforms.length;\n\nfunction ToUpperCase(p, i) {\n if (p[i] < 0xc0) {\n if (p[i] >= 97 && p[i] <= 122) {\n p[i] ^= 32;\n }\n return 1;\n }\n \n /* An overly simplified uppercasing model for utf-8. */\n if (p[i] < 0xe0) {\n p[i + 1] ^= 32;\n return 2;\n }\n \n /* An arbitrary transform for three byte characters. */\n p[i + 2] ^= 5;\n return 3;\n}\n\nexports.transformDictionaryWord = function(dst, idx, word, len, transform) {\n var prefix = kTransforms[transform].prefix;\n var suffix = kTransforms[transform].suffix;\n var t = kTransforms[transform].transform;\n var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1);\n var i = 0;\n var start_idx = idx;\n var uppercase;\n \n if (skip > len) {\n skip = len;\n }\n \n var prefix_pos = 0;\n while (prefix_pos < prefix.length) {\n dst[idx++] = prefix[prefix_pos++];\n }\n \n word += skip;\n len -= skip;\n \n if (t <= kOmitLast9) {\n len -= t;\n }\n \n for (i = 0; i < len; i++) {\n dst[idx++] = BrotliDictionary.dictionary[word + i];\n }\n \n uppercase = idx - len;\n \n if (t === kUppercaseFirst) {\n ToUpperCase(dst, uppercase);\n } else if (t === kUppercaseAll) {\n while (len > 0) {\n var step = ToUpperCase(dst, uppercase);\n uppercase += step;\n len -= step;\n }\n }\n \n var suffix_pos = 0;\n while (suffix_pos < suffix.length) {\n dst[idx++] = suffix[suffix_pos++];\n }\n \n return idx - start_idx;\n}\n","/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nvar BrotliInput = require('./streams').BrotliInput;\nvar BrotliOutput = require('./streams').BrotliOutput;\nvar BrotliBitReader = require('./bit_reader');\nvar BrotliDictionary = require('./dictionary');\nvar HuffmanCode = require('./huffman').HuffmanCode;\nvar BrotliBuildHuffmanTable = require('./huffman').BrotliBuildHuffmanTable;\nvar Context = require('./context');\nvar Prefix = require('./prefix');\nvar Transform = require('./transform');\n\nvar kDefaultCodeLength = 8;\nvar kCodeLengthRepeatCode = 16;\nvar kNumLiteralCodes = 256;\nvar kNumInsertAndCopyCodes = 704;\nvar kNumBlockLengthCodes = 26;\nvar kLiteralContextBits = 6;\nvar kDistanceContextBits = 2;\n\nvar HUFFMAN_TABLE_BITS = 8;\nvar HUFFMAN_TABLE_MASK = 0xff;\n/* Maximum possible Huffman table size for an alphabet size of 704, max code\n * length 15 and root table bits 8. */\nvar HUFFMAN_MAX_TABLE_SIZE = 1080;\n\nvar CODE_LENGTH_CODES = 18;\nvar kCodeLengthCodeOrder = new Uint8Array([\n 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n]);\n\nvar NUM_DISTANCE_SHORT_CODES = 16;\nvar kDistanceShortCodeIndexOffset = new Uint8Array([\n 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2\n]);\n\nvar kDistanceShortCodeValueOffset = new Int8Array([\n 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3\n]);\n\nvar kMaxHuffmanTableSize = new Uint16Array([\n 256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,\n 854, 886, 920, 952, 984, 1016, 1048, 1080\n]);\n\nfunction DecodeWindowBits(br) {\n var n;\n if (br.readBits(1) === 0) {\n return 16;\n }\n \n n = br.readBits(3);\n if (n > 0) {\n return 17 + n;\n }\n \n n = br.readBits(3);\n if (n > 0) {\n return 8 + n;\n }\n \n return 17;\n}\n\n/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */\nfunction DecodeVarLenUint8(br) {\n if (br.readBits(1)) {\n var nbits = br.readBits(3);\n if (nbits === 0) {\n return 1;\n } else {\n return br.readBits(nbits) + (1 << nbits);\n }\n }\n return 0;\n}\n\nfunction MetaBlockLength() {\n this.meta_block_length = 0;\n this.input_end = 0;\n this.is_uncompressed = 0;\n this.is_metadata = false;\n}\n\nfunction DecodeMetaBlockLength(br) {\n var out = new MetaBlockLength; \n var size_nibbles;\n var size_bytes;\n var i;\n \n out.input_end = br.readBits(1);\n if (out.input_end && br.readBits(1)) {\n return out;\n }\n \n size_nibbles = br.readBits(2) + 4;\n if (size_nibbles === 7) {\n out.is_metadata = true;\n \n if (br.readBits(1) !== 0)\n throw new Error('Invalid reserved bit');\n \n size_bytes = br.readBits(2);\n if (size_bytes === 0)\n return out;\n \n for (i = 0; i < size_bytes; i++) {\n var next_byte = br.readBits(8);\n if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0)\n throw new Error('Invalid size byte');\n \n out.meta_block_length |= next_byte << (i * 8);\n }\n } else {\n for (i = 0; i < size_nibbles; ++i) {\n var next_nibble = br.readBits(4);\n if (i + 1 === size_nibbles && size_nibbles > 4 && next_nibble === 0)\n throw new Error('Invalid size nibble');\n \n out.meta_block_length |= next_nibble << (i * 4);\n }\n }\n \n ++out.meta_block_length;\n \n if (!out.input_end && !out.is_metadata) {\n out.is_uncompressed = br.readBits(1);\n }\n \n return out;\n}\n\n/* Decodes the next Huffman code from bit-stream. */\nfunction ReadSymbol(table, index, br) {\n var start_index = index;\n \n var nbits;\n br.fillBitWindow();\n index += (br.val_ >>> br.bit_pos_) & HUFFMAN_TABLE_MASK;\n nbits = table[index].bits - HUFFMAN_TABLE_BITS;\n if (nbits > 0) {\n br.bit_pos_ += HUFFMAN_TABLE_BITS;\n index += table[index].value;\n index += (br.val_ >>> br.bit_pos_) & ((1 << nbits) - 1);\n }\n br.bit_pos_ += table[index].bits;\n return table[index].value;\n}\n\nfunction ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, code_lengths, br) {\n var symbol = 0;\n var prev_code_len = kDefaultCodeLength;\n var repeat = 0;\n var repeat_code_len = 0;\n var space = 32768;\n \n var table = [];\n for (var i = 0; i < 32; i++)\n table.push(new HuffmanCode(0, 0));\n \n BrotliBuildHuffmanTable(table, 0, 5, code_length_code_lengths, CODE_LENGTH_CODES);\n\n while (symbol < num_symbols && space > 0) {\n var p = 0;\n var code_len;\n \n br.readMoreInput();\n br.fillBitWindow();\n p += (br.val_ >>> br.bit_pos_) & 31;\n br.bit_pos_ += table[p].bits;\n code_len = table[p].value & 0xff;\n if (code_len < kCodeLengthRepeatCode) {\n repeat = 0;\n code_lengths[symbol++] = code_len;\n if (code_len !== 0) {\n prev_code_len = code_len;\n space -= 32768 >> code_len;\n }\n } else {\n var extra_bits = code_len - 14;\n var old_repeat;\n var repeat_delta;\n var new_len = 0;\n if (code_len === kCodeLengthRepeatCode) {\n new_len = prev_code_len;\n }\n if (repeat_code_len !== new_len) {\n repeat = 0;\n repeat_code_len = new_len;\n }\n old_repeat = repeat;\n if (repeat > 0) {\n repeat -= 2;\n repeat <<= extra_bits;\n }\n repeat += br.readBits(extra_bits) + 3;\n repeat_delta = repeat - old_repeat;\n if (symbol + repeat_delta > num_symbols) {\n throw new Error('[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols');\n }\n \n for (var x = 0; x < repeat_delta; x++)\n code_lengths[symbol + x] = repeat_code_len;\n \n symbol += repeat_delta;\n \n if (repeat_code_len !== 0) {\n space -= repeat_delta << (15 - repeat_code_len);\n }\n }\n }\n if (space !== 0) {\n throw new Error(\"[ReadHuffmanCodeLengths] space = \" + space);\n }\n \n for (; symbol < num_symbols; symbol++)\n code_lengths[symbol] = 0;\n}\n\nfunction ReadHuffmanCode(alphabet_size, tables, table, br) {\n var table_size = 0;\n var simple_code_or_skip;\n var code_lengths = new Uint8Array(alphabet_size);\n \n br.readMoreInput();\n \n /* simple_code_or_skip is used as follows:\n 1 for simple code;\n 0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */\n simple_code_or_skip = br.readBits(2);\n if (simple_code_or_skip === 1) {\n /* Read symbols, codes & code lengths directly. */\n var i;\n var max_bits_counter = alphabet_size - 1;\n var max_bits = 0;\n var symbols = new Int32Array(4);\n var num_symbols = br.readBits(2) + 1;\n while (max_bits_counter) {\n max_bits_counter >>= 1;\n ++max_bits;\n }\n\n for (i = 0; i < num_symbols; ++i) {\n symbols[i] = br.readBits(max_bits) % alphabet_size;\n code_lengths[symbols[i]] = 2;\n }\n code_lengths[symbols[0]] = 1;\n switch (num_symbols) {\n case 1:\n break;\n case 3:\n if ((symbols[0] === symbols[1]) ||\n (symbols[0] === symbols[2]) ||\n (symbols[1] === symbols[2])) {\n throw new Error('[ReadHuffmanCode] invalid symbols');\n }\n break;\n case 2:\n if (symbols[0] === symbols[1]) {\n throw new Error('[ReadHuffmanCode] invalid symbols');\n }\n \n code_lengths[symbols[1]] = 1;\n break;\n case 4:\n if ((symbols[0] === symbols[1]) ||\n (symbols[0] === symbols[2]) ||\n (symbols[0] === symbols[3]) ||\n (symbols[1] === symbols[2]) ||\n (symbols[1] === symbols[3]) ||\n (symbols[2] === symbols[3])) {\n throw new Error('[ReadHuffmanCode] invalid symbols');\n }\n \n if (br.readBits(1)) {\n code_lengths[symbols[2]] = 3;\n code_lengths[symbols[3]] = 3;\n } else {\n code_lengths[symbols[0]] = 2;\n }\n break;\n }\n } else { /* Decode Huffman-coded code lengths. */\n var i;\n var code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES);\n var space = 32;\n var num_codes = 0;\n /* Static Huffman code for the code length code lengths */\n var huff = [\n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2), \n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 1),\n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2), \n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 5)\n ];\n for (i = simple_code_or_skip; i < CODE_LENGTH_CODES && space > 0; ++i) {\n var code_len_idx = kCodeLengthCodeOrder[i];\n var p = 0;\n var v;\n br.fillBitWindow();\n p += (br.val_ >>> br.bit_pos_) & 15;\n br.bit_pos_ += huff[p].bits;\n v = huff[p].value;\n code_length_code_lengths[code_len_idx] = v;\n if (v !== 0) {\n space -= (32 >> v);\n ++num_codes;\n }\n }\n \n if (!(num_codes === 1 || space === 0))\n throw new Error('[ReadHuffmanCode] invalid num_codes or space');\n \n ReadHuffmanCodeLengths(code_length_code_lengths, alphabet_size, code_lengths, br);\n }\n \n table_size = BrotliBuildHuffmanTable(tables, table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size);\n \n if (table_size === 0) {\n throw new Error(\"[ReadHuffmanCode] BuildHuffmanTable failed: \");\n }\n \n return table_size;\n}\n\nfunction ReadBlockLength(table, index, br) {\n var code;\n var nbits;\n code = ReadSymbol(table, index, br);\n nbits = Prefix.kBlockLengthPrefixCode[code].nbits;\n return Prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits);\n}\n\nfunction TranslateShortCodes(code, ringbuffer, index) {\n var val;\n if (code < NUM_DISTANCE_SHORT_CODES) {\n index += kDistanceShortCodeIndexOffset[code];\n index &= 3;\n val = ringbuffer[index] + kDistanceShortCodeValueOffset[code];\n } else {\n val = code - NUM_DISTANCE_SHORT_CODES + 1;\n }\n return val;\n}\n\nfunction MoveToFront(v, index) {\n var value = v[index];\n var i = index;\n for (; i; --i) v[i] = v[i - 1];\n v[0] = value;\n}\n\nfunction InverseMoveToFrontTransform(v, v_len) {\n var mtf = new Uint8Array(256);\n var i;\n for (i = 0; i < 256; ++i) {\n mtf[i] = i;\n }\n for (i = 0; i < v_len; ++i) {\n var index = v[i];\n v[i] = mtf[index];\n if (index) MoveToFront(mtf, index);\n }\n}\n\n/* Contains a collection of huffman trees with the same alphabet size. */\nfunction HuffmanTreeGroup(alphabet_size, num_htrees) {\n this.alphabet_size = alphabet_size;\n this.num_htrees = num_htrees;\n this.codes = new Array(num_htrees + num_htrees * kMaxHuffmanTableSize[(alphabet_size + 31) >>> 5]); \n this.htrees = new Uint32Array(num_htrees);\n}\n\nHuffmanTreeGroup.prototype.decode = function(br) {\n var i;\n var table_size;\n var next = 0;\n for (i = 0; i < this.num_htrees; ++i) {\n this.htrees[i] = next;\n table_size = ReadHuffmanCode(this.alphabet_size, this.codes, next, br);\n next += table_size;\n }\n};\n\nfunction DecodeContextMap(context_map_size, br) {\n var out = { num_htrees: null, context_map: null };\n var use_rle_for_zeros;\n var max_run_length_prefix = 0;\n var table;\n var i;\n \n br.readMoreInput();\n var num_htrees = out.num_htrees = DecodeVarLenUint8(br) + 1;\n\n var context_map = out.context_map = new Uint8Array(context_map_size);\n if (num_htrees <= 1) {\n return out;\n }\n\n use_rle_for_zeros = br.readBits(1);\n if (use_rle_for_zeros) {\n max_run_length_prefix = br.readBits(4) + 1;\n }\n \n table = [];\n for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) {\n table[i] = new HuffmanCode(0, 0);\n }\n \n ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br);\n \n for (i = 0; i < context_map_size;) {\n var code;\n\n br.readMoreInput();\n code = ReadSymbol(table, 0, br);\n if (code === 0) {\n context_map[i] = 0;\n ++i;\n } else if (code <= max_run_length_prefix) {\n var reps = 1 + (1 << code) + br.readBits(code);\n while (--reps) {\n if (i >= context_map_size) {\n throw new Error(\"[DecodeContextMap] i >= context_map_size\");\n }\n context_map[i] = 0;\n ++i;\n }\n } else {\n context_map[i] = code - max_run_length_prefix;\n ++i;\n }\n }\n if (br.readBits(1)) {\n InverseMoveToFrontTransform(context_map, context_map_size);\n }\n \n return out;\n}\n\nfunction DecodeBlockType(max_block_type, trees, tree_type, block_types, ringbuffers, indexes, br) {\n var ringbuffer = tree_type * 2;\n var index = tree_type;\n var type_code = ReadSymbol(trees, tree_type * HUFFMAN_MAX_TABLE_SIZE, br);\n var block_type;\n if (type_code === 0) {\n block_type = ringbuffers[ringbuffer + (indexes[index] & 1)];\n } else if (type_code === 1) {\n block_type = ringbuffers[ringbuffer + ((indexes[index] - 1) & 1)] + 1;\n } else {\n block_type = type_code - 2;\n }\n if (block_type >= max_block_type) {\n block_type -= max_block_type;\n }\n block_types[tree_type] = block_type;\n ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type;\n ++indexes[index];\n}\n\nfunction CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, ringbuffer_mask, br) {\n var rb_size = ringbuffer_mask + 1;\n var rb_pos = pos & ringbuffer_mask;\n var br_pos = br.pos_ & BrotliBitReader.IBUF_MASK;\n var nbytes;\n\n /* For short lengths copy byte-by-byte */\n if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) {\n while (len-- > 0) {\n br.readMoreInput();\n ringbuffer[rb_pos++] = br.readBits(8);\n if (rb_pos === rb_size) {\n output.write(ringbuffer, rb_size);\n rb_pos = 0;\n }\n }\n return;\n }\n\n if (br.bit_end_pos_ < 32) {\n throw new Error('[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32');\n }\n\n /* Copy remaining 0-4 bytes from br.val_ to ringbuffer. */\n while (br.bit_pos_ < 32) {\n ringbuffer[rb_pos] = (br.val_ >>> br.bit_pos_);\n br.bit_pos_ += 8;\n ++rb_pos;\n --len;\n }\n\n /* Copy remaining bytes from br.buf_ to ringbuffer. */\n nbytes = (br.bit_end_pos_ - br.bit_pos_) >> 3;\n if (br_pos + nbytes > BrotliBitReader.IBUF_MASK) {\n var tail = BrotliBitReader.IBUF_MASK + 1 - br_pos;\n for (var x = 0; x < tail; x++)\n ringbuffer[rb_pos + x] = br.buf_[br_pos + x];\n \n nbytes -= tail;\n rb_pos += tail;\n len -= tail;\n br_pos = 0;\n }\n\n for (var x = 0; x < nbytes; x++)\n ringbuffer[rb_pos + x] = br.buf_[br_pos + x];\n \n rb_pos += nbytes;\n len -= nbytes;\n\n /* If we wrote past the logical end of the ringbuffer, copy the tail of the\n ringbuffer to its beginning and flush the ringbuffer to the output. */\n if (rb_pos >= rb_size) {\n output.write(ringbuffer, rb_size);\n rb_pos -= rb_size; \n for (var x = 0; x < rb_pos; x++)\n ringbuffer[x] = ringbuffer[rb_size + x];\n }\n\n /* If we have more to copy than the remaining size of the ringbuffer, then we\n first fill the ringbuffer from the input and then flush the ringbuffer to\n the output */\n while (rb_pos + len >= rb_size) {\n nbytes = rb_size - rb_pos;\n if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) {\n throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');\n }\n output.write(ringbuffer, rb_size);\n len -= nbytes;\n rb_pos = 0;\n }\n\n /* Copy straight from the input onto the ringbuffer. The ringbuffer will be\n flushed to the output at a later time. */\n if (br.input_.read(ringbuffer, rb_pos, len) < len) {\n throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');\n }\n\n /* Restore the state of the bit reader. */\n br.reset();\n}\n\n/* Advances the bit reader position to the next byte boundary and verifies\n that any skipped bits are set to zero. */\nfunction JumpToByteBoundary(br) {\n var new_bit_pos = (br.bit_pos_ + 7) & ~7;\n var pad_bits = br.readBits(new_bit_pos - br.bit_pos_);\n return pad_bits == 0;\n}\n\nfunction BrotliDecompressedSize(buffer) {\n var input = new BrotliInput(buffer);\n var br = new BrotliBitReader(input);\n DecodeWindowBits(br);\n var out = DecodeMetaBlockLength(br);\n return out.meta_block_length;\n}\n\nexports.BrotliDecompressedSize = BrotliDecompressedSize;\n\nfunction BrotliDecompressBuffer(buffer, output_size) {\n var input = new BrotliInput(buffer);\n \n if (output_size == null) {\n output_size = BrotliDecompressedSize(buffer);\n }\n \n var output_buffer = new Uint8Array(output_size);\n var output = new BrotliOutput(output_buffer);\n \n BrotliDecompress(input, output);\n \n if (output.pos < output.buffer.length) {\n output.buffer = output.buffer.subarray(0, output.pos);\n }\n \n return output.buffer;\n}\n\nexports.BrotliDecompressBuffer = BrotliDecompressBuffer;\n\nfunction BrotliDecompress(input, output) {\n var i;\n var pos = 0;\n var input_end = 0;\n var window_bits = 0;\n var max_backward_distance;\n var max_distance = 0;\n var ringbuffer_size;\n var ringbuffer_mask;\n var ringbuffer;\n var ringbuffer_end;\n /* This ring buffer holds a few past copy distances that will be used by */\n /* some special distance codes. */\n var dist_rb = [ 16, 15, 11, 4 ];\n var dist_rb_idx = 0;\n /* The previous 2 bytes used for context. */\n var prev_byte1 = 0;\n var prev_byte2 = 0;\n var hgroup = [new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0)];\n var block_type_trees;\n var block_len_trees;\n var br;\n\n /* We need the slack region for the following reasons:\n - always doing two 8-byte copies for fast backward copying\n - transforms\n - flushing the input ringbuffer when decoding uncompressed blocks */\n var kRingBufferWriteAheadSlack = 128 + BrotliBitReader.READ_SIZE;\n\n br = new BrotliBitReader(input);\n\n /* Decode window size. */\n window_bits = DecodeWindowBits(br);\n max_backward_distance = (1 << window_bits) - 16;\n\n ringbuffer_size = 1 << window_bits;\n ringbuffer_mask = ringbuffer_size - 1;\n ringbuffer = new Uint8Array(ringbuffer_size + kRingBufferWriteAheadSlack + BrotliDictionary.maxDictionaryWordLength);\n ringbuffer_end = ringbuffer_size;\n\n block_type_trees = [];\n block_len_trees = [];\n for (var x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) {\n block_type_trees[x] = new HuffmanCode(0, 0);\n block_len_trees[x] = new HuffmanCode(0, 0);\n }\n\n while (!input_end) {\n var meta_block_remaining_len = 0;\n var is_uncompressed;\n var block_length = [ 1 << 28, 1 << 28, 1 << 28 ];\n var block_type = [ 0 ];\n var num_block_types = [ 1, 1, 1 ];\n var block_type_rb = [ 0, 1, 0, 1, 0, 1 ];\n var block_type_rb_index = [ 0 ];\n var distance_postfix_bits;\n var num_direct_distance_codes;\n var distance_postfix_mask;\n var num_distance_codes;\n var context_map = null;\n var context_modes = null;\n var num_literal_htrees;\n var dist_context_map = null;\n var num_dist_htrees;\n var context_offset = 0;\n var context_map_slice = null;\n var literal_htree_index = 0;\n var dist_context_offset = 0;\n var dist_context_map_slice = null;\n var dist_htree_index = 0;\n var context_lookup_offset1 = 0;\n var context_lookup_offset2 = 0;\n var context_mode;\n var htree_command;\n\n for (i = 0; i < 3; ++i) {\n hgroup[i].codes = null;\n hgroup[i].htrees = null;\n }\n\n br.readMoreInput();\n \n var _out = DecodeMetaBlockLength(br);\n meta_block_remaining_len = _out.meta_block_length;\n if (pos + meta_block_remaining_len > output.buffer.length) {\n /* We need to grow the output buffer to fit the additional data. */\n var tmp = new Uint8Array( pos + meta_block_remaining_len );\n tmp.set( output.buffer );\n output.buffer = tmp;\n } \n input_end = _out.input_end;\n is_uncompressed = _out.is_uncompressed;\n \n if (_out.is_metadata) {\n JumpToByteBoundary(br);\n \n for (; meta_block_remaining_len > 0; --meta_block_remaining_len) {\n br.readMoreInput();\n /* Read one byte and ignore it. */\n br.readBits(8);\n }\n \n continue;\n }\n \n if (meta_block_remaining_len === 0) {\n continue;\n }\n \n if (is_uncompressed) {\n br.bit_pos_ = (br.bit_pos_ + 7) & ~7;\n CopyUncompressedBlockToOutput(output, meta_block_remaining_len, pos,\n ringbuffer, ringbuffer_mask, br);\n pos += meta_block_remaining_len;\n continue;\n }\n \n for (i = 0; i < 3; ++i) {\n num_block_types[i] = DecodeVarLenUint8(br) + 1;\n if (num_block_types[i] >= 2) {\n ReadHuffmanCode(num_block_types[i] + 2, block_type_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n ReadHuffmanCode(kNumBlockLengthCodes, block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n block_length[i] = ReadBlockLength(block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n block_type_rb_index[i] = 1;\n }\n }\n \n br.readMoreInput();\n \n distance_postfix_bits = br.readBits(2);\n num_direct_distance_codes = NUM_DISTANCE_SHORT_CODES + (br.readBits(4) << distance_postfix_bits);\n distance_postfix_mask = (1 << distance_postfix_bits) - 1;\n num_distance_codes = (num_direct_distance_codes + (48 << distance_postfix_bits));\n context_modes = new Uint8Array(num_block_types[0]);\n\n for (i = 0; i < num_block_types[0]; ++i) {\n br.readMoreInput();\n context_modes[i] = (br.readBits(2) << 1);\n }\n \n var _o1 = DecodeContextMap(num_block_types[0] << kLiteralContextBits, br);\n num_literal_htrees = _o1.num_htrees;\n context_map = _o1.context_map;\n \n var _o2 = DecodeContextMap(num_block_types[2] << kDistanceContextBits, br);\n num_dist_htrees = _o2.num_htrees;\n dist_context_map = _o2.context_map;\n \n hgroup[0] = new HuffmanTreeGroup(kNumLiteralCodes, num_literal_htrees);\n hgroup[1] = new HuffmanTreeGroup(kNumInsertAndCopyCodes, num_block_types[1]);\n hgroup[2] = new HuffmanTreeGroup(num_distance_codes, num_dist_htrees);\n\n for (i = 0; i < 3; ++i) {\n hgroup[i].decode(br);\n }\n\n context_map_slice = 0;\n dist_context_map_slice = 0;\n context_mode = context_modes[block_type[0]];\n context_lookup_offset1 = Context.lookupOffsets[context_mode];\n context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];\n htree_command = hgroup[1].htrees[0];\n\n while (meta_block_remaining_len > 0) {\n var cmd_code;\n var range_idx;\n var insert_code;\n var copy_code;\n var insert_length;\n var copy_length;\n var distance_code;\n var distance;\n var context;\n var j;\n var copy_dst;\n\n br.readMoreInput();\n \n if (block_length[1] === 0) {\n DecodeBlockType(num_block_types[1],\n block_type_trees, 1, block_type, block_type_rb,\n block_type_rb_index, br);\n block_length[1] = ReadBlockLength(block_len_trees, HUFFMAN_MAX_TABLE_SIZE, br);\n htree_command = hgroup[1].htrees[block_type[1]];\n }\n --block_length[1];\n cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br);\n range_idx = cmd_code >> 6;\n if (range_idx >= 2) {\n range_idx -= 2;\n distance_code = -1;\n } else {\n distance_code = 0;\n }\n insert_code = Prefix.kInsertRangeLut[range_idx] + ((cmd_code >> 3) & 7);\n copy_code = Prefix.kCopyRangeLut[range_idx] + (cmd_code & 7);\n insert_length = Prefix.kInsertLengthPrefixCode[insert_code].offset +\n br.readBits(Prefix.kInsertLengthPrefixCode[insert_code].nbits);\n copy_length = Prefix.kCopyLengthPrefixCode[copy_code].offset +\n br.readBits(Prefix.kCopyLengthPrefixCode[copy_code].nbits);\n prev_byte1 = ringbuffer[pos-1 & ringbuffer_mask];\n prev_byte2 = ringbuffer[pos-2 & ringbuffer_mask];\n for (j = 0; j < insert_length; ++j) {\n br.readMoreInput();\n\n if (block_length[0] === 0) {\n DecodeBlockType(num_block_types[0],\n block_type_trees, 0, block_type, block_type_rb,\n block_type_rb_index, br);\n block_length[0] = ReadBlockLength(block_len_trees, 0, br);\n context_offset = block_type[0] << kLiteralContextBits;\n context_map_slice = context_offset;\n context_mode = context_modes[block_type[0]];\n context_lookup_offset1 = Context.lookupOffsets[context_mode];\n context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];\n }\n context = (Context.lookup[context_lookup_offset1 + prev_byte1] |\n Context.lookup[context_lookup_offset2 + prev_byte2]);\n literal_htree_index = context_map[context_map_slice + context];\n --block_length[0];\n prev_byte2 = prev_byte1;\n prev_byte1 = ReadSymbol(hgroup[0].codes, hgroup[0].htrees[literal_htree_index], br);\n ringbuffer[pos & ringbuffer_mask] = prev_byte1;\n if ((pos & ringbuffer_mask) === ringbuffer_mask) {\n output.write(ringbuffer, ringbuffer_size);\n }\n ++pos;\n }\n meta_block_remaining_len -= insert_length;\n if (meta_block_remaining_len <= 0) break;\n\n if (distance_code < 0) {\n var context;\n \n br.readMoreInput();\n if (block_length[2] === 0) {\n DecodeBlockType(num_block_types[2],\n block_type_trees, 2, block_type, block_type_rb,\n block_type_rb_index, br);\n block_length[2] = ReadBlockLength(block_len_trees, 2 * HUFFMAN_MAX_TABLE_SIZE, br);\n dist_context_offset = block_type[2] << kDistanceContextBits;\n dist_context_map_slice = dist_context_offset;\n }\n --block_length[2];\n context = (copy_length > 4 ? 3 : copy_length - 2) & 0xff;\n dist_htree_index = dist_context_map[dist_context_map_slice + context];\n distance_code = ReadSymbol(hgroup[2].codes, hgroup[2].htrees[dist_htree_index], br);\n if (distance_code >= num_direct_distance_codes) {\n var nbits;\n var postfix;\n var offset;\n distance_code -= num_direct_distance_codes;\n postfix = distance_code & distance_postfix_mask;\n distance_code >>= distance_postfix_bits;\n nbits = (distance_code >> 1) + 1;\n offset = ((2 + (distance_code & 1)) << nbits) - 4;\n distance_code = num_direct_distance_codes +\n ((offset + br.readBits(nbits)) <<\n distance_postfix_bits) + postfix;\n }\n }\n\n /* Convert the distance code to the actual distance by possibly looking */\n /* up past distnaces from the ringbuffer. */\n distance = TranslateShortCodes(distance_code, dist_rb, dist_rb_idx);\n if (distance < 0) {\n throw new Error('[BrotliDecompress] invalid distance');\n }\n\n if (pos < max_backward_distance &&\n max_distance !== max_backward_distance) {\n max_distance = pos;\n } else {\n max_distance = max_backward_distance;\n }\n\n copy_dst = pos & ringbuffer_mask;\n\n if (distance > max_distance) {\n if (copy_length >= BrotliDictionary.minDictionaryWordLength &&\n copy_length <= BrotliDictionary.maxDictionaryWordLength) {\n var offset = BrotliDictionary.offsetsByLength[copy_length];\n var word_id = distance - max_distance - 1;\n var shift = BrotliDictionary.sizeBitsByLength[copy_length];\n var mask = (1 << shift) - 1;\n var word_idx = word_id & mask;\n var transform_idx = word_id >> shift;\n offset += word_idx * copy_length;\n if (transform_idx < Transform.kNumTransforms) {\n var len = Transform.transformDictionaryWord(ringbuffer, copy_dst, offset, copy_length, transform_idx);\n copy_dst += len;\n pos += len;\n meta_block_remaining_len -= len;\n if (copy_dst >= ringbuffer_end) {\n output.write(ringbuffer, ringbuffer_size);\n \n for (var _x = 0; _x < (copy_dst - ringbuffer_end); _x++)\n ringbuffer[_x] = ringbuffer[ringbuffer_end + _x];\n }\n } else {\n throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n }\n } else {\n throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n }\n } else {\n if (distance_code > 0) {\n dist_rb[dist_rb_idx & 3] = distance;\n ++dist_rb_idx;\n }\n\n if (copy_length > meta_block_remaining_len) {\n throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n }\n\n for (j = 0; j < copy_length; ++j) {\n ringbuffer[pos & ringbuffer_mask] = ringbuffer[(pos - distance) & ringbuffer_mask];\n if ((pos & ringbuffer_mask) === ringbuffer_mask) {\n output.write(ringbuffer, ringbuffer_size);\n }\n ++pos;\n --meta_block_remaining_len;\n }\n }\n\n /* When we get here, we must have inserted at least one literal and */\n /* made a copy of at least length two, therefore accessing the last 2 */\n /* bytes is valid. */\n prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask];\n prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask];\n }\n\n /* Protect pos from overflow, wrap it around at every GB of input data */\n pos &= 0x3fffffff;\n }\n\n output.write(ringbuffer, pos & ringbuffer_mask);\n}\n\nexports.BrotliDecompress = BrotliDecompress;\n\nBrotliDictionary.init();\n","module.exports = require('./dec/decode').BrotliDecompressBuffer;\n","// Import only the decompress function to avoid loading the encoder\n// which has browser-specific code that fails in Node test environments\nimport brotliDecompress from 'brotli/decompress.js';\n\ntype DecompressFn = (buf: Uint8Array) => Uint8Array;\ntype AsyncDecompressFn = (buf: Uint8Array) => Promise<Uint8Array>;\n\n// Native zlib Brotli (Node 11.7+)\nlet nativeBrotli: DecompressFn | null = null;\n\n// Browser DecompressionStream with Brotli support (Firefox, Safari)\nlet browserBrotli: AsyncDecompressFn | null = null;\n\n// Attempt to load native Node implementation synchronously\nfunction tryLoadNative(): DecompressFn | null {\n try {\n if (typeof process !== 'undefined' && process.versions?.node) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const zlib = require('node:zlib');\n if (typeof zlib.brotliDecompressSync === 'function') {\n return (buf: Uint8Array) => {\n const result = zlib.brotliDecompressSync(buf);\n return new Uint8Array(result.buffer, result.byteOffset, result.byteLength);\n };\n }\n }\n } catch {\n // Not in Node or zlib unavailable\n }\n return null;\n}\n\n// Check for browser DecompressionStream with Brotli support (Firefox 113+, Safari 16.4+)\nfunction tryLoadBrowserBrotli(): AsyncDecompressFn | null {\n try {\n if (typeof DecompressionStream !== 'undefined') {\n // Throws if 'brotli' format not supported (Chrome currently lacks it)\n new DecompressionStream('brotli');\n return async (buf: Uint8Array): Promise<Uint8Array> => {\n // Slice ensures we get a plain ArrayBuffer, cast needed for SharedArrayBuffer compatibility\n const arrayBuf = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer;\n const blob = new Blob([arrayBuf]);\n const decompressed = blob.stream().pipeThrough(new DecompressionStream('brotli'));\n return new Uint8Array(await new Response(decompressed).arrayBuffer());\n };\n }\n } catch {\n // DecompressionStream doesn't support 'brotli' (Chrome) or not available\n }\n return null;\n}\n\nnativeBrotli = tryLoadNative();\nbrowserBrotli = tryLoadBrowserBrotli();\n\n// Async decompress: tries native Node, then browser DecompressionStream, then pure JS\nexport async function decompress(data: Uint8Array): Promise<Uint8Array> {\n if (nativeBrotli) {\n return nativeBrotli(data);\n }\n if (browserBrotli) {\n return browserBrotli(data);\n }\n return brotliDecompress(data);\n}\n\n// Explicit implementations for benchmarking\nexport function decompressNative(data: Uint8Array): Uint8Array {\n if (!nativeBrotli) {\n throw new Error('Native Brotli not available');\n }\n return nativeBrotli(data);\n}\n\nexport function decompressPure(data: Uint8Array): Uint8Array {\n return brotliDecompress(data);\n}\n\nexport const hasNative = nativeBrotli !== null;\nexport const hasBrowserNative = browserBrotli !== null;\n","// Binary reader with bounds checking\nexport class Buffer {\n private view: DataView;\n private u8: Uint8Array;\n private pos: number = 0;\n\n constructor(data: ArrayBuffer | Uint8Array, offset: number = 0, length?: number) {\n if (data instanceof Uint8Array) {\n const len = length ?? data.byteLength - offset;\n this.u8 = data.subarray(offset, offset + len);\n this.view = new DataView(data.buffer, data.byteOffset + offset, len);\n } else {\n const len = length ?? data.byteLength - offset;\n this.u8 = new Uint8Array(data, offset, len);\n this.view = new DataView(data, offset, len);\n }\n }\n\n get offset(): number {\n return this.pos;\n }\n\n get length(): number {\n return this.u8.byteLength;\n }\n\n get remaining(): number {\n return this.u8.byteLength - this.pos;\n }\n\n get buffer(): DataView {\n return this.view;\n }\n\n skip(n: number): boolean {\n if (this.pos + n > this.u8.byteLength || this.pos + n < this.pos) {\n return false;\n }\n this.pos += n;\n return true;\n }\n\n seek(offset: number): boolean {\n if (offset > this.u8.byteLength || offset < 0) {\n return false;\n }\n this.pos = offset;\n return true;\n }\n\n readU8(): number | null {\n if (this.pos + 1 > this.u8.byteLength) return null;\n return this.u8[this.pos++];\n }\n\n readU16(): number | null {\n if (this.pos + 2 > this.u8.byteLength) return null;\n const idx = this.pos;\n this.pos = idx + 2;\n return (this.u8[idx] << 8) | this.u8[idx + 1];\n }\n\n readS16(): number | null {\n if (this.pos + 2 > this.u8.byteLength) return null;\n const idx = this.pos;\n this.pos = idx + 2;\n const val = (this.u8[idx] << 8) | this.u8[idx + 1];\n return (val & 0x8000) !== 0 ? val - 0x10000 : val;\n }\n\n readU32(): number | null {\n if (this.pos + 4 > this.u8.byteLength) return null;\n const idx = this.pos;\n this.pos = idx + 4;\n return (\n (this.u8[idx] * 0x1000000 +\n ((this.u8[idx + 1] << 16) | (this.u8[idx + 2] << 8) | this.u8[idx + 3])) >>>\n 0\n );\n }\n\n readS32(): number | null {\n if (this.pos + 4 > this.u8.byteLength) return null;\n const idx = this.pos;\n this.pos = idx + 4;\n return (\n (this.u8[idx] << 24) |\n (this.u8[idx + 1] << 16) |\n (this.u8[idx + 2] << 8) |\n this.u8[idx + 3]\n );\n }\n\n readBytes(n: number): Uint8Array | null {\n if (this.pos + n > this.u8.byteLength || n < 0) return null;\n const result = this.u8.subarray(this.pos, this.pos + n);\n this.pos += n;\n return result;\n }\n\n peekU8(offset: number = 0): number | null {\n const idx = this.pos + offset;\n if (idx >= this.u8.byteLength || idx < 0) return null;\n return this.u8[idx];\n }\n\n subarray(offset: number, length: number): Uint8Array | null {\n if (offset + length > this.u8.byteLength || offset < 0 || length < 0) {\n return null;\n }\n return this.u8.subarray(offset, offset + length);\n }\n}\n","// Tables with index < 63 use single-byte encoding in WOFF2\n// Order matches the reference implementation\nexport const KNOWN_TAGS: readonly number[] = [\n 0x636d6170, // 0 cmap\n 0x68656164, // 1 head\n 0x68686561, // 2 hhea\n 0x686d7478, // 3 hmtx\n 0x6d617870, // 4 maxp\n 0x6e616d65, // 5 name\n 0x4f532f32, // 6 OS/2\n 0x706f7374, // 7 post\n 0x63767420, // 8 cvt \n 0x6670676d, // 9 fpgm\n 0x676c7966, // 10 glyf\n 0x6c6f6361, // 11 loca\n 0x70726570, // 12 prep\n 0x43464620, // 13 CFF \n 0x564f5247, // 14 VORG\n 0x45424454, // 15 EBDT\n 0x45424c43, // 16 EBLC\n 0x67617370, // 17 gasp\n 0x68646d78, // 18 hdmx\n 0x6b65726e, // 19 kern\n 0x4c545348, // 20 LTSH\n 0x50434c54, // 21 PCLT\n 0x56444d58, // 22 VDMX\n 0x76686561, // 23 vhea\n 0x766d7478, // 24 vmtx\n 0x42415345, // 25 BASE\n 0x47444546, // 26 GDEF\n 0x47504f53, // 27 GPOS\n 0x47535542, // 28 GSUB\n 0x45425343, // 29 EBSC\n 0x4a535446, // 30 JSTF\n 0x4d415448, // 31 MATH\n 0x43424454, // 32 CBDT\n 0x43424c43, // 33 CBLC\n 0x434f4c52, // 34 COLR\n 0x4350414c, // 35 CPAL\n 0x53564720, // 36 SVG \n 0x73626978, // 37 sbix\n 0x61636e74, // 38 acnt\n 0x61766172, // 39 avar\n 0x62646174, // 40 bdat\n 0x626c6f63, // 41 bloc\n 0x62736c6e, // 42 bsln\n 0x63766172, // 43 cvar\n 0x66647363, // 44 fdsc\n 0x66656174, // 45 feat\n 0x666d7478, // 46 fmtx\n 0x66766172, // 47 fvar\n 0x67766172, // 48 gvar\n 0x68737479, // 49 hsty\n 0x6a757374, // 50 just\n 0x6c636172, // 51 lcar\n 0x6d6f7274, // 52 mort\n 0x6d6f7278, // 53 morx\n 0x6f706264, // 54 opbd\n 0x70726f70, // 55 prop\n 0x7472616b, // 56 trak\n 0x5a617066, // 57 Zapf\n 0x53696c66, // 58 Silf\n 0x476c6174, // 59 Glat\n 0x476c6f63, // 60 Gloc\n 0x46656174, // 61 Feat\n 0x53696c6c, // 62 Sill\n] as const;\n\n// Table tag constants for quick access\nexport const TAG_GLYF = 0x676c7966;\nexport const TAG_LOCA = 0x6c6f6361;\nexport const TAG_HMTX = 0x686d7478;\nexport const TAG_HHEA = 0x68686561;\nexport const TAG_HEAD = 0x68656164;\nexport const TAG_CFF = 0x43464620;\nexport const TAG_CFF2 = 0x43464632;\n\n// TTC flavor\nexport const TTC_FLAVOR = 0x74746366; // 'ttcf'\n\n// WOFF2 signature\nexport const WOFF2_SIGNATURE = 0x774f4632; // 'wOF2'\n\n// Transform flag bit\nexport const WOFF2_FLAGS_TRANSFORM = 1 << 5;\n\nexport function tagToString(tag: number): string {\n return String.fromCharCode(\n (tag >> 24) & 0xff,\n (tag >> 16) & 0xff,\n (tag >> 8) & 0xff,\n tag & 0xff\n );\n}\n","import { Buffer } from './buffer';\n\n// Variable length encoding for values 0-65535 (WOFF2 spec 6.1.1)\nexport function read255UShort(buf: Buffer): number | null {\n const code = buf.readU8();\n if (code === null) return null;\n\n if (code === 253) {\n // Word follows\n return buf.readU16();\n } else if (code === 255) {\n // One more byte, value = 253 + next byte\n const next = buf.readU8();\n if (next === null) return null;\n return 253 + next;\n } else if (code === 254) {\n // One more byte, value = 506 + next byte\n const next = buf.readU8();\n if (next === null) return null;\n return 253 * 2 + next;\n } else {\n return code;\n }\n}\n\n// Variable length encoding for larger values (WOFF2 spec 6.1.2)\nexport function readBase128(buf: Buffer): number | null {\n let result = 0;\n\n for (let i = 0; i < 5; i++) {\n const code = buf.readU8();\n if (code === null) return null;\n\n // Leading zeros are invalid\n if (i === 0 && code === 0x80) {\n return null;\n }\n\n // Check for overflow - if any of the top 7 bits are set, we'll overflow\n if ((result & 0xfe000000) !== 0) {\n return null;\n }\n\n result = (result << 7) | (code & 0x7f);\n\n // If high bit is not set, we're done\n if ((code & 0x80) === 0) {\n return result;\n }\n }\n\n // Too many bytes\n return null;\n}\n\nexport function write255UShort(value: number): Uint8Array {\n if (value < 253) {\n return new Uint8Array([value]);\n } else if (value < 506) {\n return new Uint8Array([255, value - 253]);\n } else if (value < 762) {\n return new Uint8Array([254, value - 506]);\n } else {\n return new Uint8Array([253, (value >> 8) & 0xff, value & 0xff]);\n }\n}\n\nexport function size255UShort(value: number): number {\n if (value < 253) return 1;\n if (value < 762) return 2;\n return 3;\n}\n","import { decompress as brotliDecompress, decompressPure as brotliDecompressPure } from './brotli';\nimport { Buffer } from './buffer';\nimport {\n KNOWN_TAGS,\n TAG_GLYF,\n TAG_LOCA,\n TAG_HMTX,\n TAG_HHEA,\n TAG_HEAD,\n TTC_FLAVOR,\n WOFF2_SIGNATURE,\n WOFF2_FLAGS_TRANSFORM,\n tagToString,\n} from './known-tags';\nimport { readBase128, read255UShort } from './variable-length';\n\n// SFNT constants\nconst SFNT_HEADER_SIZE = 12;\nconst SFNT_ENTRY_SIZE = 16;\n\n// TrueType glyph point encoding flags\nconst FLAG_ON_CURVE = 1;\nconst FLAG_X_SHORT = 1 << 1;\nconst FLAG_Y_SHORT = 1 << 2;\nconst FLAG_REPEAT = 1 << 3;\nconst FLAG_X_SAME = 1 << 4;\nconst FLAG_Y_SAME = 1 << 5;\nconst FLAG_OVERLAP_SIMPLE = 1 << 6;\n\ninterface Table {\n tag: number;\n flags: number;\n origLength: number;\n transformLength: number;\n srcOffset: number;\n srcLength: number;\n dstOffset: number;\n dstLength: number;\n key: string;\n}\n\ninterface FontInfo {\n numGlyphs: number;\n indexFormat: number;\n numHMetrics: number;\n xMins: Int16Array;\n tableEntryByTag: Map<number, number>;\n}\n\ninterface TtcFont {\n flavor: number;\n dstOffset: number;\n headerChecksum: number;\n tableIndices: number[];\n}\n\ninterface Woff2Header {\n flavor: number;\n headerVersion: number;\n numTables: number;\n compressedOffset: number;\n compressedLength: number;\n uncompressedSize: number;\n tables: Table[];\n ttcFonts: TtcFont[];\n}\n\nexport interface DecodeOptions {\n forcePureBrotli?: boolean;\n}\n\n// Decode a WOFF2 font to TTF/OTF format\nexport async function decode(data: ArrayBuffer | Uint8Array, options?: DecodeOptions): Promise<Uint8Array> {\n const input = data instanceof Uint8Array ? data : new Uint8Array(data);\n const buf = new Buffer(input);\n\n // Read and validate header\n const header = readHeader(buf, input.byteLength);\n if (!header) {\n throw new Error('Failed to read WOFF2 header');\n }\n\n // Decompress table data\n const compressedData = input.subarray(\n header.compressedOffset,\n header.compressedOffset + header.compressedLength\n );\n\n const decompressed = options?.forcePureBrotli \n ? brotliDecompressPure(compressedData)\n : await brotliDecompress(compressedData);\n if (!decompressed || decompressed.byteLength !== header.uncompressedSize) {\n throw new Error(\n `Brotli decompression failed: expected ${header.uncompressedSize} bytes, got ${decompressed?.byteLength ?? 0}`\n );\n }\n\n // Calculate output size\n const firstTableOffset = computeOffsetToFirstTable(header);\n let outputSize = firstTableOffset;\n for (const table of header.tables) {\n outputSize += table.origLength;\n outputSize += (4 - (table.origLength % 4)) % 4; // padding\n }\n\n // Allocate output buffer\n const output = new Uint8Array(outputSize);\n const outView = new DataView(output.buffer);\n\n // Write headers\n const fontInfos = writeHeaders(header, output, outView);\n\n // Track written tables by tag/srcOffset for TTC table sharing\n const writtenTables = new Map<string, { dstOffset: number; dstLength: number; checksum: number }>();\n let nextTableOffset = computeOffsetToFirstTable(header);\n\n // Reconstruct font(s)\n if (header.ttcFonts.length > 0) {\n // TTC - multiple fonts\n for (let i = 0; i < header.ttcFonts.length; i++) {\n nextTableOffset = reconstructFont(\n decompressed, header, i, fontInfos[i], output, outView,\n writtenTables, nextTableOffset\n );\n }\n } else {\n // Single font\n reconstructFont(\n decompressed, header, 0, fontInfos[0], output, outView,\n writtenTables, nextTableOffset\n );\n }\n\n return output;\n}\n\nfunction readHeader(buf: Buffer, totalLength: number): Woff2Header | null {\n const signature = buf.readU32();\n if (signature !== WOFF2_SIGNATURE) {\n return null;\n }\n\n const flavor = buf.readU32();\n if (flavor === null) return null;\n\n const length = buf.readU32();\n if (length === null || length !== totalLength) return null;\n\n const numTables = buf.readU16();\n if (numTables === null || numTables === 0) return null;\n\n // Skip reserved\n if (!buf.skip(2)) return null;\n\n // Skip totalSfntSize (we compute it ourselves)\n if (!buf.skip(4)) return null;\n\n const compressedLength = buf.readU32();\n if (compressedLength === null) return null;\n\n // Skip majorVersion, minorVersion\n if (!buf.skip(4)) return null;\n\n const metaOffset = buf.readU32();\n const metaLength = buf.readU32();\n const metaOrigLength = buf.readU32();\n if (metaOffset === null || metaLength === null || metaOrigLength === null) return null;\n\n if (metaOffset !== 0) {\n if (metaOffset >= totalLength || totalLength - metaOffset < metaLength) {\n return null;\n }\n }\n\n const privOffset = buf.readU32();\n const privLength = buf.readU32();\n if (privOffset === null || privLength === null) return null;\n\n if (privOffset !== 0) {\n if (privOffset >= totalLength || totalLength - privOffset < privLength) {\n return null;\n }\n }\n\n // Read table directory\n const tables = readTableDirectory(buf, numTables);\n if (!tables) return null;\n\n // Calculate uncompressed size from last table\n const lastTable = tables[tables.length - 1];\n const uncompressedSize = lastTable.srcOffset + lastTable.srcLength;\n\n let headerVersion = 0;\n const ttcFonts: TtcFont[] = [];\n\n // Handle TTC (font collection)\n if (flavor === TTC_FLAVOR) {\n headerVersion = buf.readU32() ?? 0;\n if (headerVersion !== 0x00010000 && headerVersion !== 0x00020000) {\n return null;\n }\n\n const numFonts = read255UShort(buf);\n if (numFonts === null || numFonts === 0) return null;\n\n for (let i = 0; i < numFonts; i++) {\n const fontNumTables = read255UShort(buf);\n if (fontNumTables === null || fontNumTables === 0) return null;\n\n const fontFlavor = buf.readU32();\n if (fontFlavor === null) return null;\n\n const tableIndices: number[] = [];\n for (let j = 0; j < fontNumTables; j++) {\n const idx = read255UShort(buf);\n if (idx === null || idx >= tables.length) return null;\n tableIndices.push(idx);\n }\n\n ttcFonts.push({\n flavor: fontFlavor,\n dstOffset: 0,\n headerChecksum: 0,\n tableIndices,\n });\n }\n }\n\n return {\n flavor,\n headerVersion,\n numTables,\n compressedOffset: buf.offset,\n compressedLength,\n uncompressedSize,\n tables,\n ttcFonts,\n };\n}\n\nfunction readTableDirectory(buf: Buffer, numTables: number): Table[] | null {\n const tables: Table[] = [];\n let srcOffset = 0;\n\n for (let i = 0; i < numTables; i++) {\n const flagByte = buf.readU8();\n if (flagByte === null) return null;\n\n let tag: number;\n if ((flagByte & 0x3f) === 0x3f) {\n // Arbitrary tag follows\n tag = buf.readU32() ?? 0;\n if (tag === 0) return null;\n } else {\n tag = KNOWN_TAGS[flagByte & 0x3f];\n }\n\n const xformVersion = (flagByte >> 6) & 0x03;\n let flags = 0;\n\n // glyf/loca: xform version 0 means transform applied\n // others: xform version != 0 means transform applied\n if (tag === TAG_GLYF || tag === TAG_LOCA) {\n if (xformVersion === 0) {\n flags |= WOFF2_FLAGS_TRANSFORM;\n }\n } else if (xformVersion !== 0) {\n flags |= WOFF2_FLAGS_TRANSFORM;\n }\n flags |= xformVersion;\n\n const origLength = readBase128(buf);\n if (origLength === null) return null;\n\n let transformLength = origLength;\n if ((flags & WOFF2_FLAGS_TRANSFORM) !== 0) {\n transformLength = readBase128(buf) ?? 0;\n if (transformLength === 0 && tag !== TAG_LOCA) return null;\n if (tag === TAG_LOCA && transformLength !== 0) return null;\n }\n\n tables.push({\n tag,\n flags,\n origLength,\n transformLength,\n srcOffset,\n srcLength: transformLength,\n dstOffset: 0,\n dstLength: origLength,\n key: `${tag}:${srcOffset}`,\n });\n\n srcOffset += transformLength;\n }\n\n return tables;\n}\n\nfunction computeOffsetToFirstTable(header: Woff2Header): number {\n if (header.ttcFonts.length === 0) {\n return SFNT_HEADER_SIZE + SFNT_ENTRY_SIZE * header.numTables;\n }\n\n // TTC header size\n let offset = 12; // ttcTag, version, numFonts\n offset += 4 * header.ttcFonts.length; // offset table\n if (header.headerVersion === 0x00020000) {\n offset += 12; // DSIG fields\n }\n\n // Offset tables for each font\n for (const ttcFont of header.ttcFonts) {\n offset += SFNT_HEADER_SIZE;\n offset += SFNT_ENTRY_SIZE * ttcFont.tableIndices.length;\n }\n\n return offset;\n}\n\nfunction writeHeaders(\n header: Woff2Header,\n output: Uint8Array,\n outView: DataView\n): FontInfo[] {\n const fontInfos: FontInfo[] = [];\n let offset = 0;\n\n if (header.ttcFonts.length > 0) {\n // TTC header\n outView.setUint32(offset, header.flavor); // ttcTag\n offset += 4;\n outView.setUint32(offset, header.headerVersion);\n offset += 4;\n outView.setUint32(offset, header.ttcFonts.length);\n offset += 4;\n\n const offsetTableStart = offset;\n offset += 4 * header.ttcFonts.length; // Space for offset table\n\n if (header.headerVersion === 0x00020000) {\n // DSIG fields (zeroed)\n offset += 12;\n }\n\n // Write each font's offset table\n for (let i = 0; i < header.ttcFonts.length; i++) {\n const ttcFont = header.ttcFonts[i];\n outView.setUint32(offsetTableStart + i * 4, offset);\n ttcFont.dstOffset = offset;\n\n const numTables = ttcFont.tableIndices.length;\n offset = writeOffsetTable(outView, offset, ttcFont.flavor, numTables);\n\n // Sort table indices by tag for this font\n const sortedIndices = [...ttcFont.tableIndices].sort(\n (a, b) => header.tables[a].tag - header.tables[b].tag\n );\n\n const tableEntryByTag = new Map<number, number>();\n for (const tableIdx of sortedIndices) {\n const table = header.tables[tableIdx];\n tableEntryByTag.set(table.tag, offset);\n offset = writeTableEntry(outView, offset, table.tag);\n }\n\n // Update tableIndices to sorted order for later reconstruction\n ttcFont.tableIndices = sortedIndices;\n\n ttcFont.headerChecksum = computeChecksum(\n output,\n ttcFont.dstOffset,\n offset - ttcFont.dstOffset\n );\n\n fontInfos.push({\n numGlyphs: 0,\n indexFormat: 0,\n numHMetrics: 0,\n xMins: new Int16Array(0),\n tableEntryByTag,\n });\n }\n } else {\n // Single font\n offset = writeOffsetTable(outView, offset, header.flavor, header.numTables);\n\n // Sort tables by tag for output\n const sortedTables = [...header.tables].sort((a, b) => a.tag - b.tag);\n const tableEntryByTag = new Map<number, number>();\n\n for (const table of sortedTables) {\n tableEntryByTag.set(table.tag, offset);\n offset = writeTableEntry(outView, offset, table.tag);\n }\n\n fontInfos.push({\n numGlyphs: 0,\n indexFormat: 0,\n numHMetrics: 0,\n xMins: new Int16Array(0),\n tableEntryByTag,\n });\n }\n\n return fontInfos;\n}\n\nfunction writeOffsetTable(\n view: DataView,\n offset: number,\n flavor: number,\n numTables: number\n): number {\n view.setUint32(offset, flavor);\n view.setUint16(offset + 4, numTables);\n\n let maxPow2 = 0;\n while ((1 << (maxPow2 + 1)) <= numTables) {\n maxPow2++;\n }\n const searchRange = (1 << maxPow2) * 16;\n\n view.setUint16(offset + 6, searchRange);\n view.setUint16(offset + 8, maxPow2);\n view.setUint16(offset + 10, numTables * 16 - searchRange);\n\n return offset + SFNT_HEADER_SIZE;\n}\n\nfunction writeTableEntry(view: DataView, offset: number, tag: number): number {\n view.setUint32(offset, tag);\n view.setUint32(offset + 4, 0); // checksum placeholder\n view.setUint32(offset + 8, 0); // offset placeholder\n view.setUint32(offset + 12, 0); // length placeholder\n return offset + SFNT_ENTRY_SIZE;\n}\n\nfunction reconstructFont(\n decompressed: Uint8Array,\n header: Woff2Header,\n fontIndex: number,\n fontInfo: FontInfo,\n output: Uint8Array,\n outView: DataView,\n writtenTables: Map<string, { dstOffset: number; dstLength: number; checksum: number }>,\n dstOffset: number\n): number {\n const tables =\n header.ttcFonts.length > 0\n ? header.ttcFonts[fontIndex].tableIndices.map((i) => header.tables[i])\n : header.tables;\n\n // Sort tables for processing\n const sortedTables = [...tables].sort((a, b) => a.tag - b.tag);\n\n // First pass: find glyf/loca and hhea for metadata\n const glyfTable = sortedTables.find((t) => t.tag === TAG_GLYF);\n const locaTable = sortedTables.find((t) => t.tag === TAG_LOCA);\n const hheaTable = sortedTables.find((t) => t.tag === TAG_HHEA);\n\n if (hheaTable) {\n const hheaData = decompressed.subarray(\n hheaTable.srcOffset,\n hheaTable.srcOffset + hheaTable.srcLength\n );\n if (hheaData.byteLength >= 36) {\n const hheaView = new DataView(hheaData.buffer, hheaData.byteOffset);\n fontInfo.numHMetrics = hheaView.getUint16(34);\n }\n }\n\n // Initialize font checksum for TTC (for single fonts, we compute at the end)\n let fontChecksum = header.ttcFonts.length > 0\n ? header.ttcFonts[fontIndex].headerChecksum\n : 0;\n const isTTC = header.ttcFonts.length > 0;\n\n // Write each table\n for (const table of sortedTables) {\n const entryOffset = fontInfo.tableEntryByTag.get(table.tag);\n if (entryOffset === undefined) continue;\n\n // Check if this table was already written (TTC table sharing)\n const tKey = table.key;\n const existing = writtenTables.get(tKey);\n if (existing) {\n // Reuse the existing table\n updateTableEntry(outView, entryOffset, existing.checksum, existing.dstOffset, existing.dstLength);\n if (isTTC) {\n // Add its checksum to font checksum\n fontChecksum = (fontChecksum + existing.checksum) >>> 0;\n // Add checksum of the 12-byte table entry update\n fontChecksum = (fontChecksum + computeTableEntryChecksum(existing.checksum, existing.dstOffset, existing.dstLength)) >>> 0;\n }\n continue;\n }\n\n table.dstOffset = dstOffset;\n\n let tableData: Uint8Array;\n let checksum: number;\n\n if ((table.flags & WOFF2_FLAGS_TRANSFORM) !== 0) {\n if (table.tag === TAG_GLYF && glyfTable && locaTable) {\n // Reconstruct glyf/loca\n const result = reconstructGlyf(\n decompressed,\n glyfTable,\n locaTable,\n fontInfo\n );\n tableData = result.glyfData;\n glyfTable.dstLength = result.glyfData.byteLength;\n locaTable.dstOffset = dstOffset + pad4(result.glyfData.byteLength);\n locaTable.dstLength = result.locaData.byteLength;\n\n // Write glyf\n output.set(tableData, dstOffset);\n checksum = computeChecksum(output, dstOffset, tableData.byteLength);\n updateTableEntry(outView, entryOffset, checksum, dstOffset, tableData.byteLength);\n if (isTTC) {\n fontChecksum = (fontChecksum + checksum) >>> 0;\n fontChecksum = (fontChecksum + computeTableEntryChecksum(checksum, dstOffset, tableData.byteLength)) >>> 0;\n }\n writtenTables.set(tKey, {\n dstOffset,\n dstLength: tableData.byteLength,\n checksum,\n });\n dstOffset += pad4(tableData.byteLength);\n\n // Write loca\n const locaEntryOffset = fontInfo.tableEntryByTag.get(TAG_LOCA);\n if (locaEntryOffset !== undefined) {\n output.set(result.locaData, dstOffset);\n const locaChecksum = computeChecksum(output, dstOffset, result.locaData.byteLength);\n updateTableEntry(outView, locaEntryOffset, locaChecksum, dstOffset, result.locaData.byteLength);\n if (isTTC) {\n fontChecksum = (fontChecksum + locaChecksum) >>> 0;\n fontChecksum = (fontChecksum + computeTableEntryChecksum(locaChecksum, dstOffset, result.locaData.byteLength)) >>> 0;\n }\n writtenTables.set(locaTable.key, {\n dstOffset,\n dstLength: result.locaData.byteLength,\n checksum: locaChecksum,\n });\n dstOffset += pad4(result.locaData.byteLength);\n }\n continue;\n } else if (table.tag === TAG_LOCA) {\n // Already handled with glyf\n continue;\n } else if (table.tag === TAG_HMTX) {\n // Reconstruct hmtx\n tableData = reconstructHmtx(\n decompressed,\n table,\n fontInfo.numGlyphs,\n fontInfo.numHMetrics,\n fontInfo.xMins\n );\n } else {\n throw new Error(`Unknown transform for table ${tagToString(table.tag)}`);\n }\n } else {\n // No transform, copy directly\n tableData = decompressed.subarray(\n table.srcOffset,\n table.srcOffset + table.srcLength\n );\n\n // Zero out checkSumAdjustment in head table\n if (table.tag === TAG_HEAD && tableData.byteLength >= 12) {\n tableData = new Uint8Array(tableData); // Copy to avoid modifying decompressed\n const headView = new DataView(tableData.buffer, tableData.byteOffset);\n headView.setUint32(8, 0);\n }\n }\n\n output.set(tableData, dstOffset);\n checksum = computeChecksum(output, dstOffset, tableData.byteLength);\n table.dstLength = tableData.byteLength;\n\n updateTableEntry(outView, entryOffset, checksum, dstOffset, tableData.byteLength);\n if (isTTC) {\n fontChecksum = (fontChecksum + checksum) >>> 0;\n fontChecksum = (fontChecksum + computeTableEntryChecksum(checksum, dstOffset, tableData.byteLength)) >>> 0;\n }\n writtenTables.set(tKey, {\n dstOffset,\n dstLength: tableData.byteLength,\n checksum,\n });\n dstOffset += pad4(tableData.byteLength);\n }\n\n // Update head checkSumAdjustment\n const headTable = sortedTables.find((t) => t.tag === TAG_HEAD);\n if (headTable) {\n const headEntry = writtenTables.get(headTable.key);\n if (headEntry && headEntry.dstLength >= 12) {\n // For single fonts, compute checksum over entire output\n // For TTC, use accumulated fontChecksum\n const finalChecksum = isTTC\n ? fontChecksum\n : computeChecksum(output, 0, dstOffset);\n outView.setUint32(headEntry.dstOffset + 8, (0xb1b0afba - finalChecksum) >>> 0);\n }\n }\n\n return dstOffset;\n}\n\nfunction computeTableEntryChecksum(checksum: number, offset: number, length: number): number {\n return (checksum + offset + length) >>> 0;\n}\n\n// Lightweight byte reader to avoid Buffer class overhead in hot paths\ninterface ByteStream {\n data: Uint8Array;\n pos: number;\n end: number;\n}\n\nfunction makeByteStream(data: Uint8Array, start: number, length: number): ByteStream {\n return { data, pos: start, end: start + length };\n}\n\nfunction bsReadU8(stream: ByteStream): number {\n if (stream.pos >= stream.end) throw new Error('Stream overflow');\n return stream.data[stream.pos++];\n}\n\nfunction bsReadU16(stream: ByteStream): number {\n if (stream.pos + 2 > stream.end) throw new Error('Stream overflow');\n const idx = stream.pos;\n stream.pos = idx + 2;\n return (stream.data[idx] << 8) | stream.data[idx + 1];\n}\n\nfunction bsReadS16(stream: ByteStream): number {\n if (stream.pos + 2 > stream.end) throw new Error('Stream overflow');\n const idx = stream.pos;\n stream.pos = idx + 2;\n const val = (stream.data[idx] << 8) | stream.data[idx + 1];\n return (val & 0x8000) !== 0 ? val - 0x10000 : val;\n}\n\nfunction fsReadU32(stream: ByteStream): number {\n if (stream.pos + 4 > stream.end) throw new Error('Stream overflow');\n const idx = stream.pos;\n stream.pos = idx + 4;\n return (\n (stream.data[idx] * 0x1000000 +\n ((stream.data[idx + 1] << 16) | (stream.data[idx + 2] << 8) | stream.data[idx + 3])) >>>\n 0\n );\n}\n\nfunction bsSkip(stream: ByteStream, n: number): void {\n if (stream.pos + n > stream.end || n < 0) throw new Error('Stream overflow');\n stream.pos += n;\n}\n\nfunction fsReadBytes(stream: ByteStream, n: number): Uint8Array {\n if (stream.pos + n > stream.end || n < 0) throw new Error('Stream overflow');\n const start = stream.pos;\n stream.pos += n;\n return stream.data.subarray(start, start + n);\n}\n\nfunction bsRead255UShort(stream: ByteStream): number {\n const code = bsReadU8(stream);\n if (code === 253) {\n return bsReadU16(stream);\n } else if (code === 255) {\n return 253 + bsReadU8(stream);\n } else if (code === 254) {\n return 253 * 2 + bsReadU8(stream);\n }\n return code;\n}\n\n// WOFF2 transforms glyf/loca tables for better compression by separating\n// glyph data into streams (contours, points, flags, coordinates, composites,\n// bboxes, instructions) and using variable-length encodings. This function\n// reconstructs the original TrueType glyf and loca tables from the streams\nfunction reconstructGlyf(\n data: Uint8Array,\n glyfTable: Table,\n locaTable: Table,\n fontInfo: FontInfo\n): { glyfData: Uint8Array; locaData: Uint8Array } {\n const headerStream = makeByteStream(\n data,\n glyfTable.srcOffset,\n glyfTable.transformLength\n );\n\n // Read glyf header\n const version = bsReadU16(headerStream);\n const optionFlags = bsReadU16(headerStream);\n const numGlyphs = bsReadU16(headerStream);\n const indexFormat = bsReadU16(headerStream);\n\n fontInfo.numGlyphs = numGlyphs;\n fontInfo.indexFormat = indexFormat;\n\n // Read substream sizes\n const nContourStreamSize = fsReadU32(headerStream);\n const nPointsStreamSize = fsReadU32(headerStream);\n const flagStreamSize = fsReadU32(headerStream);\n const glyphStreamSize = fsReadU32(headerStream);\n const compositeStreamSize = fsReadU32(headerStream);\n const bboxStreamSize = fsReadU32(headerStream);\n const instructionStreamSize = fsReadU32(headerStream);\n\n // Calculate substream offsets\n let offset = headerStream.pos;\n const nContourStream = makeByteStream(data, offset, nContourStreamSize);\n offset += nContourStreamSize;\n const nPointsStream = makeByteStream(data, offset, nPointsStreamSize);\n offset += nPointsStreamSize;\n const flagStream = makeByteStream(data, offset, flagStreamSize);\n offset += flagStreamSize;\n const glyphStream = makeByteStream(data, offset, glyphStreamSize);\n offset += glyphStreamSize;\n const compositeStream = makeByteStream(data, offset, compositeStreamSize);\n offset += compositeStreamSize;\n const bboxStream = makeByteStream(data, offset, bboxStreamSize);\n offset += bboxStreamSize;\n const instructionStream = makeByteStream(data, offset, instructionStreamSize);\n\n // Overlap bitmap\n const hasOverlapBitmap = (optionFlags & 1) !== 0;\n let overlapBitmap: Uint8Array | null = null;\n if (hasOverlapBitmap) {\n const overlapBitmapLength = (numGlyphs + 7) >> 3;\n overlapBitmap = data.subarray(\n offset + instructionStreamSize,\n offset + instructionStreamSize + overlapBitmapLength\n );\n }\n\n // Read bbox bitmap\n const bboxBitmapLength = ((numGlyphs + 31) >> 5) << 2;\n const bboxBitmap = fsReadBytes(bboxStream, bboxBitmapLength);\n\n // Estimate output size (will be resized if needed)\n let glyfOutput = new Uint8Array(glyfTable.origLength * 2);\n let glyfOffset = 0;\n\n const locaValues = new Uint32Array(numGlyphs + 1);\n fontInfo.xMins = new Int16Array(numGlyphs);\n\n let contourEndsScratch = new Uint16Array(128);\n let flagsScratch = new Uint8Array(512);\n let xScratch = new Uint8Array(512);\n let yScratch = new Uint8Array(512);\n\n // Process each glyph\n for (let glyphId = 0; glyphId < numGlyphs; glyphId++) {\n locaValues[glyphId] = glyfOffset;\n\n const nContours = bsReadS16(nContourStream);\n\n const haveBbox = (bboxBitmap[glyphId >> 3] & (0x80 >> (glyphId & 7))) !== 0;\n\n if (nContours === 0) {\n // Empty glyph\n if (haveBbox) {\n throw new Error(`Empty glyph ${glyphId} has bbox`);\n }\n continue;\n }\n\n if (nContours === -1) {\n // Composite glyph\n if (!haveBbox) {\n throw new Error(`Composite glyph ${glyphId} missing bbox`);\n }\n\n const { compositeData, haveInstructions } = readCompositeGlyph(compositeStream);\n\n let instructionSize = 0;\n if (haveInstructions) {\n instructionSize = bsRead255UShort(glyphStream);\n }\n\n const glyphSize = 10 + compositeData.byteLength + (haveInstructions ? 2 + instructionSize : 0);\n ensureCapacity(glyphSize);\n\n // Write glyph header\n writeInt16BE(glyfOutput, glyfOffset, -1); // nContours\n \n // Write bbox\n const bbox = fsReadBytes(bboxStream, 8);\n glyfOutput.set(bbox, glyfOffset + 2);\n\n // Store xMin\n fontInfo.xMins[glyphId] = readInt16BE(bbox, 0);\n\n // Write composite data\n glyfOutput.set(compositeData, glyfOffset + 10);\n\n if (haveInstructions) {\n const instrOffset = glyfOffset + 10 + compositeData.byteLength;\n writeUint16BE(glyfOutput, instrOffset, instructionSize);\n const instructions = fsReadBytes(instructionStream, instructionSize);\n glyfOutput.set(instructions, instrOffset + 2);\n }\n\n glyfOffset += glyphSize;\n glyfOffset = pad4(glyfOffset);\n } else {\n // Simple glyph: write directly into output to avoid allocations\n if (nContours > contourEndsScratch.length) {\n contourEndsScratch = new Uint16Array(nContours * 2);\n }\n\n let totalPoints = 0;\n let endPoint = -1;\n for (let i = 0; i < nContours; i++) {\n const n = bsRead255UShort(nPointsStream);\n totalPoints += n;\n endPoint += n;\n contourEndsScratch[i] = endPoint;\n }\n\n const scratchSize = totalPoints * 2;\n if (scratchSize > flagsScratch.length) {\n flagsScratch = new Uint8Array(scratchSize);\n }\n if (scratchSize > xScratch.length) {\n xScratch = new Uint8Array(scratchSize);\n }\n if (scratchSize > yScratch.length) {\n yScratch = new Uint8Array(scratchSize);\n }\n\n const encoded = encodeTripletsToScratch(\n flagStream,\n glyphStream,\n totalPoints,\n ((overlapBitmap?.[glyphId >> 3] ?? 0) & (0x80 >> (glyphId & 7))) !== 0,\n flagsScratch,\n xScratch,\n yScratch\n );\n\n const instructionSize = bsRead255UShort(glyphStream);\n const glyphSize =\n 10 +\n 2 * nContours +\n 2 +\n instructionSize +\n encoded.flagsLen +\n encoded.xLen +\n encoded.yLen;\n\n ensureCapacity(glyphSize);\n\n // nContours\n writeInt16BE(glyfOutput, glyfOffset, nContours);\n\n // Bbox\n let xMin = 0;\n if (haveBbox) {\n const bbox = fsReadBytes(bboxStream, 8);\n glyfOutput.set(bbox, glyfOffset + 2);\n xMin = readInt16BE(bbox, 0);\n } else {\n writeInt16BE(glyfOutput, glyfOffset + 2, encoded.xMin);\n writeInt16BE(glyfOutput, glyfOffset + 4, encoded.yMin);\n writeInt16BE(glyfOutput, glyfOffset + 6, encoded.xMax);\n writeInt16BE(glyfOutput, glyfOffset + 8, encoded.yMax);\n xMin = encoded.xMin;\n }\n\n let writeOffset = glyfOffset + 10;\n\n // End points of contours\n for (let i = 0; i < nContours; i++) {\n writeUint16BE(glyfOutput, writeOffset, contourEndsScratch[i]);\n writeOffset += 2;\n }\n\n // Instructions\n writeUint16BE(glyfOutput, writeOffset, instructionSize);\n writeOffset += 2;\n if (instructionSize > 0) {\n const instructions = fsReadBytes(instructionStream, instructionSize);\n glyfOutput.set(instructions, writeOffset);\n writeOffset += instructionSize;\n }\n\n // Flags and coordinates\n glyfOutput.set(flagsScratch.subarray(0, encoded.flagsLen), writeOffset);\n writeOffset += encoded.flagsLen;\n glyfOutput.set(xScratch.subarray(0, encoded.xLen), writeOffset);\n writeOffset += encoded.xLen;\n glyfOutput.set(yScratch.subarray(0, encoded.yLen), writeOffset);\n\n fontInfo.xMins[glyphId] = xMin;\n glyfOffset += glyphSize;\n glyfOffset = pad4(glyfOffset);\n }\n }\n\n // Final loca entry\n locaValues[numGlyphs] = glyfOffset;\n\n // Build loca table\n const locaSize = indexFormat ? (numGlyphs + 1) * 4 : (numGlyphs + 1) * 2;\n const locaData = new Uint8Array(locaSize);\n const locaView = new DataView(locaData.buffer);\n\n for (let i = 0; i <= numGlyphs; i++) {\n if (indexFormat) {\n locaView.setUint32(i * 4, locaValues[i]);\n } else {\n locaView.setUint16(i * 2, locaValues[i] >> 1);\n }\n }\n\n return {\n glyfData: glyfOutput.subarray(0, glyfOffset),\n locaData,\n };\n\n function ensureCapacity(needed: number): void {\n if (glyfOffset + needed > glyfOutput.byteLength) {\n const newOutput = new Uint8Array((glyfOffset + needed) * 2);\n newOutput.set(glyfOutput);\n glyfOutput = newOutput;\n }\n }\n}\n\nfunction readCompositeGlyph(stream: ByteStream): {\n compositeData: Uint8Array;\n haveInstructions: boolean;\n} {\n const FLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0;\n const FLAG_WE_HAVE_A_SCALE = 1 << 3;\n const FLAG_MORE_COMPONENTS = 1 << 5;\n const FLAG_WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;\n const FLAG_WE_HAVE_A_TWO_BY_TWO = 1 << 7;\n const FLAG_WE_HAVE_INSTRUCTIONS = 1 << 8;\n\n const startOffset = stream.pos;\n let haveInstructions = false;\n let flags = FLAG_MORE_COMPONENTS;\n\n while (flags & FLAG_MORE_COMPONENTS) {\n flags = bsReadU16(stream);\n haveInstructions = haveInstructions || (flags & FLAG_WE_HAVE_INSTRUCTIONS) !== 0;\n\n let argSize = 2; // glyph index\n if (flags & FLAG_ARG_1_AND_2_ARE_WORDS) {\n argSize += 4;\n } else {\n argSize += 2;\n }\n if (flags & FLAG_WE_HAVE_A_SCALE) {\n argSize += 2;\n } else if (flags & FLAG_WE_HAVE_AN_X_AND_Y_SCALE) {\n argSize += 4;\n } else if (flags & FLAG_WE_HAVE_A_TWO_BY_TWO) {\n argSize += 8;\n }\n\n bsSkip(stream, argSize);\n }\n\n const compositeData = stream.data.subarray(startOffset, stream.pos);\n\n return { compositeData, haveInstructions };\n}\n\ninterface EncodedTriplets {\n flagsLen: number;\n xLen: number;\n yLen: number;\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n}\n\n// WOFF2 encodes glyph points as \"triplets\" where a single flag byte determines\n// how dx/dy deltas are packed (see WOFF2 spec table 2). Low 7 bits select the\n// encoding format (0-9: dx=0, 10-19: dy=0, 20-83: 1-byte packed, etc), bit 7\n// indicates on-curve. This decodes triplets and re-encodes to TrueType format\nfunction encodeTripletsToScratch(\n flagStream: ByteStream,\n glyphStream: ByteStream,\n nPoints: number,\n hasOverlapBit: boolean,\n flagsOut: Uint8Array,\n xOut: Uint8Array,\n yOut: Uint8Array\n): EncodedTriplets {\n if (nPoints === 0) {\n return {\n flagsLen: 0,\n xLen: 0,\n yLen: 0,\n xMin: 0,\n yMin: 0,\n xMax: 0,\n yMax: 0,\n };\n }\n\n let flagsLen = 0;\n let xLen = 0;\n let yLen = 0;\n\n let x = 0;\n let y = 0;\n let xMin = 0;\n let yMin = 0;\n let xMax = 0;\n let yMax = 0;\n\n let lastFlag = -1;\n let repeatCount = 0;\n\n const flagData = flagStream.data;\n let flagPos = flagStream.pos;\n const flagEnd = flagStream.end;\n const glyphData = glyphStream.data;\n let glyphPos = glyphStream.pos;\n const glyphEnd = glyphStream.end;\n\n for (let i = 0; i < nPoints; i++) {\n if (flagPos >= flagEnd) throw new Error('Stream overflow');\n const flag = flagData[flagPos++];\n\n const onCurve = (flag & 0x80) === 0;\n const flagLow = flag & 0x7f;\n\n let dx: number;\n let dy: number;\n\n if (flagLow < 10) {\n // dx = 0\n dx = 0;\n if (glyphPos >= glyphEnd) throw new Error('Stream overflow');\n const b = glyphData[glyphPos++];\n dy = ((flagLow & 14) << 7) + b;\n if ((flagLow & 1) === 0) dy = -dy;\n } else if (flagLow < 20) {\n // dy = 0\n if (glyphPos >= glyphEnd) throw new Error('Stream overflow');\n const b = glyphData[glyphPos++];\n dx = (((flagLow - 10) & 14) << 7) + b;\n if ((flagLow & 1) === 0) dx = -dx;\n dy = 0;\n } else if (flagLow < 84) {\n // 1 byte packed\n if (glyphPos >= glyphEnd) throw new Error('Stream overflow');\n const b = glyphData[glyphPos++];\n const b0 = flagLow - 20;\n dx = 1 + (b0 & 0x30) + (b >> 4);\n dy = 1 + ((b0 & 0x0c) << 2) + (b & 0x0f);\n if ((flagLow & 1) === 0) dx = -dx;\n if ((flagLow & 2) === 0) dy = -dy;\n } else if (flagLow < 120) {\n // 2 bytes\n if (glyphPos + 1 >= glyphEnd) throw new Error('Stream overflow');\n const b0 = glyphData[glyphPos++];\n const b1 = glyphData[glyphPos++];\n const idx = flagLow - 84;\n dx = 1 + (((idx / 12) | 0) << 8) + b0;\n dy = 1 + (((idx % 12) >> 2) << 8) + b1;\n if ((flagLow & 1) === 0) dx = -dx;\n if ((flagLow & 2) === 0) dy = -dy;\n } else if (flagLow < 124) {\n // 3 bytes\n if (glyphPos + 2 >= glyphEnd) throw new Error('Stream overflow');\n const b0 = glyphData[glyphPos++];\n const b1 = glyphData[glyphPos++];\n const b2 = glyphData[glyphPos++];\n dx = (b0 << 4) + (b1 >> 4);\n dy = ((b1 & 0x0f) << 8) + b2;\n if ((flagLow & 1) === 0) dx = -dx;\n if ((flagLow & 2) === 0) dy = -dy;\n } else {\n // 4 bytes\n if (glyphPos + 3 >= glyphEnd) throw new Error('Stream overflow');\n const b0 = glyphData[glyphPos++];\n const b1 = glyphData[glyphPos++];\n const b2 = glyphData[glyphPos++];\n const b3 = glyphData[glyphPos++];\n dx = (b0 << 8) + b1;\n dy = (b2 << 8) + b3;\n if ((flagLow & 1) === 0) dx = -dx;\n if ((flagLow & 2) === 0) dy = -dy;\n }\n\n x += dx;\n y += dy;\n\n if (i === 0) {\n xMin = xMax = x;\n yMin = yMax = y;\n } else {\n if (x < xMin) xMin = x;\n if (x > xMax) xMax = x;\n if (y < yMin) yMin = y;\n if (y > yMax) yMax = y;\n }\n\n let outFlag = onCurve ? FLAG_ON_CURVE : 0;\n if (hasOverlapBit && i === 0) outFlag |= FLAG_OVERLAP_SIMPLE;\n\n if (dx === 0) {\n outFlag |= FLAG_X_SAME;\n } else if (dx >= -255 && dx <= 255) {\n outFlag |= FLAG_X_SHORT;\n if (dx > 0) outFlag |= FLAG_X_SAME;\n xOut[xLen++] = dx > 0 ? dx : -dx;\n } else {\n xOut[xLen++] = (dx >> 8) & 0xff;\n xOut[xLen++] = dx & 0xff;\n }\n\n if (dy === 0) {\n outFlag |= FLAG_Y_SAME;\n } else if (dy >= -255 && dy <= 255) {\n outFlag |= FLAG_Y_SHORT;\n if (dy > 0) outFlag |= FLAG_Y_SAME;\n yOut[yLen++] = dy > 0 ? dy : -dy;\n } else {\n yOut[yLen++] = (dy >> 8) & 0xff;\n yOut[yLen++] = dy & 0xff;\n }\n\n if (outFlag === lastFlag && repeatCount < 255) {\n flagsOut[flagsLen - 1] |= FLAG_REPEAT;\n repeatCount++;\n } else {\n if (repeatCount > 0) {\n flagsOut[flagsLen++] = repeatCount;\n repeatCount = 0;\n }\n flagsOut[flagsLen++] = outFlag;\n lastFlag = outFlag;\n }\n }\n\n if (repeatCount > 0) {\n flagsOut[flagsLen++] = repeatCount;\n }\n\n flagStream.pos = flagPos;\n glyphStream.pos = glyphPos;\n\n return {\n flagsLen,\n xLen,\n yLen,\n xMin,\n yMin,\n xMax,\n yMax,\n };\n}\n\nfunction reconstructHmtx(\n data: Uint8Array,\n table: Table,\n numGlyphs: number,\n numHMetrics: number,\n xMins: Int16Array\n): Uint8Array {\n const hmtxStream = makeByteStream(data, table.srcOffset, table.srcLength);\n\n const hmtxFlags = bsReadU8(hmtxStream);\n\n const hasProportionalLsbs = (hmtxFlags & 1) === 0;\n const hasMonospaceLsbs = (hmtxFlags & 2) === 0;\n\n // Read advance widths\n const advanceWidths = new Uint16Array(numHMetrics);\n for (let i = 0; i < numHMetrics; i++) {\n advanceWidths[i] = bsReadU16(hmtxStream);\n }\n\n // Read LSBs\n const lsbs = new Int16Array(numGlyphs);\n\n for (let i = 0; i < numHMetrics; i++) {\n if (hasProportionalLsbs) {\n lsbs[i] = bsReadS16(hmtxStream);\n } else {\n lsbs[i] = xMins[i];\n }\n }\n\n for (let i = numHMetrics; i < numGlyphs; i++) {\n if (hasMonospaceLsbs) {\n lsbs[i] = bsReadS16(hmtxStream);\n } else {\n lsbs[i] = xMins[i];\n }\n }\n\n // Build output\n const outputSize = numHMetrics * 4 + (numGlyphs - numHMetrics) * 2;\n const output = new Uint8Array(outputSize);\n let offset = 0;\n\n for (let i = 0; i < numGlyphs; i++) {\n if (i < numHMetrics) {\n writeUint16BE(output, offset, advanceWidths[i]);\n offset += 2;\n }\n writeInt16BE(output, offset, lsbs[i]);\n offset += 2;\n }\n\n return output;\n}\n\nfunction updateTableEntry(\n view: DataView,\n entryOffset: number,\n checksum: number,\n offset: number,\n length: number\n): void {\n view.setUint32(entryOffset + 4, checksum);\n view.setUint32(entryOffset + 8, offset);\n view.setUint32(entryOffset + 12, length);\n}\n\nfunction readInt16BE(data: Uint8Array, offset: number): number {\n const val = (data[offset] << 8) | data[offset + 1];\n return (val & 0x8000) !== 0 ? val - 0x10000 : val;\n}\n\nfunction writeInt16BE(data: Uint8Array, offset: number, value: number): void {\n data[offset] = (value >> 8) & 0xff;\n data[offset + 1] = value & 0xff;\n}\n\nfunction writeUint16BE(data: Uint8Array, offset: number, value: number): void {\n data[offset] = (value >> 8) & 0xff;\n data[offset + 1] = value & 0xff;\n}\n\nfunction computeChecksum(data: Uint8Array, offset: number, length: number): number {\n let sum = 0;\n const end = offset + length;\n const dataView = new DataView(data.buffer, data.byteOffset);\n\n // Process 4-byte aligned words\n const alignedEnd = offset + (length & ~3);\n for (let i = offset; i < alignedEnd; i += 4) {\n sum = (sum + dataView.getUint32(i)) >>> 0;\n }\n\n // Handle remaining bytes\n if (end > alignedEnd) {\n let last = 0;\n for (let i = alignedEnd; i < end; i++) {\n last = (last << 8) | data[i];\n }\n last <<= (4 - (end - alignedEnd)) * 8;\n sum = (sum + last) >>> 0;\n }\n\n return sum;\n}\n\nfunction pad4(n: number): number {\n return (n + 3) & ~3;\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11],"mappings":"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AAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAE7D;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAE7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAG7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAE7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAE7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAE7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAE5C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC9C;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAE3D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC3D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC3D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC3D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAE3D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAC5D;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAE5D;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAC7C;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GA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"}