From a8fb68af4b6407660afa05cea6bc10bba9fa1b51 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Mon, 6 Sep 2021 15:51:57 -0700 Subject: [PATCH] Add bzip2 1.0.8 --- third_party/bzip2/CHANGES | 356 + third_party/bzip2/LICENSE | 42 + third_party/bzip2/Makefile | 217 + third_party/bzip2/Makefile-libbz2_so | 59 + third_party/bzip2/README | 196 + third_party/bzip2/README.COMPILATION.PROBLEMS | 58 + third_party/bzip2/README.XML.STUFF | 45 + third_party/bzip2/README.cosmo | 11 + third_party/bzip2/blocksort.c | 1094 + third_party/bzip2/bz-common.xsl | 39 + third_party/bzip2/bz-fo.xsl | 276 + third_party/bzip2/bz-html.xsl | 23 + third_party/bzip2/bzdiff | 76 + third_party/bzip2/bzdiff.1 | 47 + third_party/bzip2/bzgrep | 85 + third_party/bzip2/bzgrep.1 | 56 + third_party/bzip2/bzip.css | 74 + third_party/bzip2/bzip2.1 | 454 + third_party/bzip2/bzip2.1.preformatted | 399 + third_party/bzip2/bzip2.c | 2036 ++ third_party/bzip2/bzip2.mk | 57 + third_party/bzip2/bzip2.txt | 391 + third_party/bzip2/bzip2recover.c | 516 + third_party/bzip2/bzlib.c | 1572 + third_party/bzip2/bzlib.h | 282 + third_party/bzip2/bzlib_private.h | 509 + third_party/bzip2/bzmore | 61 + third_party/bzip2/bzmore.1 | 152 + third_party/bzip2/compress.c | 672 + third_party/bzip2/crctable.c | 104 + third_party/bzip2/decompress.c | 652 + third_party/bzip2/dlltest.c | 175 + third_party/bzip2/dlltest.dsp | 93 + third_party/bzip2/entities.xml | 10 + third_party/bzip2/format.pl | 68 + third_party/bzip2/huffman.c | 205 + third_party/bzip2/libbz2.def | 27 + third_party/bzip2/libbz2.dsp | 130 + third_party/bzip2/makefile.msc | 63 + third_party/bzip2/manual.xml | 2964 ++ third_party/bzip2/mk251.c | 31 + third_party/bzip2/prepare-release.sh | 82 + third_party/bzip2/randtable.c | 84 + third_party/bzip2/release-update.sh | 90 + third_party/bzip2/sample1.bz2 | Bin 0 -> 32348 bytes third_party/bzip2/sample1.ref | Bin 0 -> 98696 bytes third_party/bzip2/sample2.bz2 | Bin 0 -> 73732 bytes third_party/bzip2/sample2.ref | Bin 0 -> 212340 bytes third_party/bzip2/sample3.bz2 | Bin 0 -> 235 bytes third_party/bzip2/sample3.ref | 30007 ++++++++++++++++ third_party/bzip2/spewG.c | 54 + third_party/bzip2/unzcrash.c | 141 + third_party/bzip2/words0 | 9 + third_party/bzip2/words1 | 4 + third_party/bzip2/words2 | 5 + third_party/bzip2/words3 | 30 + third_party/bzip2/xmlproc.sh | 114 + 57 files changed, 44997 insertions(+) create mode 100644 third_party/bzip2/CHANGES create mode 100644 third_party/bzip2/LICENSE create mode 100644 third_party/bzip2/Makefile create mode 100644 third_party/bzip2/Makefile-libbz2_so create mode 100644 third_party/bzip2/README create mode 100644 third_party/bzip2/README.COMPILATION.PROBLEMS create mode 100644 third_party/bzip2/README.XML.STUFF create mode 100644 third_party/bzip2/README.cosmo create mode 100644 third_party/bzip2/blocksort.c create mode 100644 third_party/bzip2/bz-common.xsl create mode 100644 third_party/bzip2/bz-fo.xsl create mode 100644 third_party/bzip2/bz-html.xsl create mode 100755 third_party/bzip2/bzdiff create mode 100644 third_party/bzip2/bzdiff.1 create mode 100755 third_party/bzip2/bzgrep create mode 100644 third_party/bzip2/bzgrep.1 create mode 100644 third_party/bzip2/bzip.css create mode 100644 third_party/bzip2/bzip2.1 create mode 100644 third_party/bzip2/bzip2.1.preformatted create mode 100644 third_party/bzip2/bzip2.c create mode 100644 third_party/bzip2/bzip2.mk create mode 100644 third_party/bzip2/bzip2.txt create mode 100644 third_party/bzip2/bzip2recover.c create mode 100644 third_party/bzip2/bzlib.c create mode 100644 third_party/bzip2/bzlib.h create mode 100644 third_party/bzip2/bzlib_private.h create mode 100644 third_party/bzip2/bzmore create mode 100644 third_party/bzip2/bzmore.1 create mode 100644 third_party/bzip2/compress.c create mode 100644 third_party/bzip2/crctable.c create mode 100644 third_party/bzip2/decompress.c create mode 100644 third_party/bzip2/dlltest.c create mode 100644 third_party/bzip2/dlltest.dsp create mode 100644 third_party/bzip2/entities.xml create mode 100755 third_party/bzip2/format.pl create mode 100644 third_party/bzip2/huffman.c create mode 100644 third_party/bzip2/libbz2.def create mode 100644 third_party/bzip2/libbz2.dsp create mode 100644 third_party/bzip2/makefile.msc create mode 100644 third_party/bzip2/manual.xml create mode 100644 third_party/bzip2/mk251.c create mode 100755 third_party/bzip2/prepare-release.sh create mode 100644 third_party/bzip2/randtable.c create mode 100755 third_party/bzip2/release-update.sh create mode 100644 third_party/bzip2/sample1.bz2 create mode 100644 third_party/bzip2/sample1.ref create mode 100644 third_party/bzip2/sample2.bz2 create mode 100644 third_party/bzip2/sample2.ref create mode 100644 third_party/bzip2/sample3.bz2 create mode 100644 third_party/bzip2/sample3.ref create mode 100644 third_party/bzip2/spewG.c create mode 100644 third_party/bzip2/unzcrash.c create mode 100644 third_party/bzip2/words0 create mode 100644 third_party/bzip2/words1 create mode 100644 third_party/bzip2/words2 create mode 100644 third_party/bzip2/words3 create mode 100755 third_party/bzip2/xmlproc.sh diff --git a/third_party/bzip2/CHANGES b/third_party/bzip2/CHANGES new file mode 100644 index 000000000..30afead25 --- /dev/null +++ b/third_party/bzip2/CHANGES @@ -0,0 +1,356 @@ + ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ + + +0.9.0 +~~~~~ +First version. + + +0.9.0a +~~~~~~ +Removed 'ranlib' from Makefile, since most modern Unix-es +don't need it, or even know about it. + + +0.9.0b +~~~~~~ +Fixed a problem with error reporting in bzip2.c. This does not effect +the library in any way. Problem is: versions 0.9.0 and 0.9.0a (of the +program proper) compress and decompress correctly, but give misleading +error messages (internal panics) when an I/O error occurs, instead of +reporting the problem correctly. This shouldn't give any data loss +(as far as I can see), but is confusing. + +Made the inline declarations disappear for non-GCC compilers. + + +0.9.0c +~~~~~~ +Fixed some problems in the library pertaining to some boundary cases. +This makes the library behave more correctly in those situations. The +fixes apply only to features (calls and parameters) not used by +bzip2.c, so the non-fixedness of them in previous versions has no +effect on reliability of bzip2.c. + +In bzlib.c: + * made zero-length BZ_FLUSH work correctly in bzCompress(). + * fixed bzWrite/bzRead to ignore zero-length requests. + * fixed bzread to correctly handle read requests after EOF. + * wrong parameter order in call to bzDecompressInit in + bzBuffToBuffDecompress. Fixed. + +In compress.c: + * changed setting of nGroups in sendMTFValues() so as to + do a bit better on small files. This _does_ effect + bzip2.c. + + +0.9.5a +~~~~~~ +Major change: add a fallback sorting algorithm (blocksort.c) +to give reasonable behaviour even for very repetitive inputs. +Nuked --repetitive-best and --repetitive-fast since they are +no longer useful. + +Minor changes: mostly a whole bunch of small changes/ +bugfixes in the driver (bzip2.c). Changes pertaining to the +user interface are: + + allow decompression of symlink'd files to stdout + decompress/test files even without .bz2 extension + give more accurate error messages for I/O errors + when compressing/decompressing to stdout, don't catch control-C + read flags from BZIP2 and BZIP environment variables + decline to break hard links to a file unless forced with -f + allow -c flag even with no filenames + preserve file ownerships as far as possible + make -s -1 give the expected block size (100k) + add a flag -q --quiet to suppress nonessential warnings + stop decoding flags after --, so files beginning in - can be handled + resolved inconsistent naming: bzcat or bz2cat ? + bzip2 --help now returns 0 + +Programming-level changes are: + + fixed syntax error in GET_LL4 for Borland C++ 5.02 + let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC} + fix overshoot of mode-string end in bzopen_or_bzdopen + wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... } + close file handles under all error conditions + added minor mods so it compiles with DJGPP out of the box + fixed Makefile so it doesn't give problems with BSD make + fix uninitialised memory reads in dlltest.c + +0.9.5b +~~~~~~ +Open stdin/stdout in binary mode for DJGPP. + +0.9.5c +~~~~~~ +Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1. The + 1 +version could cause the sorted order to be wrong in some extremely +obscure cases. Also changed setting of quadrant in blocksort.c. + +0.9.5d +~~~~~~ +The only functional change is to make bzlibVersion() in the library +return the correct string. This has no effect whatsoever on the +functioning of the bzip2 program or library. Added a couple of casts +so the library compiles without warnings at level 3 in MS Visual +Studio 6.0. Included a Y2K statement in the file Y2K_INFO. All other +changes are minor documentation changes. + +1.0 +~~~ +Several minor bugfixes and enhancements: + +* Large file support. The library uses 64-bit counters to + count the volume of data passing through it. bzip2.c + is now compiled with -D_FILE_OFFSET_BITS=64 to get large + file support from the C library. -v correctly prints out + file sizes greater than 4 gigabytes. All these changes have + been made without assuming a 64-bit platform or a C compiler + which supports 64-bit ints, so, except for the C library + aspect, they are fully portable. + +* Decompression robustness. The library/program should be + robust to any corruption of compressed data, detecting and + handling _all_ corruption, instead of merely relying on + the CRCs. What this means is that the program should + never crash, given corrupted data, and the library should + always return BZ_DATA_ERROR. + +* Fixed an obscure race-condition bug only ever observed on + Solaris, in which, if you were very unlucky and issued + control-C at exactly the wrong time, both input and output + files would be deleted. + +* Don't run out of file handles on test/decompression when + large numbers of files have invalid magic numbers. + +* Avoid library namespace pollution. Prefix all exported + symbols with BZ2_. + +* Minor sorting enhancements from my DCC2000 paper. + +* Advance the version number to 1.0, so as to counteract the + (false-in-this-case) impression some people have that programs + with version numbers less than 1.0 are in some way, experimental, + pre-release versions. + +* Create an initial Makefile-libbz2_so to build a shared library. + Yes, I know I should really use libtool et al ... + +* Make the program exit with 2 instead of 0 when decompression + fails due to a bad magic number (ie, an invalid bzip2 header). + Also exit with 1 (as the manual claims :-) whenever a diagnostic + message would have been printed AND the corresponding operation + is aborted, for example + bzip2: Output file xx already exists. + When a diagnostic message is printed but the operation is not + aborted, for example + bzip2: Can't guess original name for wurble -- using wurble.out + then the exit value 0 is returned, unless some other problem is + also detected. + + I think it corresponds more closely to what the manual claims now. + + +1.0.1 +~~~~~ +* Modified dlltest.c so it uses the new BZ2_ naming scheme. +* Modified makefile-msc to fix minor build probs on Win2k. +* Updated README.COMPILATION.PROBLEMS. + +There are no functionality changes or bug fixes relative to version +1.0.0. This is just a documentation update + a fix for minor Win32 +build problems. For almost everyone, upgrading from 1.0.0 to 1.0.1 is +utterly pointless. Don't bother. + + +1.0.2 +~~~~~ +A bug fix release, addressing various minor issues which have appeared +in the 18 or so months since 1.0.1 was released. Most of the fixes +are to do with file-handling or documentation bugs. To the best of my +knowledge, there have been no data-loss-causing bugs reported in the +compression/decompression engine of 1.0.0 or 1.0.1. + +Note that this release does not improve the rather crude build system +for Unix platforms. The general plan here is to autoconfiscate/ +libtoolise 1.0.2 soon after release, and release the result as 1.1.0 +or perhaps 1.2.0. That, however, is still just a plan at this point. + +Here are the changes in 1.0.2. Bug-reporters and/or patch-senders in +parentheses. + +* Fix an infinite segfault loop in 1.0.1 when a directory is + encountered in -f (force) mode. + (Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt) + +* Avoid double fclose() of output file on certain I/O error paths. + (Solar Designer) + +* Don't fail with internal error 1007 when fed a long stream (> 48MB) + of byte 251. Also print useful message suggesting that 1007s may be + caused by bad memory. + (noticed by Juan Pedro Vallejo, fixed by me) + +* Fix uninitialised variable silly bug in demo prog dlltest.c. + (Jorj Bauer) + +* Remove 512-MB limitation on recovered file size for bzip2recover + on selected platforms which support 64-bit ints. At the moment + all GCC supported platforms, and Win32. + (me, Alson van der Meulen) + +* Hard-code header byte values, to give correct operation on platforms + using EBCDIC as their native character set (IBM's OS/390). + (Leland Lucius) + +* Copy file access times correctly. + (Marty Leisner) + +* Add distclean and check targets to Makefile. + (Michael Carmack) + +* Parameterise use of ar and ranlib in Makefile. Also add $(LDFLAGS). + (Rich Ireland, Bo Thorsen) + +* Pass -p (create parent dirs as needed) to mkdir during make install. + (Jeremy Fusco) + +* Dereference symlinks when copying file permissions in -f mode. + (Volker Schmidt) + +* Majorly simplify implementation of uInt64_qrm10. + (Bo Lindbergh) + +* Check the input file still exists before deleting the output one, + when aborting in cleanUpAndFail(). + (Joerg Prante, Robert Linden, Matthias Krings) + +Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer +of bzip2: + +* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore. + +* Spelling changes and minor enhancements in bzip2.1. + +* Avoid race condition between creating the output file and setting its + interim permissions safely, by using fopen_output_safely(). + No changes to bzip2recover since there is no issue with file + permissions there. + +* do not print senseless report with -v when compressing an empty + file. + +* bzcat -f works on non-bzip2 files. + +* do not try to escape shell meta-characters on unix (the shell takes + care of these). + +* added --fast and --best aliases for -1 -9 for gzip compatibility. + + +1.0.3 (15 Feb 05) +~~~~~~~~~~~~~~~~~ +Fixes some minor bugs since the last version, 1.0.2. + +* Further robustification against corrupted compressed data. + There are currently no known bitstreams which can cause the + decompressor to crash, loop or access memory which does not + belong to it. If you are using bzip2 or the library to + decompress bitstreams from untrusted sources, an upgrade + to 1.0.3 is recommended. This fixes CAN-2005-1260. + +* The documentation has been converted to XML, from which html + and pdf can be derived. + +* Various minor bugs in the documentation have been fixed. + +* Fixes for various compilation warnings with newer versions of + gcc, and on 64-bit platforms. + +* The BZ_NO_STDIO cpp symbol was not properly observed in 1.0.2. + This has been fixed. + + +1.0.4 (20 Dec 06) +~~~~~~~~~~~~~~~~~ +Fixes some minor bugs since the last version, 1.0.3. + +* Fix file permissions race problem (CAN-2005-0953). + +* Avoid possible segfault in BZ2_bzclose. From Coverity's NetBSD + scan. + +* 'const'/prototype cleanups in the C code. + +* Change default install location to /usr/local, and handle multiple + 'make install's without error. + +* Sanitise file names more carefully in bzgrep. Fixes CAN-2005-0758 + to the extent that applies to bzgrep. + +* Use 'mktemp' rather than 'tempfile' in bzdiff. + +* Tighten up a couple of assertions in blocksort.c following automated + analysis. + +* Fix minor doc/comment bugs. + + +1.0.5 (10 Dec 07) +~~~~~~~~~~~~~~~~~ +Security fix only. Fixes CERT-FI 20469 as it applies to bzip2. + + +1.0.6 (6 Sept 10) +~~~~~~~~~~~~~~~~~ + +* Security fix for CVE-2010-0405. This was reported by Mikolaj + Izdebski. + +* Make the documentation build on Ubuntu 10.04 + +1.0.7 (27 Jun 19) +~~~~~~~~~~~~~~~~~ + +* Fix undefined behavior in the macros SET_BH, CLEAR_BH, & ISSET_BH + +* bzip2: Fix return value when combining --test,-t and -q. + +* bzip2recover: Fix buffer overflow for large argv[0] + +* bzip2recover: Fix use after free issue with outFile (CVE-2016-3189) + +* Make sure nSelectors is not out of range (CVE-2019-12900) + +1.0.8 (13 Jul 19) +~~~~~~~~~~~~~~~~~ + +* Accept as many selectors as the file format allows. + This relaxes the fix for CVE-2019-12900 from 1.0.7 + so that bzip2 allows decompression of bz2 files that + use (too) many selectors again. + +* Fix handling of large (> 4GB) files on Windows. + +* Cleanup of bzdiff and bzgrep scripts so they don't use + any bash extensions and handle multiple archives correctly. + +* There is now a bz2-files testsuite at + https://sourceware.org/git/bzip2-tests.git diff --git a/third_party/bzip2/LICENSE b/third_party/bzip2/LICENSE new file mode 100644 index 000000000..81a37eab7 --- /dev/null +++ b/third_party/bzip2/LICENSE @@ -0,0 +1,42 @@ + +-------------------------------------------------------------------------- + +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2019 Julian R Seward. All +rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Julian Seward, jseward@acm.org +bzip2/libbzip2 version 1.0.8 of 13 July 2019 + +-------------------------------------------------------------------------- diff --git a/third_party/bzip2/Makefile b/third_party/bzip2/Makefile new file mode 100644 index 000000000..f8a17722e --- /dev/null +++ b/third_party/bzip2/Makefile @@ -0,0 +1,217 @@ +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.8 of 13 July 2019 +# Copyright (C) 1996-2019 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ------------------------------------------------------------------ + +SHELL=/bin/sh + +# To assist in cross-compiling +CC=gcc +AR=ar +RANLIB=ranlib +LDFLAGS= + +BIGFILES=-D_FILE_OFFSET_BITS=64 +CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) + +# Where you want it installed when you do 'make install' +PREFIX=/usr/local + + +OBJS= blocksort.o \ + huffman.o \ + crctable.o \ + randtable.o \ + compress.o \ + decompress.o \ + bzlib.o + +all: libbz2.a bzip2 bzip2recover test + +bzip2: libbz2.a bzip2.o + $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2 + +bzip2recover: bzip2recover.o + $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o + +libbz2.a: $(OBJS) + rm -f libbz2.a + $(AR) cq libbz2.a $(OBJS) + @if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \ + -f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \ + echo $(RANLIB) libbz2.a ; \ + $(RANLIB) libbz2.a ; \ + fi + +check: test +test: bzip2 + @cat words1 + ./bzip2 -1 < sample1.ref > sample1.rb2 + ./bzip2 -2 < sample2.ref > sample2.rb2 + ./bzip2 -3 < sample3.ref > sample3.rb2 + ./bzip2 -d < sample1.bz2 > sample1.tst + ./bzip2 -d < sample2.bz2 > sample2.tst + ./bzip2 -ds < sample3.bz2 > sample3.tst + cmp sample1.bz2 sample1.rb2 + cmp sample2.bz2 sample2.rb2 + cmp sample3.bz2 sample3.rb2 + cmp sample1.tst sample1.ref + cmp sample2.tst sample2.ref + cmp sample3.tst sample3.ref + @cat words3 + +install: bzip2 bzip2recover + if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi + if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi + if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi + if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi + if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi + cp -f bzip2 $(PREFIX)/bin/bzip2 + cp -f bzip2 $(PREFIX)/bin/bunzip2 + cp -f bzip2 $(PREFIX)/bin/bzcat + cp -f bzip2recover $(PREFIX)/bin/bzip2recover + chmod a+x $(PREFIX)/bin/bzip2 + chmod a+x $(PREFIX)/bin/bunzip2 + chmod a+x $(PREFIX)/bin/bzcat + chmod a+x $(PREFIX)/bin/bzip2recover + cp -f bzip2.1 $(PREFIX)/man/man1 + chmod a+r $(PREFIX)/man/man1/bzip2.1 + cp -f bzlib.h $(PREFIX)/include + chmod a+r $(PREFIX)/include/bzlib.h + cp -f libbz2.a $(PREFIX)/lib + chmod a+r $(PREFIX)/lib/libbz2.a + cp -f bzgrep $(PREFIX)/bin/bzgrep + ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep + ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep + chmod a+x $(PREFIX)/bin/bzgrep + cp -f bzmore $(PREFIX)/bin/bzmore + ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless + chmod a+x $(PREFIX)/bin/bzmore + cp -f bzdiff $(PREFIX)/bin/bzdiff + ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp + chmod a+x $(PREFIX)/bin/bzdiff + cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1 + chmod a+r $(PREFIX)/man/man1/bzgrep.1 + chmod a+r $(PREFIX)/man/man1/bzmore.1 + chmod a+r $(PREFIX)/man/man1/bzdiff.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1 + echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1 + echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1 + echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1 + +clean: + rm -f *.o libbz2.a bzip2 bzip2recover \ + sample1.rb2 sample2.rb2 sample3.rb2 \ + sample1.tst sample2.tst sample3.tst + +blocksort.o: blocksort.c + @cat words0 + $(CC) $(CFLAGS) -c blocksort.c +huffman.o: huffman.c + $(CC) $(CFLAGS) -c huffman.c +crctable.o: crctable.c + $(CC) $(CFLAGS) -c crctable.c +randtable.o: randtable.c + $(CC) $(CFLAGS) -c randtable.c +compress.o: compress.c + $(CC) $(CFLAGS) -c compress.c +decompress.o: decompress.c + $(CC) $(CFLAGS) -c decompress.c +bzlib.o: bzlib.c + $(CC) $(CFLAGS) -c bzlib.c +bzip2.o: bzip2.c + $(CC) $(CFLAGS) -c bzip2.c +bzip2recover.o: bzip2recover.c + $(CC) $(CFLAGS) -c bzip2recover.c + + +distclean: clean + rm -f manual.ps manual.html manual.pdf + +DISTNAME=bzip2-1.0.8 +dist: check manual + rm -f $(DISTNAME) + ln -s -f . $(DISTNAME) + tar cvf $(DISTNAME).tar \ + $(DISTNAME)/blocksort.c \ + $(DISTNAME)/huffman.c \ + $(DISTNAME)/crctable.c \ + $(DISTNAME)/randtable.c \ + $(DISTNAME)/compress.c \ + $(DISTNAME)/decompress.c \ + $(DISTNAME)/bzlib.c \ + $(DISTNAME)/bzip2.c \ + $(DISTNAME)/bzip2recover.c \ + $(DISTNAME)/bzlib.h \ + $(DISTNAME)/bzlib_private.h \ + $(DISTNAME)/Makefile \ + $(DISTNAME)/LICENSE \ + $(DISTNAME)/bzip2.1 \ + $(DISTNAME)/bzip2.1.preformatted \ + $(DISTNAME)/bzip2.txt \ + $(DISTNAME)/words0 \ + $(DISTNAME)/words1 \ + $(DISTNAME)/words2 \ + $(DISTNAME)/words3 \ + $(DISTNAME)/sample1.ref \ + $(DISTNAME)/sample2.ref \ + $(DISTNAME)/sample3.ref \ + $(DISTNAME)/sample1.bz2 \ + $(DISTNAME)/sample2.bz2 \ + $(DISTNAME)/sample3.bz2 \ + $(DISTNAME)/dlltest.c \ + $(DISTNAME)/manual.html \ + $(DISTNAME)/manual.pdf \ + $(DISTNAME)/manual.ps \ + $(DISTNAME)/README \ + $(DISTNAME)/README.COMPILATION.PROBLEMS \ + $(DISTNAME)/README.XML.STUFF \ + $(DISTNAME)/CHANGES \ + $(DISTNAME)/libbz2.def \ + $(DISTNAME)/libbz2.dsp \ + $(DISTNAME)/dlltest.dsp \ + $(DISTNAME)/makefile.msc \ + $(DISTNAME)/unzcrash.c \ + $(DISTNAME)/spewG.c \ + $(DISTNAME)/mk251.c \ + $(DISTNAME)/bzdiff \ + $(DISTNAME)/bzdiff.1 \ + $(DISTNAME)/bzmore \ + $(DISTNAME)/bzmore.1 \ + $(DISTNAME)/bzgrep \ + $(DISTNAME)/bzgrep.1 \ + $(DISTNAME)/Makefile-libbz2_so \ + $(DISTNAME)/bz-common.xsl \ + $(DISTNAME)/bz-fo.xsl \ + $(DISTNAME)/bz-html.xsl \ + $(DISTNAME)/bzip.css \ + $(DISTNAME)/entities.xml \ + $(DISTNAME)/manual.xml \ + $(DISTNAME)/format.pl \ + $(DISTNAME)/xmlproc.sh + gzip -v $(DISTNAME).tar + +# For rebuilding the manual from sources on my SuSE 9.1 box + +MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \ + entities.xml manual.xml + +manual: manual.html manual.ps manual.pdf + +manual.ps: $(MANUAL_SRCS) + ./xmlproc.sh -ps manual.xml + +manual.pdf: $(MANUAL_SRCS) + ./xmlproc.sh -pdf manual.xml + +manual.html: $(MANUAL_SRCS) + ./xmlproc.sh -html manual.xml diff --git a/third_party/bzip2/Makefile-libbz2_so b/third_party/bzip2/Makefile-libbz2_so new file mode 100644 index 000000000..fb0f2306f --- /dev/null +++ b/third_party/bzip2/Makefile-libbz2_so @@ -0,0 +1,59 @@ + +# This Makefile builds a shared version of the library, +# libbz2.so.1.0.8, with soname libbz2.so.1.0, +# at least on x86-Linux (RedHat 7.2), +# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98). +# Please see the README file for some important info +# about building the library like this. + +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.8 of 13 July 2019 +# Copyright (C) 1996-2019 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ------------------------------------------------------------------ + + +SHELL=/bin/sh +CC=gcc +BIGFILES=-D_FILE_OFFSET_BITS=64 +CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES) + +OBJS= blocksort.o \ + huffman.o \ + crctable.o \ + randtable.o \ + compress.o \ + decompress.o \ + bzlib.o + +all: $(OBJS) + $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.8 $(OBJS) + $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.8 + rm -f libbz2.so.1.0 + ln -s libbz2.so.1.0.8 libbz2.so.1.0 + +clean: + rm -f $(OBJS) bzip2.o libbz2.so.1.0.8 libbz2.so.1.0 bzip2-shared + +blocksort.o: blocksort.c + $(CC) $(CFLAGS) -c blocksort.c +huffman.o: huffman.c + $(CC) $(CFLAGS) -c huffman.c +crctable.o: crctable.c + $(CC) $(CFLAGS) -c crctable.c +randtable.o: randtable.c + $(CC) $(CFLAGS) -c randtable.c +compress.o: compress.c + $(CC) $(CFLAGS) -c compress.c +decompress.o: decompress.c + $(CC) $(CFLAGS) -c decompress.c +bzlib.o: bzlib.c + $(CC) $(CFLAGS) -c bzlib.c diff --git a/third_party/bzip2/README b/third_party/bzip2/README new file mode 100644 index 000000000..b9c6099fd --- /dev/null +++ b/third_party/bzip2/README @@ -0,0 +1,196 @@ + +This is the README for bzip2/libzip2. +This version is fully compatible with the previous public releases. + +------------------------------------------------------------------ +This file is part of bzip2/libbzip2, a program and library for +lossless, block-sorting data compression. + +bzip2/libbzip2 version 1.0.8 of 13 July 2019 +Copyright (C) 1996-2019 Julian Seward + +Please read the WARNING, DISCLAIMER and PATENTS sections in this file. + +This program is released under the terms of the license contained +in the file LICENSE. +------------------------------------------------------------------ + +Complete documentation is available in Postscript form (manual.ps), +PDF (manual.pdf) or html (manual.html). A plain-text version of the +manual page is available as bzip2.txt. + + +HOW TO BUILD -- UNIX + +Type 'make'. This builds the library libbz2.a and then the programs +bzip2 and bzip2recover. Six self-tests are run. If the self-tests +complete ok, carry on to installation: + +To install in /usr/local/bin, /usr/local/lib, /usr/local/man and +/usr/local/include, type + + make install + +To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type + + make install PREFIX=/xxx/yyy + +If you are (justifiably) paranoid and want to see what 'make install' +is going to do, you can first do + + make -n install or + make -n install PREFIX=/xxx/yyy respectively. + +The -n instructs make to show the commands it would execute, but not +actually execute them. + + +HOW TO BUILD -- UNIX, shared library libbz2.so. + +Do 'make -f Makefile-libbz2_so'. This Makefile seems to work for +Linux-ELF (RedHat 7.2 on an x86 box), with gcc. I make no claims +that it works for any other platform, though I suspect it probably +will work for most platforms employing both ELF and gcc. + +bzip2-shared, a client of the shared library, is also built, but not +self-tested. So I suggest you also build using the normal Makefile, +since that conducts a self-test. A second reason to prefer the +version statically linked to the library is that, on x86 platforms, +building shared objects makes a valuable register (%ebx) unavailable +to gcc, resulting in a slowdown of 10%-20%, at least for bzip2. + +Important note for people upgrading .so's from 0.9.0/0.9.5 to version +1.0.X. All the functions in the library have been renamed, from (eg) +bzCompress to BZ2_bzCompress, to avoid namespace pollution. +Unfortunately this means that the libbz2.so created by +Makefile-libbz2_so will not work with any program which used an older +version of the library. I do encourage library clients to make the +effort to upgrade to use version 1.0, since it is both faster and more +robust than previous versions. + + +HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc. + +It's difficult for me to support compilation on all these platforms. +My approach is to collect binaries for these platforms, and put them +on the master web site (https://sourceware.org/bzip2/). Look there. However +(FWIW), bzip2-1.0.X is very standard ANSI C and should compile +unmodified with MS Visual C. If you have difficulties building, you +might want to read README.COMPILATION.PROBLEMS. + +At least using MS Visual C++ 6, you can build from the unmodified +sources by issuing, in a command shell: + + nmake -f makefile.msc + +(you may need to first run the MSVC-provided script VCVARS32.BAT + so as to set up paths to the MSVC tools correctly). + + +VALIDATION + +Correct operation, in the sense that a compressed file can always be +decompressed to reproduce the original, is obviously of paramount +importance. To validate bzip2, I used a modified version of Mark +Nelson's churn program. Churn is an automated test driver which +recursively traverses a directory structure, using bzip2 to compress +and then decompress each file it encounters, and checking that the +decompressed data is the same as the original. + + + +Please read and be aware of the following: + +WARNING: + + This program and library (attempts to) compress data by + performing several non-trivial transformations on it. + Unless you are 100% familiar with *all* the algorithms + contained herein, and with the consequences of modifying them, + you should NOT meddle with the compression or decompression + machinery. Incorrect changes can and very likely *will* + lead to disastrous loss of data. + + +DISCLAIMER: + + I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE + USE OF THIS PROGRAM/LIBRARY, HOWSOEVER CAUSED. + + Every compression of a file implies an assumption that the + compressed file can be decompressed to reproduce the original. + Great efforts in design, coding and testing have been made to + ensure that this program works correctly. However, the complexity + of the algorithms, and, in particular, the presence of various + special cases in the code which occur with very low but non-zero + probability make it impossible to rule out the possibility of bugs + remaining in the program. DO NOT COMPRESS ANY DATA WITH THIS + PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER + SMALL, THAT THE DATA WILL NOT BE RECOVERABLE. + + That is not to say this program is inherently unreliable. + Indeed, I very much hope the opposite is true. bzip2/libbzip2 + has been carefully constructed and extensively tested. + + +PATENTS: + + To the best of my knowledge, bzip2/libbzip2 does not use any + patented algorithms. However, I do not have the resources + to carry out a patent search. Therefore I cannot give any + guarantee of the above statement. + + + +WHAT'S NEW IN 0.9.0 (as compared to 0.1pl2) ? + + * Approx 10% faster compression, 30% faster decompression + * -t (test mode) is a lot quicker + * Can decompress concatenated compressed files + * Programming interface, so programs can directly read/write .bz2 files + * Less restrictive (BSD-style) licensing + * Flag handling more compatible with GNU gzip + * Much more documentation, i.e., a proper user manual + * Hopefully, improved portability (at least of the library) + +WHAT'S NEW IN 0.9.5 ? + + * Compression speed is much less sensitive to the input + data than in previous versions. Specifically, the very + slow performance caused by repetitive data is fixed. + * Many small improvements in file and flag handling. + * A Y2K statement. + +WHAT'S NEW IN 1.0.x ? + + See the CHANGES file. + +I hope you find bzip2 useful. Feel free to contact the developers at + bzip2-devel@sourceware.org +if you have any suggestions or queries. Many people mailed me with +comments, suggestions and patches after the releases of bzip-0.15, +bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, +1.0.2 and 1.0.3, and the changes in bzip2 are largely a result of this +feedback. I thank you for your comments. + +bzip2's "home" is https://sourceware.org/bzip2/ + +Julian Seward +jseward@acm.org +Cambridge, UK. + +18 July 1996 (version 0.15) +25 August 1996 (version 0.21) + 7 August 1997 (bzip2, version 0.1) +29 August 1997 (bzip2, version 0.1pl2) +23 August 1998 (bzip2, version 0.9.0) + 8 June 1999 (bzip2, version 0.9.5) + 4 Sept 1999 (bzip2, version 0.9.5d) + 5 May 2000 (bzip2, version 1.0pre8) +30 December 2001 (bzip2, version 1.0.2pre1) +15 February 2005 (bzip2, version 1.0.3) +20 December 2006 (bzip2, version 1.0.4) +10 December 2007 (bzip2, version 1.0.5) + 6 Sept 2010 (bzip2, version 1.0.6) +27 June 2019 (bzip2, version 1.0.7) +13 July 2019 (bzip2, version 1.0.8) diff --git a/third_party/bzip2/README.COMPILATION.PROBLEMS b/third_party/bzip2/README.COMPILATION.PROBLEMS new file mode 100644 index 000000000..fa317a50c --- /dev/null +++ b/third_party/bzip2/README.COMPILATION.PROBLEMS @@ -0,0 +1,58 @@ +------------------------------------------------------------------ +This file is part of bzip2/libbzip2, a program and library for +lossless, block-sorting data compression. + +bzip2/libbzip2 version 1.0.8 of 13 July 2019 +Copyright (C) 1996-2019 Julian Seward + +Please read the WARNING, DISCLAIMER and PATENTS sections in the +README file. + +This program is released under the terms of the license contained +in the file LICENSE. +------------------------------------------------------------------ + +bzip2 should compile without problems on the vast majority of +platforms. Using the supplied Makefile, I've built and tested it +myself for x86-linux and amd64-linux. With makefile.msc, Visual C++ +6.0 and nmake, you can build a native Win32 version too. Large file +support seems to work correctly on at least on amd64-linux. + +When I say "large file" I mean a file of size 2,147,483,648 (2^31) +bytes or above. Many older OSs can't handle files above this size, +but many newer ones can. Large files are pretty huge -- most files +you'll encounter are not Large Files. + +Early versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide variety +of platforms without difficulty, and I hope this version will continue +in that tradition. However, in order to support large files, I've had +to include the define -D_FILE_OFFSET_BITS=64 in the Makefile. This +can cause problems. + +The technique of adding -D_FILE_OFFSET_BITS=64 to get large file +support is, as far as I know, the Recommended Way to get correct large +file support. For more details, see the Large File Support +Specification, published by the Large File Summit, at + + http://ftp.sas.com/standards/large.file + +As a general comment, if you get compilation errors which you think +are related to large file support, try removing the above define from +the Makefile, ie, delete the line + + BIGFILES=-D_FILE_OFFSET_BITS=64 + +from the Makefile, and do 'make clean ; make'. This will give you a +version of bzip2 without large file support, which, for most +applications, is probably not a problem. + +Alternatively, try some of the platform-specific hints listed below. + +You can use the spewG.c program to generate huge files to test bzip2's +large file support, if you are feeling paranoid. Be aware though that +any compilation problems which affect bzip2 will also affect spewG.c, +alas. + +AIX: I have reports that for large file support, you need to specify +-D_LARGE_FILES rather than -D_FILE_OFFSET_BITS=64. I have not tested +this myself. diff --git a/third_party/bzip2/README.XML.STUFF b/third_party/bzip2/README.XML.STUFF new file mode 100644 index 000000000..1503476eb --- /dev/null +++ b/third_party/bzip2/README.XML.STUFF @@ -0,0 +1,45 @@ + ---------------------------------------------------------------- + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ---------------------------------------------------------------- + +The script xmlproc.sh takes an xml file as input, +and processes it to create .pdf, .html or .ps output. +It uses format.pl, a perl script to format
 blocks nicely,
+ and add CDATA tags so writers do not have to use eg. < 
+
+The file "entities.xml" must be edited to reflect current
+version, year, etc.
+
+
+Usage:
+
+  ./xmlproc.sh -v manual.xml
+  Validates an xml file to ensure no dtd-compliance errors
+
+  ./xmlproc.sh -html manual.xml
+  Output: manual.html
+
+  ./xmlproc.sh -pdf manual.xml
+  Output: manual.pdf
+
+  ./xmlproc.sh -ps manual.xml
+  Output: manual.ps
+
+
+Notum bene: 
+- pdfxmltex barfs if given a filename with an underscore in it
+
+- xmltex won't work yet - there's a bug in passivetex
+    which we are all waiting for Sebastian to fix.
+  So we are going the xml -> pdf -> ps route for the time being,
+    using pdfxmltex.
diff --git a/third_party/bzip2/README.cosmo b/third_party/bzip2/README.cosmo
new file mode 100644
index 000000000..1a92c1513
--- /dev/null
+++ b/third_party/bzip2/README.cosmo
@@ -0,0 +1,11 @@
+DESCRIPTION
+
+  bzip2 is a lossless compression algorithm that's slower than deflate
+  but achieves better compression ratios w/ Burrows–Wheeler transform.
+
+ORIGIN
+
+  commit 6a8690fc8d26c815e798c588f796eabe9d684cf0 (HEAD, tag: bzip2-1.0.8)
+  Author: Mark Wielaard 
+  Date:   Sat Jul 13 17:17:58 2019 +0200
+  Prepare for 1.0.8 release.
diff --git a/third_party/bzip2/blocksort.c b/third_party/bzip2/blocksort.c
new file mode 100644
index 000000000..92d81fe28
--- /dev/null
+++ b/third_party/bzip2/blocksort.c
@@ -0,0 +1,1094 @@
+
+/*-------------------------------------------------------------*/
+/*--- Block sorting machinery                               ---*/
+/*---                                           blocksort.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------*/
+/*--- Fallback O(N log(N)^2) sorting        ---*/
+/*--- algorithm, for repetitive blocks      ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+__inline__
+void fallbackSimpleSort ( UInt32* fmap, 
+                          UInt32* eclass, 
+                          Int32   lo, 
+                          Int32   hi )
+{
+   Int32 i, j, tmp;
+   UInt32 ec_tmp;
+
+   if (lo == hi) return;
+
+   if (hi - lo > 3) {
+      for ( i = hi-4; i >= lo; i-- ) {
+         tmp = fmap[i];
+         ec_tmp = eclass[tmp];
+         for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 )
+            fmap[j-4] = fmap[j];
+         fmap[j-4] = tmp;
+      }
+   }
+
+   for ( i = hi-1; i >= lo; i-- ) {
+      tmp = fmap[i];
+      ec_tmp = eclass[tmp];
+      for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ )
+         fmap[j-1] = fmap[j];
+      fmap[j-1] = tmp;
+   }
+}
+
+
+/*---------------------------------------------*/
+#define fswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define fvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      fswap(fmap[yyp1], fmap[yyp2]);  \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+
+#define fmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define fpush(lz,hz) { stackLo[sp] = lz; \
+                       stackHi[sp] = hz; \
+                       sp++; }
+
+#define fpop(lz,hz) { sp--;              \
+                      lz = stackLo[sp];  \
+                      hz = stackHi[sp]; }
+
+#define FALLBACK_QSORT_SMALL_THRESH 10
+#define FALLBACK_QSORT_STACK_SIZE   100
+
+
+static
+void fallbackQSort3 ( UInt32* fmap, 
+                      UInt32* eclass,
+                      Int32   loSt, 
+                      Int32   hiSt )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m;
+   Int32 sp, lo, hi;
+   UInt32 med, r, r3;
+   Int32 stackLo[FALLBACK_QSORT_STACK_SIZE];
+   Int32 stackHi[FALLBACK_QSORT_STACK_SIZE];
+
+   r = 0;
+
+   sp = 0;
+   fpush ( loSt, hiSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 );
+
+      fpop ( lo, hi );
+      if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) {
+         fallbackSimpleSort ( fmap, eclass, lo, hi );
+         continue;
+      }
+
+      /* Random partitioning.  Median of 3 sometimes fails to
+         avoid bad cases.  Median of 9 seems to help but 
+         looks rather expensive.  This too seems to work but
+         is cheaper.  Guidance for the magic constants 
+         7621 and 32768 is taken from Sedgewick's algorithms
+         book, chapter 35.
+      */
+      r = ((r * 7621) + 1) % 32768;
+      r3 = r % 3;
+      if (r3 == 0) med = eclass[fmap[lo]]; else
+      if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else
+                   med = eclass[fmap[hi]];
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (1) {
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unLo]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unLo], fmap[ltLo]); 
+               ltLo++; unLo++; 
+               continue; 
+            };
+            if (n > 0) break;
+            unLo++;
+         }
+         while (1) {
+            if (unLo > unHi) break;
+            n = (Int32)eclass[fmap[unHi]] - (Int32)med;
+            if (n == 0) { 
+               fswap(fmap[unHi], fmap[gtHi]); 
+               gtHi--; unHi--; 
+               continue; 
+            };
+            if (n < 0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "fallbackQSort3(2)" );
+
+      if (gtHi < ltLo) continue;
+
+      n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n);
+      m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      if (n - lo > hi - m) {
+         fpush ( lo, n );
+         fpush ( m, hi );
+      } else {
+         fpush ( m, hi );
+         fpush ( lo, n );
+      }
+   }
+}
+
+#undef fmin
+#undef fpush
+#undef fpop
+#undef fswap
+#undef fvswap
+#undef FALLBACK_QSORT_SMALL_THRESH
+#undef FALLBACK_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      eclass exists for [0 .. nblock-1]
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)eclass) [0 .. nblock-1] holds block
+      All other areas of eclass destroyed
+      fmap [0 .. nblock-1] holds sorted order
+      bhtab [ 0 .. 2+(nblock/32) ] destroyed
+*/
+
+#define       SET_BH(zz)  bhtab[(zz) >> 5] |= ((UInt32)1 << ((zz) & 31))
+#define     CLEAR_BH(zz)  bhtab[(zz) >> 5] &= ~((UInt32)1 << ((zz) & 31))
+#define     ISSET_BH(zz)  (bhtab[(zz) >> 5] & ((UInt32)1 << ((zz) & 31)))
+#define      WORD_BH(zz)  bhtab[(zz) >> 5]
+#define UNALIGNED_BH(zz)  ((zz) & 0x01f)
+
+static
+void fallbackSort ( UInt32* fmap, 
+                    UInt32* eclass, 
+                    UInt32* bhtab,
+                    Int32   nblock,
+                    Int32   verb )
+{
+   Int32 ftab[257];
+   Int32 ftabCopy[256];
+   Int32 H, i, j, k, l, r, cc, cc1;
+   Int32 nNotDone;
+   Int32 nBhtab;
+   UChar* eclass8 = (UChar*)eclass;
+
+   /*--
+      Initial 1-char radix sort to generate
+      initial fmap and initial BH bits.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        bucket sorting ...\n" );
+   for (i = 0; i < 257;    i++) ftab[i] = 0;
+   for (i = 0; i < nblock; i++) ftab[eclass8[i]]++;
+   for (i = 0; i < 256;    i++) ftabCopy[i] = ftab[i];
+   for (i = 1; i < 257;    i++) ftab[i] += ftab[i-1];
+
+   for (i = 0; i < nblock; i++) {
+      j = eclass8[i];
+      k = ftab[j] - 1;
+      ftab[j] = k;
+      fmap[k] = i;
+   }
+
+   nBhtab = 2 + (nblock / 32);
+   for (i = 0; i < nBhtab; i++) bhtab[i] = 0;
+   for (i = 0; i < 256; i++) SET_BH(ftab[i]);
+
+   /*--
+      Inductively refine the buckets.  Kind-of an
+      "exponential radix sort" (!), inspired by the
+      Manber-Myers suffix array construction algorithm.
+   --*/
+
+   /*-- set sentinel bits for block-end detection --*/
+   for (i = 0; i < 32; i++) { 
+      SET_BH(nblock + 2*i);
+      CLEAR_BH(nblock + 2*i + 1);
+   }
+
+   /*-- the log(N) loop --*/
+   H = 1;
+   while (1) {
+
+      if (verb >= 4) 
+         VPrintf1 ( "        depth %6d has ", H );
+
+      j = 0;
+      for (i = 0; i < nblock; i++) {
+         if (ISSET_BH(i)) j = i;
+         k = fmap[i] - H; if (k < 0) k += nblock;
+         eclass[k] = j;
+      }
+
+      nNotDone = 0;
+      r = -1;
+      while (1) {
+
+	 /*-- find the next non-singleton bucket --*/
+         k = r + 1;
+         while (ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (ISSET_BH(k)) {
+            while (WORD_BH(k) == 0xffffffff) k += 32;
+            while (ISSET_BH(k)) k++;
+         }
+         l = k - 1;
+         if (l >= nblock) break;
+         while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++;
+         if (!ISSET_BH(k)) {
+            while (WORD_BH(k) == 0x00000000) k += 32;
+            while (!ISSET_BH(k)) k++;
+         }
+         r = k - 1;
+         if (r >= nblock) break;
+
+         /*-- now [l, r] bracket current bucket --*/
+         if (r > l) {
+            nNotDone += (r - l + 1);
+            fallbackQSort3 ( fmap, eclass, l, r );
+
+            /*-- scan bucket and generate header bits-- */
+            cc = -1;
+            for (i = l; i <= r; i++) {
+               cc1 = eclass[fmap[i]];
+               if (cc != cc1) { SET_BH(i); cc = cc1; };
+            }
+         }
+      }
+
+      if (verb >= 4) 
+         VPrintf1 ( "%6d unresolved strings\n", nNotDone );
+
+      H *= 2;
+      if (H > nblock || nNotDone == 0) break;
+   }
+
+   /*-- 
+      Reconstruct the original block in
+      eclass8 [0 .. nblock-1], since the
+      previous phase destroyed it.
+   --*/
+   if (verb >= 4)
+      VPrintf0 ( "        reconstructing block ...\n" );
+   j = 0;
+   for (i = 0; i < nblock; i++) {
+      while (ftabCopy[j] == 0) j++;
+      ftabCopy[j]--;
+      eclass8[fmap[i]] = (UChar)j;
+   }
+   AssertH ( j < 256, 1005 );
+}
+
+#undef       SET_BH
+#undef     CLEAR_BH
+#undef     ISSET_BH
+#undef      WORD_BH
+#undef UNALIGNED_BH
+
+
+/*---------------------------------------------*/
+/*--- The main, O(N^2 log(N)) sorting       ---*/
+/*--- algorithm.  Faster for "normal"       ---*/
+/*--- non-repetitive blocks.                ---*/
+/*---------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+__inline__
+Bool mainGtU ( UInt32  i1, 
+               UInt32  i2,
+               UChar*  block, 
+               UInt16* quadrant,
+               UInt32  nblock,
+               Int32*  budget )
+{
+   Int32  k;
+   UChar  c1, c2;
+   UInt16 s1, s2;
+
+   AssertD ( i1 != i2, "mainGtU" );
+   /* 1 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 2 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 3 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 4 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 5 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 6 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 7 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 8 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 9 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 10 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 11 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+   /* 12 */
+   c1 = block[i1]; c2 = block[i2];
+   if (c1 != c2) return (c1 > c2);
+   i1++; i2++;
+
+   k = nblock + 8;
+
+   do {
+      /* 1 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 2 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 3 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 4 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 5 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 6 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 7 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+      /* 8 */
+      c1 = block[i1]; c2 = block[i2];
+      if (c1 != c2) return (c1 > c2);
+      s1 = quadrant[i1]; s2 = quadrant[i2];
+      if (s1 != s2) return (s1 > s2);
+      i1++; i2++;
+
+      if (i1 >= nblock) i1 -= nblock;
+      if (i2 >= nblock) i2 -= nblock;
+
+      k -= 8;
+      (*budget)--;
+   }
+      while (k >= 0);
+
+   return False;
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Knuth's increments seem to work better
+   than Incerpi-Sedgewick here.  Possibly
+   because the number of elems to sort is
+   usually small, typically <= 20.
+--*/
+static
+Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280,
+                   9841, 29524, 88573, 265720,
+                   797161, 2391484 };
+
+static
+void mainSimpleSort ( UInt32* ptr,
+                      UChar*  block,
+                      UInt16* quadrant,
+                      Int32   nblock,
+                      Int32   lo, 
+                      Int32   hi, 
+                      Int32   d,
+                      Int32*  budget )
+{
+   Int32 i, j, h, bigN, hp;
+   UInt32 v;
+
+   bigN = hi - lo + 1;
+   if (bigN < 2) return;
+
+   hp = 0;
+   while (incs[hp] < bigN) hp++;
+   hp--;
+
+   for (; hp >= 0; hp--) {
+      h = incs[hp];
+
+      i = lo + h;
+      while (True) {
+
+         /*-- copy 1 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 2 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         /*-- copy 3 --*/
+         if (i > hi) break;
+         v = ptr[i];
+         j = i;
+         while ( mainGtU ( 
+                    ptr[j-h]+d, v+d, block, quadrant, nblock, budget 
+                 ) ) {
+            ptr[j] = ptr[j-h];
+            j = j - h;
+            if (j <= (lo + h - 1)) break;
+         }
+         ptr[j] = v;
+         i++;
+
+         if (*budget < 0) return;
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+/*--
+   The following is an implementation of
+   an elegant 3-way quicksort for strings,
+   described in a paper "Fast Algorithms for
+   Sorting and Searching Strings", by Robert
+   Sedgewick and Jon L. Bentley.
+--*/
+
+#define mswap(zz1, zz2) \
+   { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; }
+
+#define mvswap(zzp1, zzp2, zzn)       \
+{                                     \
+   Int32 yyp1 = (zzp1);               \
+   Int32 yyp2 = (zzp2);               \
+   Int32 yyn  = (zzn);                \
+   while (yyn > 0) {                  \
+      mswap(ptr[yyp1], ptr[yyp2]);    \
+      yyp1++; yyp2++; yyn--;          \
+   }                                  \
+}
+
+static 
+__inline__
+UChar mmed3 ( UChar a, UChar b, UChar c )
+{
+   UChar t;
+   if (a > b) { t = a; a = b; b = t; };
+   if (b > c) { 
+      b = c;
+      if (a > b) b = a;
+   }
+   return b;
+}
+
+#define mmin(a,b) ((a) < (b)) ? (a) : (b)
+
+#define mpush(lz,hz,dz) { stackLo[sp] = lz; \
+                          stackHi[sp] = hz; \
+                          stackD [sp] = dz; \
+                          sp++; }
+
+#define mpop(lz,hz,dz) { sp--;             \
+                         lz = stackLo[sp]; \
+                         hz = stackHi[sp]; \
+                         dz = stackD [sp]; }
+
+
+#define mnextsize(az) (nextHi[az]-nextLo[az])
+
+#define mnextswap(az,bz)                                        \
+   { Int32 tz;                                                  \
+     tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \
+     tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \
+     tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; }
+
+
+#define MAIN_QSORT_SMALL_THRESH 20
+#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
+#define MAIN_QSORT_STACK_SIZE 100
+
+static
+void mainQSort3 ( UInt32* ptr,
+                  UChar*  block,
+                  UInt16* quadrant,
+                  Int32   nblock,
+                  Int32   loSt, 
+                  Int32   hiSt, 
+                  Int32   dSt,
+                  Int32*  budget )
+{
+   Int32 unLo, unHi, ltLo, gtHi, n, m, med;
+   Int32 sp, lo, hi, d;
+
+   Int32 stackLo[MAIN_QSORT_STACK_SIZE];
+   Int32 stackHi[MAIN_QSORT_STACK_SIZE];
+   Int32 stackD [MAIN_QSORT_STACK_SIZE];
+
+   Int32 nextLo[3];
+   Int32 nextHi[3];
+   Int32 nextD [3];
+
+   sp = 0;
+   mpush ( loSt, hiSt, dSt );
+
+   while (sp > 0) {
+
+      AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 );
+
+      mpop ( lo, hi, d );
+      if (hi - lo < MAIN_QSORT_SMALL_THRESH || 
+          d > MAIN_QSORT_DEPTH_THRESH) {
+         mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget );
+         if (*budget < 0) return;
+         continue;
+      }
+
+      med = (Int32) 
+            mmed3 ( block[ptr[ lo         ]+d],
+                    block[ptr[ hi         ]+d],
+                    block[ptr[ (lo+hi)>>1 ]+d] );
+
+      unLo = ltLo = lo;
+      unHi = gtHi = hi;
+
+      while (True) {
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unLo]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unLo], ptr[ltLo]); 
+               ltLo++; unLo++; continue; 
+            };
+            if (n >  0) break;
+            unLo++;
+         }
+         while (True) {
+            if (unLo > unHi) break;
+            n = ((Int32)block[ptr[unHi]+d]) - med;
+            if (n == 0) { 
+               mswap(ptr[unHi], ptr[gtHi]); 
+               gtHi--; unHi--; continue; 
+            };
+            if (n <  0) break;
+            unHi--;
+         }
+         if (unLo > unHi) break;
+         mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--;
+      }
+
+      AssertD ( unHi == unLo-1, "mainQSort3(2)" );
+
+      if (gtHi < ltLo) {
+         mpush(lo, hi, d+1 );
+         continue;
+      }
+
+      n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n);
+      m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m);
+
+      n = lo + unLo - ltLo - 1;
+      m = hi - (gtHi - unHi) + 1;
+
+      nextLo[0] = lo;  nextHi[0] = n;   nextD[0] = d;
+      nextLo[1] = m;   nextHi[1] = hi;  nextD[1] = d;
+      nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1;
+
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+      if (mnextsize(1) < mnextsize(2)) mnextswap(1,2);
+      if (mnextsize(0) < mnextsize(1)) mnextswap(0,1);
+
+      AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" );
+      AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" );
+
+      mpush (nextLo[0], nextHi[0], nextD[0]);
+      mpush (nextLo[1], nextHi[1], nextD[1]);
+      mpush (nextLo[2], nextHi[2], nextD[2]);
+   }
+}
+
+#undef mswap
+#undef mvswap
+#undef mpush
+#undef mpop
+#undef mmin
+#undef mnextsize
+#undef mnextswap
+#undef MAIN_QSORT_SMALL_THRESH
+#undef MAIN_QSORT_DEPTH_THRESH
+#undef MAIN_QSORT_STACK_SIZE
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > N_OVERSHOOT
+      block32 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      ptr exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)block32) [0 .. nblock-1] holds block
+      All other areas of block32 destroyed
+      ftab [0 .. 65536 ] destroyed
+      ptr [0 .. nblock-1] holds sorted order
+      if (*budget < 0), sorting was abandoned
+*/
+
+#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8])
+#define SETMASK (1 << 21)
+#define CLEARMASK (~(SETMASK))
+
+static
+void mainSort ( UInt32* ptr, 
+                UChar*  block,
+                UInt16* quadrant, 
+                UInt32* ftab,
+                Int32   nblock,
+                Int32   verb,
+                Int32*  budget )
+{
+   Int32  i, j, k, ss, sb;
+   Int32  runningOrder[256];
+   Bool   bigDone[256];
+   Int32  copyStart[256];
+   Int32  copyEnd  [256];
+   UChar  c1;
+   Int32  numQSorted;
+   UInt16 s;
+   if (verb >= 4) VPrintf0 ( "        main sort initialise ...\n" );
+
+   /*-- set up the 2-byte frequency table --*/
+   for (i = 65536; i >= 0; i--) ftab[i] = 0;
+
+   j = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+      quadrant[i-1] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-1]) << 8);
+      ftab[j]++;
+      quadrant[i-2] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-2]) << 8);
+      ftab[j]++;
+      quadrant[i-3] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i-3]) << 8);
+      ftab[j]++;
+   }
+   for (; i >= 0; i--) {
+      quadrant[i] = 0;
+      j = (j >> 8) | ( ((UInt16)block[i]) << 8);
+      ftab[j]++;
+   }
+
+   /*-- (emphasises close relationship of block & quadrant) --*/
+   for (i = 0; i < BZ_N_OVERSHOOT; i++) {
+      block   [nblock+i] = block[i];
+      quadrant[nblock+i] = 0;
+   }
+
+   if (verb >= 4) VPrintf0 ( "        bucket sorting ...\n" );
+
+   /*-- Complete the initial radix sort --*/
+   for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1];
+
+   s = block[0] << 8;
+   i = nblock-1;
+   for (; i >= 3; i -= 4) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+      s = (s >> 8) | (block[i-1] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-1;
+      s = (s >> 8) | (block[i-2] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-2;
+      s = (s >> 8) | (block[i-3] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i-3;
+   }
+   for (; i >= 0; i--) {
+      s = (s >> 8) | (block[i] << 8);
+      j = ftab[s] -1;
+      ftab[s] = j;
+      ptr[j] = i;
+   }
+
+   /*--
+      Now ftab contains the first loc of every small bucket.
+      Calculate the running order, from smallest to largest
+      big bucket.
+   --*/
+   for (i = 0; i <= 255; i++) {
+      bigDone     [i] = False;
+      runningOrder[i] = i;
+   }
+
+   {
+      Int32 vv;
+      Int32 h = 1;
+      do h = 3 * h + 1; while (h <= 256);
+      do {
+         h = h / 3;
+         for (i = h; i <= 255; i++) {
+            vv = runningOrder[i];
+            j = i;
+            while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) {
+               runningOrder[j] = runningOrder[j-h];
+               j = j - h;
+               if (j <= (h - 1)) goto zero;
+            }
+            zero:
+            runningOrder[j] = vv;
+         }
+      } while (h != 1);
+   }
+
+   /*--
+      The main sorting loop.
+   --*/
+
+   numQSorted = 0;
+
+   for (i = 0; i <= 255; i++) {
+
+      /*--
+         Process big buckets, starting with the least full.
+         Basically this is a 3-step process in which we call
+         mainQSort3 to sort the small buckets [ss, j], but
+         also make a big effort to avoid the calls if we can.
+      --*/
+      ss = runningOrder[i];
+
+      /*--
+         Step 1:
+         Complete the big bucket [ss] by quicksorting
+         any unsorted small buckets [ss, j], for j != ss.  
+         Hopefully previous pointer-scanning phases have already
+         completed many of the small buckets [ss, j], so
+         we don't have to sort them at all.
+      --*/
+      for (j = 0; j <= 255; j++) {
+         if (j != ss) {
+            sb = (ss << 8) + j;
+            if ( ! (ftab[sb] & SETMASK) ) {
+               Int32 lo = ftab[sb]   & CLEARMASK;
+               Int32 hi = (ftab[sb+1] & CLEARMASK) - 1;
+               if (hi > lo) {
+                  if (verb >= 4)
+                     VPrintf4 ( "        qsort [0x%x, 0x%x]   "
+                                "done %d   this %d\n",
+                                ss, j, numQSorted, hi - lo + 1 );
+                  mainQSort3 ( 
+                     ptr, block, quadrant, nblock, 
+                     lo, hi, BZ_N_RADIX, budget 
+                  );   
+                  numQSorted += (hi - lo + 1);
+                  if (*budget < 0) return;
+               }
+            }
+            ftab[sb] |= SETMASK;
+         }
+      }
+
+      AssertH ( !bigDone[ss], 1006 );
+
+      /*--
+         Step 2:
+         Now scan this big bucket [ss] so as to synthesise the
+         sorted order for small buckets [t, ss] for all t,
+         including, magically, the bucket [ss,ss] too.
+         This will avoid doing Real Work in subsequent Step 1's.
+      --*/
+      {
+         for (j = 0; j <= 255; j++) {
+            copyStart[j] =  ftab[(j << 8) + ss]     & CLEARMASK;
+            copyEnd  [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1;
+         }
+         for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1])
+               ptr[ copyStart[c1]++ ] = k;
+         }
+         for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) {
+            k = ptr[j]-1; if (k < 0) k += nblock;
+            c1 = block[k];
+            if (!bigDone[c1]) 
+               ptr[ copyEnd[c1]-- ] = k;
+         }
+      }
+
+      AssertH ( (copyStart[ss]-1 == copyEnd[ss])
+                || 
+                /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1.
+                   Necessity for this case is demonstrated by compressing 
+                   a sequence of approximately 48.5 million of character 
+                   251; 1.0.0/1.0.1 will then die here. */
+                (copyStart[ss] == 0 && copyEnd[ss] == nblock-1),
+                1007 )
+
+      for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK;
+
+      /*--
+         Step 3:
+         The [ss] big bucket is now done.  Record this fact,
+         and update the quadrant descriptors.  Remember to
+         update quadrants in the overshoot area too, if
+         necessary.  The "if (i < 255)" test merely skips
+         this updating for the last bucket processed, since
+         updating for the last bucket is pointless.
+
+         The quadrant array provides a way to incrementally
+         cache sort orderings, as they appear, so as to 
+         make subsequent comparisons in fullGtU() complete
+         faster.  For repetitive blocks this makes a big
+         difference (but not big enough to be able to avoid
+         the fallback sorting mechanism, exponential radix sort).
+
+         The precise meaning is: at all times:
+
+            for 0 <= i < nblock and 0 <= j <= nblock
+
+            if block[i] != block[j], 
+
+               then the relative values of quadrant[i] and 
+                    quadrant[j] are meaningless.
+
+               else {
+                  if quadrant[i] < quadrant[j]
+                     then the string starting at i lexicographically
+                     precedes the string starting at j
+
+                  else if quadrant[i] > quadrant[j]
+                     then the string starting at j lexicographically
+                     precedes the string starting at i
+
+                  else
+                     the relative ordering of the strings starting
+                     at i and j has not yet been determined.
+               }
+      --*/
+      bigDone[ss] = True;
+
+      if (i < 255) {
+         Int32 bbStart  = ftab[ss << 8] & CLEARMASK;
+         Int32 bbSize   = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart;
+         Int32 shifts   = 0;
+
+         while ((bbSize >> shifts) > 65534) shifts++;
+
+         for (j = bbSize-1; j >= 0; j--) {
+            Int32 a2update     = ptr[bbStart + j];
+            UInt16 qVal        = (UInt16)(j >> shifts);
+            quadrant[a2update] = qVal;
+            if (a2update < BZ_N_OVERSHOOT)
+               quadrant[a2update + nblock] = qVal;
+         }
+         AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 );
+      }
+
+   }
+
+   if (verb >= 4)
+      VPrintf3 ( "        %d pointers, %d sorted, %d scanned\n",
+                 nblock, numQSorted, nblock - numQSorted );
+}
+
+#undef BIGFREQ
+#undef SETMASK
+#undef CLEARMASK
+
+
+/*---------------------------------------------*/
+/* Pre:
+      nblock > 0
+      arr2 exists for [0 .. nblock-1 +N_OVERSHOOT]
+      ((UChar*)arr2)  [0 .. nblock-1] holds block
+      arr1 exists for [0 .. nblock-1]
+
+   Post:
+      ((UChar*)arr2) [0 .. nblock-1] holds block
+      All other areas of block destroyed
+      ftab [ 0 .. 65536 ] destroyed
+      arr1 [0 .. nblock-1] holds sorted order
+*/
+void BZ2_blockSort ( EState* s )
+{
+   UInt32* ptr    = s->ptr; 
+   UChar*  block  = s->block;
+   UInt32* ftab   = s->ftab;
+   Int32   nblock = s->nblock;
+   Int32   verb   = s->verbosity;
+   Int32   wfact  = s->workFactor;
+   UInt16* quadrant;
+   Int32   budget;
+   Int32   budgetInit;
+   Int32   i;
+
+   if (nblock < 10000) {
+      fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+   } else {
+      /* Calculate the location for quadrant, remembering to get
+         the alignment right.  Assumes that &(block[0]) is at least
+         2-byte aligned -- this should be ok since block is really
+         the first section of arr2.
+      */
+      i = nblock+BZ_N_OVERSHOOT;
+      if (i & 1) i++;
+      quadrant = (UInt16*)(&(block[i]));
+
+      /* (wfact-1) / 3 puts the default-factor-30
+         transition point at very roughly the same place as 
+         with v0.1 and v0.9.0.  
+         Not that it particularly matters any more, since the
+         resulting compressed stream is now the same regardless
+         of whether or not we use the main sort or fallback sort.
+      */
+      if (wfact < 1  ) wfact = 1;
+      if (wfact > 100) wfact = 100;
+      budgetInit = nblock * ((wfact-1) / 3);
+      budget = budgetInit;
+
+      mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget );
+      if (verb >= 3) 
+         VPrintf3 ( "      %d work, %d block, ratio %5.2f\n",
+                    budgetInit - budget,
+                    nblock, 
+                    (float)(budgetInit - budget) /
+                    (float)(nblock==0 ? 1 : nblock) ); 
+      if (budget < 0) {
+         if (verb >= 2) 
+            VPrintf0 ( "    too repetitive; using fallback"
+                       " sorting algorithm\n" );
+         fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb );
+      }
+   }
+
+   s->origPtr = -1;
+   for (i = 0; i < s->nblock; i++)
+      if (ptr[i] == 0)
+         { s->origPtr = i; break; };
+
+   AssertH( s->origPtr != -1, 1003 );
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                       blocksort.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/bz-common.xsl b/third_party/bzip2/bz-common.xsl
new file mode 100644
index 000000000..66fcd6fe0
--- /dev/null
+++ b/third_party/bzip2/bz-common.xsl
@@ -0,0 +1,39 @@
+ 
+
+
+
+ 
+
+
+
+ 
+ 
+   
+    
+      
+     
+  
+
+
+
+
+set       toc,title
+book      toc,title,figure,table,example,equation
+chapter   toc,title
+section   toc
+sect1     toc
+sect2     toc
+sect3     toc
+sect4     nop
+sect5     nop
+qandaset  toc
+qandadiv  nop
+appendix  toc,title
+article/appendix  nop
+article   toc,title
+preface   toc,title
+reference toc,title
+
+
+
diff --git a/third_party/bzip2/bz-fo.xsl b/third_party/bzip2/bz-fo.xsl
new file mode 100644
index 000000000..ba3e30123
--- /dev/null
+++ b/third_party/bzip2/bz-fo.xsl
@@ -0,0 +1,276 @@
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+      
+     
+   
+
+
+
+
+ 
+
+
+
+
+
+
+  
+
+
+
+
+  blue
+
+
+
+
+  
+    
+  
+
+
+
+  
+    
+  
+
+
+
+
+  
+  
+  
+    
+      
+    
+  
+  
+    
+      
+        
+          
+          
+          
+        
+      
+    
+    
+          
+    
+  
+  
+    
+      
+        
+      
+    
+    
+      
+        
+      
+    
+  
+
+
+
+
+  
+  
+  
+    
+      
+        
+      
+    
+    
+          
+    
+  
+  
+    
+      
+        
+      
+    
+    
+      
+        
+      
+    
+  
+
+
+
+
+
+  
+    
+  
+    
+  
+  
+    
+      
+    
+  
+
+
+
+
+
+  
+  
+  
+  
+    
+      0pt
+    
+  
+  
+    
+      
+      
+      
+        
+          
+            baseline
+             
+               
+            
+          
+          
+            baseline
+            
+              
+                
+                
+                
+                
+              
+            
+          
+        
+      
+    
+  
+  
+  
+    
+      
+    
+    
+      
+    
+    
+      
+    
+  
+
+
+
+
+
+  
+  
+  
+  
+    
+      0pt
+    
+  
+  
+    
+      
+        
+        
+        
+      
+      
+      
+      
+        
+          
+            baseline
+            
+               
+            
+          
+          
+            baseline
+            
+              
+                
+                
+                
+                
+              
+            
+          
+        
+      
+    
+  
+  
+  
+    
+      
+    
+    
+      
+    
+    
+      
+    
+  
+
+
+
+
+
+
+  always
+  
+    
+  
+  
+    
+    pt
+  
+  
+    
+    pt
+  
+  false
+
+
+
+
diff --git a/third_party/bzip2/bz-html.xsl b/third_party/bzip2/bz-html.xsl
new file mode 100644
index 000000000..b6000d586
--- /dev/null
+++ b/third_party/bzip2/bz-html.xsl
@@ -0,0 +1,23 @@
+ 
+ ]>
+
+
+
+
+
+
+
+
+
+
+
+  
+link rel="stylesheet" type="text/css" href="bzip.css" />
+  
+  
+
+
+
diff --git a/third_party/bzip2/bzdiff b/third_party/bzip2/bzdiff
new file mode 100755
index 000000000..bd96c27c3
--- /dev/null
+++ b/third_party/bzip2/bzdiff
@@ -0,0 +1,76 @@
+#!/bin/sh
+# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
+
+# Bzcmp/diff wrapped for bzip2, 
+# adapted from zdiff by Philippe Troin  for Debian GNU/Linux.
+
+# Bzcmp and bzdiff are used to invoke the cmp or the  diff  pro-
+# gram  on compressed files.  All options specified are passed
+# directly to cmp or diff.  If only 1 file is specified,  then
+# the  files  compared  are file1 and an uncompressed file1.gz.
+# If two files are specified, then they are  uncompressed  (if
+# necessary) and fed to cmp or diff.  The exit status from cmp
+# or diff is preserved.
+
+PATH="/usr/bin:/bin:$PATH"; export PATH
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+  *cmp) comp=${CMP-cmp}   ;;
+  *)    comp=${DIFF-diff} ;;
+esac
+
+OPTIONS=
+FILES=
+for ARG
+do
+    case "$ARG" in
+    -*)	OPTIONS="$OPTIONS $ARG";;
+     *)	if test -f "$ARG"; then
+            FILES="$FILES $ARG"
+        else
+            echo "${prog}: $ARG not found or not a regular file"
+	    exit 1
+        fi ;;
+    esac
+done
+if test -z "$FILES"; then
+	echo "Usage: $prog [${comp}_options] file [file]"
+	exit 1
+fi
+set $FILES
+if test $# -eq 1; then
+	FILE=`echo "$1" | sed 's/.bz2$//'`
+	bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
+	STAT="$?"
+
+elif test $# -eq 2; then
+	case "$1" in
+        *.bz2)
+                case "$2" in
+	        *.bz2)
+			F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
+			tmp=`mktemp "${TMPDIR:-/tmp}"/bzdiff.XXXXXXXXXX` || {
+			      echo 'cannot create a temporary file' >&2
+			      exit 1
+			}
+                        bzip2 -cdfq "$2" > "$tmp"
+                        bzip2 -cdfq "$1" | $comp $OPTIONS - "$tmp"
+                        STAT="$?"
+			/bin/rm -f "$tmp";;
+
+                *)      bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
+                        STAT="$?";;
+                esac;;
+        *)      case "$2" in
+	        *.bz2)
+                        bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
+                        STAT="$?";;
+                *)      $comp $OPTIONS "$1" "$2"
+                        STAT="$?";;
+                esac;;
+	esac
+else
+	echo "Usage: $prog [${comp}_options] file [file]"
+	exit 1
+fi
+exit "$STAT"
diff --git a/third_party/bzip2/bzdiff.1 b/third_party/bzip2/bzdiff.1
new file mode 100644
index 000000000..adb7a8e72
--- /dev/null
+++ b/third_party/bzip2/bzdiff.1
@@ -0,0 +1,47 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin 
+\"for Debian GNU/Linux
+.TH BZDIFF 1
+.SH NAME
+bzcmp, bzdiff \- compare bzip2 compressed files
+.SH SYNOPSIS
+.B bzcmp
+[ cmp_options ] file1
+[ file2 ]
+.br
+.B bzdiff
+[ diff_options ] file1
+[ file2 ]
+.SH DESCRIPTION
+.I  Bzcmp
+and 
+.I bzdiff
+are used to invoke the
+.I cmp
+or the
+.I diff
+program on bzip2 compressed files.  All options specified are passed
+directly to
+.I cmp
+or
+.IR diff "."
+If only 1 file is specified, then the files compared are
+.I file1
+and an uncompressed
+.IR file1 ".bz2."
+If two files are specified, then they are uncompressed if necessary and fed to
+.I cmp
+or
+.IR diff "."
+The exit status from 
+.I cmp
+or
+.I diff
+is preserved.
+.SH "SEE ALSO"
+cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
+.SH BUGS
+Messages from the
+.I cmp
+or
+.I diff
+programs refer to temporary filenames instead of those specified.
diff --git a/third_party/bzip2/bzgrep b/third_party/bzip2/bzgrep
new file mode 100755
index 000000000..0314ca603
--- /dev/null
+++ b/third_party/bzip2/bzgrep
@@ -0,0 +1,85 @@
+#!/bin/sh
+
+# Bzgrep wrapped for bzip2, 
+# adapted from zgrep by Philippe Troin  for Debian GNU/Linux.
+## zgrep notice:
+## zgrep -- a wrapper around a grep program that decompresses files as needed
+## Adapted from a version sent by Charles Levert 
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+	*egrep)	grep=${EGREP-egrep}	;;
+	*fgrep)	grep=${FGREP-fgrep}	;;
+	*)	grep=${GREP-grep}	;;
+esac
+pat=""
+while test $# -ne 0; do
+  case "$1" in
+  -e | -f) opt="$opt $1"; shift; pat="$1"
+           if test "$grep" = grep; then  # grep is buggy with -e on SVR4
+             grep=egrep
+           fi;;
+  -A | -B) opt="$opt $1 $2"; shift;;
+  -*)	   opt="$opt $1";;
+   *)      if test -z "$pat"; then
+	     pat="$1"
+	   else
+	     break;
+           fi;;
+  esac
+  shift
+done
+
+if test -z "$pat"; then
+  echo "grep through bzip2 files"
+  echo "usage: $prog [grep_options] pattern [files]"
+  exit 1
+fi
+
+list=0
+silent=0
+op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
+case "$op" in
+  *l*) list=1
+esac
+case "$op" in
+  *h*) silent=1
+esac
+
+if test $# -eq 0; then
+  bzip2 -cdfq | $grep $opt "$pat"
+  exit $?
+fi
+
+res=0
+for i do
+  if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
+  if test $list -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
+    r=$?
+  elif test $# -eq 1 -o $silent -eq 1; then
+    bzip2 -cdfq "$i" | $grep $opt "$pat"
+    r=$?
+  else
+    j=$(echo "$i" | sed 's/\\/&&/g;s/|/\\&/g;s/&/\\&/g')
+    j=`printf "%s" "$j" | tr '\n' ' '`
+    # A trick adapted from
+    # https://groups.google.com/forum/#!original/comp.unix.shell/x1345iu10eg/Nn1n-1r1uU0J
+    # that has the same effect as the following bash code:
+    # bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
+    # r=${PIPESTATUS[1]}
+    exec 3>&1
+    eval `
+      exec 4>&1 >&3 3>&-
+      {
+        bzip2 -cdfq "$i" 4>&-
+      } | {
+        $grep $opt "$pat" 4>&-; echo "r=$?;" >&4
+      } | sed "s|^|${j}:|"
+    `
+  fi
+  test "$r" -ne 0 && res="$r"
+done
+exit $res
diff --git a/third_party/bzip2/bzgrep.1 b/third_party/bzip2/bzgrep.1
new file mode 100644
index 000000000..930af8c7f
--- /dev/null
+++ b/third_party/bzip2/bzgrep.1
@@ -0,0 +1,56 @@
+\"Shamelessly copied from zmore.1 by Philippe Troin 
+\"for Debian GNU/Linux
+.TH BZGREP 1
+.SH NAME
+bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
+.SH SYNOPSIS
+.B bzgrep
+[ grep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzegrep
+[ egrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.br
+.B bzfgrep
+[ fgrep_options ]
+.BI  [\ -e\ ] " pattern"
+.IR filename ".\|.\|."
+.SH DESCRIPTION
+.IR  Bzgrep
+is used to invoke the
+.I grep
+on bzip2-compressed files. All options specified are passed directly to
+.I grep.
+If no file is specified, then the standard input is decompressed
+if necessary and fed to grep.
+Otherwise the given files are uncompressed if necessary and fed to
+.I grep.
+.PP
+If
+.I bzgrep
+is invoked as
+.I bzegrep
+or
+.I bzfgrep
+then
+.I egrep
+or
+.I fgrep
+is used instead of
+.I grep.
+If the GREP environment variable is set,
+.I bzgrep
+uses it as the
+.I grep
+program to be invoked. For example:
+
+    for sh:  GREP=fgrep  bzgrep string files
+    for csh: (setenv GREP fgrep; bzgrep string files)
+.SH AUTHOR
+Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
+Troin  for Debian GNU/Linux.
+.SH "SEE ALSO"
+grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
diff --git a/third_party/bzip2/bzip.css b/third_party/bzip2/bzip.css
new file mode 100644
index 000000000..211311838
--- /dev/null
+++ b/third_party/bzip2/bzip.css
@@ -0,0 +1,74 @@
+/* Colours:
+#74240f  dark brown      h1, h2, h3, h4
+#336699  medium blue     links
+#339999  turquoise       link hover colour
+#202020  almost black    general text
+#761596  purple          md5sum text
+#626262  dark gray       pre border
+#eeeeee  very light gray pre background
+#f2f2f9  very light blue nav table background
+#3366cc  medium blue     nav table border
+*/
+
+a, a:link, a:visited, a:active { color: #336699; }
+a:hover { color: #339999; }
+
+body { font: 80%/126% sans-serif; }
+h1, h2, h3, h4 { color: #74240f; }
+
+dt { color: #336699; font-weight: bold }
+dd { 
+ margin-left: 1.5em; 
+ padding-bottom: 0.8em;
+}
+
+/* -- ruler -- */
+div.hr_blue { 
+  height:  3px; 
+  background:#ffffff url("../images/hr_blue.png") repeat-x; }
+div.hr_blue hr { display:none; }
+
+/* release styles */
+#release p { margin-top: 0.4em; }
+#release .md5sum { color: #761596; }
+
+
+/* ------ styles for docs|manuals|howto ------ */
+/* -- lists -- */
+ul  { 
+ margin:     0px 4px 16px 16px;
+ padding:    0px;
+ list-style: url("../images/li-blue.png"); 
+}
+ul li { 
+ margin-bottom: 10px;
+}
+ul ul	{ 
+ list-style-type:  none; 
+ list-style-image: none; 
+ margin-left:      0px; 
+}
+
+/* header / footer nav tables */
+table.nav {
+ border:     solid 1px #3366cc;
+ background: #f2f2f9;
+ background-color: #f2f2f9;
+ margin-bottom: 0.5em;
+}
+/* don't have underlined links in chunked nav menus */
+table.nav a { text-decoration: none; }
+table.nav a:hover { text-decoration: underline; }
+table.nav td { font-size: 85%; }
+
+code, tt, pre { font-size: 120%; }
+code, tt { color: #761596; }
+
+div.literallayout, pre.programlisting, pre.screen {
+ color:      #000000;
+ padding:    0.5em;
+ background: #eeeeee;
+ border:     1px solid #626262;
+ background-color: #eeeeee;
+ margin: 4px 0px 4px 0px; 
+}
diff --git a/third_party/bzip2/bzip2.1 b/third_party/bzip2/bzip2.1
new file mode 100644
index 000000000..0cbcdab00
--- /dev/null
+++ b/third_party/bzip2/bzip2.1
@@ -0,0 +1,454 @@
+.PU
+.TH bzip2 1
+.SH NAME
+bzip2, bunzip2 \- a block-sorting file compressor, v1.0.8
+.br
+bzcat \- decompresses files to stdout
+.br
+bzip2recover \- recovers data from damaged bzip2 files
+
+.SH SYNOPSIS
+.ll +8
+.B bzip2
+.RB [ " \-cdfkqstvzVL123456789 " ]
+[
+.I "filenames \&..."
+]
+.ll -8
+.br
+.B bunzip2
+.RB [ " \-fkvsVL " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzcat
+.RB [ " \-s " ]
+[ 
+.I "filenames \&..."
+]
+.br
+.B bzip2recover
+.I "filename"
+
+.SH DESCRIPTION
+.I bzip2
+compresses files using the Burrows-Wheeler block sorting
+text compression algorithm, and Huffman coding.  Compression is
+generally considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of the PPM
+family of statistical compressors.
+
+The command-line options are deliberately very similar to 
+those of 
+.I GNU gzip, 
+but they are not identical.
+
+.I bzip2
+expects a list of file names to accompany the
+command-line flags.  Each file is replaced by a compressed version of
+itself, with the name "original_name.bz2".  
+Each compressed file
+has the same modification date, permissions, and, when possible,
+ownership as the corresponding original, so that these properties can
+be correctly restored at decompression time.  File name handling is
+naive in the sense that there is no mechanism for preserving original
+file names, permissions, ownerships or dates in filesystems which lack
+these concepts, or have serious file name length restrictions, such as
+MS-DOS.
+
+.I bzip2
+and
+.I bunzip2
+will by default not overwrite existing
+files.  If you want this to happen, specify the \-f flag.
+
+If no file names are specified,
+.I bzip2
+compresses from standard
+input to standard output.  In this case,
+.I bzip2
+will decline to
+write compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+.I bunzip2
+(or
+.I bzip2 \-d) 
+decompresses all
+specified files.  Files which were not created by 
+.I bzip2
+will be detected and ignored, and a warning issued.  
+.I bzip2
+attempts to guess the filename for the decompressed file 
+from that of the compressed file as follows:
+
+       filename.bz2    becomes   filename
+       filename.bz     becomes   filename
+       filename.tbz2   becomes   filename.tar
+       filename.tbz    becomes   filename.tar
+       anyothername    becomes   anyothername.out
+
+If the file does not end in one of the recognised endings, 
+.I .bz2, 
+.I .bz, 
+.I .tbz2
+or
+.I .tbz, 
+.I bzip2 
+complains that it cannot
+guess the name of the original file, and uses the original name
+with
+.I .out
+appended.
+
+As with compression, supplying no
+filenames causes decompression from 
+standard input to standard output.
+
+.I bunzip2 
+will correctly decompress a file which is the
+concatenation of two or more compressed files.  The result is the
+concatenation of the corresponding uncompressed files.  Integrity
+testing (\-t) 
+of concatenated 
+compressed files is also supported.
+
+You can also compress or decompress files to the standard output by
+giving the \-c flag.  Multiple files may be compressed and
+decompressed like this.  The resulting outputs are fed sequentially to
+stdout.  Compression of multiple files 
+in this manner generates a stream
+containing multiple compressed file representations.  Such a stream
+can be decompressed correctly only by
+.I bzip2 
+version 0.9.0 or
+later.  Earlier versions of
+.I bzip2
+will stop after decompressing
+the first file in the stream.
+
+.I bzcat
+(or
+.I bzip2 -dc) 
+decompresses all specified files to
+the standard output.
+
+.I bzip2
+will read arguments from the environment variables
+.I BZIP2
+and
+.I BZIP,
+in that order, and will process them
+before any arguments read from the command line.  This gives a 
+convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed 
+file is slightly
+larger than the original.  Files of less than about one hundred bytes
+tend to get larger, since the compression mechanism has a constant
+overhead in the region of 50 bytes.  Random data (including the output
+of most file compressors) is coded at about 8.05 bits per byte, giving
+an expansion of around 0.5%.
+
+As a self-check for your protection, 
+.I 
+bzip2
+uses 32-bit CRCs to
+make sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data, and
+against undetected bugs in
+.I bzip2
+(hopefully very unlikely).  The
+chances of data corruption going undetected is microscopic, about one
+chance in four billion for each file processed.  Be aware, though, that
+the check occurs upon decompression, so it can only tell you that
+something is wrong.  It can't help you 
+recover the original uncompressed
+data.  You can use 
+.I bzip2recover
+to try to recover data from
+damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental problems (file
+not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
+compressed file, 3 for an internal consistency error (eg, bug) which
+caused
+.I bzip2
+to panic.
+
+.SH OPTIONS
+.TP
+.B \-c --stdout
+Compress or decompress to standard output.
+.TP
+.B \-d --decompress
+Force decompression.  
+.I bzip2, 
+.I bunzip2 
+and
+.I bzcat 
+are
+really the same program, and the decision about what actions to take is
+done on the basis of which name is used.  This flag overrides that
+mechanism, and forces 
+.I bzip2
+to decompress.
+.TP
+.B \-z --compress
+The complement to \-d: forces compression, regardless of the
+invocation name.
+.TP
+.B \-t --test
+Check integrity of the specified file(s), but don't decompress them.
+This really performs a trial decompression and throws away the result.
+.TP
+.B \-f --force
+Force overwrite of output files.  Normally,
+.I bzip2 
+will not overwrite
+existing output files.  Also forces 
+.I bzip2 
+to break hard links
+to files, which it otherwise wouldn't do.
+
+bzip2 normally declines to decompress files which don't have the
+correct magic header bytes.  If forced (-f), however, it will pass
+such files through unmodified.  This is how GNU gzip behaves.
+.TP
+.B \-k --keep
+Keep (don't delete) input files during compression
+or decompression.
+.TP
+.B \-s --small
+Reduce memory usage, for compression, decompression and testing.  Files
+are decompressed and tested using a modified algorithm which only
+requires 2.5 bytes per block byte.  This means any file can be
+decompressed in 2300k of memory, albeit at about half the normal speed.
+
+During compression, \-s selects a block size of 200k, which limits
+memory use to around the same figure, at the expense of your compression
+ratio.  In short, if your machine is low on memory (8 megabytes or
+less), use \-s for everything.  See MEMORY MANAGEMENT below.
+.TP
+.B \-q --quiet
+Suppress non-essential warning messages.  Messages pertaining to
+I/O errors and other critical events will not be suppressed.
+.TP
+.B \-v --verbose
+Verbose mode -- show the compression ratio for each file processed.
+Further \-v's increase the verbosity level, spewing out lots of
+information which is primarily of interest for diagnostic purposes.
+.TP
+.B \-L --license -V --version
+Display the software version, license terms and conditions.
+.TP
+.B \-1 (or \-\-fast) to \-9 (or \-\-best)
+Set the block size to 100 k, 200 k ..  900 k when compressing.  Has no
+effect when decompressing.  See MEMORY MANAGEMENT below.
+The \-\-fast and \-\-best aliases are primarily for GNU gzip 
+compatibility.  In particular, \-\-fast doesn't make things
+significantly faster.  
+And \-\-best merely selects the default behaviour.
+.TP
+.B \--
+Treats all subsequent arguments as file names, even if they start
+with a dash.  This is so you can handle files with names beginning
+with a dash, for example: bzip2 \-- \-myfilename.
+.TP
+.B \--repetitive-fast --repetitive-best
+These flags are redundant in versions 0.9.5 and above.  They provided
+some coarse control over the behaviour of the sorting algorithm in
+earlier versions, which was sometimes useful.  0.9.5 and above have an
+improved algorithm which renders these flags irrelevant.
+
+.SH MEMORY MANAGEMENT
+.I bzip2 
+compresses large files in blocks.  The block size affects
+both the compression ratio achieved, and the amount of memory needed for
+compression and decompression.  The flags \-1 through \-9
+specify the block size to be 100,000 bytes through 900,000 bytes (the
+default) respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+.I bunzip2
+then allocates itself just enough memory to decompress
+the file.  Since block sizes are stored in compressed files, it follows
+that the flags \-1 to \-9 are irrelevant to and so ignored
+during decompression.
+
+Compression and decompression requirements, 
+in bytes, can be estimated as:
+
+       Compression:   400k + ( 8 x block size )
+
+       Decompression: 100k + ( 4 x block size ), or
+                      100k + ( 2.5 x block size )
+
+Larger block sizes give rapidly diminishing marginal returns.  Most of
+the compression comes from the first two or three hundred k of block
+size, a fact worth bearing in mind when using
+.I bzip2
+on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block size.
+
+For files compressed with the default 900k block size,
+.I bunzip2
+will require about 3700 kbytes to decompress.  To support decompression
+of any file on a 4 megabyte machine, 
+.I bunzip2
+has an option to
+decompress using approximately half this amount of memory, about 2300
+kbytes.  Decompression speed is also halved, so you should use this
+option only where necessary.  The relevant flag is -s.
+
+In general, try and use the largest block size memory constraints allow,
+since that maximises the compression achieved.  Compression and
+decompression speed are virtually unaffected by block size.
+
+Another significant point applies to files which fit in a single block
+-- that means most files you'd encounter using a large block size.  The
+amount of real memory touched is proportional to the size of the file,
+since the file is smaller than a block.  For example, compressing a file
+20,000 bytes long with the flag -9 will cause the compressor to
+allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
+kbytes of it.  Similarly, the decompressor will allocate 3700k but only
+touch 100k + 20000 * 4 = 180 kbytes.
+
+Here is a table which summarises the maximum memory usage for different
+block sizes.  Also recorded is the total compressed size for 14 files of
+the Calgary Text Compression Corpus totalling 3,141,622 bytes.  This
+column gives some feel for how compression varies with block size.
+These figures tend to understate the advantage of larger block sizes for
+larger files, since the Corpus is dominated by smaller files.
+
+           Compress   Decompress   Decompress   Corpus
+    Flag     usage      usage       -s usage     Size
+
+     -1      1200k       500k         350k      914704
+     -2      2000k       900k         600k      877703
+     -3      2800k      1300k         850k      860338
+     -4      3600k      1700k        1100k      846899
+     -5      4400k      2100k        1350k      845160
+     -6      5200k      2500k        1600k      838626
+     -7      6100k      2900k        1850k      834096
+     -8      6800k      3300k        2100k      828642
+     -9      7600k      3700k        2350k      828642
+
+.SH RECOVERING DATA FROM DAMAGED FILES
+.I bzip2
+compresses files in blocks, usually 900kbytes long.  Each
+block is handled independently.  If a media or transmission error causes
+a multi-block .bz2
+file to become damaged, it may be possible to
+recover data from the undamaged blocks in the file.
+
+The compressed representation of each block is delimited by a 48-bit
+pattern, which makes it possible to find the block boundaries with
+reasonable certainty.  Each block also carries its own 32-bit CRC, so
+damaged blocks can be distinguished from undamaged ones.
+
+.I bzip2recover
+is a simple program whose purpose is to search for
+blocks in .bz2 files, and write each block out into its own .bz2 
+file.  You can then use
+.I bzip2 
+\-t
+to test the
+integrity of the resulting files, and decompress those which are
+undamaged.
+
+.I bzip2recover
+takes a single argument, the name of the damaged file, 
+and writes a number of files "rec00001file.bz2",
+"rec00002file.bz2", etc, containing the  extracted  blocks.
+The  output  filenames  are  designed  so  that the use of
+wildcards in subsequent processing -- for example,  
+"bzip2 -dc  rec*file.bz2 > recovered_data" -- processes the files in
+the correct order.
+
+.I bzip2recover
+should be of most use dealing with large .bz2
+files,  as  these will contain many blocks.  It is clearly
+futile to use it on damaged single-block  files,  since  a
+damaged  block  cannot  be recovered.  If you wish to minimise 
+any potential data loss through media  or  transmission errors, 
+you might consider compressing with a smaller
+block size.
+
+.SH PERFORMANCE NOTES
+The sorting phase of compression gathers together similar strings in the
+file.  Because of this, files containing very long runs of repeated
+symbols, like "aabaabaabaab ..."  (repeated several hundred times) may
+compress more slowly than normal.  Versions 0.9.5 and above fare much
+better than previous versions in this respect.  The ratio between
+worst-case and average-case compression time is in the region of 10:1.
+For previous versions, this figure was more like 100:1.  You can use the
+\-vvvv option to monitor progress in great detail, if you want.
+
+Decompression speed is unaffected by these phenomena.
+
+.I bzip2
+usually allocates several megabytes of memory to operate
+in, and then charges all over it in a fairly random fashion.  This means
+that performance, both for compressing and decompressing, is largely
+determined by the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss rate have
+been observed to give disproportionately large performance improvements.
+I imagine 
+.I bzip2
+will perform best on machines with very large caches.
+
+.SH CAVEATS
+I/O error messages are not as helpful as they could be.
+.I bzip2
+tries hard to detect I/O errors and exit cleanly, but the details of
+what the problem is sometimes seem rather misleading.
+
+This manual page pertains to version 1.0.8 of
+.I bzip2.  
+Compressed data created by this version is entirely forwards and
+backwards compatible with the previous public releases, versions
+0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and above, but with the following
+exception: 0.9.0 and above can correctly decompress multiple
+concatenated compressed files.  0.1pl2 cannot do this; it will stop
+after decompressing just the first file in the stream.
+
+.I bzip2recover
+versions prior to 1.0.2 used 32-bit integers to represent
+bit positions in compressed files, so they could not handle compressed
+files more than 512 megabytes long.  Versions 1.0.2 and above use
+64-bit ints on some platforms which support them (GNU supported
+targets, and Windows).  To establish whether or not bzip2recover was
+built with such a limitation, run it without arguments.  In any event
+you can build yourself an unlimited version if you can recompile it
+with MaybeUInt64 set to be an unsigned 64-bit integer.
+
+
+
+.SH AUTHOR
+Julian Seward, jseward@acm.org.
+
+https://sourceware.org/bzip2/
+
+The ideas embodied in
+.I bzip2
+are due to (at least) the following
+people: Michael Burrows and David Wheeler (for the block sorting
+transformation), David Wheeler (again, for the Huffman coder), Peter
+Fenwick (for the structured coding model in the original
+.I bzip,
+and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+.I bzip).  
+I am much
+indebted for their help, support and advice.  See the manual in the
+source distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms, so as to
+speed up compression.  Bela Lubkin encouraged me to improve the
+worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+The bz* scripts are derived from those of GNU gzip.
+Many people sent patches, helped
+with portability problems, lent machines, gave advice and were generally
+helpful.
diff --git a/third_party/bzip2/bzip2.1.preformatted b/third_party/bzip2/bzip2.1.preformatted
new file mode 100644
index 000000000..787f1c614
--- /dev/null
+++ b/third_party/bzip2/bzip2.1.preformatted
@@ -0,0 +1,399 @@
+bzip2(1)                                                 bzip2(1)
+
+
+
+NNAAMMEE
+       bzip2, bunzip2 â’ a blockâ€sorting file compressor, v1.0.8
+       bzcat â’ decompresses files to stdout
+       bzip2recover â’ recovers data from damaged bzip2 files
+
+
+SSYYNNOOPPSSIISS
+       bbzziipp22 [ â’â’ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbuunnzziipp22 [ â’â’ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzzccaatt [ â’â’ss ] [ _f_i_l_e_n_a_m_e_s _._._.  ]
+       bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
+
+
+DDEESSCCRRIIPPTTIIOONN
+       _b_z_i_p_2  compresses  files  using  the Burrowsâ€Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78â€based compressors,
+       and  approaches  the performance of the PPM family of sta­
+       tistical compressors.
+
+       The commandâ€line options are deliberately very similar  to
+       those of _G_N_U _g_z_i_p_, but they are not identical.
+
+       _b_z_i_p_2  expects  a list of file names to accompany the com­
+       mandâ€line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per­
+       missions, and, when possible, ownership as the correspond­
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv­
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MSâ€DOS.
+
+       _b_z_i_p_2  and  _b_u_n_z_i_p_2 will by default not overwrite existing
+       files.  If you want this to happen, specify the â’f flag.
+
+       If no file names  are  specified,  _b_z_i_p_2  compresses  from
+       standard  input  to  standard output.  In this case, _b_z_i_p_2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       _b_u_n_z_i_p_2 (or _b_z_i_p_2 _â’_d_) decompresses  all  specified  files.
+       Files which were not created by _b_z_i_p_2 will be detected and
+       ignored, and a warning issued.  _b_z_i_p_2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       _._b_z_2_,  _._b_z_,  _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with _._o_u_t appended.
+
+       As  with compression, supplying no filenames causes decom­
+       pression from standard input to standard output.
+
+       _b_u_n_z_i_p_2 will correctly decompress a file which is the con­
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (â’t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the â’c flag.  Multiple files may be com­
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi­
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  _b_z_i_p_2  version  0.9.0  or
+       later.   Earlier  versions of _b_z_i_p_2 will stop after decom­
+       pressing the first file in the stream.
+
+       _b_z_c_a_t (or _b_z_i_p_2 _â€_d_c_) decompresses all specified  files  to
+       the standard output.
+
+       _b_z_i_p_2  will  read arguments from the environment variables
+       _B_Z_I_P_2 and _B_Z_I_P_, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a selfâ€check for your  protection,  _b_z_i_p_2  uses  32â€bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup­
+       tion  of  the compressed data, and against undetected bugs
+       in _b_z_i_p_2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can’t  help
+       you  recover  the original uncompressed data.  You can use
+       _b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
+
+
+OOPPTTIIOONNSS
+       â’â’cc â€â€â€â€ssttddoouutt
+              Compress or decompress to standard output.
+
+       â’â’dd â€â€â€â€ddeeccoommpprreessss
+              Force  decompression.  _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces _b_z_i_p_2 to decompress.
+
+       â’â’zz â€â€â€â€ccoommpprreessss
+              The   complement   to   â’d:   forces   compression,
+              regardless of the invocation name.
+
+       â’â’tt â€â€â€â€tteesstt
+              Check integrity of the specified file(s), but don’t
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       â’â’ff â€â€â€â€ffoorrccee
+              Force overwrite of output files.   Normally,  _b_z_i_p_2
+              will  not  overwrite  existing  output files.  Also
+              forces _b_z_i_p_2 to break hard links to files, which it
+              otherwise wouldn’t do.
+
+              bzip2  normally  declines to decompress files which
+              don’t have the  correct  magic  header  bytes.   If
+              forced  (â€f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       â’â’kk â€â€â€â€kkeeeepp
+              Keep  (don’t delete) input files during compression
+              or decompression.
+
+       â’â’ss â€â€â€â€ssmmaallll
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  â’s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  â’s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       â’â’qq â€â€â€â€qquuiieett
+              Suppress nonâ€essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       â’â’vv â€â€â€â€vveerrbboossee
+              Verbose mode â€â€ show the compression ratio for each
+              file  processed.   Further  â’v’s  increase the ver­
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       â’â’LL â€â€â€â€lliicceennssee â€â€VV â€â€â€â€vveerrssiioonn
+              Display  the  software  version,  license terms and
+              conditions.
+
+       â’â’11 ((oorr â’â’â’â’ffaasstt)) ttoo â’â’99 ((oorr â’â’â’â’bbeesstt))
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The â’â’fast and â’â’best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, â’â’fast doesn’t make things  signifi­
+              cantly  faster.   And  â’â’best  merely  selects  the
+              default behaviour.
+
+       â’â’     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han­
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 â’†â’myfilename.
+
+       â’â’â€â€rreeppeettiittiivveeâ€â€ffaasstt â€â€â€â€rreeppeettiittiivveeâ€â€bbeesstt
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver­
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
+       _b_z_i_p_2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  â’1  through  â’9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec­
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags â’1 to â’9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using _b_z_i_p_2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       _b_u_n_z_i_p_2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       _b_u_n_z_i_p_2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres­
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is â€s.
+
+       In general, try and use the largest block size memory con­
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu­
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  â€â€  that  means  most files you’d encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag â€9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres­
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi­
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       â€s usage     Size
+
+            â€1      1200k       500k         350k      914704
+            â€2      2000k       900k         600k      877703
+            â€3      2800k      1300k         850k      860338
+            â€4      3600k      1700k        1100k      846899
+            â€5      4400k      2100k        1350k      845160
+            â€6      5200k      2500k        1600k      838626
+            â€7      6100k      2900k        1850k      834096
+            â€8      6800k      3300k        2100k      828642
+            â€9      7600k      3700k        2350k      828642
+
+
+RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
+       _b_z_i_p_2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans­
+       mission error causes a multiâ€block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48â€bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32â€bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use _b_z_i_p_2 â’t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam­
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro­
+       cessing  â€â€ for example, "bzip2 â€dc  rec*file.bz2 > recov­
+       ered_data" â€â€ processes the files in the correct order.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged singleâ€block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min­
+       imise any potential data loss through media  or  transmis­
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PPEERRFFOORRMMAANNCCEE NNOOTTEESS
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worstâ€case and averageâ€case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the â’vvvv option to mon­
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       _b_z_i_p_2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran­
+       dom  fashion.   This means that performance, both for com­
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine _b_z_i_p_2 will per­
+       form best on machines with very large caches.
+
+
+CCAAVVEEAATTSS
+       I/O  error  messages  are not as helpful as they could be.
+       _b_z_i_p_2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.8 of _b_z_i_p_2_.  Com­
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1, 
+       1.0.2 and above, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop 
+       after  decompressing just the first file in the stream.
+
+       _b_z_i_p_2_r_e_c_o_v_e_r  versions prior to 1.0.2 used 32â€bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64â€bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64â€bit integer.
+
+
+
+
+AAUUTTHHOORR
+       Julian Seward, jseward@acm.org.
+
+       https://sourceware.org/bzip2/
+
+       The ideas embodied in _b_z_i_p_2 are due to (at least) the fol­
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod­
+       ing model in the original _b_z_i_p_, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  _b_z_i_p_)_.   I  am  much
+       indebted for their help, support and advice.  See the man­
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres­
+       sion.  Bela Lubkin encouraged me to improve the worstâ€case
+       compression performance.  Donna Robinson XMLised the docu­
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
+
+
+                                                         bzip2(1)
diff --git a/third_party/bzip2/bzip2.c b/third_party/bzip2/bzip2.c
new file mode 100644
index 000000000..d95d28061
--- /dev/null
+++ b/third_party/bzip2/bzip2.c
@@ -0,0 +1,2036 @@
+
+/*-----------------------------------------------------------*/
+/*--- A block-sorting, lossless compressor        bzip2.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* Place a 1 beside your platform, and 0 elsewhere.
+   Generic 32-bit Unix.
+   Also works on 64-bit Unix boxes.
+   This is the default.
+*/
+#define BZ_UNIX      1
+
+/*--
+  Win32, as seen by Jacob Navia's excellent
+  port of (Chris Fraser & David Hanson)'s excellent
+  lcc compiler.  Or with MS Visual C.
+  This is selected automatically if compiled by a compiler which
+  defines _WIN32, not including the Cygwin GCC.
+--*/
+#define BZ_LCCWIN32  0
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#undef  BZ_LCCWIN32
+#define BZ_LCCWIN32 1
+#undef  BZ_UNIX
+#define BZ_UNIX 0
+#endif
+
+
+/*---------------------------------------------*/
+/*--
+  Some stuff for all platforms.
+--*/
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "bzlib.h"
+
+#define ERROR_IF_EOF(i)       { if ((i) == EOF)  ioError(); }
+#define ERROR_IF_NOT_ZERO(i)  { if ((i) != 0)    ioError(); }
+#define ERROR_IF_MINUS_ONE(i) { if ((i) == (-1)) ioError(); }
+
+
+/*---------------------------------------------*/
+/*--
+   Platform-specific stuff.
+--*/
+
+#if BZ_UNIX
+#   include 
+#   include 
+#   include 
+#   include 
+#   include 
+#   include 
+
+#   define PATH_SEP    '/'
+#   define MY_LSTAT    lstat
+#   define MY_STAT     stat
+#   define MY_S_ISREG  S_ISREG
+#   define MY_S_ISDIR  S_ISDIR
+
+#   define APPEND_FILESPEC(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define SET_BINARY_MODE(fd) /**/
+
+#   ifdef __GNUC__
+#      define NORETURN __attribute__ ((noreturn))
+#   else
+#      define NORETURN /**/
+#   endif
+
+#   ifdef __DJGPP__
+#     include 
+#     include 
+#     undef MY_LSTAT
+#     undef MY_STAT
+#     define MY_LSTAT stat
+#     define MY_STAT stat
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+
+#   ifdef __CYGWIN__
+#     include 
+#     include 
+#     undef SET_BINARY_MODE
+#     define SET_BINARY_MODE(fd)                        \
+        do {                                            \
+           int retVal = setmode ( fileno ( fd ),        \
+                                  O_BINARY );           \
+           ERROR_IF_MINUS_ONE ( retVal );               \
+        } while ( 0 )
+#   endif
+#endif /* BZ_UNIX */
+
+
+
+#if BZ_LCCWIN32
+#   include 
+#   include 
+#   include 
+
+#   define NORETURN       /**/
+#   define PATH_SEP       '\\'
+#   define MY_LSTAT       _stati64
+#   define MY_STAT        _stati64
+#   define MY_S_ISREG(x)  ((x) & _S_IFREG)
+#   define MY_S_ISDIR(x)  ((x) & _S_IFDIR)
+
+#   define APPEND_FLAG(root, name) \
+      root=snocString((root), (name))
+
+#   define APPEND_FILESPEC(root, name)                \
+      root = snocString ((root), (name))
+
+#   define SET_BINARY_MODE(fd)                        \
+      do {                                            \
+         int retVal = setmode ( fileno ( fd ),        \
+                                O_BINARY );           \
+         ERROR_IF_MINUS_ONE ( retVal );               \
+      } while ( 0 )
+
+#endif /* BZ_LCCWIN32 */
+
+
+/*---------------------------------------------*/
+/*--
+  Some more stuff for all platforms :-)
+--*/
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+                                       
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+/*--
+  IntNative is your platform's `native' int size.
+  Only here to avoid probs with 64-bit platforms.
+--*/
+typedef int IntNative;
+
+
+/*---------------------------------------------------*/
+/*--- Misc (file handling) data decls             ---*/
+/*---------------------------------------------------*/
+
+Int32   verbosity;
+Bool    keepInputFiles, smallMode, deleteOutputOnInterrupt;
+Bool    forceOverwrite, testFailsExist, unzFailsExist, noisy;
+Int32   numFileNames, numFilesProcessed, blockSize100k;
+Int32   exitValue;
+
+/*-- source modes; F==file, I==stdin, O==stdout --*/
+#define SM_I2O           1
+#define SM_F2O           2
+#define SM_F2F           3
+
+/*-- operation modes --*/
+#define OM_Z             1
+#define OM_UNZ           2
+#define OM_TEST          3
+
+Int32   opMode;
+Int32   srcMode;
+
+#define FILE_NAME_LEN 1034
+
+Int32   longestFileName;
+Char    inName [FILE_NAME_LEN];
+Char    outName[FILE_NAME_LEN];
+Char    tmpName[FILE_NAME_LEN];
+Char    *progName;
+Char    progNameReally[FILE_NAME_LEN];
+FILE    *outputHandleJustInCase;
+Int32   workFactor;
+
+static void    panic                 ( const Char* ) NORETURN;
+static void    ioError               ( void )        NORETURN;
+static void    outOfMemory           ( void )        NORETURN;
+static void    configError           ( void )        NORETURN;
+static void    crcError              ( void )        NORETURN;
+static void    cleanUpAndFail        ( Int32 )       NORETURN;
+static void    compressedStreamEOF   ( void )        NORETURN;
+
+static void    copyFileName ( Char*, Char* );
+static void*   myMalloc     ( Int32 );
+static void    applySavedFileAttrToOutputFile ( IntNative fd );
+
+
+
+/*---------------------------------------------------*/
+/*--- An implementation of 64-bit ints.  Sigh.    ---*/
+/*--- Roll on widespread deployment of ANSI C9X ! ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct { UChar b[8]; } 
+   UInt64;
+
+
+static
+void uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
+{
+   n->b[7] = (UChar)((hi32 >> 24) & 0xFF);
+   n->b[6] = (UChar)((hi32 >> 16) & 0xFF);
+   n->b[5] = (UChar)((hi32 >> 8)  & 0xFF);
+   n->b[4] = (UChar) (hi32        & 0xFF);
+   n->b[3] = (UChar)((lo32 >> 24) & 0xFF);
+   n->b[2] = (UChar)((lo32 >> 16) & 0xFF);
+   n->b[1] = (UChar)((lo32 >> 8)  & 0xFF);
+   n->b[0] = (UChar) (lo32        & 0xFF);
+}
+
+
+static
+double uInt64_to_double ( UInt64* n )
+{
+   Int32  i;
+   double base = 1.0;
+   double sum  = 0.0;
+   for (i = 0; i < 8; i++) {
+      sum  += base * (double)(n->b[i]);
+      base *= 256.0;
+   }
+   return sum;
+}
+
+
+static
+Bool uInt64_isZero ( UInt64* n )
+{
+   Int32 i;
+   for (i = 0; i < 8; i++)
+      if (n->b[i] != 0) return 0;
+   return 1;
+}
+
+
+/* Divide *n by 10, and return the remainder.  */
+static 
+Int32 uInt64_qrm10 ( UInt64* n )
+{
+   UInt32 rem, tmp;
+   Int32  i;
+   rem = 0;
+   for (i = 7; i >= 0; i--) {
+      tmp = rem * 256 + n->b[i];
+      n->b[i] = tmp / 10;
+      rem = tmp % 10;
+   }
+   return rem;
+}
+
+
+/* ... and the Whole Entire Point of all this UInt64 stuff is
+   so that we can supply the following function.
+*/
+static
+void uInt64_toAscii ( char* outbuf, UInt64* n )
+{
+   Int32  i, q;
+   UChar  buf[32];
+   Int32  nBuf   = 0;
+   UInt64 n_copy = *n;
+   do {
+      q = uInt64_qrm10 ( &n_copy );
+      buf[nBuf] = q + '0';
+      nBuf++;
+   } while (!uInt64_isZero(&n_copy));
+   outbuf[nBuf] = 0;
+   for (i = 0; i < nBuf; i++) 
+      outbuf[i] = buf[nBuf-i-1];
+}
+
+
+/*---------------------------------------------------*/
+/*--- Processing of complete files and streams    ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static 
+Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressStream ( FILE *stream, FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   UChar   ibuf[5000];
+   Int32   nIbuf;
+   UInt32  nbytes_in_lo32, nbytes_in_hi32;
+   UInt32  nbytes_out_lo32, nbytes_out_hi32;
+   Int32   bzerr, bzerr_dummy, ret;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   bzf = BZ2_bzWriteOpen ( &bzerr, zStream, 
+                           blockSize100k, verbosity, workFactor );   
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n" );
+
+   while (True) {
+
+      if (myfeof(stream)) break;
+      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
+      if (ferror(stream)) goto errhandler_io;
+      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
+      if (bzerr != BZ_OK) goto errhandler;
+
+   }
+
+   BZ2_bzWriteClose64 ( &bzerr, bzf, 0, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   if (bzerr != BZ_OK) goto errhandler;
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fflush ( zStream );
+   if (ret == EOF) goto errhandler_io;
+   if (zStream != stdout) {
+      Int32 fd = fileno ( zStream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+      ret = fclose ( zStream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (ferror(stream)) goto errhandler_io;
+   ret = fclose ( stream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 1) {
+      if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
+	 fprintf ( stderr, " no data compressed.\n");
+      } else {
+	 Char   buf_nin[32], buf_nout[32];
+	 UInt64 nbytes_in,   nbytes_out;
+	 double nbytes_in_d, nbytes_out_d;
+	 uInt64_from_UInt32s ( &nbytes_in, 
+			       nbytes_in_lo32, nbytes_in_hi32 );
+	 uInt64_from_UInt32s ( &nbytes_out, 
+			       nbytes_out_lo32, nbytes_out_hi32 );
+	 nbytes_in_d  = uInt64_to_double ( &nbytes_in );
+	 nbytes_out_d = uInt64_to_double ( &nbytes_out );
+	 uInt64_toAscii ( buf_nin, &nbytes_in );
+	 uInt64_toAscii ( buf_nout, &nbytes_out );
+	 fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
+		   "%5.2f%% saved, %s in, %s out.\n",
+		   nbytes_in_d / nbytes_out_d,
+		   (8.0 * nbytes_out_d) / nbytes_in_d,
+		   100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
+		   buf_nin,
+		   buf_nout
+		 );
+      }
+   }
+
+   return;
+
+   errhandler:
+   BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1, 
+                        &nbytes_in_lo32, &nbytes_in_hi32,
+                        &nbytes_out_lo32, &nbytes_out_hi32 );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_MEM_ERROR:
+         outOfMemory (); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      default:
+         panic ( "compress:unexpected error" );
+   }
+
+   panic ( "compress:end" );
+   /*notreached*/
+}
+
+
+
+/*---------------------------------------------*/
+static 
+Bool uncompressStream ( FILE *zStream, FILE *stream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(stream);
+   SET_BINARY_MODE(zStream);
+
+   if (ferror(stream)) goto errhandler_io;
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
+         if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
+            fwrite ( obuf, sizeof(UChar), nread, stream );
+         if (ferror(stream)) goto errhandler_io;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
+
+      if (nUnused == 0 && myfeof(zStream)) break;
+   }
+
+   closeok:
+   if (ferror(zStream)) goto errhandler_io;
+   if (stream != stdout) {
+      Int32 fd = fileno ( stream );
+      if (fd < 0) goto errhandler_io;
+      applySavedFileAttrToOutputFile ( fd );
+   }
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (ferror(stream)) goto errhandler_io;
+   ret = fflush ( stream );
+   if (ret != 0) goto errhandler_io;
+   if (stream != stdout) {
+      ret = fclose ( stream );
+      outputHandleJustInCase = NULL;
+      if (ret == EOF) goto errhandler_io;
+   }
+   outputHandleJustInCase = NULL;
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   trycat: 
+   if (forceOverwrite) {
+      rewind(zStream);
+      while (True) {
+      	 if (myfeof(zStream)) break;
+      	 nread = fread ( obuf, sizeof(UChar), 5000, zStream );
+      	 if (ferror(zStream)) goto errhandler_io;
+      	 if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
+      	 if (ferror(stream)) goto errhandler_io;
+      }
+      goto closeok;
+   }
+  
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         crcError();
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         compressedStreamEOF();
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (stream != stdout) fclose(stream);
+         if (streamNo == 1) {
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "\n%s: %s: trailing garbage after EOF ignored\n",
+                      progName, inName );
+            return True;       
+         }
+      default:
+         panic ( "decompress:unexpected error" );
+   }
+
+   panic ( "decompress:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool testStream ( FILE *zStream )
+{
+   BZFILE* bzf = NULL;
+   Int32   bzerr, bzerr_dummy, ret, streamNo, i;
+   UChar   obuf[5000];
+   UChar   unused[BZ_MAX_UNUSED];
+   Int32   nUnused;
+   void*   unusedTmpV;
+   UChar*  unusedTmp;
+
+   nUnused = 0;
+   streamNo = 0;
+
+   SET_BINARY_MODE(zStream);
+   if (ferror(zStream)) goto errhandler_io;
+
+   while (True) {
+
+      bzf = BZ2_bzReadOpen ( 
+               &bzerr, zStream, verbosity, 
+               (int)smallMode, unused, nUnused
+            );
+      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
+      streamNo++;
+
+      while (bzerr == BZ_OK) {
+         BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
+         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
+      }
+      if (bzerr != BZ_STREAM_END) goto errhandler;
+
+      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+
+      unusedTmp = (UChar*)unusedTmpV;
+      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
+
+      BZ2_bzReadClose ( &bzerr, bzf );
+      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
+      if (nUnused == 0 && myfeof(zStream)) break;
+
+   }
+
+   if (ferror(zStream)) goto errhandler_io;
+   ret = fclose ( zStream );
+   if (ret == EOF) goto errhandler_io;
+
+   if (verbosity >= 2) fprintf ( stderr, "\n    " );
+   return True;
+
+   errhandler:
+   BZ2_bzReadClose ( &bzerr_dummy, bzf );
+   if (verbosity == 0) 
+      fprintf ( stderr, "%s: %s: ", progName, inName );
+   switch (bzerr) {
+      case BZ_CONFIG_ERROR:
+         configError(); break;
+      case BZ_IO_ERROR:
+         errhandler_io:
+         ioError(); break;
+      case BZ_DATA_ERROR:
+         fprintf ( stderr,
+                   "data integrity (CRC) error in data\n" );
+         return False;
+      case BZ_MEM_ERROR:
+         outOfMemory();
+      case BZ_UNEXPECTED_EOF:
+         fprintf ( stderr,
+                   "file ends unexpectedly\n" );
+         return False;
+      case BZ_DATA_ERROR_MAGIC:
+         if (zStream != stdin) fclose(zStream);
+         if (streamNo == 1) {
+          fprintf ( stderr, 
+                    "bad magic number (file not created by bzip2)\n" );
+            return False;
+         } else {
+            if (noisy)
+            fprintf ( stderr, 
+                      "trailing garbage after EOF ignored\n" );
+            return True;       
+         }
+      default:
+         panic ( "test:unexpected error" );
+   }
+
+   panic ( "test:end" );
+   return True; /*notreached*/
+}
+
+
+/*---------------------------------------------------*/
+/*--- Error [non-] handling grunge                ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static
+void setExit ( Int32 v )
+{
+   if (v > exitValue) exitValue = v;
+}
+
+
+/*---------------------------------------------*/
+static 
+void cadvise ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\nIt is possible that the compressed file(s) have become corrupted.\n"
+        "You can use the -tvv option to test integrity of such files.\n\n"
+        "You can use the `bzip2recover' program to attempt to recover\n"
+        "data from undamaged sections of corrupted files.\n\n"
+    );
+}
+
+
+/*---------------------------------------------*/
+static 
+void showFileNames ( void )
+{
+   if (noisy)
+   fprintf (
+      stderr,
+      "\tInput file = %s, output file = %s\n",
+      inName, outName 
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void cleanUpAndFail ( Int32 ec )
+{
+   IntNative      retVal;
+   struct MY_STAT statBuf;
+
+   if ( srcMode == SM_F2F 
+        && opMode != OM_TEST
+        && deleteOutputOnInterrupt ) {
+
+      /* Check whether input file still exists.  Delete output file
+         only if input exists to avoid loss of data.  Joerg Prante, 5
+         January 2002.  (JRS 06-Jan-2002: other changes in 1.0.2 mean
+         this is less likely to happen.  But to be ultra-paranoid, we
+         do the check anyway.)  */
+      retVal = MY_STAT ( inName, &statBuf );
+      if (retVal == 0) {
+         if (noisy)
+            fprintf ( stderr, 
+                      "%s: Deleting output file %s, if it exists.\n",
+                      progName, outName );
+         if (outputHandleJustInCase != NULL)
+            fclose ( outputHandleJustInCase );
+         retVal = remove ( outName );
+         if (retVal != 0)
+            fprintf ( stderr,
+                      "%s: WARNING: deletion of output file "
+                      "(apparently) failed.\n",
+                      progName );
+      } else {
+         fprintf ( stderr,
+                   "%s: WARNING: deletion of output file suppressed\n",
+                    progName );
+         fprintf ( stderr,
+                   "%s:    since input file no longer exists.  Output file\n",
+                   progName );
+         fprintf ( stderr,
+                   "%s:    `%s' may be incomplete.\n",
+                   progName, outName );
+         fprintf ( stderr, 
+                   "%s:    I suggest doing an integrity test (bzip2 -tv)"
+                   " of it.\n",
+                   progName );
+      }
+   }
+
+   if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
+      fprintf ( stderr, 
+                "%s: WARNING: some files have not been processed:\n"
+                "%s:    %d specified on command line, %d not processed yet.\n\n",
+                progName, progName,
+                numFileNames, numFileNames - numFilesProcessed );
+   }
+   setExit(ec);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------*/
+static 
+void panic ( const Char* s )
+{
+   fprintf ( stderr,
+             "\n%s: PANIC -- internal consistency error:\n"
+             "\t%s\n"
+             "\tThis is a BUG.  Please report it to:\n"
+             "\tbzip2-devel@sourceware.org\n",
+             progName, s );
+   showFileNames();
+   cleanUpAndFail( 3 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void crcError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: Data integrity error when decompressing.\n",
+             progName );
+   showFileNames();
+   cadvise();
+   cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void compressedStreamEOF ( void )
+{
+  if (noisy) {
+    fprintf ( stderr,
+	      "\n%s: Compressed file ends unexpectedly;\n\t"
+	      "perhaps it is corrupted?  *Possible* reason follows.\n",
+	      progName );
+    perror ( progName );
+    showFileNames();
+    cadvise();
+  }
+  cleanUpAndFail( 2 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void ioError ( void )
+{
+   fprintf ( stderr,
+             "\n%s: I/O or other error, bailing out.  "
+             "Possible reason follows.\n",
+             progName );
+   perror ( progName );
+   showFileNames();
+   cleanUpAndFail( 1 );
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySignalCatcher ( IntNative n )
+{
+   fprintf ( stderr,
+             "\n%s: Control-C or similar caught, quitting.\n",
+             progName );
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void mySIGSEGVorSIGBUScatcher ( IntNative n )
+{
+   if (opMode == OM_Z)
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (2) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (3) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (1) and (2).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (1)\n"
+      "   or (2), feel free to report it to: bzip2-devel@sourceware.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+      else
+      fprintf ( 
+      stderr,
+      "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"
+      "\n"
+      "   Possible causes are (most likely first):\n"
+      "   (1) The compressed data is corrupted, and bzip2's usual checks\n"
+      "       failed to detect this.  Try bzip2 -tvv my_file.bz2.\n"
+      "   (2) This computer has unreliable memory or cache hardware\n"
+      "       (a surprisingly common problem; try a different machine.)\n"
+      "   (3) A bug in the compiler used to create this executable\n"
+      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
+      "   (4) A real bug in bzip2 -- I hope this should never be the case.\n"
+      "   The user's manual, Section 4.3, has more info on (2) and (3).\n"
+      "   \n"
+      "   If you suspect this is a bug in bzip2, or are unsure about (2)\n"
+      "   or (3), feel free to report it to: bzip2-devel@sourceware.org.\n"
+      "   Section 4.3 of the user's manual describes the info a useful\n"
+      "   bug report should have.  If the manual is available on your\n"
+      "   system, please try and read it before mailing me.  If you don't\n"
+      "   have the manual or can't be bothered to read it, mail me anyway.\n"
+      "\n",
+      progName );
+
+   showFileNames();
+   if (opMode == OM_Z)
+      cleanUpAndFail( 3 ); else
+      { cadvise(); cleanUpAndFail( 2 ); }
+}
+
+
+/*---------------------------------------------*/
+static 
+void outOfMemory ( void )
+{
+   fprintf ( stderr,
+             "\n%s: couldn't allocate enough memory\n",
+             progName );
+   showFileNames();
+   cleanUpAndFail(1);
+}
+
+
+/*---------------------------------------------*/
+static 
+void configError ( void )
+{
+   fprintf ( stderr,
+             "bzip2: I'm not configured correctly for this platform!\n"
+             "\tI require Int32, Int16 and Char to have sizes\n"
+             "\tof 4, 2 and 1 bytes to run properly, and they don't.\n"
+             "\tProbably you can fix this by defining them correctly,\n"
+             "\tand recompiling.  Bye!\n" );
+   setExit(3);
+   exit(exitValue);
+}
+
+
+/*---------------------------------------------------*/
+/*--- The main driver machinery                   ---*/
+/*---------------------------------------------------*/
+
+/* All rather crufty.  The main problem is that input files
+   are stat()d multiple times before use.  This should be
+   cleaned up. 
+*/
+
+/*---------------------------------------------*/
+static 
+void pad ( Char *s )
+{
+   Int32 i;
+   if ( (Int32)strlen(s) >= longestFileName ) return;
+   for (i = 1; i <= longestFileName - (Int32)strlen(s); i++)
+      fprintf ( stderr, " " );
+}
+
+
+/*---------------------------------------------*/
+static 
+void copyFileName ( Char* to, Char* from ) 
+{
+   if ( strlen(from) > FILE_NAME_LEN-10 )  {
+      fprintf (
+         stderr,
+         "bzip2: file name\n`%s'\n"
+         "is suspiciously (more than %d chars) long.\n"
+         "Try using a reasonable file name instead.  Sorry! :-)\n",
+         from, FILE_NAME_LEN-10
+      );
+      setExit(1);
+      exit(exitValue);
+   }
+
+  strncpy(to,from,FILE_NAME_LEN-10);
+  to[FILE_NAME_LEN-10]='\0';
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool fileExists ( Char* name )
+{
+   FILE *tmp   = fopen ( name, "rb" );
+   Bool exists = (tmp != NULL);
+   if (tmp != NULL) fclose ( tmp );
+   return exists;
+}
+
+
+/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions.
+   This avoids a race condition in versions < 1.0.2, in which
+   the file was first opened and then had its interim permissions
+   set safely.  We instead use open() to create the file with
+   the interim permissions required. (--- --- rw-).
+
+   For non-Unix platforms, if we are not worrying about
+   security issues, simple this simply behaves like fopen.
+*/
+static
+FILE* fopen_output_safely ( Char* name, const char* mode )
+{
+#  if BZ_UNIX
+   FILE*     fp;
+   IntNative fh;
+   fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
+   if (fh == -1) return NULL;
+   fp = fdopen(fh, mode);
+   if (fp == NULL) close(fh);
+   return fp;
+#  else
+   return fopen(name, mode);
+#  endif
+}
+
+
+/*---------------------------------------------*/
+/*--
+  if in doubt, return True
+--*/
+static 
+Bool notAStandardFile ( Char* name )
+{
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return True;
+   if (MY_S_ISREG(statBuf.st_mode)) return False;
+   return True;
+}
+
+
+/*---------------------------------------------*/
+/*--
+  rac 11/21/98 see if file has hard links to it
+--*/
+static 
+Int32 countHardLinks ( Char* name )
+{  
+   IntNative      i;
+   struct MY_STAT statBuf;
+
+   i = MY_LSTAT ( name, &statBuf );
+   if (i != 0) return 0;
+   return (statBuf.st_nlink - 1);
+}
+
+
+/*---------------------------------------------*/
+/* Copy modification date, access date, permissions and owner from the
+   source to destination file.  We have to copy this meta-info off
+   into fileMetaInfo before starting to compress / decompress it,
+   because doing it afterwards means we get the wrong access time.
+
+   To complicate matters, in compress() and decompress() below, the
+   sequence of tests preceding the call to saveInputFileMetaInfo()
+   involves calling fileExists(), which in turn establishes its result
+   by attempting to fopen() the file, and if successful, immediately
+   fclose()ing it again.  So we have to assume that the fopen() call
+   does not cause the access time field to be updated.
+
+   Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
+   to imply that merely doing open() will not affect the access time.
+   Therefore we merely need to hope that the C library only does
+   open() as a result of fopen(), and not any kind of read()-ahead
+   cleverness.
+
+   It sounds pretty fragile to me.  Whether this carries across
+   robustly to arbitrary Unix-like platforms (or even works robustly
+   on this one, RedHat 7.2) is unknown to me.  Nevertheless ...  
+*/
+#if BZ_UNIX
+static 
+struct MY_STAT fileMetaInfo;
+#endif
+
+static 
+void saveInputFileMetaInfo ( Char *srcName )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+   /* Note use of stat here, not lstat. */
+   retVal = MY_STAT( srcName, &fileMetaInfo );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+
+static 
+void applySavedTimeInfoToOutputFile ( Char *dstName )
+{
+#  if BZ_UNIX
+   IntNative      retVal;
+   struct utimbuf uTimBuf;
+
+   uTimBuf.actime = fileMetaInfo.st_atime;
+   uTimBuf.modtime = fileMetaInfo.st_mtime;
+
+   retVal = utime ( dstName, &uTimBuf );
+   ERROR_IF_NOT_ZERO ( retVal );
+#  endif
+}
+
+static 
+void applySavedFileAttrToOutputFile ( IntNative fd )
+{
+#  if BZ_UNIX
+   IntNative retVal;
+
+   retVal = fchmod ( fd, fileMetaInfo.st_mode );
+   ERROR_IF_NOT_ZERO ( retVal );
+
+   (void) fchown ( fd, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
+   /* chown() will in many cases return with EPERM, which can
+      be safely ignored.
+   */
+#  endif
+}
+
+
+/*---------------------------------------------*/
+static 
+Bool containsDubiousChars ( Char* name )
+{
+#  if BZ_UNIX
+   /* On unix, files can contain any characters and the file expansion
+    * is performed by the shell.
+    */
+   return False;
+#  else /* ! BZ_UNIX */
+   /* On non-unix (Win* platforms), wildcard characters are not allowed in 
+    * filenames.
+    */
+   for (; *name != '\0'; name++)
+      if (*name == '?' || *name == '*') return True;
+   return False;
+#  endif /* BZ_UNIX */
+}
+
+
+/*---------------------------------------------*/
+#define BZ_N_SUFFIX_PAIRS 4
+
+const Char* zSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { ".bz2", ".bz", ".tbz2", ".tbz" };
+const Char* unzSuffix[BZ_N_SUFFIX_PAIRS] 
+   = { "", "", ".tar", ".tar" };
+
+static 
+Bool hasSuffix ( Char* s, const Char* suffix )
+{
+   Int32 ns = strlen(s);
+   Int32 nx = strlen(suffix);
+   if (ns < nx) return False;
+   if (strcmp(s + ns - nx, suffix) == 0) return True;
+   return False;
+}
+
+static 
+Bool mapSuffix ( Char* name, 
+                 const Char* oldSuffix, 
+                 const Char* newSuffix )
+{
+   if (!hasSuffix(name,oldSuffix)) return False;
+   name[strlen(name)-strlen(oldSuffix)] = 0;
+   strcat ( name, newSuffix );
+   return True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void compress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "compress: bad modes\n" );
+
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         strcat ( outName, ".bz2" ); 
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++) {
+      if (hasSuffix(inName, zSuffix[i])) {
+         if (noisy)
+         fprintf ( stderr, 
+                   "%s: Input file %s already has %s suffix.\n",
+                   progName, inName, zSuffix[i] );
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+	 remove(outName);
+      } else {
+	 fprintf ( stderr, "%s: Output file %s already exists.\n",
+		   progName, outName );
+	 setExit(1);
+	 return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName )) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( isatty ( fileno ( stdout ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't write compressed data to a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "compress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr,  "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   compressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( srcMode == SM_F2F ) {
+      applySavedTimeInfoToOutputFile ( outName );
+      deleteOutputOnInterrupt = False;
+      if ( !keepInputFiles ) {
+         IntNative retVal = remove ( inName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+
+   deleteOutputOnInterrupt = False;
+}
+
+
+/*---------------------------------------------*/
+static 
+void uncompress ( Char *name )
+{
+   FILE  *inStr;
+   FILE  *outStr;
+   Int32 n, i;
+   Bool  magicNumberOK;
+   Bool  cantGuess;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "uncompress: bad modes\n" );
+
+   cantGuess = False;
+   switch (srcMode) {
+      case SM_I2O: 
+         copyFileName ( inName, (Char*)"(stdin)" );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+      case SM_F2F: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, name );
+         for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++)
+            if (mapSuffix(outName,zSuffix[i],unzSuffix[i]))
+               goto zzz; 
+         cantGuess = True;
+         strcat ( outName, ".out" );
+         break;
+      case SM_F2O: 
+         copyFileName ( inName, name );
+         copyFileName ( outName, (Char*)"(stdout)" ); 
+         break;
+   }
+
+   zzz:
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
+      if (noisy)
+      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( /* srcMode == SM_F2F implied && */ cantGuess ) {
+      if (noisy)
+      fprintf ( stderr, 
+                "%s: Can't guess original name for %s -- using %s\n",
+                progName, inName, outName );
+      /* just a warning, no return */
+   }   
+   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
+      if (forceOverwrite) {
+	remove(outName);
+      } else {
+        fprintf ( stderr, "%s: Output file %s already exists.\n",
+                  progName, outName );
+        setExit(1);
+        return;
+      }
+   }
+   if ( srcMode == SM_F2F && !forceOverwrite &&
+        (n=countHardLinks ( inName ) ) > 0) {
+      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
+                progName, inName, n, n > 1 ? "s" : "" );
+      setExit(1);
+      return;
+   }
+
+   if ( srcMode == SM_F2F ) {
+      /* Save the file's meta-info before we open it.  Doing it later
+         means we mess up the access times. */
+      saveInputFileMetaInfo ( inName );
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         inStr = stdin;
+         outStr = stdout;
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2O:
+         inStr = fopen ( inName, "rb" );
+         outStr = stdout;
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         outStr = fopen_output_safely ( outName, "wb" );
+         if ( outStr == NULL) {
+            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
+                      progName, outName, strerror(errno) );
+            if ( inStr != NULL ) fclose ( inStr );
+            setExit(1);
+            return;
+         }
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
+                      progName, inName, strerror(errno) );
+            if ( outStr != NULL ) fclose ( outStr );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "uncompress: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
+   outputHandleJustInCase = outStr;
+   deleteOutputOnInterrupt = True;
+   magicNumberOK = uncompressStream ( inStr, outStr );
+   outputHandleJustInCase = NULL;
+
+   /*--- If there was an I/O error, we won't get here. ---*/
+   if ( magicNumberOK ) {
+      if ( srcMode == SM_F2F ) {
+         applySavedTimeInfoToOutputFile ( outName );
+         deleteOutputOnInterrupt = False;
+         if ( !keepInputFiles ) {
+            IntNative retVal = remove ( inName );
+            ERROR_IF_NOT_ZERO ( retVal );
+         }
+      }
+   } else {
+      unzFailsExist = True;
+      deleteOutputOnInterrupt = False;
+      if ( srcMode == SM_F2F ) {
+         IntNative retVal = remove ( outName );
+         ERROR_IF_NOT_ZERO ( retVal );
+      }
+   }
+   deleteOutputOnInterrupt = False;
+
+   if ( magicNumberOK ) {
+      if (verbosity >= 1)
+         fprintf ( stderr, "done\n" );
+   } else {
+      setExit(2);
+      if (verbosity >= 1)
+         fprintf ( stderr, "not a bzip2 file.\n" ); else
+         fprintf ( stderr,
+                   "%s: %s is not a bzip2 file.\n",
+                   progName, inName );
+   }
+
+}
+
+
+/*---------------------------------------------*/
+static 
+void testf ( Char *name )
+{
+   FILE *inStr;
+   Bool allOK;
+   struct MY_STAT statBuf;
+
+   deleteOutputOnInterrupt = False;
+
+   if (name == NULL && srcMode != SM_I2O)
+      panic ( "testf: bad modes\n" );
+
+   copyFileName ( outName, (Char*)"(none)" );
+   switch (srcMode) {
+      case SM_I2O: copyFileName ( inName, (Char*)"(stdin)" ); break;
+      case SM_F2F: copyFileName ( inName, name ); break;
+      case SM_F2O: copyFileName ( inName, name ); break;
+   }
+
+   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
+      if (noisy)
+      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
+                progName, inName );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
+      fprintf ( stderr, "%s: Can't open input %s: %s.\n",
+                progName, inName, strerror(errno) );
+      setExit(1);
+      return;
+   }
+   if ( srcMode != SM_I2O ) {
+      MY_STAT(inName, &statBuf);
+      if ( MY_S_ISDIR(statBuf.st_mode) ) {
+         fprintf( stderr,
+                  "%s: Input file %s is a directory.\n",
+                  progName,inName);
+         setExit(1);
+         return;
+      }
+   }
+
+   switch ( srcMode ) {
+
+      case SM_I2O:
+         if ( isatty ( fileno ( stdin ) ) ) {
+            fprintf ( stderr,
+                      "%s: I won't read compressed data from a terminal.\n",
+                      progName );
+            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
+                              progName, progName );
+            setExit(1);
+            return;
+         };
+         inStr = stdin;
+         break;
+
+      case SM_F2O: case SM_F2F:
+         inStr = fopen ( inName, "rb" );
+         if ( inStr == NULL ) {
+            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
+                      progName, inName, strerror(errno) );
+            setExit(1);
+            return;
+         };
+         break;
+
+      default:
+         panic ( "testf: bad srcMode" );
+         break;
+   }
+
+   if (verbosity >= 1) {
+      fprintf ( stderr, "  %s: ", inName );
+      pad ( inName );
+      fflush ( stderr );
+   }
+
+   /*--- Now the input handle is sane.  Do the Biz. ---*/
+   outputHandleJustInCase = NULL;
+   allOK = testStream ( inStr );
+
+   if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
+   if (!allOK) testFailsExist = True;
+}
+
+
+/*---------------------------------------------*/
+static 
+void license ( void )
+{
+   fprintf ( stderr,
+
+    "bzip2, a block-sorting file compressor.  "
+    "Version %s.\n"
+    "   \n"
+    "   Copyright (C) 1996-2019 by Julian Seward.\n"
+    "   \n"
+    "   This program is free software; you can redistribute it and/or modify\n"
+    "   it under the terms set out in the LICENSE file, which is included\n"
+    "   in the bzip2 source distribution.\n"
+    "   \n"
+    "   This program is distributed in the hope that it will be useful,\n"
+    "   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+    "   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+    "   LICENSE file for more details.\n"
+    "   \n",
+    BZ2_bzlibVersion()
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void usage ( Char *fullProgName )
+{
+   fprintf (
+      stderr,
+      "bzip2, a block-sorting file compressor.  "
+      "Version %s.\n"
+      "\n   usage: %s [flags and input files in any order]\n"
+      "\n"
+      "   -h --help           print this message\n"
+      "   -d --decompress     force decompression\n"
+      "   -z --compress       force compression\n"
+      "   -k --keep           keep (don't delete) input files\n"
+      "   -f --force          overwrite existing output files\n"
+      "   -t --test           test compressed file integrity\n"
+      "   -c --stdout         output to standard out\n"
+      "   -q --quiet          suppress noncritical error messages\n"
+      "   -v --verbose        be verbose (a 2nd -v gives more)\n"
+      "   -L --license        display software version & license\n"
+      "   -V --version        display software version & license\n"
+      "   -s --small          use less memory (at most 2500k)\n"
+      "   -1 .. -9            set block size to 100k .. 900k\n"
+      "   --fast              alias for -1\n"
+      "   --best              alias for -9\n"
+      "\n"
+      "   If invoked as `bzip2', default action is to compress.\n"
+      "              as `bunzip2',  default action is to decompress.\n"
+      "              as `bzcat', default action is to decompress to stdout.\n"
+      "\n"
+      "   If no file names are given, bzip2 compresses or decompresses\n"
+      "   from standard input to standard output.  You can combine\n"
+      "   short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
+#     if BZ_UNIX
+      "\n"
+#     endif
+      ,
+
+      BZ2_bzlibVersion(),
+      fullProgName
+   );
+}
+
+
+/*---------------------------------------------*/
+static 
+void redundant ( Char* flag )
+{
+   fprintf ( 
+      stderr, 
+      "%s: %s is redundant in versions 0.9.5 and above\n",
+      progName, flag );
+}
+
+
+/*---------------------------------------------*/
+/*--
+  All the garbage from here to main() is purely to
+  implement a linked list of command-line arguments,
+  into which main() copies argv[1 .. argc-1].
+
+  The purpose of this exercise is to facilitate 
+  the expansion of wildcard characters * and ? in 
+  filenames for OSs which don't know how to do it
+  themselves, like MSDOS, Windows 95 and NT.
+
+  The actual Dirty Work is done by the platform-
+  specific macro APPEND_FILESPEC.
+--*/
+
+typedef
+   struct zzzz {
+      Char        *name;
+      struct zzzz *link;
+   }
+   Cell;
+
+
+/*---------------------------------------------*/
+static 
+void *myMalloc ( Int32 n )
+{
+   void* p;
+
+   p = malloc ( (size_t)n );
+   if (p == NULL) outOfMemory ();
+   return p;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *mkCell ( void )
+{
+   Cell *c;
+
+   c = (Cell*) myMalloc ( sizeof ( Cell ) );
+   c->name = NULL;
+   c->link = NULL;
+   return c;
+}
+
+
+/*---------------------------------------------*/
+static 
+Cell *snocString ( Cell *root, Char *name )
+{
+   if (root == NULL) {
+      Cell *tmp = mkCell();
+      tmp->name = (Char*) myMalloc ( 5 + strlen(name) );
+      strcpy ( tmp->name, name );
+      return tmp;
+   } else {
+      Cell *tmp = root;
+      while (tmp->link != NULL) tmp = tmp->link;
+      tmp->link = snocString ( tmp->link, name );
+      return root;
+   }
+}
+
+
+/*---------------------------------------------*/
+static 
+void addFlagsFromEnvVar ( Cell** argList, Char* varName ) 
+{
+   Int32 i, j, k;
+   Char *envbase, *p;
+
+   envbase = getenv(varName);
+   if (envbase != NULL) {
+      p = envbase;
+      i = 0;
+      while (True) {
+         if (p[i] == 0) break;
+         p += i;
+         i = 0;
+         while (isspace((Int32)(p[0]))) p++;
+         while (p[i] != 0 && !isspace((Int32)(p[i]))) i++;
+         if (i > 0) {
+            k = i; if (k > FILE_NAME_LEN-10) k = FILE_NAME_LEN-10;
+            for (j = 0; j < k; j++) tmpName[j] = p[j];
+            tmpName[k] = 0;
+            APPEND_FLAG(*argList, tmpName);
+         }
+      }
+   }
+}
+
+
+/*---------------------------------------------*/
+#define ISFLAG(s) (strcmp(aa->name, (s))==0)
+
+IntNative main ( IntNative argc, Char *argv[] )
+{
+   Int32  i, j;
+   Char   *tmp;
+   Cell   *argList;
+   Cell   *aa;
+   Bool   decode;
+
+   /*-- Be really really really paranoid :-) --*/
+   if (sizeof(Int32) != 4 || sizeof(UInt32) != 4  ||
+       sizeof(Int16) != 2 || sizeof(UInt16) != 2  ||
+       sizeof(Char)  != 1 || sizeof(UChar)  != 1)
+      configError();
+
+   /*-- Initialise --*/
+   outputHandleJustInCase  = NULL;
+   smallMode               = False;
+   keepInputFiles          = False;
+   forceOverwrite          = False;
+   noisy                   = True;
+   verbosity               = 0;
+   blockSize100k           = 9;
+   testFailsExist          = False;
+   unzFailsExist           = False;
+   numFileNames            = 0;
+   numFilesProcessed       = 0;
+   workFactor              = 30;
+   deleteOutputOnInterrupt = False;
+   exitValue               = 0;
+   i = j = 0; /* avoid bogus warning from egcs-1.1.X */
+
+   /*-- Set up signal handlers for mem access errors --*/
+   signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
+#  if BZ_UNIX
+#  ifndef __DJGPP__
+   signal (SIGBUS,  mySIGSEGVorSIGBUScatcher);
+#  endif
+#  endif
+
+   copyFileName ( inName,  (Char*)"(none)" );
+   copyFileName ( outName, (Char*)"(none)" );
+
+   copyFileName ( progNameReally, argv[0] );
+   progName = &progNameReally[0];
+   for (tmp = &progNameReally[0]; *tmp != '\0'; tmp++)
+      if (*tmp == PATH_SEP) progName = tmp + 1;
+
+
+   /*-- Copy flags from env var BZIP2, and 
+        expand filename wildcards in arg list.
+   --*/
+   argList = NULL;
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP2" );
+   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP" );
+   for (i = 1; i <= argc-1; i++)
+      APPEND_FILESPEC(argList, argv[i]);
+
+
+   /*-- Find the length of the longest filename --*/
+   longestFileName = 7;
+   numFileNames    = 0;
+   decode          = True;
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) { decode = False; continue; }
+      if (aa->name[0] == '-' && decode) continue;
+      numFileNames++;
+      if (longestFileName < (Int32)strlen(aa->name) )
+         longestFileName = (Int32)strlen(aa->name);
+   }
+
+
+   /*-- Determine source modes; flag handling may change this too. --*/
+   if (numFileNames == 0)
+      srcMode = SM_I2O; else srcMode = SM_F2F;
+
+
+   /*-- Determine what to do (compress/uncompress/test/cat). --*/
+   /*-- Note that subsequent flag handling may change this. --*/
+   opMode = OM_Z;
+
+   if ( (strstr ( progName, "unzip" ) != 0) ||
+        (strstr ( progName, "UNZIP" ) != 0) )
+      opMode = OM_UNZ;
+
+   if ( (strstr ( progName, "z2cat" ) != 0) ||
+        (strstr ( progName, "Z2CAT" ) != 0) ||
+        (strstr ( progName, "zcat" ) != 0)  ||
+        (strstr ( progName, "ZCAT" ) != 0) )  {
+      opMode = OM_UNZ;
+      srcMode = (numFileNames == 0) ? SM_I2O : SM_F2O;
+   }
+
+
+   /*-- Look at the flags. --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (aa->name[0] == '-' && aa->name[1] != '-') {
+         for (j = 1; aa->name[j] != '\0'; j++) {
+            switch (aa->name[j]) {
+               case 'c': srcMode          = SM_F2O; break;
+               case 'd': opMode           = OM_UNZ; break;
+               case 'z': opMode           = OM_Z; break;
+               case 'f': forceOverwrite   = True; break;
+               case 't': opMode           = OM_TEST; break;
+               case 'k': keepInputFiles   = True; break;
+               case 's': smallMode        = True; break;
+               case 'q': noisy            = False; break;
+               case '1': blockSize100k    = 1; break;
+               case '2': blockSize100k    = 2; break;
+               case '3': blockSize100k    = 3; break;
+               case '4': blockSize100k    = 4; break;
+               case '5': blockSize100k    = 5; break;
+               case '6': blockSize100k    = 6; break;
+               case '7': blockSize100k    = 7; break;
+               case '8': blockSize100k    = 8; break;
+               case '9': blockSize100k    = 9; break;
+               case 'V':
+               case 'L': license();            break;
+               case 'v': verbosity++; break;
+               case 'h': usage ( progName );
+                         exit ( 0 );
+                         break;
+               default:  fprintf ( stderr, "%s: Bad flag `%s'\n",
+                                   progName, aa->name );
+                         usage ( progName );
+                         exit ( 1 );
+                         break;
+            }
+         }
+      }
+   }
+   
+   /*-- And again ... --*/
+   for (aa = argList; aa != NULL; aa = aa->link) {
+      if (ISFLAG("--")) break;
+      if (ISFLAG("--stdout"))            srcMode          = SM_F2O;  else
+      if (ISFLAG("--decompress"))        opMode           = OM_UNZ;  else
+      if (ISFLAG("--compress"))          opMode           = OM_Z;    else
+      if (ISFLAG("--force"))             forceOverwrite   = True;    else
+      if (ISFLAG("--test"))              opMode           = OM_TEST; else
+      if (ISFLAG("--keep"))              keepInputFiles   = True;    else
+      if (ISFLAG("--small"))             smallMode        = True;    else
+      if (ISFLAG("--quiet"))             noisy            = False;   else
+      if (ISFLAG("--version"))           license();                  else
+      if (ISFLAG("--license"))           license();                  else
+      if (ISFLAG("--exponential"))       workFactor = 1;             else 
+      if (ISFLAG("--repetitive-best"))   redundant(aa->name);        else
+      if (ISFLAG("--repetitive-fast"))   redundant(aa->name);        else
+      if (ISFLAG("--fast"))              blockSize100k = 1;          else
+      if (ISFLAG("--best"))              blockSize100k = 9;          else
+      if (ISFLAG("--verbose"))           verbosity++;                else
+      if (ISFLAG("--help"))              { usage ( progName ); exit ( 0 ); }
+         else
+         if (strncmp ( aa->name, "--", 2) == 0) {
+            fprintf ( stderr, "%s: Bad flag `%s'\n", progName, aa->name );
+            usage ( progName );
+            exit ( 1 );
+         }
+   }
+
+   if (verbosity > 4) verbosity = 4;
+   if (opMode == OM_Z && smallMode && blockSize100k > 2) 
+      blockSize100k = 2;
+
+   if (opMode == OM_TEST && srcMode == SM_F2O) {
+      fprintf ( stderr, "%s: -c and -t cannot be used together.\n",
+                progName );
+      exit ( 1 );
+   }
+
+   if (srcMode == SM_F2O && numFileNames == 0)
+      srcMode = SM_I2O;
+
+   if (opMode != OM_Z) blockSize100k = 0;
+
+   if (srcMode == SM_F2F) {
+      signal (SIGINT,  mySignalCatcher);
+      signal (SIGTERM, mySignalCatcher);
+#     if BZ_UNIX
+      signal (SIGHUP,  mySignalCatcher);
+#     endif
+   }
+
+   if (opMode == OM_Z) {
+     if (srcMode == SM_I2O) {
+        compress ( NULL );
+     } else {
+        decode = True;
+        for (aa = argList; aa != NULL; aa = aa->link) {
+           if (ISFLAG("--")) { decode = False; continue; }
+           if (aa->name[0] == '-' && decode) continue;
+           numFilesProcessed++;
+           compress ( aa->name );
+        }
+     }
+   } 
+   else
+
+   if (opMode == OM_UNZ) {
+      unzFailsExist = False;
+      if (srcMode == SM_I2O) {
+         uncompress ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+            if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            uncompress ( aa->name );
+         }      
+      }
+      if (unzFailsExist) { 
+         setExit(2); 
+         exit(exitValue);
+      }
+   } 
+
+   else {
+      testFailsExist = False;
+      if (srcMode == SM_I2O) {
+         testf ( NULL );
+      } else {
+         decode = True;
+         for (aa = argList; aa != NULL; aa = aa->link) {
+	    if (ISFLAG("--")) { decode = False; continue; }
+            if (aa->name[0] == '-' && decode) continue;
+            numFilesProcessed++;
+            testf ( aa->name );
+	 }
+      }
+      if (testFailsExist) {
+	 if (noisy) {
+            fprintf ( stderr,
+               "\n"
+               "You can use the `bzip2recover' program to attempt to recover\n"
+               "data from undamaged sections of corrupted files.\n\n"
+            );
+	 }
+         setExit(2);
+         exit(exitValue);
+      }
+   }
+
+   /* Free the argument list memory to mollify leak detectors 
+      (eg) Purify, Checker.  Serves no other useful purpose.
+   */
+   aa = argList;
+   while (aa != NULL) {
+      Cell* aa2 = aa->link;
+      if (aa->name != NULL) free(aa->name);
+      free(aa);
+      aa = aa2;
+   }
+
+   return exitValue;
+}
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                         bzip2.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/third_party/bzip2/bzip2.mk b/third_party/bzip2/bzip2.mk
new file mode 100644
index 000000000..008891b3c
--- /dev/null
+++ b/third_party/bzip2/bzip2.mk
@@ -0,0 +1,57 @@
+#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-â”
+#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────â”
+
+PKGS += THIRD_PARTY_BZIP2
+
+THIRD_PARTY_BZIP2_ARTIFACTS += THIRD_PARTY_BZIP2_A
+THIRD_PARTY_BZIP2 = $(THIRD_PARTY_BZIP2_A_DEPS) $(THIRD_PARTY_BZIP2_A)
+THIRD_PARTY_BZIP2_A = o/$(MODE)/third_party/bzip2/bzip2.a
+THIRD_PARTY_BZIP2_A_FILES := $(wildcard third_party/bzip2/*)
+THIRD_PARTY_BZIP2_A_HDRS = third_party/bzip2/bzip2.h
+THIRD_PARTY_BZIP2_A_HDRS_ALL = $(filter %.h,$(THIRD_PARTY_BZIP2_A_FILES))
+THIRD_PARTY_BZIP2_A_SRCS_S = $(filter %.S,$(THIRD_PARTY_BZIP2_A_FILES))
+THIRD_PARTY_BZIP2_A_SRCS_C = $(filter %.c,$(THIRD_PARTY_BZIP2_A_FILES))
+
+THIRD_PARTY_BZIP2_A_SRCS =				\
+	$(THIRD_PARTY_BZIP2_A_SRCS_S)			\
+	$(THIRD_PARTY_BZIP2_A_SRCS_C)
+
+THIRD_PARTY_BZIP2_A_OBJS =				\
+	$(THIRD_PARTY_BZIP2_A_SRCS_S:%.S=o/$(MODE)/%.o)	\
+	$(THIRD_PARTY_BZIP2_A_SRCS_C:%.c=o/$(MODE)/%.o)
+
+THIRD_PARTY_BZIP2_A_CHECKS =				\
+	$(THIRD_PARTY_BZIP2_A).pkg			\
+	$(THIRD_PARTY_BZIP2_A_HDRS_ALL:%=o/$(MODE)/%.ok)
+
+THIRD_PARTY_BZIP2_A_DIRECTDEPS =				\
+	LIBC_INTRIN					\
+	LIBC_NEXGEN32E					\
+	LIBC_STR					\
+	LIBC_STUBS
+
+THIRD_PARTY_BZIP2_A_DEPS :=				\
+	$(call uniq,$(foreach x,$(THIRD_PARTY_BZIP2_A_DIRECTDEPS),$($(x))))
+
+$(THIRD_PARTY_BZIP2_A):					\
+		third_party/bzip2/			\
+		$(THIRD_PARTY_BZIP2_A).pkg		\
+		$(THIRD_PARTY_BZIP2_A_OBJS)
+
+$(THIRD_PARTY_BZIP2_A).pkg:				\
+		$(THIRD_PARTY_BZIP2_A_OBJS)		\
+		$(foreach x,$(THIRD_PARTY_BZIP2_A_DIRECTDEPS),$($(x)_A).pkg)
+
+THIRD_PARTY_BZIP2_LIBS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)))
+THIRD_PARTY_BZIP2_SRCS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_SRCS))
+THIRD_PARTY_BZIP2_HDRS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_HDRS))
+THIRD_PARTY_BZIP2_HDRS_ALL = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_HDRS_ALL))
+THIRD_PARTY_BZIP2_BINS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_BINS))
+THIRD_PARTY_BZIP2_CHECKS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_CHECKS))
+THIRD_PARTY_BZIP2_OBJS = $(foreach x,$(THIRD_PARTY_BZIP2_ARTIFACTS),$($(x)_OBJS))
+$(THIRD_PARTY_BZIP2_OBJS): $(BUILD_FILES) third_party/bzip2/bzip2.mk
+
+.PHONY: o/$(MODE)/third_party/bzip2
+o/$(MODE)/third_party/bzip2:				\
+		$(THIRD_PARTY_BZIP2_A)			\
+		$(THIRD_PARTY_BZIP2_CHECKS)
diff --git a/third_party/bzip2/bzip2.txt b/third_party/bzip2/bzip2.txt
new file mode 100644
index 000000000..a50570bc2
--- /dev/null
+++ b/third_party/bzip2/bzip2.txt
@@ -0,0 +1,391 @@
+
+NAME
+       bzip2, bunzip2 - a block-sorting file compressor, v1.0.8
+       bzcat - decompresses files to stdout
+       bzip2recover - recovers data from damaged bzip2 files
+
+
+SYNOPSIS
+       bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ...  ]
+       bunzip2 [ -fkvsVL ] [ filenames ...  ]
+       bzcat [ -s ] [ filenames ...  ]
+       bzip2recover filename
+
+
+DESCRIPTION
+       bzip2  compresses  files  using  the Burrows-Wheeler block
+       sorting text compression algorithm,  and  Huffman  coding.
+       Compression  is  generally  considerably  better than that
+       achieved by more conventional LZ77/LZ78-based compressors,
+       and  approaches  the performance of the PPM family of sta-
+       tistical compressors.
+
+       The command-line options are deliberately very similar  to
+       those of GNU gzip, but they are not identical.
+
+       bzip2  expects  a list of file names to accompany the com-
+       mand-line flags.  Each file is replaced  by  a  compressed
+       version  of  itself,  with  the  name "original_name.bz2".
+       Each compressed file has the same modification date,  per-
+       missions, and, when possible, ownership as the correspond-
+       ing original, so that these properties  can  be  correctly
+       restored  at  decompression  time.   File name handling is
+       naive in the sense that there is no mechanism for preserv-
+       ing  original file names, permissions, ownerships or dates
+       in filesystems which lack these concepts, or have  serious
+       file name length restrictions, such as MS-DOS.
+
+       bzip2  and  bunzip2 will by default not overwrite existing
+       files.  If you want this to happen, specify the -f flag.
+
+       If no file names  are  specified,  bzip2  compresses  from
+       standard  input  to  standard output.  In this case, bzip2
+       will decline to write compressed output to a terminal,  as
+       this  would  be  entirely  incomprehensible  and therefore
+       pointless.
+
+       bunzip2 (or bzip2 -d) decompresses  all  specified  files.
+       Files which were not created by bzip2 will be detected and
+       ignored, and a warning issued.  bzip2  attempts  to  guess
+       the  filename  for  the decompressed file from that of the
+       compressed file as follows:
+
+              filename.bz2    becomes   filename
+              filename.bz     becomes   filename
+              filename.tbz2   becomes   filename.tar
+              filename.tbz    becomes   filename.tar
+              anyothername    becomes   anyothername.out
+
+       If the file does not end in one of the recognised endings,
+       .bz2,  .bz,  .tbz2 or .tbz, bzip2 complains that it cannot
+       guess the name of the original file, and uses the original
+       name with .out appended.
+
+       As  with compression, supplying no filenames causes decom-
+       pression from standard input to standard output.
+
+       bunzip2 will correctly decompress a file which is the con-
+       catenation of two or more compressed files.  The result is
+       the concatenation of the corresponding uncompressed files.
+       Integrity testing (-t) of concatenated compressed files is
+       also supported.
+
+       You can also compress or decompress files to the  standard
+       output  by giving the -c flag.  Multiple files may be com-
+       pressed and decompressed like this.  The resulting outputs
+       are  fed  sequentially to stdout.  Compression of multiple
+       files in this manner generates a stream containing  multi-
+       ple compressed file representations.  Such a stream can be
+       decompressed correctly only  by  bzip2  version  0.9.0  or
+       later.   Earlier  versions of bzip2 will stop after decom-
+       pressing the first file in the stream.
+
+       bzcat (or bzip2 -dc) decompresses all specified  files  to
+       the standard output.
+
+       bzip2  will  read arguments from the environment variables
+       BZIP2 and BZIP, in  that  order,  and  will  process  them
+       before  any  arguments  read  from the command line.  This
+       gives a convenient way to supply default arguments.
+
+       Compression is always performed, even  if  the  compressed
+       file  is slightly larger than the original.  Files of less
+       than about one hundred bytes tend to get larger, since the
+       compression  mechanism  has  a  constant  overhead  in the
+       region of 50 bytes.  Random data (including the output  of
+       most  file  compressors)  is  coded at about 8.05 bits per
+       byte, giving an expansion of around 0.5%.
+
+       As a self-check for your  protection,  bzip2  uses  32-bit
+       CRCs  to make sure that the decompressed version of a file
+       is identical to the original.  This guards against corrup-
+       tion  of  the compressed data, and against undetected bugs
+       in bzip2 (hopefully very unlikely).  The chances  of  data
+       corruption  going  undetected  is  microscopic,  about one
+       chance in four billion for each file processed.  Be aware,
+       though,  that  the  check occurs upon decompression, so it
+       can only tell you that something is wrong.  It can't  help
+       you  recover  the original uncompressed data.  You can use
+       bzip2recover to try to recover data from damaged files.
+
+       Return values: 0 for a normal exit,  1  for  environmental
+       problems  (file not found, invalid flags, I/O errors, &c),
+       2 to indicate a corrupt compressed file, 3 for an internal
+       consistency error (eg, bug) which caused bzip2 to panic.
+
+
+OPTIONS
+       -c --stdout
+              Compress or decompress to standard output.
+
+       -d --decompress
+              Force  decompression.  bzip2, bunzip2 and bzcat are
+              really the same program,  and  the  decision  about
+              what  actions to take is done on the basis of which
+              name is used.  This flag overrides that  mechanism,
+              and forces bzip2 to decompress.
+
+       -z --compress
+              The   complement   to   -d:   forces   compression,
+              regardless of the invocation name.
+
+       -t --test
+              Check integrity of the specified file(s), but don't
+              decompress  them.   This  really  performs  a trial
+              decompression and throws away the result.
+
+       -f --force
+              Force overwrite of output files.   Normally,  bzip2
+              will  not  overwrite  existing  output files.  Also
+              forces bzip2 to break hard links to files, which it
+              otherwise wouldn't do.
+
+              bzip2  normally  declines to decompress files which
+              don't have the  correct  magic  header  bytes.   If
+              forced  (-f),  however,  it  will  pass  such files
+              through unmodified.  This is how GNU gzip  behaves.
+
+       -k --keep
+              Keep  (don't delete) input files during compression
+              or decompression.
+
+       -s --small
+              Reduce memory usage, for compression, decompression
+              and  testing.   Files  are  decompressed and tested
+              using a modified algorithm which only requires  2.5
+              bytes  per  block byte.  This means any file can be
+              decompressed in 2300k of memory,  albeit  at  about
+              half the normal speed.
+
+              During  compression,  -s  selects  a  block size of
+              200k, which limits memory use to  around  the  same
+              figure,  at  the expense of your compression ratio.
+              In short, if your  machine  is  low  on  memory  (8
+              megabytes  or  less),  use  -s for everything.  See
+              MEMORY MANAGEMENT below.
+
+       -q --quiet
+              Suppress non-essential warning messages.   Messages
+              pertaining  to I/O errors and other critical events
+              will not be suppressed.
+
+       -v --verbose
+              Verbose mode -- show the compression ratio for each
+              file  processed.   Further  -v's  increase the ver-
+              bosity level, spewing out lots of information which
+              is primarily of interest for diagnostic purposes.
+
+       -L --license -V --version
+              Display  the  software  version,  license terms and
+              conditions.
+
+       -1 (or --fast) to -9 (or --best)
+              Set the block size to 100 k, 200 k ..  900  k  when
+              compressing.   Has  no  effect  when decompressing.
+              See MEMORY MANAGEMENT below.  The --fast and --best
+              aliases  are  primarily for GNU gzip compatibility.
+              In particular, --fast doesn't make things  signifi-
+              cantly  faster.   And  --best  merely  selects  the
+              default behaviour.
+
+       --     Treats all subsequent arguments as file names, even
+              if they start with a dash.  This is so you can han-
+              dle files with names beginning  with  a  dash,  for
+              example: bzip2 -- -myfilename.
+
+       --repetitive-fast --repetitive-best
+              These  flags  are  redundant  in versions 0.9.5 and
+              above.  They provided some coarse control over  the
+              behaviour  of the sorting algorithm in earlier ver-
+              sions, which was sometimes useful.  0.9.5 and above
+              have  an  improved  algorithm  which  renders these
+              flags irrelevant.
+
+
+MEMORY MANAGEMENT
+       bzip2 compresses large files in blocks.   The  block  size
+       affects  both  the  compression  ratio  achieved,  and the
+       amount of memory needed for compression and decompression.
+       The  flags  -1  through  -9  specify  the block size to be
+       100,000 bytes through 900,000 bytes (the default)  respec-
+       tively.   At  decompression  time, the block size used for
+       compression is read from  the  header  of  the  compressed
+       file, and bunzip2 then allocates itself just enough memory
+       to decompress the file.  Since block sizes are  stored  in
+       compressed  files,  it follows that the flags -1 to -9 are
+       irrelevant to and so ignored during decompression.
+
+       Compression and decompression requirements, in bytes,  can
+       be estimated as:
+
+              Compression:   400k + ( 8 x block size )
+
+              Decompression: 100k + ( 4 x block size ), or
+                             100k + ( 2.5 x block size )
+
+       Larger  block  sizes  give  rapidly  diminishing  marginal
+       returns.  Most of the compression comes from the first two
+       or  three hundred k of block size, a fact worth bearing in
+       mind when using bzip2  on  small  machines.   It  is  also
+       important  to  appreciate  that  the  decompression memory
+       requirement is set at compression time by  the  choice  of
+       block size.
+
+       For  files  compressed  with  the default 900k block size,
+       bunzip2 will require about 3700 kbytes to decompress.   To
+       support decompression of any file on a 4 megabyte machine,
+       bunzip2 has an option to  decompress  using  approximately
+       half this amount of memory, about 2300 kbytes.  Decompres-
+       sion speed is also halved, so you should use  this  option
+       only where necessary.  The relevant flag is -s.
+
+       In general, try and use the largest block size memory con-
+       straints  allow,  since  that  maximises  the  compression
+       achieved.   Compression and decompression speed are virtu-
+       ally unaffected by block size.
+
+       Another significant point applies to files which fit in  a
+       single  block  --  that  means  most files you'd encounter
+       using a large block  size.   The  amount  of  real  memory
+       touched is proportional to the size of the file, since the
+       file is smaller than a block.  For example, compressing  a
+       file  20,000  bytes  long  with the flag -9 will cause the
+       compressor to allocate around 7600k of  memory,  but  only
+       touch 400k + 20000 * 8 = 560 kbytes of it.  Similarly, the
+       decompressor will allocate 3700k but  only  touch  100k  +
+       20000 * 4 = 180 kbytes.
+
+       Here  is a table which summarises the maximum memory usage
+       for different block sizes.  Also  recorded  is  the  total
+       compressed  size for 14 files of the Calgary Text Compres-
+       sion Corpus totalling 3,141,622 bytes.  This column  gives
+       some  feel  for  how  compression  varies with block size.
+       These figures tend to understate the advantage  of  larger
+       block  sizes  for  larger files, since the Corpus is domi-
+       nated by smaller files.
+
+                  Compress   Decompress   Decompress   Corpus
+           Flag     usage      usage       -s usage     Size
+
+            -1      1200k       500k         350k      914704
+            -2      2000k       900k         600k      877703
+            -3      2800k      1300k         850k      860338
+            -4      3600k      1700k        1100k      846899
+            -5      4400k      2100k        1350k      845160
+            -6      5200k      2500k        1600k      838626
+            -7      6100k      2900k        1850k      834096
+            -8      6800k      3300k        2100k      828642
+            -9      7600k      3700k        2350k      828642
+
+
+RECOVERING DATA FROM DAMAGED FILES
+       bzip2 compresses files in blocks, usually 900kbytes  long.
+       Each block is handled independently.  If a media or trans-
+       mission error causes a multi-block  .bz2  file  to  become
+       damaged,  it  may  be  possible  to  recover data from the
+       undamaged blocks in the file.
+
+       The compressed representation of each block  is  delimited
+       by  a  48-bit pattern, which makes it possible to find the
+       block boundaries with reasonable  certainty.   Each  block
+       also  carries its own 32-bit CRC, so damaged blocks can be
+       distinguished from undamaged ones.
+
+       bzip2recover is a  simple  program  whose  purpose  is  to
+       search  for blocks in .bz2 files, and write each block out
+       into its own .bz2 file.  You can then use bzip2 -t to test
+       the integrity of the resulting files, and decompress those
+       which are undamaged.
+
+       bzip2recover takes a single argument, the name of the dam-
+       aged    file,    and    writes    a    number   of   files
+       "rec00001file.bz2",  "rec00002file.bz2",  etc,  containing
+       the   extracted   blocks.   The   output   filenames   are
+       designed  so  that the use of wildcards in subsequent pro-
+       cessing  -- for example, "bzip2 -dc  rec*file.bz2 > recov-
+       ered_data" -- processes the files in the correct order.
+
+       bzip2recover should be of most use dealing with large .bz2
+       files,  as  these will contain many blocks.  It is clearly
+       futile to use it on damaged single-block  files,  since  a
+       damaged  block  cannot  be recovered.  If you wish to min-
+       imise any potential data loss through media  or  transmis-
+       sion errors, you might consider compressing with a smaller
+       block size.
+
+
+PERFORMANCE NOTES
+       The sorting phase of compression gathers together  similar
+       strings  in  the  file.  Because of this, files containing
+       very long runs of  repeated  symbols,  like  "aabaabaabaab
+       ..."   (repeated  several hundred times) may compress more
+       slowly than normal.  Versions 0.9.5 and  above  fare  much
+       better  than previous versions in this respect.  The ratio
+       between worst-case and average-case compression time is in
+       the  region  of  10:1.  For previous versions, this figure
+       was more like 100:1.  You can use the -vvvv option to mon-
+       itor progress in great detail, if you want.
+
+       Decompression speed is unaffected by these phenomena.
+
+       bzip2  usually  allocates  several  megabytes of memory to
+       operate in, and then charges all over it in a fairly  ran-
+       dom  fashion.   This means that performance, both for com-
+       pressing and decompressing, is largely determined  by  the
+       speed  at  which  your  machine  can service cache misses.
+       Because of this, small changes to the code to  reduce  the
+       miss  rate  have  been observed to give disproportionately
+       large performance improvements.  I imagine bzip2 will per-
+       form best on machines with very large caches.
+
+
+CAVEATS
+       I/O  error  messages  are not as helpful as they could be.
+       bzip2 tries hard to detect I/O errors  and  exit  cleanly,
+       but  the  details  of  what  the problem is sometimes seem
+       rather misleading.
+
+       This manual page pertains to version 1.0.8 of bzip2.  Com-
+       pressed  data created by this version is entirely forwards
+       and  backwards  compatible  with   the   previous   public
+       releases,  versions  0.1pl2,  0.9.0,  0.9.5, 1.0.0, 1.0.1,
+       1.0.2 and above, but with the  following  exception: 0.9.0
+       and above can  correctly decompress  multiple concatenated
+       compressed files.  0.1pl2  cannot do this;  it  will  stop
+       after  decompressing just the first file in the stream.
+
+       bzip2recover  versions prior to 1.0.2 used 32-bit integers
+       to represent bit positions in compressed  files,  so  they
+       could  not handle compressed files more than 512 megabytes
+       long.  Versions 1.0.2 and above use 64-bit  ints  on  some
+       platforms  which  support them (GNU supported targets, and
+       Windows).  To establish whether or  not  bzip2recover  was
+       built  with  such  a limitation, run it without arguments.
+       In any event you can build yourself an  unlimited  version
+       if  you  can  recompile  it  with MaybeUInt64 set to be an
+       unsigned 64-bit integer.
+
+
+AUTHOR
+       Julian Seward, jseward@acm.org
+
+       https://sourceware.org/bzip2/
+
+       The ideas embodied in bzip2 are due to (at least) the fol-
+       lowing  people: Michael Burrows and David Wheeler (for the
+       block sorting transformation), David Wheeler  (again,  for
+       the Huffman coder), Peter Fenwick (for the structured cod-
+       ing model in the original bzip, and many refinements), and
+       Alistair  Moffat,  Radford  Neal  and  Ian Witten (for the
+       arithmetic  coder  in  the  original  bzip).   I  am  much
+       indebted for their help, support and advice.  See the man-
+       ual in the source distribution for pointers to sources  of
+       documentation.  Christian von Roques encouraged me to look
+       for faster sorting algorithms, so as to speed up  compres-
+       sion.  Bela Lubkin encouraged me to improve the worst-case
+       compression performance.  Donna Robinson XMLised the docu-
+       mentation.   The bz* scripts are derived from those of GNU
+       gzip.  Many people sent patches, helped  with  portability
+       problems,  lent  machines,  gave advice and were generally
+       helpful.
+
diff --git a/third_party/bzip2/bzip2recover.c b/third_party/bzip2/bzip2recover.c
new file mode 100644
index 000000000..a8131e061
--- /dev/null
+++ b/third_party/bzip2/bzip2recover.c
@@ -0,0 +1,516 @@
+/*-----------------------------------------------------------*/
+/*--- Block recoverer program for bzip2                   ---*/
+/*---                                      bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* This program is a complete hack and should be rewritten properly.
+	 It isn't very complicated. */
+
+#include 
+#include 
+#include 
+#include 
+
+
+/* This program records bit locations in the file to be recovered.
+   That means that if 64-bit ints are not supported, we will not
+   be able to recover .bz2 files over 512MB (2^32 bits) long.
+   On GNU supported platforms, we take advantage of the 64-bit
+   int support to circumvent this problem.  Ditto MSVC.
+
+   This change occurred in version 1.0.2; all prior versions have
+   the 512MB limitation.
+*/
+#ifdef __GNUC__
+   typedef  unsigned long long int  MaybeUInt64;
+#  define MaybeUInt64_FMT "%Lu"
+#else
+#ifdef _MSC_VER
+   typedef  unsigned __int64  MaybeUInt64;
+#  define MaybeUInt64_FMT "%I64u"
+#else
+   typedef  unsigned int   MaybeUInt64;
+#  define MaybeUInt64_FMT "%u"
+#endif
+#endif
+
+typedef  unsigned int   UInt32;
+typedef  int            Int32;
+typedef  unsigned char  UChar;
+typedef  char           Char;
+typedef  unsigned char  Bool;
+#define True    ((Bool)1)
+#define False   ((Bool)0)
+
+
+#define BZ_MAX_FILENAME 2000
+
+Char inFileName[BZ_MAX_FILENAME];
+Char outFileName[BZ_MAX_FILENAME];
+Char progName[BZ_MAX_FILENAME];
+
+MaybeUInt64 bytesOut = 0;
+MaybeUInt64 bytesIn  = 0;
+
+
+/*---------------------------------------------------*/
+/*--- Header bytes                                ---*/
+/*---------------------------------------------------*/
+
+#define BZ_HDR_B 0x42                         /* 'B' */
+#define BZ_HDR_Z 0x5a                         /* 'Z' */
+#define BZ_HDR_h 0x68                         /* 'h' */
+#define BZ_HDR_0 0x30                         /* '0' */
+ 
+
+/*---------------------------------------------------*/
+/*--- I/O errors                                  ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------*/
+static void readError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void writeError ( void )
+{
+   fprintf ( stderr,
+             "%s: I/O error reading `%s', possible reason follows.\n",
+            progName, inFileName );
+   perror ( progName );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void mallocFail ( Int32 n )
+{
+   fprintf ( stderr,
+             "%s: malloc failed on request for %d bytes.\n",
+            progName, n );
+   fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+/*---------------------------------------------*/
+static void tooManyBlocks ( Int32 max_handled_blocks )
+{
+   fprintf ( stderr,
+             "%s: `%s' appears to contain more than %d blocks\n",
+            progName, inFileName, max_handled_blocks );
+   fprintf ( stderr,
+             "%s: and cannot be handled.  To fix, increase\n",
+             progName );
+   fprintf ( stderr, 
+             "%s: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.\n",
+             progName );
+   exit ( 1 );
+}
+
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+typedef
+   struct {
+      FILE*  handle;
+      Int32  buffer;
+      Int32  buffLive;
+      Char   mode;
+   }
+   BitStream;
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenReadStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'r';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static BitStream* bsOpenWriteStream ( FILE* stream )
+{
+   BitStream *bs = malloc ( sizeof(BitStream) );
+   if (bs == NULL) mallocFail ( sizeof(BitStream) );
+   bs->handle = stream;
+   bs->buffer = 0;
+   bs->buffLive = 0;
+   bs->mode = 'w';
+   return bs;
+}
+
+
+/*---------------------------------------------*/
+static void bsPutBit ( BitStream* bs, Int32 bit )
+{
+   if (bs->buffLive == 8) {
+      Int32 retVal = putc ( (UChar) bs->buffer, bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      bs->buffLive = 1;
+      bs->buffer = bit & 0x1;
+   } else {
+      bs->buffer = ( (bs->buffer << 1) | (bit & 0x1) );
+      bs->buffLive++;
+   };
+}
+
+
+/*---------------------------------------------*/
+/*--
+   Returns 0 or 1, or 2 to indicate EOF.
+--*/
+static Int32 bsGetBit ( BitStream* bs )
+{
+   if (bs->buffLive > 0) {
+      bs->buffLive --;
+      return ( ((bs->buffer) >> (bs->buffLive)) & 0x1 );
+   } else {
+      Int32 retVal = getc ( bs->handle );
+      if ( retVal == EOF ) {
+         if (errno != 0) readError();
+         return 2;
+      }
+      bs->buffLive = 7;
+      bs->buffer = retVal;
+      return ( ((bs->buffer) >> 7) & 0x1 );
+   }
+}
+
+
+/*---------------------------------------------*/
+static void bsClose ( BitStream* bs )
+{
+   Int32 retVal;
+
+   if ( bs->mode == 'w' ) {
+      while ( bs->buffLive < 8 ) {
+         bs->buffLive++;
+         bs->buffer <<= 1;
+      };
+      retVal = putc ( (UChar) (bs->buffer), bs->handle );
+      if (retVal == EOF) writeError();
+      bytesOut++;
+      retVal = fflush ( bs->handle );
+      if (retVal == EOF) writeError();
+   }
+   retVal = fclose ( bs->handle );
+   if (retVal == EOF) {
+      if (bs->mode == 'w') writeError(); else readError();
+   }
+   free ( bs );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUChar ( BitStream* bs, UChar c )
+{
+   Int32 i;
+   for (i = 7; i >= 0; i--)
+      bsPutBit ( bs, (((UInt32) c) >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static void bsPutUInt32 ( BitStream* bs, UInt32 c )
+{
+   Int32 i;
+
+   for (i = 31; i >= 0; i--)
+      bsPutBit ( bs, (c >> i) & 0x1 );
+}
+
+
+/*---------------------------------------------*/
+static Bool endsInBz2 ( Char* name )
+{
+   Int32 n = strlen ( name );
+   if (n <= 4) return False;
+   return
+      (name[n-4] == '.' &&
+       name[n-3] == 'b' &&
+       name[n-2] == 'z' &&
+       name[n-1] == '2');
+}
+
+
+/*---------------------------------------------------*/
+/*---                                             ---*/
+/*---------------------------------------------------*/
+
+/* This logic isn't really right when it comes to Cygwin. */
+#ifdef _WIN32
+#  define  BZ_SPLIT_SYM  '\\'  /* path splitter on Windows platform */
+#else
+#  define  BZ_SPLIT_SYM  '/'   /* path splitter on Unix platform */
+#endif
+
+#define BLOCK_HEADER_HI  0x00003141UL
+#define BLOCK_HEADER_LO  0x59265359UL
+
+#define BLOCK_ENDMARK_HI 0x00001772UL
+#define BLOCK_ENDMARK_LO 0x45385090UL
+
+/* Increase if necessary.  However, a .bz2 file with > 50000 blocks
+   would have an uncompressed size of at least 40GB, so the chances
+   are low you'll need to up this.
+*/
+#define BZ_MAX_HANDLED_BLOCKS 50000
+
+MaybeUInt64 bStart [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 bEnd   [BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbStart[BZ_MAX_HANDLED_BLOCKS];
+MaybeUInt64 rbEnd  [BZ_MAX_HANDLED_BLOCKS];
+
+Int32 main ( Int32 argc, Char** argv )
+{
+   FILE*       inFile;
+   FILE*       outFile;
+   BitStream*  bsIn, *bsWr;
+   Int32       b, wrBlock, currBlock, rbCtr;
+   MaybeUInt64 bitsRead;
+
+   UInt32      buffHi, buffLo, blockCRC;
+   Char*       p;
+
+   strncpy ( progName, argv[0], BZ_MAX_FILENAME-1);
+   progName[BZ_MAX_FILENAME-1]='\0';
+   inFileName[0] = outFileName[0] = 0;
+
+   fprintf ( stderr, 
+             "bzip2recover 1.0.8: extracts blocks from damaged .bz2 files.\n" );
+
+   if (argc != 2) {
+      fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
+                        progName, progName );
+      switch (sizeof(MaybeUInt64)) {
+         case 8:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: None\n");
+            break;
+         case 4:
+            fprintf(stderr, 
+                    "\trestrictions on size of recovered file: 512 MB\n");
+            fprintf(stderr, 
+                    "\tto circumvent, recompile with MaybeUInt64 as an\n"
+                    "\tunsigned 64-bit int.\n");
+            break;
+         default:
+            fprintf(stderr, 
+                    "\tsizeof(MaybeUInt64) is not 4 or 8 -- "
+                    "configuration error.\n");
+            break;
+      }
+      exit(1);
+   }
+
+   if (strlen(argv[1]) >= BZ_MAX_FILENAME-20) {
+      fprintf ( stderr, 
+                "%s: supplied filename is suspiciously (>= %d chars) long.  Bye!\n",
+                progName, (int)strlen(argv[1]) );
+      exit(1);
+   }
+
+   strcpy ( inFileName, argv[1] );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't read `%s'\n", progName, inFileName );
+      exit(1);
+   }
+
+   bsIn = bsOpenReadStream ( inFile );
+   fprintf ( stderr, "%s: searching for block boundaries ...\n", progName );
+
+   bitsRead = 0;
+   buffHi = buffLo = 0;
+   currBlock = 0;
+   bStart[currBlock] = 0;
+
+   rbCtr = 0;
+
+   while (True) {
+      b = bsGetBit ( bsIn );
+      bitsRead++;
+      if (b == 2) {
+         if (bitsRead >= bStart[currBlock] &&
+            (bitsRead - bStart[currBlock]) >= 40) {
+            bEnd[currBlock] = bitsRead-1;
+            if (currBlock > 0)
+               fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                                 " to " MaybeUInt64_FMT " (incomplete)\n",
+                         currBlock,  bStart[currBlock], bEnd[currBlock] );
+         } else
+            currBlock--;
+         break;
+      }
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if ( ( (buffHi & 0x0000ffff) == BLOCK_HEADER_HI 
+             && buffLo == BLOCK_HEADER_LO)
+           || 
+           ( (buffHi & 0x0000ffff) == BLOCK_ENDMARK_HI 
+             && buffLo == BLOCK_ENDMARK_LO)
+         ) {
+         if (bitsRead > 49) {
+            bEnd[currBlock] = bitsRead-49;
+         } else {
+            bEnd[currBlock] = 0;
+         }
+         if (currBlock > 0 &&
+	     (bEnd[currBlock] - bStart[currBlock]) >= 130) {
+            fprintf ( stderr, "   block %d runs from " MaybeUInt64_FMT 
+                              " to " MaybeUInt64_FMT "\n",
+                      rbCtr+1,  bStart[currBlock], bEnd[currBlock] );
+            rbStart[rbCtr] = bStart[currBlock];
+            rbEnd[rbCtr] = bEnd[currBlock];
+            rbCtr++;
+         }
+         if (currBlock >= BZ_MAX_HANDLED_BLOCKS)
+            tooManyBlocks(BZ_MAX_HANDLED_BLOCKS);
+         currBlock++;
+
+         bStart[currBlock] = bitsRead;
+      }
+   }
+
+   bsClose ( bsIn );
+
+   /*-- identified blocks run from 1 to rbCtr inclusive. --*/
+
+   if (rbCtr < 1) {
+      fprintf ( stderr,
+                "%s: sorry, I couldn't find any block boundaries.\n",
+                progName );
+      exit(1);
+   };
+
+   fprintf ( stderr, "%s: splitting into blocks\n", progName );
+
+   inFile = fopen ( inFileName, "rb" );
+   if (inFile == NULL) {
+      fprintf ( stderr, "%s: can't open `%s'\n", progName, inFileName );
+      exit(1);
+   }
+   bsIn = bsOpenReadStream ( inFile );
+
+   /*-- placate gcc's dataflow analyser --*/
+   blockCRC = 0; bsWr = 0;
+
+   bitsRead = 0;
+   outFile = NULL;
+   wrBlock = 0;
+   while (True) {
+      b = bsGetBit(bsIn);
+      if (b == 2) break;
+      buffHi = (buffHi << 1) | (buffLo >> 31);
+      buffLo = (buffLo << 1) | (b & 1);
+      if (bitsRead == 47+rbStart[wrBlock]) 
+         blockCRC = (buffHi << 16) | (buffLo >> 16);
+
+      if (outFile != NULL && bitsRead >= rbStart[wrBlock]
+                          && bitsRead <= rbEnd[wrBlock]) {
+         bsPutBit ( bsWr, b );
+      }
+
+      bitsRead++;
+
+      if (bitsRead == rbEnd[wrBlock]+1) {
+         if (outFile != NULL) {
+            bsPutUChar ( bsWr, 0x17 ); bsPutUChar ( bsWr, 0x72 );
+            bsPutUChar ( bsWr, 0x45 ); bsPutUChar ( bsWr, 0x38 );
+            bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
+            bsPutUInt32 ( bsWr, blockCRC );
+            bsClose ( bsWr );
+            outFile = NULL;
+         }
+         if (wrBlock >= rbCtr) break;
+         wrBlock++;
+      } else
+      if (bitsRead == rbStart[wrBlock]) {
+         /* Create the output file name, correctly handling leading paths. 
+            (31.10.2001 by Sergey E. Kusikov) */
+         Char* split;
+         Int32 ofs, k;
+         for (k = 0; k < BZ_MAX_FILENAME; k++) 
+            outFileName[k] = 0;
+         strcpy (outFileName, inFileName);
+         split = strrchr (outFileName, BZ_SPLIT_SYM);
+         if (split == NULL) {
+            split = outFileName;
+         } else {
+            ++split;
+	 }
+	 /* Now split points to the start of the basename. */
+         ofs  = split - outFileName;
+         sprintf (split, "rec%5d", wrBlock+1);
+         for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
+         strcat (outFileName, inFileName + ofs);
+
+         if ( !endsInBz2(outFileName)) strcat ( outFileName, ".bz2" );
+
+         fprintf ( stderr, "   writing block %d to `%s' ...\n",
+                           wrBlock+1, outFileName );
+
+         outFile = fopen ( outFileName, "wb" );
+         if (outFile == NULL) {
+            fprintf ( stderr, "%s: can't write `%s'\n",
+                      progName, outFileName );
+            exit(1);
+         }
+         bsWr = bsOpenWriteStream ( outFile );
+         bsPutUChar ( bsWr, BZ_HDR_B );    
+         bsPutUChar ( bsWr, BZ_HDR_Z );    
+         bsPutUChar ( bsWr, BZ_HDR_h );    
+         bsPutUChar ( bsWr, BZ_HDR_0 + 9 );
+         bsPutUChar ( bsWr, 0x31 ); bsPutUChar ( bsWr, 0x41 );
+         bsPutUChar ( bsWr, 0x59 ); bsPutUChar ( bsWr, 0x26 );
+         bsPutUChar ( bsWr, 0x53 ); bsPutUChar ( bsWr, 0x59 );
+      }
+   }
+
+   fprintf ( stderr, "%s: finished\n", progName );
+   return 0;
+}
+
+
+
+/*-----------------------------------------------------------*/
+/*--- end                                  bzip2recover.c ---*/
+/*-----------------------------------------------------------*/
diff --git a/third_party/bzip2/bzlib.c b/third_party/bzip2/bzlib.c
new file mode 100644
index 000000000..21786551b
--- /dev/null
+++ b/third_party/bzip2/bzlib.c
@@ -0,0 +1,1572 @@
+
+/*-------------------------------------------------------------*/
+/*--- Library top-level functions.                          ---*/
+/*---                                               bzlib.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+/* CHANGES
+   0.9.0    -- original version.
+   0.9.0a/b -- no changes in this file.
+   0.9.0c   -- made zero-length BZ_FLUSH work correctly in bzCompress().
+     fixed bzWrite/bzRead to ignore zero-length requests.
+     fixed bzread to correctly handle read requests after EOF.
+     wrong parameter order in call to bzDecompressInit in
+     bzBuffToBuffDecompress.  Fixed.
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Compression stuff                           ---*/
+/*---------------------------------------------------*/
+
+
+/*---------------------------------------------------*/
+#ifndef BZ_NO_STDIO
+void BZ2_bz__AssertH__fail ( int errcode )
+{
+   fprintf(stderr, 
+      "\n\nbzip2/libbzip2: internal error number %d.\n"
+      "This is a bug in bzip2/libbzip2, %s.\n"
+      "Please report it to: bzip2-devel@sourceware.org.  If this happened\n"
+      "when you were using some program which uses libbzip2 as a\n"
+      "component, you should also report this bug to the author(s)\n"
+      "of that program.  Please make an effort to report this bug;\n"
+      "timely and accurate bug reports eventually lead to higher\n"
+      "quality software.  Thanks.\n\n",
+      errcode,
+      BZ2_bzlibVersion()
+   );
+
+   if (errcode == 1007) {
+   fprintf(stderr,
+      "\n*** A special note about internal error number 1007 ***\n"
+      "\n"
+      "Experience suggests that a common cause of i.e. 1007\n"
+      "is unreliable memory or other hardware.  The 1007 assertion\n"
+      "just happens to cross-check the results of huge numbers of\n"
+      "memory reads/writes, and so acts (unintendedly) as a stress\n"
+      "test of your memory system.\n"
+      "\n"
+      "I suggest the following: try compressing the file again,\n"
+      "possibly monitoring progress in detail with the -vv flag.\n"
+      "\n"
+      "* If the error cannot be reproduced, and/or happens at different\n"
+      "  points in compression, you may have a flaky memory system.\n"
+      "  Try a memory-test program.  I have used Memtest86\n"
+      "  (www.memtest86.com).  At the time of writing it is free (GPLd).\n"
+      "  Memtest86 tests memory much more thorougly than your BIOSs\n"
+      "  power-on test, and may find failures that the BIOS doesn't.\n"
+      "\n"
+      "* If the error can be repeatably reproduced, this is a bug in\n"
+      "  bzip2, and I would very much like to hear about it.  Please\n"
+      "  let me know, and, ideally, save a copy of the file causing the\n"
+      "  problem -- without which I will be unable to investigate it.\n"
+      "\n"
+   );
+   }
+
+   exit(3);
+}
+#endif
+
+
+/*---------------------------------------------------*/
+static
+int bz_config_ok ( void )
+{
+   if (sizeof(int)   != 4) return 0;
+   if (sizeof(short) != 2) return 0;
+   if (sizeof(char)  != 1) return 0;
+   return 1;
+}
+
+
+/*---------------------------------------------------*/
+static
+void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
+{
+   void* v = malloc ( items * size );
+   return v;
+}
+
+static
+void default_bzfree ( void* opaque, void* addr )
+{
+   if (addr != NULL) free ( addr );
+}
+
+
+/*---------------------------------------------------*/
+static
+void prepare_new_block ( EState* s )
+{
+   Int32 i;
+   s->nblock = 0;
+   s->numZ = 0;
+   s->state_out_pos = 0;
+   BZ_INITIALISE_CRC ( s->blockCRC );
+   for (i = 0; i < 256; i++) s->inUse[i] = False;
+   s->blockNo++;
+}
+
+
+/*---------------------------------------------------*/
+static
+void init_RL ( EState* s )
+{
+   s->state_in_ch  = 256;
+   s->state_in_len = 0;
+}
+
+
+static
+Bool isempty_RL ( EState* s )
+{
+   if (s->state_in_ch < 256 && s->state_in_len > 0)
+      return False; else
+      return True;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressInit) 
+                    ( bz_stream* strm, 
+                     int        blockSize100k,
+                     int        verbosity,
+                     int        workFactor )
+{
+   Int32   n;
+   EState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL || 
+       blockSize100k < 1 || blockSize100k > 9 ||
+       workFactor < 0 || workFactor > 250)
+     return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(EState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm = strm;
+
+   s->arr1 = NULL;
+   s->arr2 = NULL;
+   s->ftab = NULL;
+
+   n       = 100000 * blockSize100k;
+   s->arr1 = BZALLOC( n                  * sizeof(UInt32) );
+   s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
+   s->ftab = BZALLOC( 65537              * sizeof(UInt32) );
+
+   if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
+      if (s->arr1 != NULL) BZFREE(s->arr1);
+      if (s->arr2 != NULL) BZFREE(s->arr2);
+      if (s->ftab != NULL) BZFREE(s->ftab);
+      if (s       != NULL) BZFREE(s);
+      return BZ_MEM_ERROR;
+   }
+
+   s->blockNo           = 0;
+   s->state             = BZ_S_INPUT;
+   s->mode              = BZ_M_RUNNING;
+   s->combinedCRC       = 0;
+   s->blockSize100k     = blockSize100k;
+   s->nblockMAX         = 100000 * blockSize100k - 19;
+   s->verbosity         = verbosity;
+   s->workFactor        = workFactor;
+
+   s->block             = (UChar*)s->arr2;
+   s->mtfv              = (UInt16*)s->arr1;
+   s->zbits             = NULL;
+   s->ptr               = (UInt32*)s->arr1;
+
+   strm->state          = s;
+   strm->total_in_lo32  = 0;
+   strm->total_in_hi32  = 0;
+   strm->total_out_lo32 = 0;
+   strm->total_out_hi32 = 0;
+   init_RL ( s );
+   prepare_new_block ( s );
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+static
+void add_pair_to_block ( EState* s )
+{
+   Int32 i;
+   UChar ch = (UChar)(s->state_in_ch);
+   for (i = 0; i < s->state_in_len; i++) {
+      BZ_UPDATE_CRC( s->blockCRC, ch );
+   }
+   s->inUse[s->state_in_ch] = True;
+   switch (s->state_in_len) {
+      case 1:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 2:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      case 3:
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         break;
+      default:
+         s->inUse[s->state_in_len-4] = True;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = (UChar)ch; s->nblock++;
+         s->block[s->nblock] = ((UChar)(s->state_in_len-4));
+         s->nblock++;
+         break;
+   }
+}
+
+
+/*---------------------------------------------------*/
+static
+void flush_RL ( EState* s )
+{
+   if (s->state_in_ch < 256) add_pair_to_block ( s );
+   init_RL ( s );
+}
+
+
+/*---------------------------------------------------*/
+#define ADD_CHAR_TO_BLOCK(zs,zchh0)               \
+{                                                 \
+   UInt32 zchh = (UInt32)(zchh0);                 \
+   /*-- fast track the common case --*/           \
+   if (zchh != zs->state_in_ch &&                 \
+       zs->state_in_len == 1) {                   \
+      UChar ch = (UChar)(zs->state_in_ch);        \
+      BZ_UPDATE_CRC( zs->blockCRC, ch );          \
+      zs->inUse[zs->state_in_ch] = True;          \
+      zs->block[zs->nblock] = (UChar)ch;          \
+      zs->nblock++;                               \
+      zs->state_in_ch = zchh;                     \
+   }                                              \
+   else                                           \
+   /*-- general, uncommon cases --*/              \
+   if (zchh != zs->state_in_ch ||                 \
+      zs->state_in_len == 255) {                  \
+      if (zs->state_in_ch < 256)                  \
+         add_pair_to_block ( zs );                \
+      zs->state_in_ch = zchh;                     \
+      zs->state_in_len = 1;                       \
+   } else {                                       \
+      zs->state_in_len++;                         \
+   }                                              \
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_input_until_stop ( EState* s )
+{
+   Bool progress_in = False;
+
+   if (s->mode == BZ_M_RUNNING) {
+
+      /*-- fast track the common case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         s->strm->next_in++;
+         s->strm->avail_in--;
+         s->strm->total_in_lo32++;
+         if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+      }
+
+   } else {
+
+      /*-- general, uncommon case --*/
+      while (True) {
+         /*-- block full? --*/
+         if (s->nblock >= s->nblockMAX) break;
+         /*-- no input? --*/
+         if (s->strm->avail_in == 0) break;
+         /*-- flush/finish end? --*/
+         if (s->avail_in_expect == 0) break;
+         progress_in = True;
+         ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); 
+         s->strm->next_in++;
+         s->strm->avail_in--;
+         s->strm->total_in_lo32++;
+         if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++;
+         s->avail_in_expect--;
+      }
+   }
+   return progress_in;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool copy_output_until_stop ( EState* s )
+{
+   Bool progress_out = False;
+
+   while (True) {
+
+      /*-- no output space? --*/
+      if (s->strm->avail_out == 0) break;
+
+      /*-- block done? --*/
+      if (s->state_out_pos >= s->numZ) break;
+
+      progress_out = True;
+      *(s->strm->next_out) = s->zbits[s->state_out_pos];
+      s->state_out_pos++;
+      s->strm->avail_out--;
+      s->strm->next_out++;
+      s->strm->total_out_lo32++;
+      if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+   }
+
+   return progress_out;
+}
+
+
+/*---------------------------------------------------*/
+static
+Bool handle_compress ( bz_stream* strm )
+{
+   Bool progress_in  = False;
+   Bool progress_out = False;
+   EState* s = strm->state;
+   
+   while (True) {
+
+      if (s->state == BZ_S_OUTPUT) {
+         progress_out |= copy_output_until_stop ( s );
+         if (s->state_out_pos < s->numZ) break;
+         if (s->mode == BZ_M_FINISHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+         prepare_new_block ( s );
+         s->state = BZ_S_INPUT;
+         if (s->mode == BZ_M_FLUSHING && 
+             s->avail_in_expect == 0 &&
+             isempty_RL(s)) break;
+      }
+
+      if (s->state == BZ_S_INPUT) {
+         progress_in |= copy_input_until_stop ( s );
+         if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) {
+            flush_RL ( s );
+            BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->nblock >= s->nblockMAX) {
+            BZ2_compressBlock ( s, False );
+            s->state = BZ_S_OUTPUT;
+         }
+         else
+         if (s->strm->avail_in == 0) {
+            break;
+         }
+      }
+
+   }
+
+   return progress_in || progress_out;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
+{
+   Bool progress;
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   preswitch:
+   switch (s->mode) {
+
+      case BZ_M_IDLE:
+         return BZ_SEQUENCE_ERROR;
+
+      case BZ_M_RUNNING:
+         if (action == BZ_RUN) {
+            progress = handle_compress ( strm );
+            return progress ? BZ_RUN_OK : BZ_PARAM_ERROR;
+         } 
+         else
+	 if (action == BZ_FLUSH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FLUSHING;
+            goto preswitch;
+         }
+         else
+         if (action == BZ_FINISH) {
+            s->avail_in_expect = strm->avail_in;
+            s->mode = BZ_M_FINISHING;
+            goto preswitch;
+         }
+         else 
+            return BZ_PARAM_ERROR;
+
+      case BZ_M_FLUSHING:
+         if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FLUSH_OK;
+         s->mode = BZ_M_RUNNING;
+         return BZ_RUN_OK;
+
+      case BZ_M_FINISHING:
+         if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect != s->strm->avail_in) 
+            return BZ_SEQUENCE_ERROR;
+         progress = handle_compress ( strm );
+         if (!progress) return BZ_SEQUENCE_ERROR;
+         if (s->avail_in_expect > 0 || !isempty_RL(s) ||
+             s->state_out_pos < s->numZ) return BZ_FINISH_OK;
+         s->mode = BZ_M_IDLE;
+         return BZ_STREAM_END;
+   }
+   return BZ_OK; /*--not reached--*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzCompressEnd)  ( bz_stream *strm )
+{
+   EState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->arr1 != NULL) BZFREE(s->arr1);
+   if (s->arr2 != NULL) BZFREE(s->arr2);
+   if (s->ftab != NULL) BZFREE(s->ftab);
+   BZFREE(strm->state);
+
+   strm->state = NULL;   
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/*--- Decompression stuff                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressInit) 
+                     ( bz_stream* strm, 
+                       int        verbosity,
+                       int        small )
+{
+   DState* s;
+
+   if (!bz_config_ok()) return BZ_CONFIG_ERROR;
+
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   if (small != 0 && small != 1) return BZ_PARAM_ERROR;
+   if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR;
+
+   if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
+   if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
+
+   s = BZALLOC( sizeof(DState) );
+   if (s == NULL) return BZ_MEM_ERROR;
+   s->strm                  = strm;
+   strm->state              = s;
+   s->state                 = BZ_X_MAGIC_1;
+   s->bsLive                = 0;
+   s->bsBuff                = 0;
+   s->calculatedCombinedCRC = 0;
+   strm->total_in_lo32      = 0;
+   strm->total_in_hi32      = 0;
+   strm->total_out_lo32     = 0;
+   strm->total_out_hi32     = 0;
+   s->smallDecompress       = (Bool)small;
+   s->ll4                   = NULL;
+   s->ll16                  = NULL;
+   s->tt                    = NULL;
+   s->currBlockNo           = 0;
+   s->verbosity             = verbosity;
+
+   return BZ_OK;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_FAST ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+               
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      /* restore */
+      UInt32        c_calculatedBlockCRC = s->calculatedBlockCRC;
+      UChar         c_state_out_ch       = s->state_out_ch;
+      Int32         c_state_out_len      = s->state_out_len;
+      Int32         c_nblock_used        = s->nblock_used;
+      Int32         c_k0                 = s->k0;
+      UInt32*       c_tt                 = s->tt;
+      UInt32        c_tPos               = s->tPos;
+      char*         cs_next_out          = s->strm->next_out;
+      unsigned int  cs_avail_out         = s->strm->avail_out;
+      Int32         ro_blockSize100k     = s->blockSize100k;
+      /* end restore */
+
+      UInt32       avail_out_INIT = cs_avail_out;
+      Int32        s_save_nblockPP = s->save_nblock+1;
+      unsigned int total_out_lo32_old;
+
+      while (True) {
+
+         /* try to finish existing run */
+         if (c_state_out_len > 0) {
+            while (True) {
+               if (cs_avail_out == 0) goto return_notr;
+               if (c_state_out_len == 1) break;
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               c_state_out_len--;
+               cs_next_out++;
+               cs_avail_out--;
+            }
+            s_state_out_len_eq_one:
+            {
+               if (cs_avail_out == 0) { 
+                  c_state_out_len = 1; goto return_notr;
+               };
+               *( (UChar*)(cs_next_out) ) = c_state_out_ch;
+               BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch );
+               cs_next_out++;
+               cs_avail_out--;
+            }
+         }   
+         /* Only caused by corrupt data stream? */
+         if (c_nblock_used > s_save_nblockPP)
+            return True;
+
+         /* can a new run be started? */
+         if (c_nblock_used == s_save_nblockPP) {
+            c_state_out_len = 0; goto return_notr;
+         };   
+         c_state_out_ch = c_k0;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (k1 != c_k0) { 
+            c_k0 = k1; goto s_state_out_len_eq_one; 
+         };
+         if (c_nblock_used == s_save_nblockPP) 
+            goto s_state_out_len_eq_one;
+   
+         c_state_out_len = 2;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         c_state_out_len = 3;
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         if (c_nblock_used == s_save_nblockPP) continue;
+         if (k1 != c_k0) { c_k0 = k1; continue; };
+   
+         BZ_GET_FAST_C(k1); c_nblock_used++;
+         c_state_out_len = ((Int32)k1) + 4;
+         BZ_GET_FAST_C(c_k0); c_nblock_used++;
+      }
+
+      return_notr:
+      total_out_lo32_old = s->strm->total_out_lo32;
+      s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out);
+      if (s->strm->total_out_lo32 < total_out_lo32_old)
+         s->strm->total_out_hi32++;
+
+      /* save */
+      s->calculatedBlockCRC = c_calculatedBlockCRC;
+      s->state_out_ch       = c_state_out_ch;
+      s->state_out_len      = c_state_out_len;
+      s->nblock_used        = c_nblock_used;
+      s->k0                 = c_k0;
+      s->tt                 = c_tt;
+      s->tPos               = c_tPos;
+      s->strm->next_out     = cs_next_out;
+      s->strm->avail_out    = cs_avail_out;
+      /* end save */
+   }
+   return False;
+}
+
+
+
+/*---------------------------------------------------*/
+__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
+{
+   Int32 nb, na, mid;
+   nb = 0;
+   na = 256;
+   do {
+      mid = (nb + na) >> 1;
+      if (indx >= cftab[mid]) nb = mid; else na = mid;
+   }
+   while (na - nb != 1);
+   return nb;
+}
+
+
+/*---------------------------------------------------*/
+/* Return  True iff data corruption is discovered.
+   Returns False if there is no problem.
+*/
+static
+Bool unRLE_obuf_to_output_SMALL ( DState* s )
+{
+   UChar k1;
+
+   if (s->blockRandomised) {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; 
+         k1 ^= BZ_RAND_MASK; s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; 
+         s->k0 ^= BZ_RAND_MASK; s->nblock_used++;
+      }
+
+   } else {
+
+      while (True) {
+         /* try to finish existing run */
+         while (True) {
+            if (s->strm->avail_out == 0) return False;
+            if (s->state_out_len == 0) break;
+            *( (UChar*)(s->strm->next_out) ) = s->state_out_ch;
+            BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch );
+            s->state_out_len--;
+            s->strm->next_out++;
+            s->strm->avail_out--;
+            s->strm->total_out_lo32++;
+            if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++;
+         }
+   
+         /* can a new run be started? */
+         if (s->nblock_used == s->save_nblock+1) return False;
+
+         /* Only caused by corrupt data stream? */
+         if (s->nblock_used > s->save_nblock+1)
+            return True;
+   
+         s->state_out_len = 1;
+         s->state_out_ch = s->k0;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 2;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         s->state_out_len = 3;
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         if (s->nblock_used == s->save_nblock+1) continue;
+         if (k1 != s->k0) { s->k0 = k1; continue; };
+   
+         BZ_GET_SMALL(k1); s->nblock_used++;
+         s->state_out_len = ((Int32)k1) + 4;
+         BZ_GET_SMALL(s->k0); s->nblock_used++;
+      }
+
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
+{
+   Bool    corrupt;
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   while (True) {
+      if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR;
+      if (s->state == BZ_X_OUTPUT) {
+         if (s->smallDecompress)
+            corrupt = unRLE_obuf_to_output_SMALL ( s ); else
+            corrupt = unRLE_obuf_to_output_FAST  ( s );
+         if (corrupt) return BZ_DATA_ERROR;
+         if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) {
+            BZ_FINALISE_CRC ( s->calculatedBlockCRC );
+            if (s->verbosity >= 3) 
+               VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, 
+                          s->calculatedBlockCRC );
+            if (s->verbosity >= 2) VPrintf0 ( "]" );
+            if (s->calculatedBlockCRC != s->storedBlockCRC)
+               return BZ_DATA_ERROR;
+            s->calculatedCombinedCRC 
+               = (s->calculatedCombinedCRC << 1) | 
+                    (s->calculatedCombinedCRC >> 31);
+            s->calculatedCombinedCRC ^= s->calculatedBlockCRC;
+            s->state = BZ_X_BLKHDR_1;
+         } else {
+            return BZ_OK;
+         }
+      }
+      if (s->state >= BZ_X_MAGIC_1) {
+         Int32 r = BZ2_decompress ( s );
+         if (r == BZ_STREAM_END) {
+            if (s->verbosity >= 3)
+               VPrintf2 ( "\n    combined CRCs: stored = 0x%08x, computed = 0x%08x", 
+                          s->storedCombinedCRC, s->calculatedCombinedCRC );
+            if (s->calculatedCombinedCRC != s->storedCombinedCRC)
+               return BZ_DATA_ERROR;
+            return r;
+         }
+         if (s->state != BZ_X_OUTPUT) return r;
+      }
+   }
+
+   AssertH ( 0, 6001 );
+
+   return 0;  /*NOTREACHED*/
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzDecompressEnd)  ( bz_stream *strm )
+{
+   DState* s;
+   if (strm == NULL) return BZ_PARAM_ERROR;
+   s = strm->state;
+   if (s == NULL) return BZ_PARAM_ERROR;
+   if (s->strm != strm) return BZ_PARAM_ERROR;
+
+   if (s->tt   != NULL) BZFREE(s->tt);
+   if (s->ll16 != NULL) BZFREE(s->ll16);
+   if (s->ll4  != NULL) BZFREE(s->ll4);
+
+   BZFREE(strm->state);
+   strm->state = NULL;
+
+   return BZ_OK;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+/*--- File I/O stuff                              ---*/
+/*---------------------------------------------------*/
+
+#define BZ_SETERR(eee)                    \
+{                                         \
+   if (bzerror != NULL) *bzerror = eee;   \
+   if (bzf != NULL) bzf->lastErr = eee;   \
+}
+
+typedef 
+   struct {
+      FILE*     handle;
+      Char      buf[BZ_MAX_UNUSED];
+      Int32     bufN;
+      Bool      writing;
+      bz_stream strm;
+      Int32     lastErr;
+      Bool      initialisedOk;
+   }
+   bzFile;
+
+
+/*---------------------------------------------*/
+static Bool myfeof ( FILE* f )
+{
+   Int32 c = fgetc ( f );
+   if (c == EOF) return True;
+   ungetc ( c, f );
+   return False;
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzWriteOpen) 
+                    ( int*  bzerror,      
+                      FILE* f, 
+                      int   blockSize100k, 
+                      int   verbosity,
+                      int   workFactor )
+{
+   Int32   ret;
+   bzFile* bzf = NULL;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL ||
+       (blockSize100k < 1 || blockSize100k > 9) ||
+       (workFactor < 0 || workFactor > 250) ||
+       (verbosity < 0 || verbosity > 4))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+   bzf->initialisedOk = False;
+   bzf->bufN          = 0;
+   bzf->handle        = f;
+   bzf->writing       = True;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+
+   if (workFactor == 0) workFactor = 30;
+   ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = 0;
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWrite)
+             ( int*    bzerror, 
+               BZFILE* b, 
+               void*   buf, 
+               int     len )
+{
+   Int32 n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return; };
+
+   bzf->strm.avail_in = len;
+   bzf->strm.next_in  = buf;
+
+   while (True) {
+      bzf->strm.avail_out = BZ_MAX_UNUSED;
+      bzf->strm.next_out = bzf->buf;
+      ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN );
+      if (ret != BZ_RUN_OK)
+         { BZ_SETERR(ret); return; };
+
+      if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+         n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+         n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                       n, bzf->handle );
+         if (n != n2 || ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return; };
+      }
+
+      if (bzf->strm.avail_in == 0)
+         { BZ_SETERR(BZ_OK); return; };
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzWriteClose)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in,
+                    unsigned int* nbytes_out )
+{
+   BZ2_bzWriteClose64 ( bzerror, b, abandon, 
+                        nbytes_in, NULL, nbytes_out, NULL );
+}
+
+
+void BZ_API(BZ2_bzWriteClose64)
+                  ( int*          bzerror, 
+                    BZFILE*       b, 
+                    int           abandon,
+                    unsigned int* nbytes_in_lo32,
+                    unsigned int* nbytes_in_hi32,
+                    unsigned int* nbytes_out_lo32,
+                    unsigned int* nbytes_out_hi32 )
+{
+   Int32   n, n2, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+   if (!(bzf->writing))
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (ferror(bzf->handle))
+      { BZ_SETERR(BZ_IO_ERROR); return; };
+
+   if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0;
+   if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0;
+   if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0;
+   if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0;
+
+   if ((!abandon) && bzf->lastErr == BZ_OK) {
+      while (True) {
+         bzf->strm.avail_out = BZ_MAX_UNUSED;
+         bzf->strm.next_out = bzf->buf;
+         ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH );
+         if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END)
+            { BZ_SETERR(ret); return; };
+
+         if (bzf->strm.avail_out < BZ_MAX_UNUSED) {
+            n = BZ_MAX_UNUSED - bzf->strm.avail_out;
+            n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), 
+                          n, bzf->handle );
+            if (n != n2 || ferror(bzf->handle))
+               { BZ_SETERR(BZ_IO_ERROR); return; };
+         }
+
+         if (ret == BZ_STREAM_END) break;
+      }
+   }
+
+   if ( !abandon && !ferror ( bzf->handle ) ) {
+      fflush ( bzf->handle );
+      if (ferror(bzf->handle))
+         { BZ_SETERR(BZ_IO_ERROR); return; };
+   }
+
+   if (nbytes_in_lo32 != NULL)
+      *nbytes_in_lo32 = bzf->strm.total_in_lo32;
+   if (nbytes_in_hi32 != NULL)
+      *nbytes_in_hi32 = bzf->strm.total_in_hi32;
+   if (nbytes_out_lo32 != NULL)
+      *nbytes_out_lo32 = bzf->strm.total_out_lo32;
+   if (nbytes_out_hi32 != NULL)
+      *nbytes_out_hi32 = bzf->strm.total_out_hi32;
+
+   BZ_SETERR(BZ_OK);
+   BZ2_bzCompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+BZFILE* BZ_API(BZ2_bzReadOpen) 
+                   ( int*  bzerror, 
+                     FILE* f, 
+                     int   verbosity,
+                     int   small,
+                     void* unused,
+                     int   nUnused )
+{
+   bzFile* bzf = NULL;
+   int     ret;
+
+   BZ_SETERR(BZ_OK);
+
+   if (f == NULL || 
+       (small != 0 && small != 1) ||
+       (verbosity < 0 || verbosity > 4) ||
+       (unused == NULL && nUnused != 0) ||
+       (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED)))
+      { BZ_SETERR(BZ_PARAM_ERROR); return NULL; };
+
+   if (ferror(f))
+      { BZ_SETERR(BZ_IO_ERROR); return NULL; };
+
+   bzf = malloc ( sizeof(bzFile) );
+   if (bzf == NULL) 
+      { BZ_SETERR(BZ_MEM_ERROR); return NULL; };
+
+   BZ_SETERR(BZ_OK);
+
+   bzf->initialisedOk = False;
+   bzf->handle        = f;
+   bzf->bufN          = 0;
+   bzf->writing       = False;
+   bzf->strm.bzalloc  = NULL;
+   bzf->strm.bzfree   = NULL;
+   bzf->strm.opaque   = NULL;
+   
+   while (nUnused > 0) {
+      bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++;
+      unused = ((void*)( 1 + ((UChar*)(unused))  ));
+      nUnused--;
+   }
+
+   ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small );
+   if (ret != BZ_OK)
+      { BZ_SETERR(ret); free(bzf); return NULL; };
+
+   bzf->strm.avail_in = bzf->bufN;
+   bzf->strm.next_in  = bzf->buf;
+
+   bzf->initialisedOk = True;
+   return bzf;   
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b )
+{
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_OK); return; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+
+   if (bzf->initialisedOk)
+      (void)BZ2_bzDecompressEnd ( &(bzf->strm) );
+   free ( bzf );
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzRead) 
+           ( int*    bzerror, 
+             BZFILE* b, 
+             void*   buf, 
+             int     len )
+{
+   Int32   n, ret;
+   bzFile* bzf = (bzFile*)b;
+
+   BZ_SETERR(BZ_OK);
+
+   if (bzf == NULL || buf == NULL || len < 0)
+      { BZ_SETERR(BZ_PARAM_ERROR); return 0; };
+
+   if (bzf->writing)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; };
+
+   if (len == 0)
+      { BZ_SETERR(BZ_OK); return 0; };
+
+   bzf->strm.avail_out = len;
+   bzf->strm.next_out = buf;
+
+   while (True) {
+
+      if (ferror(bzf->handle)) 
+         { BZ_SETERR(BZ_IO_ERROR); return 0; };
+
+      if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) {
+         n = fread ( bzf->buf, sizeof(UChar), 
+                     BZ_MAX_UNUSED, bzf->handle );
+         if (ferror(bzf->handle))
+            { BZ_SETERR(BZ_IO_ERROR); return 0; };
+         bzf->bufN = n;
+         bzf->strm.avail_in = bzf->bufN;
+         bzf->strm.next_in = bzf->buf;
+      }
+
+      ret = BZ2_bzDecompress ( &(bzf->strm) );
+
+      if (ret != BZ_OK && ret != BZ_STREAM_END)
+         { BZ_SETERR(ret); return 0; };
+
+      if (ret == BZ_OK && myfeof(bzf->handle) && 
+          bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0)
+         { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; };
+
+      if (ret == BZ_STREAM_END)
+         { BZ_SETERR(BZ_STREAM_END);
+           return len - bzf->strm.avail_out; };
+      if (bzf->strm.avail_out == 0)
+         { BZ_SETERR(BZ_OK); return len; };
+      
+   }
+
+   return 0; /*not reached*/
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzReadGetUnused) 
+                     ( int*    bzerror, 
+                       BZFILE* b, 
+                       void**  unused, 
+                       int*    nUnused )
+{
+   bzFile* bzf = (bzFile*)b;
+   if (bzf == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+   if (bzf->lastErr != BZ_STREAM_END)
+      { BZ_SETERR(BZ_SEQUENCE_ERROR); return; };
+   if (unused == NULL || nUnused == NULL)
+      { BZ_SETERR(BZ_PARAM_ERROR); return; };
+
+   BZ_SETERR(BZ_OK);
+   *nUnused = bzf->strm.avail_in;
+   *unused = bzf->strm.next_in;
+}
+#endif
+
+
+/*---------------------------------------------------*/
+/*--- Misc convenience stuff                      ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffCompress) 
+                         ( char*         dest, 
+                           unsigned int* destLen,
+                           char*         source, 
+                           unsigned int  sourceLen,
+                           int           blockSize100k, 
+                           int           verbosity, 
+                           int           workFactor )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       blockSize100k < 1 || blockSize100k > 9 ||
+       verbosity < 0 || verbosity > 4 ||
+       workFactor < 0 || workFactor > 250) 
+      return BZ_PARAM_ERROR;
+
+   if (workFactor == 0) workFactor = 30;
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzCompressInit ( &strm, blockSize100k, 
+                              verbosity, workFactor );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzCompress ( &strm, BZ_FINISH );
+   if (ret == BZ_FINISH_OK) goto output_overflow;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;   
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow:
+   BZ2_bzCompressEnd ( &strm );
+   return BZ_OUTBUFF_FULL;
+
+   errhandler:
+   BZ2_bzCompressEnd ( &strm );
+   return ret;
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzBuffToBuffDecompress) 
+                           ( char*         dest, 
+                             unsigned int* destLen,
+                             char*         source, 
+                             unsigned int  sourceLen,
+                             int           small,
+                             int           verbosity )
+{
+   bz_stream strm;
+   int ret;
+
+   if (dest == NULL || destLen == NULL || 
+       source == NULL ||
+       (small != 0 && small != 1) ||
+       verbosity < 0 || verbosity > 4) 
+          return BZ_PARAM_ERROR;
+
+   strm.bzalloc = NULL;
+   strm.bzfree = NULL;
+   strm.opaque = NULL;
+   ret = BZ2_bzDecompressInit ( &strm, verbosity, small );
+   if (ret != BZ_OK) return ret;
+
+   strm.next_in = source;
+   strm.next_out = dest;
+   strm.avail_in = sourceLen;
+   strm.avail_out = *destLen;
+
+   ret = BZ2_bzDecompress ( &strm );
+   if (ret == BZ_OK) goto output_overflow_or_eof;
+   if (ret != BZ_STREAM_END) goto errhandler;
+
+   /* normal termination */
+   *destLen -= strm.avail_out;
+   BZ2_bzDecompressEnd ( &strm );
+   return BZ_OK;
+
+   output_overflow_or_eof:
+   if (strm.avail_out > 0) {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_UNEXPECTED_EOF;
+   } else {
+      BZ2_bzDecompressEnd ( &strm );
+      return BZ_OUTBUFF_FULL;
+   };      
+
+   errhandler:
+   BZ2_bzDecompressEnd ( &strm );
+   return ret; 
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+/*--
+   return version like "0.9.5d, 4-Sept-1999".
+--*/
+const char * BZ_API(BZ2_bzlibVersion)(void)
+{
+   return BZ_VERSION;
+}
+
+
+#ifndef BZ_NO_STDIO
+/*---------------------------------------------------*/
+
+#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
+#   include 
+#   include 
+#   define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
+#else
+#   define SET_BINARY_MODE(file)
+#endif
+static
+BZFILE * bzopen_or_bzdopen
+               ( const char *path,   /* no use when bzdopen */
+                 int fd,             /* no use when bzdopen */
+                 const char *mode,
+                 int open_mode)      /* bzopen: 0, bzdopen:1 */
+{
+   int    bzerr;
+   char   unused[BZ_MAX_UNUSED];
+   int    blockSize100k = 9;
+   int    writing       = 0;
+   char   mode2[10]     = "";
+   FILE   *fp           = NULL;
+   BZFILE *bzfp         = NULL;
+   int    verbosity     = 0;
+   int    workFactor    = 30;
+   int    smallMode     = 0;
+   int    nUnused       = 0; 
+
+   if (mode == NULL) return NULL;
+   while (*mode) {
+      switch (*mode) {
+      case 'r':
+         writing = 0; break;
+      case 'w':
+         writing = 1; break;
+      case 's':
+         smallMode = 1; break;
+      default:
+         if (isdigit((int)(*mode))) {
+            blockSize100k = *mode-BZ_HDR_0;
+         }
+      }
+      mode++;
+   }
+   strcat(mode2, writing ? "w" : "r" );
+   strcat(mode2,"b");   /* binary mode */
+
+   if (open_mode==0) {
+      if (path==NULL || strcmp(path,"")==0) {
+        fp = (writing ? stdout : stdin);
+        SET_BINARY_MODE(fp);
+      } else {
+        fp = fopen(path,mode2);
+      }
+   } else {
+#ifdef BZ_STRICT_ANSI
+      fp = NULL;
+#else
+      fp = fdopen(fd,mode2);
+#endif
+   }
+   if (fp == NULL) return NULL;
+
+   if (writing) {
+      /* Guard against total chaos and anarchy -- JRS */
+      if (blockSize100k < 1) blockSize100k = 1;
+      if (blockSize100k > 9) blockSize100k = 9; 
+      bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k,
+                             verbosity,workFactor);
+   } else {
+      bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode,
+                            unused,nUnused);
+   }
+   if (bzfp == NULL) {
+      if (fp != stdin && fp != stdout) fclose(fp);
+      return NULL;
+   }
+   return bzfp;
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   open file for read or write.
+      ex) bzopen("file","w9")
+      case path="" or NULL => use stdin or stdout.
+--*/
+BZFILE * BZ_API(BZ2_bzopen)
+               ( const char *path,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0);
+}
+
+
+/*---------------------------------------------------*/
+BZFILE * BZ_API(BZ2_bzdopen)
+               ( int fd,
+                 const char *mode )
+{
+   return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1);
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len )
+{
+   int bzerr, nread;
+   if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0;
+   nread = BZ2_bzRead(&bzerr,b,buf,len);
+   if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) {
+      return nread;
+   } else {
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len )
+{
+   int bzerr;
+
+   BZ2_bzWrite(&bzerr,b,buf,len);
+   if(bzerr == BZ_OK){
+      return len;
+   }else{
+      return -1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+int BZ_API(BZ2_bzflush) (BZFILE *b)
+{
+   /* do nothing now... */
+   return 0;
+}
+
+
+/*---------------------------------------------------*/
+void BZ_API(BZ2_bzclose) (BZFILE* b)
+{
+   int bzerr;
+   FILE *fp;
+   
+   if (b==NULL) {return;}
+   fp = ((bzFile *)b)->handle;
+   if(((bzFile*)b)->writing){
+      BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL);
+      if(bzerr != BZ_OK){
+         BZ2_bzWriteClose(NULL,b,1,NULL,NULL);
+      }
+   }else{
+      BZ2_bzReadClose(&bzerr,b);
+   }
+   if(fp!=stdin && fp!=stdout){
+      fclose(fp);
+   }
+}
+
+
+/*---------------------------------------------------*/
+/*--
+   return last error code 
+--*/
+static const char *bzerrorstrings[] = {
+       "OK"
+      ,"SEQUENCE_ERROR"
+      ,"PARAM_ERROR"
+      ,"MEM_ERROR"
+      ,"DATA_ERROR"
+      ,"DATA_ERROR_MAGIC"
+      ,"IO_ERROR"
+      ,"UNEXPECTED_EOF"
+      ,"OUTBUFF_FULL"
+      ,"CONFIG_ERROR"
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+      ,"???"   /* for future */
+};
+
+
+const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum)
+{
+   int err = ((bzFile *)b)->lastErr;
+
+   if(err>0) err = 0;
+   *errnum = err;
+   return bzerrorstrings[err*-1];
+}
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/bzlib.h b/third_party/bzip2/bzlib.h
new file mode 100644
index 000000000..8966a6c58
--- /dev/null
+++ b/third_party/bzip2/bzlib.h
@@ -0,0 +1,282 @@
+
+/*-------------------------------------------------------------*/
+/*--- Public header file for the library.                   ---*/
+/*---                                               bzlib.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_H
+#define _BZLIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BZ_RUN               0
+#define BZ_FLUSH             1
+#define BZ_FINISH            2
+
+#define BZ_OK                0
+#define BZ_RUN_OK            1
+#define BZ_FLUSH_OK          2
+#define BZ_FINISH_OK         3
+#define BZ_STREAM_END        4
+#define BZ_SEQUENCE_ERROR    (-1)
+#define BZ_PARAM_ERROR       (-2)
+#define BZ_MEM_ERROR         (-3)
+#define BZ_DATA_ERROR        (-4)
+#define BZ_DATA_ERROR_MAGIC  (-5)
+#define BZ_IO_ERROR          (-6)
+#define BZ_UNEXPECTED_EOF    (-7)
+#define BZ_OUTBUFF_FULL      (-8)
+#define BZ_CONFIG_ERROR      (-9)
+
+typedef 
+   struct {
+      char *next_in;
+      unsigned int avail_in;
+      unsigned int total_in_lo32;
+      unsigned int total_in_hi32;
+
+      char *next_out;
+      unsigned int avail_out;
+      unsigned int total_out_lo32;
+      unsigned int total_out_hi32;
+
+      void *state;
+
+      void *(*bzalloc)(void *,int,int);
+      void (*bzfree)(void *,void *);
+      void *opaque;
+   } 
+   bz_stream;
+
+
+#ifndef BZ_IMPORT
+#define BZ_EXPORT
+#endif
+
+#ifndef BZ_NO_STDIO
+/* Need a definitition for FILE */
+#include 
+#endif
+
+#ifdef _WIN32
+#   include 
+#   ifdef small
+      /* windows.h define small to char */
+#      undef small
+#   endif
+#   ifdef BZ_EXPORT
+#   define BZ_API(func) WINAPI func
+#   define BZ_EXTERN extern
+#   else
+   /* import windows dll dynamically */
+#   define BZ_API(func) (WINAPI * func)
+#   define BZ_EXTERN
+#   endif
+#else
+#   define BZ_API(func) func
+#   define BZ_EXTERN extern
+#endif
+
+
+/*-- Core (low-level) library functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( 
+      bz_stream* strm, 
+      int        blockSize100k, 
+      int        verbosity, 
+      int        workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompress) ( 
+      bz_stream* strm, 
+      int action 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( 
+      bz_stream *strm, 
+      int       verbosity, 
+      int       small
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( 
+      bz_stream* strm 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( 
+      bz_stream *strm 
+   );
+
+
+
+/*-- High(er) level library functions --*/
+
+#ifndef BZ_NO_STDIO
+#define BZ_MAX_UNUSED 5000
+
+typedef void BZFILE;
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( 
+      int*  bzerror,   
+      FILE* f, 
+      int   verbosity, 
+      int   small,
+      void* unused,    
+      int   nUnused 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( 
+      int*    bzerror, 
+      BZFILE* b 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void**  unused,  
+      int*    nUnused 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzRead) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( 
+      int*  bzerror,      
+      FILE* f, 
+      int   blockSize100k, 
+      int   verbosity, 
+      int   workFactor 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWrite) ( 
+      int*    bzerror, 
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in, 
+      unsigned int* nbytes_out 
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( 
+      int*          bzerror, 
+      BZFILE*       b, 
+      int           abandon, 
+      unsigned int* nbytes_in_lo32, 
+      unsigned int* nbytes_in_hi32, 
+      unsigned int* nbytes_out_lo32, 
+      unsigned int* nbytes_out_hi32
+   );
+#endif
+
+
+/*-- Utility functions --*/
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           blockSize100k, 
+      int           verbosity, 
+      int           workFactor 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( 
+      char*         dest, 
+      unsigned int* destLen,
+      char*         source, 
+      unsigned int  sourceLen,
+      int           small, 
+      int           verbosity 
+   );
+
+
+/*--
+   Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+   to support better zlib compatibility.
+   This code is not _officially_ part of libbzip2 (yet);
+   I haven't tested it, documented it, or considered the
+   threading-safeness of it.
+   If this code breaks, please contact both Yoshioka and me.
+--*/
+
+BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
+      void
+   );
+
+#ifndef BZ_NO_STDIO
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
+      const char *path,
+      const char *mode
+   );
+
+BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
+      int        fd,
+      const char *mode
+   );
+         
+BZ_EXTERN int BZ_API(BZ2_bzread) (
+      BZFILE* b, 
+      void* buf, 
+      int len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzwrite) (
+      BZFILE* b, 
+      void*   buf, 
+      int     len 
+   );
+
+BZ_EXTERN int BZ_API(BZ2_bzflush) (
+      BZFILE* b
+   );
+
+BZ_EXTERN void BZ_API(BZ2_bzclose) (
+      BZFILE* b
+   );
+
+BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
+      BZFILE *b, 
+      int    *errnum
+   );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/*-------------------------------------------------------------*/
+/*--- end                                           bzlib.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/bzlib_private.h b/third_party/bzip2/bzlib_private.h
new file mode 100644
index 000000000..3755a6f70
--- /dev/null
+++ b/third_party/bzip2/bzlib_private.h
@@ -0,0 +1,509 @@
+
+/*-------------------------------------------------------------*/
+/*--- Private header file for the library.                  ---*/
+/*---                                       bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#ifndef _BZLIB_PRIVATE_H
+#define _BZLIB_PRIVATE_H
+
+#include 
+
+#ifndef BZ_NO_STDIO
+#include 
+#include 
+#include 
+#endif
+
+#include "bzlib.h"
+
+
+
+/*-- General stuff. --*/
+
+#define BZ_VERSION  "1.0.8, 13-Jul-2019"
+
+typedef char            Char;
+typedef unsigned char   Bool;
+typedef unsigned char   UChar;
+typedef int             Int32;
+typedef unsigned int    UInt32;
+typedef short           Int16;
+typedef unsigned short  UInt16;
+
+#define True  ((Bool)1)
+#define False ((Bool)0)
+
+#ifndef __GNUC__
+#define __inline__  /* */
+#endif 
+
+#ifndef BZ_NO_STDIO
+
+extern void BZ2_bz__AssertH__fail ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
+
+#if BZ_DEBUG
+#define AssertD(cond,msg) \
+   { if (!(cond)) {       \
+      fprintf ( stderr,   \
+        "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
+      exit(1); \
+   }}
+#else
+#define AssertD(cond,msg) /* */
+#endif
+
+#define VPrintf0(zf) \
+   fprintf(stderr,zf)
+#define VPrintf1(zf,za1) \
+   fprintf(stderr,zf,za1)
+#define VPrintf2(zf,za1,za2) \
+   fprintf(stderr,zf,za1,za2)
+#define VPrintf3(zf,za1,za2,za3) \
+   fprintf(stderr,zf,za1,za2,za3)
+#define VPrintf4(zf,za1,za2,za3,za4) \
+   fprintf(stderr,zf,za1,za2,za3,za4)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) \
+   fprintf(stderr,zf,za1,za2,za3,za4,za5)
+
+#else
+
+extern void bz_internal_error ( int errcode );
+#define AssertH(cond,errcode) \
+   { if (!(cond)) bz_internal_error ( errcode ); }
+#define AssertD(cond,msg)                do { } while (0)
+#define VPrintf0(zf)                     do { } while (0)
+#define VPrintf1(zf,za1)                 do { } while (0)
+#define VPrintf2(zf,za1,za2)             do { } while (0)
+#define VPrintf3(zf,za1,za2,za3)         do { } while (0)
+#define VPrintf4(zf,za1,za2,za3,za4)     do { } while (0)
+#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0)
+
+#endif
+
+
+#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
+#define BZFREE(ppp)  (strm->bzfree)(strm->opaque,(ppp))
+
+
+/*-- Header bytes. --*/
+
+#define BZ_HDR_B 0x42   /* 'B' */
+#define BZ_HDR_Z 0x5a   /* 'Z' */
+#define BZ_HDR_h 0x68   /* 'h' */
+#define BZ_HDR_0 0x30   /* '0' */
+  
+/*-- Constants for the back end. --*/
+
+#define BZ_MAX_ALPHA_SIZE 258
+#define BZ_MAX_CODE_LEN    23
+
+#define BZ_RUNA 0
+#define BZ_RUNB 1
+
+#define BZ_N_GROUPS 6
+#define BZ_G_SIZE   50
+#define BZ_N_ITERS  4
+
+#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
+
+
+
+/*-- Stuff for randomising repetitive blocks. --*/
+
+extern Int32 BZ2_rNums[512];
+
+#define BZ_RAND_DECLS                          \
+   Int32 rNToGo;                               \
+   Int32 rTPos                                 \
+
+#define BZ_RAND_INIT_MASK                      \
+   s->rNToGo = 0;                              \
+   s->rTPos  = 0                               \
+
+#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
+
+#define BZ_RAND_UPD_MASK                       \
+   if (s->rNToGo == 0) {                       \
+      s->rNToGo = BZ2_rNums[s->rTPos];         \
+      s->rTPos++;                              \
+      if (s->rTPos == 512) s->rTPos = 0;       \
+   }                                           \
+   s->rNToGo--;
+
+
+
+/*-- Stuff for doing CRCs. --*/
+
+extern UInt32 BZ2_crc32Table[256];
+
+#define BZ_INITIALISE_CRC(crcVar)              \
+{                                              \
+   crcVar = 0xffffffffL;                       \
+}
+
+#define BZ_FINALISE_CRC(crcVar)                \
+{                                              \
+   crcVar = ~(crcVar);                         \
+}
+
+#define BZ_UPDATE_CRC(crcVar,cha)              \
+{                                              \
+   crcVar = (crcVar << 8) ^                    \
+            BZ2_crc32Table[(crcVar >> 24) ^    \
+                           ((UChar)cha)];      \
+}
+
+
+
+/*-- States and modes for compression. --*/
+
+#define BZ_M_IDLE      1
+#define BZ_M_RUNNING   2
+#define BZ_M_FLUSHING  3
+#define BZ_M_FINISHING 4
+
+#define BZ_S_OUTPUT    1
+#define BZ_S_INPUT     2
+
+#define BZ_N_RADIX 2
+#define BZ_N_QSORT 12
+#define BZ_N_SHELL 18
+#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
+
+
+
+
+/*-- Structure holding all the compression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* mode this stream is in, and whether inputting */
+      /* or outputting data */
+      Int32    mode;
+      Int32    state;
+
+      /* remembers avail_in when flush/finish requested */
+      UInt32   avail_in_expect;
+
+      /* for doing the block sorting */
+      UInt32*  arr1;
+      UInt32*  arr2;
+      UInt32*  ftab;
+      Int32    origPtr;
+
+      /* aliases for arr1 and arr2 */
+      UInt32*  ptr;
+      UChar*   block;
+      UInt16*  mtfv;
+      UChar*   zbits;
+
+      /* for deciding when to use the fallback sorting algorithm */
+      Int32    workFactor;
+
+      /* run-length-encoding of the input */
+      UInt32   state_in_ch;
+      Int32    state_in_len;
+      BZ_RAND_DECLS;
+
+      /* input and output limits and current posns */
+      Int32    nblock;
+      Int32    nblockMAX;
+      Int32    numZ;
+      Int32    state_out_pos;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      UChar    unseqToSeq[256];
+
+      /* the buffer for bit stream creation */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* block and combined CRCs */
+      UInt32   blockCRC;
+      UInt32   combinedCRC;
+
+      /* misc administratium */
+      Int32    verbosity;
+      Int32    blockNo;
+      Int32    blockSize100k;
+
+      /* stuff for coding the MTF values */
+      Int32    nMTF;
+      Int32    mtfFreq    [BZ_MAX_ALPHA_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+
+      UChar    len     [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    code    [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    rfreq   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      /* second dimension: only 3 needed; 4 makes index calculations faster */
+      UInt32   len_pack[BZ_MAX_ALPHA_SIZE][4];
+
+   }
+   EState;
+
+
+
+/*-- externs for compression. --*/
+
+extern void 
+BZ2_blockSort ( EState* );
+
+extern void 
+BZ2_compressBlock ( EState*, Bool );
+
+extern void 
+BZ2_bsInitWrite ( EState* );
+
+extern void 
+BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
+
+extern void 
+BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
+
+
+
+/*-- states for decompression. --*/
+
+#define BZ_X_IDLE        1
+#define BZ_X_OUTPUT      2
+
+#define BZ_X_MAGIC_1     10
+#define BZ_X_MAGIC_2     11
+#define BZ_X_MAGIC_3     12
+#define BZ_X_MAGIC_4     13
+#define BZ_X_BLKHDR_1    14
+#define BZ_X_BLKHDR_2    15
+#define BZ_X_BLKHDR_3    16
+#define BZ_X_BLKHDR_4    17
+#define BZ_X_BLKHDR_5    18
+#define BZ_X_BLKHDR_6    19
+#define BZ_X_BCRC_1      20
+#define BZ_X_BCRC_2      21
+#define BZ_X_BCRC_3      22
+#define BZ_X_BCRC_4      23
+#define BZ_X_RANDBIT     24
+#define BZ_X_ORIGPTR_1   25
+#define BZ_X_ORIGPTR_2   26
+#define BZ_X_ORIGPTR_3   27
+#define BZ_X_MAPPING_1   28
+#define BZ_X_MAPPING_2   29
+#define BZ_X_SELECTOR_1  30
+#define BZ_X_SELECTOR_2  31
+#define BZ_X_SELECTOR_3  32
+#define BZ_X_CODING_1    33
+#define BZ_X_CODING_2    34
+#define BZ_X_CODING_3    35
+#define BZ_X_MTF_1       36
+#define BZ_X_MTF_2       37
+#define BZ_X_MTF_3       38
+#define BZ_X_MTF_4       39
+#define BZ_X_MTF_5       40
+#define BZ_X_MTF_6       41
+#define BZ_X_ENDHDR_2    42
+#define BZ_X_ENDHDR_3    43
+#define BZ_X_ENDHDR_4    44
+#define BZ_X_ENDHDR_5    45
+#define BZ_X_ENDHDR_6    46
+#define BZ_X_CCRC_1      47
+#define BZ_X_CCRC_2      48
+#define BZ_X_CCRC_3      49
+#define BZ_X_CCRC_4      50
+
+
+
+/*-- Constants for the fast MTF decoder. --*/
+
+#define MTFA_SIZE 4096
+#define MTFL_SIZE 16
+
+
+
+/*-- Structure holding all the decompression-side stuff. --*/
+
+typedef
+   struct {
+      /* pointer back to the struct bz_stream */
+      bz_stream* strm;
+
+      /* state indicator for this stream */
+      Int32    state;
+
+      /* for doing the final run-length decoding */
+      UChar    state_out_ch;
+      Int32    state_out_len;
+      Bool     blockRandomised;
+      BZ_RAND_DECLS;
+
+      /* the buffer for bit stream reading */
+      UInt32   bsBuff;
+      Int32    bsLive;
+
+      /* misc administratium */
+      Int32    blockSize100k;
+      Bool     smallDecompress;
+      Int32    currBlockNo;
+      Int32    verbosity;
+
+      /* for undoing the Burrows-Wheeler transform */
+      Int32    origPtr;
+      UInt32   tPos;
+      Int32    k0;
+      Int32    unzftab[256];
+      Int32    nblock_used;
+      Int32    cftab[257];
+      Int32    cftabCopy[257];
+
+      /* for undoing the Burrows-Wheeler transform (FAST) */
+      UInt32   *tt;
+
+      /* for undoing the Burrows-Wheeler transform (SMALL) */
+      UInt16   *ll16;
+      UChar    *ll4;
+
+      /* stored and calculated CRCs */
+      UInt32   storedBlockCRC;
+      UInt32   storedCombinedCRC;
+      UInt32   calculatedBlockCRC;
+      UInt32   calculatedCombinedCRC;
+
+      /* map of bytes used in block */
+      Int32    nInUse;
+      Bool     inUse[256];
+      Bool     inUse16[16];
+      UChar    seqToUnseq[256];
+
+      /* for decoding the MTF values */
+      UChar    mtfa   [MTFA_SIZE];
+      Int32    mtfbase[256 / MTFL_SIZE];
+      UChar    selector   [BZ_MAX_SELECTORS];
+      UChar    selectorMtf[BZ_MAX_SELECTORS];
+      UChar    len  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+
+      Int32    limit  [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    base   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    perm   [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+      Int32    minLens[BZ_N_GROUPS];
+
+      /* save area for scalars in the main decompress code */
+      Int32    save_i;
+      Int32    save_j;
+      Int32    save_t;
+      Int32    save_alphaSize;
+      Int32    save_nGroups;
+      Int32    save_nSelectors;
+      Int32    save_EOB;
+      Int32    save_groupNo;
+      Int32    save_groupPos;
+      Int32    save_nextSym;
+      Int32    save_nblockMAX;
+      Int32    save_nblock;
+      Int32    save_es;
+      Int32    save_N;
+      Int32    save_curr;
+      Int32    save_zt;
+      Int32    save_zn; 
+      Int32    save_zvec;
+      Int32    save_zj;
+      Int32    save_gSel;
+      Int32    save_gMinlen;
+      Int32*   save_gLimit;
+      Int32*   save_gBase;
+      Int32*   save_gPerm;
+
+   }
+   DState;
+
+
+
+/*-- Macros for decompression. --*/
+
+#define BZ_GET_FAST(cccc)                     \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    s->tPos = s->tt[s->tPos];                 \
+    cccc = (UChar)(s->tPos & 0xff);           \
+    s->tPos >>= 8;
+
+#define BZ_GET_FAST_C(cccc)                   \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \
+    c_tPos = c_tt[c_tPos];                    \
+    cccc = (UChar)(c_tPos & 0xff);            \
+    c_tPos >>= 8;
+
+#define SET_LL4(i,n)                                          \
+   { if (((i) & 0x1) == 0)                                    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else    \
+        s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4);  \
+   }
+
+#define GET_LL4(i)                             \
+   ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
+
+#define SET_LL(i,n)                          \
+   { s->ll16[i] = (UInt16)(n & 0x0000ffff);  \
+     SET_LL4(i, n >> 16);                    \
+   }
+
+#define GET_LL(i) \
+   (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
+
+#define BZ_GET_SMALL(cccc)                            \
+    /* c_tPos is unsigned, hence test < 0 is pointless. */ \
+    if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
+    cccc = BZ2_indexIntoF ( s->tPos, s->cftab );    \
+    s->tPos = GET_LL(s->tPos);
+
+
+/*-- externs for decompression. --*/
+
+extern Int32 
+BZ2_indexIntoF ( Int32, Int32* );
+
+extern Int32 
+BZ2_decompress ( DState* );
+
+extern void 
+BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
+                           Int32,  Int32, Int32 );
+
+
+#endif
+
+
+/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
+
+#ifdef BZ_NO_STDIO
+#ifndef NULL
+#define NULL 0
+#endif
+#endif
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                   bzlib_private.h ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/bzmore b/third_party/bzip2/bzmore
new file mode 100644
index 000000000..d31404340
--- /dev/null
+++ b/third_party/bzip2/bzmore
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+# Bzmore wrapped for bzip2, 
+# adapted from zmore by Philippe Troin  for Debian GNU/Linux.
+
+PATH="/usr/bin:$PATH"; export PATH
+
+prog=`echo $0 | sed 's|.*/||'`
+case "$prog" in
+	*less)	more=less	;;
+	*)	more=more       ;;
+esac
+
+if test "`echo -n a`" = "-n a"; then
+  # looks like a SysV system:
+  n1=''; n2='\c'
+else
+  n1='-n'; n2=''
+fi
+oldtty=`stty -g 2>/dev/null`
+if stty -cbreak 2>/dev/null; then
+  cb='cbreak'; ncb='-cbreak'
+else
+  # 'stty min 1' resets eof to ^a on both SunOS and SysV!
+  cb='min 1 -icanon'; ncb='icanon eof ^d'
+fi
+if test $? -eq 0 -a -n "$oldtty"; then
+   trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
+else
+   trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
+fi
+
+if test $# = 0; then
+    if test -t 0; then
+	echo usage: $prog files...
+    else
+	bzip2 -cdfq | eval $more
+    fi
+else
+    FIRST=1
+    for FILE
+    do
+	if test $FIRST -eq 0; then
+		echo $n1 "--More--(Next file: $FILE)$n2"
+		stty $cb -echo 2>/dev/null
+		ANS=`dd bs=1 count=1 2>/dev/null` 
+		stty $ncb echo 2>/dev/null
+		echo " "
+		if test "$ANS" = 'e' -o "$ANS" = 'q'; then
+			exit
+		fi
+	fi
+	if test "$ANS" != 's'; then
+		echo "------> $FILE <------"
+		bzip2 -cdfq "$FILE" | eval $more
+	fi
+	if test -t; then
+		FIRST=0
+	fi
+    done
+fi
diff --git a/third_party/bzip2/bzmore.1 b/third_party/bzip2/bzmore.1
new file mode 100644
index 000000000..b437d3b03
--- /dev/null
+++ b/third_party/bzip2/bzmore.1
@@ -0,0 +1,152 @@
+.\"Shamelessly copied from zmore.1 by Philippe Troin 
+.\"for Debian GNU/Linux
+.TH BZMORE 1
+.SH NAME
+bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
+.SH SYNOPSIS
+.B bzmore
+[ name ...  ]
+.br
+.B bzless
+[ name ...  ]
+.SH NOTE
+In the following description,
+.I bzless
+and
+.I less
+can be used interchangeably with
+.I bzmore
+and
+.I more.
+.SH DESCRIPTION
+.I  Bzmore
+is a filter which allows examination of compressed or plain text files
+one screenful at a time on a soft-copy terminal.
+.I bzmore
+works on files compressed with
+.I bzip2
+and also on uncompressed files.
+If a file does not exist,
+.I bzmore
+looks for a file of the same name with the addition of a .bz2 suffix.
+.PP
+.I Bzmore
+normally pauses after each screenful, printing --More--
+at the bottom of the screen.
+If the user then types a carriage return, one more line is displayed.
+If the user hits a space,
+another screenful is displayed.  Other possibilities are enumerated later.
+.PP
+.I Bzmore
+looks in the file
+.I /etc/termcap
+to determine terminal characteristics,
+and to determine the default window size.
+On a terminal capable of displaying 24 lines,
+the default window size is 22 lines.
+Other sequences which may be typed when
+.I bzmore
+pauses, and their effects, are as follows (\fIi\fP is an optional integer
+argument, defaulting to 1) :
+.PP
+.IP \fIi\|\fP
+display
+.I i
+more lines, (or another screenful if no argument is given)
+.PP
+.IP ^D
+display 11 more lines (a ``scroll'').
+If
+.I i
+is given, then the scroll size is set to \fIi\|\fP.
+.PP
+.IP d
+same as ^D (control-D)
+.PP
+.IP \fIi\|\fPz
+same as typing a space except that \fIi\|\fP, if present, becomes the new
+window size.  Note that the window size reverts back to the default at the
+end of the current file.
+.PP
+.IP \fIi\|\fPs
+skip \fIi\|\fP lines and print a screenful of lines
+.PP
+.IP \fIi\|\fPf
+skip \fIi\fP screenfuls and print a screenful of lines
+.PP
+.IP "q or Q"
+quit reading the current file; go on to the next (if any)
+.PP
+.IP "e or q"
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to exit.
+.PP
+.IP s
+When the prompt --More--(Next file: 
+.IR file )
+is printed, this command causes bzmore to skip the next file and continue.
+.PP 
+.IP =
+Display the current line number.
+.PP
+.IP \fIi\|\fP/expr
+search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
+If the pattern is not found,
+.I bzmore
+goes on to the next file (if any).
+Otherwise, a screenful is displayed, starting two lines before the place
+where the expression was found.
+The user's erase and kill characters may be used to edit the regular
+expression.
+Erasing back past the first column cancels the search command.
+.PP
+.IP \fIi\|\fPn
+search for the \fIi\|\fP-th occurrence of the last regular expression entered.
+.PP
+.IP !command
+invoke a shell with \fIcommand\|\fP. 
+The character `!' in "command" are replaced with the
+previous shell command.  The sequence "\\!" is replaced by "!".
+.PP
+.IP ":q or :Q"
+quit reading the current file; go on to the next (if any)
+(same as q or Q).
+.PP
+.IP .
+(dot) repeat the previous command.
+.PP
+The commands take effect immediately, i.e., it is not necessary to
+type a carriage return.
+Up to the time when the command character itself is given,
+the user may hit the line kill character to cancel the numerical
+argument being formed.
+In addition, the user may hit the erase character to redisplay the
+--More-- message.
+.PP
+At any time when output is being sent to the terminal, the user can
+hit the quit key (normally control\-\\).
+.I Bzmore
+will stop sending output, and will display the usual --More--
+prompt.
+The user may then enter one of the above commands in the normal manner.
+Unfortunately, some output is lost when this is done, due to the
+fact that any characters waiting in the terminal's output queue
+are flushed when the quit signal occurs.
+.PP
+The terminal is set to
+.I noecho
+mode by this program so that the output can be continuous.
+What you type will thus not show on your terminal, except for the / and !
+commands.
+.PP
+If the standard output is not a teletype, then
+.I bzmore
+acts just like
+.I bzcat,
+except that a header is printed before each file.
+.SH FILES
+.DT
+/etc/termcap		Terminal data base
+.SH "SEE ALSO"
+more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
diff --git a/third_party/bzip2/compress.c b/third_party/bzip2/compress.c
new file mode 100644
index 000000000..5dfa00231
--- /dev/null
+++ b/third_party/bzip2/compress.c
@@ -0,0 +1,672 @@
+
+/*-------------------------------------------------------------*/
+/*--- Compression machinery (not incl block sorting)        ---*/
+/*---                                            compress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+/* CHANGES
+    0.9.0    -- original version.
+    0.9.0a/b -- no changes in this file.
+    0.9.0c   -- changed setting of nGroups in sendMTFValues() 
+                so as to do a bit better on small files
+*/
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+/*--- Bit stream I/O                              ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+void BZ2_bsInitWrite ( EState* s )
+{
+   s->bsLive = 0;
+   s->bsBuff = 0;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsFinishWrite ( EState* s )
+{
+   while (s->bsLive > 0) {
+      s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
+      s->numZ++;
+      s->bsBuff <<= 8;
+      s->bsLive -= 8;
+   }
+}
+
+
+/*---------------------------------------------------*/
+#define bsNEEDW(nz)                           \
+{                                             \
+   while (s->bsLive >= 8) {                   \
+      s->zbits[s->numZ]                       \
+         = (UChar)(s->bsBuff >> 24);          \
+      s->numZ++;                              \
+      s->bsBuff <<= 8;                        \
+      s->bsLive -= 8;                         \
+   }                                          \
+}
+
+
+/*---------------------------------------------------*/
+static
+__inline__
+void bsW ( EState* s, Int32 n, UInt32 v )
+{
+   bsNEEDW ( n );
+   s->bsBuff |= (v << (32 - s->bsLive - n));
+   s->bsLive += n;
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUInt32 ( EState* s, UInt32 u )
+{
+   bsW ( s, 8, (u >> 24) & 0xffL );
+   bsW ( s, 8, (u >> 16) & 0xffL );
+   bsW ( s, 8, (u >>  8) & 0xffL );
+   bsW ( s, 8,  u        & 0xffL );
+}
+
+
+/*---------------------------------------------------*/
+static
+void bsPutUChar ( EState* s, UChar c )
+{
+   bsW( s, 8, (UInt32)c );
+}
+
+
+/*---------------------------------------------------*/
+/*--- The back end proper                         ---*/
+/*---------------------------------------------------*/
+
+/*---------------------------------------------------*/
+static
+void makeMaps_e ( EState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->unseqToSeq[i] = s->nInUse;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+static
+void generateMTFValues ( EState* s )
+{
+   UChar   yy[256];
+   Int32   i, j;
+   Int32   zPend;
+   Int32   wr;
+   Int32   EOB;
+
+   /* 
+      After sorting (eg, here),
+         s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
+         and
+         ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] 
+         holds the original block data.
+
+      The first thing to do is generate the MTF values,
+      and put them in
+         ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
+      Because there are strictly fewer or equal MTF values
+      than block values, ptr values in this area are overwritten
+      with MTF values only when they are no longer needed.
+
+      The final compressed bitstream is generated into the
+      area starting at
+         (UChar*) (&((UChar*)s->arr2)[s->nblock])
+
+      These storage aliases are set up in bzCompressInit(),
+      except for the last one, which is arranged in 
+      compressBlock().
+   */
+   UInt32* ptr   = s->ptr;
+   UChar* block  = s->block;
+   UInt16* mtfv  = s->mtfv;
+
+   makeMaps_e ( s );
+   EOB = s->nInUse+1;
+
+   for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
+
+   wr = 0;
+   zPend = 0;
+   for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
+
+   for (i = 0; i < s->nblock; i++) {
+      UChar ll_i;
+      AssertD ( wr <= i, "generateMTFValues(1)" );
+      j = ptr[i]-1; if (j < 0) j += s->nblock;
+      ll_i = s->unseqToSeq[block[j]];
+      AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
+
+      if (yy[0] == ll_i) { 
+         zPend++;
+      } else {
+
+         if (zPend > 0) {
+            zPend--;
+            while (True) {
+               if (zPend & 1) {
+                  mtfv[wr] = BZ_RUNB; wr++; 
+                  s->mtfFreq[BZ_RUNB]++; 
+               } else {
+                  mtfv[wr] = BZ_RUNA; wr++; 
+                  s->mtfFreq[BZ_RUNA]++; 
+               }
+               if (zPend < 2) break;
+               zPend = (zPend - 2) / 2;
+            };
+            zPend = 0;
+         }
+         {
+            register UChar  rtmp;
+            register UChar* ryy_j;
+            register UChar  rll_i;
+            rtmp  = yy[1];
+            yy[1] = yy[0];
+            ryy_j = &(yy[1]);
+            rll_i = ll_i;
+            while ( rll_i != rtmp ) {
+               register UChar rtmp2;
+               ryy_j++;
+               rtmp2  = rtmp;
+               rtmp   = *ryy_j;
+               *ryy_j = rtmp2;
+            };
+            yy[0] = rtmp;
+            j = ryy_j - &(yy[0]);
+            mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
+         }
+
+      }
+   }
+
+   if (zPend > 0) {
+      zPend--;
+      while (True) {
+         if (zPend & 1) {
+            mtfv[wr] = BZ_RUNB; wr++; 
+            s->mtfFreq[BZ_RUNB]++; 
+         } else {
+            mtfv[wr] = BZ_RUNA; wr++; 
+            s->mtfFreq[BZ_RUNA]++; 
+         }
+         if (zPend < 2) break;
+         zPend = (zPend - 2) / 2;
+      };
+      zPend = 0;
+   }
+
+   mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
+
+   s->nMTF = wr;
+}
+
+
+/*---------------------------------------------------*/
+#define BZ_LESSER_ICOST  0
+#define BZ_GREATER_ICOST 15
+
+static
+void sendMTFValues ( EState* s )
+{
+   Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
+   Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
+   Int32 nGroups, nBytes;
+
+   /*--
+   UChar  len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   is a global since the decoder also needs it.
+
+   Int32  code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   Int32  rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
+   are also globals only used in this proc.
+   Made global to keep stack frame size small.
+   --*/
+
+
+   UInt16 cost[BZ_N_GROUPS];
+   Int32  fave[BZ_N_GROUPS];
+
+   UInt16* mtfv = s->mtfv;
+
+   if (s->verbosity >= 3)
+      VPrintf3( "      %d in block, %d after MTF & 1-2 coding, "
+                "%d+2 syms in use\n", 
+                s->nblock, s->nMTF, s->nInUse );
+
+   alphaSize = s->nInUse+2;
+   for (t = 0; t < BZ_N_GROUPS; t++)
+      for (v = 0; v < alphaSize; v++)
+         s->len[t][v] = BZ_GREATER_ICOST;
+
+   /*--- Decide how many coding tables to use ---*/
+   AssertH ( s->nMTF > 0, 3001 );
+   if (s->nMTF < 200)  nGroups = 2; else
+   if (s->nMTF < 600)  nGroups = 3; else
+   if (s->nMTF < 1200) nGroups = 4; else
+   if (s->nMTF < 2400) nGroups = 5; else
+                       nGroups = 6;
+
+   /*--- Generate an initial set of coding tables ---*/
+   { 
+      Int32 nPart, remF, tFreq, aFreq;
+
+      nPart = nGroups;
+      remF  = s->nMTF;
+      gs = 0;
+      while (nPart > 0) {
+         tFreq = remF / nPart;
+         ge = gs-1;
+         aFreq = 0;
+         while (aFreq < tFreq && ge < alphaSize-1) {
+            ge++;
+            aFreq += s->mtfFreq[ge];
+         }
+
+         if (ge > gs 
+             && nPart != nGroups && nPart != 1 
+             && ((nGroups-nPart) % 2 == 1)) {
+            aFreq -= s->mtfFreq[ge];
+            ge--;
+         }
+
+         if (s->verbosity >= 3)
+            VPrintf5( "      initial group %d, [%d .. %d], "
+                      "has %d syms (%4.1f%%)\n",
+                      nPart, gs, ge, aFreq, 
+                      (100.0 * (float)aFreq) / (float)(s->nMTF) );
+ 
+         for (v = 0; v < alphaSize; v++)
+            if (v >= gs && v <= ge) 
+               s->len[nPart-1][v] = BZ_LESSER_ICOST; else
+               s->len[nPart-1][v] = BZ_GREATER_ICOST;
+ 
+         nPart--;
+         gs = ge+1;
+         remF -= aFreq;
+      }
+   }
+
+   /*--- 
+      Iterate up to BZ_N_ITERS times to improve the tables.
+   ---*/
+   for (iter = 0; iter < BZ_N_ITERS; iter++) {
+
+      for (t = 0; t < nGroups; t++) fave[t] = 0;
+
+      for (t = 0; t < nGroups; t++)
+         for (v = 0; v < alphaSize; v++)
+            s->rfreq[t][v] = 0;
+
+      /*---
+        Set up an auxiliary length table which is used to fast-track
+	the common case (nGroups == 6). 
+      ---*/
+      if (nGroups == 6) {
+         for (v = 0; v < alphaSize; v++) {
+            s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
+            s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
+            s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
+	 }
+      }
+
+      nSelectors = 0;
+      totc = 0;
+      gs = 0;
+      while (True) {
+
+         /*--- Set group start & end marks. --*/
+         if (gs >= s->nMTF) break;
+         ge = gs + BZ_G_SIZE - 1; 
+         if (ge >= s->nMTF) ge = s->nMTF-1;
+
+         /*-- 
+            Calculate the cost of this group as coded
+            by each of the coding tables.
+         --*/
+         for (t = 0; t < nGroups; t++) cost[t] = 0;
+
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            register UInt32 cost01, cost23, cost45;
+            register UInt16 icv;
+            cost01 = cost23 = cost45 = 0;
+
+#           define BZ_ITER(nn)                \
+               icv = mtfv[gs+(nn)];           \
+               cost01 += s->len_pack[icv][0]; \
+               cost23 += s->len_pack[icv][1]; \
+               cost45 += s->len_pack[icv][2]; \
+
+            BZ_ITER(0);  BZ_ITER(1);  BZ_ITER(2);  BZ_ITER(3);  BZ_ITER(4);
+            BZ_ITER(5);  BZ_ITER(6);  BZ_ITER(7);  BZ_ITER(8);  BZ_ITER(9);
+            BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
+            BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
+            BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
+            BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
+            BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
+            BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
+            BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
+            BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
+
+#           undef BZ_ITER
+
+            cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
+            cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
+            cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
+
+         } else {
+	    /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++) { 
+               UInt16 icv = mtfv[i];
+               for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
+            }
+         }
+ 
+         /*-- 
+            Find the coding table which is best for this group,
+            and record its identity in the selector table.
+         --*/
+         bc = 999999999; bt = -1;
+         for (t = 0; t < nGroups; t++)
+            if (cost[t] < bc) { bc = cost[t]; bt = t; };
+         totc += bc;
+         fave[bt]++;
+         s->selector[nSelectors] = bt;
+         nSelectors++;
+
+         /*-- 
+            Increment the symbol frequencies for the selected table.
+          --*/
+         if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+
+#           define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
+
+            BZ_ITUR(0);  BZ_ITUR(1);  BZ_ITUR(2);  BZ_ITUR(3);  BZ_ITUR(4);
+            BZ_ITUR(5);  BZ_ITUR(6);  BZ_ITUR(7);  BZ_ITUR(8);  BZ_ITUR(9);
+            BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
+            BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
+            BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
+            BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
+            BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
+            BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
+            BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
+            BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
+
+#           undef BZ_ITUR
+
+         } else {
+	    /*--- slow version which correctly handles all situations ---*/
+            for (i = gs; i <= ge; i++)
+               s->rfreq[bt][ mtfv[i] ]++;
+         }
+
+         gs = ge+1;
+      }
+      if (s->verbosity >= 3) {
+         VPrintf2 ( "      pass %d: size is %d, grp uses are ", 
+                   iter+1, totc/8 );
+         for (t = 0; t < nGroups; t++)
+            VPrintf1 ( "%d ", fave[t] );
+         VPrintf0 ( "\n" );
+      }
+
+      /*--
+        Recompute the tables based on the accumulated frequencies.
+      --*/
+      /* maxLen was changed from 20 to 17 in bzip2-1.0.3.  See 
+         comment in huffman.c for details. */
+      for (t = 0; t < nGroups; t++)
+         BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), 
+                                 alphaSize, 17 /*20*/ );
+   }
+
+
+   AssertH( nGroups < 8, 3002 );
+   AssertH( nSelectors < 32768 &&
+            nSelectors <= BZ_MAX_SELECTORS,
+            3003 );
+
+
+   /*--- Compute MTF values for the selectors. ---*/
+   {
+      UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
+      for (i = 0; i < nGroups; i++) pos[i] = i;
+      for (i = 0; i < nSelectors; i++) {
+         ll_i = s->selector[i];
+         j = 0;
+         tmp = pos[j];
+         while ( ll_i != tmp ) {
+            j++;
+            tmp2 = tmp;
+            tmp = pos[j];
+            pos[j] = tmp2;
+         };
+         pos[0] = tmp;
+         s->selectorMtf[i] = j;
+      }
+   };
+
+   /*--- Assign actual codes for the tables. --*/
+   for (t = 0; t < nGroups; t++) {
+      minLen = 32;
+      maxLen = 0;
+      for (i = 0; i < alphaSize; i++) {
+         if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+         if (s->len[t][i] < minLen) minLen = s->len[t][i];
+      }
+      AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
+      AssertH ( !(minLen < 1),  3005 );
+      BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), 
+                          minLen, maxLen, alphaSize );
+   }
+
+   /*--- Transmit the mapping table. ---*/
+   { 
+      Bool inUse16[16];
+      for (i = 0; i < 16; i++) {
+          inUse16[i] = False;
+          for (j = 0; j < 16; j++)
+             if (s->inUse[i * 16 + j]) inUse16[i] = True;
+      }
+     
+      nBytes = s->numZ;
+      for (i = 0; i < 16; i++)
+         if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
+
+      for (i = 0; i < 16; i++)
+         if (inUse16[i])
+            for (j = 0; j < 16; j++) {
+               if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
+            }
+
+      if (s->verbosity >= 3) 
+         VPrintf1( "      bytes: mapping %d, ", s->numZ-nBytes );
+   }
+
+   /*--- Now the selectors. ---*/
+   nBytes = s->numZ;
+   bsW ( s, 3, nGroups );
+   bsW ( s, 15, nSelectors );
+   for (i = 0; i < nSelectors; i++) { 
+      for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
+      bsW(s,1,0);
+   }
+   if (s->verbosity >= 3)
+      VPrintf1( "selectors %d, ", s->numZ-nBytes );
+
+   /*--- Now the coding tables. ---*/
+   nBytes = s->numZ;
+
+   for (t = 0; t < nGroups; t++) {
+      Int32 curr = s->len[t][0];
+      bsW ( s, 5, curr );
+      for (i = 0; i < alphaSize; i++) {
+         while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
+         while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
+         bsW ( s, 1, 0 );
+      }
+   }
+
+   if (s->verbosity >= 3)
+      VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
+
+   /*--- And finally, the block data proper ---*/
+   nBytes = s->numZ;
+   selCtr = 0;
+   gs = 0;
+   while (True) {
+      if (gs >= s->nMTF) break;
+      ge = gs + BZ_G_SIZE - 1; 
+      if (ge >= s->nMTF) ge = s->nMTF-1;
+      AssertH ( s->selector[selCtr] < nGroups, 3006 );
+
+      if (nGroups == 6 && 50 == ge-gs+1) {
+            /*--- fast track the common case ---*/
+            UInt16 mtfv_i;
+            UChar* s_len_sel_selCtr 
+               = &(s->len[s->selector[selCtr]][0]);
+            Int32* s_code_sel_selCtr
+               = &(s->code[s->selector[selCtr]][0]);
+
+#           define BZ_ITAH(nn)                      \
+               mtfv_i = mtfv[gs+(nn)];              \
+               bsW ( s,                             \
+                     s_len_sel_selCtr[mtfv_i],      \
+                     s_code_sel_selCtr[mtfv_i] )
+
+            BZ_ITAH(0);  BZ_ITAH(1);  BZ_ITAH(2);  BZ_ITAH(3);  BZ_ITAH(4);
+            BZ_ITAH(5);  BZ_ITAH(6);  BZ_ITAH(7);  BZ_ITAH(8);  BZ_ITAH(9);
+            BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
+            BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
+            BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
+            BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
+            BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
+            BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
+            BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
+            BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
+
+#           undef BZ_ITAH
+
+      } else {
+	 /*--- slow version which correctly handles all situations ---*/
+         for (i = gs; i <= ge; i++) {
+            bsW ( s, 
+                  s->len  [s->selector[selCtr]] [mtfv[i]],
+                  s->code [s->selector[selCtr]] [mtfv[i]] );
+         }
+      }
+
+
+      gs = ge+1;
+      selCtr++;
+   }
+   AssertH( selCtr == nSelectors, 3007 );
+
+   if (s->verbosity >= 3)
+      VPrintf1( "codes %d\n", s->numZ-nBytes );
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_compressBlock ( EState* s, Bool is_last_block )
+{
+   if (s->nblock > 0) {
+
+      BZ_FINALISE_CRC ( s->blockCRC );
+      s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
+      s->combinedCRC ^= s->blockCRC;
+      if (s->blockNo > 1) s->numZ = 0;
+
+      if (s->verbosity >= 2)
+         VPrintf4( "    block %d: crc = 0x%08x, "
+                   "combined CRC = 0x%08x, size = %d\n",
+                   s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
+
+      BZ2_blockSort ( s );
+   }
+
+   s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
+
+   /*-- If this is the first block, create the stream header. --*/
+   if (s->blockNo == 1) {
+      BZ2_bsInitWrite ( s );
+      bsPutUChar ( s, BZ_HDR_B );
+      bsPutUChar ( s, BZ_HDR_Z );
+      bsPutUChar ( s, BZ_HDR_h );
+      bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
+   }
+
+   if (s->nblock > 0) {
+
+      bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
+      bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
+      bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
+
+      /*-- Now the block's CRC, so it is in a known place. --*/
+      bsPutUInt32 ( s, s->blockCRC );
+
+      /*-- 
+         Now a single bit indicating (non-)randomisation. 
+         As of version 0.9.5, we use a better sorting algorithm
+         which makes randomisation unnecessary.  So always set
+         the randomised bit to 'no'.  Of course, the decoder
+         still needs to be able to handle randomised blocks
+         so as to maintain backwards compatibility with
+         older versions of bzip2.
+      --*/
+      bsW(s,1,0);
+
+      bsW ( s, 24, s->origPtr );
+      generateMTFValues ( s );
+      sendMTFValues ( s );
+   }
+
+
+   /*-- If this is the last block, add the stream trailer. --*/
+   if (is_last_block) {
+
+      bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
+      bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
+      bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
+      bsPutUInt32 ( s, s->combinedCRC );
+      if (s->verbosity >= 2)
+         VPrintf1( "    final combined CRC = 0x%08x\n   ", s->combinedCRC );
+      bsFinishWrite ( s );
+   }
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        compress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/crctable.c b/third_party/bzip2/crctable.c
new file mode 100644
index 000000000..2b33c2535
--- /dev/null
+++ b/third_party/bzip2/crctable.c
@@ -0,0 +1,104 @@
+
+/*-------------------------------------------------------------*/
+/*--- Table for doing CRCs                                  ---*/
+/*---                                            crctable.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*--
+  I think this is an implementation of the AUTODIN-II,
+  Ethernet & FDDI 32-bit CRC standard.  Vaguely derived
+  from code by Rob Warnock, in Section 51 of the
+  comp.compression FAQ.
+--*/
+
+UInt32 BZ2_crc32Table[256] = {
+
+   /*-- Ugly, innit? --*/
+
+   0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
+   0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
+   0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
+   0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
+   0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
+   0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
+   0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
+   0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
+   0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
+   0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
+   0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
+   0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
+   0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
+   0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
+   0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
+   0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
+   0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
+   0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
+   0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
+   0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
+   0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
+   0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
+   0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
+   0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
+   0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
+   0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
+   0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
+   0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
+   0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
+   0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
+   0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
+   0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
+   0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
+   0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
+   0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
+   0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
+   0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
+   0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
+   0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
+   0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
+   0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
+   0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
+   0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
+   0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
+   0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
+   0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
+   0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
+   0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
+   0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
+   0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
+   0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
+   0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
+   0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
+   0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
+   0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
+   0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
+   0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
+   0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
+   0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
+   0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
+   0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
+   0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
+   0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
+   0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
+};
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                        crctable.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/decompress.c b/third_party/bzip2/decompress.c
new file mode 100644
index 000000000..a1a0bac89
--- /dev/null
+++ b/third_party/bzip2/decompress.c
@@ -0,0 +1,652 @@
+
+/*-------------------------------------------------------------*/
+/*--- Decompression machinery                               ---*/
+/*---                                          decompress.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+
+/*---------------------------------------------------*/
+static
+void makeMaps_d ( DState* s )
+{
+   Int32 i;
+   s->nInUse = 0;
+   for (i = 0; i < 256; i++)
+      if (s->inUse[i]) {
+         s->seqToUnseq[s->nInUse] = i;
+         s->nInUse++;
+      }
+}
+
+
+/*---------------------------------------------------*/
+#define RETURN(rrr)                               \
+   { retVal = rrr; goto save_state_and_return; };
+
+#define GET_BITS(lll,vvv,nnn)                     \
+   case lll: s->state = lll;                      \
+   while (True) {                                 \
+      if (s->bsLive >= nnn) {                     \
+         UInt32 v;                                \
+         v = (s->bsBuff >>                        \
+             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
+         s->bsLive -= nnn;                        \
+         vvv = v;                                 \
+         break;                                   \
+      }                                           \
+      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
+      s->bsBuff                                   \
+         = (s->bsBuff << 8) |                     \
+           ((UInt32)                              \
+              (*((UChar*)(s->strm->next_in))));   \
+      s->bsLive += 8;                             \
+      s->strm->next_in++;                         \
+      s->strm->avail_in--;                        \
+      s->strm->total_in_lo32++;                   \
+      if (s->strm->total_in_lo32 == 0)            \
+         s->strm->total_in_hi32++;                \
+   }
+
+#define GET_UCHAR(lll,uuu)                        \
+   GET_BITS(lll,uuu,8)
+
+#define GET_BIT(lll,uuu)                          \
+   GET_BITS(lll,uuu,1)
+
+/*---------------------------------------------------*/
+#define GET_MTF_VAL(label1,label2,lval)           \
+{                                                 \
+   if (groupPos == 0) {                           \
+      groupNo++;                                  \
+      if (groupNo >= nSelectors)                  \
+         RETURN(BZ_DATA_ERROR);                   \
+      groupPos = BZ_G_SIZE;                       \
+      gSel = s->selector[groupNo];                \
+      gMinlen = s->minLens[gSel];                 \
+      gLimit = &(s->limit[gSel][0]);              \
+      gPerm = &(s->perm[gSel][0]);                \
+      gBase = &(s->base[gSel][0]);                \
+   }                                              \
+   groupPos--;                                    \
+   zn = gMinlen;                                  \
+   GET_BITS(label1, zvec, zn);                    \
+   while (1) {                                    \
+      if (zn > 20 /* the longest code */)         \
+         RETURN(BZ_DATA_ERROR);                   \
+      if (zvec <= gLimit[zn]) break;              \
+      zn++;                                       \
+      GET_BIT(label2, zj);                        \
+      zvec = (zvec << 1) | zj;                    \
+   };                                             \
+   if (zvec - gBase[zn] < 0                       \
+       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
+      RETURN(BZ_DATA_ERROR);                      \
+   lval = gPerm[zvec - gBase[zn]];                \
+}
+
+
+/*---------------------------------------------------*/
+Int32 BZ2_decompress ( DState* s )
+{
+   UChar      uc;
+   Int32      retVal;
+   Int32      minLen, maxLen;
+   bz_stream* strm = s->strm;
+
+   /* stuff that needs to be saved/restored */
+   Int32  i;
+   Int32  j;
+   Int32  t;
+   Int32  alphaSize;
+   Int32  nGroups;
+   Int32  nSelectors;
+   Int32  EOB;
+   Int32  groupNo;
+   Int32  groupPos;
+   Int32  nextSym;
+   Int32  nblockMAX;
+   Int32  nblock;
+   Int32  es;
+   Int32  N;
+   Int32  curr;
+   Int32  zt;
+   Int32  zn; 
+   Int32  zvec;
+   Int32  zj;
+   Int32  gSel;
+   Int32  gMinlen;
+   Int32* gLimit;
+   Int32* gBase;
+   Int32* gPerm;
+
+   if (s->state == BZ_X_MAGIC_1) {
+      /*initialise the save area*/
+      s->save_i           = 0;
+      s->save_j           = 0;
+      s->save_t           = 0;
+      s->save_alphaSize   = 0;
+      s->save_nGroups     = 0;
+      s->save_nSelectors  = 0;
+      s->save_EOB         = 0;
+      s->save_groupNo     = 0;
+      s->save_groupPos    = 0;
+      s->save_nextSym     = 0;
+      s->save_nblockMAX   = 0;
+      s->save_nblock      = 0;
+      s->save_es          = 0;
+      s->save_N           = 0;
+      s->save_curr        = 0;
+      s->save_zt          = 0;
+      s->save_zn          = 0;
+      s->save_zvec        = 0;
+      s->save_zj          = 0;
+      s->save_gSel        = 0;
+      s->save_gMinlen     = 0;
+      s->save_gLimit      = NULL;
+      s->save_gBase       = NULL;
+      s->save_gPerm       = NULL;
+   }
+
+   /*restore from the save area*/
+   i           = s->save_i;
+   j           = s->save_j;
+   t           = s->save_t;
+   alphaSize   = s->save_alphaSize;
+   nGroups     = s->save_nGroups;
+   nSelectors  = s->save_nSelectors;
+   EOB         = s->save_EOB;
+   groupNo     = s->save_groupNo;
+   groupPos    = s->save_groupPos;
+   nextSym     = s->save_nextSym;
+   nblockMAX   = s->save_nblockMAX;
+   nblock      = s->save_nblock;
+   es          = s->save_es;
+   N           = s->save_N;
+   curr        = s->save_curr;
+   zt          = s->save_zt;
+   zn          = s->save_zn; 
+   zvec        = s->save_zvec;
+   zj          = s->save_zj;
+   gSel        = s->save_gSel;
+   gMinlen     = s->save_gMinlen;
+   gLimit      = s->save_gLimit;
+   gBase       = s->save_gBase;
+   gPerm       = s->save_gPerm;
+
+   retVal = BZ_OK;
+
+   switch (s->state) {
+
+      GET_UCHAR(BZ_X_MAGIC_1, uc);
+      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_2, uc);
+      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_UCHAR(BZ_X_MAGIC_3, uc)
+      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
+
+      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
+      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
+          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
+      s->blockSize100k -= BZ_HDR_0;
+
+      if (s->smallDecompress) {
+         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
+         s->ll4  = BZALLOC( 
+                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
+                   );
+         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
+      } else {
+         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
+         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
+      }
+
+      GET_UCHAR(BZ_X_BLKHDR_1, uc);
+
+      if (uc == 0x17) goto endhdr_2;
+      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_2, uc);
+      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_3, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_4, uc);
+      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_5, uc);
+      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_BLKHDR_6, uc);
+      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
+
+      s->currBlockNo++;
+      if (s->verbosity >= 2)
+         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
+ 
+      s->storedBlockCRC = 0;
+      GET_UCHAR(BZ_X_BCRC_1, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_2, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_3, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_BCRC_4, uc);
+      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
+
+      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
+
+      s->origPtr = 0;
+      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
+      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
+
+      if (s->origPtr < 0)
+         RETURN(BZ_DATA_ERROR);
+      if (s->origPtr > 10 + 100000*s->blockSize100k) 
+         RETURN(BZ_DATA_ERROR);
+
+      /*--- Receive the mapping table ---*/
+      for (i = 0; i < 16; i++) {
+         GET_BIT(BZ_X_MAPPING_1, uc);
+         if (uc == 1) 
+            s->inUse16[i] = True; else 
+            s->inUse16[i] = False;
+      }
+
+      for (i = 0; i < 256; i++) s->inUse[i] = False;
+
+      for (i = 0; i < 16; i++)
+         if (s->inUse16[i])
+            for (j = 0; j < 16; j++) {
+               GET_BIT(BZ_X_MAPPING_2, uc);
+               if (uc == 1) s->inUse[i * 16 + j] = True;
+            }
+      makeMaps_d ( s );
+      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
+      alphaSize = s->nInUse+2;
+
+      /*--- Now the selectors ---*/
+      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
+      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
+      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
+      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
+      for (i = 0; i < nSelectors; i++) {
+         j = 0;
+         while (True) {
+            GET_BIT(BZ_X_SELECTOR_3, uc);
+            if (uc == 0) break;
+            j++;
+            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
+         }
+         /* Having more than BZ_MAX_SELECTORS doesn't make much sense
+            since they will never be used, but some implementations might
+            "round up" the number of selectors, so just ignore those. */
+         if (i < BZ_MAX_SELECTORS)
+           s->selectorMtf[i] = j;
+      }
+      if (nSelectors > BZ_MAX_SELECTORS)
+        nSelectors = BZ_MAX_SELECTORS;
+
+      /*--- Undo the MTF values for the selectors. ---*/
+      {
+         UChar pos[BZ_N_GROUPS], tmp, v;
+         for (v = 0; v < nGroups; v++) pos[v] = v;
+   
+         for (i = 0; i < nSelectors; i++) {
+            v = s->selectorMtf[i];
+            tmp = pos[v];
+            while (v > 0) { pos[v] = pos[v-1]; v--; }
+            pos[0] = tmp;
+            s->selector[i] = tmp;
+         }
+      }
+
+      /*--- Now the coding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         GET_BITS(BZ_X_CODING_1, curr, 5);
+         for (i = 0; i < alphaSize; i++) {
+            while (True) {
+               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
+               GET_BIT(BZ_X_CODING_2, uc);
+               if (uc == 0) break;
+               GET_BIT(BZ_X_CODING_3, uc);
+               if (uc == 0) curr++; else curr--;
+            }
+            s->len[t][i] = curr;
+         }
+      }
+
+      /*--- Create the Huffman decoding tables ---*/
+      for (t = 0; t < nGroups; t++) {
+         minLen = 32;
+         maxLen = 0;
+         for (i = 0; i < alphaSize; i++) {
+            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
+            if (s->len[t][i] < minLen) minLen = s->len[t][i];
+         }
+         BZ2_hbCreateDecodeTables ( 
+            &(s->limit[t][0]), 
+            &(s->base[t][0]), 
+            &(s->perm[t][0]), 
+            &(s->len[t][0]),
+            minLen, maxLen, alphaSize
+         );
+         s->minLens[t] = minLen;
+      }
+
+      /*--- Now the MTF values ---*/
+
+      EOB      = s->nInUse+1;
+      nblockMAX = 100000 * s->blockSize100k;
+      groupNo  = -1;
+      groupPos = 0;
+
+      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
+
+      /*-- MTF init --*/
+      {
+         Int32 ii, jj, kk;
+         kk = MTFA_SIZE-1;
+         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
+            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
+               kk--;
+            }
+            s->mtfbase[ii] = kk + 1;
+         }
+      }
+      /*-- end MTF init --*/
+
+      nblock = 0;
+      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
+
+      while (True) {
+
+         if (nextSym == EOB) break;
+
+         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
+
+            es = -1;
+            N = 1;
+            do {
+               /* Check that N doesn't get too big, so that es doesn't
+                  go negative.  The maximum value that can be
+                  RUNA/RUNB encoded is equal to the block size (post
+                  the initial RLE), viz, 900k, so bounding N at 2
+                  million should guard against overflow without
+                  rejecting any legitimate inputs. */
+               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
+               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
+               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
+               N = N * 2;
+               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
+            }
+               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
+
+            es++;
+            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
+            s->unzftab[uc] += es;
+
+            if (s->smallDecompress)
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->ll16[nblock] = (UInt16)uc;
+                  nblock++;
+                  es--;
+               }
+            else
+               while (es > 0) {
+                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+                  s->tt[nblock] = (UInt32)uc;
+                  nblock++;
+                  es--;
+               };
+
+            continue;
+
+         } else {
+
+            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
+
+            /*-- uc = MTF ( nextSym-1 ) --*/
+            {
+               Int32 ii, jj, kk, pp, lno, off;
+               UInt32 nn;
+               nn = (UInt32)(nextSym - 1);
+
+               if (nn < MTFL_SIZE) {
+                  /* avoid general-case expense */
+                  pp = s->mtfbase[0];
+                  uc = s->mtfa[pp+nn];
+                  while (nn > 3) {
+                     Int32 z = pp+nn;
+                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
+                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
+                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
+                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
+                     nn -= 4;
+                  }
+                  while (nn > 0) { 
+                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
+                  };
+                  s->mtfa[pp] = uc;
+               } else { 
+                  /* general case */
+                  lno = nn / MTFL_SIZE;
+                  off = nn % MTFL_SIZE;
+                  pp = s->mtfbase[lno] + off;
+                  uc = s->mtfa[pp];
+                  while (pp > s->mtfbase[lno]) { 
+                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
+                  };
+                  s->mtfbase[lno]++;
+                  while (lno > 0) {
+                     s->mtfbase[lno]--;
+                     s->mtfa[s->mtfbase[lno]] 
+                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
+                     lno--;
+                  }
+                  s->mtfbase[0]--;
+                  s->mtfa[s->mtfbase[0]] = uc;
+                  if (s->mtfbase[0] == 0) {
+                     kk = MTFA_SIZE-1;
+                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
+                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
+                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
+                           kk--;
+                        }
+                        s->mtfbase[ii] = kk + 1;
+                     }
+                  }
+               }
+            }
+            /*-- end uc = MTF ( nextSym-1 ) --*/
+
+            s->unzftab[s->seqToUnseq[uc]]++;
+            if (s->smallDecompress)
+               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
+               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
+            nblock++;
+
+            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
+            continue;
+         }
+      }
+
+      /* Now we know what nblock is, we can do a better sanity
+         check on s->origPtr.
+      */
+      if (s->origPtr < 0 || s->origPtr >= nblock)
+         RETURN(BZ_DATA_ERROR);
+
+      /*-- Set up cftab to facilitate generation of T^(-1) --*/
+      /* Check: unzftab entries in range. */
+      for (i = 0; i <= 255; i++) {
+         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
+            RETURN(BZ_DATA_ERROR);
+      }
+      /* Actually generate cftab. */
+      s->cftab[0] = 0;
+      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
+      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
+      /* Check: cftab entries in range. */
+      for (i = 0; i <= 256; i++) {
+         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
+            /* s->cftab[i] can legitimately be == nblock */
+            RETURN(BZ_DATA_ERROR);
+         }
+      }
+      /* Check: cftab entries non-descending. */
+      for (i = 1; i <= 256; i++) {
+         if (s->cftab[i-1] > s->cftab[i]) {
+            RETURN(BZ_DATA_ERROR);
+         }
+      }
+
+      s->state_out_len = 0;
+      s->state_out_ch  = 0;
+      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
+      s->state = BZ_X_OUTPUT;
+      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
+
+      if (s->smallDecompress) {
+
+         /*-- Make a copy of cftab, used in generation of T --*/
+         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
+
+         /*-- compute the T vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->ll16[i]);
+            SET_LL(i, s->cftabCopy[uc]);
+            s->cftabCopy[uc]++;
+         }
+
+         /*-- Compute T^(-1) by pointer reversal on T --*/
+         i = s->origPtr;
+         j = GET_LL(i);
+         do {
+            Int32 tmp = GET_LL(j);
+            SET_LL(j, i);
+            i = j;
+            j = tmp;
+         }
+            while (i != s->origPtr);
+
+         s->tPos = s->origPtr;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_SMALL(s->k0); s->nblock_used++;
+         }
+
+      } else {
+
+         /*-- compute the T^(-1) vector --*/
+         for (i = 0; i < nblock; i++) {
+            uc = (UChar)(s->tt[i] & 0xff);
+            s->tt[s->cftab[uc]] |= (i << 8);
+            s->cftab[uc]++;
+         }
+
+         s->tPos = s->tt[s->origPtr] >> 8;
+         s->nblock_used = 0;
+         if (s->blockRandomised) {
+            BZ_RAND_INIT_MASK;
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
+         } else {
+            BZ_GET_FAST(s->k0); s->nblock_used++;
+         }
+
+      }
+
+      RETURN(BZ_OK);
+
+
+
+    endhdr_2:
+
+      GET_UCHAR(BZ_X_ENDHDR_2, uc);
+      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_3, uc);
+      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_4, uc);
+      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_5, uc);
+      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
+      GET_UCHAR(BZ_X_ENDHDR_6, uc);
+      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
+
+      s->storedCombinedCRC = 0;
+      GET_UCHAR(BZ_X_CCRC_1, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_2, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_3, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+      GET_UCHAR(BZ_X_CCRC_4, uc);
+      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
+
+      s->state = BZ_X_IDLE;
+      RETURN(BZ_STREAM_END);
+
+      default: AssertH ( False, 4001 );
+   }
+
+   AssertH ( False, 4002 );
+
+   save_state_and_return:
+
+   s->save_i           = i;
+   s->save_j           = j;
+   s->save_t           = t;
+   s->save_alphaSize   = alphaSize;
+   s->save_nGroups     = nGroups;
+   s->save_nSelectors  = nSelectors;
+   s->save_EOB         = EOB;
+   s->save_groupNo     = groupNo;
+   s->save_groupPos    = groupPos;
+   s->save_nextSym     = nextSym;
+   s->save_nblockMAX   = nblockMAX;
+   s->save_nblock      = nblock;
+   s->save_es          = es;
+   s->save_N           = N;
+   s->save_curr        = curr;
+   s->save_zt          = zt;
+   s->save_zn          = zn;
+   s->save_zvec        = zvec;
+   s->save_zj          = zj;
+   s->save_gSel        = gSel;
+   s->save_gMinlen     = gMinlen;
+   s->save_gLimit      = gLimit;
+   s->save_gBase       = gBase;
+   s->save_gPerm       = gPerm;
+
+   return retVal;   
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                      decompress.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/dlltest.c b/third_party/bzip2/dlltest.c
new file mode 100644
index 000000000..03fa14620
--- /dev/null
+++ b/third_party/bzip2/dlltest.c
@@ -0,0 +1,175 @@
+/*
+   minibz2
+      libbz2.dll test program.
+      by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
+      This file is Public Domain.  Welcome any email to me.
+
+   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
+*/
+
+#define BZ_IMPORT
+#include 
+#include 
+#include "bzlib.h"
+#ifdef _WIN32
+#include 
+#endif
+
+
+#ifdef _WIN32
+
+#define BZ2_LIBNAME "libbz2-1.0.2.DLL" 
+
+#include 
+static int BZ2DLLLoaded = 0;
+static HINSTANCE BZ2DLLhLib;
+int BZ2DLLLoadLibrary(void)
+{
+   HINSTANCE hLib;
+
+   if(BZ2DLLLoaded==1){return 0;}
+   hLib=LoadLibrary(BZ2_LIBNAME);
+   if(hLib == NULL){
+      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
+      return -1;
+   }
+   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
+   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
+   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
+   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
+   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
+   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
+   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
+   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
+
+   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
+       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
+       || !BZ2_bzclose || !BZ2_bzerror) {
+      fprintf(stderr,"GetProcAddress failed.\n");
+      return -1;
+   }
+   BZ2DLLLoaded=1;
+   BZ2DLLhLib=hLib;
+   return 0;
+
+}
+int BZ2DLLFreeLibrary(void)
+{
+   if(BZ2DLLLoaded==0){return 0;}
+   FreeLibrary(BZ2DLLhLib);
+   BZ2DLLLoaded=0;
+}
+#endif /* WIN32 */
+
+void usage(void)
+{
+   puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
+}
+
+int main(int argc,char *argv[])
+{
+   int decompress = 0;
+   int level = 9;
+   char *fn_r = NULL;
+   char *fn_w = NULL;
+
+#ifdef _WIN32
+   if(BZ2DLLLoadLibrary()<0){
+      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
+      exit(1);
+   }
+   printf("Loading of %s succeeded.  Library version is %s.\n",
+          BZ2_LIBNAME, BZ2_bzlibVersion() );
+#endif
+   while(++argv,--argc){
+      if(**argv =='-' || **argv=='/'){
+         char *p;
+
+         for(p=*argv+1;*p;p++){
+            if(*p=='d'){
+               decompress = 1;
+            }else if('1'<=*p && *p<='9'){
+               level = *p - '0';
+            }else{
+               usage();
+               exit(1);
+            }
+         }
+      }else{
+         break;
+      }
+   }
+   if(argc>=1){
+      fn_r = *argv;
+      argc--;argv++;
+   }else{
+      fn_r = NULL;
+   }
+   if(argc>=1){
+      fn_w = *argv;
+      argc--;argv++;
+   }else{
+      fn_w = NULL;
+   }
+   {
+      int len;
+      char buff[0x1000];
+      char mode[10];
+
+      if(decompress){
+         BZFILE *BZ2fp_r = NULL;
+         FILE *fp_w = NULL;
+
+         if(fn_w){
+            if((fp_w = fopen(fn_w,"wb"))==NULL){
+               printf("can't open [%s]\n",fn_w);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_w = stdout;
+         }
+         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
+            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
+            fwrite(buff,1,len,fp_w);
+         }
+         BZ2_bzclose(BZ2fp_r);
+         if(fp_w != stdout) fclose(fp_w);
+      }else{
+         BZFILE *BZ2fp_w = NULL;
+         FILE *fp_r = NULL;
+
+         if(fn_r){
+            if((fp_r = fopen(fn_r,"rb"))==NULL){
+               printf("can't open [%s]\n",fn_r);
+               perror("reason:");
+               exit(1);
+            }
+         }else{
+            fp_r = stdin;
+         }
+         mode[0]='w';
+         mode[1] = '0' + level;
+         mode[2] = '\0';
+
+         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
+            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
+            printf("can't bz2openstream\n");
+            exit(1);
+         }
+         while((len=fread(buff,1,0x1000,fp_r))>0){
+            BZ2_bzwrite(BZ2fp_w,buff,len);
+         }
+         BZ2_bzclose(BZ2fp_w);
+         if(fp_r!=stdin)fclose(fp_r);
+      }
+   }
+#ifdef _WIN32
+   BZ2DLLFreeLibrary();
+#endif
+   return 0;
+}
diff --git a/third_party/bzip2/dlltest.dsp b/third_party/bzip2/dlltest.dsp
new file mode 100644
index 000000000..4b1615edc
--- /dev/null
+++ b/third_party/bzip2/dlltest.dsp
@@ -0,0 +1,93 @@
+# Microsoft Developer Studio Project File - Name="dlltest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ŇŹW‚µ‚Č‚˘‚Ĺ‚­‚ľ‚ł‚˘ **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=dlltest - Win32 Debug
+!MESSAGE ‚±‚ę‚Í—LŚř‚ČҲ¸Ě§˛Ů‚Ĺ‚Í‚ ‚č‚Ü‚ą‚ńB ‚±‚ĚĚßŰĽŢŞ¸Ä‚đËŢŮÄŢ‚·‚é‚˝‚ß‚É‚Í NMAKE ‚đŽg—p‚µ‚Ä‚­‚ľ‚ł‚˘B
+!MESSAGE [Ҳ¸Ě§˛Ů‚Ě´¸˝Îß°Ä] şĎÝÄŢ‚đŽg—p‚µ‚ÄŽŔŤs‚µ‚Ä‚­‚ľ‚ł‚˘
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak".
+!MESSAGE 
+!MESSAGE NMAKE ‚ĚŽŔŤsŽž‚ÉŤ\¬‚đŽw’č‚Ĺ‚«‚Ü‚·
+!MESSAGE şĎÝÄŢ ×˛ÝŹă‚ĹϸۂĚÝ’č‚đ’č‹`‚µ‚Ü‚·B—á:
+!MESSAGE 
+!MESSAGE NMAKE /f "dlltest.mak" CFG="dlltest - Win32 Debug"
+!MESSAGE 
+!MESSAGE ‘I‘đ‰Â”\‚ČËŢŮÄŢ Ó°ÄŢ:
+!MESSAGE 
+!MESSAGE "dlltest - Win32 Release" ("Win32 (x86) Console Application" —p)
+!MESSAGE "dlltest - Win32 Debug" ("Win32 (x86) Console Application" —p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "dlltest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"minibz2.exe"
+
+!ELSEIF  "$(CFG)" == "dlltest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "dlltest_"
+# PROP BASE Intermediate_Dir "dlltest_"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "dlltest_"
+# PROP Intermediate_Dir "dlltest_"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"minibz2.exe" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "dlltest - Win32 Release"
+# Name "dlltest - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dlltest.c
+# End Source File
+# End Target
+# End Project
diff --git a/third_party/bzip2/entities.xml b/third_party/bzip2/entities.xml
new file mode 100644
index 000000000..dd699246f
--- /dev/null
+++ b/third_party/bzip2/entities.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/third_party/bzip2/format.pl b/third_party/bzip2/format.pl
new file mode 100755
index 000000000..2734dede1
--- /dev/null
+++ b/third_party/bzip2/format.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+#
+# ------------------------------------------------------------------
+# This file is part of bzip2/libbzip2, a program and library for
+# lossless, block-sorting data compression.
+#
+# bzip2/libbzip2 version 1.0.8 of 13 July 2019
+# Copyright (C) 1996-2019 Julian Seward 
+#
+# Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+# README file.
+#
+# This program is released under the terms of the license contained
+# in the file LICENSE.
+# ------------------------------------------------------------------
+#
+use strict;
+
+# get command line values:
+if ( $#ARGV !=1 ) {
+    die "Usage:  $0 xml_infile xml_outfile\n";
+}
+
+my $infile = shift;
+# check infile exists
+die "Can't find file \"$infile\""
+  unless -f $infile;
+# check we can read infile
+if (! -r $infile) {
+    die "Can't read input $infile\n";
+}
+# check we can open infile
+open( INFILE,"<$infile" ) or 
+    die "Can't input $infile $!";
+
+#my $outfile = 'fmt-manual.xml';
+my $outfile = shift;
+#print "Infile: $infile, Outfile: $outfile\n";
+# check we can write to outfile
+open( OUTFILE,">$outfile" ) or 
+    die "Can't output $outfile $! for writing";
+
+my ($prev, $curr, $str);
+$prev = ''; $curr = '';
+while (  ) {
+
+		print OUTFILE $prev;
+    $prev = $curr;
+    $curr = $_;
+    $str = '';
+
+    if ( $prev =~ /$|$/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "|<\/screen>/ ) {
+        chomp $prev;
+        $curr = join( '', $prev, "]]>", $curr );
+				$prev = '';
+        next;
+    }
+}
+print OUTFILE $curr;
+close INFILE;
+close OUTFILE;
+exit;
diff --git a/third_party/bzip2/huffman.c b/third_party/bzip2/huffman.c
new file mode 100644
index 000000000..43a1899e4
--- /dev/null
+++ b/third_party/bzip2/huffman.c
@@ -0,0 +1,205 @@
+
+/*-------------------------------------------------------------*/
+/*--- Huffman coding low-level stuff                        ---*/
+/*---                                             huffman.c ---*/
+/*-------------------------------------------------------------*/
+
+/* ------------------------------------------------------------------
+   This file is part of bzip2/libbzip2, a program and library for
+   lossless, block-sorting data compression.
+
+   bzip2/libbzip2 version 1.0.8 of 13 July 2019
+   Copyright (C) 1996-2019 Julian Seward 
+
+   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
+   README file.
+
+   This program is released under the terms of the license contained
+   in the file LICENSE.
+   ------------------------------------------------------------------ */
+
+
+#include "bzlib_private.h"
+
+/*---------------------------------------------------*/
+#define WEIGHTOF(zz0)  ((zz0) & 0xffffff00)
+#define DEPTHOF(zz1)   ((zz1) & 0x000000ff)
+#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
+
+#define ADDWEIGHTS(zw1,zw2)                           \
+   (WEIGHTOF(zw1)+WEIGHTOF(zw2)) |                    \
+   (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
+
+#define UPHEAP(z)                                     \
+{                                                     \
+   Int32 zz, tmp;                                     \
+   zz = z; tmp = heap[zz];                            \
+   while (weight[tmp] < weight[heap[zz >> 1]]) {      \
+      heap[zz] = heap[zz >> 1];                       \
+      zz >>= 1;                                       \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+#define DOWNHEAP(z)                                   \
+{                                                     \
+   Int32 zz, yy, tmp;                                 \
+   zz = z; tmp = heap[zz];                            \
+   while (True) {                                     \
+      yy = zz << 1;                                   \
+      if (yy > nHeap) break;                          \
+      if (yy < nHeap &&                               \
+          weight[heap[yy+1]] < weight[heap[yy]])      \
+         yy++;                                        \
+      if (weight[tmp] < weight[heap[yy]]) break;      \
+      heap[zz] = heap[yy];                            \
+      zz = yy;                                        \
+   }                                                  \
+   heap[zz] = tmp;                                    \
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbMakeCodeLengths ( UChar *len, 
+                             Int32 *freq,
+                             Int32 alphaSize,
+                             Int32 maxLen )
+{
+   /*--
+      Nodes and heap entries run from 1.  Entry 0
+      for both the heap and nodes is a sentinel.
+   --*/
+   Int32 nNodes, nHeap, n1, n2, i, j, k;
+   Bool  tooLong;
+
+   Int32 heap   [ BZ_MAX_ALPHA_SIZE + 2 ];
+   Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
+   Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; 
+
+   for (i = 0; i < alphaSize; i++)
+      weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
+
+   while (True) {
+
+      nNodes = alphaSize;
+      nHeap = 0;
+
+      heap[0] = 0;
+      weight[0] = 0;
+      parent[0] = -2;
+
+      for (i = 1; i <= alphaSize; i++) {
+         parent[i] = -1;
+         nHeap++;
+         heap[nHeap] = i;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
+   
+      while (nHeap > 1) {
+         n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+         nNodes++;
+         parent[n1] = parent[n2] = nNodes;
+         weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
+         parent[nNodes] = -1;
+         nHeap++;
+         heap[nHeap] = nNodes;
+         UPHEAP(nHeap);
+      }
+
+      AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
+
+      tooLong = False;
+      for (i = 1; i <= alphaSize; i++) {
+         j = 0;
+         k = i;
+         while (parent[k] >= 0) { k = parent[k]; j++; }
+         len[i-1] = j;
+         if (j > maxLen) tooLong = True;
+      }
+      
+      if (! tooLong) break;
+
+      /* 17 Oct 04: keep-going condition for the following loop used
+         to be 'i < alphaSize', which missed the last element,
+         theoretically leading to the possibility of the compressor
+         looping.  However, this count-scaling step is only needed if
+         one of the generated Huffman code words is longer than
+         maxLen, which up to and including version 1.0.2 was 20 bits,
+         which is extremely unlikely.  In version 1.0.3 maxLen was
+         changed to 17 bits, which has minimal effect on compression
+         ratio, but does mean this scaling step is used from time to
+         time, enough to verify that it works.
+
+         This means that bzip2-1.0.3 and later will only produce
+         Huffman codes with a maximum length of 17 bits.  However, in
+         order to preserve backwards compatibility with bitstreams
+         produced by versions pre-1.0.3, the decompressor must still
+         handle lengths of up to 20. */
+
+      for (i = 1; i <= alphaSize; i++) {
+         j = weight[i] >> 8;
+         j = 1 + (j / 2);
+         weight[i] = j << 8;
+      }
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbAssignCodes ( Int32 *code,
+                         UChar *length,
+                         Int32 minLen,
+                         Int32 maxLen,
+                         Int32 alphaSize )
+{
+   Int32 n, vec, i;
+
+   vec = 0;
+   for (n = minLen; n <= maxLen; n++) {
+      for (i = 0; i < alphaSize; i++)
+         if (length[i] == n) { code[i] = vec; vec++; };
+      vec <<= 1;
+   }
+}
+
+
+/*---------------------------------------------------*/
+void BZ2_hbCreateDecodeTables ( Int32 *limit,
+                                Int32 *base,
+                                Int32 *perm,
+                                UChar *length,
+                                Int32 minLen,
+                                Int32 maxLen,
+                                Int32 alphaSize )
+{
+   Int32 pp, i, j, vec;
+
+   pp = 0;
+   for (i = minLen; i <= maxLen; i++)
+      for (j = 0; j < alphaSize; j++)
+         if (length[j] == i) { perm[pp] = j; pp++; };
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
+   for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
+
+   for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
+
+   for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
+   vec = 0;
+
+   for (i = minLen; i <= maxLen; i++) {
+      vec += (base[i+1] - base[i]);
+      limit[i] = vec-1;
+      vec <<= 1;
+   }
+   for (i = minLen + 1; i <= maxLen; i++)
+      base[i] = ((limit[i-1] + 1) << 1) - base[i];
+}
+
+
+/*-------------------------------------------------------------*/
+/*--- end                                         huffman.c ---*/
+/*-------------------------------------------------------------*/
diff --git a/third_party/bzip2/libbz2.def b/third_party/bzip2/libbz2.def
new file mode 100644
index 000000000..2dc0dd891
--- /dev/null
+++ b/third_party/bzip2/libbz2.def
@@ -0,0 +1,27 @@
+LIBRARY			LIBBZ2
+DESCRIPTION		"libbzip2: library for data compression"
+EXPORTS
+	BZ2_bzCompressInit
+	BZ2_bzCompress
+	BZ2_bzCompressEnd
+	BZ2_bzDecompressInit
+	BZ2_bzDecompress
+	BZ2_bzDecompressEnd
+	BZ2_bzReadOpen
+	BZ2_bzReadClose
+	BZ2_bzReadGetUnused
+	BZ2_bzRead
+	BZ2_bzWriteOpen
+	BZ2_bzWrite
+	BZ2_bzWriteClose
+	BZ2_bzWriteClose64
+	BZ2_bzBuffToBuffCompress
+	BZ2_bzBuffToBuffDecompress
+	BZ2_bzlibVersion
+	BZ2_bzopen
+	BZ2_bzdopen
+	BZ2_bzread
+	BZ2_bzwrite
+	BZ2_bzflush
+	BZ2_bzclose
+	BZ2_bzerror
diff --git a/third_party/bzip2/libbz2.dsp b/third_party/bzip2/libbz2.dsp
new file mode 100644
index 000000000..a21a20f75
--- /dev/null
+++ b/third_party/bzip2/libbz2.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="libbz2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** •ŇŹW‚µ‚Č‚˘‚Ĺ‚­‚ľ‚ł‚˘ **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libbz2 - Win32 Debug
+!MESSAGE ‚±‚ę‚Í—LŚř‚ČҲ¸Ě§˛Ů‚Ĺ‚Í‚ ‚č‚Ü‚ą‚ńB ‚±‚ĚĚßŰĽŢŞ¸Ä‚đËŢŮÄŢ‚·‚é‚˝‚ß‚É‚Í NMAKE ‚đŽg—p‚µ‚Ä‚­‚ľ‚ł‚˘B
+!MESSAGE [Ҳ¸Ě§˛Ů‚Ě´¸˝Îß°Ä] şĎÝÄŢ‚đŽg—p‚µ‚ÄŽŔŤs‚µ‚Ä‚­‚ľ‚ł‚˘
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak".
+!MESSAGE 
+!MESSAGE NMAKE ‚ĚŽŔŤsŽž‚ÉŤ\¬‚đŽw’č‚Ĺ‚«‚Ü‚·
+!MESSAGE şĎÝÄŢ ×˛ÝŹă‚ĹϸۂĚÝ’č‚đ’č‹`‚µ‚Ü‚·B—á:
+!MESSAGE 
+!MESSAGE NMAKE /f "libbz2.mak" CFG="libbz2 - Win32 Debug"
+!MESSAGE 
+!MESSAGE ‘I‘đ‰Â”\‚ČËŢŮÄŢ Ó°ÄŢ:
+!MESSAGE 
+!MESSAGE "libbz2 - Win32 Release" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE "libbz2 - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" —p)
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libbz2 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"libbz2.dll"
+
+!ELSEIF  "$(CFG)" == "libbz2 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"libbz2.dll" /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libbz2 - Win32 Release"
+# Name "libbz2 - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\blocksort.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\bzlib_private.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\crctable.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\decompress.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\libbz2.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\randtable.c
+# End Source File
+# End Target
+# End Project
diff --git a/third_party/bzip2/makefile.msc b/third_party/bzip2/makefile.msc
new file mode 100644
index 000000000..799a18a5f
--- /dev/null
+++ b/third_party/bzip2/makefile.msc
@@ -0,0 +1,63 @@
+# Makefile for Microsoft Visual C++ 6.0
+# usage: nmake -f makefile.msc
+# K.M. Syring (syring@gsf.de)
+# Fixed up by JRS for bzip2-0.9.5d release.
+
+CC=cl
+CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo
+
+OBJS= blocksort.obj  \
+      huffman.obj    \
+      crctable.obj   \
+      randtable.obj  \
+      compress.obj   \
+      decompress.obj \
+      bzlib.obj
+
+all: lib bzip2 test
+
+bzip2: lib
+	$(CC) $(CFLAGS) -o bzip2 bzip2.c libbz2.lib setargv.obj
+	$(CC) $(CFLAGS) -o bzip2recover bzip2recover.c
+
+lib: $(OBJS)
+	lib /out:libbz2.lib $(OBJS)
+
+test: bzip2
+	type words1
+	.\\bzip2 -1  < sample1.ref > sample1.rb2
+	.\\bzip2 -2  < sample2.ref > sample2.rb2
+	.\\bzip2 -3  < sample3.ref > sample3.rb2
+	.\\bzip2 -d  < sample1.bz2 > sample1.tst
+	.\\bzip2 -d  < sample2.bz2 > sample2.tst
+	.\\bzip2 -ds < sample3.bz2 > sample3.tst
+	@echo All six of the fc's should find no differences.
+	@echo If fc finds an error on sample3.bz2, this could be
+	@echo because WinZip's 'TAR file smart CR/LF conversion'
+	@echo is too clever for its own good.  Disable this option.
+	@echo The correct size for sample3.ref is 120,244.  If it
+	@echo is 150,251, WinZip has messed it up.
+	fc sample1.bz2 sample1.rb2 
+	fc sample2.bz2 sample2.rb2
+	fc sample3.bz2 sample3.rb2
+	fc sample1.tst sample1.ref
+	fc sample2.tst sample2.ref
+	fc sample3.tst sample3.ref
+
+
+
+clean: 
+	del *.obj
+	del libbz2.lib 
+	del bzip2.exe
+	del bzip2recover.exe
+	del sample1.rb2 
+	del sample2.rb2 
+	del sample3.rb2
+	del sample1.tst 
+	del sample2.tst
+	del sample3.tst
+
+.c.obj: 
+	$(CC) $(CFLAGS) -c $*.c -o $*.obj
+
diff --git a/third_party/bzip2/manual.xml b/third_party/bzip2/manual.xml
new file mode 100644
index 000000000..ea9fca2e8
--- /dev/null
+++ b/third_party/bzip2/manual.xml
@@ -0,0 +1,2964 @@
+ 
+
+ %common-ents;
+]>
+
+
+
+ 
+  bzip2 and libbzip2, version &bz-version;
+  A program and library for data compression
+  
+   &bz-lifespan;
+   Julian Seward
+  
+  Version &bz-version; of &bz-date;
+
+  
+   
+    Julian
+    Seward
+    
+     &bz-url;
+    
+   
+  
+
+  
+
+  This program, bzip2, the
+  associated library libbzip2, and
+  all documentation, are copyright © &bz-lifespan; Julian Seward.
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with
+  or without modification, are permitted provided that the
+  following conditions are met:
+
+  
+
+   Redistributions of source code must retain the
+   above copyright notice, this list of conditions and the
+   following disclaimer.
+
+   The origin of this software must not be
+   misrepresented; you must not claim that you wrote the original
+   software.  If you use this software in a product, an
+   acknowledgment in the product documentation would be
+   appreciated but is not required.
+
+   Altered source versions must be plainly marked
+   as such, and must not be misrepresented as being the original
+   software.
+
+   The name of the author may not be used to
+   endorse or promote products derived from this software without
+   specific prior written permission.
+
+  
+
+  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY
+  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+  PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+  AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+  IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+  THE POSSIBILITY OF SUCH DAMAGE.
+
+ PATENTS: To the best of my knowledge,
+ bzip2 and
+ libbzip2 do not use any patented
+ algorithms.  However, I do not have the resources to carry
+ out a patent search.  Therefore I cannot give any guarantee of
+ the above statement.
+ 
+
+
+
+
+
+
+
+
+Introduction
+
+bzip2 compresses files
+using the Burrows-Wheeler block-sorting text compression
+algorithm, and Huffman coding.  Compression is generally
+considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of
+the PPM family of statistical compressors.
+
+bzip2 is built on top of
+libbzip2, a flexible library for
+handling compressed data in the
+bzip2 format.  This manual
+describes both how to use the program and how to work with the
+library interface.  Most of the manual is devoted to this
+library, not the program, which is good news if your interest is
+only in the program.
+
+
+
+  describes how to use
+ bzip2; this is the only part
+ you need to read if you just want to know how to operate the
+ program.
+
+  describes the
+ programming interfaces in detail, and
+
+  records some
+ miscellaneous notes which I thought ought to be recorded
+ somewhere.
+
+
+
+
+
+
+
+How to use bzip2
+
+This chapter contains a copy of the
+bzip2 man page, and nothing
+else.
+
+
+NAME
+
+
+
+ bzip2,
+  bunzip2 - a block-sorting file
+  compressor, v&bz-version;
+
+ bzcat -
+   decompresses files to stdout
+
+ bzip2recover -
+   recovers data from damaged bzip2 files
+
+
+
+
+
+
+
+SYNOPSIS
+
+
+
+ bzip2 [
+  -cdfkqstvzVL123456789 ] [ filenames ...  ]
+
+ bunzip2 [
+  -fkvsVL ] [ filenames ...  ]
+
+ bzcat [ -s ] [
+  filenames ...  ]
+
+ bzip2recover
+  filename
+
+
+
+
+
+
+
+DESCRIPTION
+
+bzip2 compresses files
+using the Burrows-Wheeler block sorting text compression
+algorithm, and Huffman coding.  Compression is generally
+considerably better than that achieved by more conventional
+LZ77/LZ78-based compressors, and approaches the performance of
+the PPM family of statistical compressors.
+
+The command-line options are deliberately very similar to
+those of GNU gzip, but they are
+not identical.
+
+bzip2 expects a list of
+file names to accompany the command-line flags.  Each file is
+replaced by a compressed version of itself, with the name
+original_name.bz2.  Each
+compressed file has the same modification date, permissions, and,
+when possible, ownership as the corresponding original, so that
+these properties can be correctly restored at decompression time.
+File name handling is naive in the sense that there is no
+mechanism for preserving original file names, permissions,
+ownerships or dates in filesystems which lack these concepts, or
+have serious file name length restrictions, such as
+MS-DOS.
+
+bzip2 and
+bunzip2 will by default not
+overwrite existing files.  If you want this to happen, specify
+the -f flag.
+
+If no file names are specified,
+bzip2 compresses from standard
+input to standard output.  In this case,
+bzip2 will decline to write
+compressed output to a terminal, as this would be entirely
+incomprehensible and therefore pointless.
+
+bunzip2 (or
+bzip2 -d) decompresses all
+specified files.  Files which were not created by
+bzip2 will be detected and
+ignored, and a warning issued.
+bzip2 attempts to guess the
+filename for the decompressed file from that of the compressed
+file as follows:
+
+
+
+ filename.bz2 
+  becomes
+  filename
+
+ filename.bz 
+  becomes
+  filename
+
+ filename.tbz2
+  becomes
+  filename.tar
+
+ filename.tbz 
+  becomes
+  filename.tar
+
+ anyothername 
+  becomes
+  anyothername.out
+
+
+
+If the file does not end in one of the recognised endings,
+.bz2,
+.bz,
+.tbz2 or
+.tbz,
+bzip2 complains that it cannot
+guess the name of the original file, and uses the original name
+with .out appended.
+
+As with compression, supplying no filenames causes
+decompression from standard input to standard output.
+
+bunzip2 will correctly
+decompress a file which is the concatenation of two or more
+compressed files.  The result is the concatenation of the
+corresponding uncompressed files.  Integrity testing
+(-t) of concatenated compressed
+files is also supported.
+
+You can also compress or decompress files to the standard
+output by giving the -c flag.
+Multiple files may be compressed and decompressed like this.  The
+resulting outputs are fed sequentially to stdout.  Compression of
+multiple files in this manner generates a stream containing
+multiple compressed file representations.  Such a stream can be
+decompressed correctly only by
+bzip2 version 0.9.0 or later.
+Earlier versions of bzip2 will
+stop after decompressing the first file in the stream.
+
+bzcat (or
+bzip2 -dc) decompresses all
+specified files to the standard output.
+
+bzip2 will read arguments
+from the environment variables
+BZIP2 and
+BZIP, in that order, and will
+process them before any arguments read from the command line.
+This gives a convenient way to supply default arguments.
+
+Compression is always performed, even if the compressed
+file is slightly larger than the original.  Files of less than
+about one hundred bytes tend to get larger, since the compression
+mechanism has a constant overhead in the region of 50 bytes.
+Random data (including the output of most file compressors) is
+coded at about 8.05 bits per byte, giving an expansion of around
+0.5%.
+
+As a self-check for your protection,
+bzip2 uses 32-bit CRCs to make
+sure that the decompressed version of a file is identical to the
+original.  This guards against corruption of the compressed data,
+and against undetected bugs in
+bzip2 (hopefully very unlikely).
+The chances of data corruption going undetected is microscopic,
+about one chance in four billion for each file processed.  Be
+aware, though, that the check occurs upon decompression, so it
+can only tell you that something is wrong.  It can't help you
+recover the original uncompressed data.  You can use
+bzip2recover to try to recover
+data from damaged files.
+
+Return values: 0 for a normal exit, 1 for environmental
+problems (file not found, invalid flags, I/O errors, etc.), 2
+to indicate a corrupt compressed file, 3 for an internal
+consistency error (eg, bug) which caused
+bzip2 to panic.
+
+
+
+
+
+OPTIONS
+
+
+
+ 
+ -c --stdout
+ Compress or decompress to standard
+  output.
+ 
+
+ 
+ -d --decompress
+ Force decompression.
+  bzip2,
+  bunzip2 and
+  bzcat are really the same
+  program, and the decision about what actions to take is done on
+  the basis of which name is used.  This flag overrides that
+  mechanism, and forces bzip2 to decompress.
+ 
+
+ 
+ -z --compress
+ The complement to
+  -d: forces compression,
+  regardless of the invokation name.
+ 
+
+ 
+ -t --test
+ Check integrity of the specified file(s), but
+  don't decompress them.  This really performs a trial
+  decompression and throws away the result.
+ 
+
+ 
+ -f --force
+ Force overwrite of output files.  Normally,
+  bzip2 will not overwrite
+  existing output files.  Also forces
+  bzip2 to break hard links to
+  files, which it otherwise wouldn't do.
+  bzip2 normally declines
+  to decompress files which don't have the correct magic header
+  bytes. If forced (-f),
+  however, it will pass such files through unmodified. This is
+  how GNU gzip behaves.
+ 
+ 
+
+ 
+ -k --keep
+ Keep (don't delete) input files during
+  compression or decompression.
+ 
+
+ 
+ -s --small
+ Reduce memory usage, for compression,
+  decompression and testing.  Files are decompressed and tested
+  using a modified algorithm which only requires 2.5 bytes per
+  block byte.  This means any file can be decompressed in 2300k
+  of memory, albeit at about half the normal speed.
+  During compression, -s
+  selects a block size of 200k, which limits memory use to around
+  the same figure, at the expense of your compression ratio.  In
+  short, if your machine is low on memory (8 megabytes or less),
+  use -s for everything.  See
+   below.
+ 
+
+ 
+ -q --quiet
+ Suppress non-essential warning messages.
+  Messages pertaining to I/O errors and other critical events
+  will not be suppressed.
+ 
+
+ 
+ -v --verbose
+ Verbose mode -- show the compression ratio for
+  each file processed.  Further
+  -v's increase the verbosity
+  level, spewing out lots of information which is primarily of
+  interest for diagnostic purposes.
+ 
+
+ 
+ -L --license -V --version
+ Display the software version, license terms and
+  conditions.
+ 
+
+ 
+ -1 (or
+ --fast) to
+ -9 (or
+ -best)
+ Set the block size to 100 k, 200 k ...  900 k
+  when compressing.  Has no effect when decompressing.  See  below.  The
+  --fast and
+  --best aliases are primarily
+  for GNU gzip compatibility.
+  In particular, --fast doesn't
+  make things significantly faster.  And
+  --best merely selects the
+  default behaviour.
+ 
+
+ 
+ --
+ Treats all subsequent arguments as file names,
+  even if they start with a dash.  This is so you can handle
+  files with names beginning with a dash, for example:
+  bzip2 --
+  -myfilename.
+ 
+
+ 
+ --repetitive-fast
+ --repetitive-best
+ These flags are redundant in versions 0.9.5 and
+  above.  They provided some coarse control over the behaviour of
+  the sorting algorithm in earlier versions, which was sometimes
+  useful.  0.9.5 and above have an improved algorithm which
+  renders these flags irrelevant.
+ 
+
+
+
+
+
+
+
+MEMORY MANAGEMENT
+
+bzip2 compresses large
+files in blocks.  The block size affects both the compression
+ratio achieved, and the amount of memory needed for compression
+and decompression.  The flags -1
+through -9 specify the block
+size to be 100,000 bytes through 900,000 bytes (the default)
+respectively.  At decompression time, the block size used for
+compression is read from the header of the compressed file, and
+bunzip2 then allocates itself
+just enough memory to decompress the file.  Since block sizes are
+stored in compressed files, it follows that the flags
+-1 to
+-9 are irrelevant to and so
+ignored during decompression.
+
+Compression and decompression requirements, in bytes, can be
+estimated as:
+
+Compression:   400k + ( 8 x block size )
+
+Decompression: 100k + ( 4 x block size ), or
+               100k + ( 2.5 x block size )
+
+
+Larger block sizes give rapidly diminishing marginal
+returns.  Most of the compression comes from the first two or
+three hundred k of block size, a fact worth bearing in mind when
+using bzip2 on small machines.
+It is also important to appreciate that the decompression memory
+requirement is set at compression time by the choice of block
+size.
+
+For files compressed with the default 900k block size,
+bunzip2 will require about 3700
+kbytes to decompress.  To support decompression of any file on a
+4 megabyte machine, bunzip2 has
+an option to decompress using approximately half this amount of
+memory, about 2300 kbytes.  Decompression speed is also halved,
+so you should use this option only where necessary.  The relevant
+flag is -s.
+
+In general, try and use the largest block size memory
+constraints allow, since that maximises the compression achieved.
+Compression and decompression speed are virtually unaffected by
+block size.
+
+Another significant point applies to files which fit in a
+single block -- that means most files you'd encounter using a
+large block size.  The amount of real memory touched is
+proportional to the size of the file, since the file is smaller
+than a block.  For example, compressing a file 20,000 bytes long
+with the flag -9 will cause the
+compressor to allocate around 7600k of memory, but only touch
+400k + 20000 * 8 = 560 kbytes of it.  Similarly, the decompressor
+will allocate 3700k but only touch 100k + 20000 * 4 = 180
+kbytes.
+
+Here is a table which summarises the maximum memory usage
+for different block sizes.  Also recorded is the total compressed
+size for 14 files of the Calgary Text Compression Corpus
+totalling 3,141,622 bytes.  This column gives some feel for how
+compression varies with block size.  These figures tend to
+understate the advantage of larger block sizes for larger files,
+since the Corpus is dominated by smaller files.
+
+
+        Compress   Decompress   Decompress   Corpus
+Flag     usage      usage       -s usage     Size
+
+ -1      1200k       500k         350k      914704
+ -2      2000k       900k         600k      877703
+ -3      2800k      1300k         850k      860338
+ -4      3600k      1700k        1100k      846899
+ -5      4400k      2100k        1350k      845160
+ -6      5200k      2500k        1600k      838626
+ -7      6100k      2900k        1850k      834096
+ -8      6800k      3300k        2100k      828642
+ -9      7600k      3700k        2350k      828642
+
+
+
+
+
+
+RECOVERING DATA FROM DAMAGED FILES
+
+bzip2 compresses files in
+blocks, usually 900kbytes long.  Each block is handled
+independently.  If a media or transmission error causes a
+multi-block .bz2 file to become
+damaged, it may be possible to recover data from the undamaged
+blocks in the file.
+
+The compressed representation of each block is delimited by
+a 48-bit pattern, which makes it possible to find the block
+boundaries with reasonable certainty.  Each block also carries
+its own 32-bit CRC, so damaged blocks can be distinguished from
+undamaged ones.
+
+bzip2recover is a simple
+program whose purpose is to search for blocks in
+.bz2 files, and write each block
+out into its own .bz2 file.  You
+can then use bzip2 -t to test
+the integrity of the resulting files, and decompress those which
+are undamaged.
+
+bzip2recover takes a
+single argument, the name of the damaged file, and writes a
+number of files rec0001file.bz2,
+rec0002file.bz2, etc, containing
+the extracted blocks.  The output filenames are designed so that
+the use of wildcards in subsequent processing -- for example,
+bzip2 -dc rec*file.bz2 >
+recovered_data -- lists the files in the correct
+order.
+
+bzip2recover should be of
+most use dealing with large .bz2
+files, as these will contain many blocks.  It is clearly futile
+to use it on damaged single-block files, since a damaged block
+cannot be recovered.  If you wish to minimise any potential data
+loss through media or transmission errors, you might consider
+compressing with a smaller block size.
+
+
+
+
+
+PERFORMANCE NOTES
+
+The sorting phase of compression gathers together similar
+strings in the file.  Because of this, files containing very long
+runs of repeated symbols, like "aabaabaabaab ..."  (repeated
+several hundred times) may compress more slowly than normal.
+Versions 0.9.5 and above fare much better than previous versions
+in this respect.  The ratio between worst-case and average-case
+compression time is in the region of 10:1.  For previous
+versions, this figure was more like 100:1.  You can use the
+-vvvv option to monitor progress
+in great detail, if you want.
+
+Decompression speed is unaffected by these
+phenomena.
+
+bzip2 usually allocates
+several megabytes of memory to operate in, and then charges all
+over it in a fairly random fashion.  This means that performance,
+both for compressing and decompressing, is largely determined by
+the speed at which your machine can service cache misses.
+Because of this, small changes to the code to reduce the miss
+rate have been observed to give disproportionately large
+performance improvements.  I imagine
+bzip2 will perform best on
+machines with very large caches.
+
+
+
+
+
+
+CAVEATS
+
+I/O error messages are not as helpful as they could be.
+bzip2 tries hard to detect I/O
+errors and exit cleanly, but the details of what the problem is
+sometimes seem rather misleading.
+
+This manual page pertains to version &bz-version; of
+bzip2.  Compressed data created by
+this version is entirely forwards and backwards compatible with the
+previous public releases, versions 0.1pl2, 0.9.0 and 0.9.5, 1.0.0,
+1.0.1, 1.0.2 and 1.0.3, but with the following exception: 0.9.0 and
+above can correctly decompress multiple concatenated compressed files.
+0.1pl2 cannot do this; it will stop after decompressing just the first
+file in the stream.
+
+bzip2recover versions
+prior to 1.0.2 used 32-bit integers to represent bit positions in
+compressed files, so it could not handle compressed files more
+than 512 megabytes long.  Versions 1.0.2 and above use 64-bit ints
+on some platforms which support them (GNU supported targets, and
+Windows). To establish whether or not
+bzip2recover was built with such
+a limitation, run it without arguments. In any event you can
+build yourself an unlimited version if you can recompile it with
+MaybeUInt64 set to be an
+unsigned 64-bit integer.
+
+
+
+
+
+
+AUTHOR
+
+Julian Seward,
+&bz-author;
+
+The ideas embodied in
+bzip2 are due to (at least) the
+following people: Michael Burrows and David Wheeler (for the
+block sorting transformation), David Wheeler (again, for the
+Huffman coder), Peter Fenwick (for the structured coding model in
+the original bzip, and many
+refinements), and Alistair Moffat, Radford Neal and Ian Witten
+(for the arithmetic coder in the original
+bzip).  I am much indebted for
+their help, support and advice.  See the manual in the source
+distribution for pointers to sources of documentation.  Christian
+von Roques encouraged me to look for faster sorting algorithms,
+so as to speed up compression.  Bela Lubkin encouraged me to
+improve the worst-case compression performance.  
+Donna Robinson XMLised the documentation.
+Many people sent
+patches, helped with portability problems, lent machines, gave
+advice and were generally helpful.
+
+
+
+
+
+
+
+
+
+Programming with <computeroutput>libbzip2</computeroutput>
+
+
+This chapter describes the programming interface to
+libbzip2.
+
+For general background information, particularly about
+memory use and performance aspects, you'd be well advised to read
+ as well.
+
+
+
+Top-level structure
+
+libbzip2 is a flexible
+library for compressing and decompressing data in the
+bzip2 data format.  Although
+packaged as a single entity, it helps to regard the library as
+three separate parts: the low level interface, and the high level
+interface, and some utility functions.
+
+The structure of
+libbzip2's interfaces is similar
+to that of Jean-loup Gailly's and Mark Adler's excellent
+zlib library.
+
+All externally visible symbols have names beginning
+BZ2_.  This is new in version
+1.0.  The intention is to minimise pollution of the namespaces of
+library clients.
+
+To use any part of the library, you need to
+#include <bzlib.h>
+into your sources.
+
+
+
+
+Low-level summary
+
+This interface provides services for compressing and
+decompressing data in memory.  There's no provision for dealing
+with files, streams or any other I/O mechanisms, just straight
+memory-to-memory work.  In fact, this part of the library can be
+compiled without inclusion of
+stdio.h, which may be helpful
+for embedded applications.
+
+The low-level part of the library has no global variables
+and is therefore thread-safe.
+
+Six routines make up the low level interface:
+BZ2_bzCompressInit,
+BZ2_bzCompress, and
+BZ2_bzCompressEnd for
+compression, and a corresponding trio
+BZ2_bzDecompressInit,
+BZ2_bzDecompress and
+BZ2_bzDecompressEnd for
+decompression.  The *Init
+functions allocate memory for compression/decompression and do
+other initialisations, whilst the
+*End functions close down
+operations and release memory.
+
+The real work is done by
+BZ2_bzCompress and
+BZ2_bzDecompress.  These
+compress and decompress data from a user-supplied input buffer to
+a user-supplied output buffer.  These buffers can be any size;
+arbitrary quantities of data are handled by making repeated calls
+to these functions.  This is a flexible mechanism allowing a
+consumer-pull style of activity, or producer-push, or a mixture
+of both.
+
+
+
+
+
+High-level summary
+
+This interface provides some handy wrappers around the
+low-level interface to facilitate reading and writing
+bzip2 format files
+(.bz2 files).  The routines
+provide hooks to facilitate reading files in which the
+bzip2 data stream is embedded
+within some larger-scale file structure, or where there are
+multiple bzip2 data streams
+concatenated end-to-end.
+
+For reading files,
+BZ2_bzReadOpen,
+BZ2_bzRead,
+BZ2_bzReadClose and 
+BZ2_bzReadGetUnused are
+supplied.  For writing files,
+BZ2_bzWriteOpen,
+BZ2_bzWrite and
+BZ2_bzWriteFinish are
+available.
+
+As with the low-level library, no global variables are used
+so the library is per se thread-safe.  However, if I/O errors
+occur whilst reading or writing the underlying compressed files,
+you may have to consult errno to
+determine the cause of the error.  In that case, you'd need a C
+library which correctly supports
+errno in a multithreaded
+environment.
+
+To make the library a little simpler and more portable,
+BZ2_bzReadOpen and
+BZ2_bzWriteOpen require you to
+pass them file handles (FILE*s)
+which have previously been opened for reading or writing
+respectively.  That avoids portability problems associated with
+file operations and file attributes, whilst not being much of an
+imposition on the programmer.
+
+
+
+
+
+Utility functions summary
+
+For very simple needs,
+BZ2_bzBuffToBuffCompress and
+BZ2_bzBuffToBuffDecompress are
+provided.  These compress data in memory from one buffer to
+another buffer in a single function call.  You should assess
+whether these functions fulfill your memory-to-memory
+compression/decompression requirements before investing effort in
+understanding the more general but more complex low-level
+interface.
+
+Yoshioka Tsuneo
+(tsuneo@rr.iij4u.or.jp) has
+contributed some functions to give better
+zlib compatibility.  These
+functions are BZ2_bzopen,
+BZ2_bzread,
+BZ2_bzwrite,
+BZ2_bzflush,
+BZ2_bzclose,
+BZ2_bzerror and
+BZ2_bzlibVersion.  You may find
+these functions more convenient for simple file reading and
+writing, than those in the high-level interface.  These functions
+are not (yet) officially part of the library, and are minimally
+documented here.  If they break, you get to keep all the pieces.
+I hope to document them properly when time permits.
+
+Yoshioka also contributed modifications to allow the
+library to be built as a Windows DLL.
+
+
+
+
+
+
+
+Error handling
+
+The library is designed to recover cleanly in all
+situations, including the worst-case situation of decompressing
+random data.  I'm not 100% sure that it can always do this, so
+you might want to add a signal handler to catch segmentation
+violations during decompression if you are feeling especially
+paranoid.  I would be interested in hearing more about the
+robustness of the library to corrupted compressed data.
+
+Version 1.0.3 more robust in this respect than any
+previous version.  Investigations with Valgrind (a tool for detecting
+problems with memory management) indicate
+that, at least for the few files I tested, all single-bit errors
+in the decompressed data are caught properly, with no
+segmentation faults, no uses of uninitialised data, no out of
+range reads or writes, and no infinite looping in the decompressor.
+So it's certainly pretty robust, although
+I wouldn't claim it to be totally bombproof.
+
+The file bzlib.h contains
+all definitions needed to use the library.  In particular, you
+should definitely not include
+bzlib_private.h.
+
+In bzlib.h, the various
+return values are defined.  The following list is not intended as
+an exhaustive description of the circumstances in which a given
+value may be returned -- those descriptions are given later.
+Rather, it is intended to convey the rough meaning of each return
+value.  The first five actions are normal and not intended to
+denote an error situation.
+
+
+
+ 
+  BZ_OK
+  The requested action was completed
+   successfully.
+ 
+
+ 
+  BZ_RUN_OK, BZ_FLUSH_OK,
+    BZ_FINISH_OK
+  In 
+   BZ2_bzCompress, the requested
+   flush/finish/nothing-special action was completed
+   successfully.
+ 
+
+ 
+  BZ_STREAM_END
+  Compression of data was completed, or the
+   logical stream end was detected during
+   decompression.
+ 
+
+
+
+The following return values indicate an error of some
+kind.
+
+
+
+ 
+  BZ_CONFIG_ERROR
+  Indicates that the library has been improperly
+   compiled on your platform -- a major configuration error.
+   Specifically, it means that
+   sizeof(char),
+   sizeof(short) and
+   sizeof(int) are not 1, 2 and
+   4 respectively, as they should be.  Note that the library
+   should still work properly on 64-bit platforms which follow
+   the LP64 programming model -- that is, where
+   sizeof(long) and
+   sizeof(void*) are 8.  Under
+   LP64, sizeof(int) is still 4,
+   so libbzip2, which doesn't
+   use the long type, is
+   OK.
+ 
+
+ 
+  BZ_SEQUENCE_ERROR
+  When using the library, it is important to call
+   the functions in the correct sequence and with data structures
+   (buffers etc) in the correct states.
+   libbzip2 checks as much as it
+   can to ensure this is happening, and returns
+   BZ_SEQUENCE_ERROR if not.
+   Code which complies precisely with the function semantics, as
+   detailed below, should never receive this value; such an event
+   denotes buggy code which you should
+   investigate.
+ 
+
+ 
+  BZ_PARAM_ERROR
+  Returned when a parameter to a function call is
+   out of range or otherwise manifestly incorrect.  As with
+   BZ_SEQUENCE_ERROR, this
+   denotes a bug in the client code.  The distinction between
+   BZ_PARAM_ERROR and
+   BZ_SEQUENCE_ERROR is a bit
+   hazy, but still worth making.
+ 
+
+ 
+  BZ_MEM_ERROR
+  Returned when a request to allocate memory
+   failed.  Note that the quantity of memory needed to decompress
+   a stream cannot be determined until the stream's header has
+   been read.  So
+   BZ2_bzDecompress and
+   BZ2_bzRead may return
+   BZ_MEM_ERROR even though some
+   of the compressed data has been read.  The same is not true
+   for compression; once
+   BZ2_bzCompressInit or
+   BZ2_bzWriteOpen have
+   successfully completed,
+   BZ_MEM_ERROR cannot
+   occur.
+ 
+
+ 
+  BZ_DATA_ERROR
+  Returned when a data integrity error is
+   detected during decompression.  Most importantly, this means
+   when stored and computed CRCs for the data do not match.  This
+   value is also returned upon detection of any other anomaly in
+   the compressed data.
+ 
+
+ 
+  BZ_DATA_ERROR_MAGIC
+  As a special case of
+   BZ_DATA_ERROR, it is
+   sometimes useful to know when the compressed stream does not
+   start with the correct magic bytes ('B' 'Z'
+   'h').
+ 
+
+ 
+  BZ_IO_ERROR
+  Returned by
+   BZ2_bzRead and
+   BZ2_bzWrite when there is an
+   error reading or writing in the compressed file, and by
+   BZ2_bzReadOpen and
+   BZ2_bzWriteOpen for attempts
+   to use a file for which the error indicator (viz,
+   ferror(f)) is set.  On
+   receipt of BZ_IO_ERROR, the
+   caller should consult errno
+   and/or perror to acquire
+   operating-system specific information about the
+   problem.
+ 
+
+ 
+  BZ_UNEXPECTED_EOF
+  Returned by
+   BZ2_bzRead when the
+   compressed file finishes before the logical end of stream is
+   detected.
+ 
+
+ 
+  BZ_OUTBUFF_FULL
+  Returned by
+   BZ2_bzBuffToBuffCompress and
+   BZ2_bzBuffToBuffDecompress to
+   indicate that the output data will not fit into the output
+   buffer provided.
+ 
+
+
+
+
+
+
+
+
+Low-level interface
+
+
+
+BZ2_bzCompressInit
+
+
+typedef struct {
+  char *next_in;
+  unsigned int avail_in;
+  unsigned int total_in_lo32;
+  unsigned int total_in_hi32;
+
+  char *next_out;
+  unsigned int avail_out;
+  unsigned int total_out_lo32;
+  unsigned int total_out_hi32;
+
+  void *state;
+
+  void *(*bzalloc)(void *,int,int);
+  void (*bzfree)(void *,void *);
+  void *opaque;
+} bz_stream;
+
+int BZ2_bzCompressInit ( bz_stream *strm, 
+                         int blockSize100k, 
+                         int verbosity,
+                         int workFactor );
+
+
+Prepares for compression.  The
+bz_stream structure holds all
+data pertaining to the compression activity.  A
+bz_stream structure should be
+allocated and initialised prior to the call.  The fields of
+bz_stream comprise the entirety
+of the user-visible data.  state
+is a pointer to the private data structures required for
+compression.
+
+Custom memory allocators are supported, via fields
+bzalloc,
+bzfree, and
+opaque.  The value
+opaque is passed to as the first
+argument to all calls to bzalloc
+and bzfree, but is otherwise
+ignored by the library.  The call bzalloc (
+opaque, n, m ) is expected to return a pointer
+p to n *
+m bytes of memory, and bzfree (
+opaque, p ) should free that memory.
+
+If you don't want to use a custom memory allocator, set
+bzalloc,
+bzfree and
+opaque to
+NULL, and the library will then
+use the standard malloc /
+free routines.
+
+Before calling
+BZ2_bzCompressInit, fields
+bzalloc,
+bzfree and
+opaque should be filled
+appropriately, as just described.  Upon return, the internal
+state will have been allocated and initialised, and
+total_in_lo32,
+total_in_hi32,
+total_out_lo32 and
+total_out_hi32 will have been
+set to zero.  These four fields are used by the library to inform
+the caller of the total amount of data passed into and out of the
+library, respectively.  You should not try to change them.  As of
+version 1.0, 64-bit counts are maintained, even on 32-bit
+platforms, using the _hi32
+fields to store the upper 32 bits of the count.  So, for example,
+the total amount of data in is (total_in_hi32
+<< 32) + total_in_lo32.
+
+Parameter blockSize100k
+specifies the block size to be used for compression.  It should
+be a value between 1 and 9 inclusive, and the actual block size
+used is 100000 x this figure.  9 gives the best compression but
+takes most memory.
+
+Parameter verbosity should
+be set to a number between 0 and 4 inclusive.  0 is silent, and
+greater numbers give increasingly verbose monitoring/debugging
+output.  If the library has been compiled with
+-DBZ_NO_STDIO, no such output
+will appear for any verbosity setting.
+
+Parameter workFactor
+controls how the compression phase behaves when presented with
+worst case, highly repetitive, input data.  If compression runs
+into difficulties caused by repetitive data, the library switches
+from the standard sorting algorithm to a fallback algorithm.  The
+fallback is slower than the standard algorithm by perhaps a
+factor of three, but always behaves reasonably, no matter how bad
+the input.
+
+Lower values of workFactor
+reduce the amount of effort the standard algorithm will expend
+before resorting to the fallback.  You should set this parameter
+carefully; too low, and many inputs will be handled by the
+fallback algorithm and so compress rather slowly, too high, and
+your average-to-worst case compression times can become very
+large.  The default value of 30 gives reasonable behaviour over a
+wide range of circumstances.
+
+Allowable values range from 0 to 250 inclusive.  0 is a
+special case, equivalent to using the default value of 30.
+
+Note that the compressed output generated is the same
+regardless of whether or not the fallback algorithm is
+used.
+
+Be aware also that this parameter may disappear entirely in
+future versions of the library.  In principle it should be
+possible to devise a good way to automatically choose which
+algorithm to use.  Such a mechanism would render the parameter
+obsolete.
+
+Possible return values:
+
+
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if strm is NULL 
+  or blockSize < 1 or blockSize > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR 
+  if not enough memory is available
+BZ_OK 
+  otherwise
+
+
+Allowable next actions:
+
+
+BZ2_bzCompress
+  if BZ_OK is returned
+  no specific action needed in case of error
+
+
+
+
+
+
+BZ2_bzCompress
+
+
+int BZ2_bzCompress ( bz_stream *strm, int action );
+
+
+Provides more input and/or output buffer space for the
+library.  The caller maintains input and output buffers, and
+calls BZ2_bzCompress to transfer
+data between them.
+
+Before each call to
+BZ2_bzCompress,
+next_in should point at the data
+to be compressed, and avail_in
+should indicate how many bytes the library may read.
+BZ2_bzCompress updates
+next_in,
+avail_in and
+total_in to reflect the number
+of bytes it has read.
+
+Similarly, next_out should
+point to a buffer in which the compressed data is to be placed,
+with avail_out indicating how
+much output space is available.
+BZ2_bzCompress updates
+next_out,
+avail_out and
+total_out to reflect the number
+of bytes output.
+
+You may provide and remove as little or as much data as you
+like on each call of
+BZ2_bzCompress.  In the limit,
+it is acceptable to supply and remove data one byte at a time,
+although this would be terribly inefficient.  You should always
+ensure that at least one byte of output space is available at
+each call.
+
+A second purpose of
+BZ2_bzCompress is to request a
+change of mode of the compressed stream.
+
+Conceptually, a compressed stream can be in one of four
+states: IDLE, RUNNING, FLUSHING and FINISHING.  Before
+initialisation
+(BZ2_bzCompressInit) and after
+termination (BZ2_bzCompressEnd),
+a stream is regarded as IDLE.
+
+Upon initialisation
+(BZ2_bzCompressInit), the stream
+is placed in the RUNNING state.  Subsequent calls to
+BZ2_bzCompress should pass
+BZ_RUN as the requested action;
+other actions are illegal and will result in
+BZ_SEQUENCE_ERROR.
+
+At some point, the calling program will have provided all
+the input data it wants to.  It will then want to finish up -- in
+effect, asking the library to process any data it might have
+buffered internally.  In this state,
+BZ2_bzCompress will no longer
+attempt to read data from
+next_in, but it will want to
+write data to next_out.  Because
+the output buffer supplied by the user can be arbitrarily small,
+the finishing-up operation cannot necessarily be done with a
+single call of
+BZ2_bzCompress.
+
+Instead, the calling program passes
+BZ_FINISH as an action to
+BZ2_bzCompress.  This changes
+the stream's state to FINISHING.  Any remaining input (ie,
+next_in[0 .. avail_in-1]) is
+compressed and transferred to the output buffer.  To do this,
+BZ2_bzCompress must be called
+repeatedly until all the output has been consumed.  At that
+point, BZ2_bzCompress returns
+BZ_STREAM_END, and the stream's
+state is set back to IDLE.
+BZ2_bzCompressEnd should then be
+called.
+
+Just to make sure the calling program does not cheat, the
+library makes a note of avail_in
+at the time of the first call to
+BZ2_bzCompress which has
+BZ_FINISH as an action (ie, at
+the time the program has announced its intention to not supply
+any more input).  By comparing this value with that of
+avail_in over subsequent calls
+to BZ2_bzCompress, the library
+can detect any attempts to slip in more data to compress.  Any
+calls for which this is detected will return
+BZ_SEQUENCE_ERROR.  This
+indicates a programming mistake which should be corrected.
+
+Instead of asking to finish, the calling program may ask
+BZ2_bzCompress to take all the
+remaining input, compress it and terminate the current
+(Burrows-Wheeler) compression block.  This could be useful for
+error control purposes.  The mechanism is analogous to that for
+finishing: call BZ2_bzCompress
+with an action of BZ_FLUSH,
+remove output data, and persist with the
+BZ_FLUSH action until the value
+BZ_RUN is returned.  As with
+finishing, BZ2_bzCompress
+detects any attempt to provide more input data once the flush has
+begun.
+
+Once the flush is complete, the stream returns to the
+normal RUNNING state.
+
+This all sounds pretty complex, but isn't really.  Here's a
+table which shows which actions are allowable in each state, what
+action will be taken, what the next state is, and what the
+non-error return values are.  Note that you can't explicitly ask
+what state the stream is in, but nor do you need to -- it can be
+inferred from the values returned by
+BZ2_bzCompress.
+
+
+IDLE/any
+  Illegal.  IDLE state only exists after BZ2_bzCompressEnd or
+  before BZ2_bzCompressInit.
+  Return value = BZ_SEQUENCE_ERROR
+
+RUNNING/BZ_RUN
+  Compress from next_in to next_out as much as possible.
+  Next state = RUNNING
+  Return value = BZ_RUN_OK
+
+RUNNING/BZ_FLUSH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FLUSHING
+  Return value = BZ_FLUSH_OK
+
+RUNNING/BZ_FINISH
+  Remember current value of next_in. Compress from next_in
+  to next_out as much as possible, but do not accept any more input.
+  Next state = FINISHING
+  Return value = BZ_FINISH_OK
+
+FLUSHING/BZ_FLUSH
+  Compress from next_in to next_out as much as possible, 
+  but do not accept any more input.
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = RUNNING; Return value = BZ_RUN_OK
+  else
+    Next state = FLUSHING; Return value = BZ_FLUSH_OK
+
+FLUSHING/other     
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+
+FINISHING/BZ_FINISH
+  Compress from next_in to next_out as much as possible,
+  but to not accept any more input.  
+  If all the existing input has been used up and all compressed
+  output has been removed
+    Next state = IDLE; Return value = BZ_STREAM_END
+  else
+    Next state = FINISHING; Return value = BZ_FINISH_OK
+
+FINISHING/other
+  Illegal.
+  Return value = BZ_SEQUENCE_ERROR
+
+
+
+That still looks complicated?  Well, fair enough.  The
+usual sequence of calls for compressing a load of data is:
+
+
+
+ Get started with
+  BZ2_bzCompressInit.
+
+ Shovel data in and shlurp out its compressed form
+  using zero or more calls of
+  BZ2_bzCompress with action =
+  BZ_RUN.
+
+ Finish up. Repeatedly call
+  BZ2_bzCompress with action =
+  BZ_FINISH, copying out the
+  compressed output, until
+  BZ_STREAM_END is
+  returned. Close up and go home.  Call
+  BZ2_bzCompressEnd.
+
+
+
+If the data you want to compress fits into your input
+buffer all at once, you can skip the calls of
+BZ2_bzCompress ( ..., BZ_RUN )
+and just do the BZ2_bzCompress ( ..., BZ_FINISH
+) calls.
+
+All required memory is allocated by
+BZ2_bzCompressInit.  The
+compression library can accept any data at all (obviously).  So
+you shouldn't get any error return values from the
+BZ2_bzCompress calls.  If you
+do, they will be
+BZ_SEQUENCE_ERROR, and indicate
+a bug in your programming.
+
+Trivial other possible return values:
+
+
+BZ_PARAM_ERROR
+  if strm is NULL, or strm->s is NULL
+
+
+
+
+
+
+BZ2_bzCompressEnd
+
+
+int BZ2_bzCompressEnd ( bz_stream *strm );
+
+
+Releases all memory associated with a compression
+stream.
+
+Possible return values:
+
+
+BZ_PARAM_ERROR  if strm is NULL or strm->s is NULL
+BZ_OK           otherwise
+
+
+
+
+
+
+BZ2_bzDecompressInit
+
+
+int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
+
+
+Prepares for decompression.  As with
+BZ2_bzCompressInit, a
+bz_stream record should be
+allocated and initialised before the call.  Fields
+bzalloc,
+bzfree and
+opaque should be set if a custom
+memory allocator is required, or made
+NULL for the normal
+malloc /
+free routines.  Upon return, the
+internal state will have been initialised, and
+total_in and
+total_out will be zero.
+
+For the meaning of parameter
+verbosity, see
+BZ2_bzCompressInit.
+
+If small is nonzero, the
+library will use an alternative decompression algorithm which
+uses less memory but at the cost of decompressing more slowly
+(roughly speaking, half the speed, but the maximum memory
+requirement drops to around 2300k).  See 
+for more information on memory management.
+
+Note that the amount of memory needed to decompress a
+stream cannot be determined until the stream's header has been
+read, so even if
+BZ2_bzDecompressInit succeeds, a
+subsequent BZ2_bzDecompress
+could fail with
+BZ_MEM_ERROR.
+
+Possible return values:
+
+
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if ( small != 0 && small != 1 )
+  or (verbosity <; 0 || verbosity > 4)
+BZ_MEM_ERROR
+  if insufficient memory is available
+
+
+Allowable next actions:
+
+
+BZ2_bzDecompress
+  if BZ_OK was returned
+  no specific action required in case of error
+
+
+
+
+
+
+BZ2_bzDecompress
+
+
+int BZ2_bzDecompress ( bz_stream *strm );
+
+
+Provides more input and/out output buffer space for the
+library.  The caller maintains input and output buffers, and uses
+BZ2_bzDecompress to transfer
+data between them.
+
+Before each call to
+BZ2_bzDecompress,
+next_in should point at the
+compressed data, and avail_in
+should indicate how many bytes the library may read.
+BZ2_bzDecompress updates
+next_in,
+avail_in and
+total_in to reflect the number
+of bytes it has read.
+
+Similarly, next_out should
+point to a buffer in which the uncompressed output is to be
+placed, with avail_out
+indicating how much output space is available.
+BZ2_bzCompress updates
+next_out,
+avail_out and
+total_out to reflect the number
+of bytes output.
+
+You may provide and remove as little or as much data as you
+like on each call of
+BZ2_bzDecompress.  In the limit,
+it is acceptable to supply and remove data one byte at a time,
+although this would be terribly inefficient.  You should always
+ensure that at least one byte of output space is available at
+each call.
+
+Use of BZ2_bzDecompress is
+simpler than
+BZ2_bzCompress.
+
+You should provide input and remove output as described
+above, and repeatedly call
+BZ2_bzDecompress until
+BZ_STREAM_END is returned.
+Appearance of BZ_STREAM_END
+denotes that BZ2_bzDecompress
+has detected the logical end of the compressed stream.
+BZ2_bzDecompress will not
+produce BZ_STREAM_END until all
+output data has been placed into the output buffer, so once
+BZ_STREAM_END appears, you are
+guaranteed to have available all the decompressed output, and
+BZ2_bzDecompressEnd can safely
+be called.
+
+If case of an error return value, you should call
+BZ2_bzDecompressEnd to clean up
+and release memory.
+
+Possible return values:
+
+
+BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+  or strm->avail_out < 1
+BZ_DATA_ERROR
+  if a data integrity error is detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the compressed stream doesn't begin with the right magic bytes
+BZ_MEM_ERROR
+  if there wasn't enough memory available
+BZ_STREAM_END
+  if the logical end of the data stream was detected and all
+  output in has been consumed, eg s-->avail_out > 0
+BZ_OK
+  otherwise
+
+
+Allowable next actions:
+
+
+BZ2_bzDecompress
+  if BZ_OK was returned
+BZ2_bzDecompressEnd
+  otherwise
+
+
+
+
+
+
+BZ2_bzDecompressEnd
+
+
+int BZ2_bzDecompressEnd ( bz_stream *strm );
+
+
+Releases all memory associated with a decompression
+stream.
+
+Possible return values:
+
+
+BZ_PARAM_ERROR
+  if strm is NULL or strm->s is NULL
+BZ_OK
+  otherwise
+
+
+Allowable next actions:
+
+
+  None.
+
+
+
+
+
+
+
+
+High-level interface
+
+This interface provides functions for reading and writing
+bzip2 format files.  First, some
+general points.
+
+
+
+ All of the functions take an
+  int* first argument,
+  bzerror.  After each call,
+  bzerror should be consulted
+  first to determine the outcome of the call.  If
+  bzerror is
+  BZ_OK, the call completed
+  successfully, and only then should the return value of the
+  function (if any) be consulted.  If
+  bzerror is
+  BZ_IO_ERROR, there was an
+  error reading/writing the underlying compressed file, and you
+  should then consult errno /
+  perror to determine the cause
+  of the difficulty.  bzerror
+  may also be set to various other values; precise details are
+  given on a per-function basis below.
+
+ If bzerror indicates
+  an error (ie, anything except
+  BZ_OK and
+  BZ_STREAM_END), you should
+  immediately call
+  BZ2_bzReadClose (or
+  BZ2_bzWriteClose, depending on
+  whether you are attempting to read or to write) to free up all
+  resources associated with the stream.  Once an error has been
+  indicated, behaviour of all calls except
+  BZ2_bzReadClose
+  (BZ2_bzWriteClose) is
+  undefined.  The implication is that (1)
+  bzerror should be checked
+  after each call, and (2) if
+  bzerror indicates an error,
+  BZ2_bzReadClose
+  (BZ2_bzWriteClose) should then
+  be called to clean up.
+
+ The FILE* arguments
+  passed to BZ2_bzReadOpen /
+  BZ2_bzWriteOpen should be set
+  to binary mode.  Most Unix systems will do this by default, but
+  other platforms, including Windows and Mac, will not.  If you
+  omit this, you may encounter problems when moving code to new
+  platforms.
+
+ Memory allocation requests are handled by
+  malloc /
+  free.  At present there is no
+  facility for user-defined memory allocators in the file I/O
+  functions (could easily be added, though).
+
+
+
+
+
+
+BZ2_bzReadOpen
+
+
+typedef void BZFILE;
+
+BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f, 
+                        int verbosity, int small,
+                        void *unused, int nUnused );
+
+
+Prepare to read compressed data from file handle
+f.
+f should refer to a file which
+has been opened for reading, and for which the error indicator
+(ferror(f))is not set.  If
+small is 1, the library will try
+to decompress using less memory, at the expense of speed.
+
+For reasons explained below,
+BZ2_bzRead will decompress the
+nUnused bytes starting at
+unused, before starting to read
+from the file f.  At most
+BZ_MAX_UNUSED bytes may be
+supplied like this.  If this facility is not required, you should
+pass NULL and
+0 for
+unused and
+nUnused respectively.
+
+For the meaning of parameters
+small and
+verbosity, see
+BZ2_bzDecompressInit.
+
+The amount of memory needed to decompress a file cannot be
+determined until the file's header has been read.  So it is
+possible that BZ2_bzReadOpen
+returns BZ_OK but a subsequent
+call of BZ2_bzRead will return
+BZ_MEM_ERROR.
+
+Possible assignments to
+bzerror:
+
+
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or small is neither 0 nor 1
+  or ( unused == NULL && nUnused != 0 )
+  or ( unused != NULL && !(0 <= nUnused <= BZ_MAX_UNUSED) )
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise.
+
+
+Possible return values:
+
+
+Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+
+
+Allowable next actions:
+
+
+BZ2_bzRead
+  if bzerror is BZ_OK
+BZ2_bzClose
+  otherwise
+
+
+
+
+
+
+BZ2_bzRead
+
+
+int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len );
+
+
+Reads up to len
+(uncompressed) bytes from the compressed file
+b into the buffer
+buf.  If the read was
+successful, bzerror is set to
+BZ_OK and the number of bytes
+read is returned.  If the logical end-of-stream was detected,
+bzerror will be set to
+BZ_STREAM_END, and the number of
+bytes read is returned.  All other
+bzerror values denote an
+error.
+
+BZ2_bzRead will supply
+len bytes, unless the logical
+stream end is detected or an error occurs.  Because of this, it
+is possible to detect the stream end by observing when the number
+of bytes returned is less than the number requested.
+Nevertheless, this is regarded as inadvisable; you should instead
+check bzerror after every call
+and watch out for
+BZ_STREAM_END.
+
+Internally, BZ2_bzRead
+copies data from the compressed file in chunks of size
+BZ_MAX_UNUSED bytes before
+decompressing it.  If the file contains more bytes than strictly
+needed to reach the logical end-of-stream,
+BZ2_bzRead will almost certainly
+read some of the trailing data before signalling
+BZ_SEQUENCE_END.  To collect the
+read but unused data once
+BZ_SEQUENCE_END has appeared,
+call BZ2_bzReadGetUnused
+immediately before
+BZ2_bzReadClose.
+
+Possible assignments to
+bzerror:
+
+
+BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzWriteOpen
+BZ_IO_ERROR
+  if there is an error reading from the compressed file
+BZ_UNEXPECTED_EOF
+  if the compressed file ended before 
+  the logical end-of-stream was detected
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed stream
+BZ_DATA_ERROR_MAGIC
+  if the stream does not begin with the requisite header bytes 
+  (ie, is not a bzip2 data file).  This is really 
+  a special case of BZ_DATA_ERROR.
+BZ_MEM_ERROR
+  if insufficient memory was available
+BZ_STREAM_END
+  if the logical end of stream was detected.
+BZ_OK
+  otherwise.
+
+
+Possible return values:
+
+
+number of bytes read
+  if bzerror is BZ_OK or BZ_STREAM_END
+undefined
+  otherwise
+
+
+Allowable next actions:
+
+
+collect data from buf, then BZ2_bzRead or BZ2_bzReadClose
+  if bzerror is BZ_OK
+collect data from buf, then BZ2_bzReadClose or BZ2_bzReadGetUnused
+  if bzerror is BZ_SEQUENCE_END
+BZ2_bzReadClose
+  otherwise
+
+
+
+
+
+
+BZ2_bzReadGetUnused
+
+
+void BZ2_bzReadGetUnused( int* bzerror, BZFILE *b, 
+                          void** unused, int* nUnused );
+
+
+Returns data which was read from the compressed file but
+was not needed to get to the logical end-of-stream.
+*unused is set to the address of
+the data, and *nUnused to the
+number of bytes.  *nUnused will
+be set to a value between 0 and
+BZ_MAX_UNUSED inclusive.
+
+This function may only be called once
+BZ2_bzRead has signalled
+BZ_STREAM_END but before
+BZ2_bzReadClose.
+
+Possible assignments to
+bzerror:
+
+
+BZ_PARAM_ERROR
+  if b is NULL
+  or unused is NULL or nUnused is NULL
+BZ_SEQUENCE_ERROR
+  if BZ_STREAM_END has not been signalled
+  or if b was opened with BZ2_bzWriteOpen
+BZ_OK
+  otherwise
+
+
+Allowable next actions:
+
+
+BZ2_bzReadClose
+
+
+
+
+
+
+BZ2_bzReadClose
+
+
+void BZ2_bzReadClose ( int *bzerror, BZFILE *b );
+
+
+Releases all memory pertaining to the compressed file
+b.
+BZ2_bzReadClose does not call
+fclose on the underlying file
+handle, so you should do that yourself if appropriate.
+BZ2_bzReadClose should be called
+to clean up after all error situations.
+
+Possible assignments to
+bzerror:
+
+
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzOpenWrite
+BZ_OK
+  otherwise
+
+
+Allowable next actions:
+
+
+none
+
+
+
+
+
+
+BZ2_bzWriteOpen
+
+
+BZFILE *BZ2_bzWriteOpen( int *bzerror, FILE *f, 
+                         int blockSize100k, int verbosity,
+                         int workFactor );
+
+
+Prepare to write compressed data to file handle
+f.
+f should refer to a file which
+has been opened for writing, and for which the error indicator
+(ferror(f))is not set.
+
+For the meaning of parameters
+blockSize100k,
+verbosity and
+workFactor, see
+BZ2_bzCompressInit.
+
+All required memory is allocated at this stage, so if the
+call completes successfully,
+BZ_MEM_ERROR cannot be signalled
+by a subsequent call to
+BZ2_bzWrite.
+
+Possible assignments to
+bzerror:
+
+
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if f is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+BZ_IO_ERROR
+  if ferror(f) is nonzero
+BZ_MEM_ERROR
+  if insufficient memory is available
+BZ_OK
+  otherwise
+
+
+Possible return values:
+
+
+Pointer to an abstract BZFILE
+  if bzerror is BZ_OK
+NULL
+  otherwise
+
+
+Allowable next actions:
+
+
+BZ2_bzWrite
+  if bzerror is BZ_OK
+  (you could go directly to BZ2_bzWriteClose, but this would be pretty pointless)
+BZ2_bzWriteClose
+  otherwise
+
+
+
+
+
+
+BZ2_bzWrite
+
+
+void BZ2_bzWrite ( int *bzerror, BZFILE *b, void *buf, int len );
+
+
+Absorbs len bytes from the
+buffer buf, eventually to be
+compressed and written to the file.
+
+Possible assignments to
+bzerror:
+
+
+BZ_PARAM_ERROR
+  if b is NULL or buf is NULL or len < 0
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file.
+BZ_OK
+  otherwise
+
+
+
+
+
+
+BZ2_bzWriteClose
+
+
+void BZ2_bzWriteClose( int *bzerror, BZFILE* f,
+                       int abandon,
+                       unsigned int* nbytes_in,
+                       unsigned int* nbytes_out );
+
+void BZ2_bzWriteClose64( int *bzerror, BZFILE* f,
+                         int abandon,
+                         unsigned int* nbytes_in_lo32,
+                         unsigned int* nbytes_in_hi32,
+                         unsigned int* nbytes_out_lo32,
+                         unsigned int* nbytes_out_hi32 );
+
+
+Compresses and flushes to the compressed file all data so
+far supplied by BZ2_bzWrite.
+The logical end-of-stream markers are also written, so subsequent
+calls to BZ2_bzWrite are
+illegal.  All memory associated with the compressed file
+b is released.
+fflush is called on the
+compressed file, but it is not
+fclose'd.
+
+If BZ2_bzWriteClose is
+called to clean up after an error, the only action is to release
+the memory.  The library records the error codes issued by
+previous calls, so this situation will be detected automatically.
+There is no attempt to complete the compression operation, nor to
+fflush the compressed file.  You
+can force this behaviour to happen even in the case of no error,
+by passing a nonzero value to
+abandon.
+
+If nbytes_in is non-null,
+*nbytes_in will be set to be the
+total volume of uncompressed data handled.  Similarly,
+nbytes_out will be set to the
+total volume of compressed data written.  For compatibility with
+older versions of the library,
+BZ2_bzWriteClose only yields the
+lower 32 bits of these counts.  Use
+BZ2_bzWriteClose64 if you want
+the full 64 bit counts.  These two functions are otherwise
+absolutely identical.
+
+Possible assignments to
+bzerror:
+
+
+BZ_SEQUENCE_ERROR
+  if b was opened with BZ2_bzReadOpen
+BZ_IO_ERROR
+  if there is an error writing the compressed file
+BZ_OK
+  otherwise
+
+
+
+
+
+
+Handling embedded compressed data streams
+
+The high-level library facilitates use of
+bzip2 data streams which form
+some part of a surrounding, larger data stream.
+
+
+
+ For writing, the library takes an open file handle,
+  writes compressed data to it,
+  fflushes it but does not
+  fclose it.  The calling
+  application can write its own data before and after the
+  compressed data stream, using that same file handle.
+
+ Reading is more complex, and the facilities are not as
+  general as they could be since generality is hard to reconcile
+  with efficiency.  BZ2_bzRead
+  reads from the compressed file in blocks of size
+  BZ_MAX_UNUSED bytes, and in
+  doing so probably will overshoot the logical end of compressed
+  stream.  To recover this data once decompression has ended,
+  call BZ2_bzReadGetUnused after
+  the last call of BZ2_bzRead
+  (the one returning
+  BZ_STREAM_END) but before
+  calling
+  BZ2_bzReadClose.
+
+
+
+This mechanism makes it easy to decompress multiple
+bzip2 streams placed end-to-end.
+As the end of one stream, when
+BZ2_bzRead returns
+BZ_STREAM_END, call
+BZ2_bzReadGetUnused to collect
+the unused data (copy it into your own buffer somewhere).  That
+data forms the start of the next compressed stream.  To start
+uncompressing that next stream, call
+BZ2_bzReadOpen again, feeding in
+the unused data via the unused /
+nUnused parameters.  Keep doing
+this until BZ_STREAM_END return
+coincides with the physical end of file
+(feof(f)).  In this situation
+BZ2_bzReadGetUnused will of
+course return no data.
+
+This should give some feel for how the high-level interface
+can be used.  If you require extra flexibility, you'll have to
+bite the bullet and get to grips with the low-level
+interface.
+
+
+
+
+
+Standard file-reading/writing code
+
+Here's how you'd write data to a compressed file:
+
+
+FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "w" );
+if ( !f ) {
+ /* handle error */
+}
+b = BZ2_bzWriteOpen( &bzerror, f, 9 );
+if (bzerror != BZ_OK) {
+ BZ2_bzWriteClose ( b );
+ /* handle error */
+}
+
+while ( /* condition */ ) {
+ /* get data to write into buf, and set nBuf appropriately */
+ nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
+ if (bzerror == BZ_IO_ERROR) { 
+   BZ2_bzWriteClose ( &bzerror, b );
+   /* handle error */
+ }
+}
+
+BZ2_bzWriteClose( &bzerror, b );
+if (bzerror == BZ_IO_ERROR) {
+ /* handle error */
+}
+
+
+And to read from a compressed file:
+
+
+FILE*   f;
+BZFILE* b;
+int     nBuf;
+char    buf[ /* whatever size you like */ ];
+int     bzerror;
+int     nWritten;
+
+f = fopen ( "myfile.bz2", "r" );
+if ( !f ) {
+  /* handle error */
+}
+b = BZ2_bzReadOpen ( &bzerror, f, 0, NULL, 0 );
+if ( bzerror != BZ_OK ) {
+  BZ2_bzReadClose ( &bzerror, b );
+  /* handle error */
+}
+
+bzerror = BZ_OK;
+while ( bzerror == BZ_OK && /* arbitrary other conditions */) {
+  nBuf = BZ2_bzRead ( &bzerror, b, buf, /* size of buf */ );
+  if ( bzerror == BZ_OK ) {
+    /* do something with buf[0 .. nBuf-1] */
+  }
+}
+if ( bzerror != BZ_STREAM_END ) {
+   BZ2_bzReadClose ( &bzerror, b );
+   /* handle error */
+} else {
+   BZ2_bzReadClose ( &bzerror, b );
+}
+
+
+
+
+
+
+
+
+Utility functions
+
+
+
+BZ2_bzBuffToBuffCompress
+
+
+int BZ2_bzBuffToBuffCompress( char*         dest,
+                              unsigned int* destLen,
+                              char*         source,
+                              unsigned int  sourceLen,
+                              int           blockSize100k,
+                              int           verbosity,
+                              int           workFactor );
+
+
+Attempts to compress the data in source[0
+.. sourceLen-1] into the destination buffer,
+dest[0 .. *destLen-1].  If the
+destination buffer is big enough,
+*destLen is set to the size of
+the compressed data, and BZ_OK
+is returned.  If the compressed data won't fit,
+*destLen is unchanged, and
+BZ_OUTBUFF_FULL is
+returned.
+
+Compression in this manner is a one-shot event, done with a
+single call to this function.  The resulting compressed data is a
+complete bzip2 format data
+stream.  There is no mechanism for making additional calls to
+provide extra input data.  If you want that kind of mechanism,
+use the low-level interface.
+
+For the meaning of parameters
+blockSize100k,
+verbosity and
+workFactor, see
+BZ2_bzCompressInit.
+
+To guarantee that the compressed data will fit in its
+buffer, allocate an output buffer of size 1% larger than the
+uncompressed data, plus six hundred extra bytes.
+
+BZ2_bzBuffToBuffDecompress
+will not write data at or beyond
+dest[*destLen], even in case of
+buffer overflow.
+
+Possible return values:
+
+
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or blockSize100k < 1 or blockSize100k > 9
+  or verbosity < 0 or verbosity > 4
+  or workFactor < 0 or workFactor > 250
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_OK
+  otherwise
+
+
+
+
+
+
+BZ2_bzBuffToBuffDecompress
+
+
+int BZ2_bzBuffToBuffDecompress( char*         dest,
+                                unsigned int* destLen,
+                                char*         source,
+                                unsigned int  sourceLen,
+                                int           small,
+                                int           verbosity );
+
+
+Attempts to decompress the data in source[0
+.. sourceLen-1] into the destination buffer,
+dest[0 .. *destLen-1].  If the
+destination buffer is big enough,
+*destLen is set to the size of
+the uncompressed data, and BZ_OK
+is returned.  If the compressed data won't fit,
+*destLen is unchanged, and
+BZ_OUTBUFF_FULL is
+returned.
+
+source is assumed to hold
+a complete bzip2 format data
+stream.
+BZ2_bzBuffToBuffDecompress tries
+to decompress the entirety of the stream into the output
+buffer.
+
+For the meaning of parameters
+small and
+verbosity, see
+BZ2_bzDecompressInit.
+
+Because the compression ratio of the compressed data cannot
+be known in advance, there is no easy way to guarantee that the
+output buffer will be big enough.  You may of course make
+arrangements in your code to record the size of the uncompressed
+data, but such a mechanism is beyond the scope of this
+library.
+
+BZ2_bzBuffToBuffDecompress
+will not write data at or beyond
+dest[*destLen], even in case of
+buffer overflow.
+
+Possible return values:
+
+
+BZ_CONFIG_ERROR
+  if the library has been mis-compiled
+BZ_PARAM_ERROR
+  if dest is NULL or destLen is NULL
+  or small != 0 && small != 1
+  or verbosity < 0 or verbosity > 4
+BZ_MEM_ERROR
+  if insufficient memory is available 
+BZ_OUTBUFF_FULL
+  if the size of the compressed data exceeds *destLen
+BZ_DATA_ERROR
+  if a data integrity error was detected in the compressed data
+BZ_DATA_ERROR_MAGIC
+  if the compressed data doesn't begin with the right magic bytes
+BZ_UNEXPECTED_EOF
+  if the compressed data ends unexpectedly
+BZ_OK
+  otherwise
+
+
+
+
+
+
+
+
+zlib compatibility functions
+
+Yoshioka Tsuneo has contributed some functions to give
+better zlib compatibility.
+These functions are BZ2_bzopen,
+BZ2_bzread,
+BZ2_bzwrite,
+BZ2_bzflush,
+BZ2_bzclose,
+BZ2_bzerror and
+BZ2_bzlibVersion.  These
+functions are not (yet) officially part of the library.  If they
+break, you get to keep all the pieces.  Nevertheless, I think
+they work ok.
+
+
+typedef void BZFILE;
+
+const char * BZ2_bzlibVersion ( void );
+
+
+Returns a string indicating the library version.
+
+
+BZFILE * BZ2_bzopen  ( const char *path, const char *mode );
+BZFILE * BZ2_bzdopen ( int        fd,    const char *mode );
+
+
+Opens a .bz2 file for
+reading or writing, using either its name or a pre-existing file
+descriptor.  Analogous to fopen
+and fdopen.
+
+
+int BZ2_bzread  ( BZFILE* b, void* buf, int len );
+int BZ2_bzwrite ( BZFILE* b, void* buf, int len );
+
+
+Reads/writes data from/to a previously opened
+BZFILE.  Analogous to
+fread and
+fwrite.
+
+
+int  BZ2_bzflush ( BZFILE* b );
+void BZ2_bzclose ( BZFILE* b );
+
+
+Flushes/closes a BZFILE.
+BZ2_bzflush doesn't actually do
+anything.  Analogous to fflush
+and fclose.
+
+
+const char * BZ2_bzerror ( BZFILE *b, int *errnum )
+
+
+Returns a string describing the more recent error status of
+b, and also sets
+*errnum to its numerical
+value.
+
+
+
+
+
+Using the library in a stdio-free environment
+
+
+
+Getting rid of stdio
+
+In a deeply embedded application, you might want to use
+just the memory-to-memory functions.  You can do this
+conveniently by compiling the library with preprocessor symbol
+BZ_NO_STDIO defined.  Doing this
+gives you a library containing only the following eight
+functions:
+
+BZ2_bzCompressInit,
+BZ2_bzCompress,
+BZ2_bzCompressEnd
+BZ2_bzDecompressInit,
+BZ2_bzDecompress,
+BZ2_bzDecompressEnd
+BZ2_bzBuffToBuffCompress,
+BZ2_bzBuffToBuffDecompress
+
+When compiled like this, all functions will ignore
+verbosity settings.
+
+
+
+
+
+Critical error handling
+
+libbzip2 contains a number
+of internal assertion checks which should, needless to say, never
+be activated.  Nevertheless, if an assertion should fail,
+behaviour depends on whether or not the library was compiled with
+BZ_NO_STDIO set.
+
+For a normal compile, an assertion failure yields the
+message:
+
+
+bzip2/libbzip2: internal error number N. +This is a bug in bzip2/libbzip2, &bz-version; of &bz-date;. +Please report it to: &bz-email;. If this happened +when you were using some program which uses libbzip2 as a +component, you should also report this bug to the author(s) +of that program. Please make an effort to report this bug; +timely and accurate bug reports eventually lead to higher +quality software. Thanks. +
+ +where N is some error code +number. If N == 1007, it also +prints some extra text advising the reader that unreliable memory +is often associated with internal error 1007. (This is a +frequently-observed-phenomenon with versions 1.0.0/1.0.1). + +exit(3) is then +called. + +For a stdio-free library, +assertion failures result in a call to a function declared +as: + + +extern void bz_internal_error ( int errcode ); + + +The relevant code is passed as a parameter. You should +supply such a function. + +In either case, once an assertion failure has occurred, any +bz_stream records involved can +be regarded as invalid. You should not attempt to resume normal +operation with them. + +You may, of course, change critical error handling to suit +your needs. As I said above, critical errors indicate bugs in +the library and should not occur. All "normal" error situations +are indicated via error return codes from functions, and can be +recovered from. + +
+ +
+ + + +Making a Windows DLL + +Everything related to Windows has been contributed by +Yoshioka Tsuneo +(tsuneo@rr.iij4u.or.jp), so +you should send your queries to him (but please Cc: +&bz-email;). + +My vague understanding of what to do is: using Visual C++ +5.0, open the project file +libbz2.dsp, and build. That's +all. + +If you can't open the project file for some reason, make a +new one, naming these files: +blocksort.c, +bzlib.c, +compress.c, +crctable.c, +decompress.c, +huffman.c, +randtable.c and +libbz2.def. You will also need +to name the header files bzlib.h +and bzlib_private.h. + +If you don't use VC++, you may need to define the +proprocessor symbol +_WIN32. + +Finally, dlltest.c is a +sample program using the DLL. It has a project file, +dlltest.dsp. + +If you just want a makefile for Visual C, have a look at +makefile.msc. + +Be aware that if you compile +bzip2 itself on Win32, you must +set BZ_UNIX to 0 and +BZ_LCCWIN32 to 1, in the file +bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly. + +I haven't tried any of this stuff myself, but it all looks +plausible. + + + +
+ + + + +Miscellanea + +These are just some random thoughts of mine. Your mileage +may vary. + + + +Limitations of the compressed file format + +bzip2-1.0.X, +0.9.5 and +0.9.0 use exactly the same file +format as the original version, +bzip2-0.1. This decision was +made in the interests of stability. Creating yet another +incompatible compressed file format would create further +confusion and disruption for users. + +Nevertheless, this is not a painless decision. Development +work since the release of +bzip2-0.1 in August 1997 has +shown complexities in the file format which slow down +decompression and, in retrospect, are unnecessary. These +are: + + + + The run-length encoder, which is the first of the + compression transformations, is entirely irrelevant. The + original purpose was to protect the sorting algorithm from the + very worst case input: a string of repeated symbols. But + algorithm steps Q6a and Q6b in the original Burrows-Wheeler + technical report (SRC-124) show how repeats can be handled + without difficulty in block sorting. + + The randomisation mechanism doesn't really need to be + there. Udi Manber and Gene Myers published a suffix array + construction algorithm a few years back, which can be employed + to sort any block, no matter how repetitive, in O(N log N) + time. Subsequent work by Kunihiko Sadakane has produced a + derivative O(N (log N)^2) algorithm which usually outperforms + the Manber-Myers algorithm. + + I could have changed to Sadakane's algorithm, but I find + it to be slower than bzip2's + existing algorithm for most inputs, and the randomisation + mechanism protects adequately against bad cases. I didn't + think it was a good tradeoff to make. Partly this is due to + the fact that I was not flooded with email complaints about + bzip2-0.1's performance on + repetitive data, so perhaps it isn't a problem for real + inputs. + + Probably the best long-term solution, and the one I have + incorporated into 0.9.5 and above, is to use the existing + sorting algorithm initially, and fall back to a O(N (log N)^2) + algorithm if the standard algorithm gets into + difficulties. + + The compressed file format was never designed to be + handled by a library, and I have had to jump though some hoops + to produce an efficient implementation of decompression. It's + a bit hairy. Try passing + decompress.c through the C + preprocessor and you'll see what I mean. Much of this + complexity could have been avoided if the compressed size of + each block of data was recorded in the data stream. + + An Adler-32 checksum, rather than a CRC32 checksum, + would be faster to compute. + + + +It would be fair to say that the +bzip2 format was frozen before I +properly and fully understood the performance consequences of +doing so. + +Improvements which I was able to incorporate into 0.9.0, +despite using the same file format, are: + + + + Single array implementation of the inverse BWT. This + significantly speeds up decompression, presumably because it + reduces the number of cache misses. + + Faster inverse MTF transform for large MTF values. + The new implementation is based on the notion of sliding blocks + of values. + + bzip2-0.9.0 now reads + and writes files with fread + and fwrite; version 0.1 used + putc and + getc. Duh! Well, you live + and learn. + + + +Further ahead, it would be nice to be able to do random +access into files. This will require some careful design of +compressed file formats. + + + + + +Portability issues + +After some consideration, I have decided not to use GNU +autoconf to configure 0.9.5 or +1.0. + +autoconf, admirable and +wonderful though it is, mainly assists with portability problems +between Unix-like platforms. But +bzip2 doesn't have much in the +way of portability problems on Unix; most of the difficulties +appear when porting to the Mac, or to Microsoft's operating +systems. autoconf doesn't help +in those cases, and brings in a whole load of new +complexity. + +Most people should be able to compile the library and +program under Unix straight out-of-the-box, so to speak, +especially if you have a version of GNU C available. + +There are a couple of +__inline__ directives in the +code. GNU C (gcc) should be +able to handle them. If you're not using GNU C, your C compiler +shouldn't see them at all. If your compiler does, for some +reason, see them and doesn't like them, just +#define +__inline__ to be +/* */. One easy way to do this +is to compile with the flag +-D__inline__=, which should be +understood by most Unix compilers. + +If you still have difficulties, try compiling with the +macro BZ_STRICT_ANSI defined. +This should enable you to build the library in a strictly ANSI +compliant environment. Building the program itself like this is +dangerous and not supported, since you remove +bzip2's checks against +compressing directories, symbolic links, devices, and other +not-really-a-file entities. This could cause filesystem +corruption! + +One other thing: if you create a +bzip2 binary for public distribution, +please consider linking it statically (gcc +-static). This avoids all sorts of library-version +issues that others may encounter later on. + +If you build bzip2 on +Win32, you must set BZ_UNIX to 0 +and BZ_LCCWIN32 to 1, in the +file bzip2.c, before compiling. +Otherwise the resulting binary won't work correctly. + + + + + +Reporting bugs + +I tried pretty hard to make sure +bzip2 is bug free, both by +design and by testing. Hopefully you'll never need to read this +section for real. + +Nevertheless, if bzip2 dies +with a segmentation fault, a bus error or an internal assertion +failure, it will ask you to email me a bug report. Experience from +years of feedback of bzip2 users indicates that almost all these +problems can be traced to either compiler bugs or hardware +problems. + + + + Recompile the program with no optimisation, and + see if it works. And/or try a different compiler. I heard all + sorts of stories about various flavours of GNU C (and other + compilers) generating bad code for + bzip2, and I've run across two + such examples myself. + + 2.7.X versions of GNU C are known to generate bad code + from time to time, at high optimisation levels. If you get + problems, try using the flags + -O2 + -fomit-frame-pointer + -fno-strength-reduce. You + should specifically not use + -funroll-loops. + + You may notice that the Makefile runs six tests as part + of the build process. If the program passes all of these, it's + a pretty good (but not 100%) indication that the compiler has + done its job correctly. + + If bzip2 + crashes randomly, and the crashes are not repeatable, you may + have a flaky memory subsystem. + bzip2 really hammers your + memory hierarchy, and if it's a bit marginal, you may get these + problems. Ditto if your disk or I/O subsystem is slowly + failing. Yup, this really does happen. + + Try using a different machine of the same type, and see + if you can repeat the problem. + + This isn't really a bug, but ... If + bzip2 tells you your file is + corrupted on decompression, and you obtained the file via FTP, + there is a possibility that you forgot to tell FTP to do a + binary mode transfer. That absolutely will cause the file to + be non-decompressible. You'll have to transfer it + again. + + + +If you've incorporated +libbzip2 into your own program +and are getting problems, please, please, please, check that the +parameters you are passing in calls to the library, are correct, +and in accordance with what the documentation says is allowable. +I have tried to make the library robust against such problems, +but I'm sure I haven't succeeded. + +Finally, if the above comments don't help, you'll have to +send me a bug report. Now, it's just amazing how many people +will send me a bug report saying something like: + + +bzip2 crashed with segmentation fault on my machine + + +and absolutely nothing else. Needless to say, a such a +report is totally, utterly, completely and +comprehensively 100% useless; a waste of your time, my time, and +net bandwidth. With no details at all, there's no way +I can possibly begin to figure out what the problem is. + +The rules of the game are: facts, facts, facts. Don't omit +them because "oh, they won't be relevant". At the bare +minimum: + + +Machine type. Operating system version. +Exact version of bzip2 (do bzip2 -V). +Exact version of the compiler used. +Flags passed to the compiler. + + +However, the most important single thing that will help me +is the file that you were trying to compress or decompress at the +time the problem happened. Without that, my ability to do +anything more than speculate about the cause, is limited. + + + + + +Did you get the right package? + +bzip2 is a resource hog. +It soaks up large amounts of CPU cycles and memory. Also, it +gives very large latencies. In the worst case, you can feed many +megabytes of uncompressed data into the library before getting +any compressed output, so this probably rules out applications +requiring interactive behaviour. + +These aren't faults of my implementation, I hope, but more +an intrinsic property of the Burrows-Wheeler transform +(unfortunately). Maybe this isn't what you want. + +If you want a compressor and/or library which is faster, +uses less memory but gets pretty good compression, and has +minimal latency, consider Jean-loup Gailly's and Mark Adler's +work, zlib-1.2.1 and +gzip-1.2.4. Look for them at +http://www.zlib.org and +http://www.gzip.org +respectively. + +For something faster and lighter still, you might try Markus F +X J Oberhumer's LZO real-time +compression/decompression library, at +http://www.oberhumer.com/opensource. + + + + + + +Further Reading + +bzip2 is not research +work, in the sense that it doesn't present any new ideas. +Rather, it's an engineering exercise based on existing +ideas. + +Four documents describe essentially all the ideas behind +bzip2: + +Michael Burrows and D. J. Wheeler: + "A block-sorting lossless data compression algorithm" + 10th May 1994. + Digital SRC Research Report 124. + ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.gz + If you have trouble finding it, try searching at the + New Zealand Digital Library, http://www.nzdl.org. + +Daniel S. Hirschberg and Debra A. LeLewer + "Efficient Decoding of Prefix Codes" + Communications of the ACM, April 1990, Vol 33, Number 4. + You might be able to get an electronic copy of this + from the ACM Digital Library. + +David J. Wheeler + Program bred3.c and accompanying document bred3.ps. + This contains the idea behind the multi-table Huffman coding scheme. + ftp://ftp.cl.cam.ac.uk/users/djw3/ + +Jon L. Bentley and Robert Sedgewick + "Fast Algorithms for Sorting and Searching Strings" + Available from Sedgewick's web page, + www.cs.princeton.edu/~rs + + +The following paper gives valuable additional insights into +the algorithm, but is not immediately the basis of any code used +in bzip2. + +Peter Fenwick: + Block Sorting Text Compression + Proceedings of the 19th Australasian Computer Science Conference, + Melbourne, Australia. Jan 31 - Feb 2, 1996. + ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps + +Kunihiko Sadakane's sorting algorithm, mentioned above, is +available from: + +http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz + + +The Manber-Myers suffix array construction algorithm is +described in a paper available from: + +http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps + + +Finally, the following papers document some +investigations I made into the performance of sorting +and decompression algorithms: + +Julian Seward + On the Performance of BWT Sorting Algorithms + Proceedings of the IEEE Data Compression Conference 2000 + Snowbird, Utah. 28-30 March 2000. + +Julian Seward + Space-time Tradeoffs in the Inverse B-W Transform + Proceedings of the IEEE Data Compression Conference 2001 + Snowbird, Utah. 27-29 March 2001. + + + + + + +
diff --git a/third_party/bzip2/mk251.c b/third_party/bzip2/mk251.c new file mode 100644 index 000000000..6c5bbf935 --- /dev/null +++ b/third_party/bzip2/mk251.c @@ -0,0 +1,31 @@ + +/* Spew out a long sequence of the byte 251. When fed to bzip2 + versions 1.0.0 or 1.0.1, causes it to die with internal error + 1007 in blocksort.c. This assertion misses an extremely rare + case, which is fixed in this version (1.0.2) and above. +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include + +int main () +{ + int i; + for (i = 0; i < 48500000 ; i++) + putchar(251); + return 0; +} diff --git a/third_party/bzip2/prepare-release.sh b/third_party/bzip2/prepare-release.sh new file mode 100755 index 000000000..12c29f73e --- /dev/null +++ b/third_party/bzip2/prepare-release.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# Script to run to prepare a new release. +# It will update the release number and tell you to update the +# CHANGES file and to double check everything looks before doing +# the release commit and tagging. + +# Afterwards you probably want to run release-update.sh to upload +# the release and update the website at https://sourceware.org/bzip2/ + +# Any error is fatal +set -e + +# We take one argument, the version (e.g. 1.0.7) +if [ $# -ne 1 ]; then + echo "$0 (e.g. 1.0.7)" + exit 1 +fi + +LANG=C +VERSION="$1" +DATE=$(date +"%d %B %Y") +DAY=$(date +"%d") +MONTH=$(date +"%B") +SHORTMONTH=$(date +"%b") +YEAR=$(date +"%Y") + +# Replace the version strings and date ranges in the comments +VER_PREFIX="bzip2/libbzip2 version " +sed -i -e "s@${VER_PREFIX}[0-9].*@${VER_PREFIX}${VERSION} of ${DATE}@" \ + -e "s@ (C) \([0-9]\+\)-[0-9]\+ @ (C) \1-$YEAR @" \ + CHANGES LICENSE Makefile* README* *.c *.h *.pl *.sh + +# Add an entry to the README +printf "%2s %8s %s\n" "$DAY" "$MONTH" "$YEAR (bzip2, version $VERSION)" \ + >> README + +# Update manual +sed -i -e "s@ENTITY bz-version \".*\"@ENTITY bz-version \"$VERSION\"@" \ + -e "s@ENTITY bz-date \".*\"@ENTITY bz-date \"$DAY $MONTH $YEAR\"@" \ + -e "s@ENTITY bz-lifespan \"\([0-9]\+\)-[0-9]\+\"@ENTITY bz-lifespan \"\1-$YEAR\"@"\ + entities.xml + +# bzip2.1 should really be generated from the manual.xml, but currently +# isn't, so explicitly change it here too. +sed -i -e "s@This manual page pertains to version .* of@This manual page pertains to version $VERSION of@" \ + -e "s@sorting file compressor, v.*@sorting file compressor, v$VERSION@" \ + bzip2.1* bzip2.txt + +# Update sources. All sources, use bzlib_private. +# Except bzip2recover, which embeds a version string... +sed -i -e "s@^#define BZ_VERSION \".*\"@#define BZ_VERSION \"${VERSION}, ${DAY}-${SHORTMONTH}-${YEAR}\"@" \ + bzlib_private.h +sed -i -e "s@\"bzip2recover .*: extracts blocks from damaged@\"bzip2recover ${VERSION}: extracts blocks from damaged@" \ + bzip2recover.c + +# And finally update the version/dist/so_name in the Makefiles. +sed -i -e "s@^DISTNAME=bzip2-.*@DISTNAME=bzip2-${VERSION}@" \ + Makefile +sed -i -e "s@libbz2\.so\.[0-9]\.[0-9]\.[0-9]*@libbz2\.so\.${VERSION}@" \ + Makefile-libbz2_so + +echo "Now make sure the diff looks correct:" +echo " git diff" +echo +echo "And make sure there is a $VERSION section in the CHANGES file." +echo +echo "Double check:" +echo " make clean && make dist && make clean && make -f Makefile-libbz2_so" +echo +echo "Does everything look fine?" +echo +echo "git commit -a -m \"Prepare for $VERSION release.\"" +echo "git push" +echo +echo "Wait for the buildbot to give the all green!" +echo "Then..." +echo +echo "git tag -s -m \"bzip2 $VERSION release\" bzip2-$VERSION" +echo "git push --tags" +echo +echo "./release-update.sh" diff --git a/third_party/bzip2/randtable.c b/third_party/bzip2/randtable.c new file mode 100644 index 000000000..bdc6d4a4c --- /dev/null +++ b/third_party/bzip2/randtable.c @@ -0,0 +1,84 @@ + +/*-------------------------------------------------------------*/ +/*--- Table for randomising repetitive blocks ---*/ +/*--- randtable.c ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include "bzlib_private.h" + + +/*---------------------------------------------*/ +Int32 BZ2_rNums[512] = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 +}; + + +/*-------------------------------------------------------------*/ +/*--- end randtable.c ---*/ +/*-------------------------------------------------------------*/ diff --git a/third_party/bzip2/release-update.sh b/third_party/bzip2/release-update.sh new file mode 100755 index 000000000..d860f6755 --- /dev/null +++ b/third_party/bzip2/release-update.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# Script to run after a release has been tagged, signed and pushed +# to git. Will do a fresh checkout, verify the git tag, do fresh +# build/dist, sign the dist with gpg, create a backup copy in HOME, +# upload the tar.gz and sig to sourceware, checkout bzip2-htdocs, +# copy over the new changes, manual, etc. and git push that to update +# https://sourceware.org/bzip2/ + +# Any error is fatal +set -e + +# We take one argument, the version (e.g. 1.0.7) +if [ $# -ne 1 ]; then + echo "$0 (e.g. 1.0.7)" + exit 1 +fi + +VERSION="$1" +echo +echo " === NOTE === " +echo +echo "Requires a sourceware account in the bzip2 group." +echo +echo "Make sure the git repo was tagged, signed and pushed" +echo "If not, please double check the source tree is release ready first" +echo "You probably want to run ./prepare-release.sh $VERSION first." +echo "Then do:" +echo +echo " git tag -s -m \"bzip2 $VERSION release\" bzip2-$VERSION" +echo " git push --tags" +echo +read -p "Do you want to continue creating/uploading the release (yes/no)? " + +if [ "x$REPLY" != "xyes" ]; then + echo "OK, till next time." + exit +fi + +echo "OK, creating and updating the release." + +# Create a temporary directoy and make sure it is cleaned up. +tempdir=$(mktemp -d) || exit +trap "rm -rf -- ${tempdir}" EXIT + +pushd "${tempdir}" + +# Checkout +git clone git://sourceware.org/git/bzip2.git +cd bzip2 +git tag --verify "bzip2-${VERSION}" +git checkout -b "$VERSION" "bzip2-${VERSION}" + +# Create dist (creates bzip2-${VERSION}.tar.gz) +make dist + +# Sign (creates bzip2-${VERSION}.tar.gz.sig) +gpg -b bzip2-${VERSION}.tar.gz + +# Create backup copy +echo "Putting a backup copy in $HOME/bzip2-$VERSION" +mkdir $HOME/bzip2-$VERSION +cp bzip2-${VERSION}.tar.gz bzip2-${VERSION}.tar.gz.sig $HOME/bzip2-$VERSION/ + +# Upload +scp bzip2-${VERSION}.tar.gz bzip2-${VERSION}.tar.gz.sig \ + sourceware.org:/sourceware/ftp/pub/bzip2/ +ssh sourceware.org "(cd /sourceware/ftp/pub/bzip2 \ + && ln -sf bzip2-$VERSION.tar.gz bzip2-latest.tar.gz \ + && ln -sf bzip2-$VERSION.tar.gz.sig bzip2-latest.tar.gz.sig \ + && ls -lah bzip2-latest*)" + +# Update homepage, manual, etc. +cd "${tempdir}" +git clone ssh://sourceware.org/git/bzip2-htdocs.git +cp bzip2/CHANGES bzip2/bzip.css bzip2-htdocs/ +cp bzip2/bzip.css bzip2/bzip2.txt bzip2/manual.{html,pdf} bzip2-htdocs/manual/ +cd bzip2-htdocs + +# Update version in html pages. +sed -i -e "s/The current stable version is bzip2 [0-9]\.[0-9]\.[0-9]\+/The current stable version is bzip2 ${VERSION}/" *.html */*.html + +git commit -a -m "Update for bzip2 $VERSION release" +git show +git push + +# Cleanup +popd +trap - EXIT +exit diff --git a/third_party/bzip2/sample1.bz2 b/third_party/bzip2/sample1.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..18dea60043b692c86b095c06123809f10430fd03 GIT binary patch literal 32348 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 T9V3)BU;ZxSig2MJnd56pDt(C> literal 0 HcmV?d00001 diff --git a/third_party/bzip2/sample1.ref b/third_party/bzip2/sample1.ref new file mode 100644 index 0000000000000000000000000000000000000000..a56e52b77f90faf637e2c1e87ee60eaffa4c5056 GIT binary patch literal 98696 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 Z(Zy#cUu01QmiqtNR=obJ?T`8Y`~PZf1y}$8 literal 0 HcmV?d00001 diff --git a/third_party/bzip2/sample2.bz2 b/third_party/bzip2/sample2.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d5a6160ba20903121617cb8bf4fbdb71ba1ca1e7 GIT binary patch literal 73732 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
gnIFfvi(O?e$J0;1+%xLGi@k}ivMjcJIU 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
    oa|c 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 literal 0 HcmV?d00001 diff --git a/third_party/bzip2/sample3.bz2 b/third_party/bzip2/sample3.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d90cff9208fe3f15eebd888e978f639248752126 GIT binary patch literal 235 zcmVGUXb&m7Q)GuvY4W7DBi0bybO}v|xtYG6|~5=Sd|%uMPkN zKoB6Yo`4Dni@uED{RR!AUXhJ4Aj_`^@cN^s$CJ95fR!nP>-4u_Z0JO2Gf1zI+FWf9 lNldh8X=%unLauTcBrdZ|@<43xY-0cb literal 0 HcmV?d00001 diff --git a/third_party/bzip2/sample3.ref b/third_party/bzip2/sample3.ref new file mode 100644 index 000000000..775a2f68e --- /dev/null +++ b/third_party/bzip2/sample3.ref @@ -0,0 +1,30007 @@ +This file is exceedingly boring. If you find yourself +reading it, please (1) take it from me that you can safely +guess what the rest of the file says, and (2) seek professional +help. + +ps. there are no further sarcastic remarks in this file. + +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh +ugh diff --git a/third_party/bzip2/spewG.c b/third_party/bzip2/spewG.c new file mode 100644 index 000000000..65d24c89c --- /dev/null +++ b/third_party/bzip2/spewG.c @@ -0,0 +1,54 @@ + +/* spew out a thoroughly gigantic file designed so that bzip2 + can compress it reasonably rapidly. This is to help test + support for large files (> 2GB) in a reasonable amount of time. + I suggest you use the undocumented --exponential option to + bzip2 when compressing the resulting file; this saves a bit of + time. Note: *don't* bother with --exponential when compressing + Real Files; it'll just waste a lot of CPU time :-) + (but is otherwise harmless). +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#define _FILE_OFFSET_BITS 64 + +#include +#include + +/* The number of megabytes of junk to spew out (roughly) */ +#define MEGABYTES 5000 + +#define N_BUF 1000000 +char buf[N_BUF]; + +int main ( int argc, char** argv ) +{ + int ii, kk, p; + srandom(1); + setbuffer ( stdout, buf, N_BUF ); + for (kk = 0; kk < MEGABYTES * 515; kk+=3) { + p = 25+random()%50; + for (ii = 0; ii < p; ii++) + printf ( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); + for (ii = 0; ii < p-1; ii++) + printf ( "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ); + for (ii = 0; ii < p+1; ii++) + printf ( "ccccccccccccccccccccccccccccccccccccc" ); + } + fflush(stdout); + return 0; +} diff --git a/third_party/bzip2/unzcrash.c b/third_party/bzip2/unzcrash.c new file mode 100644 index 000000000..c68f93c56 --- /dev/null +++ b/third_party/bzip2/unzcrash.c @@ -0,0 +1,141 @@ + +/* A test program written to test robustness to decompression of + corrupted data. Usage is + unzcrash filename + and the program will read the specified file, compress it (in memory), + and then repeatedly decompress it, each time with a different bit of + the compressed data inverted, so as to test all possible one-bit errors. + This should not cause any invalid memory accesses. If it does, + I want to know about it! + + PS. As you can see from the above description, the process is + incredibly slow. A file of size eg 5KB will cause it to run for + many hours. +*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.8 of 13 July 2019 + Copyright (C) 1996-2019 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + + +#include +#include +#include "bzlib.h" + +#define M_BLOCK 1000000 + +typedef unsigned char uchar; + +#define M_BLOCK_OUT (M_BLOCK + 1000000) +uchar inbuf[M_BLOCK]; +uchar outbuf[M_BLOCK_OUT]; +uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)]; + +int nIn, nOut, nZ; + +static char *bzerrorstrings[] = { + "OK" + ,"SEQUENCE_ERROR" + ,"PARAM_ERROR" + ,"MEM_ERROR" + ,"DATA_ERROR" + ,"DATA_ERROR_MAGIC" + ,"IO_ERROR" + ,"UNEXPECTED_EOF" + ,"OUTBUFF_FULL" + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ + ,"???" /* for future */ +}; + +void flip_bit ( int bit ) +{ + int byteno = bit / 8; + int bitno = bit % 8; + uchar mask = 1 << bitno; + //fprintf ( stderr, "(byte %d bit %d mask %d)", + // byteno, bitno, (int)mask ); + zbuf[byteno] ^= mask; +} + +int main ( int argc, char** argv ) +{ + FILE* f; + int r; + int bit; + int i; + + if (argc != 2) { + fprintf ( stderr, "usage: unzcrash filename\n" ); + return 1; + } + + f = fopen ( argv[1], "r" ); + if (!f) { + fprintf ( stderr, "unzcrash: can't open %s\n", argv[1] ); + return 1; + } + + nIn = fread ( inbuf, 1, M_BLOCK, f ); + fprintf ( stderr, "%d bytes read\n", nIn ); + + nZ = M_BLOCK; + r = BZ2_bzBuffToBuffCompress ( + zbuf, &nZ, inbuf, nIn, 9, 0, 30 ); + + assert (r == BZ_OK); + fprintf ( stderr, "%d after compression\n", nZ ); + + for (bit = 0; bit < nZ*8; bit++) { + fprintf ( stderr, "bit %d ", bit ); + flip_bit ( bit ); + nOut = M_BLOCK_OUT; + r = BZ2_bzBuffToBuffDecompress ( + outbuf, &nOut, zbuf, nZ, 0, 0 ); + fprintf ( stderr, " %d %s ", r, bzerrorstrings[-r] ); + + if (r != BZ_OK) { + fprintf ( stderr, "\n" ); + } else { + if (nOut != nIn) { + fprintf(stderr, "nIn/nOut mismatch %d %d\n", nIn, nOut ); + return 1; + } else { + for (i = 0; i < nOut; i++) + if (inbuf[i] != outbuf[i]) { + fprintf(stderr, "mismatch at %d\n", i ); + return 1; + } + if (i == nOut) fprintf(stderr, "really ok!\n" ); + } + } + + flip_bit ( bit ); + } + +#if 0 + assert (nOut == nIn); + for (i = 0; i < nOut; i++) { + if (inbuf[i] != outbuf[i]) { + fprintf ( stderr, "difference at %d !\n", i ); + return 1; + } + } +#endif + + fprintf ( stderr, "all ok\n" ); + return 0; +} diff --git a/third_party/bzip2/words0 b/third_party/bzip2/words0 new file mode 100644 index 000000000..fbf442ad6 --- /dev/null +++ b/third_party/bzip2/words0 @@ -0,0 +1,9 @@ + +If compilation produces errors, or a large number of warnings, +please read README.COMPILATION.PROBLEMS -- you might be able to +adjust the flags in this Makefile to improve matters. + +Also in README.COMPILATION.PROBLEMS are some hints that may help +if your build produces an executable which is unable to correctly +handle so-called 'large files' -- files of size 2GB or more. + diff --git a/third_party/bzip2/words1 b/third_party/bzip2/words1 new file mode 100644 index 000000000..2e83de9f0 --- /dev/null +++ b/third_party/bzip2/words1 @@ -0,0 +1,4 @@ + +Doing 6 tests (3 compress, 3 uncompress) ... +If there's a problem, things might stop at this point. + diff --git a/third_party/bzip2/words2 b/third_party/bzip2/words2 new file mode 100644 index 000000000..203ee39c4 --- /dev/null +++ b/third_party/bzip2/words2 @@ -0,0 +1,5 @@ + +Checking test results. If any of the four "cmp"s which follow +report any differences, something is wrong. If you can't easily +figure out what, please let me know (jseward@acm.org). + diff --git a/third_party/bzip2/words3 b/third_party/bzip2/words3 new file mode 100644 index 000000000..697266990 --- /dev/null +++ b/third_party/bzip2/words3 @@ -0,0 +1,30 @@ + +If you got this far and the 'cmp's didn't complain, it looks +like you're in business. + +To install in /usr/local/bin, /usr/local/lib, /usr/local/man and +/usr/local/include, type + + make install + +To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type + + make install PREFIX=/xxx/yyy + +If you are (justifiably) paranoid and want to see what 'make install' +is going to do, you can first do + + make -n install or + make -n install PREFIX=/xxx/yyy respectively. + +The -n instructs make to show the commands it would execute, but +not actually execute them. + +Instructions for use are in the preformatted manual page, in the file +bzip2.txt. For more detailed documentation, read the full manual. +It is available in Postscript form (manual.ps), PDF form (manual.pdf), +and HTML form (manual.html). + +You can also do "bzip2 --help" to see some helpful information. +"bzip2 -L" displays the software license. + diff --git a/third_party/bzip2/xmlproc.sh b/third_party/bzip2/xmlproc.sh new file mode 100755 index 000000000..16fe72b2d --- /dev/null +++ b/third_party/bzip2/xmlproc.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# see the README file for usage etc. +# +# ------------------------------------------------------------------ +# This file is part of bzip2/libbzip2, a program and library for +# lossless, block-sorting data compression. +# +# bzip2/libbzip2 version 1.0.8 of 13 July 2019 +# Copyright (C) 1996-2019 Julian Seward +# +# Please read the WARNING, DISCLAIMER and PATENTS sections in the +# README file. +# +# This program is released under the terms of the license contained +# in the file LICENSE. +# ---------------------------------------------------------------- + + +usage() { + echo ''; + echo 'Usage: xmlproc.sh -[option] '; + echo 'Specify a target from:'; + echo '-v verify xml file conforms to dtd'; + echo '-html output in html format (single file)'; + echo '-ps output in postscript format'; + echo '-pdf output in pdf format'; + exit; +} + +if test $# -ne 2; then + usage +fi +# assign the variable for the output type +action=$1; shift +# assign the output filename +xmlfile=$1; shift +# and check user input it correct +if !(test -f $xmlfile); then + echo "No such file: $xmlfile"; + exit; +fi +# some other stuff we will use +OUT=output +xsl_fo=bz-fo.xsl +xsl_html=bz-html.xsl + +basename=$xmlfile +basename=${basename//'.xml'/''} + +fofile="${basename}.fo" +htmlfile="${basename}.html" +pdffile="${basename}.pdf" +psfile="${basename}.ps" +xmlfmtfile="${basename}.fmt" + +# first process the xmlfile with CDATA tags +./format.pl $xmlfile $xmlfmtfile +# so the shell knows where the catalogs live +export XML_CATALOG_FILES=/etc/xml/catalog + +# post-processing tidy up +cleanup() { + echo "Cleaning up: $@" + while [ $# != 0 ] + do + arg=$1; shift; + echo " deleting $arg"; + rm $arg + done +} + +case $action in + -v) + flags='--noout --xinclude --noblanks --postvalid' + dtd='--dtdvalid http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd' + xmllint $flags $dtd $xmlfmtfile 2> $OUT + egrep 'error' $OUT + rm $OUT + ;; + + -html) + echo "Creating $htmlfile ..." + xsltproc --nonet --xinclude -o $htmlfile $xsl_html $xmlfmtfile + cleanup $xmlfmtfile + ;; + + -pdf) + echo "Creating $pdffile ..." + xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile + pdfxmltex $fofile >$OUT $OUT $OUT $OUT $OUT $OUT $OUT $OUT $OUT