diff --git a/src/conf.h b/src/conf.h index 6ed1347b..2f33e8c5 100644 --- a/src/conf.h +++ b/src/conf.h @@ -466,6 +466,7 @@ private: #define UPX_F_LINUX_ELF32_ARMEB 133 #define UPX_F_MACH_FAT 134 #define UPX_F_VMLINUX_ARMEB 135 +#define UPX_F_VMLINUX_PPC32 136 // compression methods diff --git a/src/filter/ppcbxx.h b/src/filter/ppcbxx.h index ea1b0813..ed536a45 100644 --- a/src/filter/ppcbxx.h +++ b/src/filter/ppcbxx.h @@ -106,7 +106,7 @@ static int F(Filter *f) f->noncalls = noncalls; f->lastcall = lastcall; -#if 0 +#if 1 printf("\ncalls=%d noncalls=%d text_size=%x calltrickoffset=%x\n", calls,noncalls,size,cto8); #endif diff --git a/src/linker.cpp b/src/linker.cpp index 3b24eedb..245e7576 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -801,6 +801,12 @@ void ElfLinkerPpc32::relocate1(const Relocation *rel, upx_byte *location, return super::relocate1(rel, location, value, type); type += 6; + if (strcmp(type, "ADDR32") == 0) + { + set_be32(location, get_be32(location) + value); + return; + } + if (strncmp(type, "REL", 3) == 0) { value -= rel->section->offset + rel->offset; diff --git a/src/p_vmlinx.cpp b/src/p_vmlinx.cpp index bb0e14aa..e0718761 100644 --- a/src/p_vmlinx.cpp +++ b/src/p_vmlinx.cpp @@ -46,6 +46,8 @@ static const #include "stub/arm-linux.kernel.vmlinux.h" static const #include "stub/armeb-linux.kernel.vmlinux.h" +static const +#include "stub/powerpc-linux.kernel.vmlinux.h" /************************************************************************* @@ -203,6 +205,7 @@ bool PackVmlinuxBase::canPack() return 0 < n_ptload; } +#include "p_elf.h" template void PackVmlinuxBase::pack(OutputFile *fo) @@ -267,13 +270,79 @@ void PackVmlinuxBase::pack(OutputFile *fo) upx_compress_config_t cconf; cconf.reset(); // limit stack size needed for runtime decompression cconf.conf_lzma.max_num_probs = 1846 + (768 << 4); // ushort: ~28KB stack - compressWithFilters(&ft, 512, &cconf, getStrategy(ft)); + + unsigned ppc32_extra = 0; + if (Ehdr::EM_PPC==my_e_machine) { + // output layout: + // .long UPX_MAGIC_LE32 + // .long L20 - L10 + // L10: + // b_info for Ehdr; compressed Ehdr; .balign 4 // one block only + // b_info for LOAD; compressed LOAD; .balign 4 // possibly many blocks + // // This allows per-block filters! + // L20: + // b f_decompress + // +4: f_unfilter(char *buf, unsigned len, unsigned cto8, unsigned ftid) + // // Code for multiple filters can "daisy chain" on ftid. + // f_decompress(char const *src, unsigned src_len, + // char *dst, unsigned *dst_len, int method) + unsigned tmp; + tmp = UPX_MAGIC_LE32; fo->write(&tmp, sizeof(tmp)); fo_off += sizeof(tmp); + tmp = 0; fo->write(&tmp, sizeof(tmp)); fo_off += sizeof(tmp); + ppc32_extra += 2*sizeof(tmp); + unsigned const len_unc = sizeof(ehdri) + sizeof(Phdr) * ehdri.e_phnum; + MemBuffer unc_hdr(len_unc); + MemBuffer cpr_hdr; cpr_hdr.allocForCompression(len_unc); + memcpy(&unc_hdr[0], &ehdri, sizeof(ehdri)); + memcpy(&unc_hdr[sizeof(ehdri)], phdri, sizeof(Phdr) * ehdri.e_phnum); + unsigned len_cpr = 0; + int const r = upx_compress(unc_hdr, len_unc, cpr_hdr, &len_cpr, + NULL, ph.method, 10, NULL, NULL ); + if (UPX_E_OK!=r || len_unc<=len_cpr) // FIXME: allow no compression + throwInternalError("Ehdr compression failed"); + + struct b_info { // 12-byte header before each compressed block + unsigned sz_unc; // uncompressed_size + unsigned sz_cpr; // compressed_size + unsigned char b_method; // compression algorithm + unsigned char b_ftid; // filter id + unsigned char b_cto8; // filter parameter + unsigned char b_unused; // FIXME: !=0 for partial-block unfilter + // unsigned f_offset, f_len; // only if partial-block unfilter + } + __attribute_packed; + + struct b_info hdr_info; + set_be32(&hdr_info.sz_unc, len_unc); + set_be32(&hdr_info.sz_cpr, len_cpr); + hdr_info.b_method = ph.method; + hdr_info.b_ftid = 0; + hdr_info.b_cto8 = 0; + hdr_info.b_unused = 0; + fo->write(&hdr_info, sizeof(hdr_info)); fo_off += sizeof(hdr_info); + unsigned const frag = (3& -len_cpr); + ppc32_extra += sizeof(hdr_info) + len_cpr + frag; + fo_off += len_cpr + frag; + fo->write(cpr_hdr, len_cpr + frag); + compressWithFilters(&ft, 512, &cconf, getStrategy(ft)); + set_be32(&hdr_info.sz_unc, ph.u_len); + set_be32(&hdr_info.sz_cpr, ph.c_len); + hdr_info.b_ftid = ft.id; + hdr_info.b_cto8 = ft.cto; + fo->write(&hdr_info, sizeof(hdr_info)); fo_off += sizeof(hdr_info); + ppc32_extra += sizeof(hdr_info); + } + else { + compressWithFilters(&ft, 512, &cconf, getStrategy(ft)); + } unsigned const txt_c_len = ph.c_len; const unsigned lsize = getLoaderSize(); defineDecompressorSymbols(); - defineFilterSymbols(&ft); + if (ft.id!=0) { + defineFilterSymbols(&ft); + } relocateLoader(); MemBuffer loader(lsize); @@ -287,13 +356,13 @@ void PackVmlinuxBase::pack(OutputFile *fo) shdro[1].sh_name = ptr_diff(p, shstrtab); shdro[1].sh_type = Shdr::SHT_PROGBITS; shdro[1].sh_flags = Shdr::SHF_ALLOC | Shdr::SHF_EXECINSTR; - shdro[1].sh_offset = fo_off; - shdro[1].sh_size = txt_c_len + lsize; // plus more ... + shdro[1].sh_offset = fo_off - ppc32_extra; + shdro[1].sh_size = ppc32_extra + txt_c_len + lsize; // plus more ... shdro[1].sh_addralign = 1; // default fo_off += write_vmlinux_head(fo, &shdro[1]); fo->write(obuf, txt_c_len); fo_off += txt_c_len; - unsigned const a = (shdro[1].sh_addralign -1) & (0u-txt_c_len); + unsigned const a = (shdro[1].sh_addralign -1) & (0u-(ppc32_extra + txt_c_len)); if (0!=a) { // align fo_off += a; shdro[1].sh_size += a; @@ -361,7 +430,7 @@ void PackVmlinuxBase::pack(OutputFile *fo) shdro[5].sh_name = ptr_diff(p, shstrtab); shdro[5].sh_type = Shdr::SHT_SYMTAB; shdro[5].sh_offset = fo_off; - shdro[5].sh_size = 5*sizeof(Sym); + shdro[5].sh_size = ((Ehdr::EM_PPC==my_e_machine) + 5)*sizeof(Sym); //shdro[5].sh_flags = Shdr::SHF_INFO_LINK; shdro[5].sh_link = 6; // to .strtab for symbols shdro[5].sh_info = 1+3; // number of non-global symbols [binutils/bfd/elf.c] @@ -388,26 +457,40 @@ void PackVmlinuxBase::pack(OutputFile *fo) Sym unc_ker; unc_ker.st_name = 1; // 1 byte into strtab unc_ker.st_value = 0; - unc_ker.st_size = txt_c_len; + unc_ker.st_size = ppc32_extra + txt_c_len; unc_ker.st_info = unc_ker.make_st_info(Sym::STB_GLOBAL, Sym::STT_FUNC); unc_ker.st_other = Sym::STV_DEFAULT; unc_ker.st_shndx = 1; // .text fo->write(&unc_ker, sizeof(unc_ker)); fo_off += sizeof(unc_ker); unsigned const lablen = strlen(my_boot_label); + if (Ehdr::EM_PPC==my_e_machine) { + unc_ker.st_name += 1+ lablen; + unc_ker.st_value = unc_ker.st_size; + unc_ker.st_size = 0; + fo->write(&unc_ker, sizeof(unc_ker)); fo_off += sizeof(unc_ker); + } while (0!=*p++) ; shdro[6].sh_name = ptr_diff(p, shstrtab); shdro[6].sh_type = Shdr::SHT_STRTAB; shdro[6].sh_offset = fo_off; - shdro[6].sh_size = 2+ lablen; // '\0' before and after + shdro[6].sh_size = 2+ lablen + (Ehdr::EM_PPC==my_e_machine)*(1+ 12); // '\0' before and after shdro[6].sh_addralign = 1; fo->seek(1, SEEK_CUR); // the '\0' before fo->write(my_boot_label, 1+ lablen); // include the '\0' terminator + if (Ehdr::EM_PPC==my_e_machine) { + fo->write("_vmlinux_end", 1+ 12); fo_off += 1+ 12; + } fo_off += 2+ lablen; fo->seek(0, SEEK_SET); fo->write(&ehdro, sizeof(ehdro)); fo->write(&shdro, sizeof(shdro)); + if (Ehdr::EM_PPC==my_e_machine) { + fo->seek(sizeof(unsigned), SEEK_CUR); + set_be32(&ppc32_extra, ppc32_extra - 2*sizeof(unsigned) + txt_c_len); + fo->write(&ppc32_extra, sizeof(ppc32_extra)); + } if (!checkFinalCompressionRatio(fo)) throwNotCompressible(); @@ -559,6 +642,12 @@ const int *PackVmlinuxARMEB::getCompressionMethods(int method, int level) const return Packer::getDefaultCompressionMethods_8(method, level); } +const int *PackVmlinuxPPC32::getCompressionMethods(int method, int level) const +{ + // No real dependency on LE32. + return Packer::getDefaultCompressionMethods_le32(method, level); +} + const int *PackVmlinuxARMEL::getFilters() const { @@ -572,6 +661,12 @@ const int *PackVmlinuxARMEB::getFilters() const return f51; } +const int *PackVmlinuxPPC32::getFilters() const +{ + static const int fd0[] = { 0xd0, FT_END }; + return fd0; +} + // // Examples as of 2004-07-16 [readelf --segments vmlinux # before fiddling]: // @@ -669,6 +764,11 @@ bool PackVmlinuxARMEB::is_valid_e_entry(Addr e_entry) return 0xc0008000==e_entry; } +bool PackVmlinuxPPC32::is_valid_e_entry(Addr e_entry) +{ + return 0xc0000000==e_entry; +} + Linker* PackVmlinuxARMEL::newLinker() const { return new ElfLinkerArmLE; @@ -679,6 +779,11 @@ Linker* PackVmlinuxARMEB::newLinker() const return new ElfLinkerArmBE; } +Linker* PackVmlinuxPPC32::newLinker() const +{ + return new ElfLinkerPpc32; +} + void PackVmlinuxARMEL::buildLoader(const Filter *ft) @@ -725,6 +830,28 @@ void PackVmlinuxARMEB::buildLoader(const Filter *ft) addLoader("IDENTSTR,UPX1HEAD", NULL); } +void PackVmlinuxPPC32::buildLoader(const Filter *ft) +{ + // prepare loader + initLoader(stub_powerpc_linux_kernel_vmlinux, sizeof(stub_powerpc_linux_kernel_vmlinux)); + addLoader("LINUX000", NULL); + if (ft->id) { + assert(ft->calls > 0); + addLoader("LINUX010", NULL); + } + addLoader("LINUX020", NULL); + if (ft->id) { + addFilter32(ft->id); + } + addLoader("LINUX030", NULL); + if (ph.method == M_NRV2E_8) addLoader("NRV2E", NULL); + else if (ph.method == M_NRV2B_8) addLoader("NRV2B", NULL); + else if (ph.method == M_NRV2D_8) addLoader("NRV2D", NULL); + else if (M_IS_LZMA(ph.method)) addLoader("LZMA_ELF00,LZMA_DEC10,LZMA_DEC30", NULL); + else throwBadLoader(); + addLoader("IDENTSTR,UPX1HEAD", NULL); +} + static const #include "stub/i386-linux.kernel.vmlinux-head.h" @@ -734,6 +861,8 @@ static const #include "stub/arm-linux.kernel.vmlinux-head.h" static const #include "stub/armeb-linux.kernel.vmlinux-head.h" +static const +#include "stub/powerpc-linux.kernel.vmlinux-head.h" unsigned PackVmlinuxI386::write_vmlinux_head( OutputFile *const fo, @@ -783,6 +912,14 @@ void PackVmlinuxARMEB::defineDecompressorSymbols() linker->defineSymbol("METHOD", ph.method); } +void PackVmlinuxPPC32::defineDecompressorSymbols() +{ + super::defineDecompressorSymbols(); + // linker->defineSymbol( "COMPRESSED_LENGTH", ph.c_len); + // linker->defineSymbol("UNCOMPRESSED_LENGTH", ph.u_len); + // linker->defineSymbol("METHOD", ph.method); +} + void PackVmlinuxI386::defineDecompressorSymbols() { super::defineDecompressorSymbols(); @@ -844,6 +981,14 @@ unsigned PackVmlinuxARMEB::write_vmlinux_head( return sizeof(stub_armeb_linux_kernel_vmlinux_head); } +unsigned PackVmlinuxPPC32::write_vmlinux_head( + OutputFile * /*const fo*/, + Shdr * /*const stxt*/ +) +{ + return 0; +} + bool PackVmlinuxARMEL::has_valid_vmlinux_head() { @@ -873,6 +1018,20 @@ bool PackVmlinuxARMEB::has_valid_vmlinux_head() return false; } +bool PackVmlinuxPPC32::has_valid_vmlinux_head() +{ + U32 buf[2]; + fi->seek(p_text->sh_offset + sizeof(stub_powerpc_linux_kernel_vmlinux_head) -8, SEEK_SET); + fi->readx(buf, sizeof(buf)); + //unsigned const word0 = buf[0]; + unsigned const word1 = buf[1]; + if (0xeb==(word1>>24) + && (0x00ffffff& word1)==(0u - 1 + ((3+ ph.c_len)>>2))) { + return true; + } + return false; +} + bool PackVmlinuxI386::has_valid_vmlinux_head() { unsigned char buf[5]; diff --git a/src/p_vmlinx.h b/src/p_vmlinx.h index dbad65a6..03b3371c 100644 --- a/src/p_vmlinx.h +++ b/src/p_vmlinx.h @@ -167,6 +167,30 @@ protected: ); }; +class PackVmlinuxPPC32 : public PackVmlinuxBase +{ + typedef PackVmlinuxBase super; +public: + PackVmlinuxPPC32(InputFile *f) : super(f, Ehdr::EM_PPC, + Ehdr::ELFCLASS32, Ehdr::ELFDATA2MSB, "_vmlinux_start") { } + virtual int getFormat() const { return UPX_F_VMLINUX_PPC32; } + virtual const char *getName() const { return "vmlinux/ppc32"; } + virtual const char *getFullName(const options_t *) const { return "ppc32-linux.kernel.vmlinux"; } + virtual const int *getCompressionMethods(int method, int level) const; + virtual const int *getFilters() const; + +protected: + virtual void buildLoader(const Filter *ft); + virtual void defineDecompressorSymbols(); + virtual Linker* newLinker() const; + virtual bool is_valid_e_entry(Addr); + virtual bool has_valid_vmlinux_head(); + virtual unsigned write_vmlinux_head( + OutputFile *const fo, + Shdr *const stxt + ); +}; + class PackVmlinuxAMD64 : public PackVmlinuxBase { diff --git a/src/packer_c.cpp b/src/packer_c.cpp index 1cd9b5ed..27384308 100644 --- a/src/packer_c.cpp +++ b/src/packer_c.cpp @@ -214,6 +214,7 @@ const char *Packer::getDecompressorSections() const || UPX_F_BSD_ELF_i386 ==ph.format || UPX_F_VMLINUX_ARMEL ==ph.format || UPX_F_VMLINUX_ARMEB ==ph.format + || UPX_F_VMLINUX_PPC32 ==ph.format || UPX_F_MACH_PPC32 ==ph.format || UPX_F_MACH_i386 ==ph.format ) { @@ -251,6 +252,7 @@ void Packer::defineDecompressorSymbols() || UPX_F_BSD_ELF_i386 ==ph.format || UPX_F_VMLINUX_ARMEL ==ph.format || UPX_F_VMLINUX_ARMEB ==ph.format + || UPX_F_VMLINUX_PPC32 ==ph.format || UPX_F_MACH_PPC32 ==ph.format || UPX_F_MACH_i386 ==ph.format ) { diff --git a/src/packmast.cpp b/src/packmast.cpp index efaa1194..338a93bb 100644 --- a/src/packmast.cpp +++ b/src/packmast.cpp @@ -196,6 +196,8 @@ Packer* PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio return p; if ((p = func(new PackVmlinuxARMEB(f), user)) != NULL) return p; + if ((p = func(new PackVmlinuxPPC32(f), user)) != NULL) + return p; if ((p = func(new PackVmlinuxAMD64(f), user)) != NULL) return p; if ((p = func(new PackVmlinuxI386(f), user)) != NULL) diff --git a/src/stub/Makefile b/src/stub/Makefile index 75ea26e2..46f19cb9 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -92,6 +92,8 @@ STUBS += powerpc-darwin.macho-entry.h STUBS += powerpc-darwin.macho-fold.h STUBS += powerpc-linux.elf-entry.h STUBS += powerpc-linux.elf-fold.h +STUBS += powerpc-linux.kernel.vmlinux.h +STUBS += powerpc-linux.kernel.vmlinux-head.h endif @@ -883,6 +885,25 @@ tmp/powerpc-linux.elf-main.o : $(srcdir)/src/$$T.c $(call tc,objdump) -dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm +# /*********************************************************************** +# // powerpc-linux.kernel.vmlinux +# ************************************************************************/ +powerpc-linux.kernel.vmlinu%.h : tc_list = powerpc-linux.kernel default +powerpc-linux.kernel.vmlinu%.h : tc_bfdname = elf32-powerpc + +tc.powerpc-linux.kernel.gcc = $(tc.powerpc-linux.elf.gcc) + +powerpc-linux.kernel.vmlinu%.h : $(srcdir)/src/$$T.S + $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin + $(call tc,f-embed_objinfo,tmp/$T.bin) + $(call tc,bin2h-c) tmp/$T.bin $@ + +powerpc-linux.kernel.vmlinux-head.h : $(srcdir)/src/$$T.S + $(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o + $(call tc,objcopy) --output-target binary --only-section .text tmp/$T.o tmp/$T.bin + $(call tc,bin2h) tmp/$T.bin $@ + + # /*********************************************************************** # // dependencies # ************************************************************************/ diff --git a/src/stub/powerpc-linux.kernel.vmlinux-head.h b/src/stub/powerpc-linux.kernel.vmlinux-head.h new file mode 100644 index 00000000..dce43426 --- /dev/null +++ b/src/stub/powerpc-linux.kernel.vmlinux-head.h @@ -0,0 +1,37 @@ +/* powerpc-linux.kernel.vmlinux-head.h + created from powerpc-linux.kernel.vmlinux-head.bin, 8 (0x8) bytes + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2007 Laszlo Molnar + Copyright (C) 2000-2007 John F. Reiser + All Rights Reserved. + + UPX and the UCL library are free software; you can redistribute them + and/or modify them under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Markus F.X.J. Oberhumer Laszlo Molnar + + */ + + +#define STUB_POWERPC_LINUX_KERNEL_VMLINUX_HEAD_SIZE 8 +#define STUB_POWERPC_LINUX_KERNEL_VMLINUX_HEAD_ADLER32 0x0ec30259 +#define STUB_POWERPC_LINUX_KERNEL_VMLINUX_HEAD_CRC32 0xbb153f5c + +unsigned char stub_powerpc_linux_kernel_vmlinux_head[8] = { +127,232, 2,166, 72, 0, 0, 1 /* 0x 0 */ +}; diff --git a/src/stub/powerpc-linux.kernel.vmlinux.h b/src/stub/powerpc-linux.kernel.vmlinux.h new file mode 100644 index 00000000..81282c45 --- /dev/null +++ b/src/stub/powerpc-linux.kernel.vmlinux.h @@ -0,0 +1,588 @@ +/* powerpc-linux.kernel.vmlinux.h + created from powerpc-linux.kernel.vmlinux.bin, 8823 (0x2277) bytes + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2007 Laszlo Molnar + Copyright (C) 2000-2007 John F. Reiser + All Rights Reserved. + + UPX and the UCL library are free software; you can redistribute them + and/or modify them under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Markus F.X.J. Oberhumer Laszlo Molnar + + */ + + +#define STUB_POWERPC_LINUX_KERNEL_VMLINUX_SIZE 8823 +#define STUB_POWERPC_LINUX_KERNEL_VMLINUX_ADLER32 0x5634e727 +#define STUB_POWERPC_LINUX_KERNEL_VMLINUX_CRC32 0x26b45933 + +unsigned char stub_powerpc_linux_kernel_vmlinux[8823] = { +127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */ + 0, 1, 0, 20, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */ + 0, 0, 24,164, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, /* 0x 20 */ + 0, 23, 0, 20, 72, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, /* 0x 30 */ + 0, 0, 0, 0, 40, 6, 0,208, 76,130, 0, 32, 84,132,240,191, /* 0x 40 */ + 77,130, 0, 32, 60, 0, 0, 16,124, 4, 0, 64, 65,128, 0, 8, /* 0x 50 */ +124, 4, 3,120, 56,165, 1, 32,124,103, 27,120, 56, 99,255,252, /* 0x 60 */ +124,137, 3,166, 72, 0, 0, 28, 84, 75, 2,186,125, 99, 88, 80, /* 0x 70 */ +125,107, 58, 20, 81, 98, 1,186,144, 67, 0, 0, 78, 64, 0, 32, /* 0x 80 */ +132, 67, 0, 4, 84, 75, 85,190,124, 11, 40, 64, 65,162,255,220, /* 0x 90 */ + 66, 0,255,240, 78,128, 0, 32,124, 0, 41,236,125,168, 2,166, /* 0x a0 */ + 40, 7, 0, 2, 64,130, 0,228,144,166, 0, 0,124,132, 26, 20, /* 0x b0 */ + 60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, /* 0x c0 */ + 57, 64,255,255, 72, 0, 0,180,124, 9, 0, 64,125, 41, 72, 20, /* 0x d0 */ + 76,162, 0, 32, 57, 32, 0, 1,125, 41, 28, 44, 56, 99, 0, 4, /* 0x e0 */ +124, 9, 0, 64,125, 41, 73, 20, 78,128, 0, 32,141, 3, 0, 1, /* 0x f0 */ +157, 5, 0, 1, 75,255,255,213, 65,129,255,244, 56,224, 0, 1, /* 0x 100 */ + 75,255,255,201,124,231, 57, 21, 75,255,255,193, 65,160,255,244, /* 0x 110 */ + 52,231,255,253, 57, 0, 0, 0, 65,128, 0, 20,140, 67, 0, 1, /* 0x 120 */ + 84,231, 64, 46,124,234, 16,249, 65,130, 0, 0, 75,255,255,157, /* 0x 130 */ +125, 8, 65, 21, 75,255,255,149,125, 8, 65, 21, 56,224, 0, 1, /* 0x 140 */ + 64,130, 0, 28, 56,224, 0, 3, 57, 0, 0, 1, 75,255,255,125, /* 0x 150 */ +125, 8, 65, 21, 75,255,255,117, 65,160,255,244, 32, 74,242,255, /* 0x 160 */ +125, 8, 57, 20,124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1, /* 0x 170 */ +157, 5, 0, 1, 66, 0,255,248, 56,224, 1, 0,124, 7, 41,236, /* 0x 180 */ +124, 7, 26, 44, 75,255,255,112,124, 0, 41,236,125,168, 2,166, /* 0x 190 */ + 40, 7, 0, 5, 64,130, 1, 32,144,166, 0, 0,124,132, 26, 20, /* 0x 1a0 */ + 60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, /* 0x 1b0 */ + 57, 64,255,255, 72, 0, 0,240, 57, 32, 0, 1,125, 41, 28, 44, /* 0x 1c0 */ + 56, 99, 0, 4,124, 9, 0, 64,125, 41, 72, 20, 97, 41, 0, 1, /* 0x 1d0 */ + 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1,124, 9, 0, 64, /* 0x 1e0 */ +125, 41, 74, 20, 65,162,255,213, 65,129,255,236, 56,224, 0, 1, /* 0x 1f0 */ + 72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21, 65,162,255,189, /* 0x 200 */ +124,231, 57, 21,125, 41, 72, 21, 65,162,255,177,124,231, 57, 21, /* 0x 210 */ +124, 9, 0, 64,125, 41, 74, 20, 65,162,255,161, 65,160,255,216, /* 0x 220 */ + 57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46, 65,128, 0, 24, /* 0x 230 */ +140, 67, 0, 1,124,234, 16,249,125, 74, 14,112, 65,130, 0, 0, /* 0x 240 */ + 72, 0, 0, 12,125, 41, 72, 21, 65,162,255,113,125, 8, 65, 21, /* 0x 250 */ +125, 41, 72, 21, 65,162,255,101,125, 8, 65, 21, 64,130, 0, 40, /* 0x 260 */ + 57, 0, 0, 1,125, 41, 72, 21, 65,162,255, 81,125, 8, 65, 21, /* 0x 270 */ +124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 65, 65,160,255,232, /* 0x 280 */ + 57, 8, 0, 2, 32,234,250,255, 57, 8, 0, 1,125, 8, 1,148, /* 0x 290 */ +124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, /* 0x 2a0 */ + 66, 0,255,248, 56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, /* 0x 2b0 */ + 75,255,255, 44,124, 0, 41,236,125,168, 2,166, 40, 7, 0, 8, /* 0x 2c0 */ + 64,130, 1, 60,144,166, 0, 0,124,132, 26, 20, 60, 0,128, 0, /* 0x 2d0 */ + 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, 57, 64,255,255, /* 0x 2e0 */ + 72, 0, 1, 12, 57, 32, 0, 1,125, 41, 28, 44, 56, 99, 0, 4, /* 0x 2f0 */ +124, 9, 0, 64,125, 41, 72, 20, 97, 41, 0, 1, 78,128, 0, 32, /* 0x 300 */ +141, 3, 0, 1,157, 5, 0, 1,124, 9, 0, 64,125, 41, 74, 20, /* 0x 310 */ + 65,162,255,213, 65,129,255,236, 56,224, 0, 1, 72, 0, 0, 20, /* 0x 320 */ + 56,231,255,255,125, 41, 72, 21, 65,162,255,189,124,231, 57, 20, /* 0x 330 */ +125, 41, 72, 21, 65,162,255,177,124,231, 57, 20,124, 9, 0, 64, /* 0x 340 */ +125, 41, 74, 20, 65,162,255,161, 65,160,255,216, 57, 0, 0, 0, /* 0x 350 */ + 52,231,255,253, 84,231, 64, 46, 65,128, 0, 32,140, 67, 0, 1, /* 0x 360 */ +124,234, 16,249,125, 74, 14,112, 65,130, 0, 0,112, 66, 0, 1, /* 0x 370 */ + 65,162, 0, 80, 72, 0, 0, 20,124, 9, 0, 64,125, 41, 74, 20, /* 0x 380 */ + 65,162,255,101, 65,161, 0, 60, 57, 0, 0, 1,124, 9, 0, 64, /* 0x 390 */ +125, 41, 74, 20, 65,162,255, 81, 65,161, 0, 40,125, 41, 72, 21, /* 0x 3a0 */ + 65,162,255, 69,125, 8, 65, 20,124, 9, 0, 64,125, 41, 74, 20, /* 0x 3b0 */ + 65,162,255, 53, 65,160,255,232, 57, 8, 0, 2, 72, 0, 0, 16, /* 0x 3c0 */ +125, 41, 72, 21, 65,162,255, 33,125, 8, 65, 20, 32,234,250,255, /* 0x 3d0 */ + 57, 8, 0, 2,125, 8, 1,148,124,234, 42, 20,125, 9, 3,166, /* 0x 3e0 */ +141, 7, 0, 1,157, 5, 0, 1, 66, 0,255,248, 56,224, 1, 0, /* 0x 3f0 */ +124, 7, 41,236,124, 7, 26, 44, 75,255,255, 16, 40, 7, 0, 14, /* 0x 400 */ + 64,130, 0, 16,124, 8, 2,166,124,201, 51,120,129, 6, 0, 0, /* 0x 410 */ +124,167, 43,120, 56,164,255,254, 56,131, 0, 2,144, 1, 0, 4, /* 0x 420 */ +136, 3, 0, 0, 84, 11,232,254, 84, 2, 7,126, 56, 96,250, 0, /* 0x 430 */ +124, 99, 88, 48, 56, 99,241,132,124, 38, 11,120,124, 33, 26, 20, /* 0x 440 */ + 84, 33, 0, 52, 56, 0, 0, 0,124,195, 51,120,144, 9, 0, 0, /* 0x 450 */ +148, 3,255,252,124, 1, 24, 64, 65,128,255,248,144,193, 0, 0, /* 0x 460 */ +136, 4,255,255, 56,193, 0, 8, 56, 97, 0, 12, 84, 11,225, 62, /* 0x 470 */ + 84, 0, 7, 62,152, 67, 0, 2,153, 99, 0, 1,152, 3, 0, 0, /* 0x 480 */ +124, 8, 2,166,148, 33,255,160,189,193, 0, 24,144, 1, 0,100, /* 0x 490 */ + 59, 32, 0, 0,137, 67, 0, 2,137, 99, 0, 1,138, 67, 0, 0, /* 0x 4a0 */ +147, 38, 0, 0,147, 41, 0, 0,136, 3, 0, 1,125, 40, 3,166, /* 0x 4b0 */ +124, 18, 2, 20, 57, 32, 3, 0,125, 41, 0, 48, 56, 9, 7, 54, /* 0x 4c0 */ +127,153, 0, 64, 57, 32, 0, 1,125, 43, 88, 48,125, 41, 80, 48, /* 0x 4d0 */ + 57, 41,255,255, 57,107,255,255,145, 33, 0, 8,124,206, 51,120, /* 0x 4e0 */ +124,147, 35,120,124,245, 59,120,125, 20, 67,120,145, 97, 0, 12, /* 0x 4f0 */ + 59, 3, 0, 4, 59,224, 0, 0, 58,224, 0, 0, 59, 64, 0, 1, /* 0x 500 */ + 58, 32, 0, 1, 58, 0, 0, 1, 57,224, 0, 1, 57, 32, 0, 0, /* 0x 510 */ + 64,156, 0, 28,124, 9, 3,166, 57, 96, 4, 0, 85, 32, 8, 60, /* 0x 520 */ +125,120, 3, 46, 57, 41, 0, 1, 66, 0,255,244,127,179, 42, 20, /* 0x 530 */ +126,108,155,120, 56,160, 0, 0, 57, 0,255,255, 57, 96, 0, 0, /* 0x 540 */ +127,140,232, 0, 57,107, 0, 1, 47, 11, 0, 4, 84,169, 64, 46, /* 0x 550 */ + 65,158, 8,156,136, 12, 0, 0, 57,140, 0, 1,125, 37, 3,120, /* 0x 560 */ + 64,153,255,224,127,153,160, 64, 64,156, 8,100, 62,192, 0,255, /* 0x 570 */ + 98,214,255,255,128, 1, 0, 8,127,136,176, 64,127, 35, 0, 56, /* 0x 580 */ + 86,224, 32, 54,124, 0, 26, 20, 84, 6, 8, 60, 65,157, 0, 32, /* 0x 590 */ +127,140,232, 0, 65,158, 8, 88,137, 44, 0, 0, 84,160, 64, 46, /* 0x 5a0 */ +124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,124,230,194, 46, /* 0x 5b0 */ + 85, 0,170,254,125, 64, 57,214,127,133, 80, 64, 64,156, 1,172, /* 0x 5c0 */ +128, 1, 0, 12, 47,151, 0, 6,127, 41, 0, 56, 32, 18, 0, 8, /* 0x 5d0 */ +127,224, 6, 48,125, 41,144, 48,125, 41, 2, 20, 29, 41, 6, 0, /* 0x 5e0 */ + 32, 7, 8, 0,124, 0, 46,112,124, 7, 2, 20,125, 56, 74, 20, /* 0x 5f0 */ +124, 6,195, 46,125, 72, 83,120, 56,201, 14,108, 56, 96, 0, 1, /* 0x 600 */ + 64,157, 0,180,124, 26,200, 80, 63, 96, 0,255,127,245, 0,174, /* 0x 610 */ + 99,123,255,255, 87,255, 8, 60, 87,252, 5,238,127,136,216, 64, /* 0x 620 */ + 87,128, 8, 60, 84,100, 8, 60,124, 6, 2, 20,127, 12,232, 0, /* 0x 630 */ + 84,169, 64, 46,124,224, 34, 20, 65,157, 0, 24, 65,154, 7,176, /* 0x 640 */ +136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x 650 */ +161,103, 2, 0, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x 660 */ +127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x 670 */ + 47, 28, 0, 0,125,105, 88, 80,124,131, 35,120,125, 10, 64, 80, /* 0x 680 */ + 64,156, 0, 20,176, 7, 2, 0,125, 72, 83,120, 65,186, 0, 24, /* 0x 690 */ + 72, 0, 0, 28,177,103, 2, 0,124,170, 40, 80, 56,100, 0, 1, /* 0x 6a0 */ + 65,154, 0, 12, 47,131, 0,255, 64,157,255,108, 47,131, 0,255, /* 0x 6b0 */ + 65,157, 0,132, 63,224, 0,255, 99,255,255,255,127,136,248, 64, /* 0x 6c0 */ + 84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, /* 0x 6d0 */ + 65,157, 0, 24, 65,154, 7, 24,136, 12, 0, 0, 85, 8, 64, 46, /* 0x 6e0 */ + 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254, /* 0x 6f0 */ +125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x 700 */ + 85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x 710 */ + 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16, /* 0x 720 */ +124,170, 40, 80,125,102, 59, 46, 56,103, 0, 1, 47,131, 0,255, /* 0x 730 */ + 64,157,255,140, 47,151, 0, 3, 84,127, 6, 62,127,249,169,174, /* 0x 740 */ + 59, 57, 0, 1, 65,157, 0, 12, 58,224, 0, 0, 72, 0, 6,120, /* 0x 750 */ + 47,151, 0, 9, 65,157, 0, 12, 58,247,255,253, 72, 0, 6,104, /* 0x 760 */ + 58,247,255,250, 72, 0, 6, 96,125, 10, 64, 80,127,136,176, 64, /* 0x 770 */ + 84,224,217,126,124, 0, 56, 80, 86,233, 8, 60,124, 6,195, 46, /* 0x 780 */ +124,170, 40, 80,124,248, 74, 20, 65,157, 0, 32,127,140,232, 0, /* 0x 790 */ + 65,158, 6, 92,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x 7a0 */ + 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,128, 85, 0,170,254, /* 0x 7b0 */ +125, 64, 89,214,127,133, 80, 64, 64,156, 0, 64, 32, 11, 8, 0, /* 0x 7c0 */ + 47,151, 0, 6,124, 0, 46,112,124, 11, 2, 20,176, 7, 1,128, /* 0x 7d0 */ +126, 15,131,120,125, 72, 83,120,126, 48,139,120, 56, 0, 0, 0, /* 0x 7e0 */ +127, 81,211,120, 64,157, 0, 8, 56, 0, 0, 3,124, 23, 3,120, /* 0x 7f0 */ + 56,216, 6,100, 72, 0, 2, 24,125, 10, 64, 80,127,136,176, 64, /* 0x 800 */ + 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,128, /* 0x 810 */ + 65,157, 0, 32,127,140,232, 0, 65,158, 5,212,137, 44, 0, 0, /* 0x 820 */ + 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 830 */ +161,103, 1,152, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x 840 */ + 64,156, 0,188, 32, 11, 8, 0,127,138,176, 64,124, 0, 46,112, /* 0x 850 */ + 86,233, 40, 52,124, 11, 2, 20,125, 56, 74, 20, 84,107, 8, 60, /* 0x 860 */ +176, 7, 1,152,125, 72, 83,120,124,233, 90, 20, 65,157, 0, 32, /* 0x 870 */ +127,140,232, 0, 65,158, 5,120,137, 44, 0, 0, 84,160, 64, 46, /* 0x 880 */ +124, 5, 75,120, 85, 72, 64, 46, 57,140, 0, 1,161,103, 1,224, /* 0x 890 */ + 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 72, /* 0x 8a0 */ + 32, 11, 8, 0, 47,153, 0, 0,124, 0, 46,112,124, 11, 2, 20, /* 0x 8b0 */ +176, 7, 1,224,125, 72, 83,120, 65,158, 5, 52, 47,151, 0, 6, /* 0x 8c0 */ + 57, 32, 0, 9, 64,157, 0, 8, 57, 32, 0, 11,124, 26,200, 80, /* 0x 8d0 */ +127,245, 0,174,125, 55, 75,120,127,249,169,174, 59, 57, 0, 1, /* 0x 8e0 */ + 72, 0, 4,228, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x 8f0 */ +125, 10, 64, 80,176, 7, 1,224, 72, 0, 0,252,125, 10, 64, 80, /* 0x 900 */ +127,136,176, 64, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x 910 */ +176, 7, 1,152, 65,157, 0, 32,127,140,232, 0, 65,158, 4,208, /* 0x 920 */ +137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x 930 */ + 57,140, 0, 1,161,103, 1,176, 85, 0,170,254,125, 64, 89,214, /* 0x 940 */ +127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0,124, 0, 46,112, /* 0x 950 */ +124, 11, 2, 20,125, 72, 83,120,126, 41,139,120,176, 7, 1,176, /* 0x 960 */ + 72, 0, 0,140,125, 10, 64, 80,127,136,176, 64, 85, 96,217,126, /* 0x 970 */ +124, 0, 88, 80,124,170, 40, 80,176, 7, 1,176, 65,157, 0, 32, /* 0x 980 */ +127,140,232, 0, 65,158, 4,104,137, 44, 0, 0, 84,160, 64, 46, /* 0x 990 */ +124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,200, /* 0x 9a0 */ + 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, /* 0x 9b0 */ + 32, 11, 8, 0,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, /* 0x 9c0 */ +126, 9,131,120,176, 7, 1,200, 72, 0, 0, 32, 85, 96,217,126, /* 0x 9d0 */ +124, 0, 88, 80,125,233,123,120,176, 7, 1,200,124,170, 40, 80, /* 0x 9e0 */ +125, 10, 64, 80,126, 15,131,120,126, 48,139,120,127, 81,211,120, /* 0x 9f0 */ +125, 58, 75,120, 47,151, 0, 6, 56, 0, 0, 8, 64,157, 0, 8, /* 0x a00 */ + 56, 0, 0, 11,124, 23, 3,120, 56,216, 10,104,127,136,176, 64, /* 0x a10 */ + 65,157, 0, 32,127,140,232, 0, 65,158, 3,212,137, 44, 0, 0, /* 0x a20 */ + 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x a30 */ +161,102, 0, 0, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x a40 */ + 64,156, 0, 48, 32, 11, 8, 0, 84,105, 32, 54,125, 38, 74, 20, /* 0x a50 */ +124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, 56,137, 0, 4, /* 0x a60 */ + 59,128, 0, 0, 59, 96, 0, 3,176, 6, 0, 0, 72, 0, 0,156, /* 0x a70 */ +125, 10, 64, 80,127,136,176, 64, 85, 96,217,126,124, 0, 88, 80, /* 0x a80 */ +124,170, 40, 80,176, 6, 0, 0, 65,157, 0, 32,127,140,232, 0, /* 0x a90 */ + 65,158, 3, 92,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x aa0 */ + 85, 8, 64, 46, 57,140, 0, 1,161,102, 0, 2, 85, 0,170,254, /* 0x ab0 */ +125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, 32, 11, 8, 0, /* 0x ac0 */ + 84,105, 32, 54,125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20, /* 0x ad0 */ +125, 72, 83,120, 56,137, 1, 4, 59,128, 0, 8, 59, 96, 0, 3, /* 0x ae0 */ +176, 6, 0, 2, 72, 0, 0, 36, 85, 96,217,126,124, 0, 88, 80, /* 0x af0 */ +124,170, 40, 80,176, 6, 0, 2,125, 10, 64, 80, 56,134, 2, 4, /* 0x b00 */ + 59,128, 0, 16, 59, 96, 0, 8,127,105, 3,166, 63,224, 0,255, /* 0x b10 */ + 99,255,255,255, 56, 96, 0, 1,127,136,248, 64, 84,103, 8, 60, /* 0x b20 */ +127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, 65,157, 0, 24, /* 0x b30 */ + 65,154, 2,188,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x b40 */ +125, 37, 3,120,125,100, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x b50 */ + 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x b60 */ +124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x b70 */ +125, 72, 83,120,124, 4, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x b80 */ + 56,103, 0, 1,125,100, 59, 46, 66, 0,255,144, 56, 0, 0, 1, /* 0x b90 */ + 47,151, 0, 3,124, 0,216, 48,124, 96, 24, 80,124, 99,226, 20, /* 0x ba0 */ + 65,157, 1,232, 47,131, 0, 3, 58,247, 0, 7,124,105, 27,120, /* 0x bb0 */ + 64,157, 0, 8, 57, 32, 0, 3, 85, 41, 56, 48,125, 56, 74, 20, /* 0x bc0 */ + 56,201, 3, 96, 57, 32, 0, 6,125, 41, 3,166, 63,224, 0,255, /* 0x bd0 */ + 99,255,255,255, 56,128, 0, 1,127,136,248, 64, 84,135, 8, 60, /* 0x be0 */ +127, 12,232, 0, 84,169, 64, 46,124,228, 59,120, 65,157, 0, 24, /* 0x bf0 */ + 65,154, 1,252,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x c00 */ +125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x c10 */ + 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x c20 */ +124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x c30 */ +125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x c40 */ + 56,135, 0, 1,125,102, 59, 46, 66, 0,255,144, 56,132,255,192, /* 0x c50 */ + 47,132, 0, 3,124,154, 35,120, 64,157, 1, 40, 47,132, 0, 13, /* 0x c60 */ +124,137, 14,112, 84,128, 7,254, 57,105,255,255, 96, 26, 0, 2, /* 0x c70 */ +125,105, 3,166, 65,157, 0, 32,127, 90, 88, 48, 87, 73, 8, 60, /* 0x c80 */ +125, 56, 74, 20, 84,128, 8, 60,125, 32, 72, 80, 56,201, 5, 94, /* 0x c90 */ + 72, 0, 0,100, 57, 41,255,251,125, 41, 3,166, 61, 96, 0,255, /* 0x ca0 */ + 97,107,255,255,127,136, 88, 64,127, 12,232, 0, 84,169, 64, 46, /* 0x cb0 */ + 87, 90, 8, 60, 65,157, 0, 24, 65,154, 1, 52,136, 12, 0, 0, /* 0x cc0 */ + 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, 85, 8,248,126, /* 0x cd0 */ +127,133, 64, 64, 65,156, 0, 12,124,168, 40, 80, 99, 90, 0, 1, /* 0x ce0 */ + 66, 0,255,196, 56, 0, 0, 4,124, 9, 3,166, 87, 90, 32, 54, /* 0x cf0 */ + 56,216, 6, 68, 60,128, 0,255, 96,132,255,255, 59,128, 0, 1, /* 0x d00 */ + 59,224, 0, 1,127,136, 32, 64, 87,231, 8, 60,127, 12,232, 0, /* 0x d10 */ + 84,169, 64, 46,124,255, 59,120, 65,157, 0, 24, 65,154, 0,208, /* 0x d20 */ +136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x d30 */ +125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x d40 */ +127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x d50 */ +125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120, /* 0x d60 */ +124, 6, 59, 46, 72, 0, 0, 20,124,170, 40, 80, 59,231, 0, 1, /* 0x d70 */ +125,102, 59, 46,127, 90,227,120, 87,156, 8, 60, 66, 0,255,136, /* 0x d80 */ + 55, 90, 0, 1, 65,130, 0, 72,127,154,200, 64, 56, 99, 0, 2, /* 0x d90 */ + 65,157, 0, 92,124, 26,200, 80,127,245, 0,174, 56, 99,255,255, /* 0x da0 */ +127,249,169,174, 59, 57, 0, 1, 49, 99,255,255,125, 43, 25, 16, /* 0x db0 */ +124, 20,200, 16,124, 0, 1, 16,124, 0, 0,208,125, 43, 0, 57, /* 0x dc0 */ + 64,130,255,212,127,153,160, 64, 65,156,247,172, 60, 0, 0,255, /* 0x dd0 */ + 96, 0,255,255,127,136, 0, 64, 65,157, 0, 32,127,140,232, 0, /* 0x de0 */ + 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1, /* 0x df0 */ + 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80, /* 0x e00 */ +144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100, /* 0x e10 */ +185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96,124, 8, 2,166, /* 0x e20 */ +148, 33,255,160,189,193, 0, 24,144, 1, 0,100, 59, 32, 0, 0, /* 0x e30 */ +137, 67, 0, 2,137, 99, 0, 1,138, 67, 0, 0,147, 38, 0, 0, /* 0x e40 */ +147, 41, 0, 0,136, 3, 0, 1,125, 40, 3,166,124, 18, 2, 20, /* 0x e50 */ + 57, 32, 3, 0,125, 41, 0, 48, 56, 9, 7, 54,127,153, 0, 64, /* 0x e60 */ + 57, 32, 0, 1,125, 43, 88, 48,125, 41, 80, 48, 57, 41,255,255, /* 0x e70 */ + 57,107,255,255,145, 33, 0, 8,124,206, 51,120,124,147, 35,120, /* 0x e80 */ +124,245, 59,120,125, 20, 67,120,145, 97, 0, 12, 59, 3, 0, 4, /* 0x e90 */ + 59,224, 0, 0, 58,224, 0, 0, 59, 64, 0, 1, 58, 32, 0, 1, /* 0x ea0 */ + 58, 0, 0, 1, 57,224, 0, 1, 57, 32, 0, 0, 64,156, 0, 28, /* 0x eb0 */ +124, 9, 3,166, 57, 96, 4, 0, 85, 32, 8, 60,125,120, 3, 46, /* 0x ec0 */ + 57, 41, 0, 1, 66, 0,255,244,127,179, 42, 20,126,108,155,120, /* 0x ed0 */ + 56,160, 0, 0, 57, 0,255,255, 57, 96, 0, 0,127,140,232, 0, /* 0x ee0 */ + 57,107, 0, 1, 47, 11, 0, 4, 84,169, 64, 46, 65,158, 8,156, /* 0x ef0 */ +136, 12, 0, 0, 57,140, 0, 1,125, 37, 3,120, 64,153,255,224, /* 0x f00 */ +127,153,160, 64, 64,156, 8,100, 62,192, 0,255, 98,214,255,255, /* 0x f10 */ +128, 1, 0, 8,127,136,176, 64,127, 35, 0, 56, 86,224, 32, 54, /* 0x f20 */ +124, 0, 26, 20, 84, 6, 8, 60, 65,157, 0, 32,127,140,232, 0, /* 0x f30 */ + 65,158, 8, 88,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x f40 */ + 85, 8, 64, 46, 57,140, 0, 1,124,230,194, 46, 85, 0,170,254, /* 0x f50 */ +125, 64, 57,214,127,133, 80, 64, 64,156, 1,172,128, 1, 0, 12, /* 0x f60 */ + 47,151, 0, 6,127, 41, 0, 56, 32, 18, 0, 8,127,224, 6, 48, /* 0x f70 */ +125, 41,144, 48,125, 41, 2, 20, 29, 41, 6, 0, 32, 7, 8, 0, /* 0x f80 */ +124, 0, 46,112,124, 7, 2, 20,125, 56, 74, 20,124, 6,195, 46, /* 0x f90 */ +125, 72, 83,120, 56,201, 14,108, 56, 96, 0, 1, 64,157, 0,180, /* 0x fa0 */ +124, 26,200, 80, 63, 96, 0,255,127,245, 0,174, 99,123,255,255, /* 0x fb0 */ + 87,255, 8, 60, 87,252, 5,238,127,136,216, 64, 87,128, 8, 60, /* 0x fc0 */ + 84,100, 8, 60,124, 6, 2, 20,127, 12,232, 0, 84,169, 64, 46, /* 0x fd0 */ +124,224, 34, 20, 65,157, 0, 24, 65,154, 7,176,136, 12, 0, 0, /* 0x fe0 */ + 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,161,103, 2, 0, /* 0x ff0 */ + 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64, /* 0x1000 */ +124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, 47, 28, 0, 0, /* 0x1010 */ +125,105, 88, 80,124,131, 35,120,125, 10, 64, 80, 64,156, 0, 20, /* 0x1020 */ +176, 7, 2, 0,125, 72, 83,120, 65,186, 0, 24, 72, 0, 0, 28, /* 0x1030 */ +177,103, 2, 0,124,170, 40, 80, 56,100, 0, 1, 65,154, 0, 12, /* 0x1040 */ + 47,131, 0,255, 64,157,255,108, 47,131, 0,255, 65,157, 0,132, /* 0x1050 */ + 63,224, 0,255, 99,255,255,255,127,136,248, 64, 84,103, 8, 60, /* 0x1060 */ +127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, 65,157, 0, 24, /* 0x1070 */ + 65,154, 7, 24,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1080 */ +125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x1090 */ + 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x10a0 */ +124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x10b0 */ +125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x10c0 */ +125,102, 59, 46, 56,103, 0, 1, 47,131, 0,255, 64,157,255,140, /* 0x10d0 */ + 47,151, 0, 3, 84,127, 6, 62,127,249,169,174, 59, 57, 0, 1, /* 0x10e0 */ + 65,157, 0, 12, 58,224, 0, 0, 72, 0, 6,120, 47,151, 0, 9, /* 0x10f0 */ + 65,157, 0, 12, 58,247,255,253, 72, 0, 6,104, 58,247,255,250, /* 0x1100 */ + 72, 0, 6, 96,125, 10, 64, 80,127,136,176, 64, 84,224,217,126, /* 0x1110 */ +124, 0, 56, 80, 86,233, 8, 60,124, 6,195, 46,124,170, 40, 80, /* 0x1120 */ +124,248, 74, 20, 65,157, 0, 32,127,140,232, 0, 65,158, 6, 92, /* 0x1130 */ +137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x1140 */ + 57,140, 0, 1,161,103, 1,128, 85, 0,170,254,125, 64, 89,214, /* 0x1150 */ +127,133, 80, 64, 64,156, 0, 64, 32, 11, 8, 0, 47,151, 0, 6, /* 0x1160 */ +124, 0, 46,112,124, 11, 2, 20,176, 7, 1,128,126, 15,131,120, /* 0x1170 */ +125, 72, 83,120,126, 48,139,120, 56, 0, 0, 0,127, 81,211,120, /* 0x1180 */ + 64,157, 0, 8, 56, 0, 0, 3,124, 23, 3,120, 56,216, 6,100, /* 0x1190 */ + 72, 0, 2, 24,125, 10, 64, 80,127,136,176, 64, 85, 96,217,126, /* 0x11a0 */ +124, 0, 88, 80,124,170, 40, 80,176, 7, 1,128, 65,157, 0, 32, /* 0x11b0 */ +127,140,232, 0, 65,158, 5,212,137, 44, 0, 0, 84,160, 64, 46, /* 0x11c0 */ +124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,152, /* 0x11d0 */ + 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0,188, /* 0x11e0 */ + 32, 11, 8, 0,127,138,176, 64,124, 0, 46,112, 86,233, 40, 52, /* 0x11f0 */ +124, 11, 2, 20,125, 56, 74, 20, 84,107, 8, 60,176, 7, 1,152, /* 0x1200 */ +125, 72, 83,120,124,233, 90, 20, 65,157, 0, 32,127,140,232, 0, /* 0x1210 */ + 65,158, 5,120,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x1220 */ + 85, 72, 64, 46, 57,140, 0, 1,161,103, 1,224, 85, 0,170,254, /* 0x1230 */ +125, 64, 89,214,127,133, 80, 64, 64,156, 0, 72, 32, 11, 8, 0, /* 0x1240 */ + 47,153, 0, 0,124, 0, 46,112,124, 11, 2, 20,176, 7, 1,224, /* 0x1250 */ +125, 72, 83,120, 65,158, 5, 52, 47,151, 0, 6, 57, 32, 0, 9, /* 0x1260 */ + 64,157, 0, 8, 57, 32, 0, 11,124, 26,200, 80,127,245, 0,174, /* 0x1270 */ +125, 55, 75,120,127,249,169,174, 59, 57, 0, 1, 72, 0, 4,228, /* 0x1280 */ + 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,125, 10, 64, 80, /* 0x1290 */ +176, 7, 1,224, 72, 0, 0,252,125, 10, 64, 80,127,136,176, 64, /* 0x12a0 */ + 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,152, /* 0x12b0 */ + 65,157, 0, 32,127,140,232, 0, 65,158, 4,208,137, 44, 0, 0, /* 0x12c0 */ + 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x12d0 */ +161,103, 1,176, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x12e0 */ + 64,156, 0, 32, 32, 11, 8, 0,124, 0, 46,112,124, 11, 2, 20, /* 0x12f0 */ +125, 72, 83,120,126, 41,139,120,176, 7, 1,176, 72, 0, 0,140, /* 0x1300 */ +125, 10, 64, 80,127,136,176, 64, 85, 96,217,126,124, 0, 88, 80, /* 0x1310 */ +124,170, 40, 80,176, 7, 1,176, 65,157, 0, 32,127,140,232, 0, /* 0x1320 */ + 65,158, 4,104,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x1330 */ + 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,200, 85, 0,170,254, /* 0x1340 */ +125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0, /* 0x1350 */ +124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120,126, 9,131,120, /* 0x1360 */ +176, 7, 1,200, 72, 0, 0, 32, 85, 96,217,126,124, 0, 88, 80, /* 0x1370 */ +125,233,123,120,176, 7, 1,200,124,170, 40, 80,125, 10, 64, 80, /* 0x1380 */ +126, 15,131,120,126, 48,139,120,127, 81,211,120,125, 58, 75,120, /* 0x1390 */ + 47,151, 0, 6, 56, 0, 0, 8, 64,157, 0, 8, 56, 0, 0, 11, /* 0x13a0 */ +124, 23, 3,120, 56,216, 10,104,127,136,176, 64, 65,157, 0, 32, /* 0x13b0 */ +127,140,232, 0, 65,158, 3,212,137, 44, 0, 0, 84,160, 64, 46, /* 0x13c0 */ +124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,102, 0, 0, /* 0x13d0 */ + 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, /* 0x13e0 */ + 32, 11, 8, 0, 84,105, 32, 54,125, 38, 74, 20,124, 0, 46,112, /* 0x13f0 */ +124, 11, 2, 20,125, 72, 83,120, 56,137, 0, 4, 59,128, 0, 0, /* 0x1400 */ + 59, 96, 0, 3,176, 6, 0, 0, 72, 0, 0,156,125, 10, 64, 80, /* 0x1410 */ +127,136,176, 64, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x1420 */ +176, 6, 0, 0, 65,157, 0, 32,127,140,232, 0, 65,158, 3, 92, /* 0x1430 */ +137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x1440 */ + 57,140, 0, 1,161,102, 0, 2, 85, 0,170,254,125, 64, 89,214, /* 0x1450 */ +127,133, 80, 64, 64,156, 0, 48, 32, 11, 8, 0, 84,105, 32, 54, /* 0x1460 */ +125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, /* 0x1470 */ + 56,137, 1, 4, 59,128, 0, 8, 59, 96, 0, 3,176, 6, 0, 2, /* 0x1480 */ + 72, 0, 0, 36, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x1490 */ +176, 6, 0, 2,125, 10, 64, 80, 56,134, 2, 4, 59,128, 0, 16, /* 0x14a0 */ + 59, 96, 0, 8,127,105, 3,166, 63,224, 0,255, 99,255,255,255, /* 0x14b0 */ + 56, 96, 0, 1,127,136,248, 64, 84,103, 8, 60,127, 12,232, 0, /* 0x14c0 */ + 84,169, 64, 46,124,227, 59,120, 65,157, 0, 24, 65,154, 2,188, /* 0x14d0 */ +136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x14e0 */ +125,100, 58, 46, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x14f0 */ +127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x1500 */ +125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120, /* 0x1510 */ +124, 4, 59, 46, 72, 0, 0, 16,124,170, 40, 80, 56,103, 0, 1, /* 0x1520 */ +125,100, 59, 46, 66, 0,255,144, 56, 0, 0, 1, 47,151, 0, 3, /* 0x1530 */ +124, 0,216, 48,124, 96, 24, 80,124, 99,226, 20, 65,157, 1,232, /* 0x1540 */ + 47,131, 0, 3, 58,247, 0, 7,124,105, 27,120, 64,157, 0, 8, /* 0x1550 */ + 57, 32, 0, 3, 85, 41, 56, 48,125, 56, 74, 20, 56,201, 3, 96, /* 0x1560 */ + 57, 32, 0, 6,125, 41, 3,166, 63,224, 0,255, 99,255,255,255, /* 0x1570 */ + 56,128, 0, 1,127,136,248, 64, 84,135, 8, 60,127, 12,232, 0, /* 0x1580 */ + 84,169, 64, 46,124,228, 59,120, 65,157, 0, 24, 65,154, 1,252, /* 0x1590 */ +136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x15a0 */ +125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x15b0 */ +127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x15c0 */ +125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120, /* 0x15d0 */ +124, 6, 59, 46, 72, 0, 0, 16,124,170, 40, 80, 56,135, 0, 1, /* 0x15e0 */ +125,102, 59, 46, 66, 0,255,144, 56,132,255,192, 47,132, 0, 3, /* 0x15f0 */ +124,154, 35,120, 64,157, 1, 40, 47,132, 0, 13,124,137, 14,112, /* 0x1600 */ + 84,128, 7,254, 57,105,255,255, 96, 26, 0, 2,125,105, 3,166, /* 0x1610 */ + 65,157, 0, 32,127, 90, 88, 48, 87, 73, 8, 60,125, 56, 74, 20, /* 0x1620 */ + 84,128, 8, 60,125, 32, 72, 80, 56,201, 5, 94, 72, 0, 0,100, /* 0x1630 */ + 57, 41,255,251,125, 41, 3,166, 61, 96, 0,255, 97,107,255,255, /* 0x1640 */ +127,136, 88, 64,127, 12,232, 0, 84,169, 64, 46, 87, 90, 8, 60, /* 0x1650 */ + 65,157, 0, 24, 65,154, 1, 52,136, 12, 0, 0, 85, 8, 64, 46, /* 0x1660 */ + 57,140, 0, 1,125, 37, 3,120, 85, 8,248,126,127,133, 64, 64, /* 0x1670 */ + 65,156, 0, 12,124,168, 40, 80, 99, 90, 0, 1, 66, 0,255,196, /* 0x1680 */ + 56, 0, 0, 4,124, 9, 3,166, 87, 90, 32, 54, 56,216, 6, 68, /* 0x1690 */ + 60,128, 0,255, 96,132,255,255, 59,128, 0, 1, 59,224, 0, 1, /* 0x16a0 */ +127,136, 32, 64, 87,231, 8, 60,127, 12,232, 0, 84,169, 64, 46, /* 0x16b0 */ +124,255, 59,120, 65,157, 0, 24, 65,154, 0,208,136, 12, 0, 0, /* 0x16c0 */ + 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, /* 0x16d0 */ + 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64, /* 0x16e0 */ +124, 0, 46,112, 85,105,217,126,124, 11, 2, 20,125, 10, 64, 80, /* 0x16f0 */ +125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, /* 0x1700 */ + 72, 0, 0, 20,124,170, 40, 80, 59,231, 0, 1,125,102, 59, 46, /* 0x1710 */ +127, 90,227,120, 87,156, 8, 60, 66, 0,255,136, 55, 90, 0, 1, /* 0x1720 */ + 65,130, 0, 72,127,154,200, 64, 56, 99, 0, 2, 65,157, 0, 92, /* 0x1730 */ +124, 26,200, 80,127,245, 0,174, 56, 99,255,255,127,249,169,174, /* 0x1740 */ + 59, 57, 0, 1, 49, 99,255,255,125, 43, 25, 16,124, 20,200, 16, /* 0x1750 */ +124, 0, 1, 16,124, 0, 0,208,125, 43, 0, 57, 64,130,255,212, /* 0x1760 */ +127,153,160, 64, 65,156,247,172, 60, 0, 0,255, 96, 0,255,255, /* 0x1770 */ +127,136, 0, 64, 65,157, 0, 32,127,140,232, 0, 56, 96, 0, 1, /* 0x1780 */ + 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1, 72, 0, 0, 28, /* 0x1790 */ + 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80,144, 14, 0, 0, /* 0x17a0 */ + 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100,185,193, 0, 24, /* 0x17b0 */ +124, 8, 3,166, 56, 33, 0, 96,128, 33, 0, 0,128, 1, 0, 4, /* 0x17c0 */ +124, 8, 3,166, 78,128, 0, 32, 85, 80, 88, 33,161,216,208,213, /* 0x17d0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17e0 */ + 0, 0, 0, 0, 0, 0, 0, 45,116,109,112, 47,112,111,119,101, /* 0x17f0 */ +114,112, 99, 45,108,105,110,117,120, 46,107,101,114,110,101,108, /* 0x1800 */ + 46,118,109,108,105,110,117,120, 46, 98,105,110, 58, 32, 32, 32, /* 0x1810 */ + 32, 32,102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108, /* 0x1820 */ +102, 51, 50, 45,112,111,119,101,114,112, 99, 10, 10, 83,101, 99, /* 0x1830 */ +116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, /* 0x1840 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, /* 0x1850 */ + 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, /* 0x1860 */ + 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, /* 0x1870 */ + 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, /* 0x1880 */ + 32, 76, 73, 78, 85, 88, 48, 48, 48, 32, 32, 32, 32, 32, 32, 48, /* 0x1890 */ + 48, 48, 48, 48, 48, 48, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, /* 0x18a0 */ + 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x18b0 */ + 48, 48, 48, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, /* 0x18c0 */ + 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, /* 0x18d0 */ + 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 76, 73, 78, 85, 88, /* 0x18e0 */ + 48, 49, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, /* 0x18f0 */ + 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x1900 */ + 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 51, 99, 32, /* 0x1910 */ + 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, /* 0x1920 */ + 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, /* 0x1930 */ + 10, 32, 32, 50, 32, 76, 73, 78, 85, 88, 48, 50, 48, 32, 32, 32, /* 0x1940 */ + 32, 32, 32, 48, 48, 48, 48, 48, 48, 54, 52, 32, 32, 48, 48, 48, /* 0x1950 */ + 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1960 */ + 32, 48, 48, 48, 48, 48, 48, 52, 52, 32, 32, 50, 42, 42, 48, 32, /* 0x1970 */ + 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, /* 0x1980 */ + 78, 76, 89, 10, 32, 32, 51, 32, 76, 73, 78, 85, 88, 48, 51, 48, /* 0x1990 */ + 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x19a0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x19b0 */ + 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 97, 56, 32, 32, 50, 42, /* 0x19c0 */ + 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x19d0 */ + 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82, 86, 50, 66, /* 0x19e0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,102, /* 0x19f0 */ + 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x1a00 */ + 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 97, 56, 32, /* 0x1a10 */ + 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, /* 0x1a20 */ + 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, /* 0x1a30 */ + 10, 32, 32, 53, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, 32, /* 0x1a40 */ + 32, 32, 32, 48, 48, 48, 48, 48, 49, 50, 99, 32, 32, 48, 48, 48, /* 0x1a50 */ + 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1a60 */ + 32, 48, 48, 48, 48, 48, 49, 57, 56, 32, 32, 50, 42, 42, 48, 32, /* 0x1a70 */ + 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, /* 0x1a80 */ + 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, 78, /* 0x1a90 */ + 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, /* 0x1aa0 */ + 48, 48, 49, 52, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1ab0 */ + 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1ac0 */ + 50, 99, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, /* 0x1ad0 */ + 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, /* 0x1ae0 */ + 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 32, 32, 32, /* 0x1af0 */ + 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1b00 */ + 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1b10 */ + 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52, 48, 99, 32, 32, 50, /* 0x1b20 */ + 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, /* 0x1b30 */ + 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, 32, 76, 90, 77, 65, /* 0x1b40 */ + 95, 69, 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1b50 */ + 56, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1b60 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52, 48, 99, /* 0x1b70 */ + 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x1b80 */ + 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1b90 */ + 89, 10, 32, 32, 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, /* 0x1ba0 */ + 32, 32, 32, 32, 48, 48, 48, 48, 48, 57, 57, 99, 32, 32, 48, 48, /* 0x1bb0 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1bc0 */ + 32, 32, 48, 48, 48, 48, 48, 52, 57, 48, 32, 32, 50, 42, 42, 48, /* 0x1bd0 */ + 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, /* 0x1be0 */ + 79, 78, 76, 89, 10, 32, 49, 48, 32, 76, 90, 77, 65, 95, 68, 69, /* 0x1bf0 */ + 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 57, 57, 99, 32, /* 0x1c00 */ + 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1c10 */ + 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,101, 50, 99, 32, 32, 50, /* 0x1c20 */ + 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, /* 0x1c30 */ + 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 49, 32, 76, 90, 77, 65, /* 0x1c40 */ + 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1c50 */ + 49, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1c60 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 55, 99, 56, /* 0x1c70 */ + 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x1c80 */ + 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 50, 32, 85, /* 0x1c90 */ + 80, 88, 49, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, 48, 48, /* 0x1ca0 */ + 48, 48, 48, 50, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1cb0 */ + 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, /* 0x1cc0 */ + 55,100, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, /* 0x1cd0 */ + 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, /* 0x1ce0 */ + 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, /* 0x1cf0 */ + 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 73, 78, /* 0x1d00 */ + 85, 88, 48, 50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x1d10 */ + 73, 78, 85, 88, 48, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1d20 */ + 32,108, 32, 32, 32, 32,100, 32, 32, 76, 73, 78, 85, 88, 48, 51, /* 0x1d30 */ + 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 73, 78, 85, 88, /* 0x1d40 */ + 48, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x1d50 */ + 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 9, /* 0x1d60 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, /* 0x1d70 */ + 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x1d80 */ + 32, 32,100, 32, 32, 76, 73, 78, 85, 88, 48, 48, 48, 9, 48, 48, /* 0x1d90 */ + 48, 48, 48, 48, 48, 48, 32, 76, 73, 78, 85, 88, 48, 48, 48, 10, /* 0x1da0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x1db0 */ + 32, 76, 73, 78, 85, 88, 48, 49, 48, 9, 48, 48, 48, 48, 48, 48, /* 0x1dc0 */ + 48, 48, 32, 76, 73, 78, 85, 88, 48, 49, 48, 10, 48, 48, 48, 48, /* 0x1dd0 */ + 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, /* 0x1de0 */ + 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, /* 0x1df0 */ + 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x1e00 */ +100, 32, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x1e10 */ + 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1e20 */ + 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, /* 0x1e30 */ + 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, /* 0x1e40 */ + 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, /* 0x1e50 */ + 90, 77, 65, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, /* 0x1e60 */ + 65, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x1e70 */ +100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, 48, 48, /* 0x1e80 */ + 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, /* 0x1e90 */ + 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x1ea0 */ +100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, /* 0x1eb0 */ + 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, /* 0x1ec0 */ + 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x1ed0 */ +100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, 48, 48, /* 0x1ee0 */ + 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, /* 0x1ef0 */ + 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x1f00 */ +100, 32, 32, 85, 80, 88, 49, 72, 69, 65, 68, 9, 48, 48, 48, 48, /* 0x1f10 */ + 48, 48, 48, 48, 32, 85, 80, 88, 49, 72, 69, 65, 68, 10, 48, 48, /* 0x1f20 */ + 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, /* 0x1f30 */ + 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32,102,105, /* 0x1f40 */ +108,116,101,114, 95,108,101,110,103,116,104, 10, 48, 48, 48, 48, /* 0x1f50 */ + 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x1f60 */ + 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32,102,105,108,116, /* 0x1f70 */ +101,114, 95, 99,116,111, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1f80 */ + 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, /* 0x1f90 */ + 48, 48, 48, 48, 48, 48, 32,101,111,102, 95,110,114,118, 10, 10, /* 0x1fa0 */ + 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x1fb0 */ + 68, 83, 32, 70, 79, 82, 32, 91, 76, 73, 78, 85, 88, 48, 48, 48, /* 0x1fc0 */ + 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, /* 0x1fd0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, /* 0x1fe0 */ + 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82, 95, 80, /* 0x1ff0 */ + 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, 32, 32, 32, 76, /* 0x2000 */ + 73, 78, 85, 88, 48, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 52, /* 0x2010 */ + 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, /* 0x2020 */ + 32, 32, 32, 76, 73, 78, 85, 88, 48, 50, 48, 10, 10, 82, 69, 76, /* 0x2030 */ + 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, /* 0x2040 */ + 70, 79, 82, 32, 91, 76, 73, 78, 85, 88, 48, 49, 48, 93, 58, 10, /* 0x2050 */ + 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, /* 0x2060 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, /* 0x2070 */ + 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 82, 95, 80, 80, 67, 95, /* 0x2080 */ + 65, 68, 68, 82, 51, 50, 32, 32, 32, 32, 32, 32,102,105,108,116, /* 0x2090 */ +101,114, 95,108,101,110,103,116,104, 10, 48, 48, 48, 48, 48, 48, /* 0x20a0 */ + 48, 52, 32, 82, 95, 80, 80, 67, 95, 65, 68, 68, 82, 51, 50, 32, /* 0x20b0 */ + 32, 32, 32, 32, 32,102,105,108,116,101,114, 95, 99,116,111, 10, /* 0x20c0 */ + 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, /* 0x20d0 */ + 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, /* 0x20e0 */ + 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x20f0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x2100 */ + 69, 10, 48, 48, 48, 48, 48, 48, 57, 48, 32, 82, 95, 80, 80, 67, /* 0x2110 */ + 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32,101,111,102, /* 0x2120 */ + 95,110,114,118, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x2130 */ + 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, /* 0x2140 */ + 86, 50, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x2150 */ + 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2160 */ + 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 98, 52, 32, /* 0x2170 */ + 82, 95, 80, 80, 67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, /* 0x2180 */ + 32, 32,101,111,102, 95,110,114,118, 10, 10, 82, 69, 76, 79, 67, /* 0x2190 */ + 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, /* 0x21a0 */ + 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, 70, 83, 69, /* 0x21b0 */ + 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x21c0 */ + 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, /* 0x21d0 */ + 48, 48, 98, 52, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 49, 52, /* 0x21e0 */ + 32, 32, 32, 32, 32, 32, 32,101,111,102, 95,110,114,118, 10, 10, /* 0x21f0 */ + 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x2200 */ + 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, /* 0x2210 */ + 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, /* 0x2220 */ + 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2230 */ + 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, /* 0x2240 */ + 95, 80, 80, 67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, /* 0x2250 */ + 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 43, 48,120, 48, 48, /* 0x2260 */ + 48, 48, 48, 48, 49, 48, 10 /* 0x2270 */ +}; diff --git a/src/stub/src/arch/powerpc/32/bxx.S b/src/stub/src/arch/powerpc/32/bxx.S index be4aea1a..a2482edc 100644 --- a/src/stub/src/arch/powerpc/32/bxx.S +++ b/src/stub/src/arch/powerpc/32/bxx.S @@ -62,3 +62,8 @@ L20: bdnz+ L20 # if (0!=--ctr) goto L20; // likely ret +#undef ptr0 +#undef ftid +#undef cto8 +#undef len +#undef ptr diff --git a/src/stub/src/powerpc-linux.kernel.vmlinux-head.S b/src/stub/src/powerpc-linux.kernel.vmlinux-head.S new file mode 100644 index 00000000..86851770 --- /dev/null +++ b/src/stub/src/powerpc-linux.kernel.vmlinux-head.S @@ -0,0 +1,31 @@ +/* +; powerpc-linux.kernel.vmlinux-head.S -- set up stack for vmlinux/powerpc format +; +; This file is part of the UPX executable compressor. +; +; Copyright (C) 2007 John Reiser +; All Rights Reserved. +; +; UPX and the UCL library are free software; you can redistribute them +; and/or modify them under the terms of the GNU General Public License as +; published by the Free Software Foundation; either version 2 of +; the License, or (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; see the file COPYING. +; If not, write to the Free Software Foundation, Inc., +; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +; +; John Reiser +; +*/ + + mflr 31 + bl LINUX000 + +// vi:ts=8:et:nowrap diff --git a/src/stub/src/powerpc-linux.kernel.vmlinux.S b/src/stub/src/powerpc-linux.kernel.vmlinux.S new file mode 100644 index 00000000..bb34d27e --- /dev/null +++ b/src/stub/src/powerpc-linux.kernel.vmlinux.S @@ -0,0 +1,113 @@ +/* +; powerpc-linux.kernel.vmlinux.S -- loader & decompressor for the vmlinux/powerpc format +; +; This file is part of the UPX executable compressor. +; +; Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer +; Copyright (C) 1996-2007 Laszlo Molnar +; Copyright (C) 2004-2007 John Reiser +; All Rights Reserved. +; +; UPX and the UCL library are free software; you can redistribute them +; and/or modify them under the terms of the GNU General Public License as +; published by the Free Software Foundation; either version 2 of +; the License, or (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; see the file COPYING. +; If not, write to the Free Software Foundation, Inc., +; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +; +; Markus F.X.J. Oberhumer Laszlo Molnar +; +; +; John Reiser +; +*/ + +#include "arch/powerpc/32/macros.S" +#include "arch/powerpc/32/regs.h" + +// offsets in struct b_info +sz_unc = 0 +sz_cpr = 4 +b_method = 8 +b_ftid = 9 +b_cto8 = 10 +sz_b_info = 12 + +// ========== ENTRY POINT + +section LINUX000 // adjust parameters; call decompressor + b uncompress + b unfilter + +section LINUX010 // call unfilter + .long filter_length + .long filter_cto + +section LINUX020 // adjust return value + +// ========== UNFILTER + +unfilter: +//section ctok32.00 +#include "arch/powerpc/32/bxx.S" + +// ========== DECOMPRESSION + +section LINUX030 // decompressor +uncompress: + +SZ_DLINE=128 # size of data cache line in Apple G5 + +/* register assingments for NRV algorithms */ +#define hibit r0 /* holds 0x80000000 during decompress */ + +#define src a0 +#define lsrc a1 +#define dst a2 +#define ldst a3 /* Out: actually a reference: &len_dst */ +#define meth a4 + +#define off a4 +#define len a5 +#define bits a6 +#define disp a7 + + +section NRV2B +#include "arch/powerpc/32/nrv2b_d.S" + +section NRV2D +#include "arch/powerpc/32/nrv2d_d.S" + +section NRV2E +#include "arch/powerpc/32/nrv2e_d.S" + +#undef hibit + +#undef src +#undef lsrc +#undef dst +#undef ldst +#undef meth + +#undef off +#undef len +#undef bits +#undef disp + +section LZMA +#include "arch/powerpc/32/lzma_d.S" + +// ========== IDENT + +#include "include/header.S" + +// vi:ts=8:et:nowrap diff --git a/src/stub/tmp/powerpc-linux.kernel.vmlinux.bin.dump b/src/stub/tmp/powerpc-linux.kernel.vmlinux.bin.dump new file mode 100644 index 00000000..d23ed3e4 --- /dev/null +++ b/src/stub/tmp/powerpc-linux.kernel.vmlinux.bin.dump @@ -0,0 +1,60 @@ +tmp/powerpc-linux.kernel.vmlinux.bin: file format elf32-powerpc + +Sections: +Idx Name Size VMA LMA File off Algn Flags + 0 LINUX000 00000008 00000000 00000000 00000034 2**0 CONTENTS, RELOC, READONLY + 1 LINUX010 00000008 00000000 00000000 0000003c 2**0 CONTENTS, RELOC, READONLY + 2 LINUX020 00000064 00000000 00000000 00000044 2**0 CONTENTS, READONLY + 3 LINUX030 00000000 00000000 00000000 000000a8 2**0 CONTENTS, READONLY + 4 NRV2B 000000f0 00000000 00000000 000000a8 2**0 CONTENTS, RELOC, READONLY + 5 NRV2D 0000012c 00000000 00000000 00000198 2**0 CONTENTS, RELOC, READONLY + 6 NRV2E 00000148 00000000 00000000 000002c4 2**0 CONTENTS, RELOC, READONLY + 7 LZMA 00000000 00000000 00000000 0000040c 2**0 CONTENTS, READONLY + 8 LZMA_ELF00 00000084 00000000 00000000 0000040c 2**0 CONTENTS, RELOC, READONLY + 9 LZMA_DEC10 0000099c 00000000 00000000 00000490 2**0 CONTENTS, READONLY + 10 LZMA_DEC20 0000099c 00000000 00000000 00000e2c 2**0 CONTENTS, READONLY + 11 LZMA_DEC30 00000010 00000000 00000000 000017c8 2**0 CONTENTS, READONLY + 12 UPX1HEAD 00000020 00000000 00000000 000017d8 2**0 CONTENTS, READONLY +SYMBOL TABLE: +00000000 l d LINUX020 00000000 LINUX020 +00000000 l d LINUX030 00000000 LINUX030 +00000000 l d LZMA_DEC30 00000000 LZMA_DEC30 +00000000 l d LINUX000 00000000 LINUX000 +00000000 l d LINUX010 00000000 LINUX010 +00000000 l d NRV2B 00000000 NRV2B +00000000 l d NRV2D 00000000 NRV2D +00000000 l d NRV2E 00000000 NRV2E +00000000 l d LZMA 00000000 LZMA +00000000 l d LZMA_ELF00 00000000 LZMA_ELF00 +00000000 l d LZMA_DEC10 00000000 LZMA_DEC10 +00000000 l d LZMA_DEC20 00000000 LZMA_DEC20 +00000000 l d UPX1HEAD 00000000 UPX1HEAD +00000000 *UND* 00000000 filter_length +00000000 *UND* 00000000 filter_cto +00000000 *UND* 00000000 eof_nrv + +RELOCATION RECORDS FOR [LINUX000]: +OFFSET TYPE VALUE +00000000 R_PPC_REL24 LINUX030 +00000004 R_PPC_REL24 LINUX020 + +RELOCATION RECORDS FOR [LINUX010]: +OFFSET TYPE VALUE +00000000 R_PPC_ADDR32 filter_length +00000004 R_PPC_ADDR32 filter_cto + +RELOCATION RECORDS FOR [NRV2B]: +OFFSET TYPE VALUE +00000090 R_PPC_REL14 eof_nrv + +RELOCATION RECORDS FOR [NRV2D]: +OFFSET TYPE VALUE +000000b4 R_PPC_REL14 eof_nrv + +RELOCATION RECORDS FOR [NRV2E]: +OFFSET TYPE VALUE +000000b4 R_PPC_REL14 eof_nrv + +RELOCATION RECORDS FOR [LZMA_ELF00]: +OFFSET TYPE VALUE +00000004 R_PPC_REL14 LZMA_DEC30+0x00000010