Path: blob/main/static/src/gs/public/microsoft-flight-simulator/bzip2.js
1325 views
/*1bzip2.js - a small bzip2 decompression implementation23Copyright 2011 by antimatter15 ([email protected])45Based on micro-bunzip by Rob Landley ([email protected]).6Copyright (c) 2011 by antimatter15 ([email protected]).7Permission is hereby granted, free of charge, to any person obtaining a8copy of this software and associated documentation files (the "Software"),9to deal in the Software without restriction, including without limitation10the rights to use, copy, modify, merge, publish, distribute, sublicense,11and/or sell copies of the Software, and to permit persons to whom the12Software is furnished to do so, subject to the following conditions:1314The above copyright notice and this permission notice shall be included15in all copies or substantial portions of the Software.1617THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,18EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.20IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,21DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH23THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*/2526let bzip2 = {};2728bzip2.crcTable =29[300x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,310x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,320x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,330x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,340x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,350x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,360x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,370x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,380x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,390x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,400xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,410xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,420xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,430xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,440xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,450xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,460x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,470x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,480x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,490x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,500x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,510x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,520x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,530x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,540xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,550xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,560x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,570x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,580xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,590xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,600xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,610xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,620x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,630x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,640x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,650x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,660x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,670x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,680x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,690x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,700xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,710xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,720xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,730xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,740xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,750xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,760x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,770x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,780x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,790x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,800x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,810x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,820x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,830x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,840x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,850x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,860xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,870xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,880xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,890xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,900x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,910x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,920xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,930xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b494];9596bzip2.array = function(bytes) {97var bit = 0, byte = 0;98var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF ];99return function(n) {100var result = 0;101while(n > 0) {102var left = 8 - bit;103if (n >= left) {104result <<= left;105result |= (BITMASK[left] & bytes[byte++]);106bit = 0;107n -= left;108} else {109result <<= n;110result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit));111bit += n;112n = 0;113}114}115return result;116}117}118119bzip2.IsBZIP2 = function(buffer) {120if ((buffer[0] == 0x42) && (buffer[1] == 0x5A) && (buffer[2] == 0x68)) return true;121return false;122}123124125bzip2.simple = function(srcbuffer, stream) {126var bits = bzip2.array(srcbuffer);127var size = bzip2.header(bits);128var ret = false;129var bufsize = 100000 * size;130var buf = new Int32Array(bufsize);131132this.byteCount = new Int32Array(256);133this.symToByte = new Uint8Array(256);134this.mtfSymbol = new Int32Array(256);135this.selectors = new Uint8Array(0x8000);136137do {138ret = bzip2.decompress(bits, stream, buf, bufsize);139} while(!ret);140}141142bzip2.header = function(bits) {143if (bits(8*3) !== 4348520) console.log("No magic number found");144const i = bits(8) - 48;145if (i < 1 || i > 9) console.log("Not a BZIP archive");146return i;147};148149150//takes a function for reading the block data (starting with 0x314159265359)151//a block size (0-9) (optional, defaults to 9)152//a length at which to stop decompressing and return the output153bzip2.decompress = function(bits, stream, buf, bufsize) {154let limit;155let base;156let uc;157let k;158let j;159const MAX_HUFCODE_BITS = 20;160const MAX_SYMBOLS = 258;161const SYMBOL_RUNA = 0;162const SYMBOL_RUNB = 1;163const GROUP_SIZE = 50;164let crc = 0 ^ (-1);165166var h = '';167let i = 0;168for(; i < 6; i++) h += bits(8).toString(16);169if (h == "177245385090") return true; //last block170if (h != "314159265359") console.log("eek not valid bzip data");171let crcblock = bits(32) | 0; // CRC code172if (bits(1)) console.log("unsupported obsolete version");173let origPtr = bits(24);174if (origPtr > bufsize) console.log("Initial position larger than buffer size");175let t = bits(16);176let symTotal = 0;177for (i = 0; i < 16; i++) {178if (t & (1 << (15 - i))) {179k = bits(16);180for(j = 0; j < 16; j++) {181if (k & (1 << (15 - j))) {182this.symToByte[symTotal++] = (16 * i) + j;183}184}185}186}187188let groupCount = bits(3);189if (groupCount < 2 || groupCount > 6) console.log("another error");190let nSelectors = bits(15);191if (nSelectors == 0) console.log("meh");192for(i = 0; i < groupCount; i++) this.mtfSymbol[i] = i;193194for(i = 0; i < nSelectors; i++) {195for(j = 0; bits(1); j++) if (j >= groupCount) console.log("whoops another error");196uc = this.mtfSymbol[j];197for(k = j-1; k>=0; k--) {198this.mtfSymbol[k+1] = this.mtfSymbol[k];199}200this.mtfSymbol[0] = uc;201this.selectors[i] = uc;202}203204let symCount = symTotal + 2;205let groups = [];206let length = new Uint8Array(MAX_SYMBOLS),207temp = new Uint8Array(MAX_HUFCODE_BITS + 1);208209let hufGroup;210211for(j = 0; j < groupCount; j++) {212t = bits(5); //lengths213for(i = 0; i < symCount; i++) {214while(true){215if (t < 1 || t > MAX_HUFCODE_BITS) console.log("I gave up a while ago on writing error messages");216if (!bits(1)) break;217if (!bits(1)) t++;218else t--;219}220length[i] = t;221}222let minLen, maxLen;223minLen = maxLen = length[0];224for(i = 1; i < symCount; i++) {225if (length[i] > maxLen) maxLen = length[i];226else if (length[i] < minLen) minLen = length[i];227}228hufGroup = groups[j] = {};229hufGroup.permute = new Int32Array(MAX_SYMBOLS);230hufGroup.limit = new Int32Array(MAX_HUFCODE_BITS + 1);231hufGroup.base = new Int32Array(MAX_HUFCODE_BITS + 1);232233hufGroup.minLen = minLen;234hufGroup.maxLen = maxLen;235base = hufGroup.base.subarray(1);236limit = hufGroup.limit.subarray(1);237let pp = 0;238for(i = minLen; i <= maxLen; i++)239for(t = 0; t < symCount; t++)240if (length[t] == i) hufGroup.permute[pp++] = t;241for(i = minLen; i <= maxLen; i++) temp[i] = limit[i] = 0;242for(i = 0; i < symCount; i++) temp[length[i]]++;243pp = t = 0;244for(i = minLen; i < maxLen; i++) {245pp += temp[i];246limit[i] = pp - 1;247pp <<= 1;248base[i+1] = pp - (t += temp[i]);249}250limit[maxLen] = pp + temp[maxLen] - 1;251base[minLen] = 0;252}253254for(i = 0; i < 256; i++) {255this.mtfSymbol[i] = i;256this.byteCount[i] = 0;257}258let runPos;259let count;260let selector;261runPos = count = symCount = selector = 0;262while(true) {263if (!(symCount--)) {264symCount = GROUP_SIZE - 1;265if (selector >= nSelectors) console.log("meow i'm a kitty, that's an error");266hufGroup = groups[this.selectors[selector++]];267base = hufGroup.base.subarray(1);268limit = hufGroup.limit.subarray(1);269}270i = hufGroup.minLen;271j = bits(i);272while(true) {273if (i > hufGroup.maxLen) console.log("rawr i'm a dinosaur");274if (j <= limit[i]) break;275i++;276j = (j << 1) | bits(1);277}278j -= base[i];279if (j < 0 || j >= MAX_SYMBOLS) console.log("moo i'm a cow");280let nextSym = hufGroup.permute[j];281if (nextSym == SYMBOL_RUNA || nextSym == SYMBOL_RUNB) {282if (!runPos){283runPos = 1;284t = 0;285}286if (nextSym == SYMBOL_RUNA) t += runPos;287else t += 2 * runPos;288runPos <<= 1;289continue;290}291if (runPos) {292runPos = 0;293if (count + t >= bufsize) console.log("Boom.");294uc = this.symToByte[this.mtfSymbol[0]];295this.byteCount[uc] += t;296while(t--) buf[count++] = uc;297}298if (nextSym > symTotal) break;299if (count >= bufsize) console.log("I can't think of anything. Error");300i = nextSym - 1;301uc = this.mtfSymbol[i];302for(k = i-1; k>=0; k--) {303this.mtfSymbol[k+1] = this.mtfSymbol[k];304}305this.mtfSymbol[0] = uc306uc = this.symToByte[uc];307this.byteCount[uc]++;308buf[count++] = uc;309}310if (origPtr < 0 || origPtr >= count) console.log("I'm a monkey and I'm throwing something at someone, namely you");311j = 0;312for(i = 0; i < 256; i++) {313k = j + this.byteCount[i];314this.byteCount[i] = j;315j = k;316}317for(i = 0; i < count; i++) {318uc = buf[i] & 0xff;319buf[this.byteCount[uc]] |= (i << 8);320this.byteCount[uc]++;321}322let pos = 0, current = 0, run = 0;323if (count) {324pos = buf[origPtr];325current = (pos & 0xff);326pos >>= 8;327run = -1;328}329let copies, previous, outbyte;330while(count) {331count--;332previous = current;333pos = buf[pos];334current = pos & 0xff;335pos >>= 8;336if (run++ == 3) {337copies = current;338outbyte = previous;339current = -1;340} else {341copies = 1;342outbyte = current;343}344while(copies--) {345crc = ((crc << 8) ^ this.crcTable[((crc>>24) ^ outbyte) & 0xFF])&0xFFFFFFFF; // crc32346stream(outbyte);347}348if (current != previous) run = 0;349}350351crc = (crc ^ (-1)) >>> 0;352if ((crc|0) != (crcblock|0)) console.log("Error in bzip2: crc32 do not match");353return false;354}355356357