This commit is contained in:
László Molnár 2006-07-17 12:13:08 +02:00
commit d076a6724f
65 changed files with 34330 additions and 16010 deletions

View File

@ -9,3 +9,5 @@ b0353253b0b3d062eb5adb50d4b665a96620da45 RELEASE_195
c2e0cd4d621b047f254f2def42132a03683ff52c RELEASE_192
eb1ce56dce7dd1835964362470610925963b9043 RELEASE_110
ed96891ef795bceec6b7ff3ca1ca7764431bfb39 RELEASE_191
8afead5e7182950592970330c218913fecfbe390 jfr-2006-07-12
72fe9925b247073cd8342d8bff07adc47b72173f main-2006-07-12

View File

@ -71,6 +71,7 @@ struct DefaultLinker::Section
int istart;
int ostart;
int len;
unsigned char align;
DefaultLinker::Label name;
};
@ -196,13 +197,14 @@ int DefaultLinker::addSection(const char *sname)
}
void DefaultLinker::addSection(const char *sname, const void *sdata, int slen)
void DefaultLinker::addSection(const char *sname, const void *sdata, int slen, int align)
{
assert(!frozen);
// add a new section - can be used for adding stuff like ident or header
sections[nsections].name.set(sname);
sections[nsections].istart = ilen;
sections[nsections].len = slen;
sections[nsections].align = align;
sections[nsections++].ostart = olen;
assert(nsections < NSECTIONS);
memcpy(iloader+ilen, sdata, slen);
@ -314,10 +316,10 @@ int SimpleLinker::addSection(const char *sname)
}
void SimpleLinker::addSection(const char *sname, const void *sdata, int slen)
void SimpleLinker::addSection(const char *sname, const void *sdata, int slen, int align)
{
assert(!frozen);
UNUSED(sname); UNUSED(sdata); UNUSED(slen);
UNUSED(sname); UNUSED(sdata); UNUSED(slen); UNUSED(align);
assert(0);
}
@ -350,8 +352,8 @@ unsigned char *SimpleLinker::getLoader(int *llen)
//
**************************************************************************/
ElfLinker::Section::Section(const char *n, const void *i, unsigned s) :
name(strdup(n)), output(NULL), size(s), offset(0), next(NULL)
ElfLinker::Section::Section(const char *n, const void *i, unsigned s, unsigned a) :
name(strdup(n)), output(NULL), size(s), offset(0), align(a), next(NULL)
{
assert(name);
input = malloc(s + 1);
@ -388,24 +390,24 @@ void ElfLinker::preprocessSections(char *start, const char *end)
while (start < end)
{
char name[1024];
unsigned offset, size;
unsigned offset, size, align;
char *nextl = strchr(start, '\n');
assert(nextl != NULL);
if (sscanf(start, "%*d %1023s %x %*d %*d %x",
name, &size, &offset) == 3)
if (sscanf(start, "%*d %1023s %x %*d %*d %x 2**%d",
name, &size, &offset, &align) == 4)
{
char *n = strstr(start, name);
n[strlen(name)] = 0;
addSection(n, input + offset, size);
addSection(n, input + offset, size, align);
//printf("section %s preprocessed\n", n);
}
start = nextl + 1;
}
addSection("*ABS*", NULL, 0);
addSection("*UND*", NULL, 0);
addSection("*ABS*", NULL, 0, 0);
addSection("*UND*", NULL, 0, 0);
}
void ElfLinker::preprocessSymbols(char *start, const char *end)
@ -464,8 +466,17 @@ void ElfLinker::preprocessRelocations(char *start, const char *end)
unsigned add = 0;
if (char *p = strstr(symbol, "+0x"))
{
*p = 0;
sscanf(p + 3, "%x", &add);
// Beware: sscanf("0xfffffffffffffffc", "%x", &add) ==> -1 == add
// because conversion stops after 32 bits for a non-long.
// Also, glibc-2.3.5 has a bug: even using "%lx" still gives -1 instead of -4.
long addend;
*p = 0; // terminate the symbol name
p+=3;
if ('f'==p[0] && 0==strncmp(p, "ffffffff", 8)) {
p+=8; // workaround a bug in glibc-2.3.5
}
sscanf(p, "%lx", &addend);
add = (unsigned)addend;
}
addRelocation(section->name, offset, t, symbol, add);
@ -605,6 +616,15 @@ int ElfLinker::addSection(const char *sname)
else
{
Section *section = findSection(sect);
if (section->align) {
unsigned const v = ~0u << section->align;
assert(tail);
if (unsigned const l = ~v & -(tail->offset + tail->size)) {
align(l);
tail->size += l;
outputlen += l;
}
}
memcpy(output + outputlen, section->input, section->size);
section->output = output + outputlen;
outputlen += section->size;
@ -625,13 +645,13 @@ int ElfLinker::addSection(const char *sname)
return outputlen;
}
void ElfLinker::addSection(const char *sname, const void *sdata, int slen)
void ElfLinker::addSection(const char *sname, const void *sdata, int slen, int align)
{
assert(!frozen);
sections = static_cast<Section **>(realloc(sections, (nsections + 1)
* sizeof(Section *)));
assert(sections);
sections[nsections++] = new Section(sname, sdata, slen);
sections[nsections++] = new Section(sname, sdata, slen, align);
}
void ElfLinker::freeze()
@ -814,12 +834,25 @@ void ElfLinkerPpc32::relocate1(Relocation *rel, upx_byte *location,
// FIXME: more relocs
if (strcmp(type, "8") == 0)
*location += value;
else if (strcmp(type, "16") == 0)
set_le16(location, get_le16(location) + value);
else if (strcmp(type, "32") == 0)
set_le32(location, get_le32(location) + value);
// Note that original (*location).displ is ignored.
if (strcmp(type, "24") == 0) {
if (3& value) {
printf("unaligned word diplacement");
abort();
}
// FIXME: displacment overflow?
set_be32(location, (0xfc000003 & get_be32(location)) +
(0x03fffffc & value));
}
else if (strcmp(type, "14") == 0) {
if (3& value) {
printf("unaligned word diplacement");
abort();
}
// FIXME: displacment overflow?
set_be32(location, (0xffff0003 & get_be32(location)) +
(0x0000fffc & value));
}
else
super::relocate1(rel, location, value, type);
}

View File

@ -49,7 +49,7 @@ public:
virtual void init(const void *pdata, int plen, int pinfo) = 0;
virtual void setLoaderAlignOffset(int phase) = 0;
virtual int addSection(const char *sname) = 0;
virtual void addSection(const char *sname, const void *sdata, int slen) = 0;
virtual void addSection(const char *sname, const void *sdata, int slen, int align) = 0;
virtual void freeze() = 0;
virtual int getSection(const char *sname, int *slen=NULL) = 0;
virtual unsigned char *getLoader(int *llen=NULL) = 0;
@ -83,7 +83,7 @@ public:
virtual void init(const void *pdata, int plen, int pinfo);
virtual void setLoaderAlignOffset(int phase);
virtual int addSection(const char *sname);
virtual void addSection(const char *sname, const void *sdata, int slen);
virtual void addSection(const char *sname, const void *sdata, int slen, int align);
virtual void freeze();
virtual int getSection(const char *sname, int *slen=NULL);
virtual unsigned char *getLoader(int *llen=NULL);
@ -130,7 +130,7 @@ public:
virtual void init(const void *pdata, int plen, int pinfo);
virtual void setLoaderAlignOffset(int phase);
virtual int addSection(const char *sname);
virtual void addSection(const char *sname, const void *sdata, int slen);
virtual void addSection(const char *sname, const void *sdata, int slen, int align);
virtual void freeze();
virtual int getSection(const char *sname, int *slen=NULL);
virtual unsigned char *getLoader(int *llen=NULL);
@ -199,7 +199,7 @@ protected:
virtual void init(const void *pdata, int plen, int);
virtual void setLoaderAlignOffset(int phase);
virtual int addSection(const char *sname);
virtual void addSection(const char *sname, const void *sdata, int slen);
virtual void addSection(const char *sname, const void *sdata, int slen, int align);
virtual void freeze();
virtual int getSection(const char *sname, int *slen=NULL);
virtual upx_byte *getLoader(int *llen=NULL);
@ -225,9 +225,10 @@ struct ElfLinker::Section : private nocopy
upx_byte *output;
unsigned size;
unsigned offset;
unsigned char align; // log2
Section *next;
Section(const char *n, const void *i, unsigned s);
Section(const char *n, const void *i, unsigned s, unsigned a=0);
~Section();
};

View File

@ -160,16 +160,44 @@ Linker *PackLinuxElf::newLinker() const
return new ElfLinker;
}
void
PackLinuxElf::addStubEntrySections(
upx_byte const *const proto,
unsigned const szproto
)
void PackLinuxElf::pack3(OutputFile *fo, Filter &ft)
{
unsigned disp;
unsigned const zero = 0;
unsigned len = fo->getBytesWritten();
fo->write(&zero, 3& -len); // ALIGN_UP
len += (3& -len);
set_native32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info))
fo->write(&disp, sizeof(disp));
sz_pack2 = 4+ len;
super::pack3(fo, ft);
}
void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
{
super::pack3(fo, ft);
set_native32(&elfout.phdr[0].p_filesz, sz_pack2);
}
void PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
{
super::pack3(fo, ft);
set_native64(&elfout.phdr[0].p_filesz, sz_pack2);
}
void
PackLinuxElf::addStubEntrySections(Filter const *)
{
linker->addSection("ELFMAINX", proto, szproto);
addLoader("ELFMAINX", NULL);
}
void
PackLinuxElf::addLinkerSymbols(Filter const *)
{
// empty
}
PackLinuxElf32::PackLinuxElf32(InputFile *f)
: super(f), phdri(NULL),
dynseg(NULL), hashtab(NULL), dynsym(NULL)
@ -196,6 +224,19 @@ Linker* PackLinuxElf64amd::newLinker() const
return new ElfLinkerAMD64;
}
void PackLinuxElf64amd::addStubEntrySections(Filter const *)
{
addLoader("ELFMAINX", NULL);
//addLoader(getDecompressorSections(), NULL);
addLoader(
( M_IS_NRV2E(ph.method) ? "NRV_COMMON,NRV2E"
: M_IS_NRV2D(ph.method) ? "NRV_COMMON,NRV2D"
: M_IS_NRV2B(ph.method) ? "NRV_COMMON,NRV2B"
: M_IS_LZMA(ph.method) ? "LZMA_ELF00,LZMA_DEC20,LZMA_DEC30"
: NULL), NULL);
addLoader("ELFMAINY,IDENTSTR,ELFMAINZ,FOLDEXEC", NULL);
}
int const *
PackLinuxElf::getCompressionMethods(int method, int level) const
{
@ -207,12 +248,18 @@ int const *
PackLinuxElf32ppc::getCompressionMethods(int method, int level) const
{
// No real dependency on LE32.
static const int m_nrv2e[] = { M_NRV2E_LE32, -1 };
static const int m_nrv2b[] = { M_NRV2B_LE32, -1 };
static const int m_nrv2b[] = { M_NRV2B_LE32, M_NRV2E_LE32, M_LZMA, -1 };
static const int m_nrv2e[] = { M_NRV2E_LE32, M_NRV2B_LE32, M_LZMA, -1 };
static const int m_lzma[] = { M_LZMA,-1 };
/*return Packer::getDefaultCompressionMethods_le32(method, level);*/
// 2005-04-23 FIXME: stub/l_lx_elfppc32.S hardwires ppc_d_nrv2e.S
UNUSED(method); UNUSED(level); UNUSED(m_nrv2b);
if (M_IS_NRV2B(method))
return m_nrv2b;
if (M_IS_NRV2E(method))
return m_nrv2e;
if (M_IS_LZMA(method))
return m_lzma;
if (1==level)
return m_nrv2b;
return m_nrv2e;
}
@ -295,7 +342,7 @@ PackLinuxElf32ppc::PackLinuxElf32ppc(InputFile *f)
e_machine = Elf32_Ehdr::EM_PPC;
ei_class = Elf32_Ehdr::ELFCLASS32;
ei_data = Elf32_Ehdr::ELFDATA2MSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_NONE;
ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
}
PackLinuxElf32ppc::~PackLinuxElf32ppc()
@ -313,7 +360,7 @@ PackLinuxElf64amd::PackLinuxElf64amd(InputFile *f)
e_machine = Elf64_Ehdr::EM_X86_64;
ei_class = Elf64_Ehdr::ELFCLASS64;
ei_data = Elf64_Ehdr::ELFDATA2LSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_NONE;
ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
}
PackLinuxElf64amd::~PackLinuxElf64amd()
@ -329,65 +376,8 @@ umax(unsigned a, unsigned b)
return a;
}
int
PackLinuxElf32x86::buildLinuxLoader(
upx_byte const *const proto,
unsigned const szproto,
upx_byte const *const fold,
unsigned const szfold,
Filter const *ft
)
void PackLinuxElf32x86::addStubEntrySections(Filter const *ft)
{
initLoader(proto, szproto);
struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0;
if (0 < szfold) {
cprElfHdr1 const *const hf = (cprElfHdr1 const *)fold;
fold_hdrlen = sizeof(hf->ehdr) +
get_native16(&hf->ehdr.e_phentsize) * get_native16(&hf->ehdr.e_phnum) +
sizeof(l_info);
if (0 == get_le32(fold_hdrlen + fold)) {
// inconsistent SIZEOF_HEADERS in *.lds (ld, binutils)
fold_hdrlen = umax(0x80, fold_hdrlen);
}
h.sz_unc = (szfold < fold_hdrlen) ? 0 : (szfold - fold_hdrlen);
h.b_method = (unsigned char) ph.method; // FIXME: endian trouble
h.b_ftid = (unsigned char) ph.filter;
h.b_cto8 = (unsigned char) ph.filter_cto;
}
unsigned char const *const uncLoader = fold_hdrlen + fold;
h.sz_cpr = MemBuffer::getSizeForCompression(h.sz_unc);
unsigned char *const cprLoader = new unsigned char[sizeof(h) + h.sz_cpr];
if (0 < szfold) {
int r = upx_compress(uncLoader, h.sz_unc, sizeof(h) + cprLoader, &h.sz_cpr,
NULL, ph.method, 10, NULL, NULL );
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
throwInternalError("loader compression failed");
#if 0 //{ debugging only
if (M_LZMA==ph.method) {
ucl_uint tmp_len = h.sz_unc; // LZMA uses this as EOF
unsigned char *tmp = new unsigned char[tmp_len];
memset(tmp, 0, tmp_len);
r = upx_decompress(sizeof(h) + cprLoader, h.sz_cpr, tmp, &tmp_len, h.b_method, NULL);
printf("\n%d %d: %d %d %d\n", h.b_method, r, h.sz_cpr, h.sz_unc, tmp_len);
for (unsigned j=0; j < h.sz_unc; ++j) if (tmp[j]!=uncLoader[j]) {
printf("%d: %x %x\n", j, tmp[j], uncLoader[j]);
}
delete[] tmp;
}
#endif //}
}
unsigned const sz_cpr = h.sz_cpr;
set_native32(&h.sz_cpr, h.sz_cpr);
set_native32(&h.sz_unc, h.sz_unc);
memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
// FIXME: memory leak delete [] cprLoader;
int const n_mru = ft->n_mru; // FIXME: belongs to filter? packerf?
// Here is a quick summary of the format of the output file:
@ -406,6 +396,7 @@ PackLinuxElf32x86::buildLinuxLoader(
sizeof(p_info) +
// compressed data
b_len + ph.c_len );
// entry to stub
addLoader("LEXEC000", NULL);
@ -462,20 +453,16 @@ PackLinuxElf32x86::buildLinuxLoader(
addLoader("IDENTSTR", NULL);
addLoader("LEXEC020", NULL);
addLoader("FOLDEXEC", NULL);
}
freezeLoader();
void PackLinuxElf32x86::addLinkerSymbols(Filter const *ft)
{
upx_byte *ptr_cto = getLoader();
int sz_cto = getLoaderSize();
if (0x20==(ft->id & 0xF0) || 0x30==(ft->id & 0xF0)) { // push byte '?' ; cto8
patch_le16(ptr_cto, sz_cto, "\x6a?", 0x6a + (ft->cto << 8));
checkPatch(NULL, 0, 0, 0); // reset
}
// PackHeader and overlay_offset at the end of the output file,
// after the compressed data.
unsigned const lsize = getLoaderSize();
linker->relocate();
return lsize;
}
int
@ -484,16 +471,10 @@ PackLinuxElf32::buildLinuxLoader(
unsigned const szproto,
upx_byte const *const fold,
unsigned const szfold,
Filter const */*ft*/
Filter const *ft
)
{
{
int const MAX_LOADER_LEN = 8000;
int *const eof_empty = new int[MAX_LOADER_LEN/sizeof(int)];
eof_empty[0] = -1;
initLoader(eof_empty, MAX_LOADER_LEN, 0, 0);
delete[] eof_empty;
}
initLoader(proto, szproto);
struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0;
@ -516,6 +497,19 @@ PackLinuxElf32::buildLinuxLoader(
NULL, ph.method, 10, NULL, NULL );
if (r != UPX_E_OK || h.sz_cpr >= h.sz_unc)
throwInternalError("loader compression failed");
#if 0 //{ debugging only
if (M_LZMA==ph.method) {
ucl_uint tmp_len = h.sz_unc; // LZMA uses this as EOF
unsigned char *tmp = new unsigned char[tmp_len];
memset(tmp, 0, tmp_len);
r = upx_decompress(sizeof(h) + cprLoader, h.sz_cpr, tmp, &tmp_len, h.b_method, NULL);
printf("\n%d %d: %d %d %d\n", h.b_method, r, h.sz_cpr, h.sz_unc, tmp_len);
for (unsigned j=0; j < h.sz_unc; ++j) if (tmp[j]!=uncLoader[j]) {
printf("%d: %x %x\n", j, tmp[j], uncLoader[j]);
}
delete[] tmp;
}
#endif //}
}
unsigned const sz_cpr = h.sz_cpr;
set_native32(&h.sz_cpr, h.sz_cpr);
@ -523,16 +517,13 @@ PackLinuxElf32::buildLinuxLoader(
memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr, 0);
delete [] cprLoader;
//int const GAP = 128; // must match stub/l_mac_ppc.S
//segcmdo.vmsize += sz_unc - sz_cpr + GAP + 64;
addStubEntrySections(ft);
addStubEntrySections(proto, szproto);
addLoader("FOLDEXEC", NULL);
freezeLoader();
addLinkerSymbols(ft);
linker->relocate();
return getLoaderSize();
}
@ -543,16 +534,10 @@ PackLinuxElf64::buildLinuxLoader(
unsigned const szproto,
upx_byte const *const fold,
unsigned const szfold,
Filter const */*ft*/
Filter const *ft
)
{
{
int const MAX_LOADER_LEN = 8000;
int *const eof_empty = new int[MAX_LOADER_LEN/sizeof(int)];
eof_empty[0] = -1;
initLoader(eof_empty, MAX_LOADER_LEN, 0, 0);
delete[] eof_empty;
}
initLoader(proto, szproto);
struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0;
@ -582,17 +567,78 @@ PackLinuxElf64::buildLinuxLoader(
memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr, 0);
delete [] cprLoader;
addStubEntrySections(proto, szproto);
addStubEntrySections(ft);
addLoader("FOLDEXEC", NULL);
freezeLoader();
addLinkerSymbols(ft);
linker->relocate();
return getLoaderSize();
}
void
PackLinuxElf64amd::addLinkerSymbols(Filter const *)
{
unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info);
unsigned len = sz_pack2;
#define PAGE_MASK (~0u<<12)
#define PAGE_SIZE (-PAGE_MASK)
lsize = /*getLoaderSize()*/ 64 * 1024; // upper bound; avoid circularity
acc_uint64l_t const lo_va_user = 0x400000; // XXX
acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr;
acc_uint64l_t adrc;
acc_uint64l_t adrm;
acc_uint64l_t adru;
acc_uint64l_t adrx;
unsigned cntc;
unsigned lenm;
unsigned lenu;
len += (7&-lsize) + lsize;
bool const is_big = (lo_va_user < (lo_va_stub + len + 2*PAGE_SIZE));
if (is_big) {
set_native64( &elfout.ehdr.e_entry,
get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
set_native64(&elfout.phdr[0].p_vaddr, lo_va_user);
set_native64(&elfout.phdr[0].p_paddr, lo_va_user);
lo_va_stub = lo_va_user;
adrc = lo_va_stub;
adrm = getbrk(phdri, get_native16(&ehdri.e_phnum));
adru = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrx = adru + hlen;
lenm = PAGE_SIZE + len;
lenu = PAGE_SIZE + len;
cntc = len >> 3;
}
else {
adrm = lo_va_stub + len;
adrc = adrm;
adru = lo_va_stub;
adrx = lo_va_stub + hlen;
lenm = PAGE_SIZE;
lenu = PAGE_SIZE + len;
cntc = 0;
}
adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary
//avoid circularity linker->defineSymbol("LENX", sz_pack2 - hlen);
linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion
linker->defineSymbol("CNTC", cntc); // count for copy
linker->defineSymbol("LENU", lenu); // len for unmap
linker->defineSymbol("ADRC", adrc); // addr for copy
linker->defineSymbol("ADRU", adru); // addr for unmap
linker->defineSymbol("JMPU", 12 + lo_va_user); // trampoline for unmap
linker->defineSymbol("LENM", lenm); // len for map
linker->defineSymbol("ADRM", adrm); // addr for map
#undef PAGE_SIZE
#undef PAGE_MASK
}
static const
#include "stub/i386-linux.elf-entry.h"
static const
@ -771,6 +817,26 @@ PackLinuxElf32ppc::buildLoader(const Filter *ft)
linux_elfppc32_fold, sizeof(linux_elfppc32_fold), ft );
}
void
PackLinuxElf32ppc::addStubEntrySections(Filter const *)
{
addLoader("ELFMAINX", NULL);
//addLoader(getDecompressorSections(), NULL);
addLoader(
( M_IS_NRV2E(ph.method) ? "NRV_COMMON,NRV2E"
: M_IS_NRV2D(ph.method) ? "NRV_COMMON,NRV2D"
: M_IS_NRV2B(ph.method) ? "NRV_COMMON,NRV2B"
: M_IS_LZMA(ph.method) ? "LZMA_ELF00,LZMA_DEC20,LZMA_DEC30"
: NULL), NULL);
addLoader("ELFMAINY,IDENTSTR,ELFMAINZ,FOLDEXEC", NULL);
}
void
PackLinuxElf32ppc::addLinkerSymbols(Filter const *)
{
// empty
}
static const
#include "stub/amd64-linux.elf-entry.h"
static const
@ -1344,7 +1410,6 @@ void PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
if ((off_t)total_in != file_size)
throwEOFException();
set_native32(&elfout.phdr[0].p_filesz, fo->getBytesWritten());
}
// Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD
@ -1446,89 +1511,6 @@ void PackLinuxElf64::pack2(OutputFile *fo, Filter &ft)
if ((off_t)total_in != file_size)
throwEOFException();
set_native64(&elfout.phdr[0].p_filesz, fo->getBytesWritten());
}
void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
{
unsigned disp;
unsigned const zero = 0;
unsigned len = fo->getBytesWritten();
fo->write(&zero, 3& -len); // align to 0 mod 4
len += (3& -len);
set_native32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info))
fo->write(&disp, sizeof(disp));
super::pack3(fo, ft);
}
void PackLinuxElf64amd::pack3(OutputFile *fo, Filter &ft)
{
char zero[8];
unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info);
unsigned const len0 = fo->getBytesWritten();
unsigned len = len0;
unsigned const frag = 7 & -len; // align to 0 mod 8
memset(zero, 0, sizeof(zero));
fo->write(&zero, frag);
len += frag;
#define PAGE_MASK (~0u<<12)
#define PAGE_SIZE (-PAGE_MASK)
upx_byte *const p = getLoader();
lsize = getLoaderSize();
acc_uint64l_t const lo_va_user = 0x400000; // XXX
acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr;
acc_uint64l_t adrc;
acc_uint64l_t adrm;
acc_uint64l_t adru;
acc_uint64l_t adrx;
unsigned cntc;
unsigned lenm;
unsigned lenu;
len += (7&-lsize) + lsize;
bool const is_big = (lo_va_user < (lo_va_stub + len + 2*PAGE_SIZE));
if (is_big) {
set_native64( &elfout.ehdr.e_entry,
get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub);
set_native64(&elfout.phdr[0].p_vaddr, lo_va_user);
set_native64(&elfout.phdr[0].p_paddr, lo_va_user);
lo_va_stub = lo_va_user;
adrc = lo_va_stub;
adrm = getbrk(phdri, get_native16(&ehdri.e_phnum));
adru = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrx = adru + hlen;
lenm = PAGE_SIZE + len;
lenu = PAGE_SIZE + len;
cntc = len >> 3;
}
else {
adrm = lo_va_stub + len;
adrc = adrm;
adru = lo_va_stub;
adrx = lo_va_stub + hlen;
lenm = PAGE_SIZE;
lenu = PAGE_SIZE + len;
cntc = 0;
}
adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary
// patch in order of descending address
patch_le32(p,lsize,"LENX", len0 - hlen);
patch_le32(p,lsize,"ADRX", adrx); // compressed input for eXpansion
patch_le32(p,lsize,"CNTC", cntc); // count for copy
patch_le32(p,lsize,"LENU", lenu); // len for unmap
patch_le32(p,lsize,"ADRC", adrc); // addr for copy
patch_le32(p,lsize,"ADRU", adru); // addr for unmap
patch_le32(p,lsize,"JMPU", 12 + lo_va_user); // trampoline for unmap
patch_le32(p,lsize,"LENM", lenm); // len for map
patch_le32(p,lsize,"ADRM", adrm); // addr for map
#undef PAGE_SIZE
#undef PAGE_MASK
super::pack3(fo, ft);
}
#include "bele.h"
@ -1703,11 +1685,6 @@ void PackLinuxElf32armBe::pack3(OutputFile *fo, Filter &ft)
ARM_pack3(fo, ft, true);
}
void PackLinuxElf::pack4(OutputFile *fo, Filter &ft)
{
super::pack4(fo, ft);
}
void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft)
{
overlay_offset = sz_elf_hdrs + sizeof(linfo);

View File

@ -51,8 +51,8 @@ protected:
virtual void pack1(OutputFile *, Filter &) = 0; // generate executable header
virtual void pack2(OutputFile *, Filter &) = 0; // append compressed data
//virtual void pack3(OutputFile *, Filter &) = 0; // append loader
virtual void pack4(OutputFile *, Filter &) = 0; // append pack header
virtual void pack3(OutputFile *, Filter &) = 0; // append loader
//virtual void pack4(OutputFile *, Filter &) = 0; // append pack header
virtual Linker* newLinker() const;
virtual void generateElfHdr(
@ -60,7 +60,8 @@ protected:
void const *proto,
unsigned const brka
) = 0;
virtual void addStubEntrySections(upx_byte const *, unsigned);
virtual void addLinkerSymbols(Filter const *);
virtual void addStubEntrySections(Filter const *);
virtual void unpack(OutputFile *fo) = 0;
protected:
@ -69,6 +70,7 @@ protected:
unsigned sz_phdrs; // sizeof Phdr[]
unsigned sz_elf_hdrs; // all Elf headers
unsigned sz_pack2; // after pack2(), before loader
unsigned short e_machine;
unsigned char ei_class;
@ -176,7 +178,7 @@ protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack2(OutputFile *, Filter &); // append compressed data
//virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append pack header
virtual void unpack(OutputFile *fo);
@ -284,10 +286,12 @@ public:
virtual bool canPack();
protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual void pack3(OutputFile *, Filter &); // append loader
//virtual void pack3(OutputFile *, Filter &); // append loader
virtual const int *getCompressionMethods(int method, int level) const;
virtual int buildLoader(const Filter *);
virtual void addStubEntrySections(Filter const *);
virtual Linker* newLinker() const;
virtual void addLinkerSymbols(Filter const *);
};
/*************************************************************************
@ -307,7 +311,9 @@ protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual const int *getCompressionMethods(int method, int level) const;
virtual int buildLoader(const Filter *);
virtual void addStubEntrySections(Filter const *);
virtual Linker* newLinker() const;
virtual void addLinkerSymbols(Filter const *);
};
/*************************************************************************
@ -330,14 +336,9 @@ protected:
virtual void pack1(OutputFile *, Filter &); // generate executable header
virtual int buildLoader(const Filter *);
virtual void addStubEntrySections(Filter const *);
virtual Linker* newLinker() const;
virtual int buildLinuxLoader(
upx_byte const *const proto, // assembly-only sections
unsigned const szproto,
upx_byte const *const fold, // linked assembly + C section
unsigned const szfold,
Filter const *ft
);
virtual void addLinkerSymbols(Filter const *);
};
class PackBSDElf32x86 : public PackLinuxElf32x86
@ -378,8 +379,8 @@ public:
PackOpenBSDElf32x86(InputFile *f);
virtual ~PackOpenBSDElf32x86();
virtual int buildLoader(const Filter *ft);
protected:
virtual int buildLoader(const Filter *ft);
virtual void generateElfHdr(
OutputFile *,
void const *proto,

View File

@ -280,7 +280,7 @@ PackLinuxI386::buildLinuxLoader(
}
// This adds the definition to the "library", to be used later.
// NOTE: the stub is NOT compressed! The savings is not worth it.
linker->addSection("FOLDEXEC", fold + fold_hdrlen, szfold - fold_hdrlen);
linker->addSection("FOLDEXEC", fold + fold_hdrlen, szfold - fold_hdrlen, 0);
n_mru = ft->n_mru;

View File

@ -148,7 +148,7 @@ void PackLinuxElf32x86interp::pack3(OutputFile *fo, Filter &/*ft*/)
elfout.phdr[0].p_paddr = elfout.phdr[0].p_vaddr = base - sz;
if (opt->o_unix.make_ptinterp) {
initLoader(linux_i386pti_loader, sizeof(linux_i386pti_loader));
linker->addSection("FOLDEXEC", linux_i386pti_fold, sizeof(linux_i386pti_fold));
linker->addSection("FOLDEXEC", linux_i386pti_fold, sizeof(linux_i386pti_fold), 0);
addLoader("LXPTI000", NULL);

View File

@ -98,13 +98,13 @@ PackMachPPC32::buildMachLoader(
memcpy(cprLoader, &h, sizeof(h));
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + h.sz_cpr);
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + h.sz_cpr, 0);
delete [] cprLoader;
int const GAP = 128; // must match stub/l_mac_ppc.S
segcmdo.vmsize += h.sz_unc - h.sz_cpr + GAP + 64;
linker->addSection("MACOS000", proto, szproto);
linker->addSection("MACOS000", proto, szproto, 0);
addLoader("MACOS000", NULL);
addLoader("FOLDEXEC", NULL);

View File

@ -1069,7 +1069,7 @@ void Packer::initLoader(const void *pdata, int plen, int pinfo, int small)
unsigned size;
char const * const ident = getIdentstr(&size, small);
linker->addSection("IDENTSTR", ident, size);
linker->addSection("IDENTSTR", ident, size, 0);
}

View File

@ -349,10 +349,10 @@ i386-bsd.elf-fold.h : tmp/$$T.o tmp/i386-bsd.elf-main.o $(srcdir)/src/$$T.lds
$(call tc,bin2h) --ident=bsd_i386elf_fold tmp/$T.bin $@
tmp/i386-bsd.elf-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@
tmp/i386-bsd.elf-main.o : $(srcdir)/src/$$T.c
tmp/i386-bsd.elf-main.o : $(srcdir)/src/$$T.c
$(call tc,gcc) -c $< -o $@
$(call tc,objstrip) $@
@ -384,7 +384,7 @@ i386-openbsd.elf-fold.h : tmp/$$T.o tmp/i386-openbsd.elf-main.o $(srcdir)/src/i3
$(call tc,bin2h) --ident=openbsd_i386elf_fold tmp/$T.bin $@
tmp/i386-openbsd.elf-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@
tmp/i386-openbsd.elf-main.o : $(srcdir)/src/$$T.c
@ -478,7 +478,7 @@ i386-linux.elf-fold.h : tmp/$$T.o tmp/i386-linux.elf-main.o $(srcdir)/src/$$T.ld
$(call tc,bin2h) --ident=linux_i386elf_fold tmp/$T.bin $@
tmp/i386-linux.elf-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@
tmp/i386-linux.elf-main.o : $(srcdir)/src/$$T.c
@ -493,9 +493,11 @@ tmp/i386-linux.elf-main.o : $(srcdir)/src/$$T.c
# note: tc_list settings are inherited from i386-linux.elf
i386-linux.elf.execve-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) --MMD=$@ $< -o tmp/$T.tmp1
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386exec_loader tmp/$T.bin $@
i386-linux.elf.execve-fold.h : tmp/$$T.o tmp/i386-linux.elf.execve-main.o tmp/i386-linux.elf.execve-upx_itoa.o $(srcdir)/src/$$T.lds
@ -506,7 +508,7 @@ i386-linux.elf.execve-fold.h : tmp/$$T.o tmp/i386-linux.elf.execve-main.o tmp/i3
$(call tc,bin2h) --ident=linux_i386exec_fold tmp/$T.bin $@
tmp/i386-linux.elf.execve-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@
tmp/i386-linux.elf.execve-main.o : $(srcdir)/src/$$T.c
@ -525,9 +527,11 @@ tmp/i386-linux.elf.execve-upx_itoa.o: $(srcdir)/src/$$T.asm
# note: tc_list settings are inherited from i386-linux.elf
i386-linux.elf.interp-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) --MMD=$@ $< -o tmp/$T.tmp1
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386pti_loader tmp/$T.bin $@
i386-linux.elf.interp-fold.h : tmp/$$T.o tmp/i386-linux.elf.interp-main.o $(srcdir)/src/$$T.lds
@ -538,7 +542,7 @@ i386-linux.elf.interp-fold.h : tmp/$$T.o tmp/i386-linux.elf.interp-main.o $(srcd
$(call tc,bin2h) --ident=linux_i386pti_fold tmp/$T.bin $@
tmp/i386-linux.elf.interp-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@
tmp/i386-linux.elf.interp-main.o : $(srcdir)/src/$$T.c
@ -553,9 +557,11 @@ tmp/i386-linux.elf.interp-main.o : $(srcdir)/src/$$T.c
# note: tc_list settings are inherited from i386-linux.elf
i386-linux.elf.shell-entry.h : $(srcdir)/src/$$T.asm
$(call tc,pp-nasm) --MMD=$@ $< -o tmp/$T.tmp1
$(call tc,app-nasm) tmp/$T.tmp1 tmp/$T.tmp2
$(call tc,nasm) -f bin -l tmp/$T.bin.lst tmp/$T.tmp2 -o tmp/$T.bin
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.bin
$(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_i386sh_loader tmp/$T.bin $@
i386-linux.elf.shell-fold.h : tmp/$$T.o tmp/i386-linux.elf.shell-main.o $(srcdir)/src/$$T.lds
@ -566,7 +572,7 @@ i386-linux.elf.shell-fold.h : tmp/$$T.o tmp/i386-linux.elf.shell-main.o $(srcdir
$(call tc,bin2h) --ident=linux_i386sh_fold tmp/$T.bin $@
tmp/i386-linux.elf.shell-fold.o : $(srcdir)/src/$$T.asm
$(call tc,nasm) -f elf -l $@.lst $< -o $@
$(call tc,gcc) -c -x assembler-with-cpp $< -o tmp/$T.o
$(call tc,objstrip) $@
tmp/i386-linux.elf.shell-main.o : $(srcdir)/src/$$T.c
@ -680,9 +686,11 @@ tc.powerpc-linux.elf.objdump = $(call tc,m-objdump)
tc.powerpc-linux.elf.objstrip = $(call tc,objcopy) -R .comment -R .note
powerpc-linux.elf-entry.h : $(srcdir)/src/$$T.S
$(call tc,gcc) -c $< -o tmp/$T.o
$(call tc,objstrip) tmp/$T.o
$(call tc,ld) --oformat binary tmp/$T.o -o tmp/$T.bin
$(call tc,gcc) -c $< -o tmp/$T.bin
$(call tc,m-objcopy) --strip-unneeded tmp/$T.bin
$(call tc,m-objcopy) -R .text -R .data -R .bss tmp/$T.bin
$(call tc,m-objcopy) -R .note -R .comment tmp/$T.bin
$(call tc,m-objdump) -trwh tmp/$T.bin >> tmp/$T.bin
$(call tc,bin2h) --ident=linux_elfppc32_loader tmp/$T.bin $@
powerpc-linux.elf-fold.h : tmp/$$T.o tmp/powerpc-linux.elf-main.o $(srcdir)/src/$$T.lds

View File

@ -1,4 +1,4 @@
/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 3066 (0xbfa) bytes
/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 11892 (0x2e74) bytes
This file is part of the UPX executable compressor.
@ -27,201 +27,753 @@
*/
#define LINUX_ELF64AMD_LOADER_SIZE 3066
#define LINUX_ELF64AMD_LOADER_ADLER32 0x7a3e6996
#define LINUX_ELF64AMD_LOADER_CRC32 0x5bbfae22
#define LINUX_ELF64AMD_LOADER_SIZE 11892
#define LINUX_ELF64AMD_LOADER_ADLER32 0x4635c9f5
#define LINUX_ELF64AMD_LOADER_CRC32 0x440aaf64
unsigned char linux_elf64amd_loader[3066] = {
unsigned char linux_elf64amd_loader[11892] = {
127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */
1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 40, 3, 0, 0, 0, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 6, 0, 3, 0, /* 0x 30 */
232,178, 2, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 72,137,254, /* 0x 40 */
72,137,215, 49,219, 49,201, 72,131,205,255,232,129, 1, 0, 0, /* 0x 50 */
1,219,116, 2,243,195,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 60 */
243,195, 72,141, 4, 47,131,249, 5,138, 16,118, 33, 72,131,253, /* 0x 70 */
252,119, 27,131,233, 4,139, 16, 72,131,192, 4,131,233, 4,137, /* 0x 80 */
23, 72,141,127, 4,115,239,131,193, 4,138, 16,116, 16, 72,255, /* 0x 90 */
192,136, 23,131,233, 1,138, 16, 72,141,127, 1,117,240,243,195, /* 0x a0 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x b0 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1,235, 7,255, /* 0x c0 */
200, 65,255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, /* 0x d0 */
30, 72,131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 29, /* 0x e0 */
193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, /* 0x f0 */
244, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 100 */
8,139, 30, 72,131,238,252, 17,219,114, 40,255,193, 1,219,117, /* 0x 110 */
8,139, 30, 72,131,238,252, 17,219,114, 24, 65,255,211, 17,201, /* 0x 120 */
1,219,117, 8,139, 30, 72,131,238,252, 17,219,115,237,131,193, /* 0x 130 */
2,235, 5, 65,255,211, 17,201, 72,129,253, 0,251,255,255,131, /* 0x 140 */
209, 2,232, 27,255,255,255,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 150 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x 160 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, /* 0x 170 */
17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 180 */
115,235,131,232, 3,114, 19,193,224, 8, 15,182,210, 9,208, 72, /* 0x 190 */
255,198,131,240,255,116, 81, 72, 99,232,141, 65, 1, 65,255,211, /* 0x 1a0 */
17,201, 65,255,211, 17,201,117, 24,137,193,131,192, 2, 65,255, /* 0x 1b0 */
211, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17,219,115, /* 0x 1c0 */
237, 72,129,253, 0,243,255,255, 17,193,232,147,254,255,255,235, /* 0x 1d0 */
135,252, 65, 91, 65,131,248, 8, 15,132,202,254,255,255, 65,131, /* 0x 1e0 */
248, 2, 15,132,112,255,255,255, 89, 72,137,240, 72, 41,200, 90, /* 0x 1f0 */
72, 41,215, 89,137, 57, 91, 93,195, 10, 36, 73,100, 58, 32, 85, /* 0x 200 */
80, 88, 32, 40, 67, 41, 32, 49, 57, 57, 54, 45, 50, 48, 48, 54, /* 0x 210 */
32,116,104,101, 32, 85, 80, 88, 32, 84,101, 97,109, 46, 32, 65, /* 0x 220 */
108,108, 32, 82,105,103,104,116,115, 32, 82,101,115,101,114,118, /* 0x 230 */
101,100, 46, 32,104,116,116,112, 58, 47, 47,117,112,120, 46,115, /* 0x 240 */
102, 46,110,101,116, 32, 36, 10, 0,104, 30, 0, 0, 0, 90,232, /* 0x 250 */
30, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, 67,124, 80, 82, /* 0x 260 */
79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105,108,101,100, 46, /* 0x 270 */
10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106,127, 95,106, 60, /* 0x 280 */
88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90,190, 0, 0, 0, /* 0x 290 */
0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, 5, 57,199,117, /* 0x 2a0 */
168,104, 0, 0, 0, 0,104, 0, 0, 0, 0,190, 0, 0, 0, 0, /* 0x 2b0 */
104, 0, 0, 0, 0,185, 0, 0, 0, 0,104, 0, 0, 0, 0,104, /* 0x 2c0 */
0, 0, 0, 0,137,250, 41,242, 1,213, 1,211,252,243, 72,165, /* 0x 2d0 */
151,137,222, 80,146,173, 80, 72,137,225,173,151,173, 68, 15,182, /* 0x 2e0 */
192,135,254,255,213, 89,195, 93,232,150,255,255,255, 0, 46,115, /* 0x 2f0 */
121,109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115, /* 0x 300 */
104,115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 76, 69, 88, /* 0x 310 */
69, 67, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 320 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 330 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 340 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 350 */
0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, /* 0x 360 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 370 */
64, 0, 0, 0, 0, 0, 0, 0,189, 2, 0, 0, 0, 0, 0, 0, /* 0x 380 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 390 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, /* 0x 3a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3b0 */
0, 6, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, /* 0x 3c0 */
4, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 3d0 */
24, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x 3e0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3f0 */
253, 2, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, /* 0x 400 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 410 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, /* 0x 420 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 430 */
168, 4, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, /* 0x 440 */
5, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 450 */
24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x 460 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 470 */
200, 5, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, /* 0x 480 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 490 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4b0 */
0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4c0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, /* 0x 4d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4e0 */
8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4f0 */
0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, /* 0x 500 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 510 */
18, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 520 */
0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 16, 0, 0, 0, /* 0x 530 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 540 */
28, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 550 */
0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 16, 0, 0, 0, /* 0x 560 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 570 */
38, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 580 */
0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 16, 0, 0, 0, /* 0x 590 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5a0 */
48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x 5c0 */
65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x 5d0 */
68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x 5e0 */
84, 67, 0, 65, 68, 82, 88, 0, 76, 69, 78, 88, 0, 0, 0, 0, /* 0x 5f0 */
85, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, /* 0x 600 */
0, 0, 0, 0, 0, 0, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0, /* 0x 610 */
10, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 620 */
114, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 5, 0, 0, 0, /* 0x 630 */
0, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, /* 0x 640 */
10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 650 */
124, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, /* 0x 660 */
0, 0, 0, 0, 0, 0, 0, 0,129, 2, 0, 0, 0, 0, 0, 0, /* 0x 670 */
10, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 680 */
134, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, /* 0x 690 */
0, 0, 0, 0, 0, 0, 0, 0,139, 2, 0, 0, 0, 0, 0, 0, /* 0x 6a0 */
10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6b0 */
144, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, /* 0x 6c0 */
0, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x 6d0 */
54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x 6e0 */
114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x 6f0 */
32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x 700 */
54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x 710 */
73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 720 */
32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x 730 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x 740 */
65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 750 */
70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x 760 */
70,108, 97,103,115, 10, 32, 32, 48, 32, 76, 69, 88, 69, 67, 48, /* 0x 770 */
48, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 50, 98,100, /* 0x 780 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 790 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 7a0 */
48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x 7b0 */
50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x 7c0 */
82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x 7d0 */
83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, /* 0x 7e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x 7f0 */
32, 32, 32, 32,100, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, /* 0x 800 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 810 */
32, 76, 69, 88, 69, 67, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, /* 0x 820 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, /* 0x 830 */
32, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, 48, 48, 48, 48, /* 0x 840 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, /* 0x 850 */
97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 860 */
48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x 870 */
68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 880 */
48, 48, 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x 890 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x 8a0 */
32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 8b0 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 77, 10, 48, 48, /* 0x 8c0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x 8d0 */
32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, /* 0x 8e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 74, 77, /* 0x 8f0 */
80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 900 */
48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, /* 0x 910 */
42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 920 */
48, 48, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 930 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 940 */
32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 950 */
48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, 10, 48, 48, 48, /* 0x 960 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x 970 */
32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x 980 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, /* 0x 990 */
85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9a0 */
48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, /* 0x 9b0 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9c0 */
48, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9d0 */
48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 9e0 */
42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9f0 */
48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 88, 10, 48, 48, 48, 48, /* 0x a00 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, /* 0x a10 */
32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, /* 0x a20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 88, /* 0x a30 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x a40 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 69, 88, 69, 67, /* 0x a50 */
48, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, /* 0x a60 */
32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x a70 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x a80 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 53, 53, /* 0x a90 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x aa0 */
32, 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ab0 */
48, 48, 48, 48, 48, 50, 53,100, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x ac0 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 77, 10, /* 0x ad0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 55, 50, /* 0x ae0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x af0 */
32, 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b00 */
48, 48, 48, 48, 48, 50, 55, 55, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x b10 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 85, 10, /* 0x b20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 55, 99, /* 0x b30 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x b40 */
32, 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b50 */
48, 48, 48, 48, 48, 50, 56, 49, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x b60 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 85, 10, /* 0x b70 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 56, 54, /* 0x b80 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x b90 */
32, 32, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ba0 */
48, 48, 48, 48, 48, 50, 56, 98, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x bb0 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 88, 10, /* 0x bc0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 57, 48, /* 0x bd0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x be0 */
32, 32, 32, 76, 69, 78, 88, 10, 10, 10 /* 0x bf0 */
0, 0, 0, 0, 0, 0, 0, 0,216, 23, 0, 0, 0, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 20, 0, 17, 0, /* 0x 30 */
232, 0, 0, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 0, 0, 0, /* 0x 40 */
72,137,254, 72,137,215, 49,219, 49,201, 72,131,205,255,232, 85, /* 0x 50 */
0, 0, 0, 0, 0, 0, 0, 0, 1,219,116, 2,243,195,139, 30, /* 0x 60 */
72,131,238,252, 17,219,138, 22,243,195, 72,141, 4, 47,131,249, /* 0x 70 */
5,138, 16,118, 33, 72,131,253,252,119, 27,131,233, 4,139, 16, /* 0x 80 */
72,131,192, 4,131,233, 4,137, 23, 72,141,127, 4,115,239,131, /* 0x 90 */
193, 4,138, 16,116, 16, 72,255,192,136, 23,131,233, 1,138, 16, /* 0x a0 */
72,141,127, 1,117,240,243,195,252, 65, 91, 0, 0, 0, 0, 0, /* 0x b0 */
65,128,248, 8,116, 18,233,177, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x c0 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x d0 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1,235, 7,255, /* 0x e0 */
200, 65,255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, /* 0x f0 */
30, 72,131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 29, /* 0x 100 */
193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, /* 0x 110 */
0, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 120 */
8,139, 30, 72,131,238,252, 17,219,114, 40,255,193, 1,219,117, /* 0x 130 */
8,139, 30, 72,131,238,252, 17,219,114, 24, 65,255,211, 17,201, /* 0x 140 */
1,219,117, 8,139, 30, 72,131,238,252, 17,219,115,237,131,193, /* 0x 150 */
2,235, 5, 65,255,211, 17,201, 72,129,253, 0,251,255,255,131, /* 0x 160 */
209, 2,232, 0, 0, 0, 0,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 170 */
65,128,248, 2,116, 18,233,138, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 180 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x 190 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, /* 0x 1a0 */
17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 1b0 */
115,235,131,232, 3,114, 23,193,224, 8, 15,182,210, 9,208, 72, /* 0x 1c0 */
255,198,131,240,255, 15,132, 0, 0, 0, 0, 72, 99,232,141, 65, /* 0x 1d0 */
1, 65,255,211, 17,201, 65,255,211, 17,201,117, 24,137,193,131, /* 0x 1e0 */
192, 2, 65,255,211, 17,201, 1,219,117, 8,139, 30, 72,131,238, /* 0x 1f0 */
252, 17,219,115,237, 72,129,253, 0,243,255,255, 17,193,232, 0, /* 0x 200 */
0, 0, 0,235,131, 65,128,248, 14, 15,133, 0, 0, 0, 0, 85, /* 0x 210 */
72,137,229, 68,139, 9, 73,137,208, 72,137,242, 72,141,119, 2, /* 0x 220 */
86,138, 7,255,202,136,193, 36, 7,192,233, 3, 72,199,195, 0, /* 0x 230 */
253,255,255, 72,211,227,136,193, 72,141,156, 92,136,241,255,255, /* 0x 240 */
72,131,227,192,106, 0, 72, 57,220,117,249, 83, 72,141,123, 8, /* 0x 250 */
138, 78,255,255,202,136, 71, 2,136,200,192,233, 4,136, 79, 1, /* 0x 260 */
36, 15,136, 7, 72,141, 79,252, 80, 65, 87, 72,141, 71, 4, 69, /* 0x 270 */
49,255, 65, 86, 65,190, 1, 0, 0, 0, 65, 85, 69, 49,237, 65, /* 0x 280 */
84, 85, 83, 72,137, 76, 36,240, 72,137, 68, 36,216,184, 1, 0, /* 0x 290 */
0, 0, 72,137,116, 36,248, 76,137, 68, 36,232,137,195, 68,137, /* 0x 2a0 */
76, 36,228, 15,182, 79, 2,211,227,137,217, 72,139, 92, 36, 56, /* 0x 2b0 */
255,201,137, 76, 36,212, 15,182, 79, 1,211,224, 72,139, 76, 36, /* 0x 2c0 */
240,255,200,137, 68, 36,208, 15,182, 7,199, 1, 0, 0, 0, 0, /* 0x 2d0 */
199, 68, 36,200, 0, 0, 0, 0,199, 68, 36,196, 1, 0, 0, 0, /* 0x 2e0 */
199, 68, 36,192, 1, 0, 0, 0,199, 68, 36,188, 1, 0, 0, 0, /* 0x 2f0 */
199, 3, 0, 0, 0, 0,137, 68, 36,204, 15,182, 79, 1, 1,193, /* 0x 300 */
184, 0, 3, 0, 0,211,224, 49,201,141,184, 54, 7, 0, 0, 65, /* 0x 310 */
57,255,115, 19, 72,139, 92, 36,216,137,200,255,193, 57,249,102, /* 0x 320 */
199, 4, 67, 0, 4,235,235, 72,139,124, 36,248,137,208, 69, 49, /* 0x 330 */
210, 65,131,203,255, 49,210, 73,137,252, 73, 1,196, 76, 57,231, /* 0x 340 */
15,132,239, 8, 0, 0, 15,182, 7, 65,193,226, 8,255,194, 72, /* 0x 350 */
255,199, 65, 9,194,131,250, 4,126,227, 68, 59,124, 36,228, 15, /* 0x 360 */
131,218, 8, 0, 0,139, 68, 36,212, 72, 99, 92, 36,200, 72,139, /* 0x 370 */
84, 36,216, 68, 33,248,137, 68, 36,184, 72, 99,108, 36,184, 72, /* 0x 380 */
137,216, 72,193,224, 4, 72, 1,232, 65,129,251,255,255,255, 0, /* 0x 390 */
76,141, 12, 66,119, 26, 76, 57,231, 15,132,150, 8, 0, 0, 15, /* 0x 3a0 */
182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, /* 0x 3b0 */
65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175,193, /* 0x 3c0 */
65, 57,194, 15,131,197, 1, 0, 0, 65,137,195,184, 0, 8, 0, /* 0x 3d0 */
0, 72,139, 92, 36,216, 41,200, 15,182, 76, 36,204,190, 1, 0, /* 0x 3e0 */
0, 0,193,248, 5,141, 4, 2, 65, 15,182,213,102, 65,137, 1, /* 0x 3f0 */
139, 68, 36,208, 68, 33,248,211,224,185, 8, 0, 0, 0, 43, 76, /* 0x 400 */
36,204,211,250, 1,208,105,192, 0, 3, 0, 0,131,124, 36,200, /* 0x 410 */
6,137,192, 76,141,140, 67,108, 14, 0, 0, 15,142,184, 0, 0, /* 0x 420 */
0, 72,139, 84, 36,232, 68,137,248, 68, 41,240, 15,182, 44, 2, /* 0x 430 */
1,237, 72, 99,214,137,235,129,227, 0, 1, 0, 0, 65,129,251, /* 0x 440 */
255,255,255, 0, 72, 99,195, 73,141, 4, 65, 76,141, 4, 80,119, /* 0x 450 */
26, 76, 57,231, 15,132,219, 7, 0, 0, 15,182, 7, 65,193,226, /* 0x 460 */
8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183,144, 0, /* 0x 470 */
2, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, /* 0x 480 */
57,194,115, 32, 65,137,195,184, 0, 8, 0, 0, 1,246, 41,200, /* 0x 490 */
193,248, 5,133,219,141, 4, 2,102, 65,137,128, 0, 2, 0, 0, /* 0x 4a0 */
116, 33,235, 45, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, /* 0x 4b0 */
141,116, 54, 1,102, 41,194,133,219,102, 65,137,144, 0, 2, 0, /* 0x 4c0 */
0,116, 14,129,254,255, 0, 0, 0, 15,142, 97,255,255,255,235, /* 0x 4d0 */
120,129,254,255, 0, 0, 0,127,112, 72, 99,198, 65,129,251,255, /* 0x 4e0 */
255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132, 67, 7, /* 0x 4f0 */
0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, /* 0x 500 */
65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183,202, /* 0x 510 */
15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, 0, /* 0x 520 */
1,246, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235,161, /* 0x 530 */
65, 41,195, 65, 41,194,137,208,102,193,232, 5,141,116, 54, 1, /* 0x 540 */
102, 41,194,102, 65,137, 16,235,136, 72,139, 76, 36,232, 68,137, /* 0x 550 */
248, 65,255,199, 65,137,245, 64,136, 52, 1,131,124, 36,200, 3, /* 0x 560 */
127, 13,199, 68, 36,200, 0, 0, 0, 0,233,166, 6, 0, 0,139, /* 0x 570 */
84, 36,200,139, 68, 36,200,131,234, 3,131,232, 6,131,124, 36, /* 0x 580 */
200, 9, 15, 79,208,137, 84, 36,200,233,135, 6, 0, 0, 65, 41, /* 0x 590 */
195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 72,139, 68, /* 0x 5a0 */
36,216, 65,129,251,255,255,255, 0,102, 65,137, 17, 72,141, 52, /* 0x 5b0 */
88,119, 26, 76, 57,231, 15,132,121, 6, 0, 0, 15,182, 7, 65, /* 0x 5c0 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150, /* 0x 5d0 */
128, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, /* 0x 5e0 */
65, 57,194,115, 78, 65,137,195,184, 0, 8, 0, 0, 76,139, 76, /* 0x 5f0 */
36,216, 41,200,139, 76, 36,196, 68,137,116, 36,196,193,248, 5, /* 0x 600 */
141, 4, 2,139, 84, 36,192,137, 76, 36,192,102,137,134,128, 1, /* 0x 610 */
0, 0, 49,192,131,124, 36,200, 6,137, 84, 36,188, 15,159,192, /* 0x 620 */
73,129,193,100, 6, 0, 0,141, 4, 64,137, 68, 36,200,233, 84, /* 0x 630 */
2, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, /* 0x 640 */
41,194, 65,129,251,255,255,255, 0,102,137,150,128, 1, 0, 0, /* 0x 650 */
119, 26, 76, 57,231, 15,132,218, 5, 0, 0, 15,182, 7, 65,193, /* 0x 660 */
226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150,152, /* 0x 670 */
1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, /* 0x 680 */
57,194, 15,131,208, 0, 0, 0, 65,184, 0, 8, 0, 0, 65,137, /* 0x 690 */
195, 72,193,227, 5, 68,137,192, 41,200,193,248, 5,141, 4, 2, /* 0x 6a0 */
102,137,134,152, 1, 0, 0, 72,139, 68, 36,216, 72, 1,216, 65, /* 0x 6b0 */
129,251,255,255,255, 0, 72,141, 52,104,119, 26, 76, 57,231, 15, /* 0x 6c0 */
132,112, 5, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, /* 0x 6d0 */
72,255,199, 65, 9,194, 15,183,150,224, 1, 0, 0, 68,137,216, /* 0x 6e0 */
193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 79, 65, 41, /* 0x 6f0 */
200, 65,137,195, 65,193,248, 5, 69,133,255, 66,141, 4, 2,102, /* 0x 700 */
137,134,224, 1, 0, 0, 15,132, 41, 5, 0, 0, 49,192,131,124, /* 0x 710 */
36,200, 6, 72,139, 92, 36,232, 15,159,192,141, 68, 0, 9,137, /* 0x 720 */
68, 36,200, 68,137,248, 68, 41,240, 68, 15,182, 44, 3, 68,137, /* 0x 730 */
248, 65,255,199, 68,136, 44, 3,233,216, 4, 0, 0, 65, 41,195, /* 0x 740 */
65, 41,194,137,208,102,193,232, 5,102, 41,194,102,137,150,224, /* 0x 750 */
1, 0, 0,233, 17, 1, 0, 0, 65, 41,195, 65, 41,194,137,208, /* 0x 760 */
102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102,137, /* 0x 770 */
150,152, 1, 0, 0,119, 26, 76, 57,231, 15,132,181, 4, 0, 0, /* 0x 780 */
15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, /* 0x 790 */
194, 15,183,150,176, 1, 0, 0, 68,137,216,193,232, 11, 15,183, /* 0x 7a0 */
202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, 8, 0, /* 0x 7b0 */
0, 41,200,193,248, 5,141, 4, 2,102,137,134,176, 1, 0, 0, /* 0x 7c0 */
139, 68, 36,196,233,152, 0, 0, 0, 65, 41,195, 65, 41,194,137, /* 0x 7d0 */
208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, /* 0x 7e0 */
137,150,176, 1, 0, 0,119, 26, 76, 57,231, 15,132, 68, 4, 0, /* 0x 7f0 */
0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, /* 0x 800 */
9,194, 15,183,150,200, 1, 0, 0, 68,137,216,193,232, 11, 15, /* 0x 810 */
183,202, 15,175,193, 65, 57,194,115, 29, 65,137,195,184, 0, 8, /* 0x 820 */
0, 0, 41,200,193,248, 5,141, 4, 2,102,137,134,200, 1, 0, /* 0x 830 */
0,139, 68, 36,192,235, 34, 65, 41,195, 65, 41,194,137,208,102, /* 0x 840 */
193,232, 5,102, 41,194,139, 68, 36,188,102,137,150,200, 1, 0, /* 0x 850 */
0,139, 84, 36,192,137, 84, 36,188,139, 76, 36,196,137, 76, 36, /* 0x 860 */
192, 68,137,116, 36,196, 65,137,198, 49,192,131,124, 36,200, 6, /* 0x 870 */
76,139, 76, 36,216, 15,159,192, 73,129,193,104, 10, 0, 0,141, /* 0x 880 */
68, 64, 8,137, 68, 36,200, 65,129,251,255,255,255, 0,119, 26, /* 0x 890 */
76, 57,231, 15,132,156, 3, 0, 0, 15,182, 7, 65,193,226, 8, /* 0x 8a0 */
65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137, /* 0x 8b0 */
216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 39, 65, /* 0x 8c0 */
137,195,184, 0, 8, 0, 0, 69, 49,237, 41,200,193,248, 5,141, /* 0x 8d0 */
4, 2,102, 65,137, 1, 72, 99, 68, 36,184, 72,193,224, 4, 77, /* 0x 8e0 */
141, 68, 1, 4,235,120, 65, 41,195, 65, 41,194,137,208,102,193, /* 0x 8f0 */
232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, 65,137, 17, /* 0x 900 */
119, 26, 76, 57,231, 15,132, 42, 3, 0, 0, 15,182, 7, 65,193, /* 0x 910 */
226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 81, /* 0x 920 */
2, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194, /* 0x 930 */
115, 52, 65,137,195,184, 0, 8, 0, 0, 65,189, 8, 0, 0, 0, /* 0x 940 */
41,200,193,248, 5,141, 4, 2,102, 65,137, 65, 2, 72, 99, 68, /* 0x 950 */
36,184, 72,193,224, 4, 77,141,132, 1, 4, 1, 0, 0, 65,185, /* 0x 960 */
3, 0, 0, 0,235, 39, 65, 41,195, 65, 41,194,137,208,102,193, /* 0x 970 */
232, 5, 77,141,129, 4, 2, 0, 0, 65,189, 16, 0, 0, 0,102, /* 0x 980 */
41,194,102, 65,137, 81, 2, 65,185, 8, 0, 0, 0, 68,137,203, /* 0x 990 */
189, 1, 0, 0, 0, 72, 99,197, 65,129,251,255,255,255, 0, 73, /* 0x 9a0 */
141, 52, 64,119, 26, 76, 57,231, 15,132,135, 2, 0, 0, 15,182, /* 0x 9b0 */
7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15, /* 0x 9c0 */
183, 14, 68,137,216,193,232, 11, 15,183,209, 15,175,194, 65, 57, /* 0x 9d0 */
194,115, 23, 65,137,195,184, 0, 8, 0, 0, 1,237, 41,208,193, /* 0x 9e0 */
248, 5,141, 4, 1,102,137, 6,235, 22, 65, 41,195, 65, 41,194, /* 0x 9f0 */
137,200,102,193,232, 5,141,108, 45, 1,102, 41,193,102,137, 14, /* 0x a00 */
255,203,117,145,184, 1, 0, 0, 0, 68,137,201,211,224, 41,197, /* 0x a10 */
68, 1,237,131,124, 36,200, 3, 15,143,194, 1, 0, 0,131, 68, /* 0x a20 */
36,200, 7,184, 3, 0, 0, 0,131,253, 4, 15, 76,197, 72,139, /* 0x a30 */
92, 36,216, 65,184, 1, 0, 0, 0, 72,152, 72,193,224, 7, 76, /* 0x a40 */
141,140, 3, 96, 3, 0, 0,187, 6, 0, 0, 0, 73, 99,192, 65, /* 0x a50 */
129,251,255,255,255, 0, 73,141, 52, 65,119, 26, 76, 57,231, 15, /* 0x a60 */
132,208, 1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, /* 0x a70 */
72,255,199, 65, 9,194, 15,183, 22, 68,137,216,193,232, 11, 15, /* 0x a80 */
183,202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, /* 0x a90 */
0, 0, 69, 1,192, 41,200,193,248, 5,141, 4, 2,102,137, 6, /* 0x aa0 */
235, 23, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, 71,141, /* 0x ab0 */
68, 0, 1,102, 41,194,102,137, 22,255,203,117,143, 65,131,232, /* 0x ac0 */
64, 65,131,248, 3, 69,137,198, 15,142, 13, 1, 0, 0, 65,131, /* 0x ad0 */
230, 1, 68,137,192,209,248, 65,131,206, 2, 65,131,248, 13,141, /* 0x ae0 */
112,255,127, 35,137,241, 72,139, 92, 36,216, 73, 99,192, 65,211, /* 0x af0 */
230, 72, 1,192, 68,137,242, 72,141, 20, 83, 72, 41,194, 76,141, /* 0x b00 */
138, 94, 5, 0, 0,235, 81,141,112,251, 65,129,251,255,255,255, /* 0x b10 */
0,119, 26, 76, 57,231, 15,132, 25, 1, 0, 0, 15,182, 7, 65, /* 0x b20 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65,209,235, /* 0x b30 */
69, 1,246, 69, 57,218,114, 7, 69, 41,218, 65,131,206, 1,255, /* 0x b40 */
206,117,199, 76,139, 76, 36,216, 65,193,230, 4,190, 4, 0, 0, /* 0x b50 */
0, 73,129,193, 68, 6, 0, 0, 65,189, 1, 0, 0, 0,187, 1, /* 0x b60 */
0, 0, 0, 72, 99,195, 65,129,251,255,255,255, 0, 77,141, 4, /* 0x b70 */
65,119, 26, 76, 57,231, 15,132,185, 0, 0, 0, 15,182, 7, 65, /* 0x b80 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, /* 0x b90 */
16, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194, /* 0x ba0 */
115, 24, 65,137,195,184, 0, 8, 0, 0, 1,219, 41,200,193,248, /* 0x bb0 */
5,141, 4, 2,102, 65,137, 0,235, 26, 65, 41,195, 65, 41,194, /* 0x bc0 */
137,208,102,193,232, 5,141, 92, 27, 1, 69, 9,238,102, 41,194, /* 0x bd0 */
102, 65,137, 16, 69, 1,237,255,206,117,136, 65,255,198,116, 64, /* 0x be0 */
131,197, 2, 69, 57,254,119, 77, 72,139, 84, 36,232, 68,137,248, /* 0x bf0 */
68, 41,240, 68, 15,182, 44, 2, 68,137,248, 65,255,199,255,205, /* 0x c00 */
68,136, 44, 2, 15,149,194, 49,192, 68, 59,124, 36,228, 15,146, /* 0x c10 */
192,133,194,117,211, 68, 59,124, 36,228, 15,130, 69,247,255,255, /* 0x c20 */
65,129,251,255,255,255, 0,119, 22, 76, 57,231,184, 1, 0, 0, /* 0x c30 */
0,116, 35,235, 7,184, 1, 0, 0, 0,235, 26, 72,255,199,137, /* 0x c40 */
248, 43, 68, 36,248, 72,139, 76, 36,240, 72,139, 92, 36, 56,137, /* 0x c50 */
1, 68,137, 59, 49,192, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95, /* 0x c60 */
65, 87, 72,141, 71, 4, 69, 49,255, 65, 86, 65,190, 1, 0, 0, /* 0x c70 */
0, 65, 85, 69, 49,237, 65, 84, 85, 83, 72,137, 76, 36,240, 72, /* 0x c80 */
137, 68, 36,216,184, 1, 0, 0, 0, 72,137,116, 36,248, 76,137, /* 0x c90 */
68, 36,232,137,195, 68,137, 76, 36,228, 15,182, 79, 2,211,227, /* 0x ca0 */
137,217, 72,139, 92, 36, 56,255,201,137, 76, 36,212, 15,182, 79, /* 0x cb0 */
1,211,224, 72,139, 76, 36,240,255,200,137, 68, 36,208, 15,182, /* 0x cc0 */
7,199, 1, 0, 0, 0, 0,199, 68, 36,200, 0, 0, 0, 0,199, /* 0x cd0 */
68, 36,196, 1, 0, 0, 0,199, 68, 36,192, 1, 0, 0, 0,199, /* 0x ce0 */
68, 36,188, 1, 0, 0, 0,199, 3, 0, 0, 0, 0,137, 68, 36, /* 0x cf0 */
204, 15,182, 79, 1, 1,193,184, 0, 3, 0, 0,211,224, 49,201, /* 0x d00 */
141,184, 54, 7, 0, 0, 65, 57,255,115, 19, 72,139, 92, 36,216, /* 0x d10 */
137,200,255,193, 57,249,102,199, 4, 67, 0, 4,235,235, 72,139, /* 0x d20 */
124, 36,248,137,208, 69, 49,210, 65,131,203,255, 49,210, 73,137, /* 0x d30 */
252, 73, 1,196, 76, 57,231, 15,132,239, 8, 0, 0, 15,182, 7, /* 0x d40 */
65,193,226, 8,255,194, 72,255,199, 65, 9,194,131,250, 4,126, /* 0x d50 */
227, 68, 59,124, 36,228, 15,131,218, 8, 0, 0,139, 68, 36,212, /* 0x d60 */
72, 99, 92, 36,200, 72,139, 84, 36,216, 68, 33,248,137, 68, 36, /* 0x d70 */
184, 72, 99,108, 36,184, 72,137,216, 72,193,224, 4, 72, 1,232, /* 0x d80 */
65,129,251,255,255,255, 0, 76,141, 12, 66,119, 26, 76, 57,231, /* 0x d90 */
15,132,150, 8, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, /* 0x da0 */
8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137,216,193,232, /* 0x db0 */
11, 15,183,202, 15,175,193, 65, 57,194, 15,131,197, 1, 0, 0, /* 0x dc0 */
65,137,195,184, 0, 8, 0, 0, 72,139, 92, 36,216, 41,200, 15, /* 0x dd0 */
182, 76, 36,204,190, 1, 0, 0, 0,193,248, 5,141, 4, 2, 65, /* 0x de0 */
15,182,213,102, 65,137, 1,139, 68, 36,208, 68, 33,248,211,224, /* 0x df0 */
185, 8, 0, 0, 0, 43, 76, 36,204,211,250, 1,208,105,192, 0, /* 0x e00 */
3, 0, 0,131,124, 36,200, 6,137,192, 76,141,140, 67,108, 14, /* 0x e10 */
0, 0, 15,142,184, 0, 0, 0, 72,139, 84, 36,232, 68,137,248, /* 0x e20 */
68, 41,240, 15,182, 44, 2, 1,237, 72, 99,214,137,235,129,227, /* 0x e30 */
0, 1, 0, 0, 65,129,251,255,255,255, 0, 72, 99,195, 73,141, /* 0x e40 */
4, 65, 76,141, 4, 80,119, 26, 76, 57,231, 15,132,219, 7, 0, /* 0x e50 */
0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, /* 0x e60 */
9,194, 65, 15,183,144, 0, 2, 0, 0, 68,137,216,193,232, 11, /* 0x e70 */
15,183,202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, /* 0x e80 */
8, 0, 0, 1,246, 41,200,193,248, 5,133,219,141, 4, 2,102, /* 0x e90 */
65,137,128, 0, 2, 0, 0,116, 33,235, 45, 65, 41,195, 65, 41, /* 0x ea0 */
194,137,208,102,193,232, 5,141,116, 54, 1,102, 41,194,133,219, /* 0x eb0 */
102, 65,137,144, 0, 2, 0, 0,116, 14,129,254,255, 0, 0, 0, /* 0x ec0 */
15,142, 97,255,255,255,235,120,129,254,255, 0, 0, 0,127,112, /* 0x ed0 */
72, 99,198, 65,129,251,255,255,255, 0, 77,141, 4, 65,119, 26, /* 0x ee0 */
76, 57,231, 15,132, 67, 7, 0, 0, 15,182, 7, 65,193,226, 8, /* 0x ef0 */
65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 16, 68,137, /* 0x f00 */
216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 24, 65, /* 0x f10 */
137,195,184, 0, 8, 0, 0, 1,246, 41,200,193,248, 5,141, 4, /* 0x f20 */
2,102, 65,137, 0,235,161, 65, 41,195, 65, 41,194,137,208,102, /* 0x f30 */
193,232, 5,141,116, 54, 1,102, 41,194,102, 65,137, 16,235,136, /* 0x f40 */
72,139, 76, 36,232, 68,137,248, 65,255,199, 65,137,245, 64,136, /* 0x f50 */
52, 1,131,124, 36,200, 3,127, 13,199, 68, 36,200, 0, 0, 0, /* 0x f60 */
0,233,166, 6, 0, 0,139, 84, 36,200,139, 68, 36,200,131,234, /* 0x f70 */
3,131,232, 6,131,124, 36,200, 9, 15, 79,208,137, 84, 36,200, /* 0x f80 */
233,135, 6, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, /* 0x f90 */
5,102, 41,194, 72,139, 68, 36,216, 65,129,251,255,255,255, 0, /* 0x fa0 */
102, 65,137, 17, 72,141, 52, 88,119, 26, 76, 57,231, 15,132,121, /* 0x fb0 */
6, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, /* 0x fc0 */
199, 65, 9,194, 15,183,150,128, 1, 0, 0, 68,137,216,193,232, /* 0x fd0 */
11, 15,183,202, 15,175,193, 65, 57,194,115, 78, 65,137,195,184, /* 0x fe0 */
0, 8, 0, 0, 76,139, 76, 36,216, 41,200,139, 76, 36,196, 68, /* 0x ff0 */
137,116, 36,196,193,248, 5,141, 4, 2,139, 84, 36,192,137, 76, /* 0x1000 */
36,192,102,137,134,128, 1, 0, 0, 49,192,131,124, 36,200, 6, /* 0x1010 */
137, 84, 36,188, 15,159,192, 73,129,193,100, 6, 0, 0,141, 4, /* 0x1020 */
64,137, 68, 36,200,233, 84, 2, 0, 0, 65, 41,195, 65, 41,194, /* 0x1030 */
137,208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0, /* 0x1040 */
102,137,150,128, 1, 0, 0,119, 26, 76, 57,231, 15,132,218, 5, /* 0x1050 */
0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, /* 0x1060 */
65, 9,194, 15,183,150,152, 1, 0, 0, 68,137,216,193,232, 11, /* 0x1070 */
15,183,202, 15,175,193, 65, 57,194, 15,131,208, 0, 0, 0, 65, /* 0x1080 */
184, 0, 8, 0, 0, 65,137,195, 72,193,227, 5, 68,137,192, 41, /* 0x1090 */
200,193,248, 5,141, 4, 2,102,137,134,152, 1, 0, 0, 72,139, /* 0x10a0 */
68, 36,216, 72, 1,216, 65,129,251,255,255,255, 0, 72,141, 52, /* 0x10b0 */
104,119, 26, 76, 57,231, 15,132,112, 5, 0, 0, 15,182, 7, 65, /* 0x10c0 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150, /* 0x10d0 */
224, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, /* 0x10e0 */
65, 57,194,115, 79, 65, 41,200, 65,137,195, 65,193,248, 5, 69, /* 0x10f0 */
133,255, 66,141, 4, 2,102,137,134,224, 1, 0, 0, 15,132, 41, /* 0x1100 */
5, 0, 0, 49,192,131,124, 36,200, 6, 72,139, 92, 36,232, 15, /* 0x1110 */
159,192,141, 68, 0, 9,137, 68, 36,200, 68,137,248, 68, 41,240, /* 0x1120 */
68, 15,182, 44, 3, 68,137,248, 65,255,199, 68,136, 44, 3,233, /* 0x1130 */
216, 4, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, /* 0x1140 */
102, 41,194,102,137,150,224, 1, 0, 0,233, 17, 1, 0, 0, 65, /* 0x1150 */
41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129, /* 0x1160 */
251,255,255,255, 0,102,137,150,152, 1, 0, 0,119, 26, 76, 57, /* 0x1170 */
231, 15,132,181, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65,193, /* 0x1180 */
227, 8, 72,255,199, 65, 9,194, 15,183,150,176, 1, 0, 0, 68, /* 0x1190 */
137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 32, /* 0x11a0 */
65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, 2, /* 0x11b0 */
102,137,134,176, 1, 0, 0,139, 68, 36,196,233,152, 0, 0, 0, /* 0x11c0 */
65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65, /* 0x11d0 */
129,251,255,255,255, 0,102,137,150,176, 1, 0, 0,119, 26, 76, /* 0x11e0 */
57,231, 15,132, 68, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65, /* 0x11f0 */
193,227, 8, 72,255,199, 65, 9,194, 15,183,150,200, 1, 0, 0, /* 0x1200 */
68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, /* 0x1210 */
29, 65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, /* 0x1220 */
2,102,137,134,200, 1, 0, 0,139, 68, 36,192,235, 34, 65, 41, /* 0x1230 */
195, 65, 41,194,137,208,102,193,232, 5,102, 41,194,139, 68, 36, /* 0x1240 */
188,102,137,150,200, 1, 0, 0,139, 84, 36,192,137, 84, 36,188, /* 0x1250 */
139, 76, 36,196,137, 76, 36,192, 68,137,116, 36,196, 65,137,198, /* 0x1260 */
49,192,131,124, 36,200, 6, 76,139, 76, 36,216, 15,159,192, 73, /* 0x1270 */
129,193,104, 10, 0, 0,141, 68, 64, 8,137, 68, 36,200, 65,129, /* 0x1280 */
251,255,255,255, 0,119, 26, 76, 57,231, 15,132,156, 3, 0, 0, /* 0x1290 */
15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, /* 0x12a0 */
194, 65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175, /* 0x12b0 */
193, 65, 57,194,115, 39, 65,137,195,184, 0, 8, 0, 0, 69, 49, /* 0x12c0 */
237, 41,200,193,248, 5,141, 4, 2,102, 65,137, 1, 72, 99, 68, /* 0x12d0 */
36,184, 72,193,224, 4, 77,141, 68, 1, 4,235,120, 65, 41,195, /* 0x12e0 */
65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129,251,255, /* 0x12f0 */
255,255, 0,102, 65,137, 17,119, 26, 76, 57,231, 15,132, 42, 3, /* 0x1300 */
0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, /* 0x1310 */
65, 9,194, 65, 15,183, 81, 2, 68,137,216,193,232, 11, 15,183, /* 0x1320 */
202, 15,175,193, 65, 57,194,115, 52, 65,137,195,184, 0, 8, 0, /* 0x1330 */
0, 65,189, 8, 0, 0, 0, 41,200,193,248, 5,141, 4, 2,102, /* 0x1340 */
65,137, 65, 2, 72, 99, 68, 36,184, 72,193,224, 4, 77,141,132, /* 0x1350 */
1, 4, 1, 0, 0, 65,185, 3, 0, 0, 0,235, 39, 65, 41,195, /* 0x1360 */
65, 41,194,137,208,102,193,232, 5, 77,141,129, 4, 2, 0, 0, /* 0x1370 */
65,189, 16, 0, 0, 0,102, 41,194,102, 65,137, 81, 2, 65,185, /* 0x1380 */
8, 0, 0, 0, 68,137,203,189, 1, 0, 0, 0, 72, 99,197, 65, /* 0x1390 */
129,251,255,255,255, 0, 73,141, 52, 64,119, 26, 76, 57,231, 15, /* 0x13a0 */
132,135, 2, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, /* 0x13b0 */
72,255,199, 65, 9,194, 15,183, 14, 68,137,216,193,232, 11, 15, /* 0x13c0 */
183,209, 15,175,194, 65, 57,194,115, 23, 65,137,195,184, 0, 8, /* 0x13d0 */
0, 0, 1,237, 41,208,193,248, 5,141, 4, 1,102,137, 6,235, /* 0x13e0 */
22, 65, 41,195, 65, 41,194,137,200,102,193,232, 5,141,108, 45, /* 0x13f0 */
1,102, 41,193,102,137, 14,255,203,117,145,184, 1, 0, 0, 0, /* 0x1400 */
68,137,201,211,224, 41,197, 68, 1,237,131,124, 36,200, 3, 15, /* 0x1410 */
143,194, 1, 0, 0,131, 68, 36,200, 7,184, 3, 0, 0, 0,131, /* 0x1420 */
253, 4, 15, 76,197, 72,139, 92, 36,216, 65,184, 1, 0, 0, 0, /* 0x1430 */
72,152, 72,193,224, 7, 76,141,140, 3, 96, 3, 0, 0,187, 6, /* 0x1440 */
0, 0, 0, 73, 99,192, 65,129,251,255,255,255, 0, 73,141, 52, /* 0x1450 */
65,119, 26, 76, 57,231, 15,132,208, 1, 0, 0, 15,182, 7, 65, /* 0x1460 */
193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, 22, /* 0x1470 */
68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, /* 0x1480 */
24, 65,137,195,184, 0, 8, 0, 0, 69, 1,192, 41,200,193,248, /* 0x1490 */
5,141, 4, 2,102,137, 6,235, 23, 65, 41,195, 65, 41,194,137, /* 0x14a0 */
208,102,193,232, 5, 71,141, 68, 0, 1,102, 41,194,102,137, 22, /* 0x14b0 */
255,203,117,143, 65,131,232, 64, 65,131,248, 3, 69,137,198, 15, /* 0x14c0 */
142, 13, 1, 0, 0, 65,131,230, 1, 68,137,192,209,248, 65,131, /* 0x14d0 */
206, 2, 65,131,248, 13,141,112,255,127, 35,137,241, 72,139, 92, /* 0x14e0 */
36,216, 73, 99,192, 65,211,230, 72, 1,192, 68,137,242, 72,141, /* 0x14f0 */
20, 83, 72, 41,194, 76,141,138, 94, 5, 0, 0,235, 81,141,112, /* 0x1500 */
251, 65,129,251,255,255,255, 0,119, 26, 76, 57,231, 15,132, 25, /* 0x1510 */
1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, /* 0x1520 */
199, 65, 9,194, 65,209,235, 69, 1,246, 69, 57,218,114, 7, 69, /* 0x1530 */
41,218, 65,131,206, 1,255,206,117,199, 76,139, 76, 36,216, 65, /* 0x1540 */
193,230, 4,190, 4, 0, 0, 0, 73,129,193, 68, 6, 0, 0, 65, /* 0x1550 */
189, 1, 0, 0, 0,187, 1, 0, 0, 0, 72, 99,195, 65,129,251, /* 0x1560 */
255,255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132,185, /* 0x1570 */
0, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, /* 0x1580 */
199, 65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183, /* 0x1590 */
202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, /* 0x15a0 */
0, 1,219, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235, /* 0x15b0 */
26, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141, 92, 27, /* 0x15c0 */
1, 69, 9,238,102, 41,194,102, 65,137, 16, 69, 1,237,255,206, /* 0x15d0 */
117,136, 65,255,198,116, 64,131,197, 2, 69, 57,254,119, 77, 72, /* 0x15e0 */
139, 84, 36,232, 68,137,248, 68, 41,240, 68, 15,182, 44, 2, 68, /* 0x15f0 */
137,248, 65,255,199,255,205, 68,136, 44, 2, 15,149,194, 49,192, /* 0x1600 */
68, 59,124, 36,228, 15,146,192,133,194,117,211, 68, 59,124, 36, /* 0x1610 */
228, 15,130, 69,247,255,255, 65,129,251,255,255,255, 0,119, 22, /* 0x1620 */
76, 57,231,184, 1, 0, 0, 0,116, 35,235, 7,184, 1, 0, 0, /* 0x1630 */
0,235, 26, 72,255,199,137,248, 43, 68, 36,248, 72,139, 76, 36, /* 0x1640 */
240, 72,139, 92, 36, 56,137, 1, 68,137, 59, 49,192, 91, 93, 65, /* 0x1650 */
92, 65, 93, 65, 94, 65, 95, 72,139,117,248, 72,139,125, 16,139, /* 0x1660 */
75, 4, 72, 1,206,139, 19, 72, 1,215,201, 89, 72,137,240, 72, /* 0x1670 */
41,200, 90, 72, 41,215, 89,137, 57, 91, 93,195,104, 30, 0, 0, /* 0x1680 */
0, 90,232, 0, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, 67, /* 0x1690 */
124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105,108, /* 0x16a0 */
101,100, 46, 10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106,127, /* 0x16b0 */
95,106, 60, 88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90,190, /* 0x16c0 */
0, 0, 0, 0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, 5, /* 0x16d0 */
57,199, 15,133, 0, 0, 0, 0,104, 0, 0, 0, 0,104, 0, 0, /* 0x16e0 */
0, 0,190, 0, 0, 0, 0,104, 0, 0, 0, 0,185, 0, 0, 0, /* 0x16f0 */
0,104, 0, 0, 0, 0, 65, 87,137,250, 41,242, 1,213, 1,211, /* 0x1700 */
252,243, 72,165,151,137,222, 80,146,173, 80, 72,137,225,173,151, /* 0x1710 */
173, 68, 15,182,192,135,254,255,213, 89,195, 93, 68,139,125,247, /* 0x1720 */
65,129,239,200, 0, 0, 0,232,138,255,255,255, 0, 46,115,121, /* 0x1730 */
109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104, /* 0x1740 */
115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 69, 76, 70, 77, /* 0x1750 */
65, 73, 78, 88, 0, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 0, /* 0x1760 */
46,114,101,108, 97, 78, 82, 86, 50, 69, 0, 46,114,101,108, 97, /* 0x1770 */
78, 82, 86, 50, 66, 0, 46,114,101,108, 97, 76, 90, 77, 65, 95, /* 0x1780 */
69, 76, 70, 48, 48, 0, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, /* 0x1790 */
0, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 0, 76, 90, 77, 65, /* 0x17a0 */
95, 68, 69, 67, 51, 48, 0, 46,114,101,108, 97, 69, 76, 70, 77, /* 0x17b0 */
65, 73, 78, 89, 0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, /* 0x17c0 */
78, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17f0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1800 */
0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, /* 0x1810 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1820 */
64, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, /* 0x1830 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1840 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, /* 0x1850 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1860 */
232, 30, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1870 */
18, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1880 */
24, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, /* 0x1890 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18a0 */
80, 0, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, /* 0x18b0 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x18c0 */
0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 1, 0, 0, 0, /* 0x18d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18e0 */
192, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, /* 0x18f0 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1900 */
0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, /* 0x1910 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1920 */
0, 31, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, /* 0x1930 */
18, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1940 */
24, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 1, 0, 0, 0, /* 0x1950 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1960 */
128, 1, 0, 0, 0, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, /* 0x1970 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1980 */
0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 4, 0, 0, 0, /* 0x1990 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x19a0 */
48, 31, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, /* 0x19b0 */
18, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x19c0 */
24, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 1, 0, 0, 0, /* 0x19d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x19e0 */
21, 2, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, /* 0x19f0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1a00 */
0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, 0, 0, 0, /* 0x1a10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a20 */
96, 31, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1a30 */
18, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1a40 */
24, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 1, 0, 0, 0, /* 0x1a50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a60 */
121, 2, 0, 0, 0, 0, 0, 0,247, 9, 0, 0, 0, 0, 0, 0, /* 0x1a70 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1a80 */
0, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, 0, 1, 0, 0, 0, /* 0x1a90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1aa0 */
112, 12, 0, 0, 0, 0, 0, 0,247, 9, 0, 0, 0, 0, 0, 0, /* 0x1ab0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1ac0 */
0, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 1, 0, 0, 0, /* 0x1ad0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ae0 */
103, 22, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, /* 0x1af0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1b00 */
0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, /* 0x1b10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1b20 */
123, 22, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, /* 0x1b30 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1b40 */
0, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 4, 0, 0, 0, /* 0x1b50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1b60 */
120, 31, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1b70 */
18, 0, 0, 0, 13, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1b80 */
24, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 1, 0, 0, 0, /* 0x1b90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ba0 */
181, 22, 0, 0, 0, 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, /* 0x1bb0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1bc0 */
0, 0, 0, 0, 0, 0, 0, 0,137, 0, 0, 0, 4, 0, 0, 0, /* 0x1bd0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1be0 */
144, 31, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, /* 0x1bf0 */
18, 0, 0, 0, 15, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1c00 */
24, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x1c10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1c20 */
60, 23, 0, 0, 0, 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, /* 0x1c30 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1c40 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, /* 0x1c50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1c60 */
216, 28, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, /* 0x1c70 */
19, 0, 0, 0, 11, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x1c80 */
24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x1c90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ca0 */
184, 30, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, /* 0x1cb0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1cc0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1cd0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ce0 */
0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1cf0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 12, 0, /* 0x1d00 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d10 */
0, 0, 0, 0, 3, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 15, 0, /* 0x1d30 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d40 */
0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, /* 0x1d60 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d70 */
0, 0, 0, 0, 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1d80 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 8, 0, /* 0x1d90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1da0 */
0, 0, 0, 0, 3, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1db0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 11, 0, /* 0x1dc0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1dd0 */
1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1de0 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, /* 0x1df0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e00 */
13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e10 */
0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 16, 0, 0, 0, /* 0x1e20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e30 */
23, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e40 */
0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 16, 0, 0, 0, /* 0x1e50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e60 */
33, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e70 */
0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 16, 0, 0, 0, /* 0x1e80 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1e90 */
43, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ea0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x1eb0 */
65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x1ec0 */
68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x1ed0 */
84, 67, 0, 65, 68, 82, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x1ee0 */
2, 0, 0, 0, 4, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, /* 0x1ef0 */
179, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x1f00 */
38, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, /* 0x1f10 */
2, 0, 0, 0, 3, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x1f20 */
143, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x1f30 */
38, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, /* 0x1f40 */
2, 0, 0, 0, 3, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x1f50 */
6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, /* 0x1f60 */
16, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x1f70 */
2, 0, 0, 0, 4, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x1f80 */
19, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, /* 0x1f90 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, /* 0x1fa0 */
10, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1fb0 */
52, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, /* 0x1fc0 */
0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, /* 0x1fd0 */
10, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1fe0 */
62, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 16, 0, 0, 0, /* 0x1ff0 */
0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, /* 0x2000 */
10, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x2010 */
72, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 18, 0, 0, 0, /* 0x2020 */
0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, /* 0x2030 */
10, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x2040 */
47, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, /* 0x2050 */
13, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x2060 */
54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x2070 */
114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x2080 */
32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x2090 */
54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x20a0 */
73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x20b0 */
32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x20c0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x20d0 */
65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x20e0 */
70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x20f0 */
70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, /* 0x2100 */
78, 88, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48,100, /* 0x2110 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2120 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2130 */
48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x2140 */
50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x2150 */
82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x2160 */
32, 32, 49, 32, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 32, 32, /* 0x2170 */
32, 32, 48, 48, 48, 48, 48, 48, 54, 98, 32, 32, 48, 48, 48, 48, /* 0x2180 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x2190 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x21a0 */
48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 51, 32, 32, /* 0x21b0 */
67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, /* 0x21c0 */
76, 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, /* 0x21d0 */
32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 98, 99, 32, 32, 48, /* 0x21e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x21f0 */
32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2200 */
48, 32, 32, 48, 48, 48, 48, 48, 48, 99, 48, 32, 32, 50, 42, 42, /* 0x2210 */
51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, /* 0x2220 */
79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, /* 0x2230 */
32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, /* 0x2240 */
48, 48, 48, 48, 48, 57, 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, /* 0x2250 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x2260 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x2270 */
48, 48, 49, 56, 48, 32, 32, 50, 42, 42, 51, 32, 32, 67, 79, 78, /* 0x2280 */
84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, /* 0x2290 */
65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 76, 90, 77, 65, 95, /* 0x22a0 */
69, 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 54, /* 0x22b0 */
52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x22c0 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x22d0 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 49, 53, 32, /* 0x22e0 */
32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, /* 0x22f0 */
32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, /* 0x2300 */
10, 32, 32, 53, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, /* 0x2310 */
32, 32, 32, 48, 48, 48, 48, 48, 57,102, 55, 32, 32, 48, 48, 48, /* 0x2320 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x2330 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2340 */
32, 48, 48, 48, 48, 48, 50, 55, 57, 32, 32, 50, 42, 42, 48, 32, /* 0x2350 */
32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, /* 0x2360 */
78, 76, 89, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2370 */
50, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 57,102, 55, 32, 32, /* 0x2380 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2390 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x23a0 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 99, 55, 48, 32, 32, 50, 42, /* 0x23b0 */
42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x23c0 */
65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, /* 0x23d0 */
68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, /* 0x23e0 */
52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x23f0 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2400 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 54, 54, 55, 32, /* 0x2410 */
32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, /* 0x2420 */
32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, 32, 69, 76, /* 0x2430 */
70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, /* 0x2440 */
48, 48, 51, 97, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2450 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2460 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 54, /* 0x2470 */
55, 98, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, /* 0x2480 */
84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, /* 0x2490 */
78, 76, 89, 10, 32, 32, 57, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x24a0 */
32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 56, 55, 32, 32, /* 0x24b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x24c0 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x24d0 */
48, 48, 32, 32, 48, 48, 48, 48, 49, 54, 98, 53, 32, 32, 50, 42, /* 0x24e0 */
42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x24f0 */
76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, /* 0x2500 */
77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, /* 0x2510 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2520 */
32, 32,100, 32, 32, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 9, /* 0x2530 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2540 */
32, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 10, 48, 48, 48, 48, /* 0x2550 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2560 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 9, /* 0x2570 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2580 */
32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, /* 0x2590 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x25a0 */
32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48, /* 0x25b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, /* 0x25c0 */
76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x25d0 */
48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x25e0 */
32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, /* 0x25f0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, /* 0x2600 */
73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2610 */
48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, /* 0x2620 */
77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2630 */
48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, /* 0x2640 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2650 */
32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, /* 0x2660 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2670 */
78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2680 */
48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, /* 0x2690 */
82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x26a0 */
48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, /* 0x26b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x26c0 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, /* 0x26d0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x26e0 */
32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, /* 0x26f0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2700 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, /* 0x2710 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2720 */
32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, /* 0x2730 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2740 */
32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, /* 0x2750 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2760 */
32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, /* 0x2770 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, /* 0x2780 */
32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, /* 0x2790 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95, /* 0x27a0 */
115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x27b0 */
48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, /* 0x27c0 */
85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x27d0 */
48, 48, 48, 48, 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, /* 0x27e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, /* 0x27f0 */
32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, /* 0x2800 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 77, 10, /* 0x2810 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2820 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, /* 0x2830 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2840 */
74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2850 */
48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, /* 0x2860 */
78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2870 */
48, 48, 48, 48, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, /* 0x2880 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x2890 */
32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x28a0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, 10, 48, /* 0x28b0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x28c0 */
32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, /* 0x28d0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x28e0 */
69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x28f0 */
48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x2900 */
68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2910 */
48, 48, 48, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2920 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x2930 */
32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2940 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 88, 10, 10, 10, /* 0x2950 */
82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x2960 */
68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x2970 */
93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, /* 0x2980 */
32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2990 */
32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, /* 0x29a0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 32, 82, 95, /* 0x29b0 */
88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, /* 0x29c0 */
69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48, 48, /* 0x29d0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 50, 10, 10, 10, 82, 69, /* 0x29e0 */
76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, /* 0x29f0 */
32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, /* 0x2a00 */
70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, /* 0x2a10 */
89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2a20 */
32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2a30 */
48, 48, 48, 48, 48, 48, 98, 51, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x2a40 */
52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 78, 82, 86, 95, 67, /* 0x2a50 */
79, 77, 77, 79, 78, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2a60 */
48, 48, 48, 48, 48, 48, 50, 54, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2a70 */
48, 48, 48, 48, 48, 48, 48, 54, 48, 32, 82, 95, 88, 56, 54, 95, /* 0x2a80 */
54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x2a90 */
65, 73, 78, 89, 43, 48,120,102,102,102,102,102,102,102,102,102, /* 0x2aa0 */
102,102,102,102,102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x2ab0 */
84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x2ac0 */
32, 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, 70, 70, 83, 69, 84, /* 0x2ad0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, /* 0x2ae0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, /* 0x2af0 */
85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2b00 */
48, 48, 56,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, /* 0x2b10 */
51, 50, 32, 32, 32, 32, 32, 78, 82, 86, 95, 67, 79, 77, 77, 79, /* 0x2b20 */
78, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2b30 */
48, 48, 50, 54, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2b40 */
48, 48, 48, 53, 55, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x2b50 */
67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x2b60 */
43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x2b70 */
102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x2b80 */
32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, /* 0x2b90 */
77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, /* 0x2ba0 */
84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, /* 0x2bb0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, /* 0x2bc0 */
76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2bd0 */
48, 48, 48, 48, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x2be0 */
67, 51, 50, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2bf0 */
51, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2c00 */
48, 48, 48, 49, 48, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, /* 0x2c10 */
79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, /* 0x2c20 */
69, 76, 70, 77, 65, 73, 78, 89, 93, 58, 10, 79, 70, 70, 83, 69, /* 0x2c30 */
84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, /* 0x2c40 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, /* 0x2c50 */
76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2c60 */
48, 48, 48, 49, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x2c70 */
67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, /* 0x2c80 */
43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x2c90 */
102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x2ca0 */
32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, /* 0x2cb0 */
70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x2cc0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x2cd0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x2ce0 */
69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2cf0 */
48, 49, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2d00 */
32, 32, 32, 32, 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, /* 0x2d10 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 98, 32, 82, 95, 88, 56, /* 0x2d20 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, /* 0x2d30 */
78, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2d40 */
48, 51, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2d50 */
32, 32, 32, 32, 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, /* 0x2d60 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 57, 32, 82, 95, 88, 56, /* 0x2d70 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, /* 0x2d80 */
82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2d90 */
48, 51,101, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2da0 */
32, 32, 32, 32, 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, /* 0x2db0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 51, 32, 82, 95, 88, 56, /* 0x2dc0 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, /* 0x2dd0 */
78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2de0 */
48, 52, 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, /* 0x2df0 */
32, 32, 32, 32, 32, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, /* 0x2e00 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 52,100, 32, 82, 95, 88, 56, /* 0x2e10 */
54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, /* 0x2e20 */
82, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2e30 */
48, 50,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, /* 0x2e40 */
50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 43, 48, /* 0x2e50 */
120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2e60 */
100, 10, 10, 10 /* 0x2e70 */
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
/* i386-linux.elf.interp-fold.h -- created from i386-linux.elf.interp-fold.bin, 1531 (0x5fb) bytes
/* i386-linux.elf.interp-fold.h -- created from i386-linux.elf.interp-fold.bin, 1519 (0x5ef) bytes
This file is part of the UPX executable compressor.
@ -27,105 +27,104 @@
*/
#define LINUX_I386PTI_FOLD_SIZE 1531
#define LINUX_I386PTI_FOLD_ADLER32 0x54fe990e
#define LINUX_I386PTI_FOLD_CRC32 0xa290f522
#define LINUX_I386PTI_FOLD_SIZE 1519
#define LINUX_I386PTI_FOLD_ADLER32 0xe82498de
#define LINUX_I386PTI_FOLD_CRC32 0xd7e223de
unsigned char linux_i386pti_fold[1531] = {
unsigned char linux_i386pti_fold[1519] = {
127, 69, 76, 70, 1, 1, 1, 0, 76,105,110,117,120, 0, 0, 0, /* 0x 0 */
2, 0, 3, 0, 1, 0, 0, 0,128, 0, 1, 0, 52, 0, 0, 0, /* 0x 10 */
2, 0, 3, 0, 1, 0, 0, 0,116, 0, 1, 0, 52, 0, 0, 0, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 32, 0, 2, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 0x 30 */
0, 0, 1, 0,251, 5, 0, 0,252, 5, 0, 0, 5, 0, 0, 0, /* 0x 40 */
0, 16, 0, 0, 1, 0, 0, 0,251, 5, 0, 0, 0, 0, 0, 0, /* 0x 50 */
0, 0, 1, 0,239, 5, 0, 0,240, 5, 0, 0, 5, 0, 0, 0, /* 0x 40 */
0, 16, 0, 0, 1, 0, 0, 0,239, 5, 0, 0, 0, 0, 0, 0, /* 0x 50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 60 */
0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */
93, 89, 88,141,124,132, 4, 80, 41,192,175,117,253,175,137,254, /* 0x 80 */
139, 6,131,248, 3,116, 8,131,198, 8,131,248, 0,117,241,139, /* 0x 90 */
94, 4, 83,129,236, 0, 10, 0, 0,137,226, 81,141, 67, 88,139, /* 0x a0 */
115, 24, 41,198,139, 24,139, 72, 4,131,193, 12, 96,232, 62, 4, /* 0x b0 */
0, 0,129,196, 36, 10, 0, 0, 91, 80,139, 75, 20,139, 91, 8, /* 0x c0 */
184, 91, 0, 0, 0,205,128, 41,192, 41,201, 41,210, 41,219, 41, /* 0x d0 */
237, 41,246, 41,255,195, 83,141, 92, 36, 8,106, 90, 88,205,128, /* 0x e0 */
91,195, 0, 0, 87, 86,137,206, 83,137,195, 57, 8,139,120, 4, /* 0x f0 */
115, 10,106,127, 91,106, 1, 88,205,128,235,254,133,201,116, 8, /* 0x 100 */
138, 7, 71,136, 2, 66,226,248, 1,115, 4, 41, 51, 91, 94, 95, /* 0x 110 */
195, 85,137,229, 87, 86,137,198, 83,137,211,131,236, 20,139,125, /* 0x 120 */
12,131, 58, 0, 15,132,185, 0, 0, 0,141, 85,228,185, 12, 0, /* 0x 130 */
0, 0,137,240,232,171,255,255,255,139, 69,228,139, 77,232,133, /* 0x 140 */
192,117, 19,129,249, 85, 80, 88, 33,117, 15,131, 62, 0, 15,132, /* 0x 150 */
143, 0, 0, 0,235, 4,133,201,117, 10,106,127, 91,106, 1, 88, /* 0x 160 */
205,128,235,254, 57,193,119,242, 59, 3,119,238, 57,193,115, 86, /* 0x 170 */
137, 69,224, 15,182, 69,236, 80,255, 85, 8, 90,141, 85,224,255, /* 0x 180 */
117,236, 82,255,115, 4,255,117,232,255,118, 4,255, 16,131,196, /* 0x 190 */
20,133,192,117,197,139, 69,228, 57, 69,224,117,189,138, 69,237, /* 0x 1a0 */
132,192,116, 24, 15,182,192, 80,255,215, 15,182, 85,238,137, 20, /* 0x 1b0 */
36,255,117,224,255,115, 4,255, 16,131,196, 12,139, 69,232, 1, /* 0x 1c0 */
70, 4, 41, 6,235, 10,139, 83, 4,137,240,232, 20,255,255,255, /* 0x 1d0 */
139, 85,228,139, 3, 1, 83, 4, 41,208,133,192,137, 3,233, 65, /* 0x 1e0 */
255,255,255,141,101,244, 91, 94, 95,201,195,133,210,137,209,116, /* 0x 1f0 */
6,198, 0, 0, 64,226,250,195,133,192, 83,137,211,116, 29,168, /* 0x 200 */
1,117, 25,139, 16, 57,218,116, 7, 74,117, 11,133,219,116, 7, /* 0x 210 */
137, 24,137, 72, 4,235, 5,131,192, 8,235,231, 91,195, 85,137, /* 0x 220 */
229, 87, 86, 83,131,236, 84,137, 69,228,139, 69, 8,137, 85,224, /* 0x 230 */
139, 77, 16,137, 69,220, 3, 64, 28,139, 93,220,137, 77,212,139, /* 0x 240 */
85, 12,137, 69,208, 49,192,102,131,123, 16, 3,137, 85,216, 15, /* 0x 250 */
183, 75, 44,139, 85,208, 15,149,192,131,206,255,193,224, 4,131, /* 0x 260 */
192, 34, 49,219,137, 69,184,137,200, 49,255, 72,120, 31,131, 58, /* 0x 270 */
1,117, 21,139, 66, 8, 57,240,115, 5,137,198,139,122, 16, 3, /* 0x 280 */
66, 20, 57,195,115, 2,137,195,131,194, 32,226,225,137,240,129, /* 0x 290 */
230, 0,240,255,255,106, 0, 41,243,106, 0, 37,255, 15, 0, 0, /* 0x 2a0 */
137,117,188,141,179,255, 15, 0, 0,255,117,184,129,230, 0,240, /* 0x 2b0 */
255,255,106, 7, 86,255,117,188,141,188, 7,255, 15, 0, 0,232, /* 0x 2c0 */
18,254,255,255,129,231, 0,240,255,255,137,194,137,195, 1,242, /* 0x 2d0 */
41,254,131,196, 24,137, 69,172,137, 85,240, 1,251,137,241,106, /* 0x 2e0 */
91, 88,205,128,139, 69,220,199, 69,196, 0, 0, 0, 0,139, 93, /* 0x 2f0 */
172, 43, 93,188,102,131,120, 44, 0,137, 93,204, 15,132,180, 1, /* 0x 300 */
0, 0,139, 85,208,139, 2,131,248, 6,117, 24,139, 77,204, 3, /* 0x 310 */
74, 8,186, 3, 0, 0, 0,139, 69,212,232,217,254,255,255,233, /* 0x 320 */
123, 1, 0, 0, 72, 15,133,116, 1, 0, 0,139, 93,208,199, 69, /* 0x 330 */
192, 64, 98, 81,115,139, 75, 24,139, 67, 8,131,225, 7,139, 83, /* 0x 340 */
16,193,225, 2,137, 69,236,211,109,192,137,193, 3, 75, 20,137, /* 0x 350 */
195,129,227,255, 15, 0, 0,137, 85,232,141, 60, 26,139, 85,204, /* 0x 360 */
41,216,131,101,192, 7, 1,209,141, 52, 16,137, 77,176,139, 77, /* 0x 370 */
208,139, 65, 4, 41,216,131,125,216, 1, 80,255,117,228, 25,192, /* 0x 380 */
131,224,224,131,192, 50,131,125,216, 0, 80,137,248,106, 3,116, /* 0x 390 */
3,141, 71, 3, 80, 86,232, 59,253,255,255,131,196, 24, 57,198, /* 0x 3a0 */
15,133,170, 0, 0, 0,131,125,216, 0,116, 19,255,117,224,255, /* 0x 3b0 */
117,228,139, 69,216,141, 85,232,232, 84,253,255,255, 89, 88,137, /* 0x 3c0 */
218,137,251,137,240,247,219,232, 31,254,255,255,129,227,255, 15, /* 0x 3d0 */
0, 0,141, 4, 62,137,218,137, 93,180,232, 12,254,255,255,131, /* 0x 3e0 */
125,216, 0,116, 91,139, 69,208,131, 56, 1,117, 83,246, 64, 24, /* 0x 3f0 */
1,116, 77,139, 93,208,137,194,139, 64, 20, 59, 67, 16,139, 82, /* 0x 400 */
8,141, 12, 16,117, 14,137,200,247,216, 37,255, 15, 0, 0,131, /* 0x 410 */
248, 3,119, 12,139, 69,208,141, 74, 12,131,120, 4, 0,117, 15, /* 0x 420 */
139, 1, 61,205,128, 97,195,116, 6,199, 1,205,128, 97,195,133, /* 0x 430 */
201,116, 13,139, 69,212, 49,210,131,224,254,232,184,253,255,255, /* 0x 440 */
137,243,137,249,139, 85,192,106,125, 88,205,128,133,192,116, 10, /* 0x 450 */
106,127, 91,106, 1, 88,205,128,235,254,139, 85,180,141, 4, 23, /* 0x 460 */
141, 28, 6, 59, 93,176,115, 30,106, 0,106, 0,106, 50,255,117, /* 0x 470 */
192, 41, 93,176,255,117,176, 83,232, 89,252,255,255,131,196, 24, /* 0x 480 */
57,195,116, 27,235,202,131,125,216, 0,116, 19,141, 79, 3,129, /* 0x 490 */
225,255, 15, 0, 0,131,249, 3,119, 5,106, 91, 88,205,128,139, /* 0x 4a0 */
77,220,255, 69,196, 15,183, 65, 44,131, 69,208, 32, 57, 69,196, /* 0x 4b0 */
15,140, 76,254,255,255,131,125,216, 0,117, 14,139, 93,228,106, /* 0x 4c0 */
6, 88,205,128,133,192,116, 20,235,134,139, 69,220,102,131,120, /* 0x 4d0 */
16, 3,116, 8,139, 93,240,106, 45, 88,205,128,139, 85,220,139, /* 0x 4e0 */
82, 24, 1, 85,204,139, 69,204,141,101,244, 91, 94, 95,201,195, /* 0x 4f0 */
85,137,229, 87, 86, 83,131,236, 16,141, 85, 24,139,125, 20,255, /* 0x 500 */
117, 40,141, 71, 52,139, 93, 8,255,117, 16,137, 69,240,139,117, /* 0x 510 */
32,141, 69, 32,232,248,251,255,255,139, 85,240,139, 69, 12,139, /* 0x 520 */
74, 8,186, 3, 0, 0, 0,137, 69, 32,137,216,131,193, 52, 41, /* 0x 530 */
117, 36,232,193,252,255,255, 15,183, 79, 42,137,216,186, 4, 0, /* 0x 540 */
0, 0,232,177,252,255,255, 15,183, 79, 44,137,216,186, 5, 0, /* 0x 550 */
0, 0,232,161,252,255,255,139, 79, 24,137,216,186, 9, 0, 0, /* 0x 560 */
0,232,146,252,255,255,141, 69, 32, 83,139, 85, 40, 80,139, 69, /* 0x 570 */
16, 87,232,167,252,255,255,102,139, 79, 44,131,196, 20, 49,210, /* 0x 580 */
102,133,201,137,195,116, 90,139, 69,240,131, 56, 3,117, 70, 49, /* 0x 590 */
201,139, 88, 8,137,202,106, 5, 88,205,128,133,192,137,198,120, /* 0x 5a0 */
21,186, 0, 2, 0, 0,137,195,137,249,106, 3, 88,205,128, 61, /* 0x 5b0 */
0, 2, 0, 0,116, 10,106,127, 91,106, 1, 88,205,128,235,254, /* 0x 5c0 */
106, 0, 49,210,106, 0,137,240, 87,232, 80,252,255,255,131,196, /* 0x 5d0 */
12,137,195,235, 12, 66, 15,183,193,131, 69,240, 32, 57,194,124, /* 0x 5e0 */
166,141,101,244,137,216, 91, 94, 95,201,195 /* 0x 5f0 */
0, 16, 0, 0, 93, 89, 88,141,124,132, 4, 80, 41,192,175,117, /* 0x 70 */
253,175,137,254,139, 6,131,248, 3,116, 8,131,198, 8,131,248, /* 0x 80 */
0,117,241,139, 94, 4, 83,129,236, 0, 10, 0, 0,137,226, 81, /* 0x 90 */
141, 67, 88,139,115, 24, 41,198,139, 24,139, 72, 4,131,193, 12, /* 0x a0 */
96,232, 62, 4, 0, 0,129,196, 36, 10, 0, 0, 91, 80,139, 75, /* 0x b0 */
20,139, 91, 8,184, 91, 0, 0, 0,205,128, 41,192, 41,201, 41, /* 0x c0 */
210, 41,219, 41,237, 41,246, 41,255,195, 83,141, 92, 36, 8,106, /* 0x d0 */
90, 88,205,128, 91,195, 0, 0, 87, 86,137,206, 83,137,195, 57, /* 0x e0 */
8,139,120, 4,115, 10,106,127, 91,106, 1, 88,205,128,235,254, /* 0x f0 */
133,201,116, 8,138, 7, 71,136, 2, 66,226,248, 1,115, 4, 41, /* 0x 100 */
51, 91, 94, 95,195, 85,137,229, 87, 86,137,198, 83,137,211,131, /* 0x 110 */
236, 20,139,125, 12,131, 58, 0, 15,132,185, 0, 0, 0,141, 85, /* 0x 120 */
228,185, 12, 0, 0, 0,137,240,232,171,255,255,255,139, 69,228, /* 0x 130 */
139, 77,232,133,192,117, 19,129,249, 85, 80, 88, 33,117, 15,131, /* 0x 140 */
62, 0, 15,132,143, 0, 0, 0,235, 4,133,201,117, 10,106,127, /* 0x 150 */
91,106, 1, 88,205,128,235,254, 57,193,119,242, 59, 3,119,238, /* 0x 160 */
57,193,115, 86,137, 69,224, 15,182, 69,236, 80,255, 85, 8, 90, /* 0x 170 */
141, 85,224,255,117,236, 82,255,115, 4,255,117,232,255,118, 4, /* 0x 180 */
255, 16,131,196, 20,133,192,117,197,139, 69,228, 57, 69,224,117, /* 0x 190 */
189,138, 69,237,132,192,116, 24, 15,182,192, 80,255,215, 15,182, /* 0x 1a0 */
85,238,137, 20, 36,255,117,224,255,115, 4,255, 16,131,196, 12, /* 0x 1b0 */
139, 69,232, 1, 70, 4, 41, 6,235, 10,139, 83, 4,137,240,232, /* 0x 1c0 */
20,255,255,255,139, 85,228,139, 3, 1, 83, 4, 41,208,133,192, /* 0x 1d0 */
137, 3,233, 65,255,255,255,141,101,244, 91, 94, 95,201,195,133, /* 0x 1e0 */
210,137,209,116, 6,198, 0, 0, 64,226,250,195,133,192, 83,137, /* 0x 1f0 */
211,116, 29,168, 1,117, 25,139, 16, 57,218,116, 7, 74,117, 11, /* 0x 200 */
133,219,116, 7,137, 24,137, 72, 4,235, 5,131,192, 8,235,231, /* 0x 210 */
91,195, 85,137,229, 87, 86, 83,131,236, 84,137, 69,228,139, 69, /* 0x 220 */
8,137, 85,224,139, 77, 16,137, 69,220, 3, 64, 28,139, 93,220, /* 0x 230 */
137, 77,212,139, 85, 12,137, 69,208, 49,192,102,131,123, 16, 3, /* 0x 240 */
137, 85,216, 15,183, 75, 44,139, 85,208, 15,149,192,131,206,255, /* 0x 250 */
193,224, 4,131,192, 34, 49,219,137, 69,184,137,200, 49,255, 72, /* 0x 260 */
120, 31,131, 58, 1,117, 21,139, 66, 8, 57,240,115, 5,137,198, /* 0x 270 */
139,122, 16, 3, 66, 20, 57,195,115, 2,137,195,131,194, 32,226, /* 0x 280 */
225,137,240,129,230, 0,240,255,255,106, 0, 41,243,106, 0, 37, /* 0x 290 */
255, 15, 0, 0,137,117,188,141,179,255, 15, 0, 0,255,117,184, /* 0x 2a0 */
129,230, 0,240,255,255,106, 7, 86,255,117,188,141,188, 7,255, /* 0x 2b0 */
15, 0, 0,232, 18,254,255,255,129,231, 0,240,255,255,137,194, /* 0x 2c0 */
137,195, 1,242, 41,254,131,196, 24,137, 69,172,137, 85,240, 1, /* 0x 2d0 */
251,137,241,106, 91, 88,205,128,139, 69,220,199, 69,196, 0, 0, /* 0x 2e0 */
0, 0,139, 93,172, 43, 93,188,102,131,120, 44, 0,137, 93,204, /* 0x 2f0 */
15,132,180, 1, 0, 0,139, 85,208,139, 2,131,248, 6,117, 24, /* 0x 300 */
139, 77,204, 3, 74, 8,186, 3, 0, 0, 0,139, 69,212,232,217, /* 0x 310 */
254,255,255,233,123, 1, 0, 0, 72, 15,133,116, 1, 0, 0,139, /* 0x 320 */
93,208,199, 69,192, 64, 98, 81,115,139, 75, 24,139, 67, 8,131, /* 0x 330 */
225, 7,139, 83, 16,193,225, 2,137, 69,236,211,109,192,137,193, /* 0x 340 */
3, 75, 20,137,195,129,227,255, 15, 0, 0,137, 85,232,141, 60, /* 0x 350 */
26,139, 85,204, 41,216,131,101,192, 7, 1,209,141, 52, 16,137, /* 0x 360 */
77,176,139, 77,208,139, 65, 4, 41,216,131,125,216, 1, 80,255, /* 0x 370 */
117,228, 25,192,131,224,224,131,192, 50,131,125,216, 0, 80,137, /* 0x 380 */
248,106, 3,116, 3,141, 71, 3, 80, 86,232, 59,253,255,255,131, /* 0x 390 */
196, 24, 57,198, 15,133,170, 0, 0, 0,131,125,216, 0,116, 19, /* 0x 3a0 */
255,117,224,255,117,228,139, 69,216,141, 85,232,232, 84,253,255, /* 0x 3b0 */
255, 89, 88,137,218,137,251,137,240,247,219,232, 31,254,255,255, /* 0x 3c0 */
129,227,255, 15, 0, 0,141, 4, 62,137,218,137, 93,180,232, 12, /* 0x 3d0 */
254,255,255,131,125,216, 0,116, 91,139, 69,208,131, 56, 1,117, /* 0x 3e0 */
83,246, 64, 24, 1,116, 77,139, 93,208,137,194,139, 64, 20, 59, /* 0x 3f0 */
67, 16,139, 82, 8,141, 12, 16,117, 14,137,200,247,216, 37,255, /* 0x 400 */
15, 0, 0,131,248, 3,119, 12,139, 69,208,141, 74, 12,131,120, /* 0x 410 */
4, 0,117, 15,139, 1, 61,205,128, 97,195,116, 6,199, 1,205, /* 0x 420 */
128, 97,195,133,201,116, 13,139, 69,212, 49,210,131,224,254,232, /* 0x 430 */
184,253,255,255,137,243,137,249,139, 85,192,106,125, 88,205,128, /* 0x 440 */
133,192,116, 10,106,127, 91,106, 1, 88,205,128,235,254,139, 85, /* 0x 450 */
180,141, 4, 23,141, 28, 6, 59, 93,176,115, 30,106, 0,106, 0, /* 0x 460 */
106, 50,255,117,192, 41, 93,176,255,117,176, 83,232, 89,252,255, /* 0x 470 */
255,131,196, 24, 57,195,116, 27,235,202,131,125,216, 0,116, 19, /* 0x 480 */
141, 79, 3,129,225,255, 15, 0, 0,131,249, 3,119, 5,106, 91, /* 0x 490 */
88,205,128,139, 77,220,255, 69,196, 15,183, 65, 44,131, 69,208, /* 0x 4a0 */
32, 57, 69,196, 15,140, 76,254,255,255,131,125,216, 0,117, 14, /* 0x 4b0 */
139, 93,228,106, 6, 88,205,128,133,192,116, 20,235,134,139, 69, /* 0x 4c0 */
220,102,131,120, 16, 3,116, 8,139, 93,240,106, 45, 88,205,128, /* 0x 4d0 */
139, 85,220,139, 82, 24, 1, 85,204,139, 69,204,141,101,244, 91, /* 0x 4e0 */
94, 95,201,195, 85,137,229, 87, 86, 83,131,236, 16,141, 85, 24, /* 0x 4f0 */
139,125, 20,255,117, 40,141, 71, 52,139, 93, 8,255,117, 16,137, /* 0x 500 */
69,240,139,117, 32,141, 69, 32,232,248,251,255,255,139, 85,240, /* 0x 510 */
139, 69, 12,139, 74, 8,186, 3, 0, 0, 0,137, 69, 32,137,216, /* 0x 520 */
131,193, 52, 41,117, 36,232,193,252,255,255, 15,183, 79, 42,137, /* 0x 530 */
216,186, 4, 0, 0, 0,232,177,252,255,255, 15,183, 79, 44,137, /* 0x 540 */
216,186, 5, 0, 0, 0,232,161,252,255,255,139, 79, 24,137,216, /* 0x 550 */
186, 9, 0, 0, 0,232,146,252,255,255,141, 69, 32, 83,139, 85, /* 0x 560 */
40, 80,139, 69, 16, 87,232,167,252,255,255,102,139, 79, 44,131, /* 0x 570 */
196, 20, 49,210,102,133,201,137,195,116, 90,139, 69,240,131, 56, /* 0x 580 */
3,117, 70, 49,201,139, 88, 8,137,202,106, 5, 88,205,128,133, /* 0x 590 */
192,137,198,120, 21,186, 0, 2, 0, 0,137,195,137,249,106, 3, /* 0x 5a0 */
88,205,128, 61, 0, 2, 0, 0,116, 10,106,127, 91,106, 1, 88, /* 0x 5b0 */
205,128,235,254,106, 0, 49,210,106, 0,137,240, 87,232, 80,252, /* 0x 5c0 */
255,255,131,196, 12,137,195,235, 12, 66, 15,183,193,131, 69,240, /* 0x 5d0 */
32, 57,194,124,166,141,101,244,137,216, 91, 94, 95,201,195 /* 0x 5e0 */
};

File diff suppressed because it is too large Load Diff

View File

@ -28,8 +28,8 @@
#define LINUX_I386SH_FOLD_SIZE 1194
#define LINUX_I386SH_FOLD_ADLER32 0x63b3f90a
#define LINUX_I386SH_FOLD_CRC32 0xe2bc019d
#define LINUX_I386SH_FOLD_ADLER32 0xbb9cf7de
#define LINUX_I386SH_FOLD_CRC32 0xd5a101a8
unsigned char linux_i386sh_fold[1194] = {
127, 69, 76, 70, 1, 1, 1, 0, 76,105,110,117,120, 0, 0, 0, /* 0x 0 */
@ -42,8 +42,8 @@ unsigned char linux_i386sh_fold[1194] = {
0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */
137,230,129,236, 80, 1, 0, 0,137,231,173,171,133,192,117,250, /* 0x 80 */
173,171,133,192,117,250, 87, 64,106, 82, 89,243,171, 72,171,171, /* 0x 90 */
95,173,133,192,145,173,116, 15,131,249, 42,115,244,137, 76,207, /* 0x a0 */
248,137, 68,207,252,235,234,129,236, 0, 10, 0, 0,147,139, 10, /* 0x b0 */
95,173,133,192,145,173,116, 15,131,249, 42,115,244,137, 76, 57, /* 0x a0 */
248,137, 68, 57,252,235,234,129,236, 0, 10, 0, 0,147,139, 10, /* 0x b0 */
139, 90, 4,137,198, 96,232,123, 2, 0, 0, 89, 80, 97,129,196, /* 0x c0 */
0, 10, 0, 0, 89, 90, 82, 65, 86,131,238, 3,102,199, 6, 45, /* 0x d0 */
99, 65, 86, 65, 82, 81, 87,141,188, 36, 0,245,255,255, 96,137, /* 0x e0 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
/* powerpc-linux.elf-entry.h -- created from powerpc-linux.elf-entry.bin, 604 (0x25c) bytes
/* powerpc-linux.elf-entry.h -- created from powerpc-linux.elf-entry.bin, 9316 (0x2464) bytes
This file is part of the UPX executable compressor.
@ -27,47 +27,592 @@
*/
#define LINUX_ELFPPC32_LOADER_SIZE 604
#define LINUX_ELFPPC32_LOADER_ADLER32 0x0a8bbdb5
#define LINUX_ELFPPC32_LOADER_CRC32 0xcfe347e7
#define LINUX_ELFPPC32_LOADER_SIZE 9316
#define LINUX_ELFPPC32_LOADER_ADLER32 0xf98c7322
#define LINUX_ELFPPC32_LOADER_CRC32 0xfe9cda55
unsigned char linux_elfppc32_loader[604] = {
72, 0, 2, 77,124, 0, 41,236,144,166, 0, 0,124,132, 26, 20, /* 0x 0 */
60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, /* 0x 10 */
57, 64,255,255,125,168, 2,166, 72, 0, 1, 12, 57, 32, 0, 1, /* 0x 20 */
125, 41, 28, 44, 56, 99, 0, 4,124, 9, 0, 64,125, 41, 72, 20, /* 0x 30 */
97, 41, 0, 1, 78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1, /* 0x 40 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255,213, 65,129,255,236, /* 0x 50 */
56,224, 0, 1, 72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21, /* 0x 60 */
65,162,255,189,124,231, 57, 20,125, 41, 72, 21, 65,162,255,177, /* 0x 70 */
124,231, 57, 20,124, 9, 0, 64,125, 41, 74, 20, 65,162,255,161, /* 0x 80 */
65,160,255,216, 57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46, /* 0x 90 */
65,128, 0, 32,140, 67, 0, 1,124,234, 16,249,125, 74, 14,112, /* 0x a0 */
65,130, 0,148,112, 66, 0, 1, 65,162, 0, 80, 72, 0, 0, 20, /* 0x b0 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255,101, 65,161, 0, 60, /* 0x c0 */
57, 0, 0, 1,124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 81, /* 0x d0 */
65,161, 0, 40,125, 41, 72, 21, 65,162,255, 69,125, 8, 65, 20, /* 0x e0 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 53, 65,160,255,232, /* 0x f0 */
57, 8, 0, 2, 72, 0, 0, 16,125, 41, 72, 21, 65,162,255, 33, /* 0x 100 */
125, 8, 65, 20, 32,234,250,255, 57, 8, 0, 2,125, 8, 1,148, /* 0x 110 */
124,234, 42, 20,125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, /* 0x 120 */
66, 0,255,248, 56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, /* 0x 130 */
75,255,255, 16,128, 6, 0, 0,125,168, 3,166, 56,165, 0, 1, /* 0x 140 */
56, 99, 0, 1,124,160, 40, 80,124,100, 24, 80,144,166, 0, 0, /* 0x 150 */
78,128, 0, 32, 10, 36, 73,100, 58, 32, 85, 80, 88, 32, 40, 67, /* 0x 160 */
41, 32, 49, 57, 57, 54, 45, 50, 48, 48, 54, 32,116,104,101, 32, /* 0x 170 */
85, 80, 88, 32, 84,101, 97,109, 46, 32, 65,108,108, 32, 82,105, /* 0x 180 */
103,104,116,115, 32, 82,101,115,101,114,118,101,100, 46, 32,104, /* 0x 190 */
116,116,112, 58, 47, 47,117,112,120, 46,115,102, 46,110,101,116, /* 0x 1a0 */
32, 36, 10, 0, 72, 0, 0, 37, 80, 82, 79, 84, 95, 69, 88, 69, /* 0x 1b0 */
67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, /* 0x 1c0 */
108,101,100, 46, 10, 0, 0, 0, 56,160, 0, 32,124,136, 2,166, /* 0x 1d0 */
56, 96, 0, 2, 56, 0, 0, 4, 68, 0, 0, 2, 56, 96, 0,127, /* 0x 1e0 */
56, 0, 0, 1, 68, 0, 0, 2,127,200, 2,166, 57, 0, 0, 0, /* 0x 1f0 */
56,224,255,255,128,126, 0, 4, 56,192, 0, 50, 56,160, 0, 7, /* 0x 200 */
56,128, 16, 0,124, 99,242, 20, 56, 0, 0, 90, 56, 99, 16, 11, /* 0x 210 */
84, 99, 0, 38, 68, 0, 0, 2, 65,163,255,140,127,233, 3,166, /* 0x 220 */
136,254, 0, 8, 56,193, 0,124,124,101, 27,120,124,104, 3,166, /* 0x 230 */
128,158, 0, 4, 56,126, 0, 12, 78,128, 4, 32,148, 33,255,128, /* 0x 240 */
188, 65, 0, 4,127,232, 2,166, 75,255,255,161 /* 0x 250 */
unsigned char linux_elfppc32_loader[9316] = {
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, 23,160, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, /* 0x 20 */
0, 20, 0, 17, 72, 0, 0,125,124, 0, 41,236,125,168, 2,166, /* 0x 30 */
40, 7, 0, 8, 64,130, 1, 60,144,166, 0, 0,124,132, 26, 20, /* 0x 40 */
60, 0,128, 0, 61, 32,128, 0, 56, 99,255,255, 56,165,255,255, /* 0x 50 */
57, 64,255,255, 72, 0, 1, 12, 57, 32, 0, 1,125, 41, 28, 44, /* 0x 60 */
56, 99, 0, 4,124, 9, 0, 64,125, 41, 72, 20, 97, 41, 0, 1, /* 0x 70 */
78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1,124, 9, 0, 64, /* 0x 80 */
125, 41, 74, 20, 65,162,255,213, 65,129,255,236, 56,224, 0, 1, /* 0x 90 */
72, 0, 0, 20, 56,231,255,255,125, 41, 72, 21, 65,162,255,189, /* 0x a0 */
124,231, 57, 20,125, 41, 72, 21, 65,162,255,177,124,231, 57, 20, /* 0x b0 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255,161, 65,160,255,216, /* 0x c0 */
57, 0, 0, 0, 52,231,255,253, 84,231, 64, 46, 65,128, 0, 32, /* 0x d0 */
140, 67, 0, 1,124,234, 16,249,125, 74, 14,112, 65,130, 0, 0, /* 0x e0 */
112, 66, 0, 1, 65,162, 0, 80, 72, 0, 0, 20,124, 9, 0, 64, /* 0x f0 */
125, 41, 74, 20, 65,162,255,101, 65,161, 0, 60, 57, 0, 0, 1, /* 0x 100 */
124, 9, 0, 64,125, 41, 74, 20, 65,162,255, 81, 65,161, 0, 40, /* 0x 110 */
125, 41, 72, 21, 65,162,255, 69,125, 8, 65, 20,124, 9, 0, 64, /* 0x 120 */
125, 41, 74, 20, 65,162,255, 53, 65,160,255,232, 57, 8, 0, 2, /* 0x 130 */
72, 0, 0, 16,125, 41, 72, 21, 65,162,255, 33,125, 8, 65, 20, /* 0x 140 */
32,234,250,255, 57, 8, 0, 2,125, 8, 1,148,124,234, 42, 20, /* 0x 150 */
125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, 66, 0,255,248, /* 0x 160 */
56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, 75,255,255, 16, /* 0x 170 */
124, 0, 41,236,125,168, 2,166, 40, 7, 0, 2, 64,130, 0,228, /* 0x 180 */
144,166, 0, 0,124,132, 26, 20, 60, 0,128, 0, 61, 32,128, 0, /* 0x 190 */
56, 99,255,255, 56,165,255,255, 57, 64,255,255, 72, 0, 0,180, /* 0x 1a0 */
124, 9, 0, 64,125, 41, 72, 20, 76,162, 0, 32, 57, 32, 0, 1, /* 0x 1b0 */
125, 41, 28, 44, 56, 99, 0, 4,124, 9, 0, 64,125, 41, 73, 20, /* 0x 1c0 */
78,128, 0, 32,141, 3, 0, 1,157, 5, 0, 1, 75,255,255,213, /* 0x 1d0 */
65,129,255,244, 56,224, 0, 1, 75,255,255,201,124,231, 57, 21, /* 0x 1e0 */
75,255,255,193, 65,160,255,244, 52,231,255,253, 57, 0, 0, 0, /* 0x 1f0 */
65,128, 0, 20,140, 67, 0, 1, 84,231, 64, 46,124,234, 16,249, /* 0x 200 */
65,130, 0, 0, 75,255,255,157,125, 8, 65, 21, 75,255,255,149, /* 0x 210 */
125, 8, 65, 21, 56,224, 0, 1, 64,130, 0, 28, 56,224, 0, 3, /* 0x 220 */
57, 0, 0, 1, 75,255,255,125,125, 8, 65, 21, 75,255,255,117, /* 0x 230 */
65,160,255,244, 32, 74,242,255,125, 8, 57, 20,124,234, 42, 20, /* 0x 240 */
125, 9, 3,166,141, 7, 0, 1,157, 5, 0, 1, 66, 0,255,248, /* 0x 250 */
56,224, 1, 0,124, 7, 41,236,124, 7, 26, 44, 75,255,255,112, /* 0x 260 */
124,128, 0, 8, 40, 7, 0, 14, 64,130, 0, 12,124, 8, 2,166, /* 0x 270 */
129, 6, 0, 0,124,167, 43,120, 56,164,255,254, 56,131, 0, 2, /* 0x 280 */
144, 1, 0, 4,136, 3, 0, 0, 84, 11,232,254, 84, 2, 7,126, /* 0x 290 */
56, 96,250, 0,124, 99, 88, 48, 56, 99,241,128,124, 38, 11,120, /* 0x 2a0 */
124, 33, 26, 20, 84, 33, 0, 52,124,195, 51,120, 56, 0, 0, 0, /* 0x 2b0 */
148, 3,255,252,124, 1, 24, 64, 65,128,255,248,144,193, 0, 0, /* 0x 2c0 */
136, 4,255,255, 57, 33, 0, 8, 56,193, 0, 12, 56, 97, 0, 16, /* 0x 2d0 */
84, 11,225, 62, 84, 0, 7, 62,152, 67, 0, 2,153, 99, 0, 1, /* 0x 2e0 */
152, 3, 0, 0,124, 8, 2,166,148, 33,255,160,189,193, 0, 24, /* 0x 2f0 */
144, 1, 0,100, 59, 32, 0, 0,137, 67, 0, 2,137, 99, 0, 1, /* 0x 300 */
138, 67, 0, 0,147, 38, 0, 0,147, 41, 0, 0,136, 3, 0, 1, /* 0x 310 */
125, 40, 3,166,124, 18, 2, 20, 57, 32, 3, 0,125, 41, 0, 48, /* 0x 320 */
56, 9, 7, 54,127,153, 0, 64, 57, 32, 0, 1,125, 43, 88, 48, /* 0x 330 */
125, 41, 80, 48, 57, 41,255,255, 57,107,255,255,145, 33, 0, 8, /* 0x 340 */
124,206, 51,120,124,147, 35,120,124,245, 59,120,125, 20, 67,120, /* 0x 350 */
145, 97, 0, 12, 59, 3, 0, 4, 59,224, 0, 0, 58,224, 0, 0, /* 0x 360 */
59, 64, 0, 1, 58, 32, 0, 1, 58, 0, 0, 1, 57,224, 0, 1, /* 0x 370 */
57, 32, 0, 0, 64,156, 0, 28,124, 9, 3,166, 57, 96, 4, 0, /* 0x 380 */
85, 32, 8, 60,125,120, 3, 46, 57, 41, 0, 1, 66, 0,255,244, /* 0x 390 */
127,179, 42, 20,126,108,155,120, 56,160, 0, 0, 57, 0,255,255, /* 0x 3a0 */
57, 96, 0, 0,127,140,232, 0, 57,107, 0, 1, 47, 11, 0, 4, /* 0x 3b0 */
84,169, 64, 46, 65,158, 8,156,136, 12, 0, 0, 57,140, 0, 1, /* 0x 3c0 */
125, 37, 3,120, 64,153,255,224,127,153,160, 64, 64,156, 8,100, /* 0x 3d0 */
62,192, 0,255, 98,214,255,255,128, 1, 0, 8,127,136,176, 64, /* 0x 3e0 */
127, 35, 0, 56, 86,224, 32, 54,124, 0, 26, 20, 84, 6, 8, 60, /* 0x 3f0 */
65,157, 0, 32,127,140,232, 0, 65,158, 8, 88,137, 44, 0, 0, /* 0x 400 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 410 */
124,230,194, 46, 85, 0,170,254,125, 64, 57,214,127,133, 80, 64, /* 0x 420 */
64,156, 1,172,128, 1, 0, 12, 47,151, 0, 6,127, 41, 0, 56, /* 0x 430 */
32, 18, 0, 8,127,224, 6, 48,125, 41,144, 48,125, 41, 2, 20, /* 0x 440 */
29, 41, 6, 0, 32, 7, 8, 0,124, 0, 46,112,124, 7, 2, 20, /* 0x 450 */
125, 56, 74, 20,124, 6,195, 46,125, 72, 83,120, 56,201, 14,108, /* 0x 460 */
56, 96, 0, 1, 64,157, 0,180,124, 26,200, 80, 63, 96, 0,255, /* 0x 470 */
127,245, 0,174, 99,123,255,255, 87,255, 8, 60, 87,252, 5,238, /* 0x 480 */
127,136,216, 64, 87,128, 8, 60, 84,100, 8, 60,124, 6, 2, 20, /* 0x 490 */
127, 12,232, 0, 84,169, 64, 46,124,224, 34, 20, 65,157, 0, 24, /* 0x 4a0 */
65,154, 7,176,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 4b0 */
125, 37, 3,120,161,103, 2, 0, 85, 0,170,254,125, 64, 89,214, /* 0x 4c0 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x 4d0 */
124, 11, 2, 20, 47, 28, 0, 0,125,105, 88, 80,124,131, 35,120, /* 0x 4e0 */
125, 10, 64, 80, 64,156, 0, 20,176, 7, 2, 0,125, 72, 83,120, /* 0x 4f0 */
65,186, 0, 24, 72, 0, 0, 28,177,103, 2, 0,124,170, 40, 80, /* 0x 500 */
56,100, 0, 1, 65,154, 0, 12, 47,131, 0,255, 64,157,255,108, /* 0x 510 */
47,131, 0,255, 65,157, 0,132, 63,224, 0,255, 99,255,255,255, /* 0x 520 */
127,136,248, 64, 84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46, /* 0x 530 */
124,227, 59,120, 65,157, 0, 24, 65,154, 7, 24,136, 12, 0, 0, /* 0x 540 */
85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, /* 0x 550 */
85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64, /* 0x 560 */
124, 0, 46,112, 85,105,217,126,124, 11, 2, 20,125, 10, 64, 80, /* 0x 570 */
125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, /* 0x 580 */
72, 0, 0, 16,124,170, 40, 80,125,102, 59, 46, 56,103, 0, 1, /* 0x 590 */
47,131, 0,255, 64,157,255,140, 47,151, 0, 3, 84,127, 6, 62, /* 0x 5a0 */
127,249,169,174, 59, 57, 0, 1, 65,157, 0, 12, 58,224, 0, 0, /* 0x 5b0 */
72, 0, 6,120, 47,151, 0, 9, 65,157, 0, 12, 58,247,255,253, /* 0x 5c0 */
72, 0, 6,104, 58,247,255,250, 72, 0, 6, 96,125, 10, 64, 80, /* 0x 5d0 */
127,136,176, 64, 84,224,217,126,124, 0, 56, 80, 86,233, 8, 60, /* 0x 5e0 */
124, 6,195, 46,124,170, 40, 80,124,248, 74, 20, 65,157, 0, 32, /* 0x 5f0 */
127,140,232, 0, 65,158, 6, 92,137, 44, 0, 0, 84,160, 64, 46, /* 0x 600 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,128, /* 0x 610 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 64, /* 0x 620 */
32, 11, 8, 0, 47,151, 0, 6,124, 0, 46,112,124, 11, 2, 20, /* 0x 630 */
176, 7, 1,128,126, 15,131,120,125, 72, 83,120,126, 48,139,120, /* 0x 640 */
56, 0, 0, 0,127, 81,211,120, 64,157, 0, 8, 56, 0, 0, 3, /* 0x 650 */
124, 23, 3,120, 56,216, 6,100, 72, 0, 2, 24,125, 10, 64, 80, /* 0x 660 */
127,136,176, 64, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x 670 */
176, 7, 1,128, 65,157, 0, 32,127,140,232, 0, 65,158, 5,212, /* 0x 680 */
137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x 690 */
57,140, 0, 1,161,103, 1,152, 85, 0,170,254,125, 64, 89,214, /* 0x 6a0 */
127,133, 80, 64, 64,156, 0,188, 32, 11, 8, 0,127,138,176, 64, /* 0x 6b0 */
124, 0, 46,112, 86,233, 40, 52,124, 11, 2, 20,125, 56, 74, 20, /* 0x 6c0 */
84,107, 8, 60,176, 7, 1,152,125, 72, 83,120,124,233, 90, 20, /* 0x 6d0 */
65,157, 0, 32,127,140,232, 0, 65,158, 5,120,137, 44, 0, 0, /* 0x 6e0 */
84,160, 64, 46,124, 5, 75,120, 85, 72, 64, 46, 57,140, 0, 1, /* 0x 6f0 */
161,103, 1,224, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x 700 */
64,156, 0, 72, 32, 11, 8, 0, 47,153, 0, 0,124, 0, 46,112, /* 0x 710 */
124, 11, 2, 20,176, 7, 1,224,125, 72, 83,120, 65,158, 5, 52, /* 0x 720 */
47,151, 0, 6, 57, 32, 0, 9, 64,157, 0, 8, 57, 32, 0, 11, /* 0x 730 */
124, 26,200, 80,127,245, 0,174,125, 55, 75,120,127,249,169,174, /* 0x 740 */
59, 57, 0, 1, 72, 0, 4,228, 85, 96,217,126,124, 0, 88, 80, /* 0x 750 */
124,170, 40, 80,125, 10, 64, 80,176, 7, 1,224, 72, 0, 0,252, /* 0x 760 */
125, 10, 64, 80,127,136,176, 64, 85, 96,217,126,124, 0, 88, 80, /* 0x 770 */
124,170, 40, 80,176, 7, 1,152, 65,157, 0, 32,127,140,232, 0, /* 0x 780 */
65,158, 4,208,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x 790 */
85, 8, 64, 46, 57,140, 0, 1,161,103, 1,176, 85, 0,170,254, /* 0x 7a0 */
125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0, /* 0x 7b0 */
124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120,126, 41,139,120, /* 0x 7c0 */
176, 7, 1,176, 72, 0, 0,140,125, 10, 64, 80,127,136,176, 64, /* 0x 7d0 */
85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,176, /* 0x 7e0 */
65,157, 0, 32,127,140,232, 0, 65,158, 4,104,137, 44, 0, 0, /* 0x 7f0 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x 800 */
161,103, 1,200, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x 810 */
64,156, 0, 32, 32, 11, 8, 0,124, 0, 46,112,124, 11, 2, 20, /* 0x 820 */
125, 72, 83,120,126, 9,131,120,176, 7, 1,200, 72, 0, 0, 32, /* 0x 830 */
85, 96,217,126,124, 0, 88, 80,125,233,123,120,176, 7, 1,200, /* 0x 840 */
124,170, 40, 80,125, 10, 64, 80,126, 15,131,120,126, 48,139,120, /* 0x 850 */
127, 81,211,120,125, 58, 75,120, 47,151, 0, 6, 56, 0, 0, 8, /* 0x 860 */
64,157, 0, 8, 56, 0, 0, 11,124, 23, 3,120, 56,216, 10,104, /* 0x 870 */
127,136,176, 64, 65,157, 0, 32,127,140,232, 0, 65,158, 3,212, /* 0x 880 */
137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x 890 */
57,140, 0, 1,161,102, 0, 0, 85, 0,170,254,125, 64, 89,214, /* 0x 8a0 */
127,133, 80, 64, 64,156, 0, 48, 32, 11, 8, 0, 84,105, 32, 54, /* 0x 8b0 */
125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, /* 0x 8c0 */
56,137, 0, 4, 59,128, 0, 0, 59, 96, 0, 3,176, 6, 0, 0, /* 0x 8d0 */
72, 0, 0,156,125, 10, 64, 80,127,136,176, 64, 85, 96,217,126, /* 0x 8e0 */
124, 0, 88, 80,124,170, 40, 80,176, 6, 0, 0, 65,157, 0, 32, /* 0x 8f0 */
127,140,232, 0, 65,158, 3, 92,137, 44, 0, 0, 84,160, 64, 46, /* 0x 900 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,102, 0, 2, /* 0x 910 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, /* 0x 920 */
32, 11, 8, 0, 84,105, 32, 54,125, 38, 74, 20,124, 0, 46,112, /* 0x 930 */
124, 11, 2, 20,125, 72, 83,120, 56,137, 1, 4, 59,128, 0, 8, /* 0x 940 */
59, 96, 0, 3,176, 6, 0, 2, 72, 0, 0, 36, 85, 96,217,126, /* 0x 950 */
124, 0, 88, 80,124,170, 40, 80,176, 6, 0, 2,125, 10, 64, 80, /* 0x 960 */
56,134, 2, 4, 59,128, 0, 16, 59, 96, 0, 8,127,105, 3,166, /* 0x 970 */
63,224, 0,255, 99,255,255,255, 56, 96, 0, 1,127,136,248, 64, /* 0x 980 */
84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, /* 0x 990 */
65,157, 0, 24, 65,154, 2,188,136, 12, 0, 0, 85, 8, 64, 46, /* 0x 9a0 */
57,140, 0, 1,125, 37, 3,120,125,100, 58, 46, 85, 0,170,254, /* 0x 9b0 */
125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x 9c0 */
85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x 9d0 */
64,156, 0, 16,125, 72, 83,120,124, 4, 59, 46, 72, 0, 0, 16, /* 0x 9e0 */
124,170, 40, 80, 56,103, 0, 1,125,100, 59, 46, 66, 0,255,144, /* 0x 9f0 */
56, 0, 0, 1, 47,151, 0, 3,124, 0,216, 48,124, 96, 24, 80, /* 0x a00 */
124, 99,226, 20, 65,157, 1,232, 47,131, 0, 3, 58,247, 0, 7, /* 0x a10 */
124,105, 27,120, 64,157, 0, 8, 57, 32, 0, 3, 85, 41, 56, 48, /* 0x a20 */
125, 56, 74, 20, 56,201, 3, 96, 57, 32, 0, 6,125, 41, 3,166, /* 0x a30 */
63,224, 0,255, 99,255,255,255, 56,128, 0, 1,127,136,248, 64, /* 0x a40 */
84,135, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,228, 59,120, /* 0x a50 */
65,157, 0, 24, 65,154, 1,252,136, 12, 0, 0, 85, 8, 64, 46, /* 0x a60 */
57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254, /* 0x a70 */
125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x a80 */
85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x a90 */
64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16, /* 0x aa0 */
124,170, 40, 80, 56,135, 0, 1,125,102, 59, 46, 66, 0,255,144, /* 0x ab0 */
56,132,255,192, 47,132, 0, 3,124,154, 35,120, 64,157, 1, 40, /* 0x ac0 */
47,132, 0, 13,124,137, 14,112, 84,128, 7,254, 57,105,255,255, /* 0x ad0 */
96, 26, 0, 2,125,105, 3,166, 65,157, 0, 32,127, 90, 88, 48, /* 0x ae0 */
87, 73, 8, 60,125, 56, 74, 20, 84,128, 8, 60,125, 32, 72, 80, /* 0x af0 */
56,201, 5, 94, 72, 0, 0,100, 57, 41,255,251,125, 41, 3,166, /* 0x b00 */
61, 96, 0,255, 97,107,255,255,127,136, 88, 64,127, 12,232, 0, /* 0x b10 */
84,169, 64, 46, 87, 90, 8, 60, 65,157, 0, 24, 65,154, 1, 52, /* 0x b20 */
136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x b30 */
85, 8,248,126,127,133, 64, 64, 65,156, 0, 12,124,168, 40, 80, /* 0x b40 */
99, 90, 0, 1, 66, 0,255,196, 56, 0, 0, 4,124, 9, 3,166, /* 0x b50 */
87, 90, 32, 54, 56,216, 6, 68, 60,128, 0,255, 96,132,255,255, /* 0x b60 */
59,128, 0, 1, 59,224, 0, 1,127,136, 32, 64, 87,231, 8, 60, /* 0x b70 */
127, 12,232, 0, 84,169, 64, 46,124,255, 59,120, 65,157, 0, 24, /* 0x b80 */
65,154, 0,208,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x b90 */
125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x ba0 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x bb0 */
124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x bc0 */
125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 20,124,170, 40, 80, /* 0x bd0 */
59,231, 0, 1,125,102, 59, 46,127, 90,227,120, 87,156, 8, 60, /* 0x be0 */
66, 0,255,136, 55, 90, 0, 1, 65,130, 0, 72,127,154,200, 64, /* 0x bf0 */
56, 99, 0, 2, 65,157, 0, 92,124, 26,200, 80,127,245, 0,174, /* 0x c00 */
56, 99,255,255,127,249,169,174, 59, 57, 0, 1, 49, 99,255,255, /* 0x c10 */
125, 43, 25, 16,124, 20,200, 16,124, 0, 1, 16,124, 0, 0,208, /* 0x c20 */
125, 43, 0, 57, 64,130,255,212,127,153,160, 64, 65,156,247,172, /* 0x c30 */
60, 0, 0,255, 96, 0,255,255,127,136, 0, 64, 65,157, 0, 32, /* 0x c40 */
127,140,232, 0, 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, /* 0x c50 */
56, 96, 0, 1, 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166, /* 0x c60 */
124, 19, 96, 80,144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0, /* 0x c70 */
128, 1, 0,100,185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96, /* 0x c80 */
124, 8, 2,166,148, 33,255,160,189,193, 0, 24,144, 1, 0,100, /* 0x c90 */
59, 32, 0, 0,137, 67, 0, 2,137, 99, 0, 1,138, 67, 0, 0, /* 0x ca0 */
147, 38, 0, 0,147, 41, 0, 0,136, 3, 0, 1,125, 40, 3,166, /* 0x cb0 */
124, 18, 2, 20, 57, 32, 3, 0,125, 41, 0, 48, 56, 9, 7, 54, /* 0x cc0 */
127,153, 0, 64, 57, 32, 0, 1,125, 43, 88, 48,125, 41, 80, 48, /* 0x cd0 */
57, 41,255,255, 57,107,255,255,145, 33, 0, 8,124,206, 51,120, /* 0x ce0 */
124,147, 35,120,124,245, 59,120,125, 20, 67,120,145, 97, 0, 12, /* 0x cf0 */
59, 3, 0, 4, 59,224, 0, 0, 58,224, 0, 0, 59, 64, 0, 1, /* 0x d00 */
58, 32, 0, 1, 58, 0, 0, 1, 57,224, 0, 1, 57, 32, 0, 0, /* 0x d10 */
64,156, 0, 28,124, 9, 3,166, 57, 96, 4, 0, 85, 32, 8, 60, /* 0x d20 */
125,120, 3, 46, 57, 41, 0, 1, 66, 0,255,244,127,179, 42, 20, /* 0x d30 */
126,108,155,120, 56,160, 0, 0, 57, 0,255,255, 57, 96, 0, 0, /* 0x d40 */
127,140,232, 0, 57,107, 0, 1, 47, 11, 0, 4, 84,169, 64, 46, /* 0x d50 */
65,158, 8,156,136, 12, 0, 0, 57,140, 0, 1,125, 37, 3,120, /* 0x d60 */
64,153,255,224,127,153,160, 64, 64,156, 8,100, 62,192, 0,255, /* 0x d70 */
98,214,255,255,128, 1, 0, 8,127,136,176, 64,127, 35, 0, 56, /* 0x d80 */
86,224, 32, 54,124, 0, 26, 20, 84, 6, 8, 60, 65,157, 0, 32, /* 0x d90 */
127,140,232, 0, 65,158, 8, 88,137, 44, 0, 0, 84,160, 64, 46, /* 0x da0 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,124,230,194, 46, /* 0x db0 */
85, 0,170,254,125, 64, 57,214,127,133, 80, 64, 64,156, 1,172, /* 0x dc0 */
128, 1, 0, 12, 47,151, 0, 6,127, 41, 0, 56, 32, 18, 0, 8, /* 0x dd0 */
127,224, 6, 48,125, 41,144, 48,125, 41, 2, 20, 29, 41, 6, 0, /* 0x de0 */
32, 7, 8, 0,124, 0, 46,112,124, 7, 2, 20,125, 56, 74, 20, /* 0x df0 */
124, 6,195, 46,125, 72, 83,120, 56,201, 14,108, 56, 96, 0, 1, /* 0x e00 */
64,157, 0,180,124, 26,200, 80, 63, 96, 0,255,127,245, 0,174, /* 0x e10 */
99,123,255,255, 87,255, 8, 60, 87,252, 5,238,127,136,216, 64, /* 0x e20 */
87,128, 8, 60, 84,100, 8, 60,124, 6, 2, 20,127, 12,232, 0, /* 0x e30 */
84,169, 64, 46,124,224, 34, 20, 65,157, 0, 24, 65,154, 7,176, /* 0x e40 */
136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x e50 */
161,103, 2, 0, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x e60 */
127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x e70 */
47, 28, 0, 0,125,105, 88, 80,124,131, 35,120,125, 10, 64, 80, /* 0x e80 */
64,156, 0, 20,176, 7, 2, 0,125, 72, 83,120, 65,186, 0, 24, /* 0x e90 */
72, 0, 0, 28,177,103, 2, 0,124,170, 40, 80, 56,100, 0, 1, /* 0x ea0 */
65,154, 0, 12, 47,131, 0,255, 64,157,255,108, 47,131, 0,255, /* 0x eb0 */
65,157, 0,132, 63,224, 0,255, 99,255,255,255,127,136,248, 64, /* 0x ec0 */
84,103, 8, 60,127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, /* 0x ed0 */
65,157, 0, 24, 65,154, 7, 24,136, 12, 0, 0, 85, 8, 64, 46, /* 0x ee0 */
57,140, 0, 1,125, 37, 3,120,125,102, 58, 46, 85, 0,170,254, /* 0x ef0 */
125, 64, 89,214, 32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, /* 0x f00 */
85,105,217,126,124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, /* 0x f10 */
64,156, 0, 16,125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16, /* 0x f20 */
124,170, 40, 80,125,102, 59, 46, 56,103, 0, 1, 47,131, 0,255, /* 0x f30 */
64,157,255,140, 47,151, 0, 3, 84,127, 6, 62,127,249,169,174, /* 0x f40 */
59, 57, 0, 1, 65,157, 0, 12, 58,224, 0, 0, 72, 0, 6,120, /* 0x f50 */
47,151, 0, 9, 65,157, 0, 12, 58,247,255,253, 72, 0, 6,104, /* 0x f60 */
58,247,255,250, 72, 0, 6, 96,125, 10, 64, 80,127,136,176, 64, /* 0x f70 */
84,224,217,126,124, 0, 56, 80, 86,233, 8, 60,124, 6,195, 46, /* 0x f80 */
124,170, 40, 80,124,248, 74, 20, 65,157, 0, 32,127,140,232, 0, /* 0x f90 */
65,158, 6, 92,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x fa0 */
85, 8, 64, 46, 57,140, 0, 1,161,103, 1,128, 85, 0,170,254, /* 0x fb0 */
125, 64, 89,214,127,133, 80, 64, 64,156, 0, 64, 32, 11, 8, 0, /* 0x fc0 */
47,151, 0, 6,124, 0, 46,112,124, 11, 2, 20,176, 7, 1,128, /* 0x fd0 */
126, 15,131,120,125, 72, 83,120,126, 48,139,120, 56, 0, 0, 0, /* 0x fe0 */
127, 81,211,120, 64,157, 0, 8, 56, 0, 0, 3,124, 23, 3,120, /* 0x ff0 */
56,216, 6,100, 72, 0, 2, 24,125, 10, 64, 80,127,136,176, 64, /* 0x1000 */
85, 96,217,126,124, 0, 88, 80,124,170, 40, 80,176, 7, 1,128, /* 0x1010 */
65,157, 0, 32,127,140,232, 0, 65,158, 5,212,137, 44, 0, 0, /* 0x1020 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1030 */
161,103, 1,152, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x1040 */
64,156, 0,188, 32, 11, 8, 0,127,138,176, 64,124, 0, 46,112, /* 0x1050 */
86,233, 40, 52,124, 11, 2, 20,125, 56, 74, 20, 84,107, 8, 60, /* 0x1060 */
176, 7, 1,152,125, 72, 83,120,124,233, 90, 20, 65,157, 0, 32, /* 0x1070 */
127,140,232, 0, 65,158, 5,120,137, 44, 0, 0, 84,160, 64, 46, /* 0x1080 */
124, 5, 75,120, 85, 72, 64, 46, 57,140, 0, 1,161,103, 1,224, /* 0x1090 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 72, /* 0x10a0 */
32, 11, 8, 0, 47,153, 0, 0,124, 0, 46,112,124, 11, 2, 20, /* 0x10b0 */
176, 7, 1,224,125, 72, 83,120, 65,158, 5, 52, 47,151, 0, 6, /* 0x10c0 */
57, 32, 0, 9, 64,157, 0, 8, 57, 32, 0, 11,124, 26,200, 80, /* 0x10d0 */
127,245, 0,174,125, 55, 75,120,127,249,169,174, 59, 57, 0, 1, /* 0x10e0 */
72, 0, 4,228, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x10f0 */
125, 10, 64, 80,176, 7, 1,224, 72, 0, 0,252,125, 10, 64, 80, /* 0x1100 */
127,136,176, 64, 85, 96,217,126,124, 0, 88, 80,124,170, 40, 80, /* 0x1110 */
176, 7, 1,152, 65,157, 0, 32,127,140,232, 0, 65,158, 4,208, /* 0x1120 */
137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, /* 0x1130 */
57,140, 0, 1,161,103, 1,176, 85, 0,170,254,125, 64, 89,214, /* 0x1140 */
127,133, 80, 64, 64,156, 0, 32, 32, 11, 8, 0,124, 0, 46,112, /* 0x1150 */
124, 11, 2, 20,125, 72, 83,120,126, 41,139,120,176, 7, 1,176, /* 0x1160 */
72, 0, 0,140,125, 10, 64, 80,127,136,176, 64, 85, 96,217,126, /* 0x1170 */
124, 0, 88, 80,124,170, 40, 80,176, 7, 1,176, 65,157, 0, 32, /* 0x1180 */
127,140,232, 0, 65,158, 4,104,137, 44, 0, 0, 84,160, 64, 46, /* 0x1190 */
124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1,161,103, 1,200, /* 0x11a0 */
85, 0,170,254,125, 64, 89,214,127,133, 80, 64, 64,156, 0, 32, /* 0x11b0 */
32, 11, 8, 0,124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, /* 0x11c0 */
126, 9,131,120,176, 7, 1,200, 72, 0, 0, 32, 85, 96,217,126, /* 0x11d0 */
124, 0, 88, 80,125,233,123,120,176, 7, 1,200,124,170, 40, 80, /* 0x11e0 */
125, 10, 64, 80,126, 15,131,120,126, 48,139,120,127, 81,211,120, /* 0x11f0 */
125, 58, 75,120, 47,151, 0, 6, 56, 0, 0, 8, 64,157, 0, 8, /* 0x1200 */
56, 0, 0, 11,124, 23, 3,120, 56,216, 10,104,127,136,176, 64, /* 0x1210 */
65,157, 0, 32,127,140,232, 0, 65,158, 3,212,137, 44, 0, 0, /* 0x1220 */
84,160, 64, 46,124, 5, 75,120, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1230 */
161,102, 0, 0, 85, 0,170,254,125, 64, 89,214,127,133, 80, 64, /* 0x1240 */
64,156, 0, 48, 32, 11, 8, 0, 84,105, 32, 54,125, 38, 74, 20, /* 0x1250 */
124, 0, 46,112,124, 11, 2, 20,125, 72, 83,120, 56,137, 0, 4, /* 0x1260 */
59,128, 0, 0, 59, 96, 0, 3,176, 6, 0, 0, 72, 0, 0,156, /* 0x1270 */
125, 10, 64, 80,127,136,176, 64, 85, 96,217,126,124, 0, 88, 80, /* 0x1280 */
124,170, 40, 80,176, 6, 0, 0, 65,157, 0, 32,127,140,232, 0, /* 0x1290 */
65,158, 3, 92,137, 44, 0, 0, 84,160, 64, 46,124, 5, 75,120, /* 0x12a0 */
85, 8, 64, 46, 57,140, 0, 1,161,102, 0, 2, 85, 0,170,254, /* 0x12b0 */
125, 64, 89,214,127,133, 80, 64, 64,156, 0, 48, 32, 11, 8, 0, /* 0x12c0 */
84,105, 32, 54,125, 38, 74, 20,124, 0, 46,112,124, 11, 2, 20, /* 0x12d0 */
125, 72, 83,120, 56,137, 1, 4, 59,128, 0, 8, 59, 96, 0, 3, /* 0x12e0 */
176, 6, 0, 2, 72, 0, 0, 36, 85, 96,217,126,124, 0, 88, 80, /* 0x12f0 */
124,170, 40, 80,176, 6, 0, 2,125, 10, 64, 80, 56,134, 2, 4, /* 0x1300 */
59,128, 0, 16, 59, 96, 0, 8,127,105, 3,166, 63,224, 0,255, /* 0x1310 */
99,255,255,255, 56, 96, 0, 1,127,136,248, 64, 84,103, 8, 60, /* 0x1320 */
127, 12,232, 0, 84,169, 64, 46,124,227, 59,120, 65,157, 0, 24, /* 0x1330 */
65,154, 2,188,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1340 */
125, 37, 3,120,125,100, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x1350 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x1360 */
124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x1370 */
125, 72, 83,120,124, 4, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x1380 */
56,103, 0, 1,125,100, 59, 46, 66, 0,255,144, 56, 0, 0, 1, /* 0x1390 */
47,151, 0, 3,124, 0,216, 48,124, 96, 24, 80,124, 99,226, 20, /* 0x13a0 */
65,157, 1,232, 47,131, 0, 3, 58,247, 0, 7,124,105, 27,120, /* 0x13b0 */
64,157, 0, 8, 57, 32, 0, 3, 85, 41, 56, 48,125, 56, 74, 20, /* 0x13c0 */
56,201, 3, 96, 57, 32, 0, 6,125, 41, 3,166, 63,224, 0,255, /* 0x13d0 */
99,255,255,255, 56,128, 0, 1,127,136,248, 64, 84,135, 8, 60, /* 0x13e0 */
127, 12,232, 0, 84,169, 64, 46,124,228, 59,120, 65,157, 0, 24, /* 0x13f0 */
65,154, 1,252,136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1, /* 0x1400 */
125, 37, 3,120,125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, /* 0x1410 */
32, 11, 8, 0,127,133, 80, 64,124, 0, 46,112, 85,105,217,126, /* 0x1420 */
124, 11, 2, 20,125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16, /* 0x1430 */
125, 72, 83,120,124, 6, 59, 46, 72, 0, 0, 16,124,170, 40, 80, /* 0x1440 */
56,135, 0, 1,125,102, 59, 46, 66, 0,255,144, 56,132,255,192, /* 0x1450 */
47,132, 0, 3,124,154, 35,120, 64,157, 1, 40, 47,132, 0, 13, /* 0x1460 */
124,137, 14,112, 84,128, 7,254, 57,105,255,255, 96, 26, 0, 2, /* 0x1470 */
125,105, 3,166, 65,157, 0, 32,127, 90, 88, 48, 87, 73, 8, 60, /* 0x1480 */
125, 56, 74, 20, 84,128, 8, 60,125, 32, 72, 80, 56,201, 5, 94, /* 0x1490 */
72, 0, 0,100, 57, 41,255,251,125, 41, 3,166, 61, 96, 0,255, /* 0x14a0 */
97,107,255,255,127,136, 88, 64,127, 12,232, 0, 84,169, 64, 46, /* 0x14b0 */
87, 90, 8, 60, 65,157, 0, 24, 65,154, 1, 52,136, 12, 0, 0, /* 0x14c0 */
85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, 85, 8,248,126, /* 0x14d0 */
127,133, 64, 64, 65,156, 0, 12,124,168, 40, 80, 99, 90, 0, 1, /* 0x14e0 */
66, 0,255,196, 56, 0, 0, 4,124, 9, 3,166, 87, 90, 32, 54, /* 0x14f0 */
56,216, 6, 68, 60,128, 0,255, 96,132,255,255, 59,128, 0, 1, /* 0x1500 */
59,224, 0, 1,127,136, 32, 64, 87,231, 8, 60,127, 12,232, 0, /* 0x1510 */
84,169, 64, 46,124,255, 59,120, 65,157, 0, 24, 65,154, 0,208, /* 0x1520 */
136, 12, 0, 0, 85, 8, 64, 46, 57,140, 0, 1,125, 37, 3,120, /* 0x1530 */
125,102, 58, 46, 85, 0,170,254,125, 64, 89,214, 32, 11, 8, 0, /* 0x1540 */
127,133, 80, 64,124, 0, 46,112, 85,105,217,126,124, 11, 2, 20, /* 0x1550 */
125, 10, 64, 80,125,105, 88, 80, 64,156, 0, 16,125, 72, 83,120, /* 0x1560 */
124, 6, 59, 46, 72, 0, 0, 20,124,170, 40, 80, 59,231, 0, 1, /* 0x1570 */
125,102, 59, 46,127, 90,227,120, 87,156, 8, 60, 66, 0,255,136, /* 0x1580 */
55, 90, 0, 1, 65,130, 0, 72,127,154,200, 64, 56, 99, 0, 2, /* 0x1590 */
65,157, 0, 92,124, 26,200, 80,127,245, 0,174, 56, 99,255,255, /* 0x15a0 */
127,249,169,174, 59, 57, 0, 1, 49, 99,255,255,125, 43, 25, 16, /* 0x15b0 */
124, 20,200, 16,124, 0, 1, 16,124, 0, 0,208,125, 43, 0, 57, /* 0x15c0 */
64,130,255,212,127,153,160, 64, 65,156,247,172, 60, 0, 0,255, /* 0x15d0 */
96, 0,255,255,127,136, 0, 64, 65,157, 0, 32,127,140,232, 0, /* 0x15e0 */
56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1, /* 0x15f0 */
72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80, /* 0x1600 */
144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100, /* 0x1610 */
185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96,128, 33, 0, 0, /* 0x1620 */
128, 1, 0, 4,124, 8, 3,166,128, 6, 0, 0,125,168, 3,166, /* 0x1630 */
56,165, 0, 1, 56, 99, 0, 1,124,160, 40, 80,124,100, 24, 80, /* 0x1640 */
144,166, 0, 0, 78,128, 0, 32, 72, 0, 0, 1, 80, 82, 79, 84, /* 0x1650 */
95, 69, 88, 69, 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, /* 0x1660 */
32,102, 97,105,108,101,100, 46, 10, 0, 0, 0, 56,160, 0, 30, /* 0x1670 */
124,136, 2,166, 56, 96, 0, 2, 56, 0, 0, 4, 68, 0, 0, 2, /* 0x1680 */
56, 96, 0,127, 56, 0, 0, 1, 68, 0, 0, 2,127,200, 2,166, /* 0x1690 */
57, 0, 0, 0, 56,224,255,255,128,126, 0, 4, 56,192, 0, 50, /* 0x16a0 */
56,160, 0, 7, 56,128, 16, 0,124, 99,242, 20, 56, 0, 0, 90, /* 0x16b0 */
56, 99, 16, 11, 84, 99, 0, 38, 68, 0, 0, 2, 65,131, 0, 32, /* 0x16c0 */
127,233, 3,166,128, 30, 0, 0,136,254, 0, 8, 56,193, 0,124, /* 0x16d0 */
144, 1, 0,124,124,101, 27,120,124,104, 3,166,128,158, 0, 4, /* 0x16e0 */
56,126, 0, 12, 78,128, 4, 32,148, 33,255,128,188, 65, 0, 4, /* 0x16f0 */
127,232, 2,166, 75,255,255,153, 0, 46,115,121,109,116, 97, 98, /* 0x1700 */
0, 46,115,116,114,116, 97, 98, 0, 46,115,104,115,116,114,116, /* 0x1710 */
97, 98, 0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x1720 */
0, 78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 0, 46,114,101,108, /* 0x1730 */
97, 78, 82, 86, 50, 69, 0, 46,114,101,108, 97, 78, 82, 86, 50, /* 0x1740 */
66, 0, 46,114,101,108, 97, 76, 90, 77, 65, 95, 69, 76, 70, 48, /* 0x1750 */
48, 0, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 0, 76, 90, 77, /* 0x1760 */
65, 95, 68, 69, 67, 50, 48, 0, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x1770 */
51, 48, 0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x1780 */
0, 46,114,101,108, 97, 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, /* 0x1790 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, /* 0x17c0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 4, /* 0x17d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x17e0 */
0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x17f0 */
0, 0, 27,136, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 1, /* 0x1800 */
0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 41, 0, 0, 0, 1, /* 0x1810 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, /* 0x1820 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x1830 */
0, 0, 0, 57, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1840 */
0, 0, 0, 56, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1850 */
0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 4, /* 0x1860 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,148, 0, 0, 0, 12, /* 0x1870 */
0, 0, 0, 18, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 12, /* 0x1880 */
0, 0, 0, 68, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1890 */
0, 0, 1,128, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18a0 */
0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 4, /* 0x18b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,160, 0, 0, 0, 12, /* 0x18c0 */
0, 0, 0, 18, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 12, /* 0x18d0 */
0, 0, 0, 79, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18e0 */
0, 0, 2,112, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18f0 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 4, /* 0x1900 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,172, 0, 0, 0, 12, /* 0x1910 */
0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 12, /* 0x1920 */
0, 0, 0, 90, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1930 */
0, 0, 2,244, 0, 0, 9,156, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1940 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, 0, 1, /* 0x1950 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,144, 0, 0, 9,156, /* 0x1960 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* 0x1970 */
0, 0, 0,112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1980 */
0, 0, 22, 44, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1990 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 1, /* 0x19a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 56, 0, 0, 0, 68, /* 0x19b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x19c0 */
0, 0, 0,123, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x19d0 */
0, 0, 27,184, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, /* 0x19e0 */
0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0,142, 0, 0, 0, 1, /* 0x19f0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,124, 0, 0, 0,140, /* 0x1a00 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, /* 0x1a10 */
0, 0, 0,137, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a20 */
0, 0, 27,196, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 15, /* 0x1a30 */
0, 0, 0, 4, 0, 0, 0, 12, 0, 0, 0, 17, 0, 0, 0, 3, /* 0x1a40 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 8, 0, 0, 0,151, /* 0x1a50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* 0x1a60 */
0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1a70 */
0, 0, 26,192, 0, 0, 0,192, 0, 0, 0, 19, 0, 0, 0, 11, /* 0x1a80 */
0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 3, /* 0x1a90 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,128, 0, 0, 0, 8, /* 0x1aa0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, /* 0x1ab0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x1ac0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 12, /* 0x1ad0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 13, /* 0x1ae0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 15, /* 0x1af0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, /* 0x1b00 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, /* 0x1b10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, /* 0x1b20 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 6, /* 0x1b30 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 8, /* 0x1b40 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 10, /* 0x1b50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 11, /* 0x1b60 */
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, /* 0x1b70 */
0, 95,115,116, 97,114,116, 0, 0, 0, 0, 0, 0, 0, 3, 10, /* 0x1b80 */
0, 0, 0,124, 0, 0, 0,180, 0, 0, 2, 11, 0, 0, 0, 0, /* 0x1b90 */
0, 0, 0,144, 0, 0, 2, 11, 0, 0, 0, 0, 0, 0, 0, 8, /* 0x1ba0 */
0, 0, 1, 11, 0, 0, 0, 12, 0, 0, 0, 32, 0, 0, 3, 10, /* 0x1bb0 */
0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 2, 11, 0, 0, 0, 32, /* 0x1bc0 */
10,116,109,112, 47,112,111,119,101,114,112, 99, 45,108,105,110, /* 0x1bd0 */
117,120, 46,101,108,102, 45,101,110,116,114,121, 46, 98,105,110, /* 0x1be0 */
58, 32, 32, 32, 32, 32,102,105,108,101, 32,102,111,114,109, 97, /* 0x1bf0 */
116, 32,101,108,102, 51, 50, 45,112,111,119,101,114,112, 99, 10, /* 0x1c00 */
10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, /* 0x1c10 */
97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122, /* 0x1c20 */
101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, /* 0x1c30 */
32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32, /* 0x1c40 */
111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, /* 0x1c50 */
10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, /* 0x1c60 */
32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, /* 0x1c70 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1c80 */
32, 48, 48, 48, 48, 48, 48, 51, 52, 32, 32, 50, 42, 42, 50, 32, /* 0x1c90 */
32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, /* 0x1ca0 */
44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, /* 0x1cb0 */
82, 86, 95, 67, 79, 77, 77, 79, 78, 32, 32, 32, 32, 48, 48, 48, /* 0x1cc0 */
48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1cd0 */
32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1ce0 */
48, 51, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, /* 0x1cf0 */
78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, /* 0x1d00 */
50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1d10 */
48, 48, 48, 48, 48, 49, 52, 56, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1d20 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1d30 */
48, 48, 48, 48, 51, 56, 32, 32, 50, 42, 42, 50, 32, 32, 67, 79, /* 0x1d40 */
78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, /* 0x1d50 */
69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, /* 0x1d60 */
66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1d70 */
102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1d80 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 56, 48, /* 0x1d90 */
32, 32, 50, 42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x1da0 */
44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1db0 */
89, 10, 32, 32, 52, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, /* 0x1dc0 */
32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32, 32, 48, 48, /* 0x1dd0 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1de0 */
32, 32, 48, 48, 48, 48, 48, 50, 55, 48, 32, 32, 50, 42, 42, 48, /* 0x1df0 */
32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, /* 0x1e00 */
67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, /* 0x1e10 */
76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 48, /* 0x1e20 */
48, 48, 48, 57, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1e30 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x1e40 */
48, 50,102, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x1e50 */
69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x1e60 */
32, 54, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, /* 0x1e70 */
32, 48, 48, 48, 48, 48, 57, 57, 99, 32, 32, 48, 48, 48, 48, 48, /* 0x1e80 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x1e90 */
48, 48, 48, 48, 99, 57, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x1ea0 */
79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1eb0 */
89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, /* 0x1ec0 */
32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 99, 32, 32, 48, 48, /* 0x1ed0 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1ee0 */
32, 32, 48, 48, 48, 48, 49, 54, 50, 99, 32, 32, 50, 42, 42, 48, /* 0x1ef0 */
32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, /* 0x1f00 */
79, 78, 76, 89, 10, 32, 32, 56, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x1f10 */
89, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 52, 52, 32, /* 0x1f20 */
32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1f30 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 54, 51, 56, 32, 32, 50, /* 0x1f40 */
42, 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, /* 0x1f50 */
69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x1f60 */
32, 57, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, /* 0x1f70 */
32, 48, 48, 48, 48, 48, 48, 56, 99, 32, 32, 48, 48, 48, 48, 48, /* 0x1f80 */
48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x1f90 */
48, 48, 48, 49, 54, 55, 99, 32, 32, 50, 42, 42, 50, 32, 32, 67, /* 0x1fa0 */
79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, /* 0x1fb0 */
82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, 77, 66, 79, 76, 32, /* 0x1fc0 */
84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1fd0 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x1fe0 */
51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x1ff0 */
95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2000 */
108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x2010 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, /* 0x2020 */
78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, /* 0x2030 */
32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, 48, /* 0x2040 */
48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, /* 0x2050 */
48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, /* 0x2060 */
69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x2070 */
48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, /* 0x2080 */
48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, /* 0x2090 */
67, 79, 77, 77, 79, 78, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x20a0 */
78, 82, 86, 95, 67, 79, 77, 77, 79, 78, 10, 48, 48, 48, 48, 48, /* 0x20b0 */
48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, /* 0x20c0 */
69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, /* 0x20d0 */
10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, /* 0x20e0 */
32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x20f0 */
32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2100 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, /* 0x2110 */
48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x2120 */
95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2130 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2140 */
49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x2150 */
95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2160 */
108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, /* 0x2170 */
50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, /* 0x2180 */
95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2190 */
103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, /* 0x21a0 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, 97,114,116, /* 0x21b0 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x21c0 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, /* 0x21d0 */
73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x21e0 */
89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x21f0 */
32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2200 */
32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, /* 0x2210 */
32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, /* 0x2220 */
48, 48, 48, 48, 55, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x2230 */
73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x2240 */
91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, /* 0x2250 */
32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2260 */
32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, /* 0x2270 */
48, 98, 52, 32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 49, 52, 32, /* 0x2280 */
32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 10, /* 0x2290 */
10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, /* 0x22a0 */
82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, /* 0x22b0 */
10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x22c0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x22d0 */
69, 32, 10, 48, 48, 48, 48, 48, 48, 57, 48, 32, 82, 95, 80, 80, /* 0x22e0 */
67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 69, 76, /* 0x22f0 */
70, 77, 65, 73, 78, 89, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x2300 */
73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x2310 */
91, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, /* 0x2320 */
70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x2330 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x2340 */
48, 48, 48, 48, 48, 48, 48, 56, 32, 82, 95, 80, 80, 67, 95, 82, /* 0x2350 */
69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, /* 0x2360 */
68, 69, 67, 51, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 99, /* 0x2370 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x2380 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, /* 0x2390 */
73, 78, 89, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, /* 0x23a0 */
89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x23b0 */
32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 50, 48, /* 0x23c0 */
32, 82, 95, 80, 80, 67, 95, 82, 69, 76, 50, 52, 32, 32, 32, 32, /* 0x23d0 */
32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 10, 82, 69, /* 0x23e0 */
76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, /* 0x23f0 */
32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 90, 93, 58, /* 0x2400 */
10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, /* 0x2410 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, /* 0x2420 */
69, 32, 10, 48, 48, 48, 48, 48, 48, 53, 48, 32, 82, 95, 80, 80, /* 0x2430 */
67, 95, 82, 69, 76, 49, 52, 32, 32, 32, 32, 32, 32, 32, 69, 76, /* 0x2440 */
70, 77, 65, 73, 78, 89, 43, 48,120, 48, 48, 48, 48, 48, 48, 50, /* 0x2450 */
48, 10, 10, 10 /* 0x2460 */
};

View File

@ -1,4 +1,4 @@
/* powerpc-linux.elf-fold.h -- created from powerpc-linux.elf-fold.bin, 1936 (0x790) bytes
/* powerpc-linux.elf-fold.h -- created from powerpc-linux.elf-fold.bin, 1944 (0x798) bytes
This file is part of the UPX executable compressor.
@ -27,17 +27,17 @@
*/
#define LINUX_ELFPPC32_FOLD_SIZE 1936
#define LINUX_ELFPPC32_FOLD_ADLER32 0x1a2f7017
#define LINUX_ELFPPC32_FOLD_CRC32 0xf69d4404
#define LINUX_ELFPPC32_FOLD_SIZE 1944
#define LINUX_ELFPPC32_FOLD_ADLER32 0x727175e2
#define LINUX_ELFPPC32_FOLD_CRC32 0xe344893c
unsigned char linux_elfppc32_fold[1936] = {
unsigned char linux_elfppc32_fold[1944] = {
127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */
0, 2, 0, 20, 0, 0, 0, 1, 0, 16, 0,128, 0, 0, 0, 52, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 32, 0, 2, 0, 0, /* 0x 20 */
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 16, 0, 0, /* 0x 30 */
0, 16, 0, 0, 0, 0, 7,144, 0, 0, 7,144, 0, 0, 0, 5, /* 0x 40 */
0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 7,144, 0, 0, 0, 0, /* 0x 50 */
0, 16, 0, 0, 0, 0, 7,152, 0, 0, 7,152, 0, 0, 0, 5, /* 0x 40 */
0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 7,152, 0, 0, 0, 0, /* 0x 50 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 60 */
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */
72, 0, 0,125, 40, 6, 0,208, 76,130, 0, 32, 84,132,240,191, /* 0x 80 */
@ -49,108 +49,109 @@ unsigned char linux_elfppc32_fold[1936] = {
66, 0,255,240, 78,128, 0, 32,128, 73, 0, 0, 57, 41, 0, 4, /* 0x e0 */
47,130, 0, 0, 64,158,255,244, 78,128, 0, 32,125, 8, 2,166, /* 0x f0 */
129, 33, 0, 0, 75,255,255,229, 75,255,255,225,128,159,255,248, /* 0x 100 */
85, 30, 0, 38, 56,161,248, 0,127,231,251,120,124,100,248, 80, /* 0x 110 */
56, 33,247,240, 84,125, 0, 38,128,195, 0, 24, 72, 0, 5, 13, /* 0x 120 */
124,127, 27,120,127,163,235,120,124,157,240, 80, 72, 0, 0, 81, /* 0x 130 */
127,232, 3,166,184, 65, 8, 20,128, 33, 8, 16, 78,128, 0, 32, /* 0x 140 */
56, 0, 0, 90, 68, 0, 0, 2, 64,163, 0, 8, 56, 96,255,255, /* 0x 150 */
78,128, 0, 32, 56, 0, 0, 1, 75,255,255,236, 56, 0, 0, 3, /* 0x 160 */
75,255,255,228, 56, 0, 0, 5, 75,255,255,220, 56, 0, 0, 6, /* 0x 170 */
75,255,255,212, 56, 0, 0,125, 75,255,255,204, 56, 0, 0, 91, /* 0x 180 */
75,255,255,196, 56, 0, 0, 45, 75,255,255,188,124, 8, 2,166, /* 0x 190 */
148, 33,255,240,144, 1, 0, 20,128, 3, 0, 0,129, 35, 0, 4, /* 0x 1a0 */
127,128, 40, 64, 64,188, 0, 12, 56, 96, 0,127, 75,255,255,169, /* 0x 1b0 */
47,133, 0, 0, 65,158, 0, 28,124,169, 3,166,136, 9, 0, 0, /* 0x 1c0 */
57, 41, 0, 1,152, 4, 0, 0, 56,132, 0, 1, 66, 0,255,240, /* 0x 1d0 */
128, 3, 0, 0,129, 35, 0, 4,124, 5, 0, 80,144, 3, 0, 0, /* 0x 1e0 */
128, 1, 0, 20,125, 41, 42, 20,124, 8, 3,166, 56, 33, 0, 16, /* 0x 1f0 */
145, 35, 0, 4, 78,128, 0, 32,124, 8, 2,166,148, 33,255,192, /* 0x 200 */
144, 1, 0, 68,128, 4, 0, 0,191,129, 0, 48, 47,128, 0, 0, /* 0x 210 */
124,159, 35,120,124,126, 27,120,124,188, 43,120,124,221, 51,120, /* 0x 220 */
65,158, 1, 36, 56,160, 0, 12,127,195,243,120, 56,129, 0, 16, /* 0x 230 */
75,255,255, 93,129, 33, 0, 16,128,161, 0, 20, 47,137, 0, 0, /* 0x 240 */
64,190, 0, 36, 60, 0, 33, 88, 96, 0, 80, 85,127,133, 0, 0, /* 0x 250 */
64,190, 0, 28,128, 30, 0, 0, 47,128, 0, 0, 65,190, 0,232, /* 0x 260 */
72, 0, 0, 12, 47,133, 0, 0, 64,190, 0, 12, 56, 96, 0,127, /* 0x 270 */
75,255,254,229,127, 5, 72, 64, 65,185,255,244,128, 31, 0, 0, /* 0x 280 */
127,137, 0, 64, 65,189,255,232,128, 31, 0, 4, 64,152, 0,136, /* 0x 290 */
124,164, 43,120,128,126, 0, 4,124, 5, 3,120, 56,193, 0, 32, /* 0x 2a0 */
128,225, 0, 24,145, 33, 0, 32,127,136, 3,166, 78,128, 0, 33, /* 0x 2b0 */
47,131, 0, 0, 64,190,255,184,128,129, 0, 32,128, 1, 0, 16, /* 0x 2c0 */
127,132, 0, 0, 64,190,255,168,136,193, 0, 25, 49, 61,255,255, /* 0x 2d0 */
124, 9,233, 16,125, 38, 0,208, 85, 41, 15,254,125, 43, 0, 57, /* 0x 2e0 */
65,162, 0, 20,128,127, 0, 4,136,161, 0, 26,127,168, 3,166, /* 0x 2f0 */
78,128, 0, 33,128, 30, 0, 4,129, 97, 0, 20,129, 62, 0, 0, /* 0x 300 */
124, 0, 90, 20,125, 43, 72, 80,144, 30, 0, 4,145, 62, 0, 0, /* 0x 310 */
72, 0, 0, 16,124, 4, 3,120,127,195,243,120, 75,255,254,113, /* 0x 320 */
129, 97, 0, 16,129, 63, 0, 0,128, 31, 0, 4,125, 43, 72, 80, /* 0x 330 */
47,137, 0, 0,124, 0, 90, 20,144, 31, 0, 4,145, 63, 0, 0, /* 0x 340 */
75,255,254,224,128, 1, 0, 68,187,129, 0, 48,124, 8, 3,166, /* 0x 350 */
56, 33, 0, 64, 78,128, 0, 32, 44, 3, 0, 0, 77,130, 0, 32, /* 0x 360 */
48, 4,255,255,125, 96, 33, 16,128, 3, 0, 0,127,128, 32, 0, /* 0x 370 */
104, 9, 0, 1, 33, 73, 0, 0,125, 42, 73, 20,125, 42, 88, 57, /* 0x 380 */
65,158, 0, 8, 65,162, 0, 16,144,163, 0, 4,144,131, 0, 0, /* 0x 390 */
78,128, 0, 32, 56, 99, 0, 8, 75,255,255,208,124, 8, 2,166, /* 0x 3a0 */
148, 33,255,160,144, 1, 0,100,160, 3, 0, 16,161, 67, 0, 44, /* 0x 3b0 */
125,128, 0, 38,129, 35, 0, 28,104, 0, 0, 3, 53, 74,255,255, /* 0x 3c0 */
124, 0, 0,208,190, 65, 0, 40,127,163, 74, 20,124,121, 27,120, /* 0x 3d0 */
84, 3, 46,246,145,129, 0, 36,124,151, 35,120,124,178, 43,120, /* 0x 3e0 */
124,211, 51,120,124,244, 59,120,125, 21, 67,120, 56, 99, 8, 34, /* 0x 3f0 */
127,171,235,120, 59,224,255,255, 59,192, 0, 0, 65,128, 0, 68, /* 0x 400 */
57, 74, 0, 1,125, 73, 3,166,128, 11, 0, 0, 47,128, 0, 1, /* 0x 410 */
64,190, 0, 40,129, 43, 0, 8,127,137,248, 64, 64,156, 0, 8, /* 0x 420 */
125, 63, 75,120,128, 11, 0, 20,124, 0, 74, 20,127,158, 0, 64, /* 0x 430 */
64,156, 0, 8,124, 30, 3,120, 57,107, 0, 32, 66, 0,255,204, /* 0x 440 */
87,255, 0, 38,125, 63,240, 80, 57, 41, 15,255, 85, 62, 0, 38, /* 0x 450 */
124,102, 27,120,127,196,243,120,127,227,251,120, 56,160, 0, 0, /* 0x 460 */
56,224,255,255, 57, 0, 0, 0, 75,255,252,217,160, 25, 0, 44, /* 0x 470 */
58,192, 0, 0,127,150, 0, 0,124, 3,242, 20,144, 1, 0, 8, /* 0x 480 */
127, 31, 24, 80, 64,156, 1,128, 46, 23, 0, 0, 65,146, 0, 40, /* 0x 490 */
128, 29, 0, 0, 47,128, 0, 6, 64,190, 0, 28,128,189, 0, 8, /* 0x 4a0 */
126, 99,155,120,124,165,194, 20, 56,128, 0, 3, 75,255,254,173, /* 0x 4b0 */
72, 0, 1, 64,128, 29, 0, 0, 47,128, 0, 1, 64,190, 1, 52, /* 0x 4c0 */
128, 29, 0, 24,129, 93, 0, 8, 61, 32,115, 81, 84, 0, 22,250, /* 0x 4d0 */
97, 41, 98, 64,129,125, 0, 20,125, 41, 4, 48, 85, 94, 5, 62, /* 0x 4e0 */
48, 23,255,255,124,160,185, 16,128, 29, 0, 16, 85, 58, 7,126, /* 0x 4f0 */
127,106, 90, 20, 84,165, 8, 60,127,254, 80, 80,144, 1, 0, 16, /* 0x 500 */
145, 65, 0, 20,127,128,242, 20,127,255,194, 20,127,123,194, 20, /* 0x 510 */
124,165,211,120, 65,146, 0, 12, 56,192, 0, 50, 72, 0, 0, 8, /* 0x 520 */
56,192, 0, 18, 64,146, 0, 12,126, 71,147,120, 72, 0, 0, 8, /* 0x 530 */
56,224,255,255,129, 29, 0, 4,127,227,251,120,125, 30, 64, 80, /* 0x 540 */
127,132,227,120, 75,255,251,253,127,159, 24, 0, 64,158, 0,104, /* 0x 550 */
65,178, 0, 24,126,227,187,120, 56,129, 0, 16,126,133,163,120, /* 0x 560 */
126,166,171,120, 75,255,252,149,115, 64, 0, 2,124, 28, 0,208, /* 0x 570 */
84, 30, 5, 62, 65,130, 0, 36, 47,158, 0, 0,125, 63,226, 20, /* 0x 580 */
65,158, 0, 24,127,201, 3,166, 56, 0, 0, 0,152, 9, 0, 0, /* 0x 590 */
57, 41, 0, 1, 66, 0,255,248, 65,178, 0, 36,127,227,251,120, /* 0x 5a0 */
127,132,227,120,127, 69,211,120, 75,255,251,205, 47,131, 0, 0, /* 0x 5b0 */
65,190, 0, 12, 56, 96, 0,127, 75,255,251,157,124, 28,242, 20, /* 0x 5c0 */
127,255, 2, 20,127,159,216, 64, 64,188, 0, 40,124,159,216, 80, /* 0x 5d0 */
127, 69,211,120,127,227,251,120, 56,192, 0, 50, 56,224,255,255, /* 0x 5e0 */
57, 0, 0, 0, 75,255,251, 93,127,159, 24, 0, 64,190,255,200, /* 0x 5f0 */
160, 25, 0, 44, 58,214, 0, 1,127,150, 0, 0, 59,189, 0, 32, /* 0x 600 */
75,255,254,132,128,121, 0, 24,128, 1, 0,100,129,129, 0, 36, /* 0x 610 */
124, 99,194, 20,124, 8, 3,166,186, 65, 0, 40,125,128,129, 32, /* 0x 620 */
56, 33, 0, 96, 78,128, 0, 32,124, 8, 2,166,148, 33,255,192, /* 0x 630 */
144, 1, 0, 68, 56,132,255,232, 56, 3, 0, 24,144, 1, 0, 12, /* 0x 640 */
144,129, 0, 8,128, 3, 0, 24,191, 97, 0, 44,129, 97, 0, 8, /* 0x 650 */
124,191, 43,120,129,129, 0, 12,124,229, 59,120, 56,192, 0, 0, /* 0x 660 */
56, 97, 0, 8, 56,129, 0, 16, 59,223, 0, 52,125, 61, 75,120, /* 0x 670 */
124,251, 59,120,144, 1, 0, 16,125, 28, 67,120,145, 97, 0, 24, /* 0x 680 */
145,129, 0, 28,147,225, 0, 20, 75,255,251,113,128,190, 0, 8, /* 0x 690 */
127,163,235,120, 56,165, 0, 52, 56,128, 0, 3, 75,255,252,189, /* 0x 6a0 */
160,191, 0, 44,127,163,235,120, 56,128, 0, 5, 75,255,252,173, /* 0x 6b0 */
128,191, 0, 24,127,163,235,120, 56,128, 0, 9, 75,255,252,157, /* 0x 6c0 */
127,103,219,120,127,136,227,120,127,227,251,120,127,166,235,120, /* 0x 6d0 */
56,129, 0, 24, 56,160, 0, 0, 75,255,252,197,160, 31, 0, 44, /* 0x 6e0 */
124,124, 27,120, 59, 96, 0, 0,127,155, 0, 0, 64,156, 0,124, /* 0x 6f0 */
128, 30, 0, 0, 59,123, 0, 1, 47,128, 0, 3, 56,128, 0, 0, /* 0x 700 */
56,160, 0, 0, 64,190, 0, 88,128,126, 0, 8, 75,255,250, 89, /* 0x 710 */
124,125, 27,121,127,228,251,120, 56,160, 2, 0, 65,128, 0, 40, /* 0x 720 */
75,255,250, 61, 47,131, 2, 0, 56,128, 0, 0,127,227,251,120, /* 0x 730 */
127,165,235,120, 56,192, 0, 0, 56,224, 0, 0, 57, 0, 0, 0, /* 0x 740 */
65,190, 0, 12, 56, 96, 0,127, 75,255,250, 13, 75,255,252, 81, /* 0x 750 */
124,124, 27,120,127,163,235,120, 75,255,250, 21,160, 31, 0, 44, /* 0x 760 */
59,222, 0, 32, 75,255,255,132,128, 1, 0, 68,127,131,227,120, /* 0x 770 */
124, 8, 3,166,187, 97, 0, 44, 56, 33, 0, 64, 78,128, 0, 32 /* 0x 780 */
85, 30, 0, 38,127,231,251,120,127,164,248, 80, 56,161,248, 0, /* 0x 110 */
59,189,255,248, 56,132,255,140, 56,125, 0,116, 56, 33,247,240, /* 0x 120 */
128,195, 0, 24, 72, 0, 5, 13,124,127, 27,120,127,163,235,120, /* 0x 130 */
124,157,240, 80, 72, 0, 0, 81,127,232, 3,166,184, 65, 8, 20, /* 0x 140 */
128, 33, 8, 16, 78,128, 0, 32, 56, 0, 0, 90, 68, 0, 0, 2, /* 0x 150 */
64,163, 0, 8, 56, 96,255,255, 78,128, 0, 32, 56, 0, 0, 1, /* 0x 160 */
75,255,255,236, 56, 0, 0, 3, 75,255,255,228, 56, 0, 0, 5, /* 0x 170 */
75,255,255,220, 56, 0, 0, 6, 75,255,255,212, 56, 0, 0,125, /* 0x 180 */
75,255,255,204, 56, 0, 0, 91, 75,255,255,196, 56, 0, 0, 45, /* 0x 190 */
75,255,255,188,124, 8, 2,166,148, 33,255,240,144, 1, 0, 20, /* 0x 1a0 */
128, 3, 0, 0,129, 35, 0, 4,127,128, 40, 64, 64,188, 0, 12, /* 0x 1b0 */
56, 96, 0,127, 75,255,255,169, 47,133, 0, 0, 65,158, 0, 28, /* 0x 1c0 */
124,169, 3,166,136, 9, 0, 0, 57, 41, 0, 1,152, 4, 0, 0, /* 0x 1d0 */
56,132, 0, 1, 66, 0,255,240,128, 3, 0, 0,129, 35, 0, 4, /* 0x 1e0 */
124, 5, 0, 80,144, 3, 0, 0,128, 1, 0, 20,125, 41, 42, 20, /* 0x 1f0 */
124, 8, 3,166, 56, 33, 0, 16,145, 35, 0, 4, 78,128, 0, 32, /* 0x 200 */
124, 8, 2,166,148, 33,255,192,144, 1, 0, 68,128, 4, 0, 0, /* 0x 210 */
191,129, 0, 48, 47,128, 0, 0,124,159, 35,120,124,126, 27,120, /* 0x 220 */
124,188, 43,120,124,221, 51,120, 65,158, 1, 36, 56,160, 0, 12, /* 0x 230 */
127,195,243,120, 56,129, 0, 16, 75,255,255, 93,129, 33, 0, 16, /* 0x 240 */
128,161, 0, 20, 47,137, 0, 0, 64,190, 0, 36, 60, 0, 33, 88, /* 0x 250 */
96, 0, 80, 85,127,133, 0, 0, 64,190, 0, 28,128, 30, 0, 0, /* 0x 260 */
47,128, 0, 0, 65,190, 0,232, 72, 0, 0, 12, 47,133, 0, 0, /* 0x 270 */
64,190, 0, 12, 56, 96, 0,127, 75,255,254,229,127, 5, 72, 64, /* 0x 280 */
65,185,255,244,128, 31, 0, 0,127,137, 0, 64, 65,189,255,232, /* 0x 290 */
128, 31, 0, 4, 64,152, 0,136,124,164, 43,120,128,126, 0, 4, /* 0x 2a0 */
124, 5, 3,120, 56,193, 0, 32,136,225, 0, 24,145, 33, 0, 32, /* 0x 2b0 */
127,136, 3,166, 78,128, 0, 33, 47,131, 0, 0, 64,190,255,184, /* 0x 2c0 */
128,129, 0, 32,128, 1, 0, 16,127,132, 0, 0, 64,190,255,168, /* 0x 2d0 */
136,193, 0, 25, 49, 61,255,255,124, 9,233, 16,125, 38, 0,208, /* 0x 2e0 */
85, 41, 15,254,125, 43, 0, 57, 65,162, 0, 20,128,127, 0, 4, /* 0x 2f0 */
136,161, 0, 26,127,168, 3,166, 78,128, 0, 33,128, 30, 0, 4, /* 0x 300 */
129, 97, 0, 20,129, 62, 0, 0,124, 0, 90, 20,125, 43, 72, 80, /* 0x 310 */
144, 30, 0, 4,145, 62, 0, 0, 72, 0, 0, 16,124, 4, 3,120, /* 0x 320 */
127,195,243,120, 75,255,254,113,129, 97, 0, 16,129, 63, 0, 0, /* 0x 330 */
128, 31, 0, 4,125, 43, 72, 80, 47,137, 0, 0,124, 0, 90, 20, /* 0x 340 */
144, 31, 0, 4,145, 63, 0, 0, 75,255,254,224,128, 1, 0, 68, /* 0x 350 */
187,129, 0, 48,124, 8, 3,166, 56, 33, 0, 64, 78,128, 0, 32, /* 0x 360 */
44, 3, 0, 0, 77,130, 0, 32, 48, 4,255,255,125, 96, 33, 16, /* 0x 370 */
128, 3, 0, 0,127,128, 32, 0,104, 9, 0, 1, 33, 73, 0, 0, /* 0x 380 */
125, 42, 73, 20,125, 42, 88, 57, 65,158, 0, 8, 65,162, 0, 16, /* 0x 390 */
144,163, 0, 4,144,131, 0, 0, 78,128, 0, 32, 56, 99, 0, 8, /* 0x 3a0 */
75,255,255,208,124, 8, 2,166,148, 33,255,160,144, 1, 0,100, /* 0x 3b0 */
160, 3, 0, 16,161, 67, 0, 44,125,128, 0, 38,129, 35, 0, 28, /* 0x 3c0 */
104, 0, 0, 3, 53, 74,255,255,124, 0, 0,208,190, 65, 0, 40, /* 0x 3d0 */
127,163, 74, 20,124,121, 27,120, 84, 3, 46,246,145,129, 0, 36, /* 0x 3e0 */
124,151, 35,120,124,178, 43,120,124,211, 51,120,124,244, 59,120, /* 0x 3f0 */
125, 21, 67,120, 56, 99, 8, 34,127,171,235,120, 59,224,255,255, /* 0x 400 */
59,192, 0, 0, 65,128, 0, 68, 57, 74, 0, 1,125, 73, 3,166, /* 0x 410 */
128, 11, 0, 0, 47,128, 0, 1, 64,190, 0, 40,129, 43, 0, 8, /* 0x 420 */
127,137,248, 64, 64,156, 0, 8,125, 63, 75,120,128, 11, 0, 20, /* 0x 430 */
124, 0, 74, 20,127,158, 0, 64, 64,156, 0, 8,124, 30, 3,120, /* 0x 440 */
57,107, 0, 32, 66, 0,255,204, 87,255, 0, 38,125, 63,240, 80, /* 0x 450 */
57, 41, 15,255, 85, 62, 0, 38,124,102, 27,120,127,196,243,120, /* 0x 460 */
127,227,251,120, 56,160, 0, 0, 56,224,255,255, 57, 0, 0, 0, /* 0x 470 */
75,255,252,217,160, 25, 0, 44, 58,192, 0, 0,127,150, 0, 0, /* 0x 480 */
124, 3,242, 20,144, 1, 0, 8,127, 31, 24, 80, 64,156, 1,128, /* 0x 490 */
46, 23, 0, 0, 65,146, 0, 40,128, 29, 0, 0, 47,128, 0, 6, /* 0x 4a0 */
64,190, 0, 28,128,189, 0, 8,126, 99,155,120,124,165,194, 20, /* 0x 4b0 */
56,128, 0, 3, 75,255,254,173, 72, 0, 1, 64,128, 29, 0, 0, /* 0x 4c0 */
47,128, 0, 1, 64,190, 1, 52,128, 29, 0, 24,129, 93, 0, 8, /* 0x 4d0 */
61, 32,115, 81, 84, 0, 22,250, 97, 41, 98, 64,129,125, 0, 20, /* 0x 4e0 */
125, 41, 4, 48, 85, 94, 5, 62, 48, 23,255,255,124,160,185, 16, /* 0x 4f0 */
128, 29, 0, 16, 85, 58, 7,126,127,106, 90, 20, 84,165, 8, 60, /* 0x 500 */
127,254, 80, 80,144, 1, 0, 16,145, 65, 0, 20,127,128,242, 20, /* 0x 510 */
127,255,194, 20,127,123,194, 20,124,165,211,120, 65,146, 0, 12, /* 0x 520 */
56,192, 0, 50, 72, 0, 0, 8, 56,192, 0, 18, 64,146, 0, 12, /* 0x 530 */
126, 71,147,120, 72, 0, 0, 8, 56,224,255,255,129, 29, 0, 4, /* 0x 540 */
127,227,251,120,125, 30, 64, 80,127,132,227,120, 75,255,251,253, /* 0x 550 */
127,159, 24, 0, 64,158, 0,104, 65,178, 0, 24,126,227,187,120, /* 0x 560 */
56,129, 0, 16,126,133,163,120,126,166,171,120, 75,255,252,149, /* 0x 570 */
115, 64, 0, 2,124, 28, 0,208, 84, 30, 5, 62, 65,130, 0, 36, /* 0x 580 */
47,158, 0, 0,125, 63,226, 20, 65,158, 0, 24,127,201, 3,166, /* 0x 590 */
56, 0, 0, 0,152, 9, 0, 0, 57, 41, 0, 1, 66, 0,255,248, /* 0x 5a0 */
65,178, 0, 36,127,227,251,120,127,132,227,120,127, 69,211,120, /* 0x 5b0 */
75,255,251,205, 47,131, 0, 0, 65,190, 0, 12, 56, 96, 0,127, /* 0x 5c0 */
75,255,251,157,124, 28,242, 20,127,255, 2, 20,127,159,216, 64, /* 0x 5d0 */
64,188, 0, 40,124,159,216, 80,127, 69,211,120,127,227,251,120, /* 0x 5e0 */
56,192, 0, 50, 56,224,255,255, 57, 0, 0, 0, 75,255,251, 93, /* 0x 5f0 */
127,159, 24, 0, 64,190,255,200,160, 25, 0, 44, 58,214, 0, 1, /* 0x 600 */
127,150, 0, 0, 59,189, 0, 32, 75,255,254,132,128,121, 0, 24, /* 0x 610 */
128, 1, 0,100,129,129, 0, 36,124, 99,194, 20,124, 8, 3,166, /* 0x 620 */
186, 65, 0, 40,125,128,129, 32, 56, 33, 0, 96, 78,128, 0, 32, /* 0x 630 */
124, 8, 2,166,148, 33,255,192,144, 1, 0, 68, 56,132,255,232, /* 0x 640 */
56, 3, 0, 24,144, 1, 0, 12,144,129, 0, 8,128, 3, 0, 24, /* 0x 650 */
191, 97, 0, 44,129, 97, 0, 8,124,191, 43,120,129,129, 0, 12, /* 0x 660 */
124,229, 59,120, 56,192, 0, 0, 56, 97, 0, 8, 56,129, 0, 16, /* 0x 670 */
59,223, 0, 52,125, 61, 75,120,124,251, 59,120,144, 1, 0, 16, /* 0x 680 */
125, 28, 67,120,145, 97, 0, 24,145,129, 0, 28,147,225, 0, 20, /* 0x 690 */
75,255,251,113,128,190, 0, 8,127,163,235,120, 56,165, 0, 52, /* 0x 6a0 */
56,128, 0, 3, 75,255,252,189,160,191, 0, 44,127,163,235,120, /* 0x 6b0 */
56,128, 0, 5, 75,255,252,173,128,191, 0, 24,127,163,235,120, /* 0x 6c0 */
56,128, 0, 9, 75,255,252,157,127,103,219,120,127,136,227,120, /* 0x 6d0 */
127,227,251,120,127,166,235,120, 56,129, 0, 24, 56,160, 0, 0, /* 0x 6e0 */
75,255,252,197,160, 31, 0, 44,124,124, 27,120, 59, 96, 0, 0, /* 0x 6f0 */
127,155, 0, 0, 64,156, 0,124,128, 30, 0, 0, 59,123, 0, 1, /* 0x 700 */
47,128, 0, 3, 56,128, 0, 0, 56,160, 0, 0, 64,190, 0, 88, /* 0x 710 */
128,126, 0, 8, 75,255,250, 89,124,125, 27,121,127,228,251,120, /* 0x 720 */
56,160, 2, 0, 65,128, 0, 40, 75,255,250, 61, 47,131, 2, 0, /* 0x 730 */
56,128, 0, 0,127,227,251,120,127,165,235,120, 56,192, 0, 0, /* 0x 740 */
56,224, 0, 0, 57, 0, 0, 0, 65,190, 0, 12, 56, 96, 0,127, /* 0x 750 */
75,255,250, 13, 75,255,252, 81,124,124, 27,120,127,163,235,120, /* 0x 760 */
75,255,250, 21,160, 31, 0, 44, 59,222, 0, 32, 75,255,255,132, /* 0x 770 */
128, 1, 0, 68,127,131,227,120,124, 8, 3,166,187, 97, 0, 44, /* 0x 780 */
56, 33, 0, 64, 78,128, 0, 32 /* 0x 790 */
};

View File

@ -32,6 +32,10 @@
//#include "arch/i386/macros2.ash"
#include "arch/amd64/regs.h"
#define section .section
sz_Ehdr= 64
sz_Phdr= 56
sz_l_info= 12
l_lsize= 8
@ -61,9 +65,10 @@ M_NRV2B_LE32=2 // ../conf.h
M_NRV2E_LE32=8
.section LEXEC000
section ELFMAINX
_start: .globl _start
call main // push &decompress
ret_main:
/* Returns 0 on success; non-zero on failure. */
decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method)
@ -74,6 +79,14 @@ decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint meth
#define dst %arg3
#define ldst %arg4 /* Out: actually a reference: &len_dst */
#define meth %arg5l
#define methb %arg5b
push %rbp; push %rbx // C callable
push ldst
push dst
addq src,lsrc; push lsrc // &input_eof
section NRV_COMMON
/* Working registers */
#define off %eax /* XXX: 2GB */
@ -82,11 +95,6 @@ decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint meth
#define bits %ebx
#define disp %rbp
push %rbp; push %rbx // C callable
push ldst
push dst
addq src,lsrc; push lsrc // &input_eof
movq src,%rsi // hardware src for movsb, lodsb
movq dst,%rdi // hardware dst for movsb
xor bits,bits // empty; force refill
@ -154,14 +162,19 @@ copy1:
copy0:
rep; ret
#include "arch/amd64/nrv2e_d.S"
#include "arch/amd64/nrv2b_d.S"
setup:
cld
pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit
cmpl $ M_NRV2E_LE32,meth; je top_n2e
cmpl $ M_NRV2B_LE32,meth; je top_n2b
section NRV2E
#include "arch/amd64/nrv2e_d.S"
section NRV2B
#include "arch/amd64/nrv2b_d.S"
#include "arch/amd64/lzma_d.S"
section ELFMAINY
eof:
pop %rcx // &input_eof
movq %rsi,%rax; subq %rcx,%rax // src -= eof; // return 0: good; else: bad
@ -170,20 +183,20 @@ eof:
pop %rbx; pop %rbp
ret
/* Temporary until we get the buildLoader stuff working ... */
.ascii "\n$Id: UPX (C) 1996-2006 the UPX Team. "
.asciz "All Rights Reserved. http://upx.sf.net $\n"
/* These from /usr/include/asm-x86_64/unistd.h */
__NR_write = 1
__NR_exit = 60
msg_SELinux:
push $ L71 - L70; pop %arg3 // length
call L71
call L72
L70:
.asciz "PROT_EXEC|PROT_WRITE failed.\n"
L71:
// IDENTSTR goes here
section ELFMAINZ
L72:
pop %arg2 // message text
push $2; pop %arg1 // fd stderr
push $ __NR_write; pop %rax
@ -232,7 +245,7 @@ unfold:
push $ LENU // for unmap in fold
movl $ CNTC,%ecx
push $ ADRX //# for upx_main
push $ LENX // for upx_main
push %r15 // LENX for upx_main
/* Move and relocate if compressed overlaps uncompressed.
Move by 0 when total compressed executable is < 3MB.
@ -251,7 +264,7 @@ unfold:
push %rax // ret_addr after decompression
xchgl %eax,%arg3l // %arg3= dst for unfolding XXX: 4GB
lodsl; push %rax // allocate slot on stack
movq %rsp,%arg4 // &len_dst ==> &do_not_care
movq %rsp,%arg4 // &len_dst ==> used by lzma for EOF
lodsl; xchgl %eax,%arg1l // sz_cpr XXX: 4GB
lodsl; movzbl %al,%arg5l // b_method
xchg %arg1l,%arg2l // XXX: 4GB
@ -260,14 +273,16 @@ unfold:
ret
main:
// int3 # uncomment for debugging
//// int3 # uncomment for debugging
pop %rbp // &decompress
movl -4-(ret_main - _start)(%rbp),%r15d // length which precedes stub
subl $ sz_Ehdr + 2*sz_Phdr + sz_l_info + sz_p_info,%r15d
call unfold // push &b_info
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
// { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...}
/*__XTHEENDX__*/
/*
vi:ts=8:et:nowrap
*/
*/

View File

@ -0,0 +1,109 @@
/*
; lzma_d.S -- 64-bit assembly
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 2006-2006 Markus Franz Xaver Johannes Oberhumer
; 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
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/upx/
;
*/
#define section .section
section LZMA_ELF00
//decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method)
/* Arguments according to calling convention */
#define src %arg1 /* %rdi */
#define lsrc %arg2 /* %rsi */
#define dst %arg3 /* %rdx */
#define ldst %arg4 /* %rcx */ /* Out: actually a reference: &len_dst */
#define meth %arg5l /* %r8 */
#define methb %arg5b
// ELFMAINX has already done this for us:
// pushq %rbp; push %rbx // C callable
// pushq ldst
// pushq dst
// addq src,lsrc; push lsrc // &input_eof
#define M_LZMA 14
cmpb $ M_LZMA,methb; jne not_lzma
pushq %rbp; movq %rsp,%rbp // we use alloca
//LzmaDecode( // from lzmaSDK/C/7zip/Compress/LZMA_C/LzmaDecode.h
// %arg1= &CLzmaDecoderState,
// %arg2= in, %arg3l= inSize, %arg4= &inSizeProcessed,
// %arg5= out, %arg6l= outSize, arg7@ 8+%esp/ &outSizeProcessed
//)
movl (ldst),%arg6l // &outSize XXX: 4GB
movq dst,%arg5 // outp
movq lsrc,%arg3 // inSize
leaq 2(src),%arg2; pushq %arg2 // in; save @-8(%rbp) for size calc at eof
movb (src),%al; decl %arg3l // first byte, replaces LzmaDecodeProperties()
movb %al,%cl // cl= ((lit_context_bits + lit_pos_bits)<<3) | pos_bits
andb $7,%al // al= pos_bits
shrb $3,%cl // cl= lit_context_bits + lit_pos_bits
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#define szSizeT 4
movq $-LZMA_LIT_SIZE,%rbx
shlq %cl,%rbx; movb %al,%cl // %cl= pos_bits
// alloca{inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState}
leaq -(2*szSizeT +4) - 2*LZMA_BASE_SIZE(%rsp,%rbx,2), %rbx
andq $~0<<6,%rbx // 64-byte align
1:
pushq $0 // clera CLzmaDecoderState on stack
cmpq %rbx,%rsp
jne 1b
pushq %rbx // &outSizeProcessed [arg7]
leaq 2*szSizeT(%rbx),%arg1 // &CLzmaDecoderState
movb -1(%arg2),%cl; decl %arg3l // second byte, replaces LzmaDecodeProperties()
movb %al,2(%arg1) // store pos_bits
movb %cl,%al // al= (lit_pos_bits<<4) | lit_context_bits
shrb $4,%cl; movb %cl,1(%arg1) // store lit_pos_bits
andb $0xf,%al; movb %al, (%arg1) // store lit_context_bits
leaq -szSizeT(%arg1),%arg4 // &inSizeProcessed
pushq %rax // return address slot (dummy CALL)
section LZMA_DEC10
#include "lzma_d_cs.S"
section LZMA_DEC20
#include "lzma_d_cf.S"
section LZMA_DEC30
movq -1*8(%rbp),%rsi // src [after header]
movq 2*8(%rbp),%rdi // dst
movl szSizeT(%rbx),%ecx; addq %rcx,%rsi // inSizeProcessed
movl (%rbx),%edx; addq %rdx,%rdi // outSizeProcessed
leave // movl %ebp,%rsp; popq %rbp
not_lzma:
// vi:ts=8:et

View File

@ -29,6 +29,7 @@
<jreiser@users.sourceforge.net>
*/
cmpb $ M_NRV2B_LE32,methb; je top_n2b; jmp not_n2b
.p2align 3
lit_n2b:
incq %rsi; movb %dl,(%rdi)
@ -62,6 +63,7 @@ gotlen_n2b:
bot_n2b: # In: 0==len
jmp top_n2b
not_n2b:
/*
vi:ts=8:et:nowrap
*/

View File

@ -29,6 +29,7 @@
<jreiser@users.sourceforge.net>
*/
cmpb $ M_NRV2E_LE32,methb; je top_n2e; jmp not_n2e
.p2align 3
lit_n2e:
incq %rsi; movb %dl,(%rdi)
@ -75,6 +76,8 @@ gotlen_n2e:
bot_n2e: # In: 0==len
jmp top_n2e
not_n2e:
/*
vi:ts=8:et:nowrap
*/

View File

@ -11,5 +11,6 @@
#define sys4l r10d
#define arg5 r8
#define arg5l r8d
#define arg5b r8b
#define arg6 r9
#define arg6l r9d

View File

@ -0,0 +1,158 @@
/*
; lzma_d.ash -- 32-bit assembly
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 2006-2006 Markus Franz Xaver Johannes Oberhumer
; 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
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/upx/
;
; ------------- DECOMPRESSION -------------
; Input:
; esi - source
; edi - dest
; cld
; Output:
; eax - 0
; ecx - 0
*/
// CPU 386
//
// init
section LZMA_DEC00
// ebx = alloca('UPXa');
mov ebp, esp // save stack
lea ebx, [esp + UPXa]
xor eax, eax
.clearstack1:
push eax
cmp esp, ebx
jnz .clearstack1
inc esi // skip 2 bytes for properties
inc esi
push ebx // &outSizeProcessed
push UPXb // outSize
push edi // out
add ebx, 4
push ebx // &inSizeProcessed
push UPXc // inSize
push esi // in
add ebx, 4
push ebx // &CLzmaDecoderState
push eax // dummy for call
// hardwired LzmaDecodeProperties()
mov dword ptr [ebx], offset UPXd // lc, lp, pb, dummy
section LZMA_ELF00
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#ifndef O_OUTS // ELF defines them, others do not care
#define O_OUTS 0
#define O_INS 0
#endif
mov ebp, esp // save stack
mov edx,[O_INS + ebp] // inSize
lodsb // first byte, replaces LzmaDecodeProperties()
dec edx
mov cl,al // cl= ((lit_context_bits + lit_pos_bits)<<3) | pos_bits
and al,7 // al= pos_bits
shr cl,3 // cl= lit_context_bits + lit_pos_bits
mov ebx, -LZMA_LIT_SIZE
shl ebx,cl
// inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState
lea ebx,[0 -(2*4 +4) - 2*LZMA_BASE_SIZE + 2*ebx + esp]
and ebx, (~0<<5) // 32-byte align
.elf_clearstack1:
push 0
cmp esp,ebx
jne .elf_clearstack1
push ebx // &outSizeProcessed
add ebx, 4
mov ecx,[O_OUTS + ebp] // &outSize
push dword [ecx] // outSize
push edi // out
push ebx // &inSizeProcessed
add ebx, 4
mov [2+ ebx],al // store pos_bits
lodsb // second byte, replaces LzmaDecodeProperties()
dec edx
mov cl,al // cl= (lit_pos_bits<<4) | lit_context_bits
and al,0xf
mov [ ebx],al // store lit_context_bits
shr cl,4
mov [1+ ebx],cl // store lit_pos_bits
push edx // inSize -2
push esi // in
push ebx // &CLzmaDecoderState
push eax // return address slot (dummy CALL)
section LZMA_DEC10
#include "lzma_d_cs_2.ash"
section LZMA_DEC20
#include "lzma_d_cf_2.ash"
//
// cleanup
section LZMA_DEC30
add esi, [ebx - 4] // inSizeProcessed
add edi, [ebx - 8] // outSizeProcessed
xor eax, eax
lea ecx, [esp - 256]
mov esp, ebp // restore stack
.clearstack2:
push eax
cmp esp, ecx
jnz .clearstack2
mov esp, ebp // restore stack
xor ecx, ecx
// vi:ts=8:et

View File

@ -0,0 +1,169 @@
db 85, 87, 86, 83,131,236,124,139,148, 36,144, 0, 0, 0,199, 68 // 0x0000
db 36,116, 0, 0, 0, 0,198, 68, 36,115, 0,139,172, 36,156, 0 // 0x0010
db 0, 0,141, 66, 4,137, 68, 36,120,184, 1, 0, 0, 0, 15,182 // 0x0020
db 74, 2,137,195,211,227,137,217, 73,137, 76, 36,108, 15,182, 74 // 0x0030
db 1,211,224, 72,137, 68, 36,104,139,132, 36,168, 0, 0, 0, 15 // 0x0040
db 182, 50,199, 69, 0, 0, 0, 0, 0,199, 68, 36, 96, 0, 0, 0 // 0x0050
db 0,199, 0, 0, 0, 0, 0,184, 0, 3, 0, 0,137,116, 36,100 // 0x0060
db 199, 68, 36, 92, 1, 0, 0, 0,199, 68, 36, 88, 1, 0, 0, 0 // 0x0070
db 199, 68, 36, 84, 1, 0, 0, 0,199, 68, 36, 80, 1, 0, 0, 0 // 0x0080
db 15,182, 74, 1, 1,241,211,224,141,136, 54, 7, 0, 0, 57, 76 // 0x0090
db 36,116,115, 14,139, 68, 36,120,102,199, 0, 0, 4,131,192, 2 // 0x00a0
db 226,246,139,156, 36,148, 0, 0, 0, 49,255,199, 68, 36, 72,255 // 0x00b0
db 255,255,255,137,218, 3,148, 36,152, 0, 0, 0,137, 84, 36, 76 // 0x00c0
db 49,210, 59, 92, 36, 76, 15,132,124, 9, 0, 0, 15,182, 3,193 // 0x00d0
db 231, 8, 66, 67, 9,199,131,250, 4,126,231,139,140, 36,164, 0 // 0x00e0
db 0, 0, 57, 76, 36,116, 15,131,100, 9, 0, 0,139,116, 36,116 // 0x00f0
db 35,116, 36,108,139, 68, 36, 96,139, 84, 36,120,193,224, 4,137 // 0x0100
db 116, 36, 68, 1,240,129,124, 36, 72,255,255,255, 0,141, 44, 66 // 0x0110
db 119, 24, 59, 92, 36, 76, 15,132, 44, 9, 0, 0,193,100, 36, 72 // 0x0120
db 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72,102,139 // 0x0130
db 85, 0,193,232, 11, 15,183,202, 15,175,193, 57,199, 15,131,221 // 0x0140
db 1, 0, 0,137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,138, 76 // 0x0150
db 36,100,193,248, 5,190, 1, 0, 0, 0,141, 4, 2, 15,182, 84 // 0x0160
db 36,115,102,137, 69, 0,139, 68, 36,116, 35, 68, 36,104,139,108 // 0x0170
db 36,120,211,224,185, 8, 0, 0, 0, 43, 76, 36,100,211,250, 1 // 0x0180
db 208,105,192, 0, 6, 0, 0,131,124, 36, 96, 6,141,132, 5,108 // 0x0190
db 14, 0, 0,137, 68, 36, 20, 15,142,202, 0, 0, 0,139, 68, 36 // 0x01a0
db 116, 43, 68, 36, 92,139,148, 36,160, 0, 0, 0, 15,182, 4, 2 // 0x01b0
db 137, 68, 36, 64,209,100, 36, 64,139, 76, 36, 64,141, 20, 54,139 // 0x01c0
db 108, 36, 20,129,225, 0, 1, 0, 0,129,124, 36, 72,255,255,255 // 0x01d0
db 0,141, 68, 77, 0,137, 76, 36, 60,141, 44, 16,119, 24, 59, 92 // 0x01e0
db 36, 76, 15,132, 96, 8, 0, 0,193,100, 36, 72, 8, 15,182, 3 // 0x01f0
db 193,231, 8, 67, 9,199,139, 68, 36, 72,102,139,141, 0, 2, 0 // 0x0200
db 0,193,232, 11, 15,183,241, 15,175,198, 57,199,115, 35,137, 68 // 0x0210
db 36, 72,184, 0, 8, 0, 0, 41,240,137,214,193,248, 5,131,124 // 0x0220
db 36, 60, 0,141, 4, 1,102,137,133, 0, 2, 0, 0,116, 34,235 // 0x0230
db 46, 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5 // 0x0240
db 102, 41,193,131,124, 36, 60, 0,102,137,141, 0, 2, 0, 0,116 // 0x0250
db 14,129,254,255, 0, 0, 0, 15,142, 87,255,255,255,235,121,129 // 0x0260
db 254,255, 0, 0, 0,127,113,141, 20, 54,139,108, 36, 20, 1,213 // 0x0270
db 129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132 // 0x0280
db 196, 7, 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67 // 0x0290
db 9,199,139, 68, 36, 72,102,139, 77, 0,193,232, 11, 15,183,241 // 0x02a0
db 15,175,198, 57,199,115, 25,137, 68, 36, 72,184, 0, 8, 0, 0 // 0x02b0
db 41,240,137,214,193,248, 5,141, 4, 1,102,137, 69, 0,235,159 // 0x02c0
db 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5,102 // 0x02d0
db 41,193,102,137, 77, 0,235,135,139, 84, 36,116,137,240,139,140 // 0x02e0
db 36,160, 0, 0, 0,136, 68, 36,115,136, 4, 10, 66,131,124, 36 // 0x02f0
db 96, 3,137, 84, 36,116,127, 13,199, 68, 36, 96, 0, 0, 0, 0 // 0x0300
db 233, 27, 7, 0, 0,131,124, 36, 96, 9,127, 10,131,108, 36, 96 // 0x0310
db 3,233, 10, 7, 0, 0,131,108, 36, 96, 6,233, 0, 7, 0, 0 // 0x0320
db 139, 76, 36, 72, 41,199,139,116, 36, 96, 41,193,137,208,102,193 // 0x0330
db 232, 5,102, 41,194,129,249,255,255,255, 0,102,137, 85, 0,139 // 0x0340
db 108, 36,120,141,116,117, 0,137,116, 36, 56,119, 22, 59, 92, 36 // 0x0350
db 76, 15,132,241, 6, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x0360
db 67, 9,199,139,108, 36, 56,137,200,193,232, 11,102,139,149,128 // 0x0370
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 82,137,198,184 // 0x0380
db 0, 8, 0, 0, 41,232,139,108, 36, 88,193,248, 5,139, 76, 36 // 0x0390
db 84,141, 4, 2,139, 84, 36, 56,137, 76, 36, 80,139, 76, 36,120 // 0x03a0
db 102,137,130,128, 1, 0, 0,139, 68, 36, 92,137,108, 36, 84,137 // 0x03b0
db 68, 36, 88, 49,192,131,124, 36, 96, 6, 15,159,192,129,193,100 // 0x03c0
db 6, 0, 0,141, 4, 64,137, 68, 36, 96,233,116, 2, 0, 0,137 // 0x03d0
db 206, 41,199, 41,198,137,208,102,193,232, 5,139, 76, 36, 56,102 // 0x03e0
db 41,194,129,254,255,255,255, 0,102,137,145,128, 1, 0, 0,119 // 0x03f0
db 22, 59, 92, 36, 76, 15,132, 77, 6, 0, 0, 15,182, 3,193,231 // 0x0400
db 8,193,230, 8, 67, 9,199,139,108, 36, 56,137,242,193,234, 11 // 0x0410
db 102,139,141,152, 1, 0, 0, 15,183,193, 15,175,208, 57,215, 15 // 0x0420
db 131,227, 0, 0, 0,189, 0, 8, 0, 0,137,214, 41,197,199, 68 // 0x0430
db 36, 52, 0, 8, 0, 0,137,232,193,248, 5,141, 4, 1,139, 76 // 0x0440
db 36, 56,102,137,129,152, 1, 0, 0,139, 68, 36, 96,139, 76, 36 // 0x0450
db 68,193,224, 5, 3, 68, 36,120,129,250,255,255,255, 0,141, 44 // 0x0460
db 72,119, 22, 59, 92, 36, 76, 15,132,219, 5, 0, 0, 15,182, 3 // 0x0470
db 193,231, 8,193,230, 8, 67, 9,199,102,139,149,224, 1, 0, 0 // 0x0480
db 137,240,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 96, 41 // 0x0490
db 76, 36, 52,193,124, 36, 52, 5,139,116, 36, 52,137, 68, 36, 72 // 0x04a0
db 131,124, 36,116, 0,141, 4, 50,102,137,133,224, 1, 0, 0, 15 // 0x04b0
db 132,147, 5, 0, 0, 49,192,131,124, 36, 96, 6,139,172, 36,160 // 0x04c0
db 0, 0, 0,139, 84, 36,116, 15,159,192,141, 68, 0, 9,137, 68 // 0x04d0
db 36, 96,139, 68, 36,116, 43, 68, 36, 92,138, 68, 5, 0,136, 68 // 0x04e0
db 36,115,136, 4, 42, 66,137, 84, 36,116,233, 49, 5, 0, 0, 41 // 0x04f0
db 198, 41,199,137,208,102,193,232, 5,102, 41,194,102,137,149,224 // 0x0500
db 1, 0, 0,233, 31, 1, 0, 0,137,200, 41,214,102,193,232, 5 // 0x0510
db 139,108, 36, 56,102, 41,193, 41,215,129,254,255,255,255, 0,102 // 0x0520
db 137,141,152, 1, 0, 0,119, 22, 59, 92, 36, 76, 15,132, 22, 5 // 0x0530
db 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199,139, 76 // 0x0540
db 36, 56,137,240,193,232, 11,102,139,145,176, 1, 0, 0, 15,183 // 0x0550
db 202, 15,175,193, 57,199,115, 35,137,198,184, 0, 8, 0, 0, 41 // 0x0560
db 200,139,108, 36, 56,193,248, 5,141, 4, 2,102,137,133,176, 1 // 0x0570
db 0, 0,139, 68, 36, 88,233,160, 0, 0, 0,137,241, 41,199, 41 // 0x0580
db 193,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56,129,249 // 0x0590
db 255,255,255, 0,102,137,144,176, 1, 0, 0,119, 22, 59, 92, 36 // 0x05a0
db 76, 15,132,161, 4, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x05b0
db 67, 9,199,139,116, 36, 56,137,200,193,232, 11,102,139,150,200 // 0x05c0
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 32,137,198,184 // 0x05d0
db 0, 8, 0, 0, 41,232,139,108, 36, 56,193,248, 5,141, 4, 2 // 0x05e0
db 102,137,133,200, 1, 0, 0,139, 68, 36, 84,235, 38,137,206, 41 // 0x05f0
db 199, 41,198,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56 // 0x0600
db 102,137,144,200, 1, 0, 0,139, 84, 36, 84,139, 68, 36, 80,137 // 0x0610
db 84, 36, 80,139, 76, 36, 88,137, 76, 36, 84,139,108, 36, 92,137 // 0x0620
db 68, 36, 92,137,108, 36, 88, 49,192,131,124, 36, 96, 6,139, 76 // 0x0630
db 36,120, 15,159,192,129,193,104, 10, 0, 0,141, 68, 64, 8,137 // 0x0640
db 68, 36, 96,129,254,255,255,255, 0,119, 22, 59, 92, 36, 76, 15 // 0x0650
db 132,243, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9 // 0x0660
db 199,102,139, 17,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x0670
db 199,115, 47,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x0680
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 0, 0, 0, 0,141, 4 // 0x0690
db 2,102,137, 1,139, 68, 36, 68,141, 76, 1, 4,137, 76, 36, 16 // 0x06a0
db 235,114, 41,198, 41,199,137,208,102,193,232, 5,102, 41,194,129 // 0x06b0
db 254,255,255,255, 0,102,137, 17,119, 22, 59, 92, 36, 76, 15,132 // 0x06c0
db 132, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199 // 0x06d0
db 102,139, 81, 2,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x06e0
db 199,115, 59,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x06f0
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 8, 0, 0, 0,141, 4 // 0x0700
db 2,139, 84, 36, 68,102,137, 65, 2,141,140, 17, 4, 1, 0, 0 // 0x0710
db 137, 76, 36, 16,199, 68, 36, 48, 3, 0, 0, 0,235, 47, 41,198 // 0x0720
db 41,199,137,208,137,116, 36, 72,102,193,232, 5,199, 68, 36, 44 // 0x0730
db 16, 0, 0, 0,102, 41,194,199, 68, 36, 48, 8, 0, 0, 0,102 // 0x0740
db 137, 81, 2,129,193, 4, 2, 0, 0,137, 76, 36, 16,139, 76, 36 // 0x0750
db 48,186, 1, 0, 0, 0,137, 76, 36, 40,141, 44, 18,139,116, 36 // 0x0760
db 16, 1,238,129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36 // 0x0770
db 76, 15,132,209, 2, 0, 0,193,100, 36, 72, 8, 15,182, 3,193 // 0x0780
db 231, 8, 67, 9,199,139, 68, 36, 72,102,139, 22,193,232, 11, 15 // 0x0790
db 183,202, 15,175,193, 57,199,115, 24,137, 68, 36, 72,184, 0, 8 // 0x07a0
db 0, 0, 41,200,193,248, 5,141, 4, 2,137,234,102,137, 6,235 // 0x07b0
db 21, 41, 68, 36, 72, 41,199,137,208,102,193,232, 5,102, 41,194 // 0x07c0
db 102,137, 22,141, 85, 1,139,116, 36, 40, 78,137,116, 36, 40,117 // 0x07d0
db 137,138, 76, 36, 48,184, 1, 0, 0, 0,211,224, 41,194, 3, 84 // 0x07e0
db 36, 44,131,124, 36, 96, 3,137, 84, 36, 12, 15,143,231, 1, 0 // 0x07f0
db 0,131, 68, 36, 96, 7,131,250, 3,137,208,126, 5,184, 3, 0 // 0x0800
db 0, 0,139,116, 36,120,193,224, 7,199, 68, 36, 36, 6, 0, 0 // 0x0810
db 0,141,132, 6, 96, 3, 0, 0,137, 68, 36, 8,184, 1, 0, 0 // 0x0820
db 0,141, 44, 0,139,116, 36, 8, 1,238,129,124, 36, 72,255,255 // 0x0830
db 255, 0,119, 24, 59, 92, 36, 76, 15,132, 10, 2, 0, 0,193,100 // 0x0840
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0850
db 102,139, 22,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 24 // 0x0860
db 137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4 // 0x0870
db 2,102,137, 6,137,232,235, 21, 41, 68, 36, 72, 41,199,137,208 // 0x0880
db 102,193,232, 5,102, 41,194,141, 69, 1,102,137, 22,139,108, 36 // 0x0890
db 36, 77,137,108, 36, 36,117,137,141, 80,192,131,250, 3,137, 20 // 0x08a0
db 36, 15,142, 39, 1, 0, 0,137,208,137,214,209,248,131,230, 1 // 0x08b0
db 141, 72,255,131,206, 2,131,250, 13,137, 76, 36, 32,127, 28,139 // 0x08c0
db 108, 36,120,211,230, 1,210,137, 52, 36,141, 68,117, 0, 41,208 // 0x08d0
db 5, 94, 5, 0, 0,137, 68, 36, 4,235, 86,141, 80,251,129,124 // 0x08e0
db 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132, 86, 1 // 0x08f0
db 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199 // 0x0900
db 209,108, 36, 72, 1,246, 59,124, 36, 72,114, 7, 43,124, 36, 72 // 0x0910
db 131,206, 1, 74,117,200,139, 68, 36,120,193,230, 4,137, 52, 36 // 0x0920
db 5, 68, 6, 0, 0,199, 68, 36, 32, 4, 0, 0, 0,137, 68, 36 // 0x0930
db 4,199, 68, 36, 28, 1, 0, 0, 0,184, 1, 0, 0, 0,139,108 // 0x0940
db 36, 4, 1,192,137, 68, 36, 24, 1,197,129,124, 36, 72,255,255 // 0x0950
db 255, 0,119, 24, 59, 92, 36, 76, 15,132,234, 0, 0, 0,193,100 // 0x0960
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0970
db 102,139, 85, 0,193,232, 11, 15,183,242, 15,175,198, 57,199,115 // 0x0980
db 27,137, 68, 36, 72,184, 0, 8, 0, 0, 41,240,193,248, 5,141 // 0x0990
db 4, 2,102,137, 69, 0,139, 68, 36, 24,235, 31, 41, 68, 36, 72 // 0x09a0
db 41,199,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 24,102 // 0x09b0
db 137, 85, 0,139, 84, 36, 28, 64, 9, 20, 36,139, 76, 36, 32,209 // 0x09c0
db 100, 36, 28, 73,137, 76, 36, 32, 15,133,112,255,255,255,139, 52 // 0x09d0
db 36, 70,137,116, 36, 92,116, 89,139, 76, 36, 12,139,108, 36,116 // 0x09e0
db 131,193, 2, 57,108, 36, 92,119, 95,139,132, 36,160, 0, 0, 0 // 0x09f0
db 137,234, 43, 68, 36, 92, 3,148, 36,160, 0, 0, 0,141, 52, 40 // 0x0a00
db 138, 6, 70,136, 68, 36,115,136, 2, 66,255, 68, 36,116, 73,116 // 0x0a10
db 15,139,172, 36,164, 0, 0, 0, 57,108, 36,116,114,226,235, 17 // 0x0a20
db 139,132, 36,164, 0, 0, 0, 57, 68, 36,116, 15,130,187,246,255 // 0x0a30
db 255,129,124, 36, 72,255,255,255, 0,119, 21, 59, 92, 36, 76,184 // 0x0a40
db 1, 0, 0, 0,116, 41,235, 7,184, 1, 0, 0, 0,235, 32, 67 // 0x0a50
db 43,156, 36,148, 0, 0, 0, 49,192,139,148, 36,156, 0, 0, 0 // 0x0a60
db 139, 76, 36,116,137, 26,139,156, 36,168, 0, 0, 0,137, 11,131 // 0x0a70
db 196,124, 91, 94, 95, 93 // 0x0a80

View File

@ -0,0 +1,169 @@
db 85, 87, 86, 83,131,236,124,139,148, 36,144, 0, 0, 0,199, 68 // 0x0000
db 36,116, 0, 0, 0, 0,198, 68, 36,115, 0,139,172, 36,156, 0 // 0x0010
db 0, 0,141, 66, 4,137, 68, 36,120,184, 1, 0, 0, 0, 15,182 // 0x0020
db 74, 2,137,195,211,227,137,217, 73,137, 76, 36,108, 15,182, 74 // 0x0030
db 1,211,224, 72,137, 68, 36,104,139,132, 36,168, 0, 0, 0, 15 // 0x0040
db 182, 50,199, 69, 0, 0, 0, 0, 0,199, 68, 36, 96, 0, 0, 0 // 0x0050
db 0,199, 0, 0, 0, 0, 0,184, 0, 3, 0, 0,137,116, 36,100 // 0x0060
db 199, 68, 36, 92, 1, 0, 0, 0,199, 68, 36, 88, 1, 0, 0, 0 // 0x0070
db 199, 68, 36, 84, 1, 0, 0, 0,199, 68, 36, 80, 1, 0, 0, 0 // 0x0080
db 15,182, 74, 1, 1,241,211,224,141,136, 54, 7, 0, 0, 57, 76 // 0x0090
db 36,116,115, 14,139, 68, 36,120,102,199, 0, 0, 4,131,192, 2 // 0x00a0
db 226,246,139,156, 36,148, 0, 0, 0, 49,255,199, 68, 36, 72,255 // 0x00b0
db 255,255,255,137,218, 3,148, 36,152, 0, 0, 0,137, 84, 36, 76 // 0x00c0
db 49,210, 59, 92, 36, 76, 15,132,124, 9, 0, 0, 15,182, 3,193 // 0x00d0
db 231, 8, 66, 67, 9,199,131,250, 4,126,231,139,140, 36,164, 0 // 0x00e0
db 0, 0, 57, 76, 36,116, 15,131,100, 9, 0, 0,139,116, 36,116 // 0x00f0
db 35,116, 36,108,139, 68, 36, 96,139, 84, 36,120,193,224, 4,137 // 0x0100
db 116, 36, 68, 1,240,129,124, 36, 72,255,255,255, 0,141, 44, 66 // 0x0110
db 119, 24, 59, 92, 36, 76, 15,132, 44, 9, 0, 0,193,100, 36, 72 // 0x0120
db 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72,102,139 // 0x0130
db 85, 0,193,232, 11, 15,183,202, 15,175,193, 57,199, 15,131,221 // 0x0140
db 1, 0, 0,137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,138, 76 // 0x0150
db 36,100,193,248, 5,190, 1, 0, 0, 0,141, 4, 2, 15,182, 84 // 0x0160
db 36,115,102,137, 69, 0,139, 68, 36,116, 35, 68, 36,104,139,108 // 0x0170
db 36,120,211,224,185, 8, 0, 0, 0, 43, 76, 36,100,211,250, 1 // 0x0180
db 208,105,192, 0, 6, 0, 0,131,124, 36, 96, 6,141,132, 5,108 // 0x0190
db 14, 0, 0,137, 68, 36, 20, 15,142,202, 0, 0, 0,139, 68, 36 // 0x01a0
db 116, 43, 68, 36, 92,139,148, 36,160, 0, 0, 0, 15,182, 4, 2 // 0x01b0
db 137, 68, 36, 64,209,100, 36, 64,139, 76, 36, 64,141, 20, 54,139 // 0x01c0
db 108, 36, 20,129,225, 0, 1, 0, 0,129,124, 36, 72,255,255,255 // 0x01d0
db 0,141, 68, 77, 0,137, 76, 36, 60,141, 44, 16,119, 24, 59, 92 // 0x01e0
db 36, 76, 15,132, 96, 8, 0, 0,193,100, 36, 72, 8, 15,182, 3 // 0x01f0
db 193,231, 8, 67, 9,199,139, 68, 36, 72,102,139,141, 0, 2, 0 // 0x0200
db 0,193,232, 11, 15,183,241, 15,175,198, 57,199,115, 35,137, 68 // 0x0210
db 36, 72,184, 0, 8, 0, 0, 41,240,137,214,193,248, 5,131,124 // 0x0220
db 36, 60, 0,141, 4, 1,102,137,133, 0, 2, 0, 0,116, 34,235 // 0x0230
db 46, 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5 // 0x0240
db 102, 41,193,131,124, 36, 60, 0,102,137,141, 0, 2, 0, 0,116 // 0x0250
db 14,129,254,255, 0, 0, 0, 15,142, 87,255,255,255,235,121,129 // 0x0260
db 254,255, 0, 0, 0,127,113,141, 20, 54,139,108, 36, 20, 1,213 // 0x0270
db 129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132 // 0x0280
db 196, 7, 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67 // 0x0290
db 9,199,139, 68, 36, 72,102,139, 77, 0,193,232, 11, 15,183,241 // 0x02a0
db 15,175,198, 57,199,115, 25,137, 68, 36, 72,184, 0, 8, 0, 0 // 0x02b0
db 41,240,137,214,193,248, 5,141, 4, 1,102,137, 69, 0,235,159 // 0x02c0
db 41, 68, 36, 72, 41,199,137,200,141,114, 1,102,193,232, 5,102 // 0x02d0
db 41,193,102,137, 77, 0,235,135,139, 84, 36,116,137,240,139,140 // 0x02e0
db 36,160, 0, 0, 0,136, 68, 36,115,136, 4, 10, 66,131,124, 36 // 0x02f0
db 96, 3,137, 84, 36,116,127, 13,199, 68, 36, 96, 0, 0, 0, 0 // 0x0300
db 233, 27, 7, 0, 0,131,124, 36, 96, 9,127, 10,131,108, 36, 96 // 0x0310
db 3,233, 10, 7, 0, 0,131,108, 36, 96, 6,233, 0, 7, 0, 0 // 0x0320
db 139, 76, 36, 72, 41,199,139,116, 36, 96, 41,193,137,208,102,193 // 0x0330
db 232, 5,102, 41,194,129,249,255,255,255, 0,102,137, 85, 0,139 // 0x0340
db 108, 36,120,141,116,117, 0,137,116, 36, 56,119, 22, 59, 92, 36 // 0x0350
db 76, 15,132,241, 6, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x0360
db 67, 9,199,139,108, 36, 56,137,200,193,232, 11,102,139,149,128 // 0x0370
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 82,137,198,184 // 0x0380
db 0, 8, 0, 0, 41,232,139,108, 36, 88,193,248, 5,139, 76, 36 // 0x0390
db 84,141, 4, 2,139, 84, 36, 56,137, 76, 36, 80,139, 76, 36,120 // 0x03a0
db 102,137,130,128, 1, 0, 0,139, 68, 36, 92,137,108, 36, 84,137 // 0x03b0
db 68, 36, 88, 49,192,131,124, 36, 96, 6, 15,159,192,129,193,100 // 0x03c0
db 6, 0, 0,141, 4, 64,137, 68, 36, 96,233,116, 2, 0, 0,137 // 0x03d0
db 206, 41,199, 41,198,137,208,102,193,232, 5,139, 76, 36, 56,102 // 0x03e0
db 41,194,129,254,255,255,255, 0,102,137,145,128, 1, 0, 0,119 // 0x03f0
db 22, 59, 92, 36, 76, 15,132, 77, 6, 0, 0, 15,182, 3,193,231 // 0x0400
db 8,193,230, 8, 67, 9,199,139,108, 36, 56,137,242,193,234, 11 // 0x0410
db 102,139,141,152, 1, 0, 0, 15,183,193, 15,175,208, 57,215, 15 // 0x0420
db 131,227, 0, 0, 0,189, 0, 8, 0, 0,137,214, 41,197,199, 68 // 0x0430
db 36, 52, 0, 8, 0, 0,137,232,193,248, 5,141, 4, 1,139, 76 // 0x0440
db 36, 56,102,137,129,152, 1, 0, 0,139, 68, 36, 96,139, 76, 36 // 0x0450
db 68,193,224, 5, 3, 68, 36,120,129,250,255,255,255, 0,141, 44 // 0x0460
db 72,119, 22, 59, 92, 36, 76, 15,132,219, 5, 0, 0, 15,182, 3 // 0x0470
db 193,231, 8,193,230, 8, 67, 9,199,102,139,149,224, 1, 0, 0 // 0x0480
db 137,240,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 96, 41 // 0x0490
db 76, 36, 52,193,124, 36, 52, 5,139,116, 36, 52,137, 68, 36, 72 // 0x04a0
db 131,124, 36,116, 0,141, 4, 50,102,137,133,224, 1, 0, 0, 15 // 0x04b0
db 132,147, 5, 0, 0, 49,192,131,124, 36, 96, 6,139,172, 36,160 // 0x04c0
db 0, 0, 0,139, 84, 36,116, 15,159,192,141, 68, 0, 9,137, 68 // 0x04d0
db 36, 96,139, 68, 36,116, 43, 68, 36, 92,138, 68, 5, 0,136, 68 // 0x04e0
db 36,115,136, 4, 42, 66,137, 84, 36,116,233, 49, 5, 0, 0, 41 // 0x04f0
db 198, 41,199,137,208,102,193,232, 5,102, 41,194,102,137,149,224 // 0x0500
db 1, 0, 0,233, 31, 1, 0, 0,137,200, 41,214,102,193,232, 5 // 0x0510
db 139,108, 36, 56,102, 41,193, 41,215,129,254,255,255,255, 0,102 // 0x0520
db 137,141,152, 1, 0, 0,119, 22, 59, 92, 36, 76, 15,132, 22, 5 // 0x0530
db 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199,139, 76 // 0x0540
db 36, 56,137,240,193,232, 11,102,139,145,176, 1, 0, 0, 15,183 // 0x0550
db 202, 15,175,193, 57,199,115, 35,137,198,184, 0, 8, 0, 0, 41 // 0x0560
db 200,139,108, 36, 56,193,248, 5,141, 4, 2,102,137,133,176, 1 // 0x0570
db 0, 0,139, 68, 36, 88,233,160, 0, 0, 0,137,241, 41,199, 41 // 0x0580
db 193,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56,129,249 // 0x0590
db 255,255,255, 0,102,137,144,176, 1, 0, 0,119, 22, 59, 92, 36 // 0x05a0
db 76, 15,132,161, 4, 0, 0, 15,182, 3,193,231, 8,193,225, 8 // 0x05b0
db 67, 9,199,139,116, 36, 56,137,200,193,232, 11,102,139,150,200 // 0x05c0
db 1, 0, 0, 15,183,234, 15,175,197, 57,199,115, 32,137,198,184 // 0x05d0
db 0, 8, 0, 0, 41,232,139,108, 36, 56,193,248, 5,141, 4, 2 // 0x05e0
db 102,137,133,200, 1, 0, 0,139, 68, 36, 84,235, 38,137,206, 41 // 0x05f0
db 199, 41,198,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 56 // 0x0600
db 102,137,144,200, 1, 0, 0,139, 84, 36, 84,139, 68, 36, 80,137 // 0x0610
db 84, 36, 80,139, 76, 36, 88,137, 76, 36, 84,139,108, 36, 92,137 // 0x0620
db 68, 36, 92,137,108, 36, 88, 49,192,131,124, 36, 96, 6,139, 76 // 0x0630
db 36,120, 15,159,192,129,193,104, 10, 0, 0,141, 68, 64, 8,137 // 0x0640
db 68, 36, 96,129,254,255,255,255, 0,119, 22, 59, 92, 36, 76, 15 // 0x0650
db 132,243, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9 // 0x0660
db 199,102,139, 17,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x0670
db 199,115, 47,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x0680
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 0, 0, 0, 0,141, 4 // 0x0690
db 2,102,137, 1,139, 68, 36, 68,141, 76, 1, 4,137, 76, 36, 16 // 0x06a0
db 235,114, 41,198, 41,199,137,208,102,193,232, 5,102, 41,194,129 // 0x06b0
db 254,255,255,255, 0,102,137, 17,119, 22, 59, 92, 36, 76, 15,132 // 0x06c0
db 132, 3, 0, 0, 15,182, 3,193,231, 8,193,230, 8, 67, 9,199 // 0x06d0
db 102,139, 81, 2,137,240,193,232, 11, 15,183,234, 15,175,197, 57 // 0x06e0
db 199,115, 59,137, 68, 36, 72,184, 0, 8, 0, 0, 41,232,193,100 // 0x06f0
db 36, 68, 4,193,248, 5,199, 68, 36, 44, 8, 0, 0, 0,141, 4 // 0x0700
db 2,139, 84, 36, 68,102,137, 65, 2,141,140, 17, 4, 1, 0, 0 // 0x0710
db 137, 76, 36, 16,199, 68, 36, 48, 3, 0, 0, 0,235, 47, 41,198 // 0x0720
db 41,199,137,208,137,116, 36, 72,102,193,232, 5,199, 68, 36, 44 // 0x0730
db 16, 0, 0, 0,102, 41,194,199, 68, 36, 48, 8, 0, 0, 0,102 // 0x0740
db 137, 81, 2,129,193, 4, 2, 0, 0,137, 76, 36, 16,139, 76, 36 // 0x0750
db 48,186, 1, 0, 0, 0,137, 76, 36, 40,141, 44, 18,139,116, 36 // 0x0760
db 16, 1,238,129,124, 36, 72,255,255,255, 0,119, 24, 59, 92, 36 // 0x0770
db 76, 15,132,209, 2, 0, 0,193,100, 36, 72, 8, 15,182, 3,193 // 0x0780
db 231, 8, 67, 9,199,139, 68, 36, 72,102,139, 22,193,232, 11, 15 // 0x0790
db 183,202, 15,175,193, 57,199,115, 24,137, 68, 36, 72,184, 0, 8 // 0x07a0
db 0, 0, 41,200,193,248, 5,141, 4, 2,137,234,102,137, 6,235 // 0x07b0
db 21, 41, 68, 36, 72, 41,199,137,208,102,193,232, 5,102, 41,194 // 0x07c0
db 102,137, 22,141, 85, 1,139,116, 36, 40, 78,137,116, 36, 40,117 // 0x07d0
db 137,138, 76, 36, 48,184, 1, 0, 0, 0,211,224, 41,194, 3, 84 // 0x07e0
db 36, 44,131,124, 36, 96, 3,137, 84, 36, 12, 15,143,231, 1, 0 // 0x07f0
db 0,131, 68, 36, 96, 7,131,250, 3,137,208,126, 5,184, 3, 0 // 0x0800
db 0, 0,139,116, 36,120,193,224, 7,199, 68, 36, 36, 6, 0, 0 // 0x0810
db 0,141,132, 6, 96, 3, 0, 0,137, 68, 36, 8,184, 1, 0, 0 // 0x0820
db 0,141, 44, 0,139,116, 36, 8, 1,238,129,124, 36, 72,255,255 // 0x0830
db 255, 0,119, 24, 59, 92, 36, 76, 15,132, 10, 2, 0, 0,193,100 // 0x0840
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0850
db 102,139, 22,193,232, 11, 15,183,202, 15,175,193, 57,199,115, 24 // 0x0860
db 137, 68, 36, 72,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4 // 0x0870
db 2,102,137, 6,137,232,235, 21, 41, 68, 36, 72, 41,199,137,208 // 0x0880
db 102,193,232, 5,102, 41,194,141, 69, 1,102,137, 22,139,108, 36 // 0x0890
db 36, 77,137,108, 36, 36,117,137,141, 80,192,131,250, 3,137, 20 // 0x08a0
db 36, 15,142, 39, 1, 0, 0,137,208,137,214,209,248,131,230, 1 // 0x08b0
db 141, 72,255,131,206, 2,131,250, 13,137, 76, 36, 32,127, 28,139 // 0x08c0
db 108, 36,120,211,230, 1,210,137, 52, 36,141, 68,117, 0, 41,208 // 0x08d0
db 5, 94, 5, 0, 0,137, 68, 36, 4,235, 86,141, 80,251,129,124 // 0x08e0
db 36, 72,255,255,255, 0,119, 24, 59, 92, 36, 76, 15,132, 86, 1 // 0x08f0
db 0, 0,193,100, 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199 // 0x0900
db 209,108, 36, 72, 1,246, 59,124, 36, 72,114, 7, 43,124, 36, 72 // 0x0910
db 131,206, 1, 74,117,200,139, 68, 36,120,193,230, 4,137, 52, 36 // 0x0920
db 5, 68, 6, 0, 0,199, 68, 36, 32, 4, 0, 0, 0,137, 68, 36 // 0x0930
db 4,199, 68, 36, 28, 1, 0, 0, 0,184, 1, 0, 0, 0,139,108 // 0x0940
db 36, 4, 1,192,137, 68, 36, 24, 1,197,129,124, 36, 72,255,255 // 0x0950
db 255, 0,119, 24, 59, 92, 36, 76, 15,132,234, 0, 0, 0,193,100 // 0x0960
db 36, 72, 8, 15,182, 3,193,231, 8, 67, 9,199,139, 68, 36, 72 // 0x0970
db 102,139, 85, 0,193,232, 11, 15,183,242, 15,175,198, 57,199,115 // 0x0980
db 27,137, 68, 36, 72,184, 0, 8, 0, 0, 41,240,193,248, 5,141 // 0x0990
db 4, 2,102,137, 69, 0,139, 68, 36, 24,235, 31, 41, 68, 36, 72 // 0x09a0
db 41,199,137,208,102,193,232, 5,102, 41,194,139, 68, 36, 24,102 // 0x09b0
db 137, 85, 0,139, 84, 36, 28, 64, 9, 20, 36,139, 76, 36, 32,209 // 0x09c0
db 100, 36, 28, 73,137, 76, 36, 32, 15,133,112,255,255,255,139, 52 // 0x09d0
db 36, 70,137,116, 36, 92,116, 89,139, 76, 36, 12,139,108, 36,116 // 0x09e0
db 131,193, 2, 57,108, 36, 92,119, 95,139,132, 36,160, 0, 0, 0 // 0x09f0
db 137,234, 43, 68, 36, 92, 3,148, 36,160, 0, 0, 0,141, 52, 40 // 0x0a00
db 138, 6, 70,136, 68, 36,115,136, 2, 66,255, 68, 36,116, 73,116 // 0x0a10
db 15,139,172, 36,164, 0, 0, 0, 57,108, 36,116,114,226,235, 17 // 0x0a20
db 139,132, 36,164, 0, 0, 0, 57, 68, 36,116, 15,130,187,246,255 // 0x0a30
db 255,129,124, 36, 72,255,255,255, 0,119, 21, 59, 92, 36, 76,184 // 0x0a40
db 1, 0, 0, 0,116, 41,235, 7,184, 1, 0, 0, 0,235, 32, 67 // 0x0a50
db 43,156, 36,148, 0, 0, 0, 49,192,139,148, 36,156, 0, 0, 0 // 0x0a60
db 139, 76, 36,116,137, 26,139,156, 36,168, 0, 0, 0,137, 11,131 // 0x0a70
db 196,124, 91, 94, 95, 93 // 0x0a80

View File

@ -40,22 +40,21 @@
; ecx - 0
*/
// CPU 386
.macro getbit_n2b one
.ifc \one, 1
add ebx, ebx
jnz 1f
.endif
mov ebx, [esi]
sub esi, -4
sub esi, byte -4
adc ebx, ebx
1:
1:
.endm
#undef getbit
#define getbit getbit_n2b
#define getbit getbit_n2b
section N2BSMA10
@ -64,7 +63,7 @@ decompr_literals_n2b:
movsb
section N2BFAS10
jmps dcl1_n2b
.balign 8
.balign 8
section N2BFAS11
decompr_literalb_n2b:
mov al, [esi]
@ -81,14 +80,14 @@ dcl1_n2b:
getbit 32
dcl2_n2b:
section N2BSMA20
jcs decompr_literals_n2b
jc decompr_literals_n2b
xor eax, eax
inc eax
section N2BFAS20
#ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif
jcs decompr_literalb_n2b
#ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif
jc decompr_literalb_n2b
mov eax, 1
section N2BDEC20
loop1_n2b:
@ -96,23 +95,23 @@ loop1_n2b:
adc eax, eax
section N2BSMA30
getbit 1
jncs loop1_n2b
jnc loop1_n2b
section N2BFAS30
add ebx, ebx
jncs loop1_n2b
jnzs loopend1_n2b
jnc loop1_n2b
jnz loopend1_n2b
getbit 32
jncs loop1_n2b
jnc loop1_n2b
loopend1_n2b:
section N2BDEC30
xor ecx, ecx
sub eax, 3
jcs decompr_ebpeax_n2b
jb decompr_ebpeax_n2b
shl eax, 8
mov al, [esi]
inc esi
xor eax, -1
jzs decompr_end_n2b
jz decompr_end_n2b
mov ebp, eax
decompr_ebpeax_n2b:
getbit 1
@ -126,13 +125,13 @@ loop2_n2b:
adc ecx, ecx
section N2BSMA40
getbit 1
jncs loop2_n2b
jnc loop2_n2b
section N2BFAS40
add ebx, ebx
jnc loop2_n2b
jnz loopend2_n2b
getbit 32
jncs loop2_n2b
jnc loop2_n2b
loopend2_n2b:
section N2BDUMM1
section N2BSMA50
@ -145,44 +144,44 @@ decompr_got_mlen_n2b:
cmp ebp, -0xd00
adc ecx, 1
section N2BSMA60
#ifndef UPX102
#ifndef UPX102
push esi
#else
#else
mov edx, esi
#endif
#endif
lea esi, [edi+ebp]
rep
movsb
#ifndef UPX102
#ifndef UPX102
pop esi
#else
#else
mov esi, edx
#endif
#endif
jmp decompr_loop_n2b
section N2BFAS60
lea edx, [edi+ebp]
cmp ebp, -4
#ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif
jbes decompr_copy4_n2b
#ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif
jbe decompr_copy4_n2b
loop3_n2b:
mov al, [edx]
inc edx
mov [edi], al
inc edi
dec ecx
jnzs loop3_n2b
jnz loop3_n2b
jmp decompr_loop_n2b
section N2BFAS61
.balign 4
.balign 4
decompr_copy4_n2b:
mov eax, [edx]
add edx, 4
mov [edi], eax
add edi, 4
sub ecx, 4
jas decompr_copy4_n2b
ja decompr_copy4_n2b
add edi, ecx
jmp decompr_loop_n2b
section N2BDEC60

View File

@ -40,12 +40,11 @@
; ecx - 0
*/
// CPU 386
.macro getbit_n2d one
.ifc \one, 1
.ifc \one, 1
add ebx, ebx
jnz 1f
.endif
@ -54,6 +53,7 @@
adc ebx, ebx
1:
.endm
#undef getbit
#define getbit getbit_n2d
@ -85,9 +85,9 @@ section N2DSMA20
xor eax, eax
inc eax
section N2DFAS20
#ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif
#ifndef UPX102
mov al, [edi] // force data cache allocate (PentiumPlain or MMX)
#endif
jc decompr_literalb_n2d
mov eax, 1
section N2DDEC20
@ -118,7 +118,7 @@ loopend1_n2d:
inc esi
xor eax, -1
jz decompr_end_n2d
sar eax, 1 // shift low-bit into carry
sar eax, 1 // shift low-bit into carry
mov ebp, eax
jmps decompr_ebpeax_n2d
decompr_prev_dist_n2d:
@ -153,26 +153,26 @@ decompr_got_mlen_n2d:
cmp ebp, -0x500
adc ecx, 1
section N2DSMA60
#ifndef UPX102
#ifndef UPX102
push esi
#else
#else
mov edx, esi
#endif
#endif
lea esi, [edi+ebp]
rep
movsb
#ifndef UPX102
#ifndef UPX102
pop esi
#else
#else
mov esi, edx
#endif
#endif
jmp decompr_loop_n2d
section N2DFAS60
lea edx, [edi+ebp]
cmp ebp, -4
#ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif
#ifndef UPX102
mov al, [edi+ecx] // force data cache allocate (PentiumPlain or MMX)
#endif
jbe decompr_copy4_n2d
loop3_n2d:
mov al, [edx]

View File

@ -37,7 +37,7 @@ lzma_d_c%.S : lzma_d_c.c
$(call tc,gcc) $(PP_FLAGS) -c $< -o tmp/$T.o
$(call tc,objstrip) tmp/$T.o
$(call tc,objcopy) -O binary --only-section .text.LzmaDecode tmp/$T.o tmp/$T.bin
head -c-0 tmp/$T.bin > tmp/$T.out
head -c-4 tmp/$T.bin > tmp/$T.out
$(call tc,objdump) -b binary -m powerpc -D tmp/$T.out > tmp/$T.out.lst
$(call tc,bin2h) --mode=gas tmp/$T.out $@

View File

@ -24,7 +24,7 @@
<jreiser@users.sourceforge.net>
*/
#include "regs.h"
#include "ppc_regs.h"
ppcbxx: # (*f_unf)(xo->buf, out_len, h.b_cto8, h.b_ftid);
#define W_CTO 4 /* must match filteri/ppcbxx.h */

View File

@ -0,0 +1,114 @@
/*
; lzma_d.S -- 64-bit PowerPC assembly
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 2006-2006 Markus Franz Xaver Johannes Oberhumer
; 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
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/upx/
;
*/
#include "ppc_regs.h"
#define section .section
section LZMA_ELF00
//decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method)
/* Arguments according to calling convention */
#define src a0
#define lsrc a1
#define dst a2
#define ldst a3 /* Out: actually a reference: &len_dst */
#define meth a4
// ELFMAINX has already done this for us:
// pushq %rbp; push %rbx // C callable
// pushq ldst
// pushq dst
// addq src,lsrc; push lsrc // &input_eof
#define M_LZMA 14
teq r0,r0 // debugging
cmpli cr0,meth,M_LZMA
bne cr0,not_lzma
mflr r0
//LzmaDecode( // from lzmaSDK/C/7zip/Compress/LZMA_C/LzmaDecode.h
// a0= &CLzmaDecoderState,
// a1= inp, a2= inSize, a3= &inSizeProcessed,
// a4= outp, a5= outSize, a6= &outSizeProcessed
//)
lwz a5,0(ldst) // outSize
mr a4,dst // outp
addi a2,lsrc,-2 // inSize
la a1,2(src) // inp
stw r0,4(sp) // ret.addr
lbz r0,0(src) // first byte, replaces LzmaDecodeProperties()
rlwinm t1,r0,32-3,3,31 // t1= (r0>>3)==(lit_context-bits + lit_pos_bits)
rlwinm t0,r0,0,32-3,31 // t0= (7& t0)==pos_bits
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#define szSizeT 4
li a0,-2*LZMA_LIT_SIZE
slw a0,a0,t1 // -2*LZMA_LIT_SIZE << (lit_context_bits + lit_pos_bits)
addi a0,a0,-2*4 -(2*szSizeT +4) - 2*LZMA_BASE_SIZE
// alloca{sp,ra, inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState}
mr a3,sp
add sp,sp,a0
rlwinm sp,sp,0,0,32-6 // (1<<6) byte align
mr a0,a3 // old sp
li r0,0
1:
stwu r0,-4(a0) // clear CLZmaDecoderState on stack
cmpl cr0,sp,a0 // compare logical ==> compare unsigned
blt cr0,1b
stw a3,0(sp) // frame chain
lbz r0,-1(a1) // second byte, replaces LzmaDecodeProperties()
la a6,2*4 (sp) // &outSizeProcessed
la a3,2*4+1*szSizeT(sp) // &inSizeProcessed
la a0,2*4+2*szSizeT(sp) // &CLzmaDecoderState
rlwinm t1,r0,32-4,4,31 // t1= (r0>>4)==lit_pos_bits
rlwinm r0,r0,0,32-4,31 // r0= (0xf& r0)==lit_context_bits
stb t0,2(a0) // pos_bits
stb t1,1(a0) // lit_pos_bits
stb r0,0(a0) // lit_context_bits
section LZMA_DEC10
#include "lzma_d_cs.S"
section LZMA_DEC20
#include "lzma_d_cf.S"
section LZMA_DEC30
lwz sp,0(sp) // old sp
lwz r0,4(sp) // ret.addr
mtlr r0
not_lzma:
// vi:ts=8:et

View File

@ -151,4 +151,4 @@
.byte 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1 /* 0x0960 */
.byte 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80 /* 0x0970 */
.byte 144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100 /* 0x0980 */
.byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96, 78,128, 0, 32 /* 0x0990 */
.byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96 /* 0x0990 */

View File

@ -151,4 +151,4 @@
.byte 56, 96, 0, 1, 65,158, 0, 40, 72, 0, 0, 12, 56, 96, 0, 1 /* 0x0960 */
.byte 72, 0, 0, 28, 57,140, 0, 1,125, 40, 2,166,124, 19, 96, 80 /* 0x0970 */
.byte 144, 14, 0, 0, 56, 96, 0, 0,147, 41, 0, 0,128, 1, 0,100 /* 0x0980 */
.byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96, 78,128, 0, 32 /* 0x0990 */
.byte 185,193, 0, 24,124, 8, 3,166, 56, 33, 0, 96 /* 0x0990 */

View File

@ -29,41 +29,27 @@
<jreiser@users.sourceforge.net>
*/
#include "ppc_regs.h"
#define M_NRV2B_LE32 2
dcbtst 0,dst // prime dcache for store
mflr t3 // return address
SZ_DLINE=128 # size of data cache line in Apple G5
cmpli cr0,meth,M_NRV2B_LE32
bne cr0,not_nrv2b
/* Returns 0 on success; non-zero on failure. */
decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method)
stw dst,0(ldst) // original dst
add lsrc,lsrc,src // input eof
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */
#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
dcbtst 0,dst # prime dcache for store
stw dst,0(ldst) # original dst
add lsrc,lsrc,src # input eof
lis hibit,0x8000 # 0x80000000 for detecting next bit
lis bits,0x8000 # prepare for first load
addi src,src,-1 # prepare for 'lbzu'
addi dst,dst,-1 # prepare for 'stbu'
li disp,-1 # initial displacement
mflr t3 # return address
lis hibit,0x8000 // 0x80000000 for detecting next bit
lis bits,0x8000 // prepare for first load
addi src,src,-1 // prepare for 'lbzu'
addi dst,dst,-1 // prepare for 'stbu'
li disp,-1 // initial displacement
b bot_n2b
#undef jnextb0y
#undef jnextb0n
#undef jnextb1y
#undef jnextb1n
/* jump on next bit, with branch prediction: y==>likely; n==>unlikely
cr0 is set by the cmpl ["compare logical"==>unsigned]:
lt next bit is 0
@ -75,66 +61,67 @@ decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint me
#define jnextb1y call get1; bgt+ cr0,
#define jnextb1n call get1; bgt- cr0,
#undef getnextb
/* rotate next bit into bottom bit of reg; set cr0 based on entire result reg */
#define getnextb(reg) call get1; adde. reg,reg,reg
get1:
cmpl cr0,bits,hibit # cr0 for jnextb
addc bits,bits,bits # CArry for getnextb
bnelr+ cr0 # return if reload not needed; likely 31/32
cmpl cr0,bits,hibit // cr0 for jnextb
addc bits,bits,bits // CArry for getnextb
bnelr+ cr0 // return if reload not needed; likely 31/32
/* CArry has been set from adding 0x80000000 to itself; preserve for 'adde' */
# fetch 4 bytes unaligned and LITTLE ENDIAN
// fetch 4 bytes unaligned and LITTLE ENDIAN
#if 0 /*{ clean; but 4 instr larger, and 3 cycles longer */
lbz bits,1(src) # lo8
lbz bits,1(src) // lo8
lbz t0,2(src); rlwimi bits,t0, 8,16,23
lbz t0,3(src); rlwimi bits,t0,16, 8,15
lbzu t0,4(src); rlwimi bits,t0,24, 0, 7
#else /*}{ pray for no unalignment trap or slowdown */
li bits,1 # compensate for 'lbzu'
lwbrx bits,bits,src # bits= fetch_le32(bits+src)
li bits,1 // compensate for 'lbzu'
lwbrx bits,bits,src // bits= fetch_le32(bits+src)
addi src,src,4
#endif /*}*/
cmpl cr0,bits,hibit # cr0 for jnextb
adde bits,bits,bits # CArry for getnextb; set lo bit from CarryIn
cmpl cr0,bits,hibit // cr0 for jnextb
adde bits,bits,bits // CArry for getnextb; set lo bit from CarryIn
ret
lit_n2b:
#define tmp len
lbzu tmp,1(src) # tmp= *++src;
stbu tmp,1(dst) # *++dst= tmp;
lbzu tmp,1(src) // tmp= *++src;
stbu tmp,1(dst) // *++dst= tmp;
#undef tmp
top_n2b:
jnextb1y lit_n2b
li off,1 # "the msb"
li off,1 // "the msb"
offmore_n2b:
getnextb(off)
jnextb0n offmore_n2b
addic. off,off,-3 # CArry set [and ignored], but no 'addi.'
addic. off,off,-3 // CArry set [and ignored], but no 'addi.'
li len,0
blt- offprev_n2b
lbzu t0,1(src)
rlwinm off,off,8,0,31-8 # off<<=8;
nor. disp,off,t0 # disp = -(1+ (off|t0));
beq- eof_n2b
rlwinm off,off,8,0,31-8 // off<<=8;
nor. disp,off,t0 // disp = -(1+ (off|t0));
beq- eof_nrv
offprev_n2b: # In: 0==len
getnextb(len); getnextb(len) # two bits; cr0 set on result
li off,1; bne- gotlen_n2b # raw 1,2,3 ==> 2,3,4
li off,3 # raw 2.. ==> 5..
li len,1 # "the msb"
offprev_n2b: // In: 0==len
getnextb(len); getnextb(len) // two bits; cr0 set on result
li off,1; bne- gotlen_n2b // raw 1,2,3 ==> 2,3,4
li off,3 // raw 2.. ==> 5..
li len,1 // "the msb"
lenmore_n2b:
getnextb(len)
jnextb0n lenmore_n2b
gotlen_n2b:
subfic t0,disp,(~0)+(-0xd00) # want CArry only
adde len,len,off # len += off + (disp < -0xd00);
subfic t0,disp,(~0)+(-0xd00) // want CArry only
adde len,len,off // len += off + (disp < -0xd00);
copy:
#define back off
add back,disp,dst # point back to match in dst
add back,disp,dst // point back to match in dst
mtctr len
short_n2b:
#define tmp len
@ -151,21 +138,10 @@ short_n2b:
*/
bot_n2b:
li back,2*SZ_DLINE
dcbtst back,dst # 2 lines ahead [-1 for stbu]
dcbt back,src # jump start auto prefetch at page boundary
dcbtst back,dst // 2 lines ahead [-1 for stbu]
dcbt back,src // jump start auto prefetch at page boundary
/* Auto prefetch for Read quits at page boundary; needs 2 misses to restart. */
#undef back
b top_n2b
eof_n2b:
#define tmp r0 /* hibit is dead */
lwz tmp,0(ldst) # original dst
mtlr t3 # return address
addi dst,dst,1 # uncorrect for 'stbu'
addi src,src,1 # uncorrect for 'lbzu'
subf dst,tmp,dst # dst -= tmp; // dst length
#undef tmp
subf a0,lsrc,src # src -= eof; // return 0: good; else: bad
stw dst,0(ldst)
ret
not_nrv2b:

View File

@ -29,41 +29,27 @@
<jreiser@users.sourceforge.net>
*/
#include "regs.h"
#define M_NRV2E_LE32 8
dcbtst 0,dst // prime dcache for store
mflr t3 // return address
SZ_DLINE=128 # size of data cache line in Apple G5
cmpli cr0,meth,M_NRV2E_LE32
bne cr0,not_nrv2e
/* Returns 0 on success; non-zero on failure. */
decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method)
stw dst,0(ldst) // original dst
add lsrc,lsrc,src // input eof
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */
#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
dcbtst 0,dst # prime dcache for store
stw dst,0(ldst) # original dst
add lsrc,lsrc,src # input eof
lis hibit,0x8000 # 0x80000000 for detecting next bit
lis bits,0x8000 # prepare for first load
addi src,src,-1 # prepare for 'lbzu'
addi dst,dst,-1 # prepare for 'stbu'
li disp,-1 # initial displacement
mflr t3 # return address
lis hibit,0x8000 // 0x80000000 for detecting next bit
lis bits,0x8000 // prepare for first load
addi src,src,-1 // prepare for 'lbzu'
addi dst,dst,-1 // prepare for 'stbu'
li disp,-1 // initial displacement
b bot_n2e
#undef jnextb0y
#undef jnextb0n
#undef jnextb1y
#undef jnextb1n
/* jump on next bit, with branch prediction: y==>likely; n==>unlikely
cr0 is set by the cmpl ["compare logical"==>unsigned]:
lt next bit is 0
@ -77,31 +63,32 @@ decompress: # (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint me
#define jnextb1y cmpl 0,bits,hibit; add bits,bits,bits; beql- get32; bgt+
#define jnextb1n cmpl 0,bits,hibit; add bits,bits,bits; beql- get32; bgt-
#undef getnextb
/* rotate next bit into bottom bit of reg */
#define getnextb(reg) addc. bits,bits,bits; beql- get32; adde reg,reg,reg
get32:
# fetch 4 bytes unaligned and LITTLE ENDIAN
// fetch 4 bytes unaligned and LITTLE ENDIAN
#if 0 /*{ clean; but 4 instr larger, and 3 cycles longer */
lbz bits,1(src) # lo8
lbz bits,1(src) // lo8
lbz t0,2(src); rlwimi bits,t0, 8,16,23
lbz t0,3(src); rlwimi bits,t0,16, 8,15
lbzu t0,4(src); rlwimi bits,t0,24, 0, 7
#else /*}{ pray for no unalignment trap or slowdown */
li bits,1 # compensate for 'lbzu'
lwbrx bits,bits,src # bits= fetch_le32(bits+src)
li bits,1 // compensate for 'lbzu'
lwbrx bits,bits,src // bits= fetch_le32(bits+src)
addi src,src,4
#endif /*}*/
cmpl 0,bits,hibit # cr0 for jnextb
addc bits,bits,bits # CArry for getnextb
ori bits,bits,1 # the flag bit
cmpl 0,bits,hibit // cr0 for jnextb
addc bits,bits,bits // CArry for getnextb
ori bits,bits,1 // the flag bit
ret
lit_n2e:
#define tmp len
lbzu tmp,1(src) # tmp= *++src;
stbu tmp,1(dst) # *++dst= tmp;
lbzu tmp,1(src) // tmp= *++src;
stbu tmp,1(dst) // *++dst= tmp;
#undef tmp
top_n2e:
jnextb1y lit_n2e
@ -116,21 +103,21 @@ getoff_n2e:
jnextb0n off_n2e
li len,0
addic. off,off,-3 # CArry set [and ignored], but no 'addi.'
rlwinm off,off,8,0,31-8 # off<<=8;
addic. off,off,-3 // CArry set [and ignored], but no 'addi.'
rlwinm off,off,8,0,31-8 // off<<=8;
blt- offprev_n2e
lbzu t0,1(src)
nor. disp,off,t0 # disp = -(1+ (off|t0));
srawi disp,disp,1 # shift off low bit (sets CArry; ignored)
beq- eof_n2e
andi. t0,t0,1 # complement of low bit of unshifted disp
beq+ lenlast_n2e # low bit was 1
b lenmore_n2e # low bit was 0
nor. disp,off,t0 // disp = -(1+ (off|t0));
srawi disp,disp,1 // shift off low bit (sets CArry; ignored)
beq- eof_nrv
andi. t0,t0,1 // complement of low bit of unshifted disp
beq+ lenlast_n2e // low bit was 1
b lenmore_n2e // low bit was 0
offprev_n2e:
jnextb1y lenlast_n2e
lenmore_n2e:
li len,1 # 1: "the msb"
li len,1 // 1: "the msb"
jnextb1y lenlast_n2e
len_n2e:
getnextb(len)
@ -139,16 +126,16 @@ len_n2e:
b gotlen_n2e
lenlast_n2e:
getnextb(len) # 0,1,2,3
getnextb(len) // 0,1,2,3
gotlen_n2e:
#define tmp off
subfic tmp,disp,(~0)+(-0x500) # want CArry only
subfic tmp,disp,(~0)+(-0x500) // want CArry only
#undef tmp
addi len,len,2
addze len,len # len += (disp < -0x500);
addze len,len // len += (disp < -0x500);
#define back off
add back,disp,dst # point back to match in dst
add back,disp,dst // point back to match in dst
mtctr len
short_n2e:
#define tmp len
@ -164,21 +151,10 @@ bot_n2e:
pace the dcbtst optimally; but that takes 7 or 8 instructions of space.
*/
li back,2*SZ_DLINE
dcbtst back,dst # 2 lines ahead [-1 for stbu]
dcbt back,src # jump start auto prefetch at page boundary
dcbtst back,dst // 2 lines ahead [-1 for stbu]
dcbt back,src // jump start auto prefetch at page boundary
/* Auto prefetch for Read quits at page boundary; needs 2 misses to restart. */
b top_n2e
#undef back
eof_n2e:
#define tmp r0 /* hibit is dead */
lwz tmp,0(ldst) # original dst
mtlr t3 # return address
addi dst,dst,1 # uncorrect for 'stbu'
addi src,src,1 # uncorrect for 'lbzu'
subf dst,tmp,dst # dst -= tmp; // dst length
#undef tmp
subf a0,lsrc,src # src -= eof; // return 0: good; else: bad
stw dst,0(ldst)
ret
not_nrv2e:

View File

@ -0,0 +1,46 @@
#ifndef __PPC_REGS__ /*{*/
#define __PPC_REGS__
#define r0 0
#define r1 1
#define r2 2
#define r29 29
#define r30 30
#define r31 31
/* Stack pointer */
#define sp 1
/* Subroutine arguments; not saved by callee */
#define a0 3
#define a1 4
#define a2 5
#define a3 6
#define a4 7
#define a5 8
#define a6 9
#define a7 10
/* Scratch (temporary) registers; not saved by callee */
#define t0 2
#define t1 11
#define t2 12
#define t3 13
/* branch and link */
#define call bl
/* branch to link register */
#define ret blr
/* move register */
#define movr mr
#endif /*} __PPC_REGS__ */
/*
vi:ts=4:et:nowrap
*/

View File

@ -30,11 +30,11 @@
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
// CPU 386
#include "arch/i386/macros2.ash"
// CPU 386
/*************************************************************************
// program entry point
@ -65,11 +65,11 @@ _start: .globl _start
call main // push address of decompress subroutine
decompress:
; /*************************************************************************
; // C callable decompressor
; **************************************************************************/
// /*************************************************************************
// // C callable decompressor
// **************************************************************************/
; /* Offsets to parameters, allowing for {push + pusha + call} */
// /* Offsets to parameters, allowing for {push + pusha + call} */
#define O_INP (4+ 8*4 +1*4)
#define O_INS (4+ 8*4 +2*4)
#define O_OUTP (4+ 8*4 +3*4)
@ -93,12 +93,13 @@ section LEXEC010
mov edi, OUTP
or ebp, -1
//// align 8
// align 8
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash" // FIXME
#define db .byte
#include "arch/i386/lzma_d_2.ash"
cjt32 0
section LEXEC015
@ -148,11 +149,13 @@ section LEXEC020
#define __NR_write 4
#define __NR_exit 1
#define pushsbli .byte 0x6a, /* push sign-extended byte to long immediate */
fail_mmap:
push L71 - L70
pushsbli L71 - L70
call L71
L70:
.ascii "PROT_EXEC|PROT_WRITE failed\n"
.ascii "PROT_EXEC|PROT_WRITE failed.\n"
L71:
push 2 // fd stderr
push eax // fake ret.addr
@ -179,7 +182,7 @@ unfold:
// So first PT_LOAD must be PF_R|PF_X only, and .p_memsz==.p_filesz.
// So we must round up here, instead of pre-rounding .p_memsz.
add eax, [p_memsz + szElf32_Ehdr + eax] // address after .text
add eax, PAGE_SIZE -1
add eax, PAGE_SIZE -1
and eax, 0-PAGE_SIZE
push eax // destination for 'ret'

View File

@ -1,3 +1,4 @@
/*
; i386-bsd.elf-fold.asm -- linkage to C code to process Elf binary
;
; This file is part of the UPX executable compressor.
@ -26,256 +27,246 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32
SECTION .text
CPU 386
#define PAGE_SIZE ( 1<<12)
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_type 16
#define e_entry (16 + 2*2 + 4)
#define p_memsz 5*4
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
%define PAGE_SIZE ( 1<<12)
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_type 16
%define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
#define __NR_munmap 73
%define __NR_munmap 73
// control just falls through, after this part and compiled C code
// are uncompressed.
;; control just falls through, after this part and compiled C code
;; are uncompressed.
fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
// patchLoader will modify to be
// dword sz_uncompressed, sz_compressed
// byte compressed_data...
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program
; patchLoader will modify to be
; dword sz_uncompressed, sz_compressed
; byte compressed_data...
// ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
// Move argc,argv,envp down to make room for Elf_auxv table.
// Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
// because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
// give not quite everything. It is simpler and smaller code for us
// to generate a "complete" table where Elf_auxv[k -1].a_type = k.
// On second thought, that wastes a lot of stack space (the entire kernel
// auxv, plus those slots that remain empty anyway). So try for minimal
// space on stack, without too much code, by doing it serially.
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
; Move argc,argv,envp down to make room for Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; On second thought, that wastes a lot of stack space (the entire kernel
; auxv, plus those slots that remain empty anyway). So try for minimal
; space on stack, without too much code, by doing it serially.
#define AT_NULL 0
#define AT_IGNORE 1
#define AT_PHDR 3
#define AT_PHENT 4
#define AT_PHNUM 5
#define AT_PAGESZ 6
#define AT_BASE 7
#define AT_ENTRY 9
%define AT_NULL 0
%define AT_IGNORE 1
%define AT_PHDR 3
%define AT_PHENT 4
%define AT_PHNUM 5
%define AT_PAGESZ 6
%define AT_BASE 7
%define AT_ENTRY 9
%define ET_DYN 3
#define ET_DYN 3
sub ecx, ecx
mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_BASE) | (1<<AT_ENTRY)
mov esi, esp
mov edi, esp
call do_auxv ; clear bits in edx according to existing auxv slots
call do_auxv // clear bits in edx according to existing auxv slots
mov esi, esp
L50:
shr edx, 1 ; Carry = bottom bit
sbb eax, eax ; -1 or 0
sub ecx, eax ; count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] ; allocate one auxv slot, if needed
shr edx, 1 // Carry = bottom bit
sbb eax, eax // -1 or 0
sub ecx, eax // count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] // allocate one auxv slot, if needed
test edx,edx
jne L50
mov edi, esp
call do_auxv ; move; fill new auxv slots with AT_IGNORE
call do_auxv // move; fill new auxv slots with AT_IGNORE
%define OVERHEAD 2048
%define MAX_ELF_HDR 512
#define OVERHEAD 2048
#define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD ; alloca
push ebx ; start of unmap region (&Elf32_Ehdr of this stub)
sub esp, MAX_ELF_HDR + OVERHEAD // alloca
push ebx // start of unmap region (&Elf32_Ehdr of this stub)
; Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
; but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] ; phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] ; 1 page for round, 1 for unfold
and edx, -PAGE_SIZE
// Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
// but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] // phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] // 1 page for round, 1 for unfold
and edx, 0-PAGE_SIZE
push edx ; end of unmap region
sub eax, eax ; 0
cmp word [e_type + ebx], byte ET_DYN
push edx // end of unmap region
sub eax, eax // 0
cmp word ptr [e_type + ebx], ET_DYN
jne L53
xchg eax, edx ; dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
xchg eax, edx // dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
L53:
push eax ; dynbase
push eax // dynbase
mov esi, [e_entry + ebx] ; end of compressed data
lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] ; 1st &b_info
sub esi, eax ; length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers
add ecx, byte szb_info
lea edx, [3*4 + esp] ; &tmp
pusha ; (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi ; swap with above 'pusha' to inhibit auxv_up for PT_INTERP
EXTERN upx_main
call upx_main ; returns entry address
add esp, byte (8 +1)*4 ; remove 8 params from pusha, also dynbase
pop ecx ; end of unmap region
pop ebx ; start of unmap region (&Elf32_Ehdr of this stub)
add esp, dword MAX_ELF_HDR + OVERHEAD ; un-alloca
mov esi, [e_entry + ebx] // end of compressed data
lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] // 1st &b_info
sub esi, eax // length of compressed data
mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, szb_info
lea edx, [3*4 + esp] // &tmp
pusha // (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi // swap with above 'pusha' to inhibit auxv_up for PT_INTERP
.extern upx_main
call upx_main // returns entry address
add esp, (8 +1)*4 // remove 8 params from pusha, also dynbase
pop ecx // end of unmap region
pop ebx // start of unmap region (&Elf32_Ehdr of this stub)
add esp, MAX_ELF_HDR + OVERHEAD // un-alloca
push eax ; save entry address as ret.addr
push byte 0 ; 'leave' uses this to clear ebp
mov ebp,esp ; frame
push eax // save entry address as ret.addr
push 0 // 'leave' uses this to clear ebp
mov ebp,esp // frame
sub ecx, ebx
sub eax,eax ; 0, also AT_NULL
push ecx ; length to unmap
push ebx ; start of unmap region (&Elf32_Ehdr of this stub)
push eax ; fake ret.addr
sub eax,eax // 0, also AT_NULL
push ecx // length to unmap
push ebx // start of unmap region (&Elf32_Ehdr of this stub)
push eax // fake ret.addr
dec edi ; auxv table
db 0x3c ; "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter
dec edi // auxv table
.byte 0x3c // "cmpb al, ..." like "jmp 1+L60" but 1 byte shorter
L60:
scasd ; a_un.a_val etc.
scasd ; a_type
jne L60 ; not AT_NULL
; edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push dword [edi] ; &escape hatch
scasd // a_un.a_val etc.
scasd // a_type
jne L60 // not AT_NULL
// edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push dword ptr [edi] // &escape hatch
xor edi,edi
xor esi,esi
xor edx,edx
xor ecx,ecx
xor ebx,ebx
mov al, __NR_munmap ; eax was 0 from L60
ret ; goto escape hatch: int 0x80; leave; ret
mov al, __NR_munmap // eax was 0 from L60
ret // goto escape hatch: int 0x80; leave; ret
; called twice:
; 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
; 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
; entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
; exit: edi= &auxtab; edx= bits still needed
// called twice:
// 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
// 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
// entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
// exit: edi= &auxtab; edx= bits still needed
do_auxv:
; cld
// cld
L10: ; move argc+argv
L10: // move argc+argv
lodsd
stosd
test eax,eax
jne L10
L20: ; move envp
L20: // move envp
lodsd
stosd
test eax,eax
jne L20
push edi ; return value
L30: ; process auxv
lodsd ; a_type
push edi // return value
L30: // process auxv
lodsd // a_type
stosd
cmp eax, byte 32
jae L32 ; prevent aliasing by 'btr' when 32<=a_type
btr edx, eax ; no longer need a slot of type eax [Carry only]
cmp eax, 32
jae L32 // prevent aliasing by 'btr' when 32<=a_type
btr edx, eax // no longer need a slot of type eax [Carry only]
L32:
test eax, eax ; AT_NULL ?
test eax, eax // AT_NULL ?
lodsd
stosd
jnz L30 ; a_type != AT_NULL
jnz L30 // a_type != AT_NULL
sub edi, byte 8 ; backup to AT_NULL
add ecx, ecx ; two words per auxv
inc eax ; convert 0 to AT_IGNORE
rep stosd ; allocate and fill
dec eax ; convert AT_IGNORE to AT_NULL
stosd ; re-terminate with AT_NULL
sub edi, 8 // backup to AT_NULL
add ecx, ecx // two words per auxv
inc eax // convert 0 to AT_IGNORE
rep stosd // allocate and fill
dec eax // convert AT_IGNORE to AT_NULL
stosd // re-terminate with AT_NULL
stosd
pop edi ; &auxtab
pop edi // &auxtab
ret
%define __NR_mmap 197
%define __NR_syscall 198
#define __NR_mmap 197
#define __NR_syscall 198
global mmap
mmap:
mmap: .globl mmap
push ebp
mov ebp,esp
xor eax,eax ; 0
push eax ; convert to 64-bit
push dword [7*4+ebp] ; offset
push eax ; pad
push dword [6*4+ebp] ; fd
push dword [5*4+ebp] ; flags
push dword [4*4+ebp] ; prot
push dword [3*4+ebp] ; len
push dword [2*4+ebp] ; addr
push eax ; current thread
xor eax,eax // 0
push eax // convert to 64-bit
push dword ptr [7*4+ebp] // offset
push eax // pad
push dword ptr [6*4+ebp] // fd
push dword ptr [5*4+ebp] // flags
push dword ptr [4*4+ebp] // prot
push dword ptr [3*4+ebp] // len
push dword ptr [2*4+ebp] // addr
push eax // current thread
mov al,__NR_mmap
push eax
push eax ; fake ret.addr
push eax // fake ret.addr
mov al,__NR_syscall
int 0x80
leave
ret
global brk
brk:
brk: .globl brk
ret
%define __NR_exit 1
%define __NR_read 3
%define __NR_write 4
%define __NR_open 5
%define __NR_close 6
%define __NR_munmap 73
%define __NR_mprotect 74
#define __NR_exit 1
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
#define __NR_munmap 73
#define __NR_mprotect 74
global exit
exit:
exit: .globl exit
mov al,__NR_exit
nf_sysgo:
movzx eax,al
int 0x80
ret
global read
read:
read: .globl read
mov al,__NR_read
jmp nf_sysgo
global write
write:
write: .globl write
mov al,__NR_write
jmp nf_sysgo
global open
open:
open: .globl open
mov al,__NR_open
jmp nf_sysgo
global close
close:
close: .globl close
mov al,__NR_close
jmp nf_sysgo
global munmap
munmap:
munmap: .globl munmap
mov al,__NR_munmap
jmp nf_sysgo
global mprotect
mprotect:
mprotect: .globl mprotect
mov al,__NR_mprotect
jmp nf_sysgo
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -63,10 +63,11 @@ section LZMA_INIT_STACK
; =============
*/
//include "arch/i386/nrv2b_d32.ash"
//#include "arch/i386/nrv2d_d32.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
section LZMA_DONE_STACK
mov ss, [eax] // eax is always 0 here

View File

@ -66,10 +66,10 @@ decompressor:
// ============= DECOMPRESSION
// =============
//#include "arch/i386/nrv2b_d32.ash"
//#include "arch/i386/nrv2d_d32.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/lzma_d_2.ash"
section TMTMAIN5
pop ebp

View File

@ -71,10 +71,10 @@ decompressor:
// ============= DECOMPRESSION
// =============
//#include "arch/i386/nrv2b_d32.ash"
//#include "arch/i386/nrv2d_d32.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/lzma_d_2.ash"
// =============

View File

@ -30,17 +30,20 @@
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
#include "arch/i386/macros2.ash"
// CPU 386
; /*************************************************************************
; // program entry point
; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/
#define jmps jmp short
#define jmpn jmp near
/*************************************************************************
// program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
.globl _start
section LEXEC000
_start:
_start: .globl _start
//// int3
/*
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
@ -63,11 +66,11 @@ _start:
call main // push address of decompress subroutine
decompress:
//
// C callable decompressor
//
// /*************************************************************************
// // C callable decompressor
// **************************************************************************/
/* Offsets to parameters, allowing for {push + pusha + call} */
// /* Offsets to parameters, allowing for {push + pusha + call} */
#define O_INP (4+ 8*4 +1*4)
#define O_INS (4+ 8*4 +2*4)
#define O_OUTP (4+ 8*4 +3*4)
@ -84,19 +87,20 @@ section LEXEC009
//; empty section for commonality with l_lx_exec86.asm
section LEXEC010
pusha
push /*byte*/ '?' // cto8 (sign extension does not matter)
push '?' // cto8 (sign extension does not matter)
// cld
mov esi, INP
mov edi, OUTP
or ebp, byte -1
// align 8
//;; align 8
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d_2.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
cjt32 0
section LEXEC015
@ -145,22 +149,24 @@ section LEXEC020
#define __NR_write 4
#define __NR_exit 1
#define pushsbli .byte 0x6a, /* push sign-extended byte to long immediate*/
msg_SELinux:
push /*byte*/ L71 - L70
pushsbli L71 - L70
pop edx // length
call L71
L70:
.ascii "PROT_EXEC|PROT_WRITE failed.\n"
L71:
pop ecx // message text
push /*byte*/ 2 // fd stderr
push 2 // fd stderr
pop ebx
push /*byte*/ __NR_write
push __NR_write
pop eax
int 0x80
die:
mov bl, /*byte*/ 127 // only low 7 bits matter!
push /*byte*/ __NR_exit
mov bl, 127 // only low 7 bits matter!
push __NR_exit
pop eax // write to stderr could fail, leaving eax as -EBADF etc.
int 0x80
@ -177,7 +183,7 @@ unfold:
// So first PT_LOAD must be PF_R|PF_X only, and .p_memsz==.p_filesz.
// So we must round up here, instead of pre-rounding .p_memsz.
add eax, [p_memsz + szElf32_Ehdr + eax] // address after .text
add eax, PAGE_SIZE -1
add eax, PAGE_SIZE -1
and eax, 0-PAGE_SIZE
push eax // destination for 'ret'
@ -186,14 +192,14 @@ unfold:
xor ecx, ecx // %ecx= 0
// MAP_ANONYMOUS ==>offset is ignored, so do not push!
// push ecx ; offset
push /*byte*/ -1 // *BSD demands -1==fd for mmap(,,,MAP_ANON,,)
push /*byte*/ MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
push -1 // *BSD demands -1==fd for mmap(,,,MAP_ANON,,)
push MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
mov ch, PAGE_SIZE >> 8 // %ecx= PAGE_SIZE
push /*byte*/ PROT_READ | PROT_WRITE | PROT_EXEC
push PROT_READ | PROT_WRITE | PROT_EXEC
push ecx // length
push eax // destination
mov ebx, esp // address of parameter vector for __NR_mmap
push /*byte*/ __NR_mmap
push __NR_mmap
pop eax
int 0x80 // changes only %eax; %edx is live
test eax,eax
@ -214,7 +220,7 @@ unfold:
mov [4*3 + esp],eax
push esi // &compressed_data
call ebp // decompress(&src, srclen, &dst, &dstlen, b_info.misc)
add esp, /*byte*/ (5+1 + 6-1)*4 // (5+1) args to decompress, (6-1) args to mmap
add esp, 0+(5+1 + 6-1)*4 // (5+1) args to decompress, (6-1) args to mmap
ret // &destination
main:
pop ebp // &decompress

View File

@ -1,3 +1,4 @@
/*
; fold_elf86.asm -- linkage to C code to process Elf binary
;
; This file is part of the UPX executable compressor.
@ -26,118 +27,118 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
BITS 32
SECTION .text
CPU 386
// CPU 386
%define PAGE_SIZE ( 1<<12)
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_type 16
%define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
#define PAGE_SIZE ( 1<<12)
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_type 16
#define e_entry (16 + 2*2 + 4)
#define p_memsz 5*4
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
%define __NR_munmap 91
#define __NR_munmap 91
;; control just falls through, after this part and compiled C code
;; are uncompressed.
// control just falls through, after this part and compiled C code
// are uncompressed.
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program
; patchLoader will modify to be
; dword sz_uncompressed, sz_compressed
; byte compressed_data...
fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
// patchLoader will modify to be
// dword sz_uncompressed, sz_compressed
// byte compressed_data...
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
; Move argc,argv,envp down to make room for Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; On second thought, that wastes a lot of stack space (the entire kernel
; auxv, plus those slots that remain empty anyway). So try for minimal
; space on stack, without too much code, by doing it serially.
// ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
// Move argc,argv,envp down to make room for Elf_auxv table.
// Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
// because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
// give not quite everything. It is simpler and smaller code for us
// to generate a "complete" table where Elf_auxv[k -1].a_type = k.
// On second thought, that wastes a lot of stack space (the entire kernel
// auxv, plus those slots that remain empty anyway). So try for minimal
// space on stack, without too much code, by doing it serially.
%define AT_NULL 0
%define AT_IGNORE 1
%define AT_PHDR 3
%define AT_PHENT 4
%define AT_PHNUM 5
%define AT_PAGESZ 6
%define AT_ENTRY 9
#define AT_NULL 0
#define AT_IGNORE 1
#define AT_PHDR 3
#define AT_PHENT 4
#define AT_PHNUM 5
#define AT_PAGESZ 6
#define AT_ENTRY 9
%define ET_DYN 3
#define ET_DYN 3
sub ecx, ecx
mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_ENTRY)
mov esi, esp
mov edi, esp
call do_auxv ; clear bits in edx according to existing auxv slots
call do_auxv // clear bits in edx according to existing auxv slots
mov esi, esp
L50:
shr edx, 1 ; Carry = bottom bit
sbb eax, eax ; -1 or 0
sub ecx, eax ; count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] ; allocate one auxv slot, if needed
shr edx, 1 // Carry = bottom bit
sbb eax, eax // -1 or 0
sub ecx, eax // count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] // allocate one auxv slot, if needed
test edx,edx
jne L50
mov edi, esp
call do_auxv ; move; fill new auxv slots with AT_IGNORE
call do_auxv // move; fill new auxv slots with AT_IGNORE
%define OVERHEAD 2048
%define MAX_ELF_HDR 512
#define OVERHEAD 2048
#define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD ; alloca
push ebx ; start of unmap region (&Elf32_Ehdr of this stub)
sub esp, MAX_ELF_HDR + OVERHEAD // alloca
push ebx // start of unmap region (&Elf32_Ehdr of this stub)
; Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
; but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] ; phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] ; 1 page for round, 1 for unfold
and edx, -PAGE_SIZE
// Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
// but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] // phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] // 1 page for round, 1 for unfold
and edx, 0-PAGE_SIZE
push edx ; end of unmap region
sub eax, eax ; 0
cmp word [e_type + ebx], byte ET_DYN
push edx // end of unmap region
sub eax, eax // 0
cmp word ptr [e_type + ebx], ET_DYN
jne L53
xchg eax, edx ; dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
xchg eax, edx // dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
L53:
push eax ; dynbase
push eax // dynbase
mov esi, [e_entry + ebx] ; end of compressed data
lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] ; 1st &b_info
sub esi, eax ; length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers
add ecx, byte szb_info
lea edx, [3*4 + esp] ; &tmp
pusha ; (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi ; swap with above 'pusha' to inhibit auxv_up for PT_INTERP
EXTERN upx_main
call upx_main ; returns entry address
add esp, byte (8 +1)*4 ; remove 8 params from pusha, also dynbase
pop ecx ; end of unmap region
pop ebx ; start of unmap region (&Elf32_Ehdr of this stub)
add esp, dword MAX_ELF_HDR + OVERHEAD ; un-alloca
push eax ; save entry address
mov esi, [e_entry + ebx] // end of compressed data
lea eax, [szElf32_Ehdr + 2*szElf32_Phdr + szl_info + szp_info + ebx] // 1st &b_info
sub esi, eax // length of compressed data
mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, szb_info
lea edx, [3*4 + esp] // &tmp
pusha // (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi // swap with above 'pusha' to inhibit auxv_up for PT_INTERP
.extern upx_main
call upx_main // returns entry address
add esp, (8 +1)*4 // remove 8 params from pusha, also dynbase
pop ecx // end of unmap region
pop ebx // start of unmap region (&Elf32_Ehdr of this stub)
add esp, MAX_ELF_HDR + OVERHEAD // un-alloca
push eax // save entry address
dec edi ; auxv table
sub eax,eax ; 0, also AT_NULL
db 0x3c ; "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter
dec edi // auxv table
sub eax,eax // 0, also AT_NULL
.byte 0x3c // "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter
L60:
scasd ; a_un.a_val etc.
scasd ; a_type
jne L60 ; not AT_NULL
; edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
scasd // a_un.a_val etc.
scasd // a_type
jne L60 // not AT_NULL
// edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push eax
push eax
@ -146,67 +147,66 @@ L60:
push eax
push eax
push eax
push eax ; 32 bytes of zeroes now on stack, ready for 'popa'
push eax // 32 bytes of zeroes now on stack, ready for 'popa'
sub ecx, ebx ; length to unmap
mov al, __NR_munmap ; eax was 0 from L60
jmp [edi] ; unmap ourselves via escape hatch, then goto entry
sub ecx, ebx // length to unmap
mov al, __NR_munmap // eax was 0 from L60
jmp [edi] // unmap ourselves via escape hatch, then goto entry
; called twice:
; 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
; 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
; entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
; exit: edi= &auxtab; edx= bits still needed
// called twice:
// 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
// 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
// entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
// exit: edi= &auxtab; edx= bits still needed
do_auxv:
; cld
// cld
L10: ; move argc+argv
L10: // move argc+argv
lodsd
stosd
test eax,eax
jne L10
L20: ; move envp
L20: // move envp
lodsd
stosd
test eax,eax
jne L20
push edi ; return value
L30: ; process auxv
lodsd ; a_type
push edi // return value
L30: // process auxv
lodsd // a_type
stosd
cmp eax, byte 32
jae L32 ; prevent aliasing by 'btr' when 32<=a_type
btr edx, eax ; no longer need a slot of type eax [Carry only]
cmp eax, 32
jae L32 // prevent aliasing by 'btr' when 32<=a_type
btr edx, eax // no longer need a slot of type eax [Carry only]
L32:
test eax, eax ; AT_NULL ?
test eax, eax // AT_NULL ?
lodsd
stosd
jnz L30 ; a_type != AT_NULL
jnz L30 // a_type != AT_NULL
sub edi, byte 8 ; backup to AT_NULL
add ecx, ecx ; two words per auxv
inc eax ; convert 0 to AT_IGNORE
rep stosd ; allocate and fill
dec eax ; convert AT_IGNORE to AT_NULL
stosd ; re-terminate with AT_NULL
sub edi, 8 // backup to AT_NULL
add ecx, ecx // two words per auxv
inc eax // convert 0 to AT_IGNORE
rep stosd // allocate and fill
dec eax // convert AT_IGNORE to AT_NULL
stosd // re-terminate with AT_NULL
stosd
pop edi ; &auxtab
pop edi // &auxtab
ret
%define __NR_mmap 90
#define __NR_mmap 90
global mmap
mmap:
mmap: .globl mmap
push ebx
lea ebx, [2*4 + esp]
push byte __NR_mmap
push __NR_mmap
pop eax
int 0x80
pop ebx
ret
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -1,3 +1,4 @@
/*
; l_lx_exec86.asm -- Linux program entry point & decompressor (kernel exec)
;
; This file is part of the UPX executable compressor.
@ -28,24 +29,23 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32
SECTION .text
CPU 386
#define jmps jmp short
#define jmpn jmp near
%define jmps jmp short
%define jmpn jmp near
/*************************************************************************
// program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
; /*************************************************************************
; // program entry point
; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/
GLOBAL _start
;__LEXEC000__
_start:
;;;; int3
section LEXEC000
_start: .globl _start
//// int3
/*
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@ -62,106 +62,104 @@ _start:
;; end
;; Step through the code; remember that <Enter> repeats the previous command.
;;
*/
%if 0
; personality(PER_LINUX)
mov eax, 136 ; syscall_personality
xor ebx, ebx ; PER_LINUX
#if 0
// personality(PER_LINUX)
mov eax, 136 // syscall_personality
xor ebx, ebx // PER_LINUX
int 0x80
%endif
#endif
call main ; push address of decompress subroutine
call main // push address of decompress subroutine
decompress:
; /*************************************************************************
; // C callable decompressor
; **************************************************************************/
// /*************************************************************************
// // C callable decompressor
// **************************************************************************/
; /* Offsets to parameters, allowing for {push + pusha + call} */
%define O_INP (4+ 8*4 +1*4)
%define O_INS (4+ 8*4 +2*4)
%define O_OUTP (4+ 8*4 +3*4)
%define O_OUTS (4+ 8*4 +4*4)
%define O_PARAM (4+ 8*4 +5*4)
// /* Offsets to parameters, allowing for {push + pusha + call} */
#define O_INP (4+ 8*4 +1*4)
#define O_INS (4+ 8*4 +2*4)
#define O_OUTP (4+ 8*4 +3*4)
#define O_OUTS (4+ 8*4 +4*4)
#define O_PARAM (4+ 8*4 +5*4)
%define INP dword [esp+O_INP]
%define INS dword [esp+O_INS]
%define OUTP dword [esp+O_OUTP]
%define OUTS dword [esp+O_OUTS]
%define PARM dword [esp+O_PARAM]
#define INP dword [esp+O_INP]
#define INS dword [esp+O_INS]
#define OUTP dword [esp+O_OUTP]
#define OUTS dword [esp+O_OUTS]
#define PARM dword [esp+O_PARAM]
;__LEXEC009__
mov eax, 'NMRU' ; free slot in following 'pusha'
;__LEXEC010__
section LEXEC009
mov eax, offset NMRU // free slot in following 'pusha'
section LEXEC010
pusha
push byte '?' ; cto8 (sign extension does not matter)
; cld
push '?' // cto8 (sign extension does not matter)
// cld
mov esi, INP
mov edi, OUTP
or ebp, byte -1
;;; align 8
// align 8
%include "arch/i386/nrv2b_d32.ash"
%include "arch/i386/nrv2d_d32.ash"
%include "arch/i386/nrv2e_d32.ash"
%include "arch/i386/lzma_d.ash"
%include "arch/i386/macros.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
#include "arch/i386/macros2.ash"
cjt32 0
;__LEXEC015__
; eax is 0 from decompressor code
;xor eax, eax ; return code
section LEXEC015
// eax is 0 from decompressor code
//xor eax, eax ; return code
; check compressed size
// check compressed size
mov edx, INP
add edx, INS
cmp edx, esi
jz .ok
dec eax
.ok:
xchg [8*4 + esp], eax ; store success/failure, fetch NMRU
xchg [8*4 + esp], eax // store success/failure, fetch NMRU
; write back the uncompressed size, and prepare for unfilter
// write back the uncompressed size, and prepare for unfilter
mov edx, OUTS
mov ecx, edi
mov edi, OUTP
sub ecx, edi ; ecx= uncompressed size
sub ecx, edi // ecx= uncompressed size
mov [edx], ecx
pop edx ; cto8
pop edx // cto8
;__LEXEC110__ Jcc and/or possible n_mru
push edi ; addvalue
push byte 0x0f
section LEXEC110 // Jcc and/or possible n_mru
push edi // addvalue
push 0x0f
pop ebx
mov bh, dl ; ebx= 0,,cto8,0x0F
mov bh, dl // ebx= 0,,cto8,0x0F
;__LEXEC100__ 0!=n_mru
xchg eax, ebx ; eax= ct08_0f; ebx= n_mru {or n_mru1}
section LEXEC100 // 0!=n_mru
xchg eax, ebx // eax= ct08_0f; ebx= n_mru {or n_mru1}
;;LEXEC016 bug in APP: jmp and target must be in same .asx
;; jmpn lxunf0 ; logically belongs here
section LEXEC016 // bug in APP: jmp and target must be in same .asx
//; jmpn lxunf0 ; logically belongs here
ctojr32
ckt32 edi, dl
;__LEXEC017__
section LEXEC017
popa
ret
;__LEXEC020__
section LEXEC020
main:
pop ebp ; &decompress
mov ebx, 0x401000 ; &Elf32_Ehdr of this program
;; fall into fold_begin
pop ebp // &decompress
mov ebx, 0x401000 // &Elf32_Ehdr of this program
//; fall into fold_begin
eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -1,3 +1,4 @@
/*
; fold_exec86.asm -- linkage to C code to process Elf binary
;
; This file is part of the UPX executable compressor.
@ -26,47 +27,45 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32
SECTION .text
CPU 386
// control just falls through, after this part and compiled C code
// are uncompressed.
;; control just falls through, after this part and compiled C code
;; are uncompressed.
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_entry (16 + 2*2 + 4)
#define p_vaddr 2*4
#define p_memsz 5*4
#define szl_info 12
#define szp_info 12
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4)
%define p_vaddr 2*4
%define p_memsz 5*4
%define szl_info 12
%define szp_info 12
fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program
pop eax ; Pop the argument count
mov ecx, esp ; argv starts just at the current stack top
lea edx, [esp+eax*4+4] ; envp = &argv[argc + 1]
pop eax // Pop the argument count
mov ecx, esp // argv starts just at the current stack top
lea edx, [esp+eax*4+4] // envp = &argv[argc + 1]
mov edi, [ebx + e_entry]
lea esi, [ebx + szElf32_Ehdr + 2*szElf32_Phdr + szl_info]
sub edi, esi ; length
lea ebx, [2 + ebp] ; f_unfilter, maybe
pusha ; (cprLen, cprSrc, f_decpr, xx, f_unf, envp, argv, argc)
EXTERN upx_main
call upx_main ; Call the UPX main function
hlt ; Crash if somehow upx_main does return
sub edi, esi // length
lea ebx, [2 + ebp] // f_unfilter, maybe
pusha // (cprLen, cprSrc, f_decpr, xx, f_unf, envp, argv, argc)
.extern upx_main
call upx_main // Call the UPX main function
hlt // Crash if somehow upx_main does return
%define __NR_mmap 90
#define __NR_mmap 90
global mmap
mmap:
mmap: .globl mmap
push ebx
lea ebx, [2*4 + esp]
push byte __NR_mmap
push __NR_mmap
pop eax
int 0x80
pop ebx
ret
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -1,3 +1,4 @@
/*
; l_lx_pti86.asm -- Linux separate ELF PT_INTERP
;
; This file is part of the UPX executable compressor.
@ -28,24 +29,20 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32
SECTION .text
CPU 386
/*************************************************************************
// program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
%define jmps jmp short
%define jmpn jmp near
; /*************************************************************************
; // program entry point
; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/
GLOBAL _start
;__LXPTI000__
_start:
;;;; int3
section LXPTI000
_start: .globl _start
//// int3
/*
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@ -62,12 +59,13 @@ _start:
;; end
;; Step through the code; remember that <Enter> repeats the previous command.
;;
call L200 ; push address of get_funf
*/
call L200 // push address of get_funf
get_funf:
cmp eax, byte 0x46
cmp eax, 0x46
mov ecx, unf46
je L110
cmp eax, byte 0x49
cmp eax, 0x49
mov ecx, unf49
je L110
L120:
@ -77,66 +75,67 @@ L110:
none:
ret
%define M_NRV2B_LE32 2
%define M_NRV2D_LE32 5
%define M_NRV2E_LE32 8
%define M_CL1B_LE32 11
%define M_LZMA 14
#define M_NRV2B_LE32 2
#define M_NRV2D_LE32 5
#define M_NRV2E_LE32 8
#define M_CL1B_LE32 11
#define M_LZMA 14
L200:
call L300 ; push address of get_fexp
call L300 // push address of get_fexp
get_fexp:
cmp eax, byte M_NRV2B_LE32
cmp eax, M_NRV2B_LE32
mov ecx, nrv2b
je L110
cmp eax, byte M_NRV2D_LE32
cmp eax, M_NRV2D_LE32
mov ecx, nrv2d
je L110
cmp eax, byte M_NRV2E_LE32
cmp eax, M_NRV2E_LE32
mov ecx, nrv2e
je L110
cmp eax, byte M_CL1B_LE32
cmp eax, M_CL1B_LE32
mov ecx, cl1b
je L110
jmpn L120
jmp L120
; /*************************************************************************
; // C callable decompressor
; **************************************************************************/
;__LXPTI040__
/*************************************************************************
// C callable decompressor
**************************************************************************/
section LXPTI040
nrv2b:
;__LXPTI041__
section LXPTI041
nrv2d:
;__LXPTI042__
section LXPTI042
nrv2e:
;__LXPTI043__
section LXPTI043
cl1b:
%define INP dword [esp+8*4+1*4]
%define INS dword [esp+8*4+2*4]
%define OUTP dword [esp+8*4+3*4]
%define OUTS dword [esp+8*4+4*4]
#define INP dword [esp+8*4+1*4]
#define INS dword [esp+8*4+2*4]
#define OUTP dword [esp+8*4+3*4]
#define OUTS dword [esp+8*4+4*4]
;__LXPTI050__
section LXPTI050
pusha
; cld
or ebp, byte -1
// cld
or ebp, -1
mov esi, INP
mov edi, OUTP
;;; align 8
// align 8
%include "arch/i386/nrv2b_d32.ash"
%include "arch/i386/nrv2d_d32.ash"
%include "arch/i386/nrv2e_d32.ash"
%include "arch/i386/cl1_d32.ash"
%include "arch/i386/lzma_d.ash"
;__LXPTI090__
jmpn exp_done
;__LXPTI091__
; eax is 0 from decompressor code
;xor eax, eax ; return code
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/cl1_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
section LXPTI090
jmp exp_done
section LXPTI091
// eax is 0 from decompressor code
//xor eax, eax ; return code
exp_done:
; check compressed size
// check compressed size
mov edx, INP
add edx, INS
cmp esi, edx
@ -144,7 +143,7 @@ exp_done:
dec eax
.ok:
; write back the uncompressed size
// write back the uncompressed size
sub edi, OUTP
mov edx, OUTS
mov [edx], edi
@ -153,18 +152,17 @@ exp_done:
popa
ret
%include "arch/i386/macros.ash"
cjt32 0
ctojr32
;__LXPTI140__
section LXPTI140
unf46:
;__LXPTI141__
section LXPTI141
unf49:
%define CTO8 dword [esp+8*4+3*4]
#define CTO8 dword ptr [esp+8*4+3*4]
;__LXPTI150__
section LXPTI150
pusha
mov edi,INP
mov ecx,INS
@ -172,18 +170,14 @@ unf49:
ckt32 edi, dl
;__LXPTI160__
section LXPTI160
popa
ret
;__LXPTI200__
section LXPTI200
L300:
eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -1,3 +1,4 @@
/*
; fold_pti86.asm -- linkage to C code to act as ELF PT_INTERP
;
; This file is part of the UPX executable compressor.
@ -26,85 +27,84 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
// CPU 386
BITS 32
SECTION .text
CPU 386
#define PAGE_SIZE ( 1<<12)
#define AT_NULL 0
#define AT_PHDR 3
%define PAGE_SIZE ( 1<<12)
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_entry (16 + 2*2 + 4)
#define p_vaddr 2*4
#define p_memsz 5*4
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
%define AT_NULL 0
%define AT_PHDR 3
#define MAP_FIXED 0x10
#define MAP_PRIVATE 0x02
#define MAP_ANONYMOUS 0x20
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4
#define __NR_mmap 90
#define __NR_munmap 91
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4)
%define p_vaddr 2*4
%define p_memsz 5*4
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
#define OVERHEAD 2048
#define MAX_ELF_HDR 512
%define MAP_FIXED 0x10
%define MAP_PRIVATE 0x02
%define MAP_ANONYMOUS 0x20
%define PROT_READ 1
%define PROT_WRITE 2
%define PROT_EXEC 4
%define __NR_mmap 90
%define __NR_munmap 91
pop ebp // get_fexp
pop ecx // get_funf
pop eax // argc
lea edi, [4+ 4*eax + esp] // &environ
push eax // argc
%define OVERHEAD 2048
%define MAX_ELF_HDR 512
pop ebp ; get_fexp
pop ecx ; get_funf
pop eax ; argc
lea edi, [4+ 4*eax + esp] ; &environ
push eax ; argc
sub eax,eax ; 0
sub eax,eax // 0
L310:
scasd
jne L310
scasd ; edi= &Elf32_auxv_t
scasd // edi= &Elf32_auxv_t
mov esi,edi
L320:
mov eax,[esi] ; a_type
cmp eax, byte AT_PHDR
mov eax,[esi] // a_type
cmp eax, AT_PHDR
je L330
add esi, byte sz_auxv
cmp eax, byte AT_NULL
add esi, sz_auxv
cmp eax, AT_NULL
jne L320
L330:
mov ebx,[a_val + esi]
push ebx ; save &Elf32_Phdr of compressed data
push ebx // save &Elf32_Phdr of compressed data
sub esp, dword MAX_ELF_HDR + OVERHEAD ; working storage
sub esp, MAX_ELF_HDR + OVERHEAD // working storage
mov edx, esp
push ecx ; get_funf 9th param to pti_main
lea eax, [2*szElf32_Phdr + szl_info + szp_info + ebx] ; 1st &b_info
mov esi, [e_entry + ebx] ; beyond compressed data
sub esi, eax ; length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers
add ecx, byte szb_info
pusha ; (AT_table, sz_cpr, get_fexp, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
EXTERN pti_main
call pti_main ; returns entry address
add esp, dword 9*4 + MAX_ELF_HDR + OVERHEAD ; remove 9 params, temp space
pop ebx ; &Elf32_Phdr
push eax ; save entry address
push ecx // get_funf 9th param to pti_main
lea eax, [2*szElf32_Phdr + szl_info + szp_info + ebx] // 1st &b_info
mov esi, [e_entry + ebx] // beyond compressed data
sub esi, eax // length of compressed data
mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, szb_info
pusha // (AT_table, sz_cpr, get_fexp, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
.extern pti_main
call pti_main // returns entry address
add esp, 9*4 + MAX_ELF_HDR + OVERHEAD // remove 9 params, temp space
pop ebx // &Elf32_Phdr
push eax // save entry address
mov ecx,[p_memsz + ebx]
mov ebx,[p_vaddr + ebx]
mov eax,__NR_munmap
int 0x80 ; unmap compressed data
int 0x80 // unmap compressed data
sub eax,eax
sub ecx,ecx
@ -113,19 +113,18 @@ EXTERN pti_main
sub ebp,ebp
sub esi,esi
sub edi,edi
ret ; goto entry point
ret // goto entry point
%define __NR_mmap 90
#define __NR_mmap 90
global mmap
mmap:
mmap: .globl mmap
push ebx
lea ebx, [2*4 + esp]
push byte __NR_mmap
push __NR_mmap
pop eax
int 0x80
pop ebx
ret
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -1,3 +1,4 @@
/*
; l_lx_sh86.asm -- Linux program entry point & decompressor (shell script)
;
; This file is part of the UPX executable compressor.
@ -28,21 +29,21 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
BITS 32
SECTION .text
CPU 386
// CPU 386
; /*************************************************************************
; // program entry point
; // see glibc/sysdeps/i386/elf/start.S
; **************************************************************************/
/*************************************************************************
// program entry point
// see glibc/sysdeps/i386/elf/start.S
**************************************************************************/
GLOBAL _start
;__LEXEC000__
_start:
;;;; int3
section LEXEC000
_start: .globl _start
//// int3
/*
;; How to debug this code: Uncomment the 'int3' breakpoint instruction above.
;; Build the stubs and upx. Compress a testcase, such as a copy of /bin/date.
;; Invoke gdb, and give a 'run' command. Define a single-step macro such as
@ -59,42 +60,43 @@ _start:
;; end
;; Step through the code; remember that <Enter> repeats the previous command.
;;
*/
call main ; push address of decompress subroutine
call main // push address of decompress subroutine
decompress:
; /*************************************************************************
; // C callable decompressor
; **************************************************************************/
/*************************************************************************
// C callable decompressor
**************************************************************************/
%define INP dword [esp+8*4+4]
%define INS dword [esp+8*4+8]
%define OUTP dword [esp+8*4+12]
%define OUTS dword [esp+8*4+16]
#define INP dword [esp+8*4+4]
#define INS dword [esp+8*4+8]
#define OUTP dword [esp+8*4+12]
#define OUTS dword [esp+8*4+16]
;__LEXEC010__
section LEXEC010
pusha
; cld
mov esi, INP
mov edi, OUTP
or ebp, byte -1
;;; align 8
or ebp, -1
// .balign 8
%include "arch/i386/nrv2b_d32.ash"
%include "arch/i386/nrv2d_d32.ash"
%include "arch/i386/nrv2e_d32.ash"
%include "arch/i386/cl1_d32.ash"
%include "arch/i386/lzma_d.ash"
%include "arch/i386/macros.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#include "arch/i386/cl1_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
cjt32 0
;__LEXEC015__
; eax is 0 from decompressor code
;xor eax, eax ; return code
section LEXEC015
// eax is 0 from decompressor code
//xor eax, eax ; return code
; check compressed size
// check compressed size
mov edx, INP
add edx, INS
cmp esi, edx
@ -102,65 +104,61 @@ decompress:
dec eax
.ok:
; write back the uncompressed size
// write back the uncompressed size
sub edi, OUTP
mov edx, OUTS
mov [edx], edi
mov [7*4 + esp], eax
;__LEXEC017__
section LEXEC017
popa
ret
;__LEXEC020__
section LEXEC020
%define PAGE_SIZE ( 1<<12)
#define PAGE_SIZE ( 1<<12)
%define MAP_FIXED 0x10
%define MAP_PRIVATE 0x02
%define MAP_ANONYMOUS 0x20
%define PROT_READ 1
%define PROT_WRITE 2
%define PROT_EXEC 4
%define __NR_mmap 90
#define MAP_FIXED 0x10
#define MAP_PRIVATE 0x02
#define MAP_ANONYMOUS 0x20
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4
#define __NR_mmap 90
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4
%define szl_info 12
%define szp_info 12
%define p_filesize 4
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_entry (16 + 2*2 + 4)
#define p_memsz 5*4
#define szl_info 12
#define szp_info 12
#define p_filesize 4
; Decompress the rest of this loader, and jump to it
// Decompress the rest of this loader, and jump to it
main:
pop ebp ; &decompress
mov eax,0x1400000 ; &Elf32_Ehdr of this stub
lea edx,[0x80 + szp_info + eax] ; &cprScript
add eax,[p_memsz + szElf32_Ehdr + eax] ; after .text
pop ebp // &decompress
mov eax,0x1400000 // &Elf32_Ehdr of this stub
lea edx,[0x80 + szp_info + eax] // &cprScript
add eax,[p_memsz + szElf32_Ehdr + eax] // after .text
add eax,PAGE_SIZE -1
and eax, -PAGE_SIZE ; round up to next page
and eax, 0-PAGE_SIZE // round up to next page
push byte 0
push byte -1
push byte MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
push byte PROT_READ | PROT_WRITE
push dword [edx] ; sz_unc length
push eax ; address
push 0
push -1
push MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
push PROT_READ | PROT_WRITE
push dword ptr [edx] // sz_unc length
push eax // address
mov ebx,esp
push byte __NR_mmap
push __NR_mmap
pop eax
int 0x80
add esp, byte 6*4 ; remove arguments
add esp, 6*4 // remove arguments
lea ebx,[3+ eax] ; space for "-c"
; fall into fold [not compressed!]
lea ebx,[3+ eax] // space for "-c"
// fall into fold [not compressed!]
eof:
; __XTHEENDX__
section .data
dd -1
dw eof
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -1,3 +1,4 @@
/*
; fold_sh86.asm -- Linux program entry point & decompressor (shell script)
;
; This file is part of the UPX executable compressor.
@ -28,151 +29,150 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
BITS 32
SECTION .text
CPU 386
// CPU 386
%define PAGE_SIZE ( 1<<12)
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_entry (16 + 2*2 + 4)
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
#define PAGE_SIZE ( 1<<12)
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_entry (16 + 2*2 + 4)
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
fold_begin: ; In: %ebx= uncDst; edx= &b_info cprSrc; ebp = &decompress
fold_begin: // In: %ebx= uncDst; edx= &b_info cprSrc; ebp = &decompress
; Move argc,argv,envp down to make room for complete Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance
// Move argc,argv,envp down to make room for complete Elf_auxv table.
// Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
// because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
// give not quite everything. It is simpler and smaller code for us
// to generate a "complete" table where Elf_auxv[k -1].a_type = k.
// ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance
%define AT_NULL 0
%define AT_IGNORE 1
%define AT_PHDR 3
%define AT_NUMBER (5+ 37)
; 2002-11-09 glibc-2.2.90 AT_IGNOREPPC==22 plus 5 for future growth
; 2006-05-15 glibc-2.4-4 AT_L3_CACHESHAPE==37
#define AT_NULL 0
#define AT_IGNORE 1
#define AT_PHDR 3
#define AT_NUMBER (5+ 37)
// 2002-11-09 glibc-2.2.90 AT_IGNOREPPC==22 plus 5 for future growth
// 2006-05-15 glibc-2.4-4 AT_L3_CACHESHAPE==37
mov esi, esp
sub esp, sz_auxv * AT_NUMBER ; more than 128 bytes
sub esp, sz_auxv * AT_NUMBER // more than 128 bytes
mov edi, esp
do_auxv: ; entry: %esi=src = &argc; %edi=dst. exit: %edi= &AT_NULL
; cld
do_auxv: // entry: %esi=src = &argc; %edi=dst. exit: %edi= &AT_NULL
// cld
L10: ; move argc+argv
L10: // move argc+argv
lodsd
stosd
test eax,eax
jne L10
L20: ; move envp
L20: // move envp
lodsd
stosd
test eax,eax
jne L20
; complete Elf_auxv table full of AT_IGNORE
push edi ; save base of resulting table
inc eax ; convert 0 to AT_IGNORE
push byte 2 * (AT_NUMBER -1) ; less than 128
// complete Elf_auxv table full of AT_IGNORE
push edi // save base of resulting table
inc eax // convert 0 to AT_IGNORE
push 2 * (AT_NUMBER -1) // less than 128
pop ecx
rep stosd
dec eax ; convert AT_IGNORE into AT_NULL
stosd ; terminate Elf_auxv
dec eax // convert AT_IGNORE into AT_NULL
stosd // terminate Elf_auxv
stosd
pop edi ; base of resulting table
pop edi // base of resulting table
L30: ; distribute existing Elf32_auxv into new table
L30: // distribute existing Elf32_auxv into new table
lodsd
test eax,eax ; AT_NULL ?
xchg eax,ecx ; edx is busy, do not use
test eax,eax // AT_NULL ?
xchg eax,ecx // edx is busy, do not use
lodsd
je L40
cmp ecx, byte AT_NUMBER
cmp ecx, AT_NUMBER
jae L30
mov [a_type + sz_auxv*(ecx -1) + edi], ecx
mov [a_val + sz_auxv*(ecx -1) + edi], eax
jmp L30
L40:
%define OVERHEAD 2048
%define MAX_ELF_HDR 512
#define OVERHEAD 2048
#define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD
sub esp, MAX_ELF_HDR + OVERHEAD
xchg eax, ebx ; eax= uncDst
mov ecx, [ edx] ; sz_unc
mov ebx, [4+ edx] ; sz_cpr
mov esi, eax ; extra copy of uncDst
pusha ; (AT_table,uncDst,f_decpr,&ehdr,{sz_cpr,cprSrc},{sz_unc,uncDst})
EXTERN upx_main
call upx_main ; entry = upx_main(...)
pop ecx ; junk
push eax ; save entry address
popa ; edi= entry address; esi= uncDst
add esp, dword MAX_ELF_HDR + OVERHEAD ; remove temp space
xchg eax, ebx // eax= uncDst
mov ecx, [ edx] // sz_unc
mov ebx, [4+ edx] // sz_cpr
mov esi, eax // extra copy of uncDst
pusha // (AT_table,uncDst,f_decpr,&ehdr,{sz_cpr,cprSrc},{sz_unc,uncDst})
.extern upx_main
call upx_main // entry = upx_main(...)
pop ecx // junk
push eax // save entry address
popa // edi= entry address; esi= uncDst
add esp, MAX_ELF_HDR + OVERHEAD // remove temp space
pop ecx ; argc
pop edx ; $0 filename, to become argv[0]
push edx ; restore $0 filename
pop ecx // argc
pop edx // $0 filename, to become argv[0]
push edx // restore $0 filename
inc ecx
push esi ; &uncompressed shell script
sub esi, byte 3
push esi // &uncompressed shell script
sub esi, 3
mov [esi], word 0x632d ; "-c"
mov word ptr [esi], 0x632d // "-c"
inc ecx
push esi ; &"-c"
push esi // &"-c"
inc ecx
push edx ; argv[0] is duplicate of $0
push edx // argv[0] is duplicate of $0
push ecx ; new argc
push edi ; save entry address
push ecx // new argc
push edi // save entry address
; _dl_start and company (ld-linux.so.2) assumes that it has virgin stack,
; and does not initialize all its stack local variables to zero.
; Ulrich Drepper (drepper@cyngus.com) has refused to fix the bugs.
; See GNU wwwgnats libc/1165 .
// _dl_start and company (ld-linux.so.2) assumes that it has virgin stack,
// and does not initialize all its stack local variables to zero.
// Ulrich Drepper (drepper@cyngus.com) has refused to fix the bugs.
// See GNU wwwgnats libc/1165 .
%define N_STKCLR (0x100 + MAX_ELF_HDR + OVERHEAD)/4
#define N_STKCLR (0x100 + MAX_ELF_HDR + OVERHEAD)/4
lea edi, [esp - 4*N_STKCLR]
pusha ; values will be zeroed
mov ebx,esp ; save
mov esp,edi ; Linux does not grow stack below esp
pusha // values will be zeroed
mov ebx,esp // save
mov esp,edi // Linux does not grow stack below esp
mov ecx, N_STKCLR
xor eax,eax
rep stosd
mov esp,ebx ; restore
mov esp,ebx // restore
; Because the decompressed shell script occupies low memory anyway,
; there isn't much payback to unmapping the compressed script and
; ourselves the stub. We would need a place to put the escape hatch
; "int $0x80; popa; ret", and some kernels do not allow execution
; on the stack. So, we would have to dirty a page of the shell
; or of /lib/ld-linux.so. It's simpler just to omit the unmapping.
// Because the decompressed shell script occupies low memory anyway,
// there isn't much payback to unmapping the compressed script and
// ourselves the stub. We would need a place to put the escape hatch
// "int $0x80; popa; ret", and some kernels do not allow execution
// on the stack. So, we would have to dirty a page of the shell
// or of /lib/ld-linux.so. It's simpler just to omit the unmapping.
popa
ret
%define __NR_mmap 90
#define __NR_mmap 90
global mmap
mmap:
mmap: .globl mmap
push ebx
lea ebx, [2*4 + esp]
push byte __NR_mmap
push __NR_mmap
pop eax
int 0x80
pop ebx
ret
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -30,7 +30,7 @@
; <jreiser@users.sourceforge.net>
*/
#include "arch/i386/macros2.ash"
#include "arch/i386/macros2.ash"
/*
; =============
@ -67,11 +67,11 @@ section LXMOVEUP
// ============= DECOMPRESSION
// =============
//#include "arch/i386/nrv2b_d32.ash"
//#include "arch/i386/nrv2d_d32.ash"
//#include "arch/i386/nrv2e_d32.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
// =============
// ============= UNFILTER
@ -135,6 +135,6 @@ move_up:
or ebp, -1 // decompressor assumption
jmp eax // enter moved decompressor
#include "include/header2.ash"
#include "include/header2.ash"
// vi:ts=8:et:nowrap

View File

@ -28,7 +28,7 @@
*/
#include "arch/i386/macros2.ash"
#include "arch/i386/macros2.ash"
// =============
// ============= ENTRY POINT
@ -124,11 +124,11 @@ section LZCUTPOI
// ============= DECOMPRESSION
// =============
//#include "arch/i386/nrv2b_d32.ash"
//#include "arch/i386/nrv2d_d32.ash"
//#include "arch/i386/nrv2e_d32.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
// =============
// ============= UNFILTER

View File

@ -1,3 +1,4 @@
/*
; i386-openbsd.elf-fold.asm -- linkage to C code to process Elf binary
;
; This file is part of the UPX executable compressor.
@ -26,262 +27,249 @@
; John F. Reiser
; <jreiser@users.sourceforge.net>
;
*/
#include "arch/i386/macros2.ash"
#define PAGE_SIZE ( 1<<12)
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 8*4
#define e_type 16
#define e_entry (16 + 2*2 + 4)
#define p_memsz 5*4
#define sznote 0x18
#define szb_info 12
#define szl_info 12
#define szp_info 12
#define a_type 0
#define a_val 4
#define sz_auxv 8
BITS 32
SECTION .text
CPU 386
#define __NR_munmap 73
%define PAGE_SIZE ( 1<<12)
%define szElf32_Ehdr 0x34
%define szElf32_Phdr 8*4
%define e_type 16
%define e_entry (16 + 2*2 + 4)
%define p_memsz 5*4
%define sznote 0x18
%define szb_info 12
%define szl_info 12
%define szp_info 12
%define a_type 0
%define a_val 4
%define sz_auxv 8
// control just falls through, after this part and compiled C code
// are uncompressed.
%define __NR_munmap 73
fold_begin: // enter: %ebx= &Elf32_Ehdr of this program
// patchLoader will modify to be
// dword sz_uncompressed, sz_compressed
// byte compressed_data...
;; control just falls through, after this part and compiled C code
;; are uncompressed.
// ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
// Move argc,argv,envp down to make room for Elf_auxv table.
// Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
// because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
// give not quite everything. It is simpler and smaller code for us
// to generate a "complete" table where Elf_auxv[k -1].a_type = k.
// On second thought, that wastes a lot of stack space (the entire kernel
// auxv, plus those slots that remain empty anyway). So try for minimal
// space on stack, without too much code, by doing it serially.
fold_begin: ; enter: %ebx= &Elf32_Ehdr of this program
; patchLoader will modify to be
; dword sz_uncompressed, sz_compressed
; byte compressed_data...
#define AT_NULL 0
#define AT_IGNORE 1
#define AT_PHDR 3
#define AT_PHENT 4
#define AT_PHNUM 5
#define AT_PAGESZ 6
#define AT_BASE 7
#define AT_ENTRY 9
; ld-linux.so.2 depends on AT_PHDR and AT_ENTRY, for instance.
; Move argc,argv,envp down to make room for Elf_auxv table.
; Linux kernel 2.4.2 and earlier give only AT_HWCAP and AT_PLATFORM
; because we have no PT_INTERP. Linux kernel 2.4.5 (and later?)
; give not quite everything. It is simpler and smaller code for us
; to generate a "complete" table where Elf_auxv[k -1].a_type = k.
; On second thought, that wastes a lot of stack space (the entire kernel
; auxv, plus those slots that remain empty anyway). So try for minimal
; space on stack, without too much code, by doing it serially.
%define AT_NULL 0
%define AT_IGNORE 1
%define AT_PHDR 3
%define AT_PHENT 4
%define AT_PHNUM 5
%define AT_PAGESZ 6
%define AT_BASE 7
%define AT_ENTRY 9
%define ET_DYN 3
#define ET_DYN 3
sub ecx, ecx
mov edx, (1<<AT_PHDR) | (1<<AT_PHENT) | (1<<AT_PHNUM) | (1<<AT_PAGESZ) | (1<<AT_BASE) | (1<<AT_ENTRY)
mov esi, esp
mov edi, esp
call do_auxv ; clear bits in edx according to existing auxv slots
call do_auxv // clear bits in edx according to existing auxv slots
mov esi, esp
L50:
shr edx, 1 ; Carry = bottom bit
sbb eax, eax ; -1 or 0
sub ecx, eax ; count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] ; allocate one auxv slot, if needed
shr edx, 1 // Carry = bottom bit
sbb eax, eax // -1 or 0
sub ecx, eax // count of 1 bits that remained in edx
lea esp, [esp + sz_auxv * eax] // allocate one auxv slot, if needed
test edx,edx
jne L50
mov edi, esp
call do_auxv ; move; fill new auxv slots with AT_IGNORE
call do_auxv // move; fill new auxv slots with AT_IGNORE
%define OVERHEAD 2048
%define MAX_ELF_HDR 512
#define OVERHEAD 2048
#define MAX_ELF_HDR 512
sub esp, dword MAX_ELF_HDR + OVERHEAD ; alloca
push ebx ; start of unmap region (&Elf32_Ehdr of this stub)
sub esp, MAX_ELF_HDR + OVERHEAD // alloca
push ebx // start of unmap region (&Elf32_Ehdr of this stub)
; Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
; but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] ; phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] ; 1 page for round, 1 for unfold
and edx, -PAGE_SIZE
// Cannot pre-round .p_memsz because kernel requires PF_W to setup .bss,
// but strict SELinux (or PaX, grsecurity) prohibits PF_W with PF_X.
mov edx, [p_memsz + szElf32_Ehdr + ebx] // phdr[0].p_memsz
lea edx, [-1 + 2*PAGE_SIZE + edx + ebx] // 1 page for round, 1 for unfold
and edx, 0-PAGE_SIZE
push edx ; end of unmap region
sub eax, eax ; 0
cmp word [e_type + ebx], byte ET_DYN
push edx // end of unmap region
sub eax, eax // 0
cmp word ptr [e_type + ebx], ET_DYN
jne L53
xchg eax, edx ; dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
xchg eax, edx // dynbase for ET_DYN; assumes mmap(0, ...) is placed after us!
L53:
push eax ; dynbase
push eax // dynbase
mov esi, [e_entry + ebx] ; end of compressed data
lea eax, [szElf32_Ehdr + 3*szElf32_Phdr + sznote + szl_info + szp_info + ebx] ; 1st &b_info
sub esi, eax ; length of compressed data
mov ebx, [ eax] ; length of uncompressed ELF headers
mov ecx, [4+ eax] ; length of compressed ELF headers
add ecx, byte szb_info
lea edx, [3*4 + esp] ; &tmp
pusha ; (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi ; swap with above 'pusha' to inhibit auxv_up for PT_INTERP
EXTERN upx_main
call upx_main ; returns entry address
add esp, byte (8 +1)*4 ; remove 8 params from pusha, also dynbase
pop ecx ; end of unmap region
pop ebx ; start of unmap region (&Elf32_Ehdr of this stub)
add esp, dword MAX_ELF_HDR + OVERHEAD ; un-alloca
mov esi, [e_entry + ebx] // end of compressed data
lea eax, [szElf32_Ehdr + 3*szElf32_Phdr + sznote + szl_info + szp_info + ebx] // 1st &b_info
sub esi, eax // length of compressed data
mov ebx, [ eax] // length of uncompressed ELF headers
mov ecx, [4+ eax] // length of compressed ELF headers
add ecx, szb_info
lea edx, [3*4 + esp] // &tmp
pusha // (AT_table, sz_cpr, f_expand, &tmp_ehdr, {sz_unc, &tmp}, {sz_cpr, &b1st_info} )
inc edi // swap with above 'pusha' to inhibit auxv_up for PT_INTERP
.extern upx_main
call upx_main // returns entry address
add esp, (8 +1)*4 // remove 8 params from pusha, also dynbase
pop ecx // end of unmap region
pop ebx // start of unmap region (&Elf32_Ehdr of this stub)
add esp, MAX_ELF_HDR + OVERHEAD // un-alloca
push eax ; save entry address as ret.addr
push byte 0 ; 'leave' uses this to clear ebp
mov ebp,esp ; frame
push eax // save entry address as ret.addr
push 0 // 'leave' uses this to clear ebp
mov ebp,esp // frame
sub ecx, ebx
sub eax,eax ; 0, also AT_NULL
push ecx ; length to unmap
push ebx ; start of unmap region (&Elf32_Ehdr of this stub)
push eax ; fake ret.addr
sub eax,eax // 0, also AT_NULL
push ecx // length to unmap
push ebx // start of unmap region (&Elf32_Ehdr of this stub)
push eax // fake ret.addr
dec edi ; auxv table
db 0x3c ; "cmpb al, byte ..." like "jmp 1+L60" but 1 byte shorter
dec edi // auxv table
.byte 0x3c // "cmpb al, ..." like "jmp 1+L60" but 1 byte shorter
L60:
scasd ; a_un.a_val etc.
scasd ; a_type
jne L60 ; not AT_NULL
; edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push dword [edi] ; &escape hatch
scasd // a_un.a_val etc.
scasd // a_type
jne L60 // not AT_NULL
// edi now points at [AT_NULL]a_un.a_ptr which contains result of make_hatch()
push dword ptr [edi] // &escape hatch
xor edi,edi
xor esi,esi
xor edx,edx
xor ecx,ecx
xor ebx,ebx
mov al, __NR_munmap ; eax was 0 from L60
ret ; goto escape hatch: int 0x80; leave; ret
mov al, __NR_munmap // eax was 0 from L60
ret // goto escape hatch: int 0x80; leave; ret
; called twice:
; 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
; 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
; entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
; exit: edi= &auxtab; edx= bits still needed
// called twice:
// 1st with esi==edi, ecx=0, edx= bitmap of slots needed: just update edx.
// 2nd with esi!=edi, ecx= slot_count: move, then append AT_IGNORE slots
// entry: esi= src = &argc; edi= dst; ecx= # slots wanted; edx= bits wanted
// exit: edi= &auxtab; edx= bits still needed
do_auxv:
; cld
// cld
L10: ; move argc+argv
L10: // move argc+argv
lodsd
stosd
test eax,eax
jne L10
L20: ; move envp
L20: // move envp
lodsd
stosd
test eax,eax
jne L20
push edi ; return value
L30: ; process auxv
lodsd ; a_type
push edi // return value
L30: // process auxv
lodsd // a_type
stosd
cmp eax, byte 32
jae L32 ; prevent aliasing by 'btr' when 32<=a_type
btr edx, eax ; no longer need a slot of type eax [Carry only]
cmp eax, 32
jae L32 // prevent aliasing by 'btr' when 32<=a_type
btr edx, eax // no longer need a slot of type eax [Carry only]
L32:
test eax, eax ; AT_NULL ?
test eax, eax // AT_NULL ?
lodsd
stosd
jnz L30 ; a_type != AT_NULL
jnz L30 // a_type != AT_NULL
sub edi, byte 8 ; backup to AT_NULL
add ecx, ecx ; two words per auxv
inc eax ; convert 0 to AT_IGNORE
rep stosd ; allocate and fill
dec eax ; convert AT_IGNORE to AT_NULL
stosd ; re-terminate with AT_NULL
sub edi, 8 // backup to AT_NULL
add ecx, ecx // two words per auxv
inc eax // convert 0 to AT_IGNORE
rep stosd // allocate and fill
dec eax // convert AT_IGNORE to AT_NULL
stosd // re-terminate with AT_NULL
stosd
pop edi ; &auxtab
pop edi // &auxtab
ret
%define __NR_mmap 197
%define __NR_syscall 198
#define __NR_mmap 197
#define __NR_syscall 198
global mmap
mmap:
mmap: .globl mmap
push ebp
mov ebp,esp
xor eax,eax ; 0
push eax ; convert to 64-bit
push dword [7*4+ebp] ; offset
push eax ; pad
push dword [6*4+ebp] ; fd
push dword [5*4+ebp] ; flags
push dword [4*4+ebp] ; prot
push dword [3*4+ebp] ; len
push dword [2*4+ebp] ; addr
push eax ; current thread
xor eax,eax // 0
push eax // convert to 64-bit
push dword ptr [7*4+ebp] // offset
push eax // pad
push dword ptr [6*4+ebp] // fd
push dword ptr [5*4+ebp] // flags
push dword ptr [4*4+ebp] // prot
push dword ptr [3*4+ebp] // len
push dword ptr [2*4+ebp] // addr
push eax // current thread
mov al,__NR_mmap
push eax
push eax ; fake ret.addr
push eax // fake ret.addr
mov al,__NR_syscall
int 0x80
leave
ret
global brk
brk:
brk: .globl brk
ret
global bkpt
bkpt:
bkpt: .globl bkpt
int3
ret
%define __NR_exit 1
%define __NR_read 3
%define __NR_write 4
%define __NR_open 5
%define __NR_close 6
%define __NR_munmap 73
%define __NR_mprotect 74
#define __NR_exit 1
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
#define __NR_munmap 73
#define __NR_mprotect 74
global exit
exit:
exit: .globl exit
mov al,__NR_exit
nf_sysgo:
movzx eax,al
int 0x80
ret
global read
read:
read: .globl read
mov al,__NR_read
jmp nf_sysgo
global write
write:
write: .globl write
mov al,__NR_write
jmp nf_sysgo
global open
open:
open: .globl open
mov al,__NR_open
jmp nf_sysgo
global close
close:
close: .globl close
mov al,__NR_close
jmp nf_sysgo
global munmap
munmap:
munmap: .globl munmap
mov al,__NR_munmap
jmp nf_sysgo
global mprotect
mprotect:
mprotect: .globl mprotect
mov al,__NR_mprotect
jmp nf_sysgo
; vi:ts=8:et:nowrap
// vi:ts=8:et:nowrap

View File

@ -28,7 +28,7 @@
*/
#define UPX102 1
#include "arch/i386/macros2.ash"
#include "arch/i386/macros2.ash"
CPU 386
@ -57,11 +57,11 @@ section PEMAIN02
// ============= DECOMPRESSION
// =============
//#include "arch/i386/nrv2b_d32.ash"
//#include "arch/i386/nrv2d_d32.ash"
//#include "arch/i386/nrv2e_d32.ash"
#include "arch/i386/nrv2e_d32_2.ash"
//#include "arch/i386/lzma_d.ash"
#include "arch/i386/nrv2b_d32_2.ash"
#include "arch/i386/nrv2d_d32_2.ash"
#include "arch/i386/nrv2e_d32_2.ash"
#define db .byte
#include "arch/i386/lzma_d_2.ash"
// =============
section PEMAIN10

View File

@ -28,7 +28,7 @@
* John F. Reiser
* <jreiser@users.sourceforge.net>
*/
#include "arch/powerpc/32/regs.h"
#include "arch/powerpc/32/ppc_regs.h"
sz_b_info= 12
sz_unc= 0

View File

@ -29,12 +29,8 @@
* <jreiser@users.sourceforge.net>
*/
#include "arch/powerpc/32/regs.h"
/*__MACOS000__*/
_start: .globl _start
call main # must be exactly 1 instruction; link_register= &decompress
#include "arch/powerpc/32/nrv2e_d.S"
#include "arch/powerpc/32/ppc_regs.h"
#define section .section
sz_b_info= 12
sz_unc= 0
@ -49,29 +45,77 @@ MAP_PRIVATE= 2
MAP_FIXED= 0x10
MAP_ANONYMOUS= 0x20
__NR_mmap= 90
PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT)
/* Temporary until we get the buildLoader stuff working ... */
.ascii "\n$Id: UPX (C) 1996-2006 the UPX Team. "
.asciz "All Rights Reserved. http://upx.sf.net $\n"
.p2align 2 # (1<<2)
/* /usr/include/asm-ppc/unistd.h */
__NR_write = 4
__NR_exit = 1
__NR_mmap = 90
section ELFMAINX
.balign 4
_start: .globl _start
call main // must be exactly 1 instruction; link_register= &decompress
/* Returns 0 on success; non-zero on failure. */
decompress: // (uchar const *src, size_t lsrc, uchar *dst, size_t &ldst, uint method)
section NRV_COMMON
.balign 4
SZ_DLINE=128 # size of data cache line in Apple G5
/* PowerPC has no 'cmplis': compare logical [unsigned] immediate shifted [by 16] */
#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 NRV2E
.balign 4
#include "arch/powerpc/32/nrv2e_d.S"
section NRV2B
.balign 4
#include "arch/powerpc/32/nrv2b_d.S"
#include "arch/powerpc/32/lzma_d.S"
section ELFMAINY
.balign 4
eof_nrv:
#define tmp r0 /* hibit is dead */
lwz tmp,0(ldst) // original dst
mtlr t3 // return address
addi dst,dst,1 // uncorrect for 'stbu'
addi src,src,1 // uncorrect for 'lbzu'
subf dst,tmp,dst // dst -= tmp; // dst length
#undef tmp
subf a0,lsrc,src // src -= eof; // return 0: good; else: bad
stw dst,0(ldst)
ret
msg_SELinux:
call L71
call L72
L70:
.asciz "PROT_EXEC|PROT_WRITE failed.\n"
.p2align 2 # (1<<2)
L71:
li a2,L71 - L70 # length
mflr a1 # message text
li a0,2 # fd stderr
// IDENTSTR goes here
section ELFMAINZ
.balign 4
L72:
li a2,L71 - L70 // length
mflr a1 // message text
li a0,2 // fd stderr
li 0,__NR_write; sc
die:
li a0,127
@ -79,10 +123,10 @@ die:
/* Decompress the rest of this loader, and jump to it. */
unfold:
mflr r30 # &{ b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...}
mflr r30 // &{ b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...}
li a5,0 # off_t
li a4,-1 # fd; cater to *BSD for MAP_ANON
li a5,0 // off_t
li a4,-1 // fd; cater to *BSD for MAP_ANON
lwz a0,sz_cpr(r30)
li a3,MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS
li a2,PROT_READ | PROT_WRITE | PROT_EXEC
@ -90,28 +134,28 @@ unfold:
add a0,a0,r30
li 0,__NR_mmap
addi a0,a0,sz_b_info+PAGE_SIZE-1
rlwinm a0,a0,0,0,31-PAGE_SHIFT # next page boundary after fold
sc; bso- msg_SELinux # Branch if SummaryOverflow (failure)
rlwinm a0,a0,0,0,31-PAGE_SHIFT // next page boundary after fold
sc; bso- msg_SELinux // Branch if SummaryOverflow (failure)
0:
mtctr r31
lwz r0,sz_unc(r30)
lbz meth,b_method(r30)
la ldst,31*4(sp) # &do_not_care
la ldst,31*4(sp) // &slot on stack
stw r0,31*4(sp) // lzma uses for EOF
mr dst,a0
mtlr a0 # &continuation
mtlr a0 // &continuation
lwz lsrc,sz_cpr(r30)
addi src,r30,sz_b_info
bctr # goto decomrpess; return to link register (mmap'ed page)
bctr // goto decomrpess; return to link register (mmap'ed page)
main:
stwu r1,-32*4(sp) # allocate space (keeping 0 mod 16), save r1
stmw r2,4(sp) # save registers r2 thru r31
mflr r31 # &decompress
//// teq r0,r0 // debugging
stwu r1,-32*4(sp) // allocate space (keeping 0 mod 16), save r1
stmw r2,4(sp) // save registers r2 thru r31
mflr r31 // &decompress
call unfold
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
eof:
/*__XTHEENDX__*/
/*
vi:ts=8:et:nowrap
*/

View File

@ -1,4 +1,7 @@
#include "arch/powerpc/32/regs.h"
#include "arch/powerpc/32/ppc_regs.h"
#define szElf32_Ehdr 0x34
#define szElf32_Phdr 0x20
sz_b_info= 12
sz_unc= 0
@ -8,9 +11,9 @@ sz_l_info= 12
sz_p_info= 12
OVERHEAD= 2048
LINKAREA= 4*4 # SysV C linkage area: (sp, lr); but 16-byte align
LINKAREA= 4*4 // SysV C linkage area: (sp, lr); but 16-byte align
/* In:
r31= &decompress; also 8+ (char *)&(offset to {l_info; p_info; b_info})
r31= &decompress; also 8+ (char *)&(#bytes which preceed &-8(r31)
*/
fold_begin:
call L90
@ -22,9 +25,9 @@ fold_begin:
a2= envp
a3= auxvp
a4= fini
sp= ~0xf & (-2*4 + (void *)&argc) # 0(sp): old_sp, pc
sp= ~0xf & (-2*4 + (void *)&argc) // 0(sp): old_sp, pc
Instead, Linux gives only
sp= &{argc,argv...,0,env...,0,auxv...,strings} # 16-byte aligned?
sp= &{argc,argv...,0,env...,0,auxv...,strings} // 16-byte aligned?
We must figure out the rest, particularly auxvp.
*/
zfind:
@ -32,32 +35,34 @@ zfind:
cmpi cr7,t0,0; bne+ cr7,zfind
ret
L90:
mflr a5 # &ppcbxx: f_unfilter
lwz a6,0(sp) # sp at execve
call zfind # a6= &env
call zfind # a6= &Elf32_auxv
lwz a1,-8(r31) # total size = offset to {l_info; p_info; b_info}
rlwinm r30,a5,0,0,31-12 # r30= &this_page
la a2,-OVERHEAD(sp) # &Elf32_Ehdr temporary space
mr a4,r31 # &decompress: f_expand
subf a0,a1,r31 # &l_info
mflr a5 // &ppcbxx: f_unfilter
lwz a6,0(sp) // sp at execve
call zfind // a6= &env
call zfind // a6= &Elf32_auxv
lwz a1,-8(r31) // #bytes which preceed -8(r31)
rlwinm r30,a5,0,0,31-12 // r30= &this_page
mr a4,r31 // &decompress: f_expand
subf r29,a1,r31 // 8+ (char *)&our_Elf32_Ehdr
la a2,-OVERHEAD(sp) // &Elf32_Ehdr temporary space
addi r29,r29,-8 // &our_Elf32_Ehdr
addi a1,a1,-(szElf32_Ehdr + 2*szElf32_Phdr)
addi a0,r29,(szElf32_Ehdr + 2*szElf32_Phdr) // &{l_info; p_info; b_info}
addi sp,sp,-(LINKAREA+OVERHEAD)
rlwinm r29,a0,0,0,31-12 # r29= &our_Elf32_Ehdr
lwz a3,sz_unc+sz_p_info+sz_l_info(a0) # sz_elf_headers
call upx_main # Out: a0= entry
/* entry= upx_main(l_info *a0, total_size a1, Elf32_Ehdr *a2, sz_ehdr a3,
lwz a3,sz_unc+sz_p_info+sz_l_info(a0) // sz_elf_headers
call upx_main // Out: a0= entry
/* entry= upx_main(l_info *a0, total_size a1, Elf32_Ehdr *a2, sz_ehdr a3,
f_decomp a4, f_unf a5, Elf32_auxv_t *a6)
*/
mr r31,a0 # save &entry
mr r31,a0 // save &entry
mr a0,r29 # &our_Elf32_Ehdr
subf a1,r29,r30 # size
call munmap # unmap compressed program; /proc/self/exe disappears
mr a0,r29 // &our_Elf32_Ehdr
subf a1,r29,r30 // size
call munmap // unmap compressed program; /proc/self/exe disappears
mtlr r31 # entry address
lmw r2,4+LINKAREA+OVERHEAD(sp) # restore registers r2 thru r31
lwz r1, LINKAREA+OVERHEAD(sp) # restore r1; deallocate space
ret # enter /lib/ld.so.1
mtlr r31 // entry address
lmw r2,4+LINKAREA+OVERHEAD(sp) // restore registers r2 thru r31
lwz r1, LINKAREA+OVERHEAD(sp) // restore r1; deallocate space
ret // enter /lib/ld.so.1
SYS_exit= 1
SYS_fork= 2
@ -75,8 +80,8 @@ mmap: .globl mmap
li 0,SYS_mmap
sysgo:
sc
bns+ no_fail # 'bns': branch if No Summary[Overflow]
li a0,-1 # failure; IGNORE errno
bns+ no_fail // 'bns': branch if No Summary[Overflow]
li a0,-1 // failure; IGNORE errno
no_fail:
ret

View File

@ -139,8 +139,8 @@ ERR_LAB
if (h.sz_cpr < h.sz_unc) { // Decompress block
nrv_uint out_len = h.sz_unc; // EOF for lzma
int const j = (*f_decompress)(xi->buf, h.sz_cpr, xo->buf, &out_len,
*(int *)(void *)&h.b_method);
int const j = (*f_decompress)(xi->buf, h.sz_cpr,
xo->buf, &out_len, h.b_method);
if (j != 0 || out_len != (nrv_uint)h.sz_unc)
err_exit(7);
if (h.b_ftid!=0 && f_unf) { // have filter